diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index ecf8a9177d..2bc74fd82e 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 633ab3f19a..85b054bf05 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ +cmake_minimum_required(VERSION 3.13) project(PrusaSlicer) -cmake_minimum_required(VERSION 3.2) include("version.inc") include(GNUInstallDirs) @@ -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) @@ -72,6 +77,9 @@ if (MSVC) # error C3859: virtual memory range for PCH exceeded; please recompile with a command line option of '-Zm90' or greater # Generate symbols at every build target, even for the release. add_compile_options(-bigobj -Zm520 /Zi) + # Disable STL4007: Many result_type typedefs and all argument_type, first_argument_type, and second_argument_type typedefs are deprecated in C++17. + #FIXME Remove this line after eigen library adapts to the new C++17 adaptor rules. + add_compile_options(-D_SILENCE_CXX17_ADAPTOR_TYPEDEFS_DEPRECATION_WARNING) endif () if (MINGW) @@ -101,8 +109,8 @@ list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/modules/) enable_testing () -# Enable C++11 language standard. -set(CMAKE_CXX_STANDARD 11) +# Enable C++17 language standard. +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(NOT WIN32) @@ -157,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) @@ -224,6 +235,9 @@ endif(WIN32) add_definitions(-DwxUSE_UNICODE -D_UNICODE -DUNICODE -DWXINTL_NO_GETTEXT_MACRO) +# Disable unsafe implicit wxString to const char* / std::string and vice versa. This implicit conversion breaks the UTF-8 encoding quite often. +add_definitions(-DwxNO_UNSAFE_WXSTRING_CONV) + if (SLIC3R_PROFILE) message("PrusaSlicer will be built with a Shiny invasive profiler") add_definitions(-DSLIC3R_PROFILE) @@ -322,13 +336,21 @@ find_package(TBB REQUIRED) # add_definitions(-DTBB_USE_CAPTURED_EXCEPTION=0) find_package(CURL REQUIRED) -include_directories(${CURL_INCLUDE_DIRS}) + +add_library(libcurl INTERFACE) +target_link_libraries(libcurl INTERFACE CURL::libcurl) + +if (NOT WIN32) + # Required by libcurl + find_package(ZLIB REQUIRED) + target_link_libraries(libcurl INTERFACE ZLIB::ZLIB) +endif() if (SLIC3R_STATIC) if (NOT APPLE) # libcurl is always linked dynamically to the system libcurl on OSX. # On other systems, libcurl is linked statically if SLIC3R_STATIC is set. - add_definitions(-DCURL_STATICLIB) + target_compile_definitions(libcurl INTERFACE CURL_STATICLIB) endif() if (CMAKE_SYSTEM_NAME STREQUAL "Linux") # As of now, our build system produces a statically linked libcurl, @@ -336,7 +358,8 @@ if (SLIC3R_STATIC) find_package(OpenSSL REQUIRED) message("OpenSSL include dir: ${OPENSSL_INCLUDE_DIR}") message("OpenSSL libraries: ${OPENSSL_LIBRARIES}") - include_directories(${OPENSSL_INCLUDE_DIR}) + target_include_directories(libcurl INTERFACE ${OPENSSL_INCLUDE_DIR}) + target_link_libraries(libcurl INTERFACE ${OPENSSL_LIBRARIES}) endif() endif() @@ -354,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 @@ -367,34 +390,55 @@ 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 -if (NOT SLIC3R_STATIC) - find_package(GLEW) -endif () +if (SLIC3R_STATIC) + set(GLEW_USE_STATIC_LIBS ON) + set(GLEW_VERBOSE ON) +endif() + +find_package(GLEW) if (NOT GLEW_FOUND) + message(STATUS "GLEW not found, using bundled version.") add_library(glew STATIC ${LIBDIR}/glew/src/glew.c) - set(GLEW_FOUND 1) + set(GLEW_FOUND TRUE) set(GLEW_INCLUDE_DIRS ${LIBDIR}/glew/include/) - set(GLEW_LIBRARIES glew) - add_definitions(-DGLEW_STATIC) + target_compile_definitions(glew PUBLIC GLEW_STATIC) + target_include_directories(glew PUBLIC ${GLEW_INCLUDE_DIRS}) + add_library(GLEW::GLEW ALIAS glew) endif () -include_directories(${GLEW_INCLUDE_DIRS}) # Find the Cereal serialization library -add_library(cereal INTERFACE) -target_include_directories(cereal INTERFACE include) +find_package(cereal REQUIRED) # l10n set(L10N_DIR "${SLIC3R_RESOURCES_DIR}/localization") -add_custom_target(pot - COMMAND xgettext --keyword=L --keyword=L_CONTEXT:1,2c --keyword=_L_PLURAL:1,2 --add-comments=TRN --from-code=UTF-8 --debug +add_custom_target(gettext_make_pot + COMMAND xgettext --keyword=L --keyword=_L --keyword=_u8L --keyword=L_CONTEXT:1,2c --keyword=_L_PLURAL:1,2 --add-comments=TRN --from-code=UTF-8 --debug -f "${L10N_DIR}/list.txt" -o "${L10N_DIR}/PrusaSlicer.pot" WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} COMMENT "Generate pot file from strings in the source tree" ) +add_custom_target(gettext_po_to_mo + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + COMMENT "Generate localization po files (binary) from mo files (texts)" +) +file(GLOB L10N_PO_FILES "${L10N_DIR}/*/PrusaSlicer*.po") +foreach(po_file ${L10N_PO_FILES}) + GET_FILENAME_COMPONENT(po_dir "${po_file}" DIRECTORY) + SET(mo_file "${po_dir}/PrusaSlicer.mo") + add_custom_command( + TARGET gettext_po_to_mo PRE_BUILD + COMMAND msgfmt ARGS -o ${mo_file} ${po_file} + DEPENDS ${po_file} + ) +endforeach() find_package(NLopt 1.4 REQUIRED) @@ -403,8 +447,44 @@ if(SLIC3R_STATIC) set(USE_BLOSC TRUE) endif() -#find_package(OpenVDB 5.0 COMPONENTS openvdb) -#slic3r_remap_configs(IlmBase::Half RelWithDebInfo Release) +find_package(OpenVDB 5.0 REQUIRED COMPONENTS openvdb) +if(OpenVDB_FOUND) + slic3r_remap_configs(IlmBase::Half RelWithDebInfo Release) + slic3r_remap_configs(Blosc::blosc RelWithDebInfo Release) +endif() + +set(TOP_LEVEL_PROJECT_DIR ${PROJECT_SOURCE_DIR}) +function(prusaslicer_copy_dlls target) + if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") + set(_bits 64) + elseif ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") + set(_bits 32) + endif () + + get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + get_target_property(_alt_out_dir ${target} RUNTIME_OUTPUT_DIRECTORY) + + if (_alt_out_dir) + set (_out_dir "${_alt_out_dir}") + elseif (_is_multi) + set (_out_dir "$/$") + else () + set (_out_dir "$") + endif () + + # This has to be a separate target due to the windows command line lenght limits + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${TOP_LEVEL_PROJECT_DIR}/deps/GMP/gmp/lib/win${_bits}/libgmp-10.dll ${_out_dir} + COMMENT "Copy gmp runtime to build tree" + VERBATIM) + + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${TOP_LEVEL_PROJECT_DIR}/deps/MPFR/mpfr/lib/win${_bits}/libmpfr-4.dll ${_out_dir} + COMMENT "Copy mpfr runtime to build tree" + VERBATIM) + +endfunction() + # libslic3r, PrusaSlicer GUI and the PrusaSlicer executable. add_subdirectory(src) @@ -430,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/README.md b/README.md index 6fd1af4e20..2b93a47b01 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/CheckAtomic.cmake b/cmake/modules/CheckAtomic.cmake new file mode 100644 index 0000000000..c045e30b22 --- /dev/null +++ b/cmake/modules/CheckAtomic.cmake @@ -0,0 +1,106 @@ +# atomic builtins are required for threading support. + +INCLUDE(CheckCXXSourceCompiles) +INCLUDE(CheckLibraryExists) + +# Sometimes linking against libatomic is required for atomic ops, if +# the platform doesn't support lock-free atomics. + +function(check_working_cxx_atomics varname) + set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11") + CHECK_CXX_SOURCE_COMPILES(" +#include +std::atomic x; +int main() { + return x; +} +" ${varname}) + set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) +endfunction(check_working_cxx_atomics) + +function(check_working_cxx_atomics64 varname) + set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + set(CMAKE_REQUIRED_FLAGS "-std=c++11 ${CMAKE_REQUIRED_FLAGS}") + CHECK_CXX_SOURCE_COMPILES(" +#include +#include +std::atomic x (0); +int main() { + uint64_t i = x.load(std::memory_order_relaxed); + return 0; +} +" ${varname}) + set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) +endfunction(check_working_cxx_atomics64) + + +# This isn't necessary on MSVC, so avoid command-line switch annoyance +# by only running on GCC-like hosts. +if (LLVM_COMPILER_IS_GCC_COMPATIBLE) + # First check if atomics work without the library. + check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB) + # If not, check if the library exists, and atomics work with it. + if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB) + check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC) + if( HAVE_LIBATOMIC ) + list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") + check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB) + if (NOT HAVE_CXX_ATOMICS_WITH_LIB) + message(FATAL_ERROR "Host compiler must support std::atomic!") + endif() + else() + message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.") + endif() + endif() +endif() + +# Check for 64 bit atomic operations. +if(MSVC) + set(HAVE_CXX_ATOMICS64_WITHOUT_LIB True) +else() + check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB) +endif() + +# If not, check if the library exists, and atomics work with it. +if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB) + check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64) + if(HAVE_CXX_LIBATOMICS64) + list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") + check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB) + if (NOT HAVE_CXX_ATOMICS64_WITH_LIB) + message(FATAL_ERROR "Host compiler must support 64-bit std::atomic!") + endif() + else() + message(FATAL_ERROR "Host compiler appears to require libatomic for 64-bit operations, but cannot find it.") + endif() +endif() + +## TODO: This define is only used for the legacy atomic operations in +## llvm's Atomic.h, which should be replaced. Other code simply +## assumes C++11 works. +CHECK_CXX_SOURCE_COMPILES(" +#ifdef _MSC_VER +#include +#endif +int main() { +#ifdef _MSC_VER + volatile LONG val = 1; + MemoryBarrier(); + InterlockedCompareExchange(&val, 0, 1); + InterlockedIncrement(&val); + InterlockedDecrement(&val); +#else + volatile unsigned long val = 1; + __sync_synchronize(); + __sync_val_compare_and_swap(&val, 1, 0); + __sync_add_and_fetch(&val, 1); + __sync_sub_and_fetch(&val, 1); +#endif + return 0; + } +" LLVM_HAS_ATOMICS) + +if( NOT LLVM_HAS_ATOMICS ) + message(STATUS "Warning: LLVM will be built thread-unsafe because atomic builtins are missing") +endif() \ No newline at end of file diff --git a/cmake/modules/FindDBus.cmake b/cmake/modules/FindDBus.cmake new file mode 100644 index 0000000000..1d0f29dd75 --- /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 +# +# 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/FindGLEW.cmake b/cmake/modules/FindGLEW.cmake new file mode 100644 index 0000000000..5a2a9b8352 --- /dev/null +++ b/cmake/modules/FindGLEW.cmake @@ -0,0 +1,351 @@ +# Distributed under the OSI-approved BSD 3-Clause License. See accompanying +# file Copyright.txt or https://cmake.org/licensing for details. + +# PrusaSlicer specifics: +# This file is backported from CMake 3.15 distribution to behave uniformly +# across all versions of CMake. It explicitly adds GLEW_STATIC complile +# definition to static targets which is needed to prevent link errors. + +#[=======================================================================[.rst: +FindGLEW +-------- + +Find the OpenGL Extension Wrangler Library (GLEW) + +Input Variables +^^^^^^^^^^^^^^^ + +The following variables may be set to influence this module’s behavior: + +``GLEW_USE_STATIC_LIBS`` + to find and create :prop_tgt:`IMPORTED` target for static linkage. + +``GLEW_VERBOSE`` + to output a detailed log of this module. + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module defines the following :ref:`Imported Targets `: + + +``GLEW::glew`` + The GLEW shared library. +``GLEW::glew_s`` + The GLEW static library, if ``GLEW_USE_STATIC_LIBS`` is set to ``TRUE``. +``GLEW::GLEW`` + Duplicates either ``GLEW::glew`` or ``GLEW::glew_s`` based on availability. + +Result Variables +^^^^^^^^^^^^^^^^ + +This module defines the following variables: + +``GLEW_INCLUDE_DIRS`` + include directories for GLEW +``GLEW_LIBRARIES`` + libraries to link against GLEW +``GLEW_SHARED_LIBRARIES`` + libraries to link against shared GLEW +``GLEW_STATIC_LIBRARIES`` + libraries to link against static GLEW +``GLEW_FOUND`` + true if GLEW has been found and can be used +``GLEW_VERSION`` + GLEW version +``GLEW_VERSION_MAJOR`` + GLEW major version +``GLEW_VERSION_MINOR`` + GLEW minor version +``GLEW_VERSION_MICRO`` + GLEW micro version + +#]=======================================================================] + +include(FindPackageHandleStandardArgs) + +find_package(GLEW CONFIG QUIET) + +if(GLEW_FOUND) + find_package_handle_standard_args(GLEW DEFAULT_MSG GLEW_CONFIG) + return() +endif() + +if(GLEW_VERBOSE) + message(STATUS "FindGLEW: did not find GLEW CMake config file. Searching for libraries.") +endif() + +if(APPLE) + find_package(OpenGL QUIET) + + if(OpenGL_FOUND) + if(GLEW_VERBOSE) + message(STATUS "FindGLEW: Found OpenGL Framework.") + message(STATUS "FindGLEW: OPENGL_LIBRARIES: ${OPENGL_LIBRARIES}") + endif() + else() + if(GLEW_VERBOSE) + message(STATUS "FindGLEW: could not find GLEW library.") + endif() + return() + endif() +endif() + + +function(__glew_set_find_library_suffix shared_or_static) + if((UNIX AND NOT APPLE) AND "${shared_or_static}" MATCHES "SHARED") + set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" PARENT_SCOPE) + elseif((UNIX AND NOT APPLE) AND "${shared_or_static}" MATCHES "STATIC") + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" PARENT_SCOPE) + elseif(APPLE AND "${shared_or_static}" MATCHES "SHARED") + set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib;.so" PARENT_SCOPE) + elseif(APPLE AND "${shared_or_static}" MATCHES "STATIC") + set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" PARENT_SCOPE) + elseif(WIN32 AND "${shared_or_static}" MATCHES "SHARED") + set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" PARENT_SCOPE) + elseif(WIN32 AND "${shared_or_static}" MATCHES "STATIC") + set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.a;.dll.a" PARENT_SCOPE) + endif() + + if(GLEW_VERBOSE) + message(STATUS "FindGLEW: CMAKE_FIND_LIBRARY_SUFFIXES for ${shared_or_static}: ${CMAKE_FIND_LIBRARY_SUFFIXES}") + endif() +endfunction() + + +if(GLEW_VERBOSE) + if(DEFINED GLEW_USE_STATIC_LIBS) + message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS: ${GLEW_USE_STATIC_LIBS}.") + else() + message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS is undefined. Treated as FALSE.") + endif() +endif() + +find_path(GLEW_INCLUDE_DIR GL/glew.h) +mark_as_advanced(GLEW_INCLUDE_DIR) + +set(GLEW_INCLUDE_DIRS ${GLEW_INCLUDE_DIR}) + +if(GLEW_VERBOSE) + message(STATUS "FindGLEW: GLEW_INCLUDE_DIR: ${GLEW_INCLUDE_DIR}") + message(STATUS "FindGLEW: GLEW_INCLUDE_DIRS: ${GLEW_INCLUDE_DIRS}") +endif() + +if("${CMAKE_GENERATOR_PLATFORM}" MATCHES "x64" OR "${CMAKE_GENERATOR}" MATCHES "Win64") + set(_arch "x64") +else() + set(_arch "Win32") +endif() + + +set(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + +__glew_set_find_library_suffix(SHARED) + +find_library(GLEW_SHARED_LIBRARY_RELEASE + NAMES GLEW glew glew32 + PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch} + PATHS ENV GLEW_ROOT) + +find_library(GLEW_SHARED_LIBRARY_DEBUG + NAMES GLEWd glewd glew32d + PATH_SUFFIXES lib lib64 + PATHS ENV GLEW_ROOT) + + +__glew_set_find_library_suffix(STATIC) + +find_library(GLEW_STATIC_LIBRARY_RELEASE + NAMES GLEW glew glew32s + PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch} + PATHS ENV GLEW_ROOT) + +find_library(GLEW_STATIC_LIBRARY_DEBUG + NAMES GLEWds glewd glewds glew32ds + PATH_SUFFIXES lib lib64 + PATHS ENV GLEW_ROOT) + +set(CMAKE_FIND_LIBRARY_SUFFIXES ${__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES}) +unset(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES) + +include(SelectLibraryConfigurations) + +select_library_configurations(GLEW_SHARED) +select_library_configurations(GLEW_STATIC) + +if(NOT GLEW_USE_STATIC_LIBS) + set(GLEW_LIBRARIES ${GLEW_SHARED_LIBRARY}) +else() + set(GLEW_LIBRARIES ${GLEW_STATIC_LIBRARY}) +endif() + + +if(GLEW_VERBOSE) + message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_RELEASE: ${GLEW_SHARED_LIBRARY_RELEASE}") + message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_RELEASE: ${GLEW_STATIC_LIBRARY_RELEASE}") + message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_DEBUG: ${GLEW_SHARED_LIBRARY_DEBUG}") + message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_DEBUG: ${GLEW_STATIC_LIBRARY_DEBUG}") + message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY: ${GLEW_SHARED_LIBRARY}") + message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY: ${GLEW_STATIC_LIBRARY}") + message(STATUS "FindGLEW: GLEW_LIBRARIES: ${GLEW_LIBRARIES}") +endif() + + +# Read version from GL/glew.h file +if(EXISTS "${GLEW_INCLUDE_DIR}/GL/glew.h") + file(STRINGS "${GLEW_INCLUDE_DIR}/GL/glew.h" _contents REGEX "^VERSION_.+ [0-9]+") + if(_contents) + string(REGEX REPLACE ".*VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MAJOR "${_contents}") + string(REGEX REPLACE ".*VERSION_MINOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MINOR "${_contents}") + string(REGEX REPLACE ".*VERSION_MICRO[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MICRO "${_contents}") + set(GLEW_VERSION "${GLEW_VERSION_MAJOR}.${GLEW_VERSION_MINOR}.${GLEW_VERSION_MICRO}") + endif() +endif() + +if(GLEW_VERBOSE) + message(STATUS "FindGLEW: GLEW_VERSION_MAJOR: ${GLEW_VERSION_MAJOR}") + message(STATUS "FindGLEW: GLEW_VERSION_MINOR: ${GLEW_VERSION_MINOR}") + message(STATUS "FindGLEW: GLEW_VERSION_MICRO: ${GLEW_VERSION_MICRO}") + message(STATUS "FindGLEW: GLEW_VERSION: ${GLEW_VERSION}") +endif() + +find_package_handle_standard_args(GLEW + REQUIRED_VARS GLEW_INCLUDE_DIRS GLEW_LIBRARIES + VERSION_VAR GLEW_VERSION) + +if(NOT GLEW_FOUND) + if(GLEW_VERBOSE) + message(STATUS "FindGLEW: could not find GLEW library.") + endif() + return() +endif() + + +if(NOT TARGET GLEW::glew AND NOT GLEW_USE_STATIC_LIBS) + if(GLEW_VERBOSE) + message(STATUS "FindGLEW: Creating GLEW::glew imported target.") + endif() + + add_library(GLEW::glew UNKNOWN IMPORTED) + + set_target_properties(GLEW::glew + PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}") + + if(APPLE) + set_target_properties(GLEW::glew + PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) + endif() + + if(GLEW_SHARED_LIBRARY_RELEASE) + set_property(TARGET GLEW::glew + APPEND + PROPERTY IMPORTED_CONFIGURATIONS RELEASE) + + set_target_properties(GLEW::glew + PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}") + endif() + + if(GLEW_SHARED_LIBRARY_DEBUG) + set_property(TARGET GLEW::glew + APPEND + PROPERTY IMPORTED_CONFIGURATIONS DEBUG) + + set_target_properties(GLEW::glew + PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}") + endif() + +elseif(NOT TARGET GLEW::glew_s AND GLEW_USE_STATIC_LIBS) + if(GLEW_VERBOSE) + message(STATUS "FindGLEW: Creating GLEW::glew_s imported target.") + endif() + + add_library(GLEW::glew_s UNKNOWN IMPORTED) + + set_target_properties(GLEW::glew_s + PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}") + + set_target_properties(GLEW::glew_s PROPERTIES INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC) + + if(APPLE) + set_target_properties(GLEW::glew_s + PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) + endif() + + if(GLEW_STATIC_LIBRARY_RELEASE) + set_property(TARGET GLEW::glew_s + APPEND + PROPERTY IMPORTED_CONFIGURATIONS RELEASE) + + set_target_properties(GLEW::glew_s + PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}") + endif() + + if(GLEW_STATIC_LIBRARY_DEBUG) + set_property(TARGET GLEW::glew_s + APPEND + PROPERTY IMPORTED_CONFIGURATIONS DEBUG) + + set_target_properties(GLEW::glew_s + PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}") + endif() +endif() + +if(NOT TARGET GLEW::GLEW) + if(GLEW_VERBOSE) + message(STATUS "FindGLEW: Creating GLEW::GLEW imported target.") + endif() + + add_library(GLEW::GLEW UNKNOWN IMPORTED) + + set_target_properties(GLEW::GLEW + PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}") + + if(APPLE) + set_target_properties(GLEW::GLEW + PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL) + endif() + + if(TARGET GLEW::glew) + if(GLEW_SHARED_LIBRARY_RELEASE) + set_property(TARGET GLEW::GLEW + APPEND + PROPERTY IMPORTED_CONFIGURATIONS RELEASE) + + set_target_properties(GLEW::GLEW + PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}") + endif() + + if(GLEW_SHARED_LIBRARY_DEBUG) + set_property(TARGET GLEW::GLEW + APPEND + PROPERTY IMPORTED_CONFIGURATIONS DEBUG) + + set_target_properties(GLEW::GLEW + PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}") + endif() + + elseif(TARGET GLEW::glew_s) + if(GLEW_STATIC_LIBRARY_RELEASE) + set_property(TARGET GLEW::GLEW + APPEND + PROPERTY IMPORTED_CONFIGURATIONS RELEASE) + + set_target_properties(GLEW::GLEW + PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}" + INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC) + endif() + + if(GLEW_STATIC_LIBRARY_DEBUG AND GLEW_USE_STATIC_LIBS) + set_property(TARGET GLEW::GLEW + APPEND + PROPERTY IMPORTED_CONFIGURATIONS DEBUG) + + set_target_properties(GLEW::GLEW + PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}" + INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC) + endif() + + elseif(GLEW_VERBOSE) + message(WARNING "FindGLEW: no `GLEW::glew` or `GLEW::glew_s` target was created. Something went wrong in FindGLEW target creation.") + endif() +endif() diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake index 9afe8a2356..02420fed8e 100644 --- a/cmake/modules/FindOpenVDB.cmake +++ b/cmake/modules/FindOpenVDB.cmake @@ -108,6 +108,18 @@ if(POLICY CMP0074) cmake_policy(SET CMP0074 NEW) endif() +if(OpenVDB_FIND_QUIETLY) + set (_quiet "QUIET") +else() + set (_quiet "") +endif() + +if(OpenVDB_FIND_REQUIRED) + set (_required "REQUIRED") +else() + set (_required "") +endif() + # Include utility functions for version information include(${CMAKE_CURRENT_LIST_DIR}/OpenVDBUtils.cmake) @@ -146,7 +158,7 @@ set(_OPENVDB_ROOT_SEARCH_DIR "") # Additionally try and use pkconfig to find OpenVDB -find_package(PkgConfig) +find_package(PkgConfig ${_quiet} ) pkg_check_modules(PC_OpenVDB QUIET OpenVDB) # ------------------------------------------------------------------------ @@ -203,20 +215,56 @@ if(UNIX AND OPENVDB_USE_STATIC_LIBS) endif() set(OpenVDB_LIB_COMPONENTS "") +set(OpenVDB_DEBUG_SUFFIX "d" CACHE STRING "Suffix for the debug libraries") + +get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) set(LIB_NAME ${COMPONENT}) - find_library(OpenVDB_${COMPONENT}_LIBRARY ${LIB_NAME} lib${LIB_NAME} + + find_library(OpenVDB_${COMPONENT}_LIBRARY_RELEASE ${LIB_NAME} lib${LIB_NAME} PATHS ${_OPENVDB_LIBRARYDIR_SEARCH_DIRS} PATH_SUFFIXES ${OPENVDB_PATH_SUFFIXES} ) - list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY}) - if(OpenVDB_${COMPONENT}_LIBRARY) - set(OpenVDB_${COMPONENT}_FOUND TRUE) - else() - set(OpenVDB_${COMPONENT}_FOUND FALSE) - endif() + find_library(OpenVDB_${COMPONENT}_LIBRARY_DEBUG ${LIB_NAME}${OpenVDB_DEBUG_SUFFIX} lib${LIB_NAME}${OpenVDB_DEBUG_SUFFIX} + PATHS ${_OPENVDB_LIBRARYDIR_SEARCH_DIRS} + PATH_SUFFIXES ${OPENVDB_PATH_SUFFIXES} + ) + + if (_is_multi) + list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}) + if (OpenVDB_${COMPONENT}_LIBRARY_DEBUG) + list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}) + endif () + + list(FIND CMAKE_CONFIGURATION_TYPES "Debug" _has_debug) + + if(OpenVDB_${COMPONENT}_LIBRARY_RELEASE AND (NOT MSVC OR _has_debug LESS 0 OR OpenVDB_${COMPONENT}_LIBRARY_DEBUG)) + set(OpenVDB_${COMPONENT}_FOUND TRUE) + else() + set(OpenVDB_${COMPONENT}_FOUND FALSE) + endif() + + set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}) + else () + string(TOUPPER "${CMAKE_BUILD_TYPE}" _BUILD_TYPE) + + set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_${COMPONENT}_LIBRARY_${_BUILD_TYPE}}) + + if (NOT OpenVDB_${COMPONENT}_LIBRARY) + set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}) + endif () + + list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY}) + + if(OpenVDB_${COMPONENT}_LIBRARY) + set(OpenVDB_${COMPONENT}_FOUND TRUE) + else() + set(OpenVDB_${COMPONENT}_FOUND FALSE) + endif() + endif () + endforeach() if(UNIX AND OPENVDB_USE_STATIC_LIBS) @@ -250,7 +298,7 @@ OPENVDB_ABI_VERSION_FROM_PRINT( ABI OpenVDB_ABI ) -if(NOT OpenVDB_FIND_QUIET) +if(NOT OpenVDB_FIND_QUIETLY) if(NOT OpenVDB_ABI) message(WARNING "Unable to determine OpenVDB ABI version from OpenVDB " "installation. The library major version \"${OpenVDB_MAJOR_VERSION}\" " @@ -268,7 +316,17 @@ endif() # Add standard dependencies -find_package(IlmBase COMPONENTS Half) +macro(just_fail msg) + set(OpenVDB_FOUND FALSE) + if(OpenVDB_FIND_REQUIRED) + message(FATAL_ERROR ${msg}) + elseif(NOT OpenVDB_FIND_QUIETLY) + message(WARNING ${msg}) + endif() + return() +endmacro() + +find_package(IlmBase QUIET COMPONENTS Half) if(NOT IlmBase_FOUND) pkg_check_modules(IlmBase QUIET IlmBase) endif() @@ -276,20 +334,20 @@ if (IlmBase_FOUND AND NOT TARGET IlmBase::Half) message(STATUS "Falling back to IlmBase found by pkg-config...") find_library(IlmHalf_LIBRARY NAMES Half) - if(IlmHalf_LIBRARY-NOTFOUND) - message(FATAL_ERROR "IlmBase::Half can not be found!") + if(IlmHalf_LIBRARY-NOTFOUND OR NOT IlmBase_INCLUDE_DIRS) + just_fail("IlmBase::Half can not be found!") endif() add_library(IlmBase::Half UNKNOWN IMPORTED) set_target_properties(IlmBase::Half PROPERTIES IMPORTED_LOCATION "${IlmHalf_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES ${IlmBase_INCLUDE_DIRS}) + INTERFACE_INCLUDE_DIRECTORIES "${IlmBase_INCLUDE_DIRS}") elseif(NOT IlmBase_FOUND) - message(FATAL_ERROR "IlmBase::Half can not be found!") + just_fail("IlmBase::Half can not be found!") endif() -find_package(TBB REQUIRED COMPONENTS tbb) -find_package(ZLIB REQUIRED) -find_package(Boost REQUIRED COMPONENTS iostreams system) +find_package(TBB ${_quiet} ${_required} COMPONENTS tbb) +find_package(ZLIB ${_quiet} ${_required}) +find_package(Boost ${_quiet} ${_required} COMPONENTS iostreams system ) # Use GetPrerequisites to see which libraries this OpenVDB lib has linked to # which we can query for optional deps. This basically runs ldd/otoll/objdump @@ -350,7 +408,7 @@ unset(_OPENVDB_PREREQUISITE_LIST) unset(_HAS_DEP) if(OpenVDB_USES_BLOSC) - find_package(Blosc ) + find_package(Blosc QUIET) if(NOT Blosc_FOUND OR NOT TARGET Blosc::blosc) message(STATUS "find_package could not find Blosc. Using fallback blosc search...") find_path(Blosc_INCLUDE_DIR blosc.h) @@ -362,25 +420,25 @@ if(OpenVDB_USES_BLOSC) IMPORTED_LOCATION "${Blosc_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES ${Blosc_INCLUDE_DIR}) elseif() - message(FATAL_ERROR "Blosc library can not be found!") + just_fail("Blosc library can not be found!") endif() endif() endif() if(OpenVDB_USES_LOG4CPLUS) - find_package(Log4cplus REQUIRED) + find_package(Log4cplus ${_quiet} ${_required}) endif() if(OpenVDB_USES_ILM) - find_package(IlmBase REQUIRED) + find_package(IlmBase ${_quiet} ${_required}) endif() if(OpenVDB_USES_EXR) - find_package(OpenEXR REQUIRED) + find_package(OpenEXR ${_quiet} ${_required}) endif() if(UNIX) - find_package(Threads REQUIRED) + find_package(Threads ${_quiet} ${_required}) endif() # Set deps. Note that the order here is important. If we're building against @@ -463,16 +521,35 @@ list(REMOVE_DUPLICATES OpenVDB_LIBRARY_DIRS) foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) if(NOT TARGET OpenVDB::${COMPONENT}) + if (${COMPONENT} STREQUAL openvdb) + include (${CMAKE_CURRENT_LIST_DIR}/CheckAtomic.cmake) + set(_LINK_LIBS ${_OPENVDB_VISIBLE_DEPENDENCIES} ${CMAKE_REQUIRED_LIBRARIES}) + else () + set(_LINK_LIBS _OPENVDB_VISIBLE_DEPENDENCIES) + endif () + add_library(OpenVDB::${COMPONENT} UNKNOWN IMPORTED) set_target_properties(OpenVDB::${COMPONENT} PROPERTIES - IMPORTED_LOCATION "${OpenVDB_${COMPONENT}_LIBRARY}" INTERFACE_COMPILE_OPTIONS "${OpenVDB_DEFINITIONS}" INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_INCLUDE_DIR}" IMPORTED_LINK_DEPENDENT_LIBRARIES "${_OPENVDB_HIDDEN_DEPENDENCIES}" # non visible deps - INTERFACE_LINK_LIBRARIES "${_OPENVDB_VISIBLE_DEPENDENCIES}" # visible deps (headers) + INTERFACE_LINK_LIBRARIES "${_LINK_LIBS}" # visible deps (headers) INTERFACE_COMPILE_FEATURES cxx_std_11 + IMPORTED_LOCATION "${OpenVDB_${COMPONENT}_LIBRARY}" ) + if (_is_multi) + set_target_properties(OpenVDB::${COMPONENT} PROPERTIES + IMPORTED_LOCATION_RELEASE "${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}" + ) + + if (MSVC OR OpenVDB_${COMPONENT}_LIBRARY_DEBUG) + set_target_properties(OpenVDB::${COMPONENT} PROPERTIES + IMPORTED_LOCATION_DEBUG "${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}" + ) + endif () + endif () + if (OPENVDB_USE_STATIC_LIBS) set_target_properties(OpenVDB::${COMPONENT} PROPERTIES INTERFACE_COMPILE_DEFINITIONS "OPENVDB_STATICLIB;OPENVDB_OPENEXR_STATICLIB" @@ -481,7 +558,7 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS}) endif() endforeach() -if(OpenVDB_FOUND AND NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY) +if(OpenVDB_FOUND AND NOT OpenVDB_FIND_QUIETLY) message(STATUS "OpenVDB libraries: ${OpenVDB_LIBRARIES}") endif() diff --git a/cmake/modules/Findcereal.cmake b/cmake/modules/Findcereal.cmake new file mode 100644 index 0000000000..b4829757e0 --- /dev/null +++ b/cmake/modules/Findcereal.cmake @@ -0,0 +1,26 @@ +set(_q "") +if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY) + set(_q QUIET) + set(_quietly TRUE) +endif() +find_package(${CMAKE_FIND_PACKAGE_NAME} ${${CMAKE_FIND_PACKAGE_NAME}_FIND_VERSION} CONFIG ${_q}) + +if (NOT ${CMAKE_FIND_PACKAGE_NAME}_FOUND) + # Fall-back solution to find the Cereal serialization library header file + include(CheckIncludeFileCXX) + add_library(cereal INTERFACE) + target_include_directories(cereal INTERFACE include) + + if (_quietly) + set(CMAKE_REQUIRED_QUIET ON) + endif() + CHECK_INCLUDE_FILE_CXX("cereal/cereal.hpp" HAVE_CEREAL_H) + + if (NOT HAVE_CEREAL_H) + if (${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED) + message(FATAL_ERROR "Cereal library not found. Please install the dependency.") + elseif(NOT _quietly) + message(WARNING "Cereal library not found.") + endif() + endif () +endif() diff --git a/cmake/modules/OpenVDBUtils.cmake b/cmake/modules/OpenVDBUtils.cmake index bb3ce6e65d..f64eda6f2c 100644 --- a/cmake/modules/OpenVDBUtils.cmake +++ b/cmake/modules/OpenVDBUtils.cmake @@ -125,7 +125,9 @@ function(OPENVDB_ABI_VERSION_FROM_PRINT OPENVDB_PRINT) cmake_parse_arguments(_VDB "QUIET" "ABI" "" ${ARGN}) if(NOT EXISTS ${OPENVDB_PRINT}) - message(WARNING "vdb_print not found! ${OPENVDB_PRINT}") + if(NOT OpenVDB_FIND_QUIETLY) + message(WARNING "vdb_print not found! ${OPENVDB_PRINT}") + endif() return() endif() @@ -148,7 +150,9 @@ function(OPENVDB_ABI_VERSION_FROM_PRINT OPENVDB_PRINT) endif() if(${_VDB_PRINT_RETURN_STATUS}) - message(WARNING "vdb_print returned with status ${_VDB_PRINT_RETURN_STATUS}") + if(NOT OpenVDB_FIND_QUIETLY) + message(WARNING "vdb_print returned with status ${_VDB_PRINT_RETURN_STATUS}") + endif() return() endif() diff --git a/cmake/modules/PrecompiledHeader.cmake b/cmake/modules/PrecompiledHeader.cmake index 2f62a7dbeb..7ef80aacff 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 new file mode 100644 index 0000000000..fa88fc29ee --- /dev/null +++ b/deps/CGAL/CGAL.cmake @@ -0,0 +1,31 @@ +prusaslicer_add_cmake_project( + CGAL + GIT_REPOSITORY https://github.com/CGAL/cgal.git + GIT_TAG bec70a6d52d8aacb0b3d82a7b4edc3caa899184b # releases/CGAL-5.0 + # For whatever reason, this keeps downloading forever (repeats downloads if finished) + # URL https://github.com/CGAL/cgal/archive/releases/CGAL-5.0.zip + # URL_HASH SHA256=bd9327be903ab7ee379a8a7a0609eba0962f5078d2497cf8e13e8e1598584154 + DEPENDS dep_boost dep_GMP dep_MPFR +) + +include(GNUInstallDirs) + +# CGAL, for whatever reason, makes itself non-relocatable by writing the build directory into +# CGALConfig-installation-dirs.cmake and including it in configure time. +# If this file is not present, it will not consider the stored absolute path +ExternalProject_Add_Step(dep_CGAL dep_CGAL_relocation_fix + DEPENDEES install + + COMMAND ${CMAKE_COMMAND} -E remove CGALConfig-installation-dirs.cmake + WORKING_DIRECTORY "${DESTDIR}/usr/local/${CMAKE_INSTALL_LIBDIR}/cmake/CGAL" +) + +# Again, for whatever reason, CGAL thinks that its version is not relevant if +# configured as a header only library. Fixing it by placing a cmake version file +# besides the installed config file. +ExternalProject_Add_Step(dep_CGAL dep_CGAL_version_fix + DEPENDEES install + + COMMAND ${CMAKE_COMMAND} -E copy cgal/CGALConfigVersion.cmake "${DESTDIR}/usr/local/${CMAKE_INSTALL_LIBDIR}/cmake/CGAL/CGALConfigVersion.cmake" + WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}" +) diff --git a/deps/CGAL/cgal/CGALConfigVersion.cmake b/deps/CGAL/cgal/CGALConfigVersion.cmake new file mode 100644 index 0000000000..f688824e8b --- /dev/null +++ b/deps/CGAL/cgal/CGALConfigVersion.cmake @@ -0,0 +1,37 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version. +# The variable CVF_VERSION must be set before calling configure_file(). + +set(PACKAGE_VERSION "5.0.0") + +if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() + + +# if the installed project requested no architecture check, don't perform the check +if("FALSE") + return() +endif() + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8") + math(EXPR installedBits "8 * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index 49e8ee7bab..7189458286 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: @@ -45,6 +48,49 @@ option(DEP_WX_STABLE "Build against wxWidgets stable 3.0 as opposed to default 3 message(STATUS "PrusaSlicer deps DESTDIR: ${DESTDIR}") message(STATUS "PrusaSlicer deps debug build: ${DEP_DEBUG}") +find_package(Git REQUIRED) + +get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + +function(prusaslicer_add_cmake_project projectname) + cmake_parse_arguments(P_ARGS "" "INSTALL_DIR;BUILD_COMMAND;INSTALL_COMMAND" "CMAKE_ARGS" ${ARGN}) + + set(_configs_line -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}) + if (_is_multi OR MSVC) + set(_configs_line "") + endif () + + set(_gen "") + set(_build_j "-j${NPROC}") + if (MSVC) + set(_gen CMAKE_GENERATOR "${DEP_MSVC_GEN}" CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}") + set(_build_j "/m") + endif () + + ExternalProject_Add( + dep_${projectname} + EXCLUDE_FROM_ALL ON + INSTALL_DIR ${DESTDIR}/usr/local + ${_gen} + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX:STRING=${DESTDIR}/usr/local + -DCMAKE_MODULE_PATH:STRING=${PROJECT_SOURCE_DIR}/../cmake/modules + -DCMAKE_PREFIX_PATH:STRING=${DESTDIR}/usr/local + -DCMAKE_DEBUG_POSTFIX:STRING=d + -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} + -DBUILD_SHARED_LIBS:BOOL=OFF + "${_configs_line}" + ${DEP_CMAKE_OPTS} + ${P_ARGS_CMAKE_ARGS} + ${P_ARGS_UNPARSED_ARGUMENTS} + BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Release -- ${_build_j} + INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install --config Release + ) + +endfunction(prusaslicer_add_cmake_project) + + if (MSVC) if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") message(STATUS "\nDetected 64-bit compiler => building 64-bit deps bundle\n") @@ -83,39 +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 (NOT "${ZLIB_PKG}" STREQUAL "") + add_dependencies(dep_blosc ${ZLIB_PKG}) + add_dependencies(dep_openexr ${ZLIB_PKG}) +endif () + +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} + ) + +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) - - 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 - ) - + # Experimental + #list(APPEND _dep_list "dep_qhull") 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_libigl # Not working, static build has different Eigen - ) - + 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 0000000000..ed5eb220f4 --- /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 0000000000..fa54c098f2 --- /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 0000000000..092c83baee --- /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 0000000000..40873a6f8b --- /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 0000000000..d10530b09b --- /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 0000000000..79a15c28ca --- /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 0000000000..8edb5bbbd5 --- /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 0000000000..086e24b39c --- /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 +#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 (), 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 0000000000..8aa80db0d6 --- /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 +#include + +#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 + #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 0000000000..56cd843670 --- /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 0000000000..24a1d5ccc9 --- /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 0000000000..94cb98e15c --- /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 0000000000..53c25d76b2 --- /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 0000000000..b05e62c77a --- /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 0000000000..7bb3e77603 --- /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 0000000000..fbe5e02006 --- /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 +#include /* memset(), memcpy() */ +#include +#include /* UINT_MAX */ + +#ifdef WIN32 +#define getpid GetCurrentProcessId +#else +#include /* gettimeofday() */ +#include /* getpid() */ +#include /* 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 0000000000..8475238d3e --- /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 +#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 0000000000..4dd9f06f97 --- /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 0000000000..f10b459ffd --- /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 +#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 0000000000..752007e8b9 --- /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 */ +#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 /* */ +#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_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 0000000000..da0ea60a65 --- /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 diff --git a/deps/EXPAT/expat/xmltok_impl.inc b/deps/EXPAT/expat/xmltok_impl.inc new file mode 100644 index 0000000000..5f779c0571 --- /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 " */ + 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 "= 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 "= 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 0000000000..c3b88fdf4e --- /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 new file mode 100644 index 0000000000..5916ce7eb7 --- /dev/null +++ b/deps/GLEW/GLEW.cmake @@ -0,0 +1,12 @@ +# 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( + GLEW + SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/glew +) + +if (MSVC) + add_debug_dep(dep_GLEW) +endif () diff --git a/deps/GLEW/glew/CMakeLists.txt b/deps/GLEW/glew/CMakeLists.txt new file mode 100644 index 0000000000..6daedaaddc --- /dev/null +++ b/deps/GLEW/glew/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.0) +project(GLEW) + +find_package(OpenGL REQUIRED) + +add_library(glew src/glew.c) +target_include_directories(glew PRIVATE include/) +target_link_libraries(glew PUBLIC OpenGL::GL) + +if (NOT BUILD_SHARED_LIBS) + target_compile_definitions(glew PUBLIC GLEW_STATIC) +endif () + +include(GNUInstallDirs) + +install( + FILES + ${PROJECT_SOURCE_DIR}/include/GL/glew.h + ${PROJECT_SOURCE_DIR}/include/GL/wglew.h + ${PROJECT_SOURCE_DIR}/include/GL/glxew.h + DESTINATION + ${CMAKE_INSTALL_INCLUDEDIR}/GL +) + +add_library(GLEW INTERFACE) +target_link_libraries(GLEW INTERFACE glew) + +install(TARGETS glew GLEW + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) \ No newline at end of file diff --git a/deps/GLEW/glew/LICENSE.txt b/deps/GLEW/glew/LICENSE.txt new file mode 100644 index 0000000000..f7078042e9 --- /dev/null +++ b/deps/GLEW/glew/LICENSE.txt @@ -0,0 +1,73 @@ +The OpenGL Extension Wrangler Library +Copyright (C) 2002-2007, Milan Ikits +Copyright (C) 2002-2007, Marcelo E. Magallon +Copyright (C) 2002, Lev Povalahev +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* 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. +* The name of the author may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 OWNER OR 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. + + +Mesa 3-D graphics library +Version: 7.0 + +Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + +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 +BRIAN PAUL 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. + + +Copyright (c) 2007 The Khronos Group Inc. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and/or associated documentation files (the +"Materials"), to deal in the Materials without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Materials, and to +permit persons to whom the Materials are 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 Materials. + +THE MATERIALS ARE 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 +MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. diff --git a/deps/GLEW/glew/README.md b/deps/GLEW/glew/README.md new file mode 100644 index 0000000000..e7efc244f2 --- /dev/null +++ b/deps/GLEW/glew/README.md @@ -0,0 +1,196 @@ +THIS IS NOT THE COMPLETE GLEW DISTRIBUTION. ONLY FILES NEEDED FOR COMPILING GLEW INTO SLIC3R WERE PUT INTO THE SLIC3R SOURCE DISTRIBUTION. + +A CMAKE CONFIG EXPORT IS ADDED TO ENABLE FIND PACKAGE TO FIND DEBUG BUILD ON MSVC + +# GLEW - The OpenGL Extension Wrangler Library + +![](http://glew.sourceforge.net/glew.png) + +http://glew.sourceforge.net/ + +https://github.com/nigels-com/glew + +[![Build Status](https://travis-ci.org/nigels-com/glew.svg?branch=master)](https://travis-ci.org/nigels-com/glew) +[![Gitter](https://badges.gitter.im/nigels-com/glew.svg)](https://gitter.im/nigels-com/glew?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![Download](https://img.shields.io/sourceforge/dm/glew.svg)](https://sourceforge.net/projects/glew/files/latest/download) + +## Downloads + +Current release is [2.0.0](https://sourceforge.net/projects/glew/files/glew/2.0.0/). +[(Change Log)](http://glew.sourceforge.net/log.html) + +Sources available as +[ZIP](https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0.zip/download) or +[TGZ](https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0.tgz/download). + +Windows binaries for [32-bit and 64-bit](https://sourceforge.net/projects/glew/files/glew/2.0.0/glew-2.0.0-win32.zip/download). + +### Recent snapshots + +Snapshots may contain new features, bug-fixes or new OpenGL extensions ahead of tested, official releases. + +[glew-20160708.tgz](http://sourceforge.net/projects/glew/files/glew/snapshots/glew-20160708.tgz/download) +*GLEW 2.0.0 RC: Core context, EGL support, no MX* + +[glew-20160402.tgz](http://sourceforge.net/projects/glew/files/glew/snapshots/glew-20160402.tgz/download) +*GLEW 2.0.0 RC: Core context, EGL support, no MX* + +## Build + +From a downloaded tarball or zip archive: + +### Linux and Mac + +#### Using GNU Make + +##### Install build tools + +Debian/Ubuntu/Mint: `$ sudo apt-get install build-essential libxmu-dev libxi-dev libgl-dev libosmesa-dev git` + +RedHat/CentOS/Fedora: `$ sudo yum install libXmu-devel libXi-devel libGL-devel git` + +##### Build + + $ make + $ sudo make install + $ make clean + +Targets: `all, glew.lib, glew.bin, clean, install, uninstall` + +Variables: `SYSTEM=linux-clang, GLEW_DEST=/usr/local, STRIP=` + +#### Using cmake + +*CMake 2.8.12 or higher is required.* + +##### Install build tools + +Debian/Ubuntu/Mint: `$ sudo apt-get install build-essential libXmu-dev libXi-dev libgl-dev git cmake` + +RedHat/CentOS/Fedora: `$ sudo yum install libXmu-devel libXi-devel libGL-devel git cmake` + +##### Build + + $ cd build + $ cmake ./cmake + $ make -j4 + +| Target | Description | +| ---------- | ----------- | +| glew | Build the glew shared library. | +| glew_s | Build the glew static library. | +| glewinfo | Build the `glewinfo` executable (requires `BUILD_UTILS` to be `ON`). | +| visualinfo | Build the `visualinfo` executable (requires `BUILD_UTILS` to be `ON`). | +| install | Install all enabled targets into `CMAKE_INSTALL_PREFIX`. | +| clean | Clean up build artifacts. | +| all | Build all enabled targets (default target). | + +| Variables | Description | +| --------------- | ----------- | +| BUILD_UTILS | Build the `glewinfo` and `visualinfo` executables. | +| GLEW_REGAL | Build in Regal mode. | +| GLEW_OSMESA | Build in off-screen Mesa mode. | +| BUILD_FRAMEWORK | Build as MacOSX Framework. Setting `CMAKE_INSTALL_PREFIX` to `/Library/Frameworks` is recommended. | + +### Windows + +#### Visual Studio + +Use the provided Visual Studio project file in build/vc12/ + +Projects for vc6 and vc10 are also provided + +#### MSYS/Mingw + +Available from [Mingw](http://www.mingw.org/) + +Requirements: bash, make, gcc + + $ mingw32-make + $ mingw32-make install + $ mingw32-make install.all + +Alternative toolchain: `SYSTEM=mingw-win32` + +#### MSYS2/Mingw-w64 + +Available from [Msys2](http://msys2.github.io/) and/or [Mingw-w64](http://mingw-w64.org/) + +Requirements: bash, make, gcc + + $ pacman -S gcc make mingw-w64-i686-gcc mingw-w64-x86_64-gcc + $ make + $ make install + $ make install.all + +Alternative toolchain: `SYSTEM=msys, SYSTEM=msys-win32, SYSTEM=msys-win64` + +## glewinfo + +`glewinfo` is a command-line tool useful for inspecting the capabilities of an +OpenGL implementation and GLEW support for that. Please include the output of +`glewinfo` with bug reports, as appropriate. + + --------------------------- + GLEW Extension Info + --------------------------- + + GLEW version 2.0.0 + Reporting capabilities of pixelformat 3 + Running on a Intel(R) HD Graphics 3000 from Intel + OpenGL version 3.1.0 - Build 9.17.10.4229 is supported + + GL_VERSION_1_1: OK + --------------- + + GL_VERSION_1_2: OK + --------------- + glCopyTexSubImage3D: OK + glDrawRangeElements: OK + glTexImage3D: OK + glTexSubImage3D: OK + + ... + +## Code Generation + +A Unix or Mac environment is neded for building GLEW from scratch to +include new extensions, or customize the code generation. The extension +data is regenerated from the top level source directory with: + + make extensions + +An alternative to generating the GLEW sources from scratch is to +download a pre-generated (unsupported) snapshot: + +https://sourceforge.net/projects/glew/files/glew/snapshots/ + +Travis-built snapshots are also available: + +https://glew.s3.amazonaws.com/index.html + +## Authors + +GLEW is currently maintained by [Nigel Stewart](https://github.com/nigels-com) +with bug fixes, new OpenGL extension support and new releases. + +GLEW was developed by [Milan Ikits](http://www.cs.utah.edu/~ikits/) +and [Marcelo Magallon](http://wwwvis.informatik.uni-stuttgart.de/~magallon/). +Aaron Lefohn, Joe Kniss, and Chris Wyman were the first users and also +assisted with the design and debugging process. + +The acronym GLEW originates from Aaron Lefohn. +Pasi Kärkkäinen identified and fixed several problems with +GLX and SDL. Nate Robins created the `wglinfo` utility, to +which modifications were made by Michael Wimmer. + +## Copyright and Licensing + +GLEW is originally derived from the EXTGL project by Lev Povalahev. +The source code is licensed under the +[Modified BSD License](http://glew.sourceforge.net/glew.txt), the +[Mesa 3-D License](http://glew.sourceforge.net/mesa.txt) (MIT) and the +[Khronos License](http://glew.sourceforge.net/khronos.txt) (MIT). + +The automatic code generation scripts are released under the +[GNU GPL](http://glew.sourceforge.net/gpl.txt). diff --git a/deps/GLEW/glew/VERSION b/deps/GLEW/glew/VERSION new file mode 100644 index 0000000000..f88cf52e6e --- /dev/null +++ b/deps/GLEW/glew/VERSION @@ -0,0 +1 @@ +1.13.0 \ No newline at end of file diff --git a/deps/GLEW/glew/include/GL/glew.h b/deps/GLEW/glew/include/GL/glew.h new file mode 100644 index 0000000000..702265c38b --- /dev/null +++ b/deps/GLEW/glew/include/GL/glew.h @@ -0,0 +1,19753 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2015, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * 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. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 OWNER OR 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. +*/ + +/* + * Mesa 3-D graphics library + * Version: 7.0 + * + * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + +/* +** Copyright (c) 2007 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are 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 Materials. +** +** THE MATERIALS ARE 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 +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#ifndef __glew_h__ +#define __glew_h__ +#define __GLEW_H__ + +#if defined(__gl_h_) || defined(__GL_H__) || defined(_GL_H) || defined(__X_GL_H) +#error gl.h included before glew.h +#endif +#if defined(__gl2_h_) +#error gl2.h included before glew.h +#endif +#if defined(__gltypes_h_) +#error gltypes.h included before glew.h +#endif +#if defined(__REGAL_H__) +#error Regal.h included before glew.h +#endif +#if defined(__glext_h_) || defined(__GLEXT_H_) +#error glext.h included before glew.h +#endif +#if defined(__gl_ATI_h_) +#error glATI.h included before glew.h +#endif + +#define __gl_h_ +#define __gl2_h_ +#define __GL_H__ +#define _GL_H +#define __gltypes_h_ +#define __REGAL_H__ +#define __X_GL_H +#define __glext_h_ +#define __GLEXT_H_ +#define __gl_ATI_h_ + +#if defined(_WIN32) + +/* + * GLEW does not include to avoid name space pollution. + * GL needs GLAPI and GLAPIENTRY, GLU needs APIENTRY, CALLBACK, and wchar_t + * defined properly. + */ +/* and */ +#ifdef APIENTRY +# ifndef GLAPIENTRY +# define GLAPIENTRY APIENTRY +# endif +# ifndef GLEWAPIENTRY +# define GLEWAPIENTRY APIENTRY +# endif +#else +#define GLEW_APIENTRY_DEFINED +# if defined(__MINGW32__) || defined(__CYGWIN__) || (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) +# define APIENTRY __stdcall +# ifndef GLAPIENTRY +# define GLAPIENTRY __stdcall +# endif +# ifndef GLEWAPIENTRY +# define GLEWAPIENTRY __stdcall +# endif +# else +# define APIENTRY +# endif +#endif +#ifndef GLAPI +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define GLAPI extern +# endif +#endif +/* */ +#ifndef CALLBACK +#define GLEW_CALLBACK_DEFINED +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define CALLBACK __attribute__ ((__stdcall__)) +# elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) +# define CALLBACK __stdcall +# else +# define CALLBACK +# endif +#endif +/* and */ +#ifndef WINGDIAPI +#define GLEW_WINGDIAPI_DEFINED +#define WINGDIAPI __declspec(dllimport) +#endif +/* */ +#if (defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(_WCHAR_T_DEFINED) +typedef unsigned short wchar_t; +# define _WCHAR_T_DEFINED +#endif +/* */ +#if !defined(_W64) +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && defined(_MSC_VER) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif +#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) && !defined(__MINGW64__) +# ifdef _WIN64 +typedef __int64 ptrdiff_t; +# else +typedef _W64 int ptrdiff_t; +# endif +# define _PTRDIFF_T_DEFINED +# define _PTRDIFF_T_ +#endif + +#ifndef GLAPI +# if defined(__MINGW32__) || defined(__CYGWIN__) +# define GLAPI extern +# else +# define GLAPI WINGDIAPI +# endif +#endif + +/* + * GLEW_STATIC is defined for static library. + * GLEW_BUILD is defined for building the DLL library. + */ + +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# ifdef GLEW_BUILD +# define GLEWAPI extern __declspec(dllexport) +# else +# define GLEWAPI extern __declspec(dllimport) +# endif +#endif + +#else /* _UNIX */ + +/* + * Needed for ptrdiff_t in turn needed by VBO. This is defined by ISO + * C. On my system, this amounts to _3 lines_ of included code, all of + * them pretty much harmless. If you know of a way of detecting 32 vs + * 64 _targets_ at compile time you are free to replace this with + * something that's portable. For now, _this_ is the portable solution. + * (mem, 2004-01-04) + */ + +#include + +/* SGI MIPSPro doesn't like stdint.h in C++ mode */ +/* ID: 3376260 Solaris 9 has inttypes.h, but not stdint.h */ + +#if (defined(__sgi) || defined(__sun)) && !defined(__GNUC__) +#include +#else +#include +#endif + +#define GLEW_APIENTRY_DEFINED +#define APIENTRY + +/* + * GLEW_STATIC is defined for static library. + */ + +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# if defined(__GNUC__) && __GNUC__>=4 +# define GLEWAPI extern __attribute__ ((visibility("default"))) +# elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) +# define GLEWAPI extern __global +# else +# define GLEWAPI extern +# endif +#endif + +/* */ +#ifndef GLAPI +#define GLAPI extern +#endif + +#endif /* _WIN32 */ + +#ifndef GLAPIENTRY +#define GLAPIENTRY +#endif + +#ifndef GLEWAPIENTRY +#define GLEWAPIENTRY +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* ----------------------------- GL_VERSION_1_1 ---------------------------- */ + +#ifndef GL_VERSION_1_1 +#define GL_VERSION_1_1 1 + +typedef unsigned int GLenum; +typedef unsigned int GLbitfield; +typedef unsigned int GLuint; +typedef int GLint; +typedef int GLsizei; +typedef unsigned char GLboolean; +typedef signed char GLbyte; +typedef short GLshort; +typedef unsigned char GLubyte; +typedef unsigned short GLushort; +typedef unsigned long GLulong; +typedef float GLfloat; +typedef float GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void GLvoid; +#if defined(_MSC_VER) && _MSC_VER < 1400 +typedef __int64 GLint64EXT; +typedef unsigned __int64 GLuint64EXT; +#elif defined(_MSC_VER) || defined(__BORLANDC__) +typedef signed long long GLint64EXT; +typedef unsigned long long GLuint64EXT; +#else +# if defined(__MINGW32__) || defined(__CYGWIN__) +#include +# endif +typedef int64_t GLint64EXT; +typedef uint64_t GLuint64EXT; +#endif +typedef GLint64EXT GLint64; +typedef GLuint64EXT GLuint64; +typedef struct __GLsync *GLsync; + +typedef char GLchar; + +#define GL_ZERO 0 +#define GL_FALSE 0 +#define GL_LOGIC_OP 0x0BF1 +#define GL_NONE 0 +#define GL_TEXTURE_COMPONENTS 0x1003 +#define GL_NO_ERROR 0 +#define GL_POINTS 0x0000 +#define GL_CURRENT_BIT 0x00000001 +#define GL_TRUE 1 +#define GL_ONE 1 +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_POINT_BIT 0x00000002 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_LINE_STRIP 0x0003 +#define GL_LINE_BIT 0x00000004 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON 0x0009 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM 0x0100 +#define GL_LOAD 0x0101 +#define GL_RETURN 0x0102 +#define GL_MULT 0x0103 +#define GL_ADD 0x0104 +#define GL_NEVER 0x0200 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_LESS 0x0201 +#define GL_EQUAL 0x0202 +#define GL_LEQUAL 0x0203 +#define GL_GREATER 0x0204 +#define GL_NOTEQUAL 0x0205 +#define GL_GEQUAL 0x0206 +#define GL_ALWAYS 0x0207 +#define GL_SRC_COLOR 0x0300 +#define GL_ONE_MINUS_SRC_COLOR 0x0301 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_DST_ALPHA 0x0304 +#define GL_ONE_MINUS_DST_ALPHA 0x0305 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_EXP 0x0800 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_EXP2 0x0801 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_RANGE 0x0B12 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_RANGE 0x0B22 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LIST_MODE 0x0B30 +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_SHADE_MODEL 0x0B54 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_FOG 0x0B60 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_COLOR 0x0B66 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_TEST 0x0B71 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_STENCIL_TEST 0x0B90 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#define GL_STENCIL_VALUE_MASK 0x0B93 +#define GL_STENCIL_FAIL 0x0B94 +#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 +#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 +#define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_WRITEMASK 0x0B98 +#define GL_MATRIX_MODE 0x0BA0 +#define GL_NORMALIZE 0x0BA1 +#define GL_VIEWPORT 0x0BA2 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_FUNC 0x0BC1 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_DITHER 0x0BD0 +#define GL_BLEND_DST 0x0BE0 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND 0x0BE2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_READ_BUFFER 0x0C02 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_INDEX_MODE 0x0C30 +#define GL_RGBA_MODE 0x0C31 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_RENDER_MODE 0x0C40 +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_FOG_HINT 0x0C54 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_INDEX_BITS 0x0D51 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_DOUBLE 0x140A +#define GL_CLEAR 0x1500 +#define GL_AND 0x1501 +#define GL_AND_REVERSE 0x1502 +#define GL_COPY 0x1503 +#define GL_AND_INVERTED 0x1504 +#define GL_NOOP 0x1505 +#define GL_XOR 0x1506 +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_EQUIV 0x1509 +#define GL_INVERT 0x150A +#define GL_OR_REVERSE 0x150B +#define GL_COPY_INVERTED 0x150C +#define GL_OR_INVERTED 0x150D +#define GL_NAND 0x150E +#define GL_SET 0x150F +#define GL_EMISSION 0x1600 +#define GL_SHININESS 0x1601 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_COLOR_INDEX 0x1900 +#define GL_STENCIL_INDEX 0x1901 +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_BITMAP 0x1A00 +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_RENDER 0x1C00 +#define GL_FEEDBACK 0x1C01 +#define GL_SELECT 0x1C02 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_S 0x2000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 +#define GL_MODULATE 0x2100 +#define GL_DECAL 0x2101 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_ENV 0x2300 +#define GL_EYE_LINEAR 0x2400 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_SPHERE_MAP 0x2402 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_PLANE 0x2502 +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_CLAMP 0x2900 +#define GL_REPEAT 0x2901 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_R3_G3_B2 0x2A10 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 +#define GL_LIGHT0 0x4000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_HINT_BIT 0x00008000 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_TEXTURE_RED_SIZE 0x805C +#define GL_TEXTURE_GREEN_SIZE 0x805D +#define GL_TEXTURE_BLUE_SIZE 0x805E +#define GL_TEXTURE_ALPHA_SIZE 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0x000fffff +#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff + +GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value); +GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref); +GLAPI GLboolean GLAPIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void GLAPIENTRY glArrayElement (GLint i); +GLAPI void GLAPIENTRY glBegin (GLenum mode); +GLAPI void GLAPIENTRY glBindTexture (GLenum target, GLuint texture); +GLAPI void GLAPIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); +GLAPI void GLAPIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GLAPI void GLAPIENTRY glCallList (GLuint list); +GLAPI void GLAPIENTRY glCallLists (GLsizei n, GLenum type, const void *lists); +GLAPI void GLAPIENTRY glClear (GLbitfield mask); +GLAPI void GLAPIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +GLAPI void GLAPIENTRY glClearDepth (GLclampd depth); +GLAPI void GLAPIENTRY glClearIndex (GLfloat c); +GLAPI void GLAPIENTRY glClearStencil (GLint s); +GLAPI void GLAPIENTRY glClipPlane (GLenum plane, const GLdouble *equation); +GLAPI void GLAPIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void GLAPIENTRY glColor3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void GLAPIENTRY glColor3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void GLAPIENTRY glColor3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor3i (GLint red, GLint green, GLint blue); +GLAPI void GLAPIENTRY glColor3iv (const GLint *v); +GLAPI void GLAPIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void GLAPIENTRY glColor3sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void GLAPIENTRY glColor3ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void GLAPIENTRY glColor3uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void GLAPIENTRY glColor3usv (const GLushort *v); +GLAPI void GLAPIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); +GLAPI void GLAPIENTRY glColor4bv (const GLbyte *v); +GLAPI void GLAPIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); +GLAPI void GLAPIENTRY glColor4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void GLAPIENTRY glColor4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void GLAPIENTRY glColor4iv (const GLint *v); +GLAPI void GLAPIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); +GLAPI void GLAPIENTRY glColor4sv (const GLshort *v); +GLAPI void GLAPIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +GLAPI void GLAPIENTRY glColor4ubv (const GLubyte *v); +GLAPI void GLAPIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); +GLAPI void GLAPIENTRY glColor4uiv (const GLuint *v); +GLAPI void GLAPIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); +GLAPI void GLAPIENTRY glColor4usv (const GLushort *v); +GLAPI void GLAPIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GLAPI void GLAPIENTRY glColorMaterial (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); +GLAPI void GLAPIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void GLAPIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void GLAPIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void GLAPIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glCullFace (GLenum mode); +GLAPI void GLAPIENTRY glDeleteLists (GLuint list, GLsizei range); +GLAPI void GLAPIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); +GLAPI void GLAPIENTRY glDepthFunc (GLenum func); +GLAPI void GLAPIENTRY glDepthMask (GLboolean flag); +GLAPI void GLAPIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); +GLAPI void GLAPIENTRY glDisable (GLenum cap); +GLAPI void GLAPIENTRY glDisableClientState (GLenum array); +GLAPI void GLAPIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GLAPI void GLAPIENTRY glDrawBuffer (GLenum mode); +GLAPI void GLAPIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); +GLAPI void GLAPIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glEdgeFlag (GLboolean flag); +GLAPI void GLAPIENTRY glEdgeFlagPointer (GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glEdgeFlagv (const GLboolean *flag); +GLAPI void GLAPIENTRY glEnable (GLenum cap); +GLAPI void GLAPIENTRY glEnableClientState (GLenum array); +GLAPI void GLAPIENTRY glEnd (void); +GLAPI void GLAPIENTRY glEndList (void); +GLAPI void GLAPIENTRY glEvalCoord1d (GLdouble u); +GLAPI void GLAPIENTRY glEvalCoord1dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord1f (GLfloat u); +GLAPI void GLAPIENTRY glEvalCoord1fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalCoord2d (GLdouble u, GLdouble v); +GLAPI void GLAPIENTRY glEvalCoord2dv (const GLdouble *u); +GLAPI void GLAPIENTRY glEvalCoord2f (GLfloat u, GLfloat v); +GLAPI void GLAPIENTRY glEvalCoord2fv (const GLfloat *u); +GLAPI void GLAPIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); +GLAPI void GLAPIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); +GLAPI void GLAPIENTRY glEvalPoint1 (GLint i); +GLAPI void GLAPIENTRY glEvalPoint2 (GLint i, GLint j); +GLAPI void GLAPIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); +GLAPI void GLAPIENTRY glFinish (void); +GLAPI void GLAPIENTRY glFlush (void); +GLAPI void GLAPIENTRY glFogf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glFogfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glFogi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glFogiv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glFrontFace (GLenum mode); +GLAPI void GLAPIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI GLuint GLAPIENTRY glGenLists (GLsizei range); +GLAPI void GLAPIENTRY glGenTextures (GLsizei n, GLuint *textures); +GLAPI void GLAPIENTRY glGetBooleanv (GLenum pname, GLboolean *params); +GLAPI void GLAPIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); +GLAPI void GLAPIENTRY glGetDoublev (GLenum pname, GLdouble *params); +GLAPI GLenum GLAPIENTRY glGetError (void); +GLAPI void GLAPIENTRY glGetFloatv (GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetIntegerv (GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); +GLAPI void GLAPIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); +GLAPI void GLAPIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); +GLAPI void GLAPIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); +GLAPI void GLAPIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); +GLAPI void GLAPIENTRY glGetPixelMapusv (GLenum map, GLushort *values); +GLAPI void GLAPIENTRY glGetPointerv (GLenum pname, void* *params); +GLAPI void GLAPIENTRY glGetPolygonStipple (GLubyte *mask); +GLAPI const GLubyte * GLAPIENTRY glGetString (GLenum name); +GLAPI void GLAPIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); +GLAPI void GLAPIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void GLAPIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void GLAPIENTRY glHint (GLenum target, GLenum mode); +GLAPI void GLAPIENTRY glIndexMask (GLuint mask); +GLAPI void GLAPIENTRY glIndexPointer (GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glIndexd (GLdouble c); +GLAPI void GLAPIENTRY glIndexdv (const GLdouble *c); +GLAPI void GLAPIENTRY glIndexf (GLfloat c); +GLAPI void GLAPIENTRY glIndexfv (const GLfloat *c); +GLAPI void GLAPIENTRY glIndexi (GLint c); +GLAPI void GLAPIENTRY glIndexiv (const GLint *c); +GLAPI void GLAPIENTRY glIndexs (GLshort c); +GLAPI void GLAPIENTRY glIndexsv (const GLshort *c); +GLAPI void GLAPIENTRY glIndexub (GLubyte c); +GLAPI void GLAPIENTRY glIndexubv (const GLubyte *c); +GLAPI void GLAPIENTRY glInitNames (void); +GLAPI void GLAPIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const void *pointer); +GLAPI GLboolean GLAPIENTRY glIsEnabled (GLenum cap); +GLAPI GLboolean GLAPIENTRY glIsList (GLuint list); +GLAPI GLboolean GLAPIENTRY glIsTexture (GLuint texture); +GLAPI void GLAPIENTRY glLightModelf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightModelfv (GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLightModeli (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightModeliv (GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glLighti (GLenum light, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glLineStipple (GLint factor, GLushort pattern); +GLAPI void GLAPIENTRY glLineWidth (GLfloat width); +GLAPI void GLAPIENTRY glListBase (GLuint base); +GLAPI void GLAPIENTRY glLoadIdentity (void); +GLAPI void GLAPIENTRY glLoadMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glLoadMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glLoadName (GLuint name); +GLAPI void GLAPIENTRY glLogicOp (GLenum opcode); +GLAPI void GLAPIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void GLAPIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void GLAPIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void GLAPIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +GLAPI void GLAPIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); +GLAPI void GLAPIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); +GLAPI void GLAPIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); +GLAPI void GLAPIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); +GLAPI void GLAPIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glMateriali (GLenum face, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glMatrixMode (GLenum mode); +GLAPI void GLAPIENTRY glMultMatrixd (const GLdouble *m); +GLAPI void GLAPIENTRY glMultMatrixf (const GLfloat *m); +GLAPI void GLAPIENTRY glNewList (GLuint list, GLenum mode); +GLAPI void GLAPIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void GLAPIENTRY glNormal3bv (const GLbyte *v); +GLAPI void GLAPIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void GLAPIENTRY glNormal3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void GLAPIENTRY glNormal3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); +GLAPI void GLAPIENTRY glNormal3iv (const GLint *v); +GLAPI void GLAPIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); +GLAPI void GLAPIENTRY glNormal3sv (const GLshort *v); +GLAPI void GLAPIENTRY glNormalPointer (GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void GLAPIENTRY glPassThrough (GLfloat token); +GLAPI void GLAPIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); +GLAPI void GLAPIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); +GLAPI void GLAPIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); +GLAPI void GLAPIENTRY glPixelStoref (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelStorei (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelTransferf (GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glPixelTransferi (GLenum pname, GLint param); +GLAPI void GLAPIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); +GLAPI void GLAPIENTRY glPointSize (GLfloat size); +GLAPI void GLAPIENTRY glPolygonMode (GLenum face, GLenum mode); +GLAPI void GLAPIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GLAPI void GLAPIENTRY glPolygonStipple (const GLubyte *mask); +GLAPI void GLAPIENTRY glPopAttrib (void); +GLAPI void GLAPIENTRY glPopClientAttrib (void); +GLAPI void GLAPIENTRY glPopMatrix (void); +GLAPI void GLAPIENTRY glPopName (void); +GLAPI void GLAPIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); +GLAPI void GLAPIENTRY glPushAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushClientAttrib (GLbitfield mask); +GLAPI void GLAPIENTRY glPushMatrix (void); +GLAPI void GLAPIENTRY glPushName (GLuint name); +GLAPI void GLAPIENTRY glRasterPos2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glRasterPos2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glRasterPos2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glRasterPos2iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glRasterPos2sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRasterPos3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glRasterPos3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glRasterPos3iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glRasterPos3sv (const GLshort *v); +GLAPI void GLAPIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glRasterPos4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glRasterPos4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glRasterPos4iv (const GLint *v); +GLAPI void GLAPIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glRasterPos4sv (const GLshort *v); +GLAPI void GLAPIENTRY glReadBuffer (GLenum mode); +GLAPI void GLAPIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +GLAPI void GLAPIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); +GLAPI void GLAPIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); +GLAPI void GLAPIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); +GLAPI void GLAPIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); +GLAPI void GLAPIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); +GLAPI void GLAPIENTRY glRectiv (const GLint *v1, const GLint *v2); +GLAPI void GLAPIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); +GLAPI void GLAPIENTRY glRectsv (const GLshort *v1, const GLshort *v2); +GLAPI GLint GLAPIENTRY glRenderMode (GLenum mode); +GLAPI void GLAPIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void GLAPIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); +GLAPI void GLAPIENTRY glShadeModel (GLenum mode); +GLAPI void GLAPIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GLAPI void GLAPIENTRY glStencilMask (GLuint mask); +GLAPI void GLAPIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GLAPI void GLAPIENTRY glTexCoord1d (GLdouble s); +GLAPI void GLAPIENTRY glTexCoord1dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord1f (GLfloat s); +GLAPI void GLAPIENTRY glTexCoord1fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord1i (GLint s); +GLAPI void GLAPIENTRY glTexCoord1iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord1s (GLshort s); +GLAPI void GLAPIENTRY glTexCoord1sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord2d (GLdouble s, GLdouble t); +GLAPI void GLAPIENTRY glTexCoord2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord2f (GLfloat s, GLfloat t); +GLAPI void GLAPIENTRY glTexCoord2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord2i (GLint s, GLint t); +GLAPI void GLAPIENTRY glTexCoord2iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord2s (GLshort s, GLshort t); +GLAPI void GLAPIENTRY glTexCoord2sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); +GLAPI void GLAPIENTRY glTexCoord3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); +GLAPI void GLAPIENTRY glTexCoord3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord3i (GLint s, GLint t, GLint r); +GLAPI void GLAPIENTRY glTexCoord3iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); +GLAPI void GLAPIENTRY glTexCoord3sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void GLAPIENTRY glTexCoord4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void GLAPIENTRY glTexCoord4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); +GLAPI void GLAPIENTRY glTexCoord4iv (const GLint *v); +GLAPI void GLAPIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void GLAPIENTRY glTexCoord4sv (const GLshort *v); +GLAPI void GLAPIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); +GLAPI void GLAPIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void GLAPIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GLAPI void GLAPIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void GLAPIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void GLAPIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void GLAPIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void GLAPIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex2d (GLdouble x, GLdouble y); +GLAPI void GLAPIENTRY glVertex2dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex2f (GLfloat x, GLfloat y); +GLAPI void GLAPIENTRY glVertex2fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex2i (GLint x, GLint y); +GLAPI void GLAPIENTRY glVertex2iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex2s (GLshort x, GLshort y); +GLAPI void GLAPIENTRY glVertex2sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void GLAPIENTRY glVertex3dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void GLAPIENTRY glVertex3fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex3i (GLint x, GLint y, GLint z); +GLAPI void GLAPIENTRY glVertex3iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); +GLAPI void GLAPIENTRY glVertex3sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void GLAPIENTRY glVertex4dv (const GLdouble *v); +GLAPI void GLAPIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void GLAPIENTRY glVertex4fv (const GLfloat *v); +GLAPI void GLAPIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); +GLAPI void GLAPIENTRY glVertex4iv (const GLint *v); +GLAPI void GLAPIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void GLAPIENTRY glVertex4sv (const GLshort *v); +GLAPI void GLAPIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void GLAPIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); + +#define GLEW_VERSION_1_1 GLEW_GET_VAR(__GLEW_VERSION_1_1) + +#endif /* GL_VERSION_1_1 */ + +/* ---------------------------------- GLU ---------------------------------- */ + +#ifndef GLEW_NO_GLU +# ifdef __APPLE__ +# include +# if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) +# define GLEW_NO_GLU +# endif +# endif +#endif + +#ifndef GLEW_NO_GLU +/* this is where we can safely include GLU */ +# if defined(__APPLE__) && defined(__MACH__) +# include +# else +# include +# endif +#endif + +/* ----------------------------- GL_VERSION_1_2 ---------------------------- */ + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 + +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_RESCALE_NORMAL 0x803A +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E + +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + +#define glCopyTexSubImage3D GLEW_GET_FUN(__glewCopyTexSubImage3D) +#define glDrawRangeElements GLEW_GET_FUN(__glewDrawRangeElements) +#define glTexImage3D GLEW_GET_FUN(__glewTexImage3D) +#define glTexSubImage3D GLEW_GET_FUN(__glewTexSubImage3D) + +#define GLEW_VERSION_1_2 GLEW_GET_VAR(__GLEW_VERSION_1_2) + +#endif /* GL_VERSION_1_2 */ + +/* ---------------------------- GL_VERSION_1_2_1 --------------------------- */ + +#ifndef GL_VERSION_1_2_1 +#define GL_VERSION_1_2_1 1 + +#define GLEW_VERSION_1_2_1 GLEW_GET_VAR(__GLEW_VERSION_1_2_1) + +#endif /* GL_VERSION_1_2_1 */ + +/* ----------------------------- GL_VERSION_1_3 ---------------------------- */ + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 + +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_SUBTRACT 0x84E7 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +#define GL_MULTISAMPLE_BIT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, void *img); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); + +#define glActiveTexture GLEW_GET_FUN(__glewActiveTexture) +#define glClientActiveTexture GLEW_GET_FUN(__glewClientActiveTexture) +#define glCompressedTexImage1D GLEW_GET_FUN(__glewCompressedTexImage1D) +#define glCompressedTexImage2D GLEW_GET_FUN(__glewCompressedTexImage2D) +#define glCompressedTexImage3D GLEW_GET_FUN(__glewCompressedTexImage3D) +#define glCompressedTexSubImage1D GLEW_GET_FUN(__glewCompressedTexSubImage1D) +#define glCompressedTexSubImage2D GLEW_GET_FUN(__glewCompressedTexSubImage2D) +#define glCompressedTexSubImage3D GLEW_GET_FUN(__glewCompressedTexSubImage3D) +#define glGetCompressedTexImage GLEW_GET_FUN(__glewGetCompressedTexImage) +#define glLoadTransposeMatrixd GLEW_GET_FUN(__glewLoadTransposeMatrixd) +#define glLoadTransposeMatrixf GLEW_GET_FUN(__glewLoadTransposeMatrixf) +#define glMultTransposeMatrixd GLEW_GET_FUN(__glewMultTransposeMatrixd) +#define glMultTransposeMatrixf GLEW_GET_FUN(__glewMultTransposeMatrixf) +#define glMultiTexCoord1d GLEW_GET_FUN(__glewMultiTexCoord1d) +#define glMultiTexCoord1dv GLEW_GET_FUN(__glewMultiTexCoord1dv) +#define glMultiTexCoord1f GLEW_GET_FUN(__glewMultiTexCoord1f) +#define glMultiTexCoord1fv GLEW_GET_FUN(__glewMultiTexCoord1fv) +#define glMultiTexCoord1i GLEW_GET_FUN(__glewMultiTexCoord1i) +#define glMultiTexCoord1iv GLEW_GET_FUN(__glewMultiTexCoord1iv) +#define glMultiTexCoord1s GLEW_GET_FUN(__glewMultiTexCoord1s) +#define glMultiTexCoord1sv GLEW_GET_FUN(__glewMultiTexCoord1sv) +#define glMultiTexCoord2d GLEW_GET_FUN(__glewMultiTexCoord2d) +#define glMultiTexCoord2dv GLEW_GET_FUN(__glewMultiTexCoord2dv) +#define glMultiTexCoord2f GLEW_GET_FUN(__glewMultiTexCoord2f) +#define glMultiTexCoord2fv GLEW_GET_FUN(__glewMultiTexCoord2fv) +#define glMultiTexCoord2i GLEW_GET_FUN(__glewMultiTexCoord2i) +#define glMultiTexCoord2iv GLEW_GET_FUN(__glewMultiTexCoord2iv) +#define glMultiTexCoord2s GLEW_GET_FUN(__glewMultiTexCoord2s) +#define glMultiTexCoord2sv GLEW_GET_FUN(__glewMultiTexCoord2sv) +#define glMultiTexCoord3d GLEW_GET_FUN(__glewMultiTexCoord3d) +#define glMultiTexCoord3dv GLEW_GET_FUN(__glewMultiTexCoord3dv) +#define glMultiTexCoord3f GLEW_GET_FUN(__glewMultiTexCoord3f) +#define glMultiTexCoord3fv GLEW_GET_FUN(__glewMultiTexCoord3fv) +#define glMultiTexCoord3i GLEW_GET_FUN(__glewMultiTexCoord3i) +#define glMultiTexCoord3iv GLEW_GET_FUN(__glewMultiTexCoord3iv) +#define glMultiTexCoord3s GLEW_GET_FUN(__glewMultiTexCoord3s) +#define glMultiTexCoord3sv GLEW_GET_FUN(__glewMultiTexCoord3sv) +#define glMultiTexCoord4d GLEW_GET_FUN(__glewMultiTexCoord4d) +#define glMultiTexCoord4dv GLEW_GET_FUN(__glewMultiTexCoord4dv) +#define glMultiTexCoord4f GLEW_GET_FUN(__glewMultiTexCoord4f) +#define glMultiTexCoord4fv GLEW_GET_FUN(__glewMultiTexCoord4fv) +#define glMultiTexCoord4i GLEW_GET_FUN(__glewMultiTexCoord4i) +#define glMultiTexCoord4iv GLEW_GET_FUN(__glewMultiTexCoord4iv) +#define glMultiTexCoord4s GLEW_GET_FUN(__glewMultiTexCoord4s) +#define glMultiTexCoord4sv GLEW_GET_FUN(__glewMultiTexCoord4sv) +#define glSampleCoverage GLEW_GET_FUN(__glewSampleCoverage) + +#define GLEW_VERSION_1_3 GLEW_GET_VAR(__GLEW_VERSION_1_3) + +#endif /* GL_VERSION_1_3 */ + +/* ----------------------------- GL_VERSION_1_4 ---------------------------- */ + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 + +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_COMPARE_R_TO_TEXTURE 0x884E + +typedef void (GLAPIENTRY * PFNGLBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const* indices, GLsizei drawcount); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVPROC) (const GLshort *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVPROC) (const GLdouble *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVPROC) (const GLfloat *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVPROC) (const GLint *p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p); + +#define glBlendColor GLEW_GET_FUN(__glewBlendColor) +#define glBlendEquation GLEW_GET_FUN(__glewBlendEquation) +#define glBlendFuncSeparate GLEW_GET_FUN(__glewBlendFuncSeparate) +#define glFogCoordPointer GLEW_GET_FUN(__glewFogCoordPointer) +#define glFogCoordd GLEW_GET_FUN(__glewFogCoordd) +#define glFogCoorddv GLEW_GET_FUN(__glewFogCoorddv) +#define glFogCoordf GLEW_GET_FUN(__glewFogCoordf) +#define glFogCoordfv GLEW_GET_FUN(__glewFogCoordfv) +#define glMultiDrawArrays GLEW_GET_FUN(__glewMultiDrawArrays) +#define glMultiDrawElements GLEW_GET_FUN(__glewMultiDrawElements) +#define glPointParameterf GLEW_GET_FUN(__glewPointParameterf) +#define glPointParameterfv GLEW_GET_FUN(__glewPointParameterfv) +#define glPointParameteri GLEW_GET_FUN(__glewPointParameteri) +#define glPointParameteriv GLEW_GET_FUN(__glewPointParameteriv) +#define glSecondaryColor3b GLEW_GET_FUN(__glewSecondaryColor3b) +#define glSecondaryColor3bv GLEW_GET_FUN(__glewSecondaryColor3bv) +#define glSecondaryColor3d GLEW_GET_FUN(__glewSecondaryColor3d) +#define glSecondaryColor3dv GLEW_GET_FUN(__glewSecondaryColor3dv) +#define glSecondaryColor3f GLEW_GET_FUN(__glewSecondaryColor3f) +#define glSecondaryColor3fv GLEW_GET_FUN(__glewSecondaryColor3fv) +#define glSecondaryColor3i GLEW_GET_FUN(__glewSecondaryColor3i) +#define glSecondaryColor3iv GLEW_GET_FUN(__glewSecondaryColor3iv) +#define glSecondaryColor3s GLEW_GET_FUN(__glewSecondaryColor3s) +#define glSecondaryColor3sv GLEW_GET_FUN(__glewSecondaryColor3sv) +#define glSecondaryColor3ub GLEW_GET_FUN(__glewSecondaryColor3ub) +#define glSecondaryColor3ubv GLEW_GET_FUN(__glewSecondaryColor3ubv) +#define glSecondaryColor3ui GLEW_GET_FUN(__glewSecondaryColor3ui) +#define glSecondaryColor3uiv GLEW_GET_FUN(__glewSecondaryColor3uiv) +#define glSecondaryColor3us GLEW_GET_FUN(__glewSecondaryColor3us) +#define glSecondaryColor3usv GLEW_GET_FUN(__glewSecondaryColor3usv) +#define glSecondaryColorPointer GLEW_GET_FUN(__glewSecondaryColorPointer) +#define glWindowPos2d GLEW_GET_FUN(__glewWindowPos2d) +#define glWindowPos2dv GLEW_GET_FUN(__glewWindowPos2dv) +#define glWindowPos2f GLEW_GET_FUN(__glewWindowPos2f) +#define glWindowPos2fv GLEW_GET_FUN(__glewWindowPos2fv) +#define glWindowPos2i GLEW_GET_FUN(__glewWindowPos2i) +#define glWindowPos2iv GLEW_GET_FUN(__glewWindowPos2iv) +#define glWindowPos2s GLEW_GET_FUN(__glewWindowPos2s) +#define glWindowPos2sv GLEW_GET_FUN(__glewWindowPos2sv) +#define glWindowPos3d GLEW_GET_FUN(__glewWindowPos3d) +#define glWindowPos3dv GLEW_GET_FUN(__glewWindowPos3dv) +#define glWindowPos3f GLEW_GET_FUN(__glewWindowPos3f) +#define glWindowPos3fv GLEW_GET_FUN(__glewWindowPos3fv) +#define glWindowPos3i GLEW_GET_FUN(__glewWindowPos3i) +#define glWindowPos3iv GLEW_GET_FUN(__glewWindowPos3iv) +#define glWindowPos3s GLEW_GET_FUN(__glewWindowPos3s) +#define glWindowPos3sv GLEW_GET_FUN(__glewWindowPos3sv) + +#define GLEW_VERSION_1_4 GLEW_GET_VAR(__GLEW_VERSION_1_4) + +#endif /* GL_VERSION_1_4 */ + +/* ----------------------------- GL_VERSION_1_5 ---------------------------- */ + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 + +#define GL_CURRENT_FOG_COORD GL_CURRENT_FOG_COORDINATE +#define GL_FOG_COORD GL_FOG_COORDINATE +#define GL_FOG_COORD_ARRAY GL_FOG_COORDINATE_ARRAY +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING +#define GL_FOG_COORD_ARRAY_POINTER GL_FOG_COORDINATE_ARRAY_POINTER +#define GL_FOG_COORD_ARRAY_STRIDE GL_FOG_COORDINATE_ARRAY_STRIDE +#define GL_FOG_COORD_ARRAY_TYPE GL_FOG_COORDINATE_ARRAY_TYPE +#define GL_FOG_COORD_SRC GL_FOG_COORDINATE_SOURCE +#define GL_SRC0_ALPHA GL_SOURCE0_ALPHA +#define GL_SRC0_RGB GL_SOURCE0_RGB +#define GL_SRC1_ALPHA GL_SOURCE1_ALPHA +#define GL_SRC1_RGB GL_SOURCE1_RGB +#define GL_SRC2_ALPHA GL_SOURCE2_ALPHA +#define GL_SRC2_RGB GL_SOURCE2_RGB +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 + +typedef ptrdiff_t GLintptr; +typedef ptrdiff_t GLsizeiptr; + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void* data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void* data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENQUERIESPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void* data); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERPROC) (GLuint buffer); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYPROC) (GLuint id); +typedef void* (GLAPIENTRY * PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target); + +#define glBeginQuery GLEW_GET_FUN(__glewBeginQuery) +#define glBindBuffer GLEW_GET_FUN(__glewBindBuffer) +#define glBufferData GLEW_GET_FUN(__glewBufferData) +#define glBufferSubData GLEW_GET_FUN(__glewBufferSubData) +#define glDeleteBuffers GLEW_GET_FUN(__glewDeleteBuffers) +#define glDeleteQueries GLEW_GET_FUN(__glewDeleteQueries) +#define glEndQuery GLEW_GET_FUN(__glewEndQuery) +#define glGenBuffers GLEW_GET_FUN(__glewGenBuffers) +#define glGenQueries GLEW_GET_FUN(__glewGenQueries) +#define glGetBufferParameteriv GLEW_GET_FUN(__glewGetBufferParameteriv) +#define glGetBufferPointerv GLEW_GET_FUN(__glewGetBufferPointerv) +#define glGetBufferSubData GLEW_GET_FUN(__glewGetBufferSubData) +#define glGetQueryObjectiv GLEW_GET_FUN(__glewGetQueryObjectiv) +#define glGetQueryObjectuiv GLEW_GET_FUN(__glewGetQueryObjectuiv) +#define glGetQueryiv GLEW_GET_FUN(__glewGetQueryiv) +#define glIsBuffer GLEW_GET_FUN(__glewIsBuffer) +#define glIsQuery GLEW_GET_FUN(__glewIsQuery) +#define glMapBuffer GLEW_GET_FUN(__glewMapBuffer) +#define glUnmapBuffer GLEW_GET_FUN(__glewUnmapBuffer) + +#define GLEW_VERSION_1_5 GLEW_GET_VAR(__GLEW_VERSION_1_5) + +#endif /* GL_VERSION_1_5 */ + +/* ----------------------------- GL_VERSION_2_0 ---------------------------- */ + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 + +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 + +typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (GLAPIENTRY * PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROC) (GLenum type); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei maxLength, GLsizei* length, GLint* size, GLenum* type, GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source); +typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (GLAPIENTRY * PFNGLISSHADERPROC) (GLuint shader); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const* string, const GLint* length); +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); + +#define glAttachShader GLEW_GET_FUN(__glewAttachShader) +#define glBindAttribLocation GLEW_GET_FUN(__glewBindAttribLocation) +#define glBlendEquationSeparate GLEW_GET_FUN(__glewBlendEquationSeparate) +#define glCompileShader GLEW_GET_FUN(__glewCompileShader) +#define glCreateProgram GLEW_GET_FUN(__glewCreateProgram) +#define glCreateShader GLEW_GET_FUN(__glewCreateShader) +#define glDeleteProgram GLEW_GET_FUN(__glewDeleteProgram) +#define glDeleteShader GLEW_GET_FUN(__glewDeleteShader) +#define glDetachShader GLEW_GET_FUN(__glewDetachShader) +#define glDisableVertexAttribArray GLEW_GET_FUN(__glewDisableVertexAttribArray) +#define glDrawBuffers GLEW_GET_FUN(__glewDrawBuffers) +#define glEnableVertexAttribArray GLEW_GET_FUN(__glewEnableVertexAttribArray) +#define glGetActiveAttrib GLEW_GET_FUN(__glewGetActiveAttrib) +#define glGetActiveUniform GLEW_GET_FUN(__glewGetActiveUniform) +#define glGetAttachedShaders GLEW_GET_FUN(__glewGetAttachedShaders) +#define glGetAttribLocation GLEW_GET_FUN(__glewGetAttribLocation) +#define glGetProgramInfoLog GLEW_GET_FUN(__glewGetProgramInfoLog) +#define glGetProgramiv GLEW_GET_FUN(__glewGetProgramiv) +#define glGetShaderInfoLog GLEW_GET_FUN(__glewGetShaderInfoLog) +#define glGetShaderSource GLEW_GET_FUN(__glewGetShaderSource) +#define glGetShaderiv GLEW_GET_FUN(__glewGetShaderiv) +#define glGetUniformLocation GLEW_GET_FUN(__glewGetUniformLocation) +#define glGetUniformfv GLEW_GET_FUN(__glewGetUniformfv) +#define glGetUniformiv GLEW_GET_FUN(__glewGetUniformiv) +#define glGetVertexAttribPointerv GLEW_GET_FUN(__glewGetVertexAttribPointerv) +#define glGetVertexAttribdv GLEW_GET_FUN(__glewGetVertexAttribdv) +#define glGetVertexAttribfv GLEW_GET_FUN(__glewGetVertexAttribfv) +#define glGetVertexAttribiv GLEW_GET_FUN(__glewGetVertexAttribiv) +#define glIsProgram GLEW_GET_FUN(__glewIsProgram) +#define glIsShader GLEW_GET_FUN(__glewIsShader) +#define glLinkProgram GLEW_GET_FUN(__glewLinkProgram) +#define glShaderSource GLEW_GET_FUN(__glewShaderSource) +#define glStencilFuncSeparate GLEW_GET_FUN(__glewStencilFuncSeparate) +#define glStencilMaskSeparate GLEW_GET_FUN(__glewStencilMaskSeparate) +#define glStencilOpSeparate GLEW_GET_FUN(__glewStencilOpSeparate) +#define glUniform1f GLEW_GET_FUN(__glewUniform1f) +#define glUniform1fv GLEW_GET_FUN(__glewUniform1fv) +#define glUniform1i GLEW_GET_FUN(__glewUniform1i) +#define glUniform1iv GLEW_GET_FUN(__glewUniform1iv) +#define glUniform2f GLEW_GET_FUN(__glewUniform2f) +#define glUniform2fv GLEW_GET_FUN(__glewUniform2fv) +#define glUniform2i GLEW_GET_FUN(__glewUniform2i) +#define glUniform2iv GLEW_GET_FUN(__glewUniform2iv) +#define glUniform3f GLEW_GET_FUN(__glewUniform3f) +#define glUniform3fv GLEW_GET_FUN(__glewUniform3fv) +#define glUniform3i GLEW_GET_FUN(__glewUniform3i) +#define glUniform3iv GLEW_GET_FUN(__glewUniform3iv) +#define glUniform4f GLEW_GET_FUN(__glewUniform4f) +#define glUniform4fv GLEW_GET_FUN(__glewUniform4fv) +#define glUniform4i GLEW_GET_FUN(__glewUniform4i) +#define glUniform4iv GLEW_GET_FUN(__glewUniform4iv) +#define glUniformMatrix2fv GLEW_GET_FUN(__glewUniformMatrix2fv) +#define glUniformMatrix3fv GLEW_GET_FUN(__glewUniformMatrix3fv) +#define glUniformMatrix4fv GLEW_GET_FUN(__glewUniformMatrix4fv) +#define glUseProgram GLEW_GET_FUN(__glewUseProgram) +#define glValidateProgram GLEW_GET_FUN(__glewValidateProgram) +#define glVertexAttrib1d GLEW_GET_FUN(__glewVertexAttrib1d) +#define glVertexAttrib1dv GLEW_GET_FUN(__glewVertexAttrib1dv) +#define glVertexAttrib1f GLEW_GET_FUN(__glewVertexAttrib1f) +#define glVertexAttrib1fv GLEW_GET_FUN(__glewVertexAttrib1fv) +#define glVertexAttrib1s GLEW_GET_FUN(__glewVertexAttrib1s) +#define glVertexAttrib1sv GLEW_GET_FUN(__glewVertexAttrib1sv) +#define glVertexAttrib2d GLEW_GET_FUN(__glewVertexAttrib2d) +#define glVertexAttrib2dv GLEW_GET_FUN(__glewVertexAttrib2dv) +#define glVertexAttrib2f GLEW_GET_FUN(__glewVertexAttrib2f) +#define glVertexAttrib2fv GLEW_GET_FUN(__glewVertexAttrib2fv) +#define glVertexAttrib2s GLEW_GET_FUN(__glewVertexAttrib2s) +#define glVertexAttrib2sv GLEW_GET_FUN(__glewVertexAttrib2sv) +#define glVertexAttrib3d GLEW_GET_FUN(__glewVertexAttrib3d) +#define glVertexAttrib3dv GLEW_GET_FUN(__glewVertexAttrib3dv) +#define glVertexAttrib3f GLEW_GET_FUN(__glewVertexAttrib3f) +#define glVertexAttrib3fv GLEW_GET_FUN(__glewVertexAttrib3fv) +#define glVertexAttrib3s GLEW_GET_FUN(__glewVertexAttrib3s) +#define glVertexAttrib3sv GLEW_GET_FUN(__glewVertexAttrib3sv) +#define glVertexAttrib4Nbv GLEW_GET_FUN(__glewVertexAttrib4Nbv) +#define glVertexAttrib4Niv GLEW_GET_FUN(__glewVertexAttrib4Niv) +#define glVertexAttrib4Nsv GLEW_GET_FUN(__glewVertexAttrib4Nsv) +#define glVertexAttrib4Nub GLEW_GET_FUN(__glewVertexAttrib4Nub) +#define glVertexAttrib4Nubv GLEW_GET_FUN(__glewVertexAttrib4Nubv) +#define glVertexAttrib4Nuiv GLEW_GET_FUN(__glewVertexAttrib4Nuiv) +#define glVertexAttrib4Nusv GLEW_GET_FUN(__glewVertexAttrib4Nusv) +#define glVertexAttrib4bv GLEW_GET_FUN(__glewVertexAttrib4bv) +#define glVertexAttrib4d GLEW_GET_FUN(__glewVertexAttrib4d) +#define glVertexAttrib4dv GLEW_GET_FUN(__glewVertexAttrib4dv) +#define glVertexAttrib4f GLEW_GET_FUN(__glewVertexAttrib4f) +#define glVertexAttrib4fv GLEW_GET_FUN(__glewVertexAttrib4fv) +#define glVertexAttrib4iv GLEW_GET_FUN(__glewVertexAttrib4iv) +#define glVertexAttrib4s GLEW_GET_FUN(__glewVertexAttrib4s) +#define glVertexAttrib4sv GLEW_GET_FUN(__glewVertexAttrib4sv) +#define glVertexAttrib4ubv GLEW_GET_FUN(__glewVertexAttrib4ubv) +#define glVertexAttrib4uiv GLEW_GET_FUN(__glewVertexAttrib4uiv) +#define glVertexAttrib4usv GLEW_GET_FUN(__glewVertexAttrib4usv) +#define glVertexAttribPointer GLEW_GET_FUN(__glewVertexAttribPointer) + +#define GLEW_VERSION_2_0 GLEW_GET_VAR(__GLEW_VERSION_2_0) + +#endif /* GL_VERSION_2_0 */ + +/* ----------------------------- GL_VERSION_2_1 ---------------------------- */ + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 + +#define GL_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B + +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); + +#define glUniformMatrix2x3fv GLEW_GET_FUN(__glewUniformMatrix2x3fv) +#define glUniformMatrix2x4fv GLEW_GET_FUN(__glewUniformMatrix2x4fv) +#define glUniformMatrix3x2fv GLEW_GET_FUN(__glewUniformMatrix3x2fv) +#define glUniformMatrix3x4fv GLEW_GET_FUN(__glewUniformMatrix3x4fv) +#define glUniformMatrix4x2fv GLEW_GET_FUN(__glewUniformMatrix4x2fv) +#define glUniformMatrix4x3fv GLEW_GET_FUN(__glewUniformMatrix4x3fv) + +#define GLEW_VERSION_2_1 GLEW_GET_VAR(__GLEW_VERSION_2_1) + +#endif /* GL_VERSION_2_1 */ + +/* ----------------------------- GL_VERSION_3_0 ---------------------------- */ + +#ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 + +#define GL_CLIP_DISTANCE0 GL_CLIP_PLANE0 +#define GL_CLIP_DISTANCE1 GL_CLIP_PLANE1 +#define GL_CLIP_DISTANCE2 GL_CLIP_PLANE2 +#define GL_CLIP_DISTANCE3 GL_CLIP_PLANE3 +#define GL_CLIP_DISTANCE4 GL_CLIP_PLANE4 +#define GL_CLIP_DISTANCE5 GL_CLIP_PLANE5 +#define GL_COMPARE_REF_TO_TEXTURE GL_COMPARE_R_TO_TEXTURE_ARB +#define GL_MAX_CLIP_DISTANCES GL_MAX_CLIP_PLANES +#define GL_MAX_VARYING_COMPONENTS GL_MAX_VARYING_FLOATS +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x0001 +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_DEPTH_BUFFER 0x8223 +#define GL_STENCIL_BUFFER 0x8224 +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_FIXED_ONLY 0x891D +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_ALPHA_INTEGER 0x8D97 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGRA_INTEGER 0x8D9B +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint colorNumber, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawBuffer, GLfloat depth, GLint stencil); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawBuffer, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawBuffer, const GLint* value); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawBuffer, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLCOLORMASKIPROC) (GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GLAPIENTRY * PFNGLDISABLEIPROC) (GLenum cap, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEIPROC) (GLenum cap, GLuint index); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum pname, GLuint index, GLboolean* data); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar* name); +typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLsizei * size, GLenum * type, GLchar * name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum cap, GLuint index); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort* v0); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void*pointer); + +#define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender) +#define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback) +#define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation) +#define glClampColor GLEW_GET_FUN(__glewClampColor) +#define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi) +#define glClearBufferfv GLEW_GET_FUN(__glewClearBufferfv) +#define glClearBufferiv GLEW_GET_FUN(__glewClearBufferiv) +#define glClearBufferuiv GLEW_GET_FUN(__glewClearBufferuiv) +#define glColorMaski GLEW_GET_FUN(__glewColorMaski) +#define glDisablei GLEW_GET_FUN(__glewDisablei) +#define glEnablei GLEW_GET_FUN(__glewEnablei) +#define glEndConditionalRender GLEW_GET_FUN(__glewEndConditionalRender) +#define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback) +#define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v) +#define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation) +#define glGetStringi GLEW_GET_FUN(__glewGetStringi) +#define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv) +#define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv) +#define glGetTransformFeedbackVarying GLEW_GET_FUN(__glewGetTransformFeedbackVarying) +#define glGetUniformuiv GLEW_GET_FUN(__glewGetUniformuiv) +#define glGetVertexAttribIiv GLEW_GET_FUN(__glewGetVertexAttribIiv) +#define glGetVertexAttribIuiv GLEW_GET_FUN(__glewGetVertexAttribIuiv) +#define glIsEnabledi GLEW_GET_FUN(__glewIsEnabledi) +#define glTexParameterIiv GLEW_GET_FUN(__glewTexParameterIiv) +#define glTexParameterIuiv GLEW_GET_FUN(__glewTexParameterIuiv) +#define glTransformFeedbackVaryings GLEW_GET_FUN(__glewTransformFeedbackVaryings) +#define glUniform1ui GLEW_GET_FUN(__glewUniform1ui) +#define glUniform1uiv GLEW_GET_FUN(__glewUniform1uiv) +#define glUniform2ui GLEW_GET_FUN(__glewUniform2ui) +#define glUniform2uiv GLEW_GET_FUN(__glewUniform2uiv) +#define glUniform3ui GLEW_GET_FUN(__glewUniform3ui) +#define glUniform3uiv GLEW_GET_FUN(__glewUniform3uiv) +#define glUniform4ui GLEW_GET_FUN(__glewUniform4ui) +#define glUniform4uiv GLEW_GET_FUN(__glewUniform4uiv) +#define glVertexAttribI1i GLEW_GET_FUN(__glewVertexAttribI1i) +#define glVertexAttribI1iv GLEW_GET_FUN(__glewVertexAttribI1iv) +#define glVertexAttribI1ui GLEW_GET_FUN(__glewVertexAttribI1ui) +#define glVertexAttribI1uiv GLEW_GET_FUN(__glewVertexAttribI1uiv) +#define glVertexAttribI2i GLEW_GET_FUN(__glewVertexAttribI2i) +#define glVertexAttribI2iv GLEW_GET_FUN(__glewVertexAttribI2iv) +#define glVertexAttribI2ui GLEW_GET_FUN(__glewVertexAttribI2ui) +#define glVertexAttribI2uiv GLEW_GET_FUN(__glewVertexAttribI2uiv) +#define glVertexAttribI3i GLEW_GET_FUN(__glewVertexAttribI3i) +#define glVertexAttribI3iv GLEW_GET_FUN(__glewVertexAttribI3iv) +#define glVertexAttribI3ui GLEW_GET_FUN(__glewVertexAttribI3ui) +#define glVertexAttribI3uiv GLEW_GET_FUN(__glewVertexAttribI3uiv) +#define glVertexAttribI4bv GLEW_GET_FUN(__glewVertexAttribI4bv) +#define glVertexAttribI4i GLEW_GET_FUN(__glewVertexAttribI4i) +#define glVertexAttribI4iv GLEW_GET_FUN(__glewVertexAttribI4iv) +#define glVertexAttribI4sv GLEW_GET_FUN(__glewVertexAttribI4sv) +#define glVertexAttribI4ubv GLEW_GET_FUN(__glewVertexAttribI4ubv) +#define glVertexAttribI4ui GLEW_GET_FUN(__glewVertexAttribI4ui) +#define glVertexAttribI4uiv GLEW_GET_FUN(__glewVertexAttribI4uiv) +#define glVertexAttribI4usv GLEW_GET_FUN(__glewVertexAttribI4usv) +#define glVertexAttribIPointer GLEW_GET_FUN(__glewVertexAttribIPointer) + +#define GLEW_VERSION_3_0 GLEW_GET_VAR(__GLEW_VERSION_3_0) + +#endif /* GL_VERSION_3_0 */ + +/* ----------------------------- GL_VERSION_3_1 ---------------------------- */ + +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 + +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalFormat, GLuint buffer); + +#define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced) +#define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced) +#define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex) +#define glTexBuffer GLEW_GET_FUN(__glewTexBuffer) + +#define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1) + +#endif /* GL_VERSION_3_1 */ + +/* ----------------------------- GL_VERSION_3_2 ---------------------------- */ + +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 + +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum value, GLint64 * data); +typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum pname, GLuint index, GLint64 * data); + +#define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture) +#define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v) +#define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v) + +#define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2) + +#endif /* GL_VERSION_3_2 */ + +/* ----------------------------- GL_VERSION_3_3 ---------------------------- */ + +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_RGB10_A2UI 0x906F + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); + +#define glVertexAttribDivisor GLEW_GET_FUN(__glewVertexAttribDivisor) + +#define GLEW_VERSION_3_3 GLEW_GET_VAR(__GLEW_VERSION_3_3) + +#endif /* GL_VERSION_3_3 */ + +/* ----------------------------- GL_VERSION_4_0 ---------------------------- */ + +#ifndef GL_VERSION_4_0 +#define GL_VERSION_4_0 1 + +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value); + +#define glBlendEquationSeparatei GLEW_GET_FUN(__glewBlendEquationSeparatei) +#define glBlendEquationi GLEW_GET_FUN(__glewBlendEquationi) +#define glBlendFuncSeparatei GLEW_GET_FUN(__glewBlendFuncSeparatei) +#define glBlendFunci GLEW_GET_FUN(__glewBlendFunci) +#define glMinSampleShading GLEW_GET_FUN(__glewMinSampleShading) + +#define GLEW_VERSION_4_0 GLEW_GET_VAR(__GLEW_VERSION_4_0) + +#endif /* GL_VERSION_4_0 */ + +/* ----------------------------- GL_VERSION_4_1 ---------------------------- */ + +#ifndef GL_VERSION_4_1 +#define GL_VERSION_4_1 1 + +#define GLEW_VERSION_4_1 GLEW_GET_VAR(__GLEW_VERSION_4_1) + +#endif /* GL_VERSION_4_1 */ + +/* ----------------------------- GL_VERSION_4_2 ---------------------------- */ + +#ifndef GL_VERSION_4_2 +#define GL_VERSION_4_2 1 + +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 + +#define GLEW_VERSION_4_2 GLEW_GET_VAR(__GLEW_VERSION_4_2) + +#endif /* GL_VERSION_4_2 */ + +/* ----------------------------- GL_VERSION_4_3 ---------------------------- */ + +#ifndef GL_VERSION_4_3 +#define GL_VERSION_4_3 1 + +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E + +#define GLEW_VERSION_4_3 GLEW_GET_VAR(__GLEW_VERSION_4_3) + +#endif /* GL_VERSION_4_3 */ + +/* ----------------------------- GL_VERSION_4_4 ---------------------------- */ + +#ifndef GL_VERSION_4_4 +#define GL_VERSION_4_4 1 + +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A + +#define GLEW_VERSION_4_4 GLEW_GET_VAR(__GLEW_VERSION_4_4) + +#endif /* GL_VERSION_4_4 */ + +/* ----------------------------- GL_VERSION_4_5 ---------------------------- */ + +#ifndef GL_VERSION_4_5 +#define GL_VERSION_4_5 1 + +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 + +typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEPROC) (GLenum tex, GLint level, GLenum format, GLenum type, GLsizei bufSize, GLvoid *pixels); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); + +#define glGetGraphicsResetStatus GLEW_GET_FUN(__glewGetGraphicsResetStatus) +#define glGetnCompressedTexImage GLEW_GET_FUN(__glewGetnCompressedTexImage) +#define glGetnTexImage GLEW_GET_FUN(__glewGetnTexImage) +#define glGetnUniformdv GLEW_GET_FUN(__glewGetnUniformdv) + +#define GLEW_VERSION_4_5 GLEW_GET_VAR(__GLEW_VERSION_4_5) + +#endif /* GL_VERSION_4_5 */ + +/* -------------------------- GL_3DFX_multisample -------------------------- */ + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 + +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 + +#define GLEW_3DFX_multisample GLEW_GET_VAR(__GLEW_3DFX_multisample) + +#endif /* GL_3DFX_multisample */ + +/* ---------------------------- GL_3DFX_tbuffer ---------------------------- */ + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 + +typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); + +#define glTbufferMask3DFX GLEW_GET_FUN(__glewTbufferMask3DFX) + +#define GLEW_3DFX_tbuffer GLEW_GET_VAR(__GLEW_3DFX_tbuffer) + +#endif /* GL_3DFX_tbuffer */ + +/* -------------------- GL_3DFX_texture_compression_FXT1 ------------------- */ + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 + +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 + +#define GLEW_3DFX_texture_compression_FXT1 GLEW_GET_VAR(__GLEW_3DFX_texture_compression_FXT1) + +#endif /* GL_3DFX_texture_compression_FXT1 */ + +/* ----------------------- GL_AMD_blend_minmax_factor ---------------------- */ + +#ifndef GL_AMD_blend_minmax_factor +#define GL_AMD_blend_minmax_factor 1 + +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D + +#define GLEW_AMD_blend_minmax_factor GLEW_GET_VAR(__GLEW_AMD_blend_minmax_factor) + +#endif /* GL_AMD_blend_minmax_factor */ + +/* ----------------------- GL_AMD_conservative_depth ----------------------- */ + +#ifndef GL_AMD_conservative_depth +#define GL_AMD_conservative_depth 1 + +#define GLEW_AMD_conservative_depth GLEW_GET_VAR(__GLEW_AMD_conservative_depth) + +#endif /* GL_AMD_conservative_depth */ + +/* -------------------------- GL_AMD_debug_output -------------------------- */ + +#ifndef GL_AMD_debug_output +#define GL_AMD_debug_output 1 + +#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 + +typedef void (GLAPIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, void* userParam); + +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, GLchar* message); + +#define glDebugMessageCallbackAMD GLEW_GET_FUN(__glewDebugMessageCallbackAMD) +#define glDebugMessageEnableAMD GLEW_GET_FUN(__glewDebugMessageEnableAMD) +#define glDebugMessageInsertAMD GLEW_GET_FUN(__glewDebugMessageInsertAMD) +#define glGetDebugMessageLogAMD GLEW_GET_FUN(__glewGetDebugMessageLogAMD) + +#define GLEW_AMD_debug_output GLEW_GET_VAR(__GLEW_AMD_debug_output) + +#endif /* GL_AMD_debug_output */ + +/* ---------------------- GL_AMD_depth_clamp_separate ---------------------- */ + +#ifndef GL_AMD_depth_clamp_separate +#define GL_AMD_depth_clamp_separate 1 + +#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E +#define GL_DEPTH_CLAMP_FAR_AMD 0x901F + +#define GLEW_AMD_depth_clamp_separate GLEW_GET_VAR(__GLEW_AMD_depth_clamp_separate) + +#endif /* GL_AMD_depth_clamp_separate */ + +/* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */ + +#ifndef GL_AMD_draw_buffers_blend +#define GL_AMD_draw_buffers_blend 1 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); + +#define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD) +#define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD) +#define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD) +#define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD) + +#define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend) + +#endif /* GL_AMD_draw_buffers_blend */ + +/* --------------------------- GL_AMD_gcn_shader --------------------------- */ + +#ifndef GL_AMD_gcn_shader +#define GL_AMD_gcn_shader 1 + +#define GLEW_AMD_gcn_shader GLEW_GET_VAR(__GLEW_AMD_gcn_shader) + +#endif /* GL_AMD_gcn_shader */ + +/* ------------------------ GL_AMD_gpu_shader_int64 ------------------------ */ + +#ifndef GL_AMD_gpu_shader_int64 +#define GL_AMD_gpu_shader_int64 1 + +#define GLEW_AMD_gpu_shader_int64 GLEW_GET_VAR(__GLEW_AMD_gpu_shader_int64) + +#endif /* GL_AMD_gpu_shader_int64 */ + +/* ---------------------- GL_AMD_interleaved_elements ---------------------- */ + +#ifndef GL_AMD_interleaved_elements +#define GL_AMD_interleaved_elements 1 + +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_RG8UI 0x8238 +#define GL_RG16UI 0x823A +#define GL_RGBA8UI 0x8D7C +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 + +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); + +#define glVertexAttribParameteriAMD GLEW_GET_FUN(__glewVertexAttribParameteriAMD) + +#define GLEW_AMD_interleaved_elements GLEW_GET_VAR(__GLEW_AMD_interleaved_elements) + +#endif /* GL_AMD_interleaved_elements */ + +/* ----------------------- GL_AMD_multi_draw_indirect ---------------------- */ + +#ifndef GL_AMD_multi_draw_indirect +#define GL_AMD_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); + +#define glMultiDrawArraysIndirectAMD GLEW_GET_FUN(__glewMultiDrawArraysIndirectAMD) +#define glMultiDrawElementsIndirectAMD GLEW_GET_FUN(__glewMultiDrawElementsIndirectAMD) + +#define GLEW_AMD_multi_draw_indirect GLEW_GET_VAR(__GLEW_AMD_multi_draw_indirect) + +#endif /* GL_AMD_multi_draw_indirect */ + +/* ------------------------- GL_AMD_name_gen_delete ------------------------ */ + +#ifndef GL_AMD_name_gen_delete +#define GL_AMD_name_gen_delete 1 + +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_SAMPLER_OBJECT_AMD 0x9155 + +typedef void (GLAPIENTRY * PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint* names); +typedef void (GLAPIENTRY * PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint* names); +typedef GLboolean (GLAPIENTRY * PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); + +#define glDeleteNamesAMD GLEW_GET_FUN(__glewDeleteNamesAMD) +#define glGenNamesAMD GLEW_GET_FUN(__glewGenNamesAMD) +#define glIsNameAMD GLEW_GET_FUN(__glewIsNameAMD) + +#define GLEW_AMD_name_gen_delete GLEW_GET_VAR(__GLEW_AMD_name_gen_delete) + +#endif /* GL_AMD_name_gen_delete */ + +/* ---------------------- GL_AMD_occlusion_query_event --------------------- */ + +#ifndef GL_AMD_occlusion_query_event +#define GL_AMD_occlusion_query_event 1 + +#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 +#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 +#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 +#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 +#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F +#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); + +#define glQueryObjectParameteruiAMD GLEW_GET_FUN(__glewQueryObjectParameteruiAMD) + +#define GLEW_AMD_occlusion_query_event GLEW_GET_VAR(__GLEW_AMD_occlusion_query_event) + +#endif /* GL_AMD_occlusion_query_event */ + +/* ----------------------- GL_AMD_performance_monitor ---------------------- */ + +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 + +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 + +typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); +typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, GLchar *counterString); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, GLchar *groupString); +typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList); + +#define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD) +#define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD) +#define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD) +#define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD) +#define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD) +#define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD) +#define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD) +#define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD) +#define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD) +#define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD) +#define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD) + +#define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor) + +#endif /* GL_AMD_performance_monitor */ + +/* -------------------------- GL_AMD_pinned_memory ------------------------- */ + +#ifndef GL_AMD_pinned_memory +#define GL_AMD_pinned_memory 1 + +#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 + +#define GLEW_AMD_pinned_memory GLEW_GET_VAR(__GLEW_AMD_pinned_memory) + +#endif /* GL_AMD_pinned_memory */ + +/* ----------------------- GL_AMD_query_buffer_object ---------------------- */ + +#ifndef GL_AMD_query_buffer_object +#define GL_AMD_query_buffer_object 1 + +#define GL_QUERY_BUFFER_AMD 0x9192 +#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 +#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 + +#define GLEW_AMD_query_buffer_object GLEW_GET_VAR(__GLEW_AMD_query_buffer_object) + +#endif /* GL_AMD_query_buffer_object */ + +/* ------------------------ GL_AMD_sample_positions ------------------------ */ + +#ifndef GL_AMD_sample_positions +#define GL_AMD_sample_positions 1 + +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F + +typedef void (GLAPIENTRY * PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat* val); + +#define glSetMultisamplefvAMD GLEW_GET_FUN(__glewSetMultisamplefvAMD) + +#define GLEW_AMD_sample_positions GLEW_GET_VAR(__GLEW_AMD_sample_positions) + +#endif /* GL_AMD_sample_positions */ + +/* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */ + +#ifndef GL_AMD_seamless_cubemap_per_texture +#define GL_AMD_seamless_cubemap_per_texture 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB 0x884F + +#define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture) + +#endif /* GL_AMD_seamless_cubemap_per_texture */ + +/* -------------------- GL_AMD_shader_atomic_counter_ops ------------------- */ + +#ifndef GL_AMD_shader_atomic_counter_ops +#define GL_AMD_shader_atomic_counter_ops 1 + +#define GLEW_AMD_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_AMD_shader_atomic_counter_ops) + +#endif /* GL_AMD_shader_atomic_counter_ops */ + +/* ---------------------- GL_AMD_shader_stencil_export --------------------- */ + +#ifndef GL_AMD_shader_stencil_export +#define GL_AMD_shader_stencil_export 1 + +#define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export) + +#endif /* GL_AMD_shader_stencil_export */ + +/* ------------------- GL_AMD_shader_stencil_value_export ------------------ */ + +#ifndef GL_AMD_shader_stencil_value_export +#define GL_AMD_shader_stencil_value_export 1 + +#define GLEW_AMD_shader_stencil_value_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_value_export) + +#endif /* GL_AMD_shader_stencil_value_export */ + +/* ---------------------- GL_AMD_shader_trinary_minmax --------------------- */ + +#ifndef GL_AMD_shader_trinary_minmax +#define GL_AMD_shader_trinary_minmax 1 + +#define GLEW_AMD_shader_trinary_minmax GLEW_GET_VAR(__GLEW_AMD_shader_trinary_minmax) + +#endif /* GL_AMD_shader_trinary_minmax */ + +/* ------------------------- GL_AMD_sparse_texture ------------------------- */ + +#ifndef GL_AMD_sparse_texture +#define GL_AMD_sparse_texture 1 + +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A +#define GL_MIN_SPARSE_LEVEL_AMD 0x919B +#define GL_MIN_LOD_WARNING_AMD 0x919C + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); + +#define glTexStorageSparseAMD GLEW_GET_FUN(__glewTexStorageSparseAMD) +#define glTextureStorageSparseAMD GLEW_GET_FUN(__glewTextureStorageSparseAMD) + +#define GLEW_AMD_sparse_texture GLEW_GET_VAR(__GLEW_AMD_sparse_texture) + +#endif /* GL_AMD_sparse_texture */ + +/* ------------------- GL_AMD_stencil_operation_extended ------------------- */ + +#ifndef GL_AMD_stencil_operation_extended +#define GL_AMD_stencil_operation_extended 1 + +#define GL_SET_AMD 0x874A +#define GL_REPLACE_VALUE_AMD 0x874B +#define GL_STENCIL_OP_VALUE_AMD 0x874C +#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D + +typedef void (GLAPIENTRY * PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); + +#define glStencilOpValueAMD GLEW_GET_FUN(__glewStencilOpValueAMD) + +#define GLEW_AMD_stencil_operation_extended GLEW_GET_VAR(__GLEW_AMD_stencil_operation_extended) + +#endif /* GL_AMD_stencil_operation_extended */ + +/* ------------------------ GL_AMD_texture_texture4 ------------------------ */ + +#ifndef GL_AMD_texture_texture4 +#define GL_AMD_texture_texture4 1 + +#define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4) + +#endif /* GL_AMD_texture_texture4 */ + +/* --------------- GL_AMD_transform_feedback3_lines_triangles -------------- */ + +#ifndef GL_AMD_transform_feedback3_lines_triangles +#define GL_AMD_transform_feedback3_lines_triangles 1 + +#define GLEW_AMD_transform_feedback3_lines_triangles GLEW_GET_VAR(__GLEW_AMD_transform_feedback3_lines_triangles) + +#endif /* GL_AMD_transform_feedback3_lines_triangles */ + +/* ----------------------- GL_AMD_transform_feedback4 ---------------------- */ + +#ifndef GL_AMD_transform_feedback4 +#define GL_AMD_transform_feedback4 1 + +#define GL_STREAM_RASTERIZATION_AMD 0x91A0 + +#define GLEW_AMD_transform_feedback4 GLEW_GET_VAR(__GLEW_AMD_transform_feedback4) + +#endif /* GL_AMD_transform_feedback4 */ + +/* ----------------------- GL_AMD_vertex_shader_layer ---------------------- */ + +#ifndef GL_AMD_vertex_shader_layer +#define GL_AMD_vertex_shader_layer 1 + +#define GLEW_AMD_vertex_shader_layer GLEW_GET_VAR(__GLEW_AMD_vertex_shader_layer) + +#endif /* GL_AMD_vertex_shader_layer */ + +/* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */ + +#ifndef GL_AMD_vertex_shader_tessellator +#define GL_AMD_vertex_shader_tessellator 1 + +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_DISCRETE_AMD 0x9006 +#define GL_CONTINUOUS_AMD 0x9007 + +typedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); +typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); + +#define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD) +#define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD) + +#define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator) + +#endif /* GL_AMD_vertex_shader_tessellator */ + +/* ------------------ GL_AMD_vertex_shader_viewport_index ------------------ */ + +#ifndef GL_AMD_vertex_shader_viewport_index +#define GL_AMD_vertex_shader_viewport_index 1 + +#define GLEW_AMD_vertex_shader_viewport_index GLEW_GET_VAR(__GLEW_AMD_vertex_shader_viewport_index) + +#endif /* GL_AMD_vertex_shader_viewport_index */ + +/* ------------------------- GL_ANGLE_depth_texture ------------------------ */ + +#ifndef GL_ANGLE_depth_texture +#define GL_ANGLE_depth_texture 1 + +#define GLEW_ANGLE_depth_texture GLEW_GET_VAR(__GLEW_ANGLE_depth_texture) + +#endif /* GL_ANGLE_depth_texture */ + +/* ----------------------- GL_ANGLE_framebuffer_blit ----------------------- */ + +#ifndef GL_ANGLE_framebuffer_blit +#define GL_ANGLE_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferANGLE GLEW_GET_FUN(__glewBlitFramebufferANGLE) + +#define GLEW_ANGLE_framebuffer_blit GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_blit) + +#endif /* GL_ANGLE_framebuffer_blit */ + +/* -------------------- GL_ANGLE_framebuffer_multisample ------------------- */ + +#ifndef GL_ANGLE_framebuffer_multisample +#define GL_ANGLE_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 +#define GL_MAX_SAMPLES_ANGLE 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleANGLE GLEW_GET_FUN(__glewRenderbufferStorageMultisampleANGLE) + +#define GLEW_ANGLE_framebuffer_multisample GLEW_GET_VAR(__GLEW_ANGLE_framebuffer_multisample) + +#endif /* GL_ANGLE_framebuffer_multisample */ + +/* ----------------------- GL_ANGLE_instanced_arrays ----------------------- */ + +#ifndef GL_ANGLE_instanced_arrays +#define GL_ANGLE_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); + +#define glDrawArraysInstancedANGLE GLEW_GET_FUN(__glewDrawArraysInstancedANGLE) +#define glDrawElementsInstancedANGLE GLEW_GET_FUN(__glewDrawElementsInstancedANGLE) +#define glVertexAttribDivisorANGLE GLEW_GET_FUN(__glewVertexAttribDivisorANGLE) + +#define GLEW_ANGLE_instanced_arrays GLEW_GET_VAR(__GLEW_ANGLE_instanced_arrays) + +#endif /* GL_ANGLE_instanced_arrays */ + +/* -------------------- GL_ANGLE_pack_reverse_row_order -------------------- */ + +#ifndef GL_ANGLE_pack_reverse_row_order +#define GL_ANGLE_pack_reverse_row_order 1 + +#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 + +#define GLEW_ANGLE_pack_reverse_row_order GLEW_GET_VAR(__GLEW_ANGLE_pack_reverse_row_order) + +#endif /* GL_ANGLE_pack_reverse_row_order */ + +/* ------------------------ GL_ANGLE_program_binary ------------------------ */ + +#ifndef GL_ANGLE_program_binary +#define GL_ANGLE_program_binary 1 + +#define GL_PROGRAM_BINARY_ANGLE 0x93A6 + +#define GLEW_ANGLE_program_binary GLEW_GET_VAR(__GLEW_ANGLE_program_binary) + +#endif /* GL_ANGLE_program_binary */ + +/* ------------------- GL_ANGLE_texture_compression_dxt1 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt1 +#define GL_ANGLE_texture_compression_dxt1 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt1) + +#endif /* GL_ANGLE_texture_compression_dxt1 */ + +/* ------------------- GL_ANGLE_texture_compression_dxt3 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt3 +#define GL_ANGLE_texture_compression_dxt3 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt3 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt3) + +#endif /* GL_ANGLE_texture_compression_dxt3 */ + +/* ------------------- GL_ANGLE_texture_compression_dxt5 ------------------- */ + +#ifndef GL_ANGLE_texture_compression_dxt5 +#define GL_ANGLE_texture_compression_dxt5 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_ANGLE 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_ANGLE 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 + +#define GLEW_ANGLE_texture_compression_dxt5 GLEW_GET_VAR(__GLEW_ANGLE_texture_compression_dxt5) + +#endif /* GL_ANGLE_texture_compression_dxt5 */ + +/* ------------------------- GL_ANGLE_texture_usage ------------------------ */ + +#ifndef GL_ANGLE_texture_usage +#define GL_ANGLE_texture_usage 1 + +#define GL_TEXTURE_USAGE_ANGLE 0x93A2 +#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 + +#define GLEW_ANGLE_texture_usage GLEW_GET_VAR(__GLEW_ANGLE_texture_usage) + +#endif /* GL_ANGLE_texture_usage */ + +/* -------------------------- GL_ANGLE_timer_query ------------------------- */ + +#ifndef GL_ANGLE_timer_query +#define GL_ANGLE_timer_query 1 + +#define GL_QUERY_COUNTER_BITS_ANGLE 0x8864 +#define GL_CURRENT_QUERY_ANGLE 0x8865 +#define GL_QUERY_RESULT_ANGLE 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ANGLE 0x8867 +#define GL_TIME_ELAPSED_ANGLE 0x88BF +#define GL_TIMESTAMP_ANGLE 0x8E28 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYANGLEPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESANGLEPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYANGLEPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENQUERIESANGLEPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VANGLEPROC) (GLuint id, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVANGLEPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VANGLEPROC) (GLuint id, GLenum pname, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVANGLEPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVANGLEPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYANGLEPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERANGLEPROC) (GLuint id, GLenum target); + +#define glBeginQueryANGLE GLEW_GET_FUN(__glewBeginQueryANGLE) +#define glDeleteQueriesANGLE GLEW_GET_FUN(__glewDeleteQueriesANGLE) +#define glEndQueryANGLE GLEW_GET_FUN(__glewEndQueryANGLE) +#define glGenQueriesANGLE GLEW_GET_FUN(__glewGenQueriesANGLE) +#define glGetQueryObjecti64vANGLE GLEW_GET_FUN(__glewGetQueryObjecti64vANGLE) +#define glGetQueryObjectivANGLE GLEW_GET_FUN(__glewGetQueryObjectivANGLE) +#define glGetQueryObjectui64vANGLE GLEW_GET_FUN(__glewGetQueryObjectui64vANGLE) +#define glGetQueryObjectuivANGLE GLEW_GET_FUN(__glewGetQueryObjectuivANGLE) +#define glGetQueryivANGLE GLEW_GET_FUN(__glewGetQueryivANGLE) +#define glIsQueryANGLE GLEW_GET_FUN(__glewIsQueryANGLE) +#define glQueryCounterANGLE GLEW_GET_FUN(__glewQueryCounterANGLE) + +#define GLEW_ANGLE_timer_query GLEW_GET_VAR(__GLEW_ANGLE_timer_query) + +#endif /* GL_ANGLE_timer_query */ + +/* ------------------- GL_ANGLE_translated_shader_source ------------------- */ + +#ifndef GL_ANGLE_translated_shader_source +#define GL_ANGLE_translated_shader_source 1 + +#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 + +typedef void (GLAPIENTRY * PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); + +#define glGetTranslatedShaderSourceANGLE GLEW_GET_FUN(__glewGetTranslatedShaderSourceANGLE) + +#define GLEW_ANGLE_translated_shader_source GLEW_GET_VAR(__GLEW_ANGLE_translated_shader_source) + +#endif /* GL_ANGLE_translated_shader_source */ + +/* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */ + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_APPLE_aux_depth_stencil 1 + +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 + +#define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil) + +#endif /* GL_APPLE_aux_depth_stencil */ + +/* ------------------------ GL_APPLE_client_storage ------------------------ */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 + +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 + +#define GLEW_APPLE_client_storage GLEW_GET_VAR(__GLEW_APPLE_client_storage) + +#endif /* GL_APPLE_client_storage */ + +/* ------------------------- GL_APPLE_element_array ------------------------ */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 + +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint* first, const GLsizei *count, GLsizei primcount); + +#define glDrawElementArrayAPPLE GLEW_GET_FUN(__glewDrawElementArrayAPPLE) +#define glDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewDrawRangeElementArrayAPPLE) +#define glElementPointerAPPLE GLEW_GET_FUN(__glewElementPointerAPPLE) +#define glMultiDrawElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawElementArrayAPPLE) +#define glMultiDrawRangeElementArrayAPPLE GLEW_GET_FUN(__glewMultiDrawRangeElementArrayAPPLE) + +#define GLEW_APPLE_element_array GLEW_GET_VAR(__GLEW_APPLE_element_array) + +#endif /* GL_APPLE_element_array */ + +/* ----------------------------- GL_APPLE_fence ---------------------------- */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 + +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +typedef void (GLAPIENTRY * PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint* fences); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (GLAPIENTRY * PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); + +#define glDeleteFencesAPPLE GLEW_GET_FUN(__glewDeleteFencesAPPLE) +#define glFinishFenceAPPLE GLEW_GET_FUN(__glewFinishFenceAPPLE) +#define glFinishObjectAPPLE GLEW_GET_FUN(__glewFinishObjectAPPLE) +#define glGenFencesAPPLE GLEW_GET_FUN(__glewGenFencesAPPLE) +#define glIsFenceAPPLE GLEW_GET_FUN(__glewIsFenceAPPLE) +#define glSetFenceAPPLE GLEW_GET_FUN(__glewSetFenceAPPLE) +#define glTestFenceAPPLE GLEW_GET_FUN(__glewTestFenceAPPLE) +#define glTestObjectAPPLE GLEW_GET_FUN(__glewTestObjectAPPLE) + +#define GLEW_APPLE_fence GLEW_GET_VAR(__GLEW_APPLE_fence) + +#endif /* GL_APPLE_fence */ + +/* ------------------------- GL_APPLE_float_pixels ------------------------- */ + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 + +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F + +#define GLEW_APPLE_float_pixels GLEW_GET_VAR(__GLEW_APPLE_float_pixels) + +#endif /* GL_APPLE_float_pixels */ + +/* ---------------------- GL_APPLE_flush_buffer_range ---------------------- */ + +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 + +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 + +typedef void (GLAPIENTRY * PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); + +#define glBufferParameteriAPPLE GLEW_GET_FUN(__glewBufferParameteriAPPLE) +#define glFlushMappedBufferRangeAPPLE GLEW_GET_FUN(__glewFlushMappedBufferRangeAPPLE) + +#define GLEW_APPLE_flush_buffer_range GLEW_GET_VAR(__GLEW_APPLE_flush_buffer_range) + +#endif /* GL_APPLE_flush_buffer_range */ + +/* ----------------------- GL_APPLE_object_purgeable ----------------------- */ + +#ifndef GL_APPLE_object_purgeable +#define GL_APPLE_object_purgeable 1 + +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_RETAINED_APPLE 0x8A1B +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_PURGEABLE_APPLE 0x8A1D + +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params); +typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); + +#define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE) +#define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE) +#define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE) + +#define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable) + +#endif /* GL_APPLE_object_purgeable */ + +/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */ + +#ifndef GL_APPLE_pixel_buffer +#define GL_APPLE_pixel_buffer 1 + +#define GL_MIN_PBUFFER_VIEWPORT_DIMS_APPLE 0x8A10 + +#define GLEW_APPLE_pixel_buffer GLEW_GET_VAR(__GLEW_APPLE_pixel_buffer) + +#endif /* GL_APPLE_pixel_buffer */ + +/* ---------------------------- GL_APPLE_rgb_422 --------------------------- */ + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 + +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_RGB_422_APPLE 0x8A1F +#define GL_RGB_RAW_422_APPLE 0x8A51 + +#define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422) + +#endif /* GL_APPLE_rgb_422 */ + +/* --------------------------- GL_APPLE_row_bytes -------------------------- */ + +#ifndef GL_APPLE_row_bytes +#define GL_APPLE_row_bytes 1 + +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 + +#define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes) + +#endif /* GL_APPLE_row_bytes */ + +/* ------------------------ GL_APPLE_specular_vector ----------------------- */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 + +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 + +#define GLEW_APPLE_specular_vector GLEW_GET_VAR(__GLEW_APPLE_specular_vector) + +#endif /* GL_APPLE_specular_vector */ + +/* ------------------------- GL_APPLE_texture_range ------------------------ */ + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 + +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); +typedef void (GLAPIENTRY * PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, void *pointer); + +#define glGetTexParameterPointervAPPLE GLEW_GET_FUN(__glewGetTexParameterPointervAPPLE) +#define glTextureRangeAPPLE GLEW_GET_FUN(__glewTextureRangeAPPLE) + +#define GLEW_APPLE_texture_range GLEW_GET_VAR(__GLEW_APPLE_texture_range) + +#endif /* GL_APPLE_texture_range */ + +/* ------------------------ GL_APPLE_transform_hint ------------------------ */ + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 + +#define GL_TRANSFORM_HINT_APPLE 0x85B1 + +#define GLEW_APPLE_transform_hint GLEW_GET_VAR(__GLEW_APPLE_transform_hint) + +#endif /* GL_APPLE_transform_hint */ + +/* ---------------------- GL_APPLE_vertex_array_object --------------------- */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 + +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); + +#define glBindVertexArrayAPPLE GLEW_GET_FUN(__glewBindVertexArrayAPPLE) +#define glDeleteVertexArraysAPPLE GLEW_GET_FUN(__glewDeleteVertexArraysAPPLE) +#define glGenVertexArraysAPPLE GLEW_GET_FUN(__glewGenVertexArraysAPPLE) +#define glIsVertexArrayAPPLE GLEW_GET_FUN(__glewIsVertexArrayAPPLE) + +#define GLEW_APPLE_vertex_array_object GLEW_GET_VAR(__GLEW_APPLE_vertex_array_object) + +#endif /* GL_APPLE_vertex_array_object */ + +/* ---------------------- GL_APPLE_vertex_array_range ---------------------- */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CLIENT_APPLE 0x85B4 +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); + +#define glFlushVertexArrayRangeAPPLE GLEW_GET_FUN(__glewFlushVertexArrayRangeAPPLE) +#define glVertexArrayParameteriAPPLE GLEW_GET_FUN(__glewVertexArrayParameteriAPPLE) +#define glVertexArrayRangeAPPLE GLEW_GET_FUN(__glewVertexArrayRangeAPPLE) + +#define GLEW_APPLE_vertex_array_range GLEW_GET_VAR(__GLEW_APPLE_vertex_array_range) + +#endif /* GL_APPLE_vertex_array_range */ + +/* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */ + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_APPLE_vertex_program_evaluators 1 + +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 + +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points); +typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points); + +#define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE) +#define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE) +#define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE) +#define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE) +#define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE) +#define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE) +#define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE) + +#define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators) + +#endif /* GL_APPLE_vertex_program_evaluators */ + +/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 + +#define GL_YCBCR_422_APPLE 0x85B9 + +#define GLEW_APPLE_ycbcr_422 GLEW_GET_VAR(__GLEW_APPLE_ycbcr_422) + +#endif /* GL_APPLE_ycbcr_422 */ + +/* ------------------------ GL_ARB_ES2_compatibility ----------------------- */ + +#ifndef GL_ARB_ES2_compatibility +#define GL_ARB_ES2_compatibility 1 + +#define GL_FIXED 0x140C +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_RGB565 0x8D62 +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD + +typedef int GLfixed; + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f); +typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision); +typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const void*binary, GLsizei length); + +#define glClearDepthf GLEW_GET_FUN(__glewClearDepthf) +#define glDepthRangef GLEW_GET_FUN(__glewDepthRangef) +#define glGetShaderPrecisionFormat GLEW_GET_FUN(__glewGetShaderPrecisionFormat) +#define glReleaseShaderCompiler GLEW_GET_FUN(__glewReleaseShaderCompiler) +#define glShaderBinary GLEW_GET_FUN(__glewShaderBinary) + +#define GLEW_ARB_ES2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES2_compatibility) + +#endif /* GL_ARB_ES2_compatibility */ + +/* ----------------------- GL_ARB_ES3_1_compatibility ---------------------- */ + +#ifndef GL_ARB_ES3_1_compatibility +#define GL_ARB_ES3_1_compatibility 1 + +typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); + +#define glMemoryBarrierByRegion GLEW_GET_FUN(__glewMemoryBarrierByRegion) + +#define GLEW_ARB_ES3_1_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_1_compatibility) + +#endif /* GL_ARB_ES3_1_compatibility */ + +/* ----------------------- GL_ARB_ES3_2_compatibility ---------------------- */ + +#ifndef GL_ARB_ES3_2_compatibility +#define GL_ARB_ES3_2_compatibility 1 + +#define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE +#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 +#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 + +typedef void (GLAPIENTRY * PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); + +#define glPrimitiveBoundingBoxARB GLEW_GET_FUN(__glewPrimitiveBoundingBoxARB) + +#define GLEW_ARB_ES3_2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_2_compatibility) + +#endif /* GL_ARB_ES3_2_compatibility */ + +/* ------------------------ GL_ARB_ES3_compatibility ----------------------- */ + +#ifndef GL_ARB_ES3_compatibility +#define GL_ARB_ES3_compatibility 1 + +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 + +#define GLEW_ARB_ES3_compatibility GLEW_GET_VAR(__GLEW_ARB_ES3_compatibility) + +#endif /* GL_ARB_ES3_compatibility */ + +/* ------------------------ GL_ARB_arrays_of_arrays ------------------------ */ + +#ifndef GL_ARB_arrays_of_arrays +#define GL_ARB_arrays_of_arrays 1 + +#define GLEW_ARB_arrays_of_arrays GLEW_GET_VAR(__GLEW_ARB_arrays_of_arrays) + +#endif /* GL_ARB_arrays_of_arrays */ + +/* -------------------------- GL_ARB_base_instance ------------------------- */ + +#ifndef GL_ARB_base_instance +#define GL_ARB_base_instance 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLuint baseinstance); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex, GLuint baseinstance); + +#define glDrawArraysInstancedBaseInstance GLEW_GET_FUN(__glewDrawArraysInstancedBaseInstance) +#define glDrawElementsInstancedBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseInstance) +#define glDrawElementsInstancedBaseVertexBaseInstance GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertexBaseInstance) + +#define GLEW_ARB_base_instance GLEW_GET_VAR(__GLEW_ARB_base_instance) + +#endif /* GL_ARB_base_instance */ + +/* ------------------------ GL_ARB_bindless_texture ------------------------ */ + +#ifndef GL_ARB_bindless_texture +#define GL_ARB_bindless_texture 1 + +#define GL_UNSIGNED_INT64_ARB 0x140F + +typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT* params); +typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT* v); + +#define glGetImageHandleARB GLEW_GET_FUN(__glewGetImageHandleARB) +#define glGetTextureHandleARB GLEW_GET_FUN(__glewGetTextureHandleARB) +#define glGetTextureSamplerHandleARB GLEW_GET_FUN(__glewGetTextureSamplerHandleARB) +#define glGetVertexAttribLui64vARB GLEW_GET_FUN(__glewGetVertexAttribLui64vARB) +#define glIsImageHandleResidentARB GLEW_GET_FUN(__glewIsImageHandleResidentARB) +#define glIsTextureHandleResidentARB GLEW_GET_FUN(__glewIsTextureHandleResidentARB) +#define glMakeImageHandleNonResidentARB GLEW_GET_FUN(__glewMakeImageHandleNonResidentARB) +#define glMakeImageHandleResidentARB GLEW_GET_FUN(__glewMakeImageHandleResidentARB) +#define glMakeTextureHandleNonResidentARB GLEW_GET_FUN(__glewMakeTextureHandleNonResidentARB) +#define glMakeTextureHandleResidentARB GLEW_GET_FUN(__glewMakeTextureHandleResidentARB) +#define glProgramUniformHandleui64ARB GLEW_GET_FUN(__glewProgramUniformHandleui64ARB) +#define glProgramUniformHandleui64vARB GLEW_GET_FUN(__glewProgramUniformHandleui64vARB) +#define glUniformHandleui64ARB GLEW_GET_FUN(__glewUniformHandleui64ARB) +#define glUniformHandleui64vARB GLEW_GET_FUN(__glewUniformHandleui64vARB) +#define glVertexAttribL1ui64ARB GLEW_GET_FUN(__glewVertexAttribL1ui64ARB) +#define glVertexAttribL1ui64vARB GLEW_GET_FUN(__glewVertexAttribL1ui64vARB) + +#define GLEW_ARB_bindless_texture GLEW_GET_VAR(__GLEW_ARB_bindless_texture) + +#endif /* GL_ARB_bindless_texture */ + +/* ----------------------- GL_ARB_blend_func_extended ---------------------- */ + +#ifndef GL_ARB_blend_func_extended +#define GL_ARB_blend_func_extended 1 + +#define GL_SRC1_COLOR 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar * name); + +#define glBindFragDataLocationIndexed GLEW_GET_FUN(__glewBindFragDataLocationIndexed) +#define glGetFragDataIndex GLEW_GET_FUN(__glewGetFragDataIndex) + +#define GLEW_ARB_blend_func_extended GLEW_GET_VAR(__GLEW_ARB_blend_func_extended) + +#endif /* GL_ARB_blend_func_extended */ + +/* ------------------------- GL_ARB_buffer_storage ------------------------- */ + +#ifndef GL_ARB_buffer_storage +#define GL_ARB_buffer_storage 1 + +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_PERSISTENT_BIT 0x00000040 +#define GL_MAP_COHERENT_BIT 0x00000080 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_STORAGE_FLAGS 0x8220 + +typedef void (GLAPIENTRY * PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); + +#define glBufferStorage GLEW_GET_FUN(__glewBufferStorage) +#define glNamedBufferStorageEXT GLEW_GET_FUN(__glewNamedBufferStorageEXT) + +#define GLEW_ARB_buffer_storage GLEW_GET_VAR(__GLEW_ARB_buffer_storage) + +#endif /* GL_ARB_buffer_storage */ + +/* ---------------------------- GL_ARB_cl_event ---------------------------- */ + +#ifndef GL_ARB_cl_event +#define GL_ARB_cl_event 1 + +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 + +typedef struct _cl_context *cl_context; +typedef struct _cl_event *cl_event; + +typedef GLsync (GLAPIENTRY * PFNGLCREATESYNCFROMCLEVENTARBPROC) (cl_context context, cl_event event, GLbitfield flags); + +#define glCreateSyncFromCLeventARB GLEW_GET_FUN(__glewCreateSyncFromCLeventARB) + +#define GLEW_ARB_cl_event GLEW_GET_VAR(__GLEW_ARB_cl_event) + +#endif /* GL_ARB_cl_event */ + +/* ----------------------- GL_ARB_clear_buffer_object ---------------------- */ + +#ifndef GL_ARB_clear_buffer_object +#define GL_ARB_clear_buffer_object 1 + +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); + +#define glClearBufferData GLEW_GET_FUN(__glewClearBufferData) +#define glClearBufferSubData GLEW_GET_FUN(__glewClearBufferSubData) +#define glClearNamedBufferDataEXT GLEW_GET_FUN(__glewClearNamedBufferDataEXT) +#define glClearNamedBufferSubDataEXT GLEW_GET_FUN(__glewClearNamedBufferSubDataEXT) + +#define GLEW_ARB_clear_buffer_object GLEW_GET_VAR(__GLEW_ARB_clear_buffer_object) + +#endif /* GL_ARB_clear_buffer_object */ + +/* -------------------------- GL_ARB_clear_texture ------------------------- */ + +#ifndef GL_ARB_clear_texture +#define GL_ARB_clear_texture 1 + +#define GL_CLEAR_TEXTURE 0x9365 + +typedef void (GLAPIENTRY * PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); + +#define glClearTexImage GLEW_GET_FUN(__glewClearTexImage) +#define glClearTexSubImage GLEW_GET_FUN(__glewClearTexSubImage) + +#define GLEW_ARB_clear_texture GLEW_GET_VAR(__GLEW_ARB_clear_texture) + +#endif /* GL_ARB_clear_texture */ + +/* -------------------------- GL_ARB_clip_control -------------------------- */ + +#ifndef GL_ARB_clip_control +#define GL_ARB_clip_control 1 + +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_CLIP_ORIGIN 0x935C +#define GL_CLIP_DEPTH_MODE 0x935D +#define GL_NEGATIVE_ONE_TO_ONE 0x935E +#define GL_ZERO_TO_ONE 0x935F + +typedef void (GLAPIENTRY * PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); + +#define glClipControl GLEW_GET_FUN(__glewClipControl) + +#define GLEW_ARB_clip_control GLEW_GET_VAR(__GLEW_ARB_clip_control) + +#endif /* GL_ARB_clip_control */ + +/* ----------------------- GL_ARB_color_buffer_float ----------------------- */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 + +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D + +typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); + +#define glClampColorARB GLEW_GET_FUN(__glewClampColorARB) + +#define GLEW_ARB_color_buffer_float GLEW_GET_VAR(__GLEW_ARB_color_buffer_float) + +#endif /* GL_ARB_color_buffer_float */ + +/* -------------------------- GL_ARB_compatibility ------------------------- */ + +#ifndef GL_ARB_compatibility +#define GL_ARB_compatibility 1 + +#define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility) + +#endif /* GL_ARB_compatibility */ + +/* ---------------- GL_ARB_compressed_texture_pixel_storage ---------------- */ + +#ifndef GL_ARB_compressed_texture_pixel_storage +#define GL_ARB_compressed_texture_pixel_storage 1 + +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E + +#define GLEW_ARB_compressed_texture_pixel_storage GLEW_GET_VAR(__GLEW_ARB_compressed_texture_pixel_storage) + +#endif /* GL_ARB_compressed_texture_pixel_storage */ + +/* ------------------------- GL_ARB_compute_shader ------------------------- */ + +#ifndef GL_ARB_compute_shader +#define GL_ARB_compute_shader 1 + +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF + +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); + +#define glDispatchCompute GLEW_GET_FUN(__glewDispatchCompute) +#define glDispatchComputeIndirect GLEW_GET_FUN(__glewDispatchComputeIndirect) + +#define GLEW_ARB_compute_shader GLEW_GET_VAR(__GLEW_ARB_compute_shader) + +#endif /* GL_ARB_compute_shader */ + +/* ------------------- GL_ARB_compute_variable_group_size ------------------ */ + +#ifndef GL_ARB_compute_variable_group_size +#define GL_ARB_compute_variable_group_size 1 + +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 + +typedef void (GLAPIENTRY * PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); + +#define glDispatchComputeGroupSizeARB GLEW_GET_FUN(__glewDispatchComputeGroupSizeARB) + +#define GLEW_ARB_compute_variable_group_size GLEW_GET_VAR(__GLEW_ARB_compute_variable_group_size) + +#endif /* GL_ARB_compute_variable_group_size */ + +/* ------------------- GL_ARB_conditional_render_inverted ------------------ */ + +#ifndef GL_ARB_conditional_render_inverted +#define GL_ARB_conditional_render_inverted 1 + +#define GL_QUERY_WAIT_INVERTED 0x8E17 +#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 +#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 +#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A + +#define GLEW_ARB_conditional_render_inverted GLEW_GET_VAR(__GLEW_ARB_conditional_render_inverted) + +#endif /* GL_ARB_conditional_render_inverted */ + +/* ----------------------- GL_ARB_conservative_depth ----------------------- */ + +#ifndef GL_ARB_conservative_depth +#define GL_ARB_conservative_depth 1 + +#define GLEW_ARB_conservative_depth GLEW_GET_VAR(__GLEW_ARB_conservative_depth) + +#endif /* GL_ARB_conservative_depth */ + +/* --------------------------- GL_ARB_copy_buffer -------------------------- */ + +#ifndef GL_ARB_copy_buffer +#define GL_ARB_copy_buffer 1 + +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 + +typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size); + +#define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData) + +#define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer) + +#endif /* GL_ARB_copy_buffer */ + +/* --------------------------- GL_ARB_copy_image --------------------------- */ + +#ifndef GL_ARB_copy_image +#define GL_ARB_copy_image 1 + +typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); + +#define glCopyImageSubData GLEW_GET_FUN(__glewCopyImageSubData) + +#define GLEW_ARB_copy_image GLEW_GET_VAR(__GLEW_ARB_copy_image) + +#endif /* GL_ARB_copy_image */ + +/* -------------------------- GL_ARB_cull_distance ------------------------- */ + +#ifndef GL_ARB_cull_distance +#define GL_ARB_cull_distance 1 + +#define GL_MAX_CULL_DISTANCES 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA + +#define GLEW_ARB_cull_distance GLEW_GET_VAR(__GLEW_ARB_cull_distance) + +#endif /* GL_ARB_cull_distance */ + +/* -------------------------- GL_ARB_debug_output -------------------------- */ + +#ifndef GL_ARB_debug_output +#define GL_ARB_debug_output 1 + +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 + +typedef void (GLAPIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); + +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); + +#define glDebugMessageCallbackARB GLEW_GET_FUN(__glewDebugMessageCallbackARB) +#define glDebugMessageControlARB GLEW_GET_FUN(__glewDebugMessageControlARB) +#define glDebugMessageInsertARB GLEW_GET_FUN(__glewDebugMessageInsertARB) +#define glGetDebugMessageLogARB GLEW_GET_FUN(__glewGetDebugMessageLogARB) + +#define GLEW_ARB_debug_output GLEW_GET_VAR(__GLEW_ARB_debug_output) + +#endif /* GL_ARB_debug_output */ + +/* ----------------------- GL_ARB_depth_buffer_float ----------------------- */ + +#ifndef GL_ARB_depth_buffer_float +#define GL_ARB_depth_buffer_float 1 + +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD + +#define GLEW_ARB_depth_buffer_float GLEW_GET_VAR(__GLEW_ARB_depth_buffer_float) + +#endif /* GL_ARB_depth_buffer_float */ + +/* --------------------------- GL_ARB_depth_clamp -------------------------- */ + +#ifndef GL_ARB_depth_clamp +#define GL_ARB_depth_clamp 1 + +#define GL_DEPTH_CLAMP 0x864F + +#define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp) + +#endif /* GL_ARB_depth_clamp */ + +/* -------------------------- GL_ARB_depth_texture ------------------------- */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B + +#define GLEW_ARB_depth_texture GLEW_GET_VAR(__GLEW_ARB_depth_texture) + +#endif /* GL_ARB_depth_texture */ + +/* ----------------------- GL_ARB_derivative_control ----------------------- */ + +#ifndef GL_ARB_derivative_control +#define GL_ARB_derivative_control 1 + +#define GLEW_ARB_derivative_control GLEW_GET_VAR(__GLEW_ARB_derivative_control) + +#endif /* GL_ARB_derivative_control */ + +/* ----------------------- GL_ARB_direct_state_access ---------------------- */ + +#ifndef GL_ARB_direct_state_access +#define GL_ARB_direct_state_access 1 + +#define GL_TEXTURE_TARGET 0x1006 +#define GL_QUERY_TARGET 0x82EA + +typedef void (GLAPIENTRY * PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); +typedef void (GLAPIENTRY * PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLfloat depth, GLint stencil); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint* value); +typedef void (GLAPIENTRY * PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); +typedef void (GLAPIENTRY * PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint* textures); +typedef void (GLAPIENTRY * PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id,GLuint buffer,GLenum pname,GLintptr offset); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64* param); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments); +typedef void (GLAPIENTRY * PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat* param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint* param); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); + +#define glBindTextureUnit GLEW_GET_FUN(__glewBindTextureUnit) +#define glBlitNamedFramebuffer GLEW_GET_FUN(__glewBlitNamedFramebuffer) +#define glCheckNamedFramebufferStatus GLEW_GET_FUN(__glewCheckNamedFramebufferStatus) +#define glClearNamedBufferData GLEW_GET_FUN(__glewClearNamedBufferData) +#define glClearNamedBufferSubData GLEW_GET_FUN(__glewClearNamedBufferSubData) +#define glClearNamedFramebufferfi GLEW_GET_FUN(__glewClearNamedFramebufferfi) +#define glClearNamedFramebufferfv GLEW_GET_FUN(__glewClearNamedFramebufferfv) +#define glClearNamedFramebufferiv GLEW_GET_FUN(__glewClearNamedFramebufferiv) +#define glClearNamedFramebufferuiv GLEW_GET_FUN(__glewClearNamedFramebufferuiv) +#define glCompressedTextureSubImage1D GLEW_GET_FUN(__glewCompressedTextureSubImage1D) +#define glCompressedTextureSubImage2D GLEW_GET_FUN(__glewCompressedTextureSubImage2D) +#define glCompressedTextureSubImage3D GLEW_GET_FUN(__glewCompressedTextureSubImage3D) +#define glCopyNamedBufferSubData GLEW_GET_FUN(__glewCopyNamedBufferSubData) +#define glCopyTextureSubImage1D GLEW_GET_FUN(__glewCopyTextureSubImage1D) +#define glCopyTextureSubImage2D GLEW_GET_FUN(__glewCopyTextureSubImage2D) +#define glCopyTextureSubImage3D GLEW_GET_FUN(__glewCopyTextureSubImage3D) +#define glCreateBuffers GLEW_GET_FUN(__glewCreateBuffers) +#define glCreateFramebuffers GLEW_GET_FUN(__glewCreateFramebuffers) +#define glCreateProgramPipelines GLEW_GET_FUN(__glewCreateProgramPipelines) +#define glCreateQueries GLEW_GET_FUN(__glewCreateQueries) +#define glCreateRenderbuffers GLEW_GET_FUN(__glewCreateRenderbuffers) +#define glCreateSamplers GLEW_GET_FUN(__glewCreateSamplers) +#define glCreateTextures GLEW_GET_FUN(__glewCreateTextures) +#define glCreateTransformFeedbacks GLEW_GET_FUN(__glewCreateTransformFeedbacks) +#define glCreateVertexArrays GLEW_GET_FUN(__glewCreateVertexArrays) +#define glDisableVertexArrayAttrib GLEW_GET_FUN(__glewDisableVertexArrayAttrib) +#define glEnableVertexArrayAttrib GLEW_GET_FUN(__glewEnableVertexArrayAttrib) +#define glFlushMappedNamedBufferRange GLEW_GET_FUN(__glewFlushMappedNamedBufferRange) +#define glGenerateTextureMipmap GLEW_GET_FUN(__glewGenerateTextureMipmap) +#define glGetCompressedTextureImage GLEW_GET_FUN(__glewGetCompressedTextureImage) +#define glGetNamedBufferParameteri64v GLEW_GET_FUN(__glewGetNamedBufferParameteri64v) +#define glGetNamedBufferParameteriv GLEW_GET_FUN(__glewGetNamedBufferParameteriv) +#define glGetNamedBufferPointerv GLEW_GET_FUN(__glewGetNamedBufferPointerv) +#define glGetNamedBufferSubData GLEW_GET_FUN(__glewGetNamedBufferSubData) +#define glGetNamedFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameteriv) +#define glGetNamedFramebufferParameteriv GLEW_GET_FUN(__glewGetNamedFramebufferParameteriv) +#define glGetNamedRenderbufferParameteriv GLEW_GET_FUN(__glewGetNamedRenderbufferParameteriv) +#define glGetQueryBufferObjecti64v GLEW_GET_FUN(__glewGetQueryBufferObjecti64v) +#define glGetQueryBufferObjectiv GLEW_GET_FUN(__glewGetQueryBufferObjectiv) +#define glGetQueryBufferObjectui64v GLEW_GET_FUN(__glewGetQueryBufferObjectui64v) +#define glGetQueryBufferObjectuiv GLEW_GET_FUN(__glewGetQueryBufferObjectuiv) +#define glGetTextureImage GLEW_GET_FUN(__glewGetTextureImage) +#define glGetTextureLevelParameterfv GLEW_GET_FUN(__glewGetTextureLevelParameterfv) +#define glGetTextureLevelParameteriv GLEW_GET_FUN(__glewGetTextureLevelParameteriv) +#define glGetTextureParameterIiv GLEW_GET_FUN(__glewGetTextureParameterIiv) +#define glGetTextureParameterIuiv GLEW_GET_FUN(__glewGetTextureParameterIuiv) +#define glGetTextureParameterfv GLEW_GET_FUN(__glewGetTextureParameterfv) +#define glGetTextureParameteriv GLEW_GET_FUN(__glewGetTextureParameteriv) +#define glGetTransformFeedbacki64_v GLEW_GET_FUN(__glewGetTransformFeedbacki64_v) +#define glGetTransformFeedbacki_v GLEW_GET_FUN(__glewGetTransformFeedbacki_v) +#define glGetTransformFeedbackiv GLEW_GET_FUN(__glewGetTransformFeedbackiv) +#define glGetVertexArrayIndexed64iv GLEW_GET_FUN(__glewGetVertexArrayIndexed64iv) +#define glGetVertexArrayIndexediv GLEW_GET_FUN(__glewGetVertexArrayIndexediv) +#define glGetVertexArrayiv GLEW_GET_FUN(__glewGetVertexArrayiv) +#define glInvalidateNamedFramebufferData GLEW_GET_FUN(__glewInvalidateNamedFramebufferData) +#define glInvalidateNamedFramebufferSubData GLEW_GET_FUN(__glewInvalidateNamedFramebufferSubData) +#define glMapNamedBuffer GLEW_GET_FUN(__glewMapNamedBuffer) +#define glMapNamedBufferRange GLEW_GET_FUN(__glewMapNamedBufferRange) +#define glNamedBufferData GLEW_GET_FUN(__glewNamedBufferData) +#define glNamedBufferStorage GLEW_GET_FUN(__glewNamedBufferStorage) +#define glNamedBufferSubData GLEW_GET_FUN(__glewNamedBufferSubData) +#define glNamedFramebufferDrawBuffer GLEW_GET_FUN(__glewNamedFramebufferDrawBuffer) +#define glNamedFramebufferDrawBuffers GLEW_GET_FUN(__glewNamedFramebufferDrawBuffers) +#define glNamedFramebufferParameteri GLEW_GET_FUN(__glewNamedFramebufferParameteri) +#define glNamedFramebufferReadBuffer GLEW_GET_FUN(__glewNamedFramebufferReadBuffer) +#define glNamedFramebufferRenderbuffer GLEW_GET_FUN(__glewNamedFramebufferRenderbuffer) +#define glNamedFramebufferTexture GLEW_GET_FUN(__glewNamedFramebufferTexture) +#define glNamedFramebufferTextureLayer GLEW_GET_FUN(__glewNamedFramebufferTextureLayer) +#define glNamedRenderbufferStorage GLEW_GET_FUN(__glewNamedRenderbufferStorage) +#define glNamedRenderbufferStorageMultisample GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisample) +#define glTextureBuffer GLEW_GET_FUN(__glewTextureBuffer) +#define glTextureBufferRange GLEW_GET_FUN(__glewTextureBufferRange) +#define glTextureParameterIiv GLEW_GET_FUN(__glewTextureParameterIiv) +#define glTextureParameterIuiv GLEW_GET_FUN(__glewTextureParameterIuiv) +#define glTextureParameterf GLEW_GET_FUN(__glewTextureParameterf) +#define glTextureParameterfv GLEW_GET_FUN(__glewTextureParameterfv) +#define glTextureParameteri GLEW_GET_FUN(__glewTextureParameteri) +#define glTextureParameteriv GLEW_GET_FUN(__glewTextureParameteriv) +#define glTextureStorage1D GLEW_GET_FUN(__glewTextureStorage1D) +#define glTextureStorage2D GLEW_GET_FUN(__glewTextureStorage2D) +#define glTextureStorage2DMultisample GLEW_GET_FUN(__glewTextureStorage2DMultisample) +#define glTextureStorage3D GLEW_GET_FUN(__glewTextureStorage3D) +#define glTextureStorage3DMultisample GLEW_GET_FUN(__glewTextureStorage3DMultisample) +#define glTextureSubImage1D GLEW_GET_FUN(__glewTextureSubImage1D) +#define glTextureSubImage2D GLEW_GET_FUN(__glewTextureSubImage2D) +#define glTextureSubImage3D GLEW_GET_FUN(__glewTextureSubImage3D) +#define glTransformFeedbackBufferBase GLEW_GET_FUN(__glewTransformFeedbackBufferBase) +#define glTransformFeedbackBufferRange GLEW_GET_FUN(__glewTransformFeedbackBufferRange) +#define glUnmapNamedBuffer GLEW_GET_FUN(__glewUnmapNamedBuffer) +#define glVertexArrayAttribBinding GLEW_GET_FUN(__glewVertexArrayAttribBinding) +#define glVertexArrayAttribFormat GLEW_GET_FUN(__glewVertexArrayAttribFormat) +#define glVertexArrayAttribIFormat GLEW_GET_FUN(__glewVertexArrayAttribIFormat) +#define glVertexArrayAttribLFormat GLEW_GET_FUN(__glewVertexArrayAttribLFormat) +#define glVertexArrayBindingDivisor GLEW_GET_FUN(__glewVertexArrayBindingDivisor) +#define glVertexArrayElementBuffer GLEW_GET_FUN(__glewVertexArrayElementBuffer) +#define glVertexArrayVertexBuffer GLEW_GET_FUN(__glewVertexArrayVertexBuffer) +#define glVertexArrayVertexBuffers GLEW_GET_FUN(__glewVertexArrayVertexBuffers) + +#define GLEW_ARB_direct_state_access GLEW_GET_VAR(__GLEW_ARB_direct_state_access) + +#endif /* GL_ARB_direct_state_access */ + +/* -------------------------- GL_ARB_draw_buffers -------------------------- */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersARB GLEW_GET_FUN(__glewDrawBuffersARB) + +#define GLEW_ARB_draw_buffers GLEW_GET_VAR(__GLEW_ARB_draw_buffers) + +#endif /* GL_ARB_draw_buffers */ + +/* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */ + +#ifndef GL_ARB_draw_buffers_blend +#define GL_ARB_draw_buffers_blend 1 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); + +#define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB) +#define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB) +#define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB) +#define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB) + +#define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend) + +#endif /* GL_ARB_draw_buffers_blend */ + +/* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */ + +#ifndef GL_ARB_draw_elements_base_vertex +#define GL_ARB_draw_elements_base_vertex 1 + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount, const GLint *basevertex); + +#define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex) +#define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex) +#define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex) +#define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex) + +#define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex) + +#endif /* GL_ARB_draw_elements_base_vertex */ + +/* -------------------------- GL_ARB_draw_indirect ------------------------- */ + +#ifndef GL_ARB_draw_indirect +#define GL_ARB_draw_indirect 1 + +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); + +#define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect) +#define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect) + +#define GLEW_ARB_draw_indirect GLEW_GET_VAR(__GLEW_ARB_draw_indirect) + +#endif /* GL_ARB_draw_indirect */ + +/* ------------------------- GL_ARB_draw_instanced ------------------------- */ + +#ifndef GL_ARB_draw_instanced +#define GL_ARB_draw_instanced 1 + +#define GLEW_ARB_draw_instanced GLEW_GET_VAR(__GLEW_ARB_draw_instanced) + +#endif /* GL_ARB_draw_instanced */ + +/* ------------------------ GL_ARB_enhanced_layouts ------------------------ */ + +#ifndef GL_ARB_enhanced_layouts +#define GL_ARB_enhanced_layouts 1 + +#define GL_LOCATION_COMPONENT 0x934A +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C + +#define GLEW_ARB_enhanced_layouts GLEW_GET_VAR(__GLEW_ARB_enhanced_layouts) + +#endif /* GL_ARB_enhanced_layouts */ + +/* -------------------- GL_ARB_explicit_attrib_location -------------------- */ + +#ifndef GL_ARB_explicit_attrib_location +#define GL_ARB_explicit_attrib_location 1 + +#define GLEW_ARB_explicit_attrib_location GLEW_GET_VAR(__GLEW_ARB_explicit_attrib_location) + +#endif /* GL_ARB_explicit_attrib_location */ + +/* -------------------- GL_ARB_explicit_uniform_location ------------------- */ + +#ifndef GL_ARB_explicit_uniform_location +#define GL_ARB_explicit_uniform_location 1 + +#define GL_MAX_UNIFORM_LOCATIONS 0x826E + +#define GLEW_ARB_explicit_uniform_location GLEW_GET_VAR(__GLEW_ARB_explicit_uniform_location) + +#endif /* GL_ARB_explicit_uniform_location */ + +/* ------------------- GL_ARB_fragment_coord_conventions ------------------- */ + +#ifndef GL_ARB_fragment_coord_conventions +#define GL_ARB_fragment_coord_conventions 1 + +#define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions) + +#endif /* GL_ARB_fragment_coord_conventions */ + +/* --------------------- GL_ARB_fragment_layer_viewport -------------------- */ + +#ifndef GL_ARB_fragment_layer_viewport +#define GL_ARB_fragment_layer_viewport 1 + +#define GLEW_ARB_fragment_layer_viewport GLEW_GET_VAR(__GLEW_ARB_fragment_layer_viewport) + +#endif /* GL_ARB_fragment_layer_viewport */ + +/* ------------------------ GL_ARB_fragment_program ------------------------ */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 + +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 + +#define GLEW_ARB_fragment_program GLEW_GET_VAR(__GLEW_ARB_fragment_program) + +#endif /* GL_ARB_fragment_program */ + +/* --------------------- GL_ARB_fragment_program_shadow -------------------- */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 + +#define GLEW_ARB_fragment_program_shadow GLEW_GET_VAR(__GLEW_ARB_fragment_program_shadow) + +#endif /* GL_ARB_fragment_program_shadow */ + +/* ------------------------- GL_ARB_fragment_shader ------------------------ */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 + +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B + +#define GLEW_ARB_fragment_shader GLEW_GET_VAR(__GLEW_ARB_fragment_shader) + +#endif /* GL_ARB_fragment_shader */ + +/* -------------------- GL_ARB_fragment_shader_interlock ------------------- */ + +#ifndef GL_ARB_fragment_shader_interlock +#define GL_ARB_fragment_shader_interlock 1 + +#define GLEW_ARB_fragment_shader_interlock GLEW_GET_VAR(__GLEW_ARB_fragment_shader_interlock) + +#endif /* GL_ARB_fragment_shader_interlock */ + +/* ------------------- GL_ARB_framebuffer_no_attachments ------------------- */ + +#ifndef GL_ARB_framebuffer_no_attachments +#define GL_ARB_framebuffer_no_attachments 1 + +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); + +#define glFramebufferParameteri GLEW_GET_FUN(__glewFramebufferParameteri) +#define glGetFramebufferParameteriv GLEW_GET_FUN(__glewGetFramebufferParameteriv) +#define glGetNamedFramebufferParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferParameterivEXT) +#define glNamedFramebufferParameteriEXT GLEW_GET_FUN(__glewNamedFramebufferParameteriEXT) + +#define GLEW_ARB_framebuffer_no_attachments GLEW_GET_VAR(__GLEW_ARB_framebuffer_no_attachments) + +#endif /* GL_ARB_framebuffer_no_attachments */ + +/* ----------------------- GL_ARB_framebuffer_object ----------------------- */ + +#ifndef GL_ARB_framebuffer_object +#define GL_ARB_framebuffer_object 1 + +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_INDEX 0x8222 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_SRGB 0x8C40 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 + +typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer); +typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glBindFramebuffer GLEW_GET_FUN(__glewBindFramebuffer) +#define glBindRenderbuffer GLEW_GET_FUN(__glewBindRenderbuffer) +#define glBlitFramebuffer GLEW_GET_FUN(__glewBlitFramebuffer) +#define glCheckFramebufferStatus GLEW_GET_FUN(__glewCheckFramebufferStatus) +#define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers) +#define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers) +#define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer) +#define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D) +#define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D) +#define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D) +#define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer) +#define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers) +#define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers) +#define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap) +#define glGetFramebufferAttachmentParameteriv GLEW_GET_FUN(__glewGetFramebufferAttachmentParameteriv) +#define glGetRenderbufferParameteriv GLEW_GET_FUN(__glewGetRenderbufferParameteriv) +#define glIsFramebuffer GLEW_GET_FUN(__glewIsFramebuffer) +#define glIsRenderbuffer GLEW_GET_FUN(__glewIsRenderbuffer) +#define glRenderbufferStorage GLEW_GET_FUN(__glewRenderbufferStorage) +#define glRenderbufferStorageMultisample GLEW_GET_FUN(__glewRenderbufferStorageMultisample) + +#define GLEW_ARB_framebuffer_object GLEW_GET_VAR(__GLEW_ARB_framebuffer_object) + +#endif /* GL_ARB_framebuffer_object */ + +/* ------------------------ GL_ARB_framebuffer_sRGB ------------------------ */ + +#ifndef GL_ARB_framebuffer_sRGB +#define GL_ARB_framebuffer_sRGB 1 + +#define GL_FRAMEBUFFER_SRGB 0x8DB9 + +#define GLEW_ARB_framebuffer_sRGB GLEW_GET_VAR(__GLEW_ARB_framebuffer_sRGB) + +#endif /* GL_ARB_framebuffer_sRGB */ + +/* ------------------------ GL_ARB_geometry_shader4 ------------------------ */ + +#ifndef GL_ARB_geometry_shader4 +#define GL_ARB_geometry_shader4 1 + +#define GL_LINES_ADJACENCY_ARB 0xA +#define GL_LINE_STRIP_ADJACENCY_ARB 0xB +#define GL_TRIANGLES_ADJACENCY_ARB 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0xD +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); + +#define glFramebufferTextureARB GLEW_GET_FUN(__glewFramebufferTextureARB) +#define glFramebufferTextureFaceARB GLEW_GET_FUN(__glewFramebufferTextureFaceARB) +#define glFramebufferTextureLayerARB GLEW_GET_FUN(__glewFramebufferTextureLayerARB) +#define glProgramParameteriARB GLEW_GET_FUN(__glewProgramParameteriARB) + +#define GLEW_ARB_geometry_shader4 GLEW_GET_VAR(__GLEW_ARB_geometry_shader4) + +#endif /* GL_ARB_geometry_shader4 */ + +/* ----------------------- GL_ARB_get_program_binary ----------------------- */ + +#ifndef GL_ARB_get_program_binary +#define GL_ARB_get_program_binary 1 + +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, void*binary); +typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); + +#define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary) +#define glProgramBinary GLEW_GET_FUN(__glewProgramBinary) +#define glProgramParameteri GLEW_GET_FUN(__glewProgramParameteri) + +#define GLEW_ARB_get_program_binary GLEW_GET_VAR(__GLEW_ARB_get_program_binary) + +#endif /* GL_ARB_get_program_binary */ + +/* ---------------------- GL_ARB_get_texture_sub_image --------------------- */ + +#ifndef GL_ARB_get_texture_sub_image +#define GL_ARB_get_texture_sub_image 1 + +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); + +#define glGetCompressedTextureSubImage GLEW_GET_FUN(__glewGetCompressedTextureSubImage) +#define glGetTextureSubImage GLEW_GET_FUN(__glewGetTextureSubImage) + +#define GLEW_ARB_get_texture_sub_image GLEW_GET_VAR(__GLEW_ARB_get_texture_sub_image) + +#endif /* GL_ARB_get_texture_sub_image */ + +/* --------------------------- GL_ARB_gpu_shader5 -------------------------- */ + +#ifndef GL_ARB_gpu_shader5 +#define GL_ARB_gpu_shader5 1 + +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_MAX_VERTEX_STREAMS 0x8E71 + +#define GLEW_ARB_gpu_shader5 GLEW_GET_VAR(__GLEW_ARB_gpu_shader5) + +#endif /* GL_ARB_gpu_shader5 */ + +/* ------------------------- GL_ARB_gpu_shader_fp64 ------------------------ */ + +#ifndef GL_ARB_gpu_shader_fp64 +#define GL_ARB_gpu_shader_fp64 1 + +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE + +typedef void (GLAPIENTRY * PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); + +#define glGetUniformdv GLEW_GET_FUN(__glewGetUniformdv) +#define glUniform1d GLEW_GET_FUN(__glewUniform1d) +#define glUniform1dv GLEW_GET_FUN(__glewUniform1dv) +#define glUniform2d GLEW_GET_FUN(__glewUniform2d) +#define glUniform2dv GLEW_GET_FUN(__glewUniform2dv) +#define glUniform3d GLEW_GET_FUN(__glewUniform3d) +#define glUniform3dv GLEW_GET_FUN(__glewUniform3dv) +#define glUniform4d GLEW_GET_FUN(__glewUniform4d) +#define glUniform4dv GLEW_GET_FUN(__glewUniform4dv) +#define glUniformMatrix2dv GLEW_GET_FUN(__glewUniformMatrix2dv) +#define glUniformMatrix2x3dv GLEW_GET_FUN(__glewUniformMatrix2x3dv) +#define glUniformMatrix2x4dv GLEW_GET_FUN(__glewUniformMatrix2x4dv) +#define glUniformMatrix3dv GLEW_GET_FUN(__glewUniformMatrix3dv) +#define glUniformMatrix3x2dv GLEW_GET_FUN(__glewUniformMatrix3x2dv) +#define glUniformMatrix3x4dv GLEW_GET_FUN(__glewUniformMatrix3x4dv) +#define glUniformMatrix4dv GLEW_GET_FUN(__glewUniformMatrix4dv) +#define glUniformMatrix4x2dv GLEW_GET_FUN(__glewUniformMatrix4x2dv) +#define glUniformMatrix4x3dv GLEW_GET_FUN(__glewUniformMatrix4x3dv) + +#define GLEW_ARB_gpu_shader_fp64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_fp64) + +#endif /* GL_ARB_gpu_shader_fp64 */ + +/* ------------------------ GL_ARB_gpu_shader_int64 ------------------------ */ + +#ifndef GL_ARB_gpu_shader_int64 +#define GL_ARB_gpu_shader_int64 1 + +#define GL_INT64_ARB 0x140E +#define GL_UNSIGNED_INT64_ARB 0x140F +#define GL_INT64_VEC2_ARB 0x8FE9 +#define GL_INT64_VEC3_ARB 0x8FEA +#define GL_INT64_VEC4_ARB 0x8FEB +#define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 + +typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64* value); + +#define glGetUniformi64vARB GLEW_GET_FUN(__glewGetUniformi64vARB) +#define glGetUniformui64vARB GLEW_GET_FUN(__glewGetUniformui64vARB) +#define glGetnUniformi64vARB GLEW_GET_FUN(__glewGetnUniformi64vARB) +#define glGetnUniformui64vARB GLEW_GET_FUN(__glewGetnUniformui64vARB) +#define glProgramUniform1i64ARB GLEW_GET_FUN(__glewProgramUniform1i64ARB) +#define glProgramUniform1i64vARB GLEW_GET_FUN(__glewProgramUniform1i64vARB) +#define glProgramUniform1ui64ARB GLEW_GET_FUN(__glewProgramUniform1ui64ARB) +#define glProgramUniform1ui64vARB GLEW_GET_FUN(__glewProgramUniform1ui64vARB) +#define glProgramUniform2i64ARB GLEW_GET_FUN(__glewProgramUniform2i64ARB) +#define glProgramUniform2i64vARB GLEW_GET_FUN(__glewProgramUniform2i64vARB) +#define glProgramUniform2ui64ARB GLEW_GET_FUN(__glewProgramUniform2ui64ARB) +#define glProgramUniform2ui64vARB GLEW_GET_FUN(__glewProgramUniform2ui64vARB) +#define glProgramUniform3i64ARB GLEW_GET_FUN(__glewProgramUniform3i64ARB) +#define glProgramUniform3i64vARB GLEW_GET_FUN(__glewProgramUniform3i64vARB) +#define glProgramUniform3ui64ARB GLEW_GET_FUN(__glewProgramUniform3ui64ARB) +#define glProgramUniform3ui64vARB GLEW_GET_FUN(__glewProgramUniform3ui64vARB) +#define glProgramUniform4i64ARB GLEW_GET_FUN(__glewProgramUniform4i64ARB) +#define glProgramUniform4i64vARB GLEW_GET_FUN(__glewProgramUniform4i64vARB) +#define glProgramUniform4ui64ARB GLEW_GET_FUN(__glewProgramUniform4ui64ARB) +#define glProgramUniform4ui64vARB GLEW_GET_FUN(__glewProgramUniform4ui64vARB) +#define glUniform1i64ARB GLEW_GET_FUN(__glewUniform1i64ARB) +#define glUniform1i64vARB GLEW_GET_FUN(__glewUniform1i64vARB) +#define glUniform1ui64ARB GLEW_GET_FUN(__glewUniform1ui64ARB) +#define glUniform1ui64vARB GLEW_GET_FUN(__glewUniform1ui64vARB) +#define glUniform2i64ARB GLEW_GET_FUN(__glewUniform2i64ARB) +#define glUniform2i64vARB GLEW_GET_FUN(__glewUniform2i64vARB) +#define glUniform2ui64ARB GLEW_GET_FUN(__glewUniform2ui64ARB) +#define glUniform2ui64vARB GLEW_GET_FUN(__glewUniform2ui64vARB) +#define glUniform3i64ARB GLEW_GET_FUN(__glewUniform3i64ARB) +#define glUniform3i64vARB GLEW_GET_FUN(__glewUniform3i64vARB) +#define glUniform3ui64ARB GLEW_GET_FUN(__glewUniform3ui64ARB) +#define glUniform3ui64vARB GLEW_GET_FUN(__glewUniform3ui64vARB) +#define glUniform4i64ARB GLEW_GET_FUN(__glewUniform4i64ARB) +#define glUniform4i64vARB GLEW_GET_FUN(__glewUniform4i64vARB) +#define glUniform4ui64ARB GLEW_GET_FUN(__glewUniform4ui64ARB) +#define glUniform4ui64vARB GLEW_GET_FUN(__glewUniform4ui64vARB) + +#define GLEW_ARB_gpu_shader_int64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_int64) + +#endif /* GL_ARB_gpu_shader_int64 */ + +/* ------------------------ GL_ARB_half_float_pixel ------------------------ */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 + +#define GL_HALF_FLOAT_ARB 0x140B + +#define GLEW_ARB_half_float_pixel GLEW_GET_VAR(__GLEW_ARB_half_float_pixel) + +#endif /* GL_ARB_half_float_pixel */ + +/* ------------------------ GL_ARB_half_float_vertex ----------------------- */ + +#ifndef GL_ARB_half_float_vertex +#define GL_ARB_half_float_vertex 1 + +#define GL_HALF_FLOAT 0x140B + +#define GLEW_ARB_half_float_vertex GLEW_GET_VAR(__GLEW_ARB_half_float_vertex) + +#endif /* GL_ARB_half_float_vertex */ + +/* ----------------------------- GL_ARB_imaging ---------------------------- */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 + +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_IGNORE_BORDER 0x8150 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_WRAP_BORDER 0x8152 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum types, void *values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); + +#define glColorSubTable GLEW_GET_FUN(__glewColorSubTable) +#define glColorTable GLEW_GET_FUN(__glewColorTable) +#define glColorTableParameterfv GLEW_GET_FUN(__glewColorTableParameterfv) +#define glColorTableParameteriv GLEW_GET_FUN(__glewColorTableParameteriv) +#define glConvolutionFilter1D GLEW_GET_FUN(__glewConvolutionFilter1D) +#define glConvolutionFilter2D GLEW_GET_FUN(__glewConvolutionFilter2D) +#define glConvolutionParameterf GLEW_GET_FUN(__glewConvolutionParameterf) +#define glConvolutionParameterfv GLEW_GET_FUN(__glewConvolutionParameterfv) +#define glConvolutionParameteri GLEW_GET_FUN(__glewConvolutionParameteri) +#define glConvolutionParameteriv GLEW_GET_FUN(__glewConvolutionParameteriv) +#define glCopyColorSubTable GLEW_GET_FUN(__glewCopyColorSubTable) +#define glCopyColorTable GLEW_GET_FUN(__glewCopyColorTable) +#define glCopyConvolutionFilter1D GLEW_GET_FUN(__glewCopyConvolutionFilter1D) +#define glCopyConvolutionFilter2D GLEW_GET_FUN(__glewCopyConvolutionFilter2D) +#define glGetColorTable GLEW_GET_FUN(__glewGetColorTable) +#define glGetColorTableParameterfv GLEW_GET_FUN(__glewGetColorTableParameterfv) +#define glGetColorTableParameteriv GLEW_GET_FUN(__glewGetColorTableParameteriv) +#define glGetConvolutionFilter GLEW_GET_FUN(__glewGetConvolutionFilter) +#define glGetConvolutionParameterfv GLEW_GET_FUN(__glewGetConvolutionParameterfv) +#define glGetConvolutionParameteriv GLEW_GET_FUN(__glewGetConvolutionParameteriv) +#define glGetHistogram GLEW_GET_FUN(__glewGetHistogram) +#define glGetHistogramParameterfv GLEW_GET_FUN(__glewGetHistogramParameterfv) +#define glGetHistogramParameteriv GLEW_GET_FUN(__glewGetHistogramParameteriv) +#define glGetMinmax GLEW_GET_FUN(__glewGetMinmax) +#define glGetMinmaxParameterfv GLEW_GET_FUN(__glewGetMinmaxParameterfv) +#define glGetMinmaxParameteriv GLEW_GET_FUN(__glewGetMinmaxParameteriv) +#define glGetSeparableFilter GLEW_GET_FUN(__glewGetSeparableFilter) +#define glHistogram GLEW_GET_FUN(__glewHistogram) +#define glMinmax GLEW_GET_FUN(__glewMinmax) +#define glResetHistogram GLEW_GET_FUN(__glewResetHistogram) +#define glResetMinmax GLEW_GET_FUN(__glewResetMinmax) +#define glSeparableFilter2D GLEW_GET_FUN(__glewSeparableFilter2D) + +#define GLEW_ARB_imaging GLEW_GET_VAR(__GLEW_ARB_imaging) + +#endif /* GL_ARB_imaging */ + +/* ----------------------- GL_ARB_indirect_parameters ---------------------- */ + +#ifndef GL_ARB_indirect_parameters +#define GL_ARB_indirect_parameters 1 + +#define GL_PARAMETER_BUFFER_ARB 0x80EE +#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); + +#define glMultiDrawArraysIndirectCountARB GLEW_GET_FUN(__glewMultiDrawArraysIndirectCountARB) +#define glMultiDrawElementsIndirectCountARB GLEW_GET_FUN(__glewMultiDrawElementsIndirectCountARB) + +#define GLEW_ARB_indirect_parameters GLEW_GET_VAR(__GLEW_ARB_indirect_parameters) + +#endif /* GL_ARB_indirect_parameters */ + +/* ------------------------ GL_ARB_instanced_arrays ------------------------ */ + +#ifndef GL_ARB_instanced_arrays +#define GL_ARB_instanced_arrays 1 + +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); + +#define glDrawArraysInstancedARB GLEW_GET_FUN(__glewDrawArraysInstancedARB) +#define glDrawElementsInstancedARB GLEW_GET_FUN(__glewDrawElementsInstancedARB) +#define glVertexAttribDivisorARB GLEW_GET_FUN(__glewVertexAttribDivisorARB) + +#define GLEW_ARB_instanced_arrays GLEW_GET_VAR(__GLEW_ARB_instanced_arrays) + +#endif /* GL_ARB_instanced_arrays */ + +/* ---------------------- GL_ARB_internalformat_query ---------------------- */ + +#ifndef GL_ARB_internalformat_query +#define GL_ARB_internalformat_query 1 + +#define GL_NUM_SAMPLE_COUNTS 0x9380 + +typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params); + +#define glGetInternalformativ GLEW_GET_FUN(__glewGetInternalformativ) + +#define GLEW_ARB_internalformat_query GLEW_GET_VAR(__GLEW_ARB_internalformat_query) + +#endif /* GL_ARB_internalformat_query */ + +/* ---------------------- GL_ARB_internalformat_query2 --------------------- */ + +#ifndef GL_ARB_internalformat_query2 +#define GL_ARB_internalformat_query2 1 + +#define GL_INTERNALFORMAT_SUPPORTED 0x826F +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_MAX_WIDTH 0x827E +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_DEPTH 0x8280 +#define GL_MAX_LAYERS 0x8281 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_DEPTH_COMPONENTS 0x8284 +#define GL_STENCIL_COMPONENTS 0x8285 +#define GL_COLOR_RENDERABLE 0x8286 +#define GL_DEPTH_RENDERABLE 0x8287 +#define GL_STENCIL_RENDERABLE 0x8288 +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A +#define GL_FRAMEBUFFER_BLEND 0x828B +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 +#define GL_MIPMAP 0x8293 +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 +#define GL_COLOR_ENCODING 0x8296 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 +#define GL_SRGB_DECODE_ARB 0x8299 +#define GL_FILTER 0x829A +#define GL_VERTEX_TEXTURE 0x829B +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_GEOMETRY_TEXTURE 0x829E +#define GL_FRAGMENT_TEXTURE 0x829F +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_TEXTURE_SHADOW 0x82A1 +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_CLEAR_BUFFER 0x82B4 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 +#define GL_FULL_SUPPORT 0x82B7 +#define GL_CAVEAT_SUPPORT 0x82B8 +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 + +typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint64* params); + +#define glGetInternalformati64v GLEW_GET_FUN(__glewGetInternalformati64v) + +#define GLEW_ARB_internalformat_query2 GLEW_GET_VAR(__GLEW_ARB_internalformat_query2) + +#endif /* GL_ARB_internalformat_query2 */ + +/* ----------------------- GL_ARB_invalidate_subdata ----------------------- */ + +#ifndef GL_ARB_invalidate_subdata +#define GL_ARB_invalidate_subdata 1 + +typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments); +typedef void (GLAPIENTRY * PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); + +#define glInvalidateBufferData GLEW_GET_FUN(__glewInvalidateBufferData) +#define glInvalidateBufferSubData GLEW_GET_FUN(__glewInvalidateBufferSubData) +#define glInvalidateFramebuffer GLEW_GET_FUN(__glewInvalidateFramebuffer) +#define glInvalidateSubFramebuffer GLEW_GET_FUN(__glewInvalidateSubFramebuffer) +#define glInvalidateTexImage GLEW_GET_FUN(__glewInvalidateTexImage) +#define glInvalidateTexSubImage GLEW_GET_FUN(__glewInvalidateTexSubImage) + +#define GLEW_ARB_invalidate_subdata GLEW_GET_VAR(__GLEW_ARB_invalidate_subdata) + +#endif /* GL_ARB_invalidate_subdata */ + +/* ---------------------- GL_ARB_map_buffer_alignment ---------------------- */ + +#ifndef GL_ARB_map_buffer_alignment +#define GL_ARB_map_buffer_alignment 1 + +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC + +#define GLEW_ARB_map_buffer_alignment GLEW_GET_VAR(__GLEW_ARB_map_buffer_alignment) + +#endif /* GL_ARB_map_buffer_alignment */ + +/* ------------------------ GL_ARB_map_buffer_range ------------------------ */ + +#ifndef GL_ARB_map_buffer_range +#define GL_ARB_map_buffer_range 1 + +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 + +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void * (GLAPIENTRY * PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); + +#define glFlushMappedBufferRange GLEW_GET_FUN(__glewFlushMappedBufferRange) +#define glMapBufferRange GLEW_GET_FUN(__glewMapBufferRange) + +#define GLEW_ARB_map_buffer_range GLEW_GET_VAR(__GLEW_ARB_map_buffer_range) + +#endif /* GL_ARB_map_buffer_range */ + +/* ------------------------- GL_ARB_matrix_palette ------------------------- */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 + +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 + +typedef void (GLAPIENTRY * PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUBVARBPROC) (GLint size, GLubyte *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUIVARBPROC) (GLint size, GLuint *indices); +typedef void (GLAPIENTRY * PFNGLMATRIXINDEXUSVARBPROC) (GLint size, GLushort *indices); + +#define glCurrentPaletteMatrixARB GLEW_GET_FUN(__glewCurrentPaletteMatrixARB) +#define glMatrixIndexPointerARB GLEW_GET_FUN(__glewMatrixIndexPointerARB) +#define glMatrixIndexubvARB GLEW_GET_FUN(__glewMatrixIndexubvARB) +#define glMatrixIndexuivARB GLEW_GET_FUN(__glewMatrixIndexuivARB) +#define glMatrixIndexusvARB GLEW_GET_FUN(__glewMatrixIndexusvARB) + +#define GLEW_ARB_matrix_palette GLEW_GET_VAR(__GLEW_ARB_matrix_palette) + +#endif /* GL_ARB_matrix_palette */ + +/* --------------------------- GL_ARB_multi_bind --------------------------- */ + +#ifndef GL_ARB_multi_bind +#define GL_ARB_multi_bind 1 + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint* buffers, const GLintptr *offsets, const GLsizei *strides); + +#define glBindBuffersBase GLEW_GET_FUN(__glewBindBuffersBase) +#define glBindBuffersRange GLEW_GET_FUN(__glewBindBuffersRange) +#define glBindImageTextures GLEW_GET_FUN(__glewBindImageTextures) +#define glBindSamplers GLEW_GET_FUN(__glewBindSamplers) +#define glBindTextures GLEW_GET_FUN(__glewBindTextures) +#define glBindVertexBuffers GLEW_GET_FUN(__glewBindVertexBuffers) + +#define GLEW_ARB_multi_bind GLEW_GET_VAR(__GLEW_ARB_multi_bind) + +#endif /* GL_ARB_multi_bind */ + +/* ----------------------- GL_ARB_multi_draw_indirect ---------------------- */ + +#ifndef GL_ARB_multi_draw_indirect +#define GL_ARB_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); + +#define glMultiDrawArraysIndirect GLEW_GET_FUN(__glewMultiDrawArraysIndirect) +#define glMultiDrawElementsIndirect GLEW_GET_FUN(__glewMultiDrawElementsIndirect) + +#define GLEW_ARB_multi_draw_indirect GLEW_GET_VAR(__GLEW_ARB_multi_draw_indirect) + +#endif /* GL_ARB_multi_draw_indirect */ + +/* --------------------------- GL_ARB_multisample -------------------------- */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 + +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); + +#define glSampleCoverageARB GLEW_GET_FUN(__glewSampleCoverageARB) + +#define GLEW_ARB_multisample GLEW_GET_VAR(__GLEW_ARB_multisample) + +#endif /* GL_ARB_multisample */ + +/* -------------------------- GL_ARB_multitexture -------------------------- */ + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 + +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 + +typedef void (GLAPIENTRY * PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); + +#define glActiveTextureARB GLEW_GET_FUN(__glewActiveTextureARB) +#define glClientActiveTextureARB GLEW_GET_FUN(__glewClientActiveTextureARB) +#define glMultiTexCoord1dARB GLEW_GET_FUN(__glewMultiTexCoord1dARB) +#define glMultiTexCoord1dvARB GLEW_GET_FUN(__glewMultiTexCoord1dvARB) +#define glMultiTexCoord1fARB GLEW_GET_FUN(__glewMultiTexCoord1fARB) +#define glMultiTexCoord1fvARB GLEW_GET_FUN(__glewMultiTexCoord1fvARB) +#define glMultiTexCoord1iARB GLEW_GET_FUN(__glewMultiTexCoord1iARB) +#define glMultiTexCoord1ivARB GLEW_GET_FUN(__glewMultiTexCoord1ivARB) +#define glMultiTexCoord1sARB GLEW_GET_FUN(__glewMultiTexCoord1sARB) +#define glMultiTexCoord1svARB GLEW_GET_FUN(__glewMultiTexCoord1svARB) +#define glMultiTexCoord2dARB GLEW_GET_FUN(__glewMultiTexCoord2dARB) +#define glMultiTexCoord2dvARB GLEW_GET_FUN(__glewMultiTexCoord2dvARB) +#define glMultiTexCoord2fARB GLEW_GET_FUN(__glewMultiTexCoord2fARB) +#define glMultiTexCoord2fvARB GLEW_GET_FUN(__glewMultiTexCoord2fvARB) +#define glMultiTexCoord2iARB GLEW_GET_FUN(__glewMultiTexCoord2iARB) +#define glMultiTexCoord2ivARB GLEW_GET_FUN(__glewMultiTexCoord2ivARB) +#define glMultiTexCoord2sARB GLEW_GET_FUN(__glewMultiTexCoord2sARB) +#define glMultiTexCoord2svARB GLEW_GET_FUN(__glewMultiTexCoord2svARB) +#define glMultiTexCoord3dARB GLEW_GET_FUN(__glewMultiTexCoord3dARB) +#define glMultiTexCoord3dvARB GLEW_GET_FUN(__glewMultiTexCoord3dvARB) +#define glMultiTexCoord3fARB GLEW_GET_FUN(__glewMultiTexCoord3fARB) +#define glMultiTexCoord3fvARB GLEW_GET_FUN(__glewMultiTexCoord3fvARB) +#define glMultiTexCoord3iARB GLEW_GET_FUN(__glewMultiTexCoord3iARB) +#define glMultiTexCoord3ivARB GLEW_GET_FUN(__glewMultiTexCoord3ivARB) +#define glMultiTexCoord3sARB GLEW_GET_FUN(__glewMultiTexCoord3sARB) +#define glMultiTexCoord3svARB GLEW_GET_FUN(__glewMultiTexCoord3svARB) +#define glMultiTexCoord4dARB GLEW_GET_FUN(__glewMultiTexCoord4dARB) +#define glMultiTexCoord4dvARB GLEW_GET_FUN(__glewMultiTexCoord4dvARB) +#define glMultiTexCoord4fARB GLEW_GET_FUN(__glewMultiTexCoord4fARB) +#define glMultiTexCoord4fvARB GLEW_GET_FUN(__glewMultiTexCoord4fvARB) +#define glMultiTexCoord4iARB GLEW_GET_FUN(__glewMultiTexCoord4iARB) +#define glMultiTexCoord4ivARB GLEW_GET_FUN(__glewMultiTexCoord4ivARB) +#define glMultiTexCoord4sARB GLEW_GET_FUN(__glewMultiTexCoord4sARB) +#define glMultiTexCoord4svARB GLEW_GET_FUN(__glewMultiTexCoord4svARB) + +#define GLEW_ARB_multitexture GLEW_GET_VAR(__GLEW_ARB_multitexture) + +#endif /* GL_ARB_multitexture */ + +/* ------------------------- GL_ARB_occlusion_query ------------------------ */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 + +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id); + +#define glBeginQueryARB GLEW_GET_FUN(__glewBeginQueryARB) +#define glDeleteQueriesARB GLEW_GET_FUN(__glewDeleteQueriesARB) +#define glEndQueryARB GLEW_GET_FUN(__glewEndQueryARB) +#define glGenQueriesARB GLEW_GET_FUN(__glewGenQueriesARB) +#define glGetQueryObjectivARB GLEW_GET_FUN(__glewGetQueryObjectivARB) +#define glGetQueryObjectuivARB GLEW_GET_FUN(__glewGetQueryObjectuivARB) +#define glGetQueryivARB GLEW_GET_FUN(__glewGetQueryivARB) +#define glIsQueryARB GLEW_GET_FUN(__glewIsQueryARB) + +#define GLEW_ARB_occlusion_query GLEW_GET_VAR(__GLEW_ARB_occlusion_query) + +#endif /* GL_ARB_occlusion_query */ + +/* ------------------------ GL_ARB_occlusion_query2 ------------------------ */ + +#ifndef GL_ARB_occlusion_query2 +#define GL_ARB_occlusion_query2 1 + +#define GL_ANY_SAMPLES_PASSED 0x8C2F + +#define GLEW_ARB_occlusion_query2 GLEW_GET_VAR(__GLEW_ARB_occlusion_query2) + +#endif /* GL_ARB_occlusion_query2 */ + +/* --------------------- GL_ARB_parallel_shader_compile -------------------- */ + +#ifndef GL_ARB_parallel_shader_compile +#define GL_ARB_parallel_shader_compile 1 + +#define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 +#define GL_COMPLETION_STATUS_ARB 0x91B1 + +typedef void (GLAPIENTRY * PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); + +#define glMaxShaderCompilerThreadsARB GLEW_GET_FUN(__glewMaxShaderCompilerThreadsARB) + +#define GLEW_ARB_parallel_shader_compile GLEW_GET_VAR(__GLEW_ARB_parallel_shader_compile) + +#endif /* GL_ARB_parallel_shader_compile */ + +/* -------------------- GL_ARB_pipeline_statistics_query ------------------- */ + +#ifndef GL_ARB_pipeline_statistics_query +#define GL_ARB_pipeline_statistics_query 1 + +#define GL_VERTICES_SUBMITTED_ARB 0x82EE +#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F + +#define GLEW_ARB_pipeline_statistics_query GLEW_GET_VAR(__GLEW_ARB_pipeline_statistics_query) + +#endif /* GL_ARB_pipeline_statistics_query */ + +/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF + +#define GLEW_ARB_pixel_buffer_object GLEW_GET_VAR(__GLEW_ARB_pixel_buffer_object) + +#endif /* GL_ARB_pixel_buffer_object */ + +/* ------------------------ GL_ARB_point_parameters ------------------------ */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 + +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat* params); + +#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB) +#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB) + +#define GLEW_ARB_point_parameters GLEW_GET_VAR(__GLEW_ARB_point_parameters) + +#endif /* GL_ARB_point_parameters */ + +/* -------------------------- GL_ARB_point_sprite -------------------------- */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 + +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 + +#define GLEW_ARB_point_sprite GLEW_GET_VAR(__GLEW_ARB_point_sprite) + +#endif /* GL_ARB_point_sprite */ + +/* ----------------------- GL_ARB_post_depth_coverage ---------------------- */ + +#ifndef GL_ARB_post_depth_coverage +#define GL_ARB_post_depth_coverage 1 + +#define GLEW_ARB_post_depth_coverage GLEW_GET_VAR(__GLEW_ARB_post_depth_coverage) + +#endif /* GL_ARB_post_depth_coverage */ + +/* --------------------- GL_ARB_program_interface_query -------------------- */ + +#ifndef GL_ARB_program_interface_query +#define GL_ARB_program_interface_query 1 + +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_BUFFER_VARIABLE 0x92E5 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_IS_PER_PATCH 0x92E7 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_NAME_LENGTH 0x92F9 +#define GL_TYPE 0x92FA +#define GL_ARRAY_SIZE 0x92FB +#define GL_OFFSET 0x92FC +#define GL_BLOCK_INDEX 0x92FD +#define GL_ARRAY_STRIDE 0x92FE +#define GL_MATRIX_STRIDE 0x92FF +#define GL_IS_ROW_MAJOR 0x9300 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_ACTIVE_VARIABLES 0x9305 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_LOCATION 0x930E +#define GL_LOCATION_INDEX 0x930F + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint* params); +typedef GLuint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); +typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar* name); +typedef GLint (GLAPIENTRY * PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei* length, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLint *params); + +#define glGetProgramInterfaceiv GLEW_GET_FUN(__glewGetProgramInterfaceiv) +#define glGetProgramResourceIndex GLEW_GET_FUN(__glewGetProgramResourceIndex) +#define glGetProgramResourceLocation GLEW_GET_FUN(__glewGetProgramResourceLocation) +#define glGetProgramResourceLocationIndex GLEW_GET_FUN(__glewGetProgramResourceLocationIndex) +#define glGetProgramResourceName GLEW_GET_FUN(__glewGetProgramResourceName) +#define glGetProgramResourceiv GLEW_GET_FUN(__glewGetProgramResourceiv) + +#define GLEW_ARB_program_interface_query GLEW_GET_VAR(__GLEW_ARB_program_interface_query) + +#endif /* GL_ARB_program_interface_query */ + +/* ------------------------ GL_ARB_provoking_vertex ------------------------ */ + +#ifndef GL_ARB_provoking_vertex +#define GL_ARB_provoking_vertex 1 + +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F + +typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode); + +#define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex) + +#define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex) + +#endif /* GL_ARB_provoking_vertex */ + +/* ----------------------- GL_ARB_query_buffer_object ---------------------- */ + +#ifndef GL_ARB_query_buffer_object +#define GL_ARB_query_buffer_object 1 + +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 + +#define GLEW_ARB_query_buffer_object GLEW_GET_VAR(__GLEW_ARB_query_buffer_object) + +#endif /* GL_ARB_query_buffer_object */ + +/* ------------------ GL_ARB_robust_buffer_access_behavior ----------------- */ + +#ifndef GL_ARB_robust_buffer_access_behavior +#define GL_ARB_robust_buffer_access_behavior 1 + +#define GLEW_ARB_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_ARB_robust_buffer_access_behavior) + +#endif /* GL_ARB_robust_buffer_access_behavior */ + +/* --------------------------- GL_ARB_robustness --------------------------- */ + +#ifndef GL_ARB_robustness +#define GL_ARB_robustness 1 + +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 + +typedef GLenum (GLAPIENTRY * PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table); +typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void* img); +typedef void (GLAPIENTRY * PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image); +typedef void (GLAPIENTRY * PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); +typedef void (GLAPIENTRY * PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v); +typedef void (GLAPIENTRY * PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v); +typedef void (GLAPIENTRY * PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint* v); +typedef void (GLAPIENTRY * PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values); +typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat* values); +typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint* values); +typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort* values); +typedef void (GLAPIENTRY * PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte* pattern); +typedef void (GLAPIENTRY * PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, void*column, void*span); +typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); +typedef void (GLAPIENTRY * PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data); + +#define glGetGraphicsResetStatusARB GLEW_GET_FUN(__glewGetGraphicsResetStatusARB) +#define glGetnColorTableARB GLEW_GET_FUN(__glewGetnColorTableARB) +#define glGetnCompressedTexImageARB GLEW_GET_FUN(__glewGetnCompressedTexImageARB) +#define glGetnConvolutionFilterARB GLEW_GET_FUN(__glewGetnConvolutionFilterARB) +#define glGetnHistogramARB GLEW_GET_FUN(__glewGetnHistogramARB) +#define glGetnMapdvARB GLEW_GET_FUN(__glewGetnMapdvARB) +#define glGetnMapfvARB GLEW_GET_FUN(__glewGetnMapfvARB) +#define glGetnMapivARB GLEW_GET_FUN(__glewGetnMapivARB) +#define glGetnMinmaxARB GLEW_GET_FUN(__glewGetnMinmaxARB) +#define glGetnPixelMapfvARB GLEW_GET_FUN(__glewGetnPixelMapfvARB) +#define glGetnPixelMapuivARB GLEW_GET_FUN(__glewGetnPixelMapuivARB) +#define glGetnPixelMapusvARB GLEW_GET_FUN(__glewGetnPixelMapusvARB) +#define glGetnPolygonStippleARB GLEW_GET_FUN(__glewGetnPolygonStippleARB) +#define glGetnSeparableFilterARB GLEW_GET_FUN(__glewGetnSeparableFilterARB) +#define glGetnTexImageARB GLEW_GET_FUN(__glewGetnTexImageARB) +#define glGetnUniformdvARB GLEW_GET_FUN(__glewGetnUniformdvARB) +#define glGetnUniformfvARB GLEW_GET_FUN(__glewGetnUniformfvARB) +#define glGetnUniformivARB GLEW_GET_FUN(__glewGetnUniformivARB) +#define glGetnUniformuivARB GLEW_GET_FUN(__glewGetnUniformuivARB) +#define glReadnPixelsARB GLEW_GET_FUN(__glewReadnPixelsARB) + +#define GLEW_ARB_robustness GLEW_GET_VAR(__GLEW_ARB_robustness) + +#endif /* GL_ARB_robustness */ + +/* ---------------- GL_ARB_robustness_application_isolation ---------------- */ + +#ifndef GL_ARB_robustness_application_isolation +#define GL_ARB_robustness_application_isolation 1 + +#define GLEW_ARB_robustness_application_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_application_isolation) + +#endif /* GL_ARB_robustness_application_isolation */ + +/* ---------------- GL_ARB_robustness_share_group_isolation ---------------- */ + +#ifndef GL_ARB_robustness_share_group_isolation +#define GL_ARB_robustness_share_group_isolation 1 + +#define GLEW_ARB_robustness_share_group_isolation GLEW_GET_VAR(__GLEW_ARB_robustness_share_group_isolation) + +#endif /* GL_ARB_robustness_share_group_isolation */ + +/* ------------------------ GL_ARB_sample_locations ------------------------ */ + +#ifndef GL_ARB_sample_locations +#define GL_ARB_sample_locations 1 + +#define GL_SAMPLE_LOCATION_ARB 0x8E50 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); + +#define glFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewFramebufferSampleLocationsfvARB) +#define glNamedFramebufferSampleLocationsfvARB GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvARB) + +#define GLEW_ARB_sample_locations GLEW_GET_VAR(__GLEW_ARB_sample_locations) + +#endif /* GL_ARB_sample_locations */ + +/* ------------------------- GL_ARB_sample_shading ------------------------- */ + +#ifndef GL_ARB_sample_shading +#define GL_ARB_sample_shading 1 + +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 + +typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value); + +#define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB) + +#define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading) + +#endif /* GL_ARB_sample_shading */ + +/* ------------------------- GL_ARB_sampler_objects ------------------------ */ + +#ifndef GL_ARB_sampler_objects +#define GL_ARB_sampler_objects 1 + +#define GL_SAMPLER_BINDING 0x8919 + +typedef void (GLAPIENTRY * PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (GLAPIENTRY * PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers); +typedef void (GLAPIENTRY * PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISSAMPLERPROC) (GLuint sampler); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint* params); + +#define glBindSampler GLEW_GET_FUN(__glewBindSampler) +#define glDeleteSamplers GLEW_GET_FUN(__glewDeleteSamplers) +#define glGenSamplers GLEW_GET_FUN(__glewGenSamplers) +#define glGetSamplerParameterIiv GLEW_GET_FUN(__glewGetSamplerParameterIiv) +#define glGetSamplerParameterIuiv GLEW_GET_FUN(__glewGetSamplerParameterIuiv) +#define glGetSamplerParameterfv GLEW_GET_FUN(__glewGetSamplerParameterfv) +#define glGetSamplerParameteriv GLEW_GET_FUN(__glewGetSamplerParameteriv) +#define glIsSampler GLEW_GET_FUN(__glewIsSampler) +#define glSamplerParameterIiv GLEW_GET_FUN(__glewSamplerParameterIiv) +#define glSamplerParameterIuiv GLEW_GET_FUN(__glewSamplerParameterIuiv) +#define glSamplerParameterf GLEW_GET_FUN(__glewSamplerParameterf) +#define glSamplerParameterfv GLEW_GET_FUN(__glewSamplerParameterfv) +#define glSamplerParameteri GLEW_GET_FUN(__glewSamplerParameteri) +#define glSamplerParameteriv GLEW_GET_FUN(__glewSamplerParameteriv) + +#define GLEW_ARB_sampler_objects GLEW_GET_VAR(__GLEW_ARB_sampler_objects) + +#endif /* GL_ARB_sampler_objects */ + +/* ------------------------ GL_ARB_seamless_cube_map ----------------------- */ + +#ifndef GL_ARB_seamless_cube_map +#define GL_ARB_seamless_cube_map 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F + +#define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map) + +#endif /* GL_ARB_seamless_cube_map */ + +/* ------------------ GL_ARB_seamless_cubemap_per_texture ------------------ */ + +#ifndef GL_ARB_seamless_cubemap_per_texture +#define GL_ARB_seamless_cubemap_per_texture 1 + +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F + +#define GLEW_ARB_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_ARB_seamless_cubemap_per_texture) + +#endif /* GL_ARB_seamless_cubemap_per_texture */ + +/* --------------------- GL_ARB_separate_shader_objects -------------------- */ + +#ifndef GL_ARB_separate_shader_objects +#define GL_ARB_separate_shader_objects 1 + +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_ALL_SHADER_BITS 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar * const * strings); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint* pipelines); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei* length, GLchar *infoLog); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); + +#define glActiveShaderProgram GLEW_GET_FUN(__glewActiveShaderProgram) +#define glBindProgramPipeline GLEW_GET_FUN(__glewBindProgramPipeline) +#define glCreateShaderProgramv GLEW_GET_FUN(__glewCreateShaderProgramv) +#define glDeleteProgramPipelines GLEW_GET_FUN(__glewDeleteProgramPipelines) +#define glGenProgramPipelines GLEW_GET_FUN(__glewGenProgramPipelines) +#define glGetProgramPipelineInfoLog GLEW_GET_FUN(__glewGetProgramPipelineInfoLog) +#define glGetProgramPipelineiv GLEW_GET_FUN(__glewGetProgramPipelineiv) +#define glIsProgramPipeline GLEW_GET_FUN(__glewIsProgramPipeline) +#define glProgramUniform1d GLEW_GET_FUN(__glewProgramUniform1d) +#define glProgramUniform1dv GLEW_GET_FUN(__glewProgramUniform1dv) +#define glProgramUniform1f GLEW_GET_FUN(__glewProgramUniform1f) +#define glProgramUniform1fv GLEW_GET_FUN(__glewProgramUniform1fv) +#define glProgramUniform1i GLEW_GET_FUN(__glewProgramUniform1i) +#define glProgramUniform1iv GLEW_GET_FUN(__glewProgramUniform1iv) +#define glProgramUniform1ui GLEW_GET_FUN(__glewProgramUniform1ui) +#define glProgramUniform1uiv GLEW_GET_FUN(__glewProgramUniform1uiv) +#define glProgramUniform2d GLEW_GET_FUN(__glewProgramUniform2d) +#define glProgramUniform2dv GLEW_GET_FUN(__glewProgramUniform2dv) +#define glProgramUniform2f GLEW_GET_FUN(__glewProgramUniform2f) +#define glProgramUniform2fv GLEW_GET_FUN(__glewProgramUniform2fv) +#define glProgramUniform2i GLEW_GET_FUN(__glewProgramUniform2i) +#define glProgramUniform2iv GLEW_GET_FUN(__glewProgramUniform2iv) +#define glProgramUniform2ui GLEW_GET_FUN(__glewProgramUniform2ui) +#define glProgramUniform2uiv GLEW_GET_FUN(__glewProgramUniform2uiv) +#define glProgramUniform3d GLEW_GET_FUN(__glewProgramUniform3d) +#define glProgramUniform3dv GLEW_GET_FUN(__glewProgramUniform3dv) +#define glProgramUniform3f GLEW_GET_FUN(__glewProgramUniform3f) +#define glProgramUniform3fv GLEW_GET_FUN(__glewProgramUniform3fv) +#define glProgramUniform3i GLEW_GET_FUN(__glewProgramUniform3i) +#define glProgramUniform3iv GLEW_GET_FUN(__glewProgramUniform3iv) +#define glProgramUniform3ui GLEW_GET_FUN(__glewProgramUniform3ui) +#define glProgramUniform3uiv GLEW_GET_FUN(__glewProgramUniform3uiv) +#define glProgramUniform4d GLEW_GET_FUN(__glewProgramUniform4d) +#define glProgramUniform4dv GLEW_GET_FUN(__glewProgramUniform4dv) +#define glProgramUniform4f GLEW_GET_FUN(__glewProgramUniform4f) +#define glProgramUniform4fv GLEW_GET_FUN(__glewProgramUniform4fv) +#define glProgramUniform4i GLEW_GET_FUN(__glewProgramUniform4i) +#define glProgramUniform4iv GLEW_GET_FUN(__glewProgramUniform4iv) +#define glProgramUniform4ui GLEW_GET_FUN(__glewProgramUniform4ui) +#define glProgramUniform4uiv GLEW_GET_FUN(__glewProgramUniform4uiv) +#define glProgramUniformMatrix2dv GLEW_GET_FUN(__glewProgramUniformMatrix2dv) +#define glProgramUniformMatrix2fv GLEW_GET_FUN(__glewProgramUniformMatrix2fv) +#define glProgramUniformMatrix2x3dv GLEW_GET_FUN(__glewProgramUniformMatrix2x3dv) +#define glProgramUniformMatrix2x3fv GLEW_GET_FUN(__glewProgramUniformMatrix2x3fv) +#define glProgramUniformMatrix2x4dv GLEW_GET_FUN(__glewProgramUniformMatrix2x4dv) +#define glProgramUniformMatrix2x4fv GLEW_GET_FUN(__glewProgramUniformMatrix2x4fv) +#define glProgramUniformMatrix3dv GLEW_GET_FUN(__glewProgramUniformMatrix3dv) +#define glProgramUniformMatrix3fv GLEW_GET_FUN(__glewProgramUniformMatrix3fv) +#define glProgramUniformMatrix3x2dv GLEW_GET_FUN(__glewProgramUniformMatrix3x2dv) +#define glProgramUniformMatrix3x2fv GLEW_GET_FUN(__glewProgramUniformMatrix3x2fv) +#define glProgramUniformMatrix3x4dv GLEW_GET_FUN(__glewProgramUniformMatrix3x4dv) +#define glProgramUniformMatrix3x4fv GLEW_GET_FUN(__glewProgramUniformMatrix3x4fv) +#define glProgramUniformMatrix4dv GLEW_GET_FUN(__glewProgramUniformMatrix4dv) +#define glProgramUniformMatrix4fv GLEW_GET_FUN(__glewProgramUniformMatrix4fv) +#define glProgramUniformMatrix4x2dv GLEW_GET_FUN(__glewProgramUniformMatrix4x2dv) +#define glProgramUniformMatrix4x2fv GLEW_GET_FUN(__glewProgramUniformMatrix4x2fv) +#define glProgramUniformMatrix4x3dv GLEW_GET_FUN(__glewProgramUniformMatrix4x3dv) +#define glProgramUniformMatrix4x3fv GLEW_GET_FUN(__glewProgramUniformMatrix4x3fv) +#define glUseProgramStages GLEW_GET_FUN(__glewUseProgramStages) +#define glValidateProgramPipeline GLEW_GET_FUN(__glewValidateProgramPipeline) + +#define GLEW_ARB_separate_shader_objects GLEW_GET_VAR(__GLEW_ARB_separate_shader_objects) + +#endif /* GL_ARB_separate_shader_objects */ + +/* -------------------- GL_ARB_shader_atomic_counter_ops ------------------- */ + +#ifndef GL_ARB_shader_atomic_counter_ops +#define GL_ARB_shader_atomic_counter_ops 1 + +#define GLEW_ARB_shader_atomic_counter_ops GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counter_ops) + +#endif /* GL_ARB_shader_atomic_counter_ops */ + +/* --------------------- GL_ARB_shader_atomic_counters --------------------- */ + +#ifndef GL_ARB_shader_atomic_counters +#define GL_ARB_shader_atomic_counters 1 + +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC + +typedef void (GLAPIENTRY * PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint* params); + +#define glGetActiveAtomicCounterBufferiv GLEW_GET_FUN(__glewGetActiveAtomicCounterBufferiv) + +#define GLEW_ARB_shader_atomic_counters GLEW_GET_VAR(__GLEW_ARB_shader_atomic_counters) + +#endif /* GL_ARB_shader_atomic_counters */ + +/* -------------------------- GL_ARB_shader_ballot ------------------------- */ + +#ifndef GL_ARB_shader_ballot +#define GL_ARB_shader_ballot 1 + +#define GLEW_ARB_shader_ballot GLEW_GET_VAR(__GLEW_ARB_shader_ballot) + +#endif /* GL_ARB_shader_ballot */ + +/* ----------------------- GL_ARB_shader_bit_encoding ---------------------- */ + +#ifndef GL_ARB_shader_bit_encoding +#define GL_ARB_shader_bit_encoding 1 + +#define GLEW_ARB_shader_bit_encoding GLEW_GET_VAR(__GLEW_ARB_shader_bit_encoding) + +#endif /* GL_ARB_shader_bit_encoding */ + +/* -------------------------- GL_ARB_shader_clock -------------------------- */ + +#ifndef GL_ARB_shader_clock +#define GL_ARB_shader_clock 1 + +#define GLEW_ARB_shader_clock GLEW_GET_VAR(__GLEW_ARB_shader_clock) + +#endif /* GL_ARB_shader_clock */ + +/* --------------------- GL_ARB_shader_draw_parameters --------------------- */ + +#ifndef GL_ARB_shader_draw_parameters +#define GL_ARB_shader_draw_parameters 1 + +#define GLEW_ARB_shader_draw_parameters GLEW_GET_VAR(__GLEW_ARB_shader_draw_parameters) + +#endif /* GL_ARB_shader_draw_parameters */ + +/* ------------------------ GL_ARB_shader_group_vote ----------------------- */ + +#ifndef GL_ARB_shader_group_vote +#define GL_ARB_shader_group_vote 1 + +#define GLEW_ARB_shader_group_vote GLEW_GET_VAR(__GLEW_ARB_shader_group_vote) + +#endif /* GL_ARB_shader_group_vote */ + +/* --------------------- GL_ARB_shader_image_load_store -------------------- */ + +#ifndef GL_ARB_shader_image_load_store +#define GL_ARB_shader_image_load_store 1 + +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_COMMAND_BARRIER_BIT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (GLAPIENTRY * PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); + +#define glBindImageTexture GLEW_GET_FUN(__glewBindImageTexture) +#define glMemoryBarrier GLEW_GET_FUN(__glewMemoryBarrier) + +#define GLEW_ARB_shader_image_load_store GLEW_GET_VAR(__GLEW_ARB_shader_image_load_store) + +#endif /* GL_ARB_shader_image_load_store */ + +/* ------------------------ GL_ARB_shader_image_size ----------------------- */ + +#ifndef GL_ARB_shader_image_size +#define GL_ARB_shader_image_size 1 + +#define GLEW_ARB_shader_image_size GLEW_GET_VAR(__GLEW_ARB_shader_image_size) + +#endif /* GL_ARB_shader_image_size */ + +/* ------------------------- GL_ARB_shader_objects ------------------------- */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 + +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 + +typedef char GLcharARB; +typedef unsigned int GLhandleARB; + +typedef void (GLAPIENTRY * PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef GLhandleARB (GLAPIENTRY * PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (GLAPIENTRY * PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef void (GLAPIENTRY * PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (GLAPIENTRY * PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB *obj); +typedef GLhandleARB (GLAPIENTRY * PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *infoLog); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB *source); +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint* params); +typedef void (GLAPIENTRY * PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB ** string, const GLint *length); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); + +#define glAttachObjectARB GLEW_GET_FUN(__glewAttachObjectARB) +#define glCompileShaderARB GLEW_GET_FUN(__glewCompileShaderARB) +#define glCreateProgramObjectARB GLEW_GET_FUN(__glewCreateProgramObjectARB) +#define glCreateShaderObjectARB GLEW_GET_FUN(__glewCreateShaderObjectARB) +#define glDeleteObjectARB GLEW_GET_FUN(__glewDeleteObjectARB) +#define glDetachObjectARB GLEW_GET_FUN(__glewDetachObjectARB) +#define glGetActiveUniformARB GLEW_GET_FUN(__glewGetActiveUniformARB) +#define glGetAttachedObjectsARB GLEW_GET_FUN(__glewGetAttachedObjectsARB) +#define glGetHandleARB GLEW_GET_FUN(__glewGetHandleARB) +#define glGetInfoLogARB GLEW_GET_FUN(__glewGetInfoLogARB) +#define glGetObjectParameterfvARB GLEW_GET_FUN(__glewGetObjectParameterfvARB) +#define glGetObjectParameterivARB GLEW_GET_FUN(__glewGetObjectParameterivARB) +#define glGetShaderSourceARB GLEW_GET_FUN(__glewGetShaderSourceARB) +#define glGetUniformLocationARB GLEW_GET_FUN(__glewGetUniformLocationARB) +#define glGetUniformfvARB GLEW_GET_FUN(__glewGetUniformfvARB) +#define glGetUniformivARB GLEW_GET_FUN(__glewGetUniformivARB) +#define glLinkProgramARB GLEW_GET_FUN(__glewLinkProgramARB) +#define glShaderSourceARB GLEW_GET_FUN(__glewShaderSourceARB) +#define glUniform1fARB GLEW_GET_FUN(__glewUniform1fARB) +#define glUniform1fvARB GLEW_GET_FUN(__glewUniform1fvARB) +#define glUniform1iARB GLEW_GET_FUN(__glewUniform1iARB) +#define glUniform1ivARB GLEW_GET_FUN(__glewUniform1ivARB) +#define glUniform2fARB GLEW_GET_FUN(__glewUniform2fARB) +#define glUniform2fvARB GLEW_GET_FUN(__glewUniform2fvARB) +#define glUniform2iARB GLEW_GET_FUN(__glewUniform2iARB) +#define glUniform2ivARB GLEW_GET_FUN(__glewUniform2ivARB) +#define glUniform3fARB GLEW_GET_FUN(__glewUniform3fARB) +#define glUniform3fvARB GLEW_GET_FUN(__glewUniform3fvARB) +#define glUniform3iARB GLEW_GET_FUN(__glewUniform3iARB) +#define glUniform3ivARB GLEW_GET_FUN(__glewUniform3ivARB) +#define glUniform4fARB GLEW_GET_FUN(__glewUniform4fARB) +#define glUniform4fvARB GLEW_GET_FUN(__glewUniform4fvARB) +#define glUniform4iARB GLEW_GET_FUN(__glewUniform4iARB) +#define glUniform4ivARB GLEW_GET_FUN(__glewUniform4ivARB) +#define glUniformMatrix2fvARB GLEW_GET_FUN(__glewUniformMatrix2fvARB) +#define glUniformMatrix3fvARB GLEW_GET_FUN(__glewUniformMatrix3fvARB) +#define glUniformMatrix4fvARB GLEW_GET_FUN(__glewUniformMatrix4fvARB) +#define glUseProgramObjectARB GLEW_GET_FUN(__glewUseProgramObjectARB) +#define glValidateProgramARB GLEW_GET_FUN(__glewValidateProgramARB) + +#define GLEW_ARB_shader_objects GLEW_GET_VAR(__GLEW_ARB_shader_objects) + +#endif /* GL_ARB_shader_objects */ + +/* ------------------------ GL_ARB_shader_precision ------------------------ */ + +#ifndef GL_ARB_shader_precision +#define GL_ARB_shader_precision 1 + +#define GLEW_ARB_shader_precision GLEW_GET_VAR(__GLEW_ARB_shader_precision) + +#endif /* GL_ARB_shader_precision */ + +/* ---------------------- GL_ARB_shader_stencil_export --------------------- */ + +#ifndef GL_ARB_shader_stencil_export +#define GL_ARB_shader_stencil_export 1 + +#define GLEW_ARB_shader_stencil_export GLEW_GET_VAR(__GLEW_ARB_shader_stencil_export) + +#endif /* GL_ARB_shader_stencil_export */ + +/* ------------------ GL_ARB_shader_storage_buffer_object ------------------ */ + +#ifndef GL_ARB_shader_storage_buffer_object +#define GL_ARB_shader_storage_buffer_object 1 + +#define GL_SHADER_STORAGE_BARRIER_BIT 0x2000 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF + +typedef void (GLAPIENTRY * PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); + +#define glShaderStorageBlockBinding GLEW_GET_FUN(__glewShaderStorageBlockBinding) + +#define GLEW_ARB_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_ARB_shader_storage_buffer_object) + +#endif /* GL_ARB_shader_storage_buffer_object */ + +/* ------------------------ GL_ARB_shader_subroutine ----------------------- */ + +#ifndef GL_ARB_shader_subroutine +#define GL_ARB_shader_subroutine 1 + +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B + +typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint* values); +typedef GLuint (GLAPIENTRY * PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar* name); +typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint* params); +typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint* indices); + +#define glGetActiveSubroutineName GLEW_GET_FUN(__glewGetActiveSubroutineName) +#define glGetActiveSubroutineUniformName GLEW_GET_FUN(__glewGetActiveSubroutineUniformName) +#define glGetActiveSubroutineUniformiv GLEW_GET_FUN(__glewGetActiveSubroutineUniformiv) +#define glGetProgramStageiv GLEW_GET_FUN(__glewGetProgramStageiv) +#define glGetSubroutineIndex GLEW_GET_FUN(__glewGetSubroutineIndex) +#define glGetSubroutineUniformLocation GLEW_GET_FUN(__glewGetSubroutineUniformLocation) +#define glGetUniformSubroutineuiv GLEW_GET_FUN(__glewGetUniformSubroutineuiv) +#define glUniformSubroutinesuiv GLEW_GET_FUN(__glewUniformSubroutinesuiv) + +#define GLEW_ARB_shader_subroutine GLEW_GET_VAR(__GLEW_ARB_shader_subroutine) + +#endif /* GL_ARB_shader_subroutine */ + +/* ------------------ GL_ARB_shader_texture_image_samples ------------------ */ + +#ifndef GL_ARB_shader_texture_image_samples +#define GL_ARB_shader_texture_image_samples 1 + +#define GLEW_ARB_shader_texture_image_samples GLEW_GET_VAR(__GLEW_ARB_shader_texture_image_samples) + +#endif /* GL_ARB_shader_texture_image_samples */ + +/* ----------------------- GL_ARB_shader_texture_lod ----------------------- */ + +#ifndef GL_ARB_shader_texture_lod +#define GL_ARB_shader_texture_lod 1 + +#define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod) + +#endif /* GL_ARB_shader_texture_lod */ + +/* ------------------- GL_ARB_shader_viewport_layer_array ------------------ */ + +#ifndef GL_ARB_shader_viewport_layer_array +#define GL_ARB_shader_viewport_layer_array 1 + +#define GLEW_ARB_shader_viewport_layer_array GLEW_GET_VAR(__GLEW_ARB_shader_viewport_layer_array) + +#endif /* GL_ARB_shader_viewport_layer_array */ + +/* ---------------------- GL_ARB_shading_language_100 ---------------------- */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 + +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C + +#define GLEW_ARB_shading_language_100 GLEW_GET_VAR(__GLEW_ARB_shading_language_100) + +#endif /* GL_ARB_shading_language_100 */ + +/* -------------------- GL_ARB_shading_language_420pack -------------------- */ + +#ifndef GL_ARB_shading_language_420pack +#define GL_ARB_shading_language_420pack 1 + +#define GLEW_ARB_shading_language_420pack GLEW_GET_VAR(__GLEW_ARB_shading_language_420pack) + +#endif /* GL_ARB_shading_language_420pack */ + +/* -------------------- GL_ARB_shading_language_include -------------------- */ + +#ifndef GL_ARB_shading_language_include +#define GL_ARB_shading_language_include 1 + +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA + +typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar* const *path, const GLint *length); +typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name, GLsizei bufSize, GLint *stringlen, GLchar *string); +typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar* name, GLenum pname, GLint *params); +typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar* name); +typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar *string); + +#define glCompileShaderIncludeARB GLEW_GET_FUN(__glewCompileShaderIncludeARB) +#define glDeleteNamedStringARB GLEW_GET_FUN(__glewDeleteNamedStringARB) +#define glGetNamedStringARB GLEW_GET_FUN(__glewGetNamedStringARB) +#define glGetNamedStringivARB GLEW_GET_FUN(__glewGetNamedStringivARB) +#define glIsNamedStringARB GLEW_GET_FUN(__glewIsNamedStringARB) +#define glNamedStringARB GLEW_GET_FUN(__glewNamedStringARB) + +#define GLEW_ARB_shading_language_include GLEW_GET_VAR(__GLEW_ARB_shading_language_include) + +#endif /* GL_ARB_shading_language_include */ + +/* -------------------- GL_ARB_shading_language_packing -------------------- */ + +#ifndef GL_ARB_shading_language_packing +#define GL_ARB_shading_language_packing 1 + +#define GLEW_ARB_shading_language_packing GLEW_GET_VAR(__GLEW_ARB_shading_language_packing) + +#endif /* GL_ARB_shading_language_packing */ + +/* ----------------------------- GL_ARB_shadow ----------------------------- */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 + +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E + +#define GLEW_ARB_shadow GLEW_GET_VAR(__GLEW_ARB_shadow) + +#endif /* GL_ARB_shadow */ + +/* ------------------------- GL_ARB_shadow_ambient ------------------------- */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 + +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF + +#define GLEW_ARB_shadow_ambient GLEW_GET_VAR(__GLEW_ARB_shadow_ambient) + +#endif /* GL_ARB_shadow_ambient */ + +/* -------------------------- GL_ARB_sparse_buffer ------------------------- */ + +#ifndef GL_ARB_sparse_buffer +#define GL_ARB_sparse_buffer 1 + +#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 +#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 + +typedef void (GLAPIENTRY * PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); + +#define glBufferPageCommitmentARB GLEW_GET_FUN(__glewBufferPageCommitmentARB) + +#define GLEW_ARB_sparse_buffer GLEW_GET_VAR(__GLEW_ARB_sparse_buffer) + +#endif /* GL_ARB_sparse_buffer */ + +/* ------------------------- GL_ARB_sparse_texture ------------------------- */ + +#ifndef GL_ARB_sparse_texture +#define GL_ARB_sparse_texture 1 + +#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A +#define GL_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA + +typedef void (GLAPIENTRY * PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (GLAPIENTRY * PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); + +#define glTexPageCommitmentARB GLEW_GET_FUN(__glewTexPageCommitmentARB) +#define glTexturePageCommitmentEXT GLEW_GET_FUN(__glewTexturePageCommitmentEXT) + +#define GLEW_ARB_sparse_texture GLEW_GET_VAR(__GLEW_ARB_sparse_texture) + +#endif /* GL_ARB_sparse_texture */ + +/* ------------------------- GL_ARB_sparse_texture2 ------------------------ */ + +#ifndef GL_ARB_sparse_texture2 +#define GL_ARB_sparse_texture2 1 + +#define GLEW_ARB_sparse_texture2 GLEW_GET_VAR(__GLEW_ARB_sparse_texture2) + +#endif /* GL_ARB_sparse_texture2 */ + +/* ---------------------- GL_ARB_sparse_texture_clamp ---------------------- */ + +#ifndef GL_ARB_sparse_texture_clamp +#define GL_ARB_sparse_texture_clamp 1 + +#define GLEW_ARB_sparse_texture_clamp GLEW_GET_VAR(__GLEW_ARB_sparse_texture_clamp) + +#endif /* GL_ARB_sparse_texture_clamp */ + +/* ------------------------ GL_ARB_stencil_texturing ----------------------- */ + +#ifndef GL_ARB_stencil_texturing +#define GL_ARB_stencil_texturing 1 + +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA + +#define GLEW_ARB_stencil_texturing GLEW_GET_VAR(__GLEW_ARB_stencil_texturing) + +#endif /* GL_ARB_stencil_texturing */ + +/* ------------------------------ GL_ARB_sync ------------------------------ */ + +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 + +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF + +typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); +typedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync); +typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags); +typedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values); +typedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync); +typedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout); + +#define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync) +#define glDeleteSync GLEW_GET_FUN(__glewDeleteSync) +#define glFenceSync GLEW_GET_FUN(__glewFenceSync) +#define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v) +#define glGetSynciv GLEW_GET_FUN(__glewGetSynciv) +#define glIsSync GLEW_GET_FUN(__glewIsSync) +#define glWaitSync GLEW_GET_FUN(__glewWaitSync) + +#define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync) + +#endif /* GL_ARB_sync */ + +/* ----------------------- GL_ARB_tessellation_shader ---------------------- */ + +#ifndef GL_ARB_tessellation_shader +#define GL_ARB_tessellation_shader 1 + +#define GL_PATCHES 0xE +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_ISOLINES 0x8E7A +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A + +typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat* values); +typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); + +#define glPatchParameterfv GLEW_GET_FUN(__glewPatchParameterfv) +#define glPatchParameteri GLEW_GET_FUN(__glewPatchParameteri) + +#define GLEW_ARB_tessellation_shader GLEW_GET_VAR(__GLEW_ARB_tessellation_shader) + +#endif /* GL_ARB_tessellation_shader */ + +/* ------------------------- GL_ARB_texture_barrier ------------------------ */ + +#ifndef GL_ARB_texture_barrier +#define GL_ARB_texture_barrier 1 + +typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERPROC) (void); + +#define glTextureBarrier GLEW_GET_FUN(__glewTextureBarrier) + +#define GLEW_ARB_texture_barrier GLEW_GET_VAR(__GLEW_ARB_texture_barrier) + +#endif /* GL_ARB_texture_barrier */ + +/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_ARB 0x812D + +#define GLEW_ARB_texture_border_clamp GLEW_GET_VAR(__GLEW_ARB_texture_border_clamp) + +#endif /* GL_ARB_texture_border_clamp */ + +/* ---------------------- GL_ARB_texture_buffer_object --------------------- */ + +#ifndef GL_ARB_texture_buffer_object +#define GL_ARB_texture_buffer_object 1 + +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E + +typedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); + +#define glTexBufferARB GLEW_GET_FUN(__glewTexBufferARB) + +#define GLEW_ARB_texture_buffer_object GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object) + +#endif /* GL_ARB_texture_buffer_object */ + +/* ------------------- GL_ARB_texture_buffer_object_rgb32 ------------------ */ + +#ifndef GL_ARB_texture_buffer_object_rgb32 +#define GL_ARB_texture_buffer_object_rgb32 1 + +#define GLEW_ARB_texture_buffer_object_rgb32 GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object_rgb32) + +#endif /* GL_ARB_texture_buffer_object_rgb32 */ + +/* ---------------------- GL_ARB_texture_buffer_range ---------------------- */ + +#ifndef GL_ARB_texture_buffer_range +#define GL_ARB_texture_buffer_range 1 + +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F + +typedef void (GLAPIENTRY * PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); + +#define glTexBufferRange GLEW_GET_FUN(__glewTexBufferRange) +#define glTextureBufferRangeEXT GLEW_GET_FUN(__glewTextureBufferRangeEXT) + +#define GLEW_ARB_texture_buffer_range GLEW_GET_VAR(__GLEW_ARB_texture_buffer_range) + +#endif /* GL_ARB_texture_buffer_range */ + +/* ----------------------- GL_ARB_texture_compression ---------------------- */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 + +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 + +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, void *img); + +#define glCompressedTexImage1DARB GLEW_GET_FUN(__glewCompressedTexImage1DARB) +#define glCompressedTexImage2DARB GLEW_GET_FUN(__glewCompressedTexImage2DARB) +#define glCompressedTexImage3DARB GLEW_GET_FUN(__glewCompressedTexImage3DARB) +#define glCompressedTexSubImage1DARB GLEW_GET_FUN(__glewCompressedTexSubImage1DARB) +#define glCompressedTexSubImage2DARB GLEW_GET_FUN(__glewCompressedTexSubImage2DARB) +#define glCompressedTexSubImage3DARB GLEW_GET_FUN(__glewCompressedTexSubImage3DARB) +#define glGetCompressedTexImageARB GLEW_GET_FUN(__glewGetCompressedTexImageARB) + +#define GLEW_ARB_texture_compression GLEW_GET_VAR(__GLEW_ARB_texture_compression) + +#endif /* GL_ARB_texture_compression */ + +/* -------------------- GL_ARB_texture_compression_bptc -------------------- */ + +#ifndef GL_ARB_texture_compression_bptc +#define GL_ARB_texture_compression_bptc 1 + +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F + +#define GLEW_ARB_texture_compression_bptc GLEW_GET_VAR(__GLEW_ARB_texture_compression_bptc) + +#endif /* GL_ARB_texture_compression_bptc */ + +/* -------------------- GL_ARB_texture_compression_rgtc -------------------- */ + +#ifndef GL_ARB_texture_compression_rgtc +#define GL_ARB_texture_compression_rgtc 1 + +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE + +#define GLEW_ARB_texture_compression_rgtc GLEW_GET_VAR(__GLEW_ARB_texture_compression_rgtc) + +#endif /* GL_ARB_texture_compression_rgtc */ + +/* ------------------------ GL_ARB_texture_cube_map ------------------------ */ + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 + +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C + +#define GLEW_ARB_texture_cube_map GLEW_GET_VAR(__GLEW_ARB_texture_cube_map) + +#endif /* GL_ARB_texture_cube_map */ + +/* --------------------- GL_ARB_texture_cube_map_array --------------------- */ + +#ifndef GL_ARB_texture_cube_map_array +#define GL_ARB_texture_cube_map_array 1 + +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F + +#define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array) + +#endif /* GL_ARB_texture_cube_map_array */ + +/* ------------------------- GL_ARB_texture_env_add ------------------------ */ + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 + +#define GLEW_ARB_texture_env_add GLEW_GET_VAR(__GLEW_ARB_texture_env_add) + +#endif /* GL_ARB_texture_env_add */ + +/* ----------------------- GL_ARB_texture_env_combine ---------------------- */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 + +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A + +#define GLEW_ARB_texture_env_combine GLEW_GET_VAR(__GLEW_ARB_texture_env_combine) + +#endif /* GL_ARB_texture_env_combine */ + +/* ---------------------- GL_ARB_texture_env_crossbar ---------------------- */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 + +#define GLEW_ARB_texture_env_crossbar GLEW_GET_VAR(__GLEW_ARB_texture_env_crossbar) + +#endif /* GL_ARB_texture_env_crossbar */ + +/* ------------------------ GL_ARB_texture_env_dot3 ------------------------ */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 + +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF + +#define GLEW_ARB_texture_env_dot3 GLEW_GET_VAR(__GLEW_ARB_texture_env_dot3) + +#endif /* GL_ARB_texture_env_dot3 */ + +/* ---------------------- GL_ARB_texture_filter_minmax --------------------- */ + +#ifndef GL_ARB_texture_filter_minmax +#define GL_ARB_texture_filter_minmax 1 + +#define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 +#define GL_WEIGHTED_AVERAGE_ARB 0x9367 + +#define GLEW_ARB_texture_filter_minmax GLEW_GET_VAR(__GLEW_ARB_texture_filter_minmax) + +#endif /* GL_ARB_texture_filter_minmax */ + +/* -------------------------- GL_ARB_texture_float ------------------------- */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 + +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 + +#define GLEW_ARB_texture_float GLEW_GET_VAR(__GLEW_ARB_texture_float) + +#endif /* GL_ARB_texture_float */ + +/* ------------------------- GL_ARB_texture_gather ------------------------- */ + +#ifndef GL_ARB_texture_gather +#define GL_ARB_texture_gather 1 + +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F + +#define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather) + +#endif /* GL_ARB_texture_gather */ + +/* ------------------ GL_ARB_texture_mirror_clamp_to_edge ------------------ */ + +#ifndef GL_ARB_texture_mirror_clamp_to_edge +#define GL_ARB_texture_mirror_clamp_to_edge 1 + +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 + +#define GLEW_ARB_texture_mirror_clamp_to_edge GLEW_GET_VAR(__GLEW_ARB_texture_mirror_clamp_to_edge) + +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + +/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_ARB 0x8370 + +#define GLEW_ARB_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_ARB_texture_mirrored_repeat) + +#endif /* GL_ARB_texture_mirrored_repeat */ + +/* ----------------------- GL_ARB_texture_multisample ---------------------- */ + +#ifndef GL_ARB_texture_multisample +#define GL_ARB_texture_multisample 1 + +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 + +typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val); +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + +#define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv) +#define glSampleMaski GLEW_GET_FUN(__glewSampleMaski) +#define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample) +#define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample) + +#define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample) + +#endif /* GL_ARB_texture_multisample */ + +/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 + +#define GLEW_ARB_texture_non_power_of_two GLEW_GET_VAR(__GLEW_ARB_texture_non_power_of_two) + +#endif /* GL_ARB_texture_non_power_of_two */ + +/* ---------------------- GL_ARB_texture_query_levels ---------------------- */ + +#ifndef GL_ARB_texture_query_levels +#define GL_ARB_texture_query_levels 1 + +#define GLEW_ARB_texture_query_levels GLEW_GET_VAR(__GLEW_ARB_texture_query_levels) + +#endif /* GL_ARB_texture_query_levels */ + +/* ------------------------ GL_ARB_texture_query_lod ----------------------- */ + +#ifndef GL_ARB_texture_query_lod +#define GL_ARB_texture_query_lod 1 + +#define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod) + +#endif /* GL_ARB_texture_query_lod */ + +/* ------------------------ GL_ARB_texture_rectangle ----------------------- */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 + +#define GLEW_ARB_texture_rectangle GLEW_GET_VAR(__GLEW_ARB_texture_rectangle) + +#endif /* GL_ARB_texture_rectangle */ + +/* --------------------------- GL_ARB_texture_rg --------------------------- */ + +#ifndef GL_ARB_texture_rg +#define GL_ARB_texture_rg 1 + +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822A +#define GL_RG8 0x822B +#define GL_RG16 0x822C +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C + +#define GLEW_ARB_texture_rg GLEW_GET_VAR(__GLEW_ARB_texture_rg) + +#endif /* GL_ARB_texture_rg */ + +/* ----------------------- GL_ARB_texture_rgb10_a2ui ----------------------- */ + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_ARB_texture_rgb10_a2ui 1 + +#define GL_RGB10_A2UI 0x906F + +#define GLEW_ARB_texture_rgb10_a2ui GLEW_GET_VAR(__GLEW_ARB_texture_rgb10_a2ui) + +#endif /* GL_ARB_texture_rgb10_a2ui */ + +/* ------------------------ GL_ARB_texture_stencil8 ------------------------ */ + +#ifndef GL_ARB_texture_stencil8 +#define GL_ARB_texture_stencil8 1 + +#define GL_STENCIL_INDEX 0x1901 +#define GL_STENCIL_INDEX8 0x8D48 + +#define GLEW_ARB_texture_stencil8 GLEW_GET_VAR(__GLEW_ARB_texture_stencil8) + +#endif /* GL_ARB_texture_stencil8 */ + +/* ------------------------- GL_ARB_texture_storage ------------------------ */ + +#ifndef GL_ARB_texture_storage +#define GL_ARB_texture_storage 1 + +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); + +#define glTexStorage1D GLEW_GET_FUN(__glewTexStorage1D) +#define glTexStorage2D GLEW_GET_FUN(__glewTexStorage2D) +#define glTexStorage3D GLEW_GET_FUN(__glewTexStorage3D) +#define glTextureStorage1DEXT GLEW_GET_FUN(__glewTextureStorage1DEXT) +#define glTextureStorage2DEXT GLEW_GET_FUN(__glewTextureStorage2DEXT) +#define glTextureStorage3DEXT GLEW_GET_FUN(__glewTextureStorage3DEXT) + +#define GLEW_ARB_texture_storage GLEW_GET_VAR(__GLEW_ARB_texture_storage) + +#endif /* GL_ARB_texture_storage */ + +/* ------------------- GL_ARB_texture_storage_multisample ------------------ */ + +#ifndef GL_ARB_texture_storage_multisample +#define GL_ARB_texture_storage_multisample 1 + +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAPIENTRY * PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); + +#define glTexStorage2DMultisample GLEW_GET_FUN(__glewTexStorage2DMultisample) +#define glTexStorage3DMultisample GLEW_GET_FUN(__glewTexStorage3DMultisample) +#define glTextureStorage2DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage2DMultisampleEXT) +#define glTextureStorage3DMultisampleEXT GLEW_GET_FUN(__glewTextureStorage3DMultisampleEXT) + +#define GLEW_ARB_texture_storage_multisample GLEW_GET_VAR(__GLEW_ARB_texture_storage_multisample) + +#endif /* GL_ARB_texture_storage_multisample */ + +/* ------------------------- GL_ARB_texture_swizzle ------------------------ */ + +#ifndef GL_ARB_texture_swizzle +#define GL_ARB_texture_swizzle 1 + +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 + +#define GLEW_ARB_texture_swizzle GLEW_GET_VAR(__GLEW_ARB_texture_swizzle) + +#endif /* GL_ARB_texture_swizzle */ + +/* -------------------------- GL_ARB_texture_view -------------------------- */ + +#ifndef GL_ARB_texture_view +#define GL_ARB_texture_view 1 + +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF + +typedef void (GLAPIENTRY * PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); + +#define glTextureView GLEW_GET_FUN(__glewTextureView) + +#define GLEW_ARB_texture_view GLEW_GET_VAR(__GLEW_ARB_texture_view) + +#endif /* GL_ARB_texture_view */ + +/* --------------------------- GL_ARB_timer_query -------------------------- */ + +#ifndef GL_ARB_timer_query +#define GL_ARB_timer_query 1 + +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIMESTAMP 0x8E28 + +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params); +typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); + +#define glGetQueryObjecti64v GLEW_GET_FUN(__glewGetQueryObjecti64v) +#define glGetQueryObjectui64v GLEW_GET_FUN(__glewGetQueryObjectui64v) +#define glQueryCounter GLEW_GET_FUN(__glewQueryCounter) + +#define GLEW_ARB_timer_query GLEW_GET_VAR(__GLEW_ARB_timer_query) + +#endif /* GL_ARB_timer_query */ + +/* ----------------------- GL_ARB_transform_feedback2 ---------------------- */ + +#ifndef GL_ARB_transform_feedback2 +#define GL_ARB_transform_feedback2 1 + +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 + +typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); +typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids); +typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); + +#define glBindTransformFeedback GLEW_GET_FUN(__glewBindTransformFeedback) +#define glDeleteTransformFeedbacks GLEW_GET_FUN(__glewDeleteTransformFeedbacks) +#define glDrawTransformFeedback GLEW_GET_FUN(__glewDrawTransformFeedback) +#define glGenTransformFeedbacks GLEW_GET_FUN(__glewGenTransformFeedbacks) +#define glIsTransformFeedback GLEW_GET_FUN(__glewIsTransformFeedback) +#define glPauseTransformFeedback GLEW_GET_FUN(__glewPauseTransformFeedback) +#define glResumeTransformFeedback GLEW_GET_FUN(__glewResumeTransformFeedback) + +#define GLEW_ARB_transform_feedback2 GLEW_GET_VAR(__GLEW_ARB_transform_feedback2) + +#endif /* GL_ARB_transform_feedback2 */ + +/* ----------------------- GL_ARB_transform_feedback3 ---------------------- */ + +#ifndef GL_ARB_transform_feedback3 +#define GL_ARB_transform_feedback3 1 + +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +#define GL_MAX_VERTEX_STREAMS 0x8E71 + +typedef void (GLAPIENTRY * PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (GLAPIENTRY * PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); + +#define glBeginQueryIndexed GLEW_GET_FUN(__glewBeginQueryIndexed) +#define glDrawTransformFeedbackStream GLEW_GET_FUN(__glewDrawTransformFeedbackStream) +#define glEndQueryIndexed GLEW_GET_FUN(__glewEndQueryIndexed) +#define glGetQueryIndexediv GLEW_GET_FUN(__glewGetQueryIndexediv) + +#define GLEW_ARB_transform_feedback3 GLEW_GET_VAR(__GLEW_ARB_transform_feedback3) + +#endif /* GL_ARB_transform_feedback3 */ + +/* ------------------ GL_ARB_transform_feedback_instanced ------------------ */ + +#ifndef GL_ARB_transform_feedback_instanced +#define GL_ARB_transform_feedback_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei primcount); + +#define glDrawTransformFeedbackInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackInstanced) +#define glDrawTransformFeedbackStreamInstanced GLEW_GET_FUN(__glewDrawTransformFeedbackStreamInstanced) + +#define GLEW_ARB_transform_feedback_instanced GLEW_GET_VAR(__GLEW_ARB_transform_feedback_instanced) + +#endif /* GL_ARB_transform_feedback_instanced */ + +/* ---------------- GL_ARB_transform_feedback_overflow_query --------------- */ + +#ifndef GL_ARB_transform_feedback_overflow_query +#define GL_ARB_transform_feedback_overflow_query 1 + +#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED + +#define GLEW_ARB_transform_feedback_overflow_query GLEW_GET_VAR(__GLEW_ARB_transform_feedback_overflow_query) + +#endif /* GL_ARB_transform_feedback_overflow_query */ + +/* ------------------------ GL_ARB_transpose_matrix ------------------------ */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 + +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 + +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLLOADTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXDARBPROC) (GLdouble m[16]); +typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]); + +#define glLoadTransposeMatrixdARB GLEW_GET_FUN(__glewLoadTransposeMatrixdARB) +#define glLoadTransposeMatrixfARB GLEW_GET_FUN(__glewLoadTransposeMatrixfARB) +#define glMultTransposeMatrixdARB GLEW_GET_FUN(__glewMultTransposeMatrixdARB) +#define glMultTransposeMatrixfARB GLEW_GET_FUN(__glewMultTransposeMatrixfARB) + +#define GLEW_ARB_transpose_matrix GLEW_GET_VAR(__GLEW_ARB_transpose_matrix) + +#endif /* GL_ARB_transpose_matrix */ + +/* ---------------------- GL_ARB_uniform_buffer_object --------------------- */ + +#ifndef GL_ARB_uniform_buffer_object +#define GL_ARB_uniform_buffer_object 1 + +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformName); +typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data); +typedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar* uniformBlockName); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar* const * uniformNames, GLuint* uniformIndices); +typedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); + +#define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase) +#define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange) +#define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName) +#define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv) +#define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName) +#define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv) +#define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v) +#define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex) +#define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices) +#define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding) + +#define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object) + +#endif /* GL_ARB_uniform_buffer_object */ + +/* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */ + +#ifndef GL_ARB_vertex_array_bgra +#define GL_ARB_vertex_array_bgra 1 + +#define GL_BGRA 0x80E1 + +#define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra) + +#endif /* GL_ARB_vertex_array_bgra */ + +/* ----------------------- GL_ARB_vertex_array_object ---------------------- */ + +#ifndef GL_ARB_vertex_array_object +#define GL_ARB_vertex_array_object 1 + +#define GL_VERTEX_ARRAY_BINDING 0x85B5 + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint* arrays); +typedef void (GLAPIENTRY * PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint* arrays); +typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array); + +#define glBindVertexArray GLEW_GET_FUN(__glewBindVertexArray) +#define glDeleteVertexArrays GLEW_GET_FUN(__glewDeleteVertexArrays) +#define glGenVertexArrays GLEW_GET_FUN(__glewGenVertexArrays) +#define glIsVertexArray GLEW_GET_FUN(__glewIsVertexArray) + +#define GLEW_ARB_vertex_array_object GLEW_GET_VAR(__GLEW_ARB_vertex_array_object) + +#endif /* GL_ARB_vertex_array_object */ + +/* ----------------------- GL_ARB_vertex_attrib_64bit ---------------------- */ + +#ifndef GL_ARB_vertex_attrib_64bit +#define GL_ARB_vertex_attrib_64bit 1 + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer); + +#define glGetVertexAttribLdv GLEW_GET_FUN(__glewGetVertexAttribLdv) +#define glVertexAttribL1d GLEW_GET_FUN(__glewVertexAttribL1d) +#define glVertexAttribL1dv GLEW_GET_FUN(__glewVertexAttribL1dv) +#define glVertexAttribL2d GLEW_GET_FUN(__glewVertexAttribL2d) +#define glVertexAttribL2dv GLEW_GET_FUN(__glewVertexAttribL2dv) +#define glVertexAttribL3d GLEW_GET_FUN(__glewVertexAttribL3d) +#define glVertexAttribL3dv GLEW_GET_FUN(__glewVertexAttribL3dv) +#define glVertexAttribL4d GLEW_GET_FUN(__glewVertexAttribL4d) +#define glVertexAttribL4dv GLEW_GET_FUN(__glewVertexAttribL4dv) +#define glVertexAttribLPointer GLEW_GET_FUN(__glewVertexAttribLPointer) + +#define GLEW_ARB_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_64bit) + +#endif /* GL_ARB_vertex_attrib_64bit */ + +/* ---------------------- GL_ARB_vertex_attrib_binding --------------------- */ + +#ifndef GL_ARB_vertex_attrib_binding +#define GL_ARB_vertex_attrib_binding 1 + +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_VERTEX_BINDING_BUFFER 0x8F4F + +typedef void (GLAPIENTRY * PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAPIENTRY * PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); + +#define glBindVertexBuffer GLEW_GET_FUN(__glewBindVertexBuffer) +#define glVertexArrayBindVertexBufferEXT GLEW_GET_FUN(__glewVertexArrayBindVertexBufferEXT) +#define glVertexArrayVertexAttribBindingEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribBindingEXT) +#define glVertexArrayVertexAttribFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribFormatEXT) +#define glVertexArrayVertexAttribIFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIFormatEXT) +#define glVertexArrayVertexAttribLFormatEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLFormatEXT) +#define glVertexArrayVertexBindingDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexBindingDivisorEXT) +#define glVertexAttribBinding GLEW_GET_FUN(__glewVertexAttribBinding) +#define glVertexAttribFormat GLEW_GET_FUN(__glewVertexAttribFormat) +#define glVertexAttribIFormat GLEW_GET_FUN(__glewVertexAttribIFormat) +#define glVertexAttribLFormat GLEW_GET_FUN(__glewVertexAttribLFormat) +#define glVertexBindingDivisor GLEW_GET_FUN(__glewVertexBindingDivisor) + +#define GLEW_ARB_vertex_attrib_binding GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_binding) + +#endif /* GL_ARB_vertex_attrib_binding */ + +/* -------------------------- GL_ARB_vertex_blend -------------------------- */ + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 + +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F + +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDARBPROC) (GLint count); +typedef void (GLAPIENTRY * PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); +typedef void (GLAPIENTRY * PFNGLWEIGHTBVARBPROC) (GLint size, GLbyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTDVARBPROC) (GLint size, GLdouble *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTFVARBPROC) (GLint size, GLfloat *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTIVARBPROC) (GLint size, GLint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTSVARBPROC) (GLint size, GLshort *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUBVARBPROC) (GLint size, GLubyte *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUIVARBPROC) (GLint size, GLuint *weights); +typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights); + +#define glVertexBlendARB GLEW_GET_FUN(__glewVertexBlendARB) +#define glWeightPointerARB GLEW_GET_FUN(__glewWeightPointerARB) +#define glWeightbvARB GLEW_GET_FUN(__glewWeightbvARB) +#define glWeightdvARB GLEW_GET_FUN(__glewWeightdvARB) +#define glWeightfvARB GLEW_GET_FUN(__glewWeightfvARB) +#define glWeightivARB GLEW_GET_FUN(__glewWeightivARB) +#define glWeightsvARB GLEW_GET_FUN(__glewWeightsvARB) +#define glWeightubvARB GLEW_GET_FUN(__glewWeightubvARB) +#define glWeightuivARB GLEW_GET_FUN(__glewWeightuivARB) +#define glWeightusvARB GLEW_GET_FUN(__glewWeightusvARB) + +#define GLEW_ARB_vertex_blend GLEW_GET_VAR(__GLEW_ARB_vertex_blend) + +#endif /* GL_ARB_vertex_blend */ + +/* ---------------------- GL_ARB_vertex_buffer_object ---------------------- */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 + +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA + +typedef ptrdiff_t GLintptrARB; +typedef ptrdiff_t GLsizeiptrARB; + +typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint* buffers); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void * (GLAPIENTRY * PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERARBPROC) (GLenum target); + +#define glBindBufferARB GLEW_GET_FUN(__glewBindBufferARB) +#define glBufferDataARB GLEW_GET_FUN(__glewBufferDataARB) +#define glBufferSubDataARB GLEW_GET_FUN(__glewBufferSubDataARB) +#define glDeleteBuffersARB GLEW_GET_FUN(__glewDeleteBuffersARB) +#define glGenBuffersARB GLEW_GET_FUN(__glewGenBuffersARB) +#define glGetBufferParameterivARB GLEW_GET_FUN(__glewGetBufferParameterivARB) +#define glGetBufferPointervARB GLEW_GET_FUN(__glewGetBufferPointervARB) +#define glGetBufferSubDataARB GLEW_GET_FUN(__glewGetBufferSubDataARB) +#define glIsBufferARB GLEW_GET_FUN(__glewIsBufferARB) +#define glMapBufferARB GLEW_GET_FUN(__glewMapBufferARB) +#define glUnmapBufferARB GLEW_GET_FUN(__glewUnmapBufferARB) + +#define GLEW_ARB_vertex_buffer_object GLEW_GET_VAR(__GLEW_ARB_vertex_buffer_object) + +#endif /* GL_ARB_vertex_buffer_object */ + +/* ------------------------- GL_ARB_vertex_program ------------------------- */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 + +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF + +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint* programs); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint* programs); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMARBPROC) (GLuint program); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); + +#define glBindProgramARB GLEW_GET_FUN(__glewBindProgramARB) +#define glDeleteProgramsARB GLEW_GET_FUN(__glewDeleteProgramsARB) +#define glDisableVertexAttribArrayARB GLEW_GET_FUN(__glewDisableVertexAttribArrayARB) +#define glEnableVertexAttribArrayARB GLEW_GET_FUN(__glewEnableVertexAttribArrayARB) +#define glGenProgramsARB GLEW_GET_FUN(__glewGenProgramsARB) +#define glGetProgramEnvParameterdvARB GLEW_GET_FUN(__glewGetProgramEnvParameterdvARB) +#define glGetProgramEnvParameterfvARB GLEW_GET_FUN(__glewGetProgramEnvParameterfvARB) +#define glGetProgramLocalParameterdvARB GLEW_GET_FUN(__glewGetProgramLocalParameterdvARB) +#define glGetProgramLocalParameterfvARB GLEW_GET_FUN(__glewGetProgramLocalParameterfvARB) +#define glGetProgramStringARB GLEW_GET_FUN(__glewGetProgramStringARB) +#define glGetProgramivARB GLEW_GET_FUN(__glewGetProgramivARB) +#define glGetVertexAttribPointervARB GLEW_GET_FUN(__glewGetVertexAttribPointervARB) +#define glGetVertexAttribdvARB GLEW_GET_FUN(__glewGetVertexAttribdvARB) +#define glGetVertexAttribfvARB GLEW_GET_FUN(__glewGetVertexAttribfvARB) +#define glGetVertexAttribivARB GLEW_GET_FUN(__glewGetVertexAttribivARB) +#define glIsProgramARB GLEW_GET_FUN(__glewIsProgramARB) +#define glProgramEnvParameter4dARB GLEW_GET_FUN(__glewProgramEnvParameter4dARB) +#define glProgramEnvParameter4dvARB GLEW_GET_FUN(__glewProgramEnvParameter4dvARB) +#define glProgramEnvParameter4fARB GLEW_GET_FUN(__glewProgramEnvParameter4fARB) +#define glProgramEnvParameter4fvARB GLEW_GET_FUN(__glewProgramEnvParameter4fvARB) +#define glProgramLocalParameter4dARB GLEW_GET_FUN(__glewProgramLocalParameter4dARB) +#define glProgramLocalParameter4dvARB GLEW_GET_FUN(__glewProgramLocalParameter4dvARB) +#define glProgramLocalParameter4fARB GLEW_GET_FUN(__glewProgramLocalParameter4fARB) +#define glProgramLocalParameter4fvARB GLEW_GET_FUN(__glewProgramLocalParameter4fvARB) +#define glProgramStringARB GLEW_GET_FUN(__glewProgramStringARB) +#define glVertexAttrib1dARB GLEW_GET_FUN(__glewVertexAttrib1dARB) +#define glVertexAttrib1dvARB GLEW_GET_FUN(__glewVertexAttrib1dvARB) +#define glVertexAttrib1fARB GLEW_GET_FUN(__glewVertexAttrib1fARB) +#define glVertexAttrib1fvARB GLEW_GET_FUN(__glewVertexAttrib1fvARB) +#define glVertexAttrib1sARB GLEW_GET_FUN(__glewVertexAttrib1sARB) +#define glVertexAttrib1svARB GLEW_GET_FUN(__glewVertexAttrib1svARB) +#define glVertexAttrib2dARB GLEW_GET_FUN(__glewVertexAttrib2dARB) +#define glVertexAttrib2dvARB GLEW_GET_FUN(__glewVertexAttrib2dvARB) +#define glVertexAttrib2fARB GLEW_GET_FUN(__glewVertexAttrib2fARB) +#define glVertexAttrib2fvARB GLEW_GET_FUN(__glewVertexAttrib2fvARB) +#define glVertexAttrib2sARB GLEW_GET_FUN(__glewVertexAttrib2sARB) +#define glVertexAttrib2svARB GLEW_GET_FUN(__glewVertexAttrib2svARB) +#define glVertexAttrib3dARB GLEW_GET_FUN(__glewVertexAttrib3dARB) +#define glVertexAttrib3dvARB GLEW_GET_FUN(__glewVertexAttrib3dvARB) +#define glVertexAttrib3fARB GLEW_GET_FUN(__glewVertexAttrib3fARB) +#define glVertexAttrib3fvARB GLEW_GET_FUN(__glewVertexAttrib3fvARB) +#define glVertexAttrib3sARB GLEW_GET_FUN(__glewVertexAttrib3sARB) +#define glVertexAttrib3svARB GLEW_GET_FUN(__glewVertexAttrib3svARB) +#define glVertexAttrib4NbvARB GLEW_GET_FUN(__glewVertexAttrib4NbvARB) +#define glVertexAttrib4NivARB GLEW_GET_FUN(__glewVertexAttrib4NivARB) +#define glVertexAttrib4NsvARB GLEW_GET_FUN(__glewVertexAttrib4NsvARB) +#define glVertexAttrib4NubARB GLEW_GET_FUN(__glewVertexAttrib4NubARB) +#define glVertexAttrib4NubvARB GLEW_GET_FUN(__glewVertexAttrib4NubvARB) +#define glVertexAttrib4NuivARB GLEW_GET_FUN(__glewVertexAttrib4NuivARB) +#define glVertexAttrib4NusvARB GLEW_GET_FUN(__glewVertexAttrib4NusvARB) +#define glVertexAttrib4bvARB GLEW_GET_FUN(__glewVertexAttrib4bvARB) +#define glVertexAttrib4dARB GLEW_GET_FUN(__glewVertexAttrib4dARB) +#define glVertexAttrib4dvARB GLEW_GET_FUN(__glewVertexAttrib4dvARB) +#define glVertexAttrib4fARB GLEW_GET_FUN(__glewVertexAttrib4fARB) +#define glVertexAttrib4fvARB GLEW_GET_FUN(__glewVertexAttrib4fvARB) +#define glVertexAttrib4ivARB GLEW_GET_FUN(__glewVertexAttrib4ivARB) +#define glVertexAttrib4sARB GLEW_GET_FUN(__glewVertexAttrib4sARB) +#define glVertexAttrib4svARB GLEW_GET_FUN(__glewVertexAttrib4svARB) +#define glVertexAttrib4ubvARB GLEW_GET_FUN(__glewVertexAttrib4ubvARB) +#define glVertexAttrib4uivARB GLEW_GET_FUN(__glewVertexAttrib4uivARB) +#define glVertexAttrib4usvARB GLEW_GET_FUN(__glewVertexAttrib4usvARB) +#define glVertexAttribPointerARB GLEW_GET_FUN(__glewVertexAttribPointerARB) + +#define GLEW_ARB_vertex_program GLEW_GET_VAR(__GLEW_ARB_vertex_program) + +#endif /* GL_ARB_vertex_program */ + +/* -------------------------- GL_ARB_vertex_shader ------------------------- */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 + +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A + +typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB* name); +typedef void (GLAPIENTRY * PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei* length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB* name); + +#define glBindAttribLocationARB GLEW_GET_FUN(__glewBindAttribLocationARB) +#define glGetActiveAttribARB GLEW_GET_FUN(__glewGetActiveAttribARB) +#define glGetAttribLocationARB GLEW_GET_FUN(__glewGetAttribLocationARB) + +#define GLEW_ARB_vertex_shader GLEW_GET_VAR(__GLEW_ARB_vertex_shader) + +#endif /* GL_ARB_vertex_shader */ + +/* ------------------- GL_ARB_vertex_type_10f_11f_11f_rev ------------------ */ + +#ifndef GL_ARB_vertex_type_10f_11f_11f_rev +#define GL_ARB_vertex_type_10f_11f_11f_rev 1 + +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B + +#define GLEW_ARB_vertex_type_10f_11f_11f_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_10f_11f_11f_rev) + +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + +/* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */ + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +#define GL_ARB_vertex_type_2_10_10_10_rev 1 + +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_INT_2_10_10_10_REV 0x8D9F + +typedef void (GLAPIENTRY * PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (GLAPIENTRY * PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint* color); +typedef void (GLAPIENTRY * PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); +typedef void (GLAPIENTRY * PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint* color); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint* color); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); +typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint* coords); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); +typedef void (GLAPIENTRY * PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint* value); + +#define glColorP3ui GLEW_GET_FUN(__glewColorP3ui) +#define glColorP3uiv GLEW_GET_FUN(__glewColorP3uiv) +#define glColorP4ui GLEW_GET_FUN(__glewColorP4ui) +#define glColorP4uiv GLEW_GET_FUN(__glewColorP4uiv) +#define glMultiTexCoordP1ui GLEW_GET_FUN(__glewMultiTexCoordP1ui) +#define glMultiTexCoordP1uiv GLEW_GET_FUN(__glewMultiTexCoordP1uiv) +#define glMultiTexCoordP2ui GLEW_GET_FUN(__glewMultiTexCoordP2ui) +#define glMultiTexCoordP2uiv GLEW_GET_FUN(__glewMultiTexCoordP2uiv) +#define glMultiTexCoordP3ui GLEW_GET_FUN(__glewMultiTexCoordP3ui) +#define glMultiTexCoordP3uiv GLEW_GET_FUN(__glewMultiTexCoordP3uiv) +#define glMultiTexCoordP4ui GLEW_GET_FUN(__glewMultiTexCoordP4ui) +#define glMultiTexCoordP4uiv GLEW_GET_FUN(__glewMultiTexCoordP4uiv) +#define glNormalP3ui GLEW_GET_FUN(__glewNormalP3ui) +#define glNormalP3uiv GLEW_GET_FUN(__glewNormalP3uiv) +#define glSecondaryColorP3ui GLEW_GET_FUN(__glewSecondaryColorP3ui) +#define glSecondaryColorP3uiv GLEW_GET_FUN(__glewSecondaryColorP3uiv) +#define glTexCoordP1ui GLEW_GET_FUN(__glewTexCoordP1ui) +#define glTexCoordP1uiv GLEW_GET_FUN(__glewTexCoordP1uiv) +#define glTexCoordP2ui GLEW_GET_FUN(__glewTexCoordP2ui) +#define glTexCoordP2uiv GLEW_GET_FUN(__glewTexCoordP2uiv) +#define glTexCoordP3ui GLEW_GET_FUN(__glewTexCoordP3ui) +#define glTexCoordP3uiv GLEW_GET_FUN(__glewTexCoordP3uiv) +#define glTexCoordP4ui GLEW_GET_FUN(__glewTexCoordP4ui) +#define glTexCoordP4uiv GLEW_GET_FUN(__glewTexCoordP4uiv) +#define glVertexAttribP1ui GLEW_GET_FUN(__glewVertexAttribP1ui) +#define glVertexAttribP1uiv GLEW_GET_FUN(__glewVertexAttribP1uiv) +#define glVertexAttribP2ui GLEW_GET_FUN(__glewVertexAttribP2ui) +#define glVertexAttribP2uiv GLEW_GET_FUN(__glewVertexAttribP2uiv) +#define glVertexAttribP3ui GLEW_GET_FUN(__glewVertexAttribP3ui) +#define glVertexAttribP3uiv GLEW_GET_FUN(__glewVertexAttribP3uiv) +#define glVertexAttribP4ui GLEW_GET_FUN(__glewVertexAttribP4ui) +#define glVertexAttribP4uiv GLEW_GET_FUN(__glewVertexAttribP4uiv) +#define glVertexP2ui GLEW_GET_FUN(__glewVertexP2ui) +#define glVertexP2uiv GLEW_GET_FUN(__glewVertexP2uiv) +#define glVertexP3ui GLEW_GET_FUN(__glewVertexP3ui) +#define glVertexP3uiv GLEW_GET_FUN(__glewVertexP3uiv) +#define glVertexP4ui GLEW_GET_FUN(__glewVertexP4ui) +#define glVertexP4uiv GLEW_GET_FUN(__glewVertexP4uiv) + +#define GLEW_ARB_vertex_type_2_10_10_10_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_2_10_10_10_rev) + +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ + +/* ------------------------- GL_ARB_viewport_array ------------------------- */ + +#ifndef GL_ARB_viewport_array +#define GL_ARB_viewport_array 1 + +#define GL_DEPTH_RANGE 0x0B70 +#define GL_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_MAX_VIEWPORTS 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_UNDEFINED_VERTEX 0x8260 +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F + +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd * v); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f); +typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble* data); +typedef void (GLAPIENTRY * PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat* data); +typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint * v); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat * v); + +#define glDepthRangeArrayv GLEW_GET_FUN(__glewDepthRangeArrayv) +#define glDepthRangeIndexed GLEW_GET_FUN(__glewDepthRangeIndexed) +#define glGetDoublei_v GLEW_GET_FUN(__glewGetDoublei_v) +#define glGetFloati_v GLEW_GET_FUN(__glewGetFloati_v) +#define glScissorArrayv GLEW_GET_FUN(__glewScissorArrayv) +#define glScissorIndexed GLEW_GET_FUN(__glewScissorIndexed) +#define glScissorIndexedv GLEW_GET_FUN(__glewScissorIndexedv) +#define glViewportArrayv GLEW_GET_FUN(__glewViewportArrayv) +#define glViewportIndexedf GLEW_GET_FUN(__glewViewportIndexedf) +#define glViewportIndexedfv GLEW_GET_FUN(__glewViewportIndexedfv) + +#define GLEW_ARB_viewport_array GLEW_GET_VAR(__GLEW_ARB_viewport_array) + +#endif /* GL_ARB_viewport_array */ + +/* --------------------------- GL_ARB_window_pos --------------------------- */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVARBPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVARBPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVARBPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVARBPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVARBPROC) (const GLshort* p); + +#define glWindowPos2dARB GLEW_GET_FUN(__glewWindowPos2dARB) +#define glWindowPos2dvARB GLEW_GET_FUN(__glewWindowPos2dvARB) +#define glWindowPos2fARB GLEW_GET_FUN(__glewWindowPos2fARB) +#define glWindowPos2fvARB GLEW_GET_FUN(__glewWindowPos2fvARB) +#define glWindowPos2iARB GLEW_GET_FUN(__glewWindowPos2iARB) +#define glWindowPos2ivARB GLEW_GET_FUN(__glewWindowPos2ivARB) +#define glWindowPos2sARB GLEW_GET_FUN(__glewWindowPos2sARB) +#define glWindowPos2svARB GLEW_GET_FUN(__glewWindowPos2svARB) +#define glWindowPos3dARB GLEW_GET_FUN(__glewWindowPos3dARB) +#define glWindowPos3dvARB GLEW_GET_FUN(__glewWindowPos3dvARB) +#define glWindowPos3fARB GLEW_GET_FUN(__glewWindowPos3fARB) +#define glWindowPos3fvARB GLEW_GET_FUN(__glewWindowPos3fvARB) +#define glWindowPos3iARB GLEW_GET_FUN(__glewWindowPos3iARB) +#define glWindowPos3ivARB GLEW_GET_FUN(__glewWindowPos3ivARB) +#define glWindowPos3sARB GLEW_GET_FUN(__glewWindowPos3sARB) +#define glWindowPos3svARB GLEW_GET_FUN(__glewWindowPos3svARB) + +#define GLEW_ARB_window_pos GLEW_GET_VAR(__GLEW_ARB_window_pos) + +#endif /* GL_ARB_window_pos */ + +/* ------------------------- GL_ATIX_point_sprites ------------------------- */ + +#ifndef GL_ATIX_point_sprites +#define GL_ATIX_point_sprites 1 + +#define GL_TEXTURE_POINT_MODE_ATIX 0x60B0 +#define GL_TEXTURE_POINT_ONE_COORD_ATIX 0x60B1 +#define GL_TEXTURE_POINT_SPRITE_ATIX 0x60B2 +#define GL_POINT_SPRITE_CULL_MODE_ATIX 0x60B3 +#define GL_POINT_SPRITE_CULL_CENTER_ATIX 0x60B4 +#define GL_POINT_SPRITE_CULL_CLIP_ATIX 0x60B5 + +#define GLEW_ATIX_point_sprites GLEW_GET_VAR(__GLEW_ATIX_point_sprites) + +#endif /* GL_ATIX_point_sprites */ + +/* ---------------------- GL_ATIX_texture_env_combine3 --------------------- */ + +#ifndef GL_ATIX_texture_env_combine3 +#define GL_ATIX_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATIX 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATIX 0x8745 +#define GL_MODULATE_SUBTRACT_ATIX 0x8746 + +#define GLEW_ATIX_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATIX_texture_env_combine3) + +#endif /* GL_ATIX_texture_env_combine3 */ + +/* ----------------------- GL_ATIX_texture_env_route ----------------------- */ + +#ifndef GL_ATIX_texture_env_route +#define GL_ATIX_texture_env_route 1 + +#define GL_SECONDARY_COLOR_ATIX 0x8747 +#define GL_TEXTURE_OUTPUT_RGB_ATIX 0x8748 +#define GL_TEXTURE_OUTPUT_ALPHA_ATIX 0x8749 + +#define GLEW_ATIX_texture_env_route GLEW_GET_VAR(__GLEW_ATIX_texture_env_route) + +#endif /* GL_ATIX_texture_env_route */ + +/* ---------------- GL_ATIX_vertex_shader_output_point_size ---------------- */ + +#ifndef GL_ATIX_vertex_shader_output_point_size +#define GL_ATIX_vertex_shader_output_point_size 1 + +#define GL_OUTPUT_POINT_SIZE_ATIX 0x610E + +#define GLEW_ATIX_vertex_shader_output_point_size GLEW_GET_VAR(__GLEW_ATIX_vertex_shader_output_point_size) + +#endif /* GL_ATIX_vertex_shader_output_point_size */ + +/* -------------------------- GL_ATI_draw_buffers -------------------------- */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 + +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 + +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum* bufs); + +#define glDrawBuffersATI GLEW_GET_FUN(__glewDrawBuffersATI) + +#define GLEW_ATI_draw_buffers GLEW_GET_VAR(__GLEW_ATI_draw_buffers) + +#endif /* GL_ATI_draw_buffers */ + +/* -------------------------- GL_ATI_element_array ------------------------- */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 + +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A + +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +typedef void (GLAPIENTRY * PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); + +#define glDrawElementArrayATI GLEW_GET_FUN(__glewDrawElementArrayATI) +#define glDrawRangeElementArrayATI GLEW_GET_FUN(__glewDrawRangeElementArrayATI) +#define glElementPointerATI GLEW_GET_FUN(__glewElementPointerATI) + +#define GLEW_ATI_element_array GLEW_GET_VAR(__GLEW_ATI_element_array) + +#endif /* GL_ATI_element_array */ + +/* ------------------------- GL_ATI_envmap_bumpmap ------------------------- */ + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 + +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C + +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +typedef void (GLAPIENTRY * PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); + +#define glGetTexBumpParameterfvATI GLEW_GET_FUN(__glewGetTexBumpParameterfvATI) +#define glGetTexBumpParameterivATI GLEW_GET_FUN(__glewGetTexBumpParameterivATI) +#define glTexBumpParameterfvATI GLEW_GET_FUN(__glewTexBumpParameterfvATI) +#define glTexBumpParameterivATI GLEW_GET_FUN(__glewTexBumpParameterivATI) + +#define GLEW_ATI_envmap_bumpmap GLEW_GET_VAR(__GLEW_ATI_envmap_bumpmap) + +#endif /* GL_ATI_envmap_bumpmap */ + +/* ------------------------- GL_ATI_fragment_shader ------------------------ */ + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 + +#define GL_2X_BIT_ATI 0x00000001 +#define GL_RED_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B + +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (GLAPIENTRY * PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (GLAPIENTRY * PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (GLAPIENTRY * PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (GLAPIENTRY * PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat* value); + +#define glAlphaFragmentOp1ATI GLEW_GET_FUN(__glewAlphaFragmentOp1ATI) +#define glAlphaFragmentOp2ATI GLEW_GET_FUN(__glewAlphaFragmentOp2ATI) +#define glAlphaFragmentOp3ATI GLEW_GET_FUN(__glewAlphaFragmentOp3ATI) +#define glBeginFragmentShaderATI GLEW_GET_FUN(__glewBeginFragmentShaderATI) +#define glBindFragmentShaderATI GLEW_GET_FUN(__glewBindFragmentShaderATI) +#define glColorFragmentOp1ATI GLEW_GET_FUN(__glewColorFragmentOp1ATI) +#define glColorFragmentOp2ATI GLEW_GET_FUN(__glewColorFragmentOp2ATI) +#define glColorFragmentOp3ATI GLEW_GET_FUN(__glewColorFragmentOp3ATI) +#define glDeleteFragmentShaderATI GLEW_GET_FUN(__glewDeleteFragmentShaderATI) +#define glEndFragmentShaderATI GLEW_GET_FUN(__glewEndFragmentShaderATI) +#define glGenFragmentShadersATI GLEW_GET_FUN(__glewGenFragmentShadersATI) +#define glPassTexCoordATI GLEW_GET_FUN(__glewPassTexCoordATI) +#define glSampleMapATI GLEW_GET_FUN(__glewSampleMapATI) +#define glSetFragmentShaderConstantATI GLEW_GET_FUN(__glewSetFragmentShaderConstantATI) + +#define GLEW_ATI_fragment_shader GLEW_GET_VAR(__GLEW_ATI_fragment_shader) + +#endif /* GL_ATI_fragment_shader */ + +/* ------------------------ GL_ATI_map_object_buffer ----------------------- */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 + +typedef void * (GLAPIENTRY * PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); + +#define glMapObjectBufferATI GLEW_GET_FUN(__glewMapObjectBufferATI) +#define glUnmapObjectBufferATI GLEW_GET_FUN(__glewUnmapObjectBufferATI) + +#define GLEW_ATI_map_object_buffer GLEW_GET_VAR(__GLEW_ATI_map_object_buffer) + +#endif /* GL_ATI_map_object_buffer */ + +/* ----------------------------- GL_ATI_meminfo ---------------------------- */ + +#ifndef GL_ATI_meminfo +#define GL_ATI_meminfo 1 + +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD + +#define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo) + +#endif /* GL_ATI_meminfo */ + +/* -------------------------- GL_ATI_pn_triangles -------------------------- */ + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 + +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 + +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); + +#define glPNTrianglesfATI GLEW_GET_FUN(__glewPNTrianglesfATI) +#define glPNTrianglesiATI GLEW_GET_FUN(__glewPNTrianglesiATI) + +#define GLEW_ATI_pn_triangles GLEW_GET_VAR(__GLEW_ATI_pn_triangles) + +#endif /* GL_ATI_pn_triangles */ + +/* ------------------------ GL_ATI_separate_stencil ------------------------ */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 + +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 + +typedef void (GLAPIENTRY * PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); + +#define glStencilFuncSeparateATI GLEW_GET_FUN(__glewStencilFuncSeparateATI) +#define glStencilOpSeparateATI GLEW_GET_FUN(__glewStencilOpSeparateATI) + +#define GLEW_ATI_separate_stencil GLEW_GET_VAR(__GLEW_ATI_separate_stencil) + +#endif /* GL_ATI_separate_stencil */ + +/* ----------------------- GL_ATI_shader_texture_lod ----------------------- */ + +#ifndef GL_ATI_shader_texture_lod +#define GL_ATI_shader_texture_lod 1 + +#define GLEW_ATI_shader_texture_lod GLEW_GET_VAR(__GLEW_ATI_shader_texture_lod) + +#endif /* GL_ATI_shader_texture_lod */ + +/* ---------------------- GL_ATI_text_fragment_shader ---------------------- */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 + +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 + +#define GLEW_ATI_text_fragment_shader GLEW_GET_VAR(__GLEW_ATI_text_fragment_shader) + +#endif /* GL_ATI_text_fragment_shader */ + +/* --------------------- GL_ATI_texture_compression_3dc -------------------- */ + +#ifndef GL_ATI_texture_compression_3dc +#define GL_ATI_texture_compression_3dc 1 + +#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 + +#define GLEW_ATI_texture_compression_3dc GLEW_GET_VAR(__GLEW_ATI_texture_compression_3dc) + +#endif /* GL_ATI_texture_compression_3dc */ + +/* ---------------------- GL_ATI_texture_env_combine3 ---------------------- */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 + +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 + +#define GLEW_ATI_texture_env_combine3 GLEW_GET_VAR(__GLEW_ATI_texture_env_combine3) + +#endif /* GL_ATI_texture_env_combine3 */ + +/* -------------------------- GL_ATI_texture_float ------------------------- */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 + +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F + +#define GLEW_ATI_texture_float GLEW_GET_VAR(__GLEW_ATI_texture_float) + +#endif /* GL_ATI_texture_float */ + +/* ----------------------- GL_ATI_texture_mirror_once ---------------------- */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 + +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 + +#define GLEW_ATI_texture_mirror_once GLEW_GET_VAR(__GLEW_ATI_texture_mirror_once) + +#endif /* GL_ATI_texture_mirror_once */ + +/* ----------------------- GL_ATI_vertex_array_object ---------------------- */ + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 + +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 + +typedef void (GLAPIENTRY * PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (GLAPIENTRY * PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef GLuint (GLAPIENTRY * PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); +typedef void (GLAPIENTRY * PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +typedef void (GLAPIENTRY * PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); + +#define glArrayObjectATI GLEW_GET_FUN(__glewArrayObjectATI) +#define glFreeObjectBufferATI GLEW_GET_FUN(__glewFreeObjectBufferATI) +#define glGetArrayObjectfvATI GLEW_GET_FUN(__glewGetArrayObjectfvATI) +#define glGetArrayObjectivATI GLEW_GET_FUN(__glewGetArrayObjectivATI) +#define glGetObjectBufferfvATI GLEW_GET_FUN(__glewGetObjectBufferfvATI) +#define glGetObjectBufferivATI GLEW_GET_FUN(__glewGetObjectBufferivATI) +#define glGetVariantArrayObjectfvATI GLEW_GET_FUN(__glewGetVariantArrayObjectfvATI) +#define glGetVariantArrayObjectivATI GLEW_GET_FUN(__glewGetVariantArrayObjectivATI) +#define glIsObjectBufferATI GLEW_GET_FUN(__glewIsObjectBufferATI) +#define glNewObjectBufferATI GLEW_GET_FUN(__glewNewObjectBufferATI) +#define glUpdateObjectBufferATI GLEW_GET_FUN(__glewUpdateObjectBufferATI) +#define glVariantArrayObjectATI GLEW_GET_FUN(__glewVariantArrayObjectATI) + +#define GLEW_ATI_vertex_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_array_object) + +#endif /* GL_ATI_vertex_array_object */ + +/* ------------------- GL_ATI_vertex_attrib_array_object ------------------- */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); + +#define glGetVertexAttribArrayObjectfvATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectfvATI) +#define glGetVertexAttribArrayObjectivATI GLEW_GET_FUN(__glewGetVertexAttribArrayObjectivATI) +#define glVertexAttribArrayObjectATI GLEW_GET_FUN(__glewVertexAttribArrayObjectATI) + +#define GLEW_ATI_vertex_attrib_array_object GLEW_GET_VAR(__GLEW_ATI_vertex_attrib_array_object) + +#endif /* GL_ATI_vertex_attrib_array_object */ + +/* ------------------------- GL_ATI_vertex_streams ------------------------- */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 + +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_SOURCE_ATI 0x876C +#define GL_VERTEX_STREAM0_ATI 0x876D +#define GL_VERTEX_STREAM1_ATI 0x876E +#define GL_VERTEX_STREAM2_ATI 0x876F +#define GL_VERTEX_STREAM3_ATI 0x8770 +#define GL_VERTEX_STREAM4_ATI 0x8771 +#define GL_VERTEX_STREAM5_ATI 0x8772 +#define GL_VERTEX_STREAM6_ATI 0x8773 +#define GL_VERTEX_STREAM7_ATI 0x8774 + +typedef void (GLAPIENTRY * PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte x, GLbyte y, GLbyte z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); + +#define glClientActiveVertexStreamATI GLEW_GET_FUN(__glewClientActiveVertexStreamATI) +#define glNormalStream3bATI GLEW_GET_FUN(__glewNormalStream3bATI) +#define glNormalStream3bvATI GLEW_GET_FUN(__glewNormalStream3bvATI) +#define glNormalStream3dATI GLEW_GET_FUN(__glewNormalStream3dATI) +#define glNormalStream3dvATI GLEW_GET_FUN(__glewNormalStream3dvATI) +#define glNormalStream3fATI GLEW_GET_FUN(__glewNormalStream3fATI) +#define glNormalStream3fvATI GLEW_GET_FUN(__glewNormalStream3fvATI) +#define glNormalStream3iATI GLEW_GET_FUN(__glewNormalStream3iATI) +#define glNormalStream3ivATI GLEW_GET_FUN(__glewNormalStream3ivATI) +#define glNormalStream3sATI GLEW_GET_FUN(__glewNormalStream3sATI) +#define glNormalStream3svATI GLEW_GET_FUN(__glewNormalStream3svATI) +#define glVertexBlendEnvfATI GLEW_GET_FUN(__glewVertexBlendEnvfATI) +#define glVertexBlendEnviATI GLEW_GET_FUN(__glewVertexBlendEnviATI) +#define glVertexStream1dATI GLEW_GET_FUN(__glewVertexStream1dATI) +#define glVertexStream1dvATI GLEW_GET_FUN(__glewVertexStream1dvATI) +#define glVertexStream1fATI GLEW_GET_FUN(__glewVertexStream1fATI) +#define glVertexStream1fvATI GLEW_GET_FUN(__glewVertexStream1fvATI) +#define glVertexStream1iATI GLEW_GET_FUN(__glewVertexStream1iATI) +#define glVertexStream1ivATI GLEW_GET_FUN(__glewVertexStream1ivATI) +#define glVertexStream1sATI GLEW_GET_FUN(__glewVertexStream1sATI) +#define glVertexStream1svATI GLEW_GET_FUN(__glewVertexStream1svATI) +#define glVertexStream2dATI GLEW_GET_FUN(__glewVertexStream2dATI) +#define glVertexStream2dvATI GLEW_GET_FUN(__glewVertexStream2dvATI) +#define glVertexStream2fATI GLEW_GET_FUN(__glewVertexStream2fATI) +#define glVertexStream2fvATI GLEW_GET_FUN(__glewVertexStream2fvATI) +#define glVertexStream2iATI GLEW_GET_FUN(__glewVertexStream2iATI) +#define glVertexStream2ivATI GLEW_GET_FUN(__glewVertexStream2ivATI) +#define glVertexStream2sATI GLEW_GET_FUN(__glewVertexStream2sATI) +#define glVertexStream2svATI GLEW_GET_FUN(__glewVertexStream2svATI) +#define glVertexStream3dATI GLEW_GET_FUN(__glewVertexStream3dATI) +#define glVertexStream3dvATI GLEW_GET_FUN(__glewVertexStream3dvATI) +#define glVertexStream3fATI GLEW_GET_FUN(__glewVertexStream3fATI) +#define glVertexStream3fvATI GLEW_GET_FUN(__glewVertexStream3fvATI) +#define glVertexStream3iATI GLEW_GET_FUN(__glewVertexStream3iATI) +#define glVertexStream3ivATI GLEW_GET_FUN(__glewVertexStream3ivATI) +#define glVertexStream3sATI GLEW_GET_FUN(__glewVertexStream3sATI) +#define glVertexStream3svATI GLEW_GET_FUN(__glewVertexStream3svATI) +#define glVertexStream4dATI GLEW_GET_FUN(__glewVertexStream4dATI) +#define glVertexStream4dvATI GLEW_GET_FUN(__glewVertexStream4dvATI) +#define glVertexStream4fATI GLEW_GET_FUN(__glewVertexStream4fATI) +#define glVertexStream4fvATI GLEW_GET_FUN(__glewVertexStream4fvATI) +#define glVertexStream4iATI GLEW_GET_FUN(__glewVertexStream4iATI) +#define glVertexStream4ivATI GLEW_GET_FUN(__glewVertexStream4ivATI) +#define glVertexStream4sATI GLEW_GET_FUN(__glewVertexStream4sATI) +#define glVertexStream4svATI GLEW_GET_FUN(__glewVertexStream4svATI) + +#define GLEW_ATI_vertex_streams GLEW_GET_VAR(__GLEW_ATI_vertex_streams) + +#endif /* GL_ATI_vertex_streams */ + +/* --------------------------- GL_EXT_422_pixels --------------------------- */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 + +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF + +#define GLEW_EXT_422_pixels GLEW_GET_VAR(__GLEW_EXT_422_pixels) + +#endif /* GL_EXT_422_pixels */ + +/* ---------------------------- GL_EXT_Cg_shader --------------------------- */ + +#ifndef GL_EXT_Cg_shader +#define GL_EXT_Cg_shader 1 + +#define GL_CG_VERTEX_SHADER_EXT 0x890E +#define GL_CG_FRAGMENT_SHADER_EXT 0x890F + +#define GLEW_EXT_Cg_shader GLEW_GET_VAR(__GLEW_EXT_Cg_shader) + +#endif /* GL_EXT_Cg_shader */ + +/* ------------------------------ GL_EXT_abgr ------------------------------ */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 + +#define GL_ABGR_EXT 0x8000 + +#define GLEW_EXT_abgr GLEW_GET_VAR(__GLEW_EXT_abgr) + +#endif /* GL_EXT_abgr */ + +/* ------------------------------ GL_EXT_bgra ------------------------------ */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 + +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 + +#define GLEW_EXT_bgra GLEW_GET_VAR(__GLEW_EXT_bgra) + +#endif /* GL_EXT_bgra */ + +/* ------------------------ GL_EXT_bindable_uniform ------------------------ */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 + +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF + +typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (GLAPIENTRY * PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +typedef void (GLAPIENTRY * PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); + +#define glGetUniformBufferSizeEXT GLEW_GET_FUN(__glewGetUniformBufferSizeEXT) +#define glGetUniformOffsetEXT GLEW_GET_FUN(__glewGetUniformOffsetEXT) +#define glUniformBufferEXT GLEW_GET_FUN(__glewUniformBufferEXT) + +#define GLEW_EXT_bindable_uniform GLEW_GET_VAR(__GLEW_EXT_bindable_uniform) + +#endif /* GL_EXT_bindable_uniform */ + +/* --------------------------- GL_EXT_blend_color -------------------------- */ + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 + +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 + +typedef void (GLAPIENTRY * PFNGLBLENDCOLOREXTPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); + +#define glBlendColorEXT GLEW_GET_FUN(__glewBlendColorEXT) + +#define GLEW_EXT_blend_color GLEW_GET_VAR(__GLEW_EXT_blend_color) + +#endif /* GL_EXT_blend_color */ + +/* --------------------- GL_EXT_blend_equation_separate -------------------- */ + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 + +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); + +#define glBlendEquationSeparateEXT GLEW_GET_FUN(__glewBlendEquationSeparateEXT) + +#define GLEW_EXT_blend_equation_separate GLEW_GET_VAR(__GLEW_EXT_blend_equation_separate) + +#endif /* GL_EXT_blend_equation_separate */ + +/* ----------------------- GL_EXT_blend_func_separate ---------------------- */ + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 + +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB + +typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); + +#define glBlendFuncSeparateEXT GLEW_GET_FUN(__glewBlendFuncSeparateEXT) + +#define GLEW_EXT_blend_func_separate GLEW_GET_VAR(__GLEW_EXT_blend_func_separate) + +#endif /* GL_EXT_blend_func_separate */ + +/* ------------------------- GL_EXT_blend_logic_op ------------------------- */ + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 + +#define GLEW_EXT_blend_logic_op GLEW_GET_VAR(__GLEW_EXT_blend_logic_op) + +#endif /* GL_EXT_blend_logic_op */ + +/* -------------------------- GL_EXT_blend_minmax -------------------------- */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 + +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_BLEND_EQUATION_EXT 0x8009 + +typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); + +#define glBlendEquationEXT GLEW_GET_FUN(__glewBlendEquationEXT) + +#define GLEW_EXT_blend_minmax GLEW_GET_VAR(__GLEW_EXT_blend_minmax) + +#endif /* GL_EXT_blend_minmax */ + +/* ------------------------- GL_EXT_blend_subtract ------------------------- */ + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 + +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B + +#define GLEW_EXT_blend_subtract GLEW_GET_VAR(__GLEW_EXT_blend_subtract) + +#endif /* GL_EXT_blend_subtract */ + +/* ------------------------ GL_EXT_clip_volume_hint ------------------------ */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 + +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 + +#define GLEW_EXT_clip_volume_hint GLEW_GET_VAR(__GLEW_EXT_clip_volume_hint) + +#endif /* GL_EXT_clip_volume_hint */ + +/* ------------------------------ GL_EXT_cmyka ----------------------------- */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 + +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F + +#define GLEW_EXT_cmyka GLEW_GET_VAR(__GLEW_EXT_cmyka) + +#endif /* GL_EXT_cmyka */ + +/* ------------------------- GL_EXT_color_subtable ------------------------- */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 + +typedef void (GLAPIENTRY * PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); + +#define glColorSubTableEXT GLEW_GET_FUN(__glewColorSubTableEXT) +#define glCopyColorSubTableEXT GLEW_GET_FUN(__glewCopyColorSubTableEXT) + +#define GLEW_EXT_color_subtable GLEW_GET_VAR(__GLEW_EXT_color_subtable) + +#endif /* GL_EXT_color_subtable */ + +/* ---------------------- GL_EXT_compiled_vertex_array --------------------- */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 + +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 + +typedef void (GLAPIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); + +#define glLockArraysEXT GLEW_GET_FUN(__glewLockArraysEXT) +#define glUnlockArraysEXT GLEW_GET_FUN(__glewUnlockArraysEXT) + +#define GLEW_EXT_compiled_vertex_array GLEW_GET_VAR(__GLEW_EXT_compiled_vertex_array) + +#endif /* GL_EXT_compiled_vertex_array */ + +/* --------------------------- GL_EXT_convolution -------------------------- */ + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 + +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 + +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (GLAPIENTRY * PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); + +#define glConvolutionFilter1DEXT GLEW_GET_FUN(__glewConvolutionFilter1DEXT) +#define glConvolutionFilter2DEXT GLEW_GET_FUN(__glewConvolutionFilter2DEXT) +#define glConvolutionParameterfEXT GLEW_GET_FUN(__glewConvolutionParameterfEXT) +#define glConvolutionParameterfvEXT GLEW_GET_FUN(__glewConvolutionParameterfvEXT) +#define glConvolutionParameteriEXT GLEW_GET_FUN(__glewConvolutionParameteriEXT) +#define glConvolutionParameterivEXT GLEW_GET_FUN(__glewConvolutionParameterivEXT) +#define glCopyConvolutionFilter1DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter1DEXT) +#define glCopyConvolutionFilter2DEXT GLEW_GET_FUN(__glewCopyConvolutionFilter2DEXT) +#define glGetConvolutionFilterEXT GLEW_GET_FUN(__glewGetConvolutionFilterEXT) +#define glGetConvolutionParameterfvEXT GLEW_GET_FUN(__glewGetConvolutionParameterfvEXT) +#define glGetConvolutionParameterivEXT GLEW_GET_FUN(__glewGetConvolutionParameterivEXT) +#define glGetSeparableFilterEXT GLEW_GET_FUN(__glewGetSeparableFilterEXT) +#define glSeparableFilter2DEXT GLEW_GET_FUN(__glewSeparableFilter2DEXT) + +#define GLEW_EXT_convolution GLEW_GET_VAR(__GLEW_EXT_convolution) + +#endif /* GL_EXT_convolution */ + +/* ------------------------ GL_EXT_coordinate_frame ------------------------ */ + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 + +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 + +typedef void (GLAPIENTRY * PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); +typedef void (GLAPIENTRY * PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, void *pointer); + +#define glBinormalPointerEXT GLEW_GET_FUN(__glewBinormalPointerEXT) +#define glTangentPointerEXT GLEW_GET_FUN(__glewTangentPointerEXT) + +#define GLEW_EXT_coordinate_frame GLEW_GET_VAR(__GLEW_EXT_coordinate_frame) + +#endif /* GL_EXT_coordinate_frame */ + +/* -------------------------- GL_EXT_copy_texture -------------------------- */ + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 + +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glCopyTexImage1DEXT GLEW_GET_FUN(__glewCopyTexImage1DEXT) +#define glCopyTexImage2DEXT GLEW_GET_FUN(__glewCopyTexImage2DEXT) +#define glCopyTexSubImage1DEXT GLEW_GET_FUN(__glewCopyTexSubImage1DEXT) +#define glCopyTexSubImage2DEXT GLEW_GET_FUN(__glewCopyTexSubImage2DEXT) +#define glCopyTexSubImage3DEXT GLEW_GET_FUN(__glewCopyTexSubImage3DEXT) + +#define GLEW_EXT_copy_texture GLEW_GET_VAR(__GLEW_EXT_copy_texture) + +#endif /* GL_EXT_copy_texture */ + +/* --------------------------- GL_EXT_cull_vertex -------------------------- */ + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 + +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC + +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params); + +#define glCullParameterdvEXT GLEW_GET_FUN(__glewCullParameterdvEXT) +#define glCullParameterfvEXT GLEW_GET_FUN(__glewCullParameterfvEXT) + +#define GLEW_EXT_cull_vertex GLEW_GET_VAR(__GLEW_EXT_cull_vertex) + +#endif /* GL_EXT_cull_vertex */ + +/* --------------------------- GL_EXT_debug_label -------------------------- */ + +#ifndef GL_EXT_debug_label +#define GL_EXT_debug_label 1 + +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 + +typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei* length, GLchar *label); +typedef void (GLAPIENTRY * PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar* label); + +#define glGetObjectLabelEXT GLEW_GET_FUN(__glewGetObjectLabelEXT) +#define glLabelObjectEXT GLEW_GET_FUN(__glewLabelObjectEXT) + +#define GLEW_EXT_debug_label GLEW_GET_VAR(__GLEW_EXT_debug_label) + +#endif /* GL_EXT_debug_label */ + +/* -------------------------- GL_EXT_debug_marker -------------------------- */ + +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 + +typedef void (GLAPIENTRY * PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar* marker); +typedef void (GLAPIENTRY * PFNGLPOPGROUPMARKEREXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar* marker); + +#define glInsertEventMarkerEXT GLEW_GET_FUN(__glewInsertEventMarkerEXT) +#define glPopGroupMarkerEXT GLEW_GET_FUN(__glewPopGroupMarkerEXT) +#define glPushGroupMarkerEXT GLEW_GET_FUN(__glewPushGroupMarkerEXT) + +#define GLEW_EXT_debug_marker GLEW_GET_VAR(__GLEW_EXT_debug_marker) + +#endif /* GL_EXT_debug_marker */ + +/* ------------------------ GL_EXT_depth_bounds_test ----------------------- */ + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 + +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 + +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); + +#define glDepthBoundsEXT GLEW_GET_FUN(__glewDepthBoundsEXT) + +#define GLEW_EXT_depth_bounds_test GLEW_GET_VAR(__GLEW_EXT_depth_bounds_test) + +#endif /* GL_EXT_depth_bounds_test */ + +/* ----------------------- GL_EXT_direct_state_access ---------------------- */ + +#ifndef GL_EXT_direct_state_access +#define GL_EXT_direct_state_access 1 + +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F + +typedef void (GLAPIENTRY * PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); +typedef GLenum (GLAPIENTRY * PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); +typedef void (GLAPIENTRY * PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); +typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void *img); +typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void *img); +typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void** params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (GLAPIENTRY * PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); +typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void** params); +typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void** params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void** param); +typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void** param); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); +typedef void * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTDEXTPROC) (GLenum matrixMode, const GLdouble* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTFEXTPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXORTHOEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f); +typedef void (GLAPIENTRY * PFNGLMATRIXPOPEXTPROC) (GLenum matrixMode); +typedef void (GLAPIENTRY * PFNGLMATRIXPUSHEXTPROC) (GLenum matrixMode); +typedef void (GLAPIENTRY * PFNGLMATRIXROTATEDEXTPROC) (GLenum matrixMode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLMATRIXROTATEFEXTPROC) (GLenum matrixMode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLMATRIXSCALEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLMATRIXSCALEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum matrixMode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum matrixMode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat* param); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint* param); +typedef void (GLAPIENTRY * PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint* params); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat* param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint* param); +typedef void (GLAPIENTRY * PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); + +#define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT) +#define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT) +#define glClientAttribDefaultEXT GLEW_GET_FUN(__glewClientAttribDefaultEXT) +#define glCompressedMultiTexImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage1DEXT) +#define glCompressedMultiTexImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage2DEXT) +#define glCompressedMultiTexImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexImage3DEXT) +#define glCompressedMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage1DEXT) +#define glCompressedMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage2DEXT) +#define glCompressedMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCompressedMultiTexSubImage3DEXT) +#define glCompressedTextureImage1DEXT GLEW_GET_FUN(__glewCompressedTextureImage1DEXT) +#define glCompressedTextureImage2DEXT GLEW_GET_FUN(__glewCompressedTextureImage2DEXT) +#define glCompressedTextureImage3DEXT GLEW_GET_FUN(__glewCompressedTextureImage3DEXT) +#define glCompressedTextureSubImage1DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage1DEXT) +#define glCompressedTextureSubImage2DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage2DEXT) +#define glCompressedTextureSubImage3DEXT GLEW_GET_FUN(__glewCompressedTextureSubImage3DEXT) +#define glCopyMultiTexImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexImage1DEXT) +#define glCopyMultiTexImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexImage2DEXT) +#define glCopyMultiTexSubImage1DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage1DEXT) +#define glCopyMultiTexSubImage2DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage2DEXT) +#define glCopyMultiTexSubImage3DEXT GLEW_GET_FUN(__glewCopyMultiTexSubImage3DEXT) +#define glCopyTextureImage1DEXT GLEW_GET_FUN(__glewCopyTextureImage1DEXT) +#define glCopyTextureImage2DEXT GLEW_GET_FUN(__glewCopyTextureImage2DEXT) +#define glCopyTextureSubImage1DEXT GLEW_GET_FUN(__glewCopyTextureSubImage1DEXT) +#define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT) +#define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT) +#define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT) +#define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT) +#define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT) +#define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT) +#define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT) +#define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT) +#define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT) +#define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT) +#define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT) +#define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT) +#define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT) +#define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT) +#define glGenerateMultiTexMipmapEXT GLEW_GET_FUN(__glewGenerateMultiTexMipmapEXT) +#define glGenerateTextureMipmapEXT GLEW_GET_FUN(__glewGenerateTextureMipmapEXT) +#define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT) +#define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT) +#define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT) +#define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT) +#define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT) +#define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT) +#define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT) +#define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT) +#define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT) +#define glGetMultiTexGendvEXT GLEW_GET_FUN(__glewGetMultiTexGendvEXT) +#define glGetMultiTexGenfvEXT GLEW_GET_FUN(__glewGetMultiTexGenfvEXT) +#define glGetMultiTexGenivEXT GLEW_GET_FUN(__glewGetMultiTexGenivEXT) +#define glGetMultiTexImageEXT GLEW_GET_FUN(__glewGetMultiTexImageEXT) +#define glGetMultiTexLevelParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterfvEXT) +#define glGetMultiTexLevelParameterivEXT GLEW_GET_FUN(__glewGetMultiTexLevelParameterivEXT) +#define glGetMultiTexParameterIivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIivEXT) +#define glGetMultiTexParameterIuivEXT GLEW_GET_FUN(__glewGetMultiTexParameterIuivEXT) +#define glGetMultiTexParameterfvEXT GLEW_GET_FUN(__glewGetMultiTexParameterfvEXT) +#define glGetMultiTexParameterivEXT GLEW_GET_FUN(__glewGetMultiTexParameterivEXT) +#define glGetNamedBufferParameterivEXT GLEW_GET_FUN(__glewGetNamedBufferParameterivEXT) +#define glGetNamedBufferPointervEXT GLEW_GET_FUN(__glewGetNamedBufferPointervEXT) +#define glGetNamedBufferSubDataEXT GLEW_GET_FUN(__glewGetNamedBufferSubDataEXT) +#define glGetNamedFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetNamedFramebufferAttachmentParameterivEXT) +#define glGetNamedProgramLocalParameterIivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIivEXT) +#define glGetNamedProgramLocalParameterIuivEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterIuivEXT) +#define glGetNamedProgramLocalParameterdvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterdvEXT) +#define glGetNamedProgramLocalParameterfvEXT GLEW_GET_FUN(__glewGetNamedProgramLocalParameterfvEXT) +#define glGetNamedProgramStringEXT GLEW_GET_FUN(__glewGetNamedProgramStringEXT) +#define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT) +#define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT) +#define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT) +#define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT) +#define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT) +#define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT) +#define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT) +#define glGetTextureParameterIivEXT GLEW_GET_FUN(__glewGetTextureParameterIivEXT) +#define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT) +#define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT) +#define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT) +#define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT) +#define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT) +#define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT) +#define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT) +#define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT) +#define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT) +#define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT) +#define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT) +#define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT) +#define glMatrixLoadTransposefEXT GLEW_GET_FUN(__glewMatrixLoadTransposefEXT) +#define glMatrixLoaddEXT GLEW_GET_FUN(__glewMatrixLoaddEXT) +#define glMatrixLoadfEXT GLEW_GET_FUN(__glewMatrixLoadfEXT) +#define glMatrixMultTransposedEXT GLEW_GET_FUN(__glewMatrixMultTransposedEXT) +#define glMatrixMultTransposefEXT GLEW_GET_FUN(__glewMatrixMultTransposefEXT) +#define glMatrixMultdEXT GLEW_GET_FUN(__glewMatrixMultdEXT) +#define glMatrixMultfEXT GLEW_GET_FUN(__glewMatrixMultfEXT) +#define glMatrixOrthoEXT GLEW_GET_FUN(__glewMatrixOrthoEXT) +#define glMatrixPopEXT GLEW_GET_FUN(__glewMatrixPopEXT) +#define glMatrixPushEXT GLEW_GET_FUN(__glewMatrixPushEXT) +#define glMatrixRotatedEXT GLEW_GET_FUN(__glewMatrixRotatedEXT) +#define glMatrixRotatefEXT GLEW_GET_FUN(__glewMatrixRotatefEXT) +#define glMatrixScaledEXT GLEW_GET_FUN(__glewMatrixScaledEXT) +#define glMatrixScalefEXT GLEW_GET_FUN(__glewMatrixScalefEXT) +#define glMatrixTranslatedEXT GLEW_GET_FUN(__glewMatrixTranslatedEXT) +#define glMatrixTranslatefEXT GLEW_GET_FUN(__glewMatrixTranslatefEXT) +#define glMultiTexBufferEXT GLEW_GET_FUN(__glewMultiTexBufferEXT) +#define glMultiTexCoordPointerEXT GLEW_GET_FUN(__glewMultiTexCoordPointerEXT) +#define glMultiTexEnvfEXT GLEW_GET_FUN(__glewMultiTexEnvfEXT) +#define glMultiTexEnvfvEXT GLEW_GET_FUN(__glewMultiTexEnvfvEXT) +#define glMultiTexEnviEXT GLEW_GET_FUN(__glewMultiTexEnviEXT) +#define glMultiTexEnvivEXT GLEW_GET_FUN(__glewMultiTexEnvivEXT) +#define glMultiTexGendEXT GLEW_GET_FUN(__glewMultiTexGendEXT) +#define glMultiTexGendvEXT GLEW_GET_FUN(__glewMultiTexGendvEXT) +#define glMultiTexGenfEXT GLEW_GET_FUN(__glewMultiTexGenfEXT) +#define glMultiTexGenfvEXT GLEW_GET_FUN(__glewMultiTexGenfvEXT) +#define glMultiTexGeniEXT GLEW_GET_FUN(__glewMultiTexGeniEXT) +#define glMultiTexGenivEXT GLEW_GET_FUN(__glewMultiTexGenivEXT) +#define glMultiTexImage1DEXT GLEW_GET_FUN(__glewMultiTexImage1DEXT) +#define glMultiTexImage2DEXT GLEW_GET_FUN(__glewMultiTexImage2DEXT) +#define glMultiTexImage3DEXT GLEW_GET_FUN(__glewMultiTexImage3DEXT) +#define glMultiTexParameterIivEXT GLEW_GET_FUN(__glewMultiTexParameterIivEXT) +#define glMultiTexParameterIuivEXT GLEW_GET_FUN(__glewMultiTexParameterIuivEXT) +#define glMultiTexParameterfEXT GLEW_GET_FUN(__glewMultiTexParameterfEXT) +#define glMultiTexParameterfvEXT GLEW_GET_FUN(__glewMultiTexParameterfvEXT) +#define glMultiTexParameteriEXT GLEW_GET_FUN(__glewMultiTexParameteriEXT) +#define glMultiTexParameterivEXT GLEW_GET_FUN(__glewMultiTexParameterivEXT) +#define glMultiTexRenderbufferEXT GLEW_GET_FUN(__glewMultiTexRenderbufferEXT) +#define glMultiTexSubImage1DEXT GLEW_GET_FUN(__glewMultiTexSubImage1DEXT) +#define glMultiTexSubImage2DEXT GLEW_GET_FUN(__glewMultiTexSubImage2DEXT) +#define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT) +#define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT) +#define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT) +#define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT) +#define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT) +#define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT) +#define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT) +#define glNamedFramebufferTexture3DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture3DEXT) +#define glNamedFramebufferTextureEXT GLEW_GET_FUN(__glewNamedFramebufferTextureEXT) +#define glNamedFramebufferTextureFaceEXT GLEW_GET_FUN(__glewNamedFramebufferTextureFaceEXT) +#define glNamedFramebufferTextureLayerEXT GLEW_GET_FUN(__glewNamedFramebufferTextureLayerEXT) +#define glNamedProgramLocalParameter4dEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dEXT) +#define glNamedProgramLocalParameter4dvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4dvEXT) +#define glNamedProgramLocalParameter4fEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fEXT) +#define glNamedProgramLocalParameter4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameter4fvEXT) +#define glNamedProgramLocalParameterI4iEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4iEXT) +#define glNamedProgramLocalParameterI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4ivEXT) +#define glNamedProgramLocalParameterI4uiEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uiEXT) +#define glNamedProgramLocalParameterI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParameterI4uivEXT) +#define glNamedProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewNamedProgramLocalParameters4fvEXT) +#define glNamedProgramLocalParametersI4ivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4ivEXT) +#define glNamedProgramLocalParametersI4uivEXT GLEW_GET_FUN(__glewNamedProgramLocalParametersI4uivEXT) +#define glNamedProgramStringEXT GLEW_GET_FUN(__glewNamedProgramStringEXT) +#define glNamedRenderbufferStorageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageEXT) +#define glNamedRenderbufferStorageMultisampleCoverageEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleCoverageEXT) +#define glNamedRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewNamedRenderbufferStorageMultisampleEXT) +#define glProgramUniform1fEXT GLEW_GET_FUN(__glewProgramUniform1fEXT) +#define glProgramUniform1fvEXT GLEW_GET_FUN(__glewProgramUniform1fvEXT) +#define glProgramUniform1iEXT GLEW_GET_FUN(__glewProgramUniform1iEXT) +#define glProgramUniform1ivEXT GLEW_GET_FUN(__glewProgramUniform1ivEXT) +#define glProgramUniform1uiEXT GLEW_GET_FUN(__glewProgramUniform1uiEXT) +#define glProgramUniform1uivEXT GLEW_GET_FUN(__glewProgramUniform1uivEXT) +#define glProgramUniform2fEXT GLEW_GET_FUN(__glewProgramUniform2fEXT) +#define glProgramUniform2fvEXT GLEW_GET_FUN(__glewProgramUniform2fvEXT) +#define glProgramUniform2iEXT GLEW_GET_FUN(__glewProgramUniform2iEXT) +#define glProgramUniform2ivEXT GLEW_GET_FUN(__glewProgramUniform2ivEXT) +#define glProgramUniform2uiEXT GLEW_GET_FUN(__glewProgramUniform2uiEXT) +#define glProgramUniform2uivEXT GLEW_GET_FUN(__glewProgramUniform2uivEXT) +#define glProgramUniform3fEXT GLEW_GET_FUN(__glewProgramUniform3fEXT) +#define glProgramUniform3fvEXT GLEW_GET_FUN(__glewProgramUniform3fvEXT) +#define glProgramUniform3iEXT GLEW_GET_FUN(__glewProgramUniform3iEXT) +#define glProgramUniform3ivEXT GLEW_GET_FUN(__glewProgramUniform3ivEXT) +#define glProgramUniform3uiEXT GLEW_GET_FUN(__glewProgramUniform3uiEXT) +#define glProgramUniform3uivEXT GLEW_GET_FUN(__glewProgramUniform3uivEXT) +#define glProgramUniform4fEXT GLEW_GET_FUN(__glewProgramUniform4fEXT) +#define glProgramUniform4fvEXT GLEW_GET_FUN(__glewProgramUniform4fvEXT) +#define glProgramUniform4iEXT GLEW_GET_FUN(__glewProgramUniform4iEXT) +#define glProgramUniform4ivEXT GLEW_GET_FUN(__glewProgramUniform4ivEXT) +#define glProgramUniform4uiEXT GLEW_GET_FUN(__glewProgramUniform4uiEXT) +#define glProgramUniform4uivEXT GLEW_GET_FUN(__glewProgramUniform4uivEXT) +#define glProgramUniformMatrix2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2fvEXT) +#define glProgramUniformMatrix2x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3fvEXT) +#define glProgramUniformMatrix2x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4fvEXT) +#define glProgramUniformMatrix3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3fvEXT) +#define glProgramUniformMatrix3x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2fvEXT) +#define glProgramUniformMatrix3x4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4fvEXT) +#define glProgramUniformMatrix4fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4fvEXT) +#define glProgramUniformMatrix4x2fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2fvEXT) +#define glProgramUniformMatrix4x3fvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3fvEXT) +#define glPushClientAttribDefaultEXT GLEW_GET_FUN(__glewPushClientAttribDefaultEXT) +#define glTextureBufferEXT GLEW_GET_FUN(__glewTextureBufferEXT) +#define glTextureImage1DEXT GLEW_GET_FUN(__glewTextureImage1DEXT) +#define glTextureImage2DEXT GLEW_GET_FUN(__glewTextureImage2DEXT) +#define glTextureImage3DEXT GLEW_GET_FUN(__glewTextureImage3DEXT) +#define glTextureParameterIivEXT GLEW_GET_FUN(__glewTextureParameterIivEXT) +#define glTextureParameterIuivEXT GLEW_GET_FUN(__glewTextureParameterIuivEXT) +#define glTextureParameterfEXT GLEW_GET_FUN(__glewTextureParameterfEXT) +#define glTextureParameterfvEXT GLEW_GET_FUN(__glewTextureParameterfvEXT) +#define glTextureParameteriEXT GLEW_GET_FUN(__glewTextureParameteriEXT) +#define glTextureParameterivEXT GLEW_GET_FUN(__glewTextureParameterivEXT) +#define glTextureRenderbufferEXT GLEW_GET_FUN(__glewTextureRenderbufferEXT) +#define glTextureSubImage1DEXT GLEW_GET_FUN(__glewTextureSubImage1DEXT) +#define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT) +#define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT) +#define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT) +#define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT) +#define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT) +#define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT) +#define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT) +#define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT) +#define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT) +#define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT) +#define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT) +#define glVertexArrayVertexAttribDivisorEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribDivisorEXT) +#define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT) +#define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT) +#define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT) + +#define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access) + +#endif /* GL_EXT_direct_state_access */ + +/* -------------------------- GL_EXT_draw_buffers2 ------------------------- */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 + +typedef void (GLAPIENTRY * PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint buf, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (GLAPIENTRY * PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (GLAPIENTRY * PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum value, GLuint index, GLboolean* data); +typedef void (GLAPIENTRY * PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum value, GLuint index, GLint* data); +typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); + +#define glColorMaskIndexedEXT GLEW_GET_FUN(__glewColorMaskIndexedEXT) +#define glDisableIndexedEXT GLEW_GET_FUN(__glewDisableIndexedEXT) +#define glEnableIndexedEXT GLEW_GET_FUN(__glewEnableIndexedEXT) +#define glGetBooleanIndexedvEXT GLEW_GET_FUN(__glewGetBooleanIndexedvEXT) +#define glGetIntegerIndexedvEXT GLEW_GET_FUN(__glewGetIntegerIndexedvEXT) +#define glIsEnabledIndexedEXT GLEW_GET_FUN(__glewIsEnabledIndexedEXT) + +#define GLEW_EXT_draw_buffers2 GLEW_GET_VAR(__GLEW_EXT_draw_buffers2) + +#endif /* GL_EXT_draw_buffers2 */ + +/* ------------------------- GL_EXT_draw_instanced ------------------------- */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 + +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); + +#define glDrawArraysInstancedEXT GLEW_GET_FUN(__glewDrawArraysInstancedEXT) +#define glDrawElementsInstancedEXT GLEW_GET_FUN(__glewDrawElementsInstancedEXT) + +#define GLEW_EXT_draw_instanced GLEW_GET_VAR(__GLEW_EXT_draw_instanced) + +#endif /* GL_EXT_draw_instanced */ + +/* ----------------------- GL_EXT_draw_range_elements ---------------------- */ + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 + +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 + +typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); + +#define glDrawRangeElementsEXT GLEW_GET_FUN(__glewDrawRangeElementsEXT) + +#define GLEW_EXT_draw_range_elements GLEW_GET_VAR(__GLEW_EXT_draw_range_elements) + +#endif /* GL_EXT_draw_range_elements */ + +/* ---------------------------- GL_EXT_fog_coord --------------------------- */ + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 + +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 + +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); + +#define glFogCoordPointerEXT GLEW_GET_FUN(__glewFogCoordPointerEXT) +#define glFogCoorddEXT GLEW_GET_FUN(__glewFogCoorddEXT) +#define glFogCoorddvEXT GLEW_GET_FUN(__glewFogCoorddvEXT) +#define glFogCoordfEXT GLEW_GET_FUN(__glewFogCoordfEXT) +#define glFogCoordfvEXT GLEW_GET_FUN(__glewFogCoordfvEXT) + +#define GLEW_EXT_fog_coord GLEW_GET_VAR(__GLEW_EXT_fog_coord) + +#endif /* GL_EXT_fog_coord */ + +/* ------------------------ GL_EXT_fragment_lighting ----------------------- */ + +#ifndef GL_EXT_fragment_lighting +#define GL_EXT_fragment_lighting 1 + +#define GL_FRAGMENT_LIGHTING_EXT 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_EXT 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_EXT 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_EXT 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_EXT 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_EXT 0x8405 +#define GL_CURRENT_RASTER_NORMAL_EXT 0x8406 +#define GL_LIGHT_ENV_MODE_EXT 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_EXT 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_EXT 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_EXT 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_EXT 0x840B +#define GL_FRAGMENT_LIGHT0_EXT 0x840C +#define GL_FRAGMENT_LIGHT7_EXT 0x8413 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALEXTPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVEXTPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIEXTPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVEXTPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFEXTPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIEXTPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFEXTPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIEXTPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVEXTPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVEXTPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVEXTPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVEXTPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLLIGHTENVIEXTPROC) (GLenum pname, GLint param); + +#define glFragmentColorMaterialEXT GLEW_GET_FUN(__glewFragmentColorMaterialEXT) +#define glFragmentLightModelfEXT GLEW_GET_FUN(__glewFragmentLightModelfEXT) +#define glFragmentLightModelfvEXT GLEW_GET_FUN(__glewFragmentLightModelfvEXT) +#define glFragmentLightModeliEXT GLEW_GET_FUN(__glewFragmentLightModeliEXT) +#define glFragmentLightModelivEXT GLEW_GET_FUN(__glewFragmentLightModelivEXT) +#define glFragmentLightfEXT GLEW_GET_FUN(__glewFragmentLightfEXT) +#define glFragmentLightfvEXT GLEW_GET_FUN(__glewFragmentLightfvEXT) +#define glFragmentLightiEXT GLEW_GET_FUN(__glewFragmentLightiEXT) +#define glFragmentLightivEXT GLEW_GET_FUN(__glewFragmentLightivEXT) +#define glFragmentMaterialfEXT GLEW_GET_FUN(__glewFragmentMaterialfEXT) +#define glFragmentMaterialfvEXT GLEW_GET_FUN(__glewFragmentMaterialfvEXT) +#define glFragmentMaterialiEXT GLEW_GET_FUN(__glewFragmentMaterialiEXT) +#define glFragmentMaterialivEXT GLEW_GET_FUN(__glewFragmentMaterialivEXT) +#define glGetFragmentLightfvEXT GLEW_GET_FUN(__glewGetFragmentLightfvEXT) +#define glGetFragmentLightivEXT GLEW_GET_FUN(__glewGetFragmentLightivEXT) +#define glGetFragmentMaterialfvEXT GLEW_GET_FUN(__glewGetFragmentMaterialfvEXT) +#define glGetFragmentMaterialivEXT GLEW_GET_FUN(__glewGetFragmentMaterialivEXT) +#define glLightEnviEXT GLEW_GET_FUN(__glewLightEnviEXT) + +#define GLEW_EXT_fragment_lighting GLEW_GET_VAR(__GLEW_EXT_fragment_lighting) + +#endif /* GL_EXT_fragment_lighting */ + +/* ------------------------ GL_EXT_framebuffer_blit ------------------------ */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 + +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA + +typedef void (GLAPIENTRY * PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + +#define glBlitFramebufferEXT GLEW_GET_FUN(__glewBlitFramebufferEXT) + +#define GLEW_EXT_framebuffer_blit GLEW_GET_VAR(__GLEW_EXT_framebuffer_blit) + +#endif /* GL_EXT_framebuffer_blit */ + +/* --------------------- GL_EXT_framebuffer_multisample -------------------- */ + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 + +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleEXT GLEW_GET_FUN(__glewRenderbufferStorageMultisampleEXT) + +#define GLEW_EXT_framebuffer_multisample GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample) + +#endif /* GL_EXT_framebuffer_multisample */ + +/* --------------- GL_EXT_framebuffer_multisample_blit_scaled -------------- */ + +#ifndef GL_EXT_framebuffer_multisample_blit_scaled +#define GL_EXT_framebuffer_multisample_blit_scaled 1 + +#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA +#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB + +#define GLEW_EXT_framebuffer_multisample_blit_scaled GLEW_GET_VAR(__GLEW_EXT_framebuffer_multisample_blit_scaled) + +#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ + +/* ----------------------- GL_EXT_framebuffer_object ----------------------- */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 + +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 + +typedef void (GLAPIENTRY * PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (GLAPIENTRY * PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint* framebuffers); +typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint* renderbuffers); +typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef GLboolean (GLAPIENTRY * PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + +#define glBindFramebufferEXT GLEW_GET_FUN(__glewBindFramebufferEXT) +#define glBindRenderbufferEXT GLEW_GET_FUN(__glewBindRenderbufferEXT) +#define glCheckFramebufferStatusEXT GLEW_GET_FUN(__glewCheckFramebufferStatusEXT) +#define glDeleteFramebuffersEXT GLEW_GET_FUN(__glewDeleteFramebuffersEXT) +#define glDeleteRenderbuffersEXT GLEW_GET_FUN(__glewDeleteRenderbuffersEXT) +#define glFramebufferRenderbufferEXT GLEW_GET_FUN(__glewFramebufferRenderbufferEXT) +#define glFramebufferTexture1DEXT GLEW_GET_FUN(__glewFramebufferTexture1DEXT) +#define glFramebufferTexture2DEXT GLEW_GET_FUN(__glewFramebufferTexture2DEXT) +#define glFramebufferTexture3DEXT GLEW_GET_FUN(__glewFramebufferTexture3DEXT) +#define glGenFramebuffersEXT GLEW_GET_FUN(__glewGenFramebuffersEXT) +#define glGenRenderbuffersEXT GLEW_GET_FUN(__glewGenRenderbuffersEXT) +#define glGenerateMipmapEXT GLEW_GET_FUN(__glewGenerateMipmapEXT) +#define glGetFramebufferAttachmentParameterivEXT GLEW_GET_FUN(__glewGetFramebufferAttachmentParameterivEXT) +#define glGetRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetRenderbufferParameterivEXT) +#define glIsFramebufferEXT GLEW_GET_FUN(__glewIsFramebufferEXT) +#define glIsRenderbufferEXT GLEW_GET_FUN(__glewIsRenderbufferEXT) +#define glRenderbufferStorageEXT GLEW_GET_FUN(__glewRenderbufferStorageEXT) + +#define GLEW_EXT_framebuffer_object GLEW_GET_VAR(__GLEW_EXT_framebuffer_object) + +#endif /* GL_EXT_framebuffer_object */ + +/* ------------------------ GL_EXT_framebuffer_sRGB ------------------------ */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 + +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA + +#define GLEW_EXT_framebuffer_sRGB GLEW_GET_VAR(__GLEW_EXT_framebuffer_sRGB) + +#endif /* GL_EXT_framebuffer_sRGB */ + +/* ------------------------ GL_EXT_geometry_shader4 ------------------------ */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 + +#define GL_LINES_ADJACENCY_EXT 0xA +#define GL_LINE_STRIP_ADJACENCY_EXT 0xB +#define GL_TRIANGLES_ADJACENCY_EXT 0xC +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0xD +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); + +#define glFramebufferTextureEXT GLEW_GET_FUN(__glewFramebufferTextureEXT) +#define glFramebufferTextureFaceEXT GLEW_GET_FUN(__glewFramebufferTextureFaceEXT) +#define glProgramParameteriEXT GLEW_GET_FUN(__glewProgramParameteriEXT) + +#define GLEW_EXT_geometry_shader4 GLEW_GET_VAR(__GLEW_EXT_geometry_shader4) + +#endif /* GL_EXT_geometry_shader4 */ + +/* --------------------- GL_EXT_gpu_program_parameters --------------------- */ + +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat* params); + +#define glProgramEnvParameters4fvEXT GLEW_GET_FUN(__glewProgramEnvParameters4fvEXT) +#define glProgramLocalParameters4fvEXT GLEW_GET_FUN(__glewProgramLocalParameters4fvEXT) + +#define GLEW_EXT_gpu_program_parameters GLEW_GET_VAR(__GLEW_EXT_gpu_program_parameters) + +#endif /* GL_EXT_gpu_program_parameters */ + +/* --------------------------- GL_EXT_gpu_shader4 -------------------------- */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 + +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 + +typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); + +#define glBindFragDataLocationEXT GLEW_GET_FUN(__glewBindFragDataLocationEXT) +#define glGetFragDataLocationEXT GLEW_GET_FUN(__glewGetFragDataLocationEXT) +#define glGetUniformuivEXT GLEW_GET_FUN(__glewGetUniformuivEXT) +#define glGetVertexAttribIivEXT GLEW_GET_FUN(__glewGetVertexAttribIivEXT) +#define glGetVertexAttribIuivEXT GLEW_GET_FUN(__glewGetVertexAttribIuivEXT) +#define glUniform1uiEXT GLEW_GET_FUN(__glewUniform1uiEXT) +#define glUniform1uivEXT GLEW_GET_FUN(__glewUniform1uivEXT) +#define glUniform2uiEXT GLEW_GET_FUN(__glewUniform2uiEXT) +#define glUniform2uivEXT GLEW_GET_FUN(__glewUniform2uivEXT) +#define glUniform3uiEXT GLEW_GET_FUN(__glewUniform3uiEXT) +#define glUniform3uivEXT GLEW_GET_FUN(__glewUniform3uivEXT) +#define glUniform4uiEXT GLEW_GET_FUN(__glewUniform4uiEXT) +#define glUniform4uivEXT GLEW_GET_FUN(__glewUniform4uivEXT) +#define glVertexAttribI1iEXT GLEW_GET_FUN(__glewVertexAttribI1iEXT) +#define glVertexAttribI1ivEXT GLEW_GET_FUN(__glewVertexAttribI1ivEXT) +#define glVertexAttribI1uiEXT GLEW_GET_FUN(__glewVertexAttribI1uiEXT) +#define glVertexAttribI1uivEXT GLEW_GET_FUN(__glewVertexAttribI1uivEXT) +#define glVertexAttribI2iEXT GLEW_GET_FUN(__glewVertexAttribI2iEXT) +#define glVertexAttribI2ivEXT GLEW_GET_FUN(__glewVertexAttribI2ivEXT) +#define glVertexAttribI2uiEXT GLEW_GET_FUN(__glewVertexAttribI2uiEXT) +#define glVertexAttribI2uivEXT GLEW_GET_FUN(__glewVertexAttribI2uivEXT) +#define glVertexAttribI3iEXT GLEW_GET_FUN(__glewVertexAttribI3iEXT) +#define glVertexAttribI3ivEXT GLEW_GET_FUN(__glewVertexAttribI3ivEXT) +#define glVertexAttribI3uiEXT GLEW_GET_FUN(__glewVertexAttribI3uiEXT) +#define glVertexAttribI3uivEXT GLEW_GET_FUN(__glewVertexAttribI3uivEXT) +#define glVertexAttribI4bvEXT GLEW_GET_FUN(__glewVertexAttribI4bvEXT) +#define glVertexAttribI4iEXT GLEW_GET_FUN(__glewVertexAttribI4iEXT) +#define glVertexAttribI4ivEXT GLEW_GET_FUN(__glewVertexAttribI4ivEXT) +#define glVertexAttribI4svEXT GLEW_GET_FUN(__glewVertexAttribI4svEXT) +#define glVertexAttribI4ubvEXT GLEW_GET_FUN(__glewVertexAttribI4ubvEXT) +#define glVertexAttribI4uiEXT GLEW_GET_FUN(__glewVertexAttribI4uiEXT) +#define glVertexAttribI4uivEXT GLEW_GET_FUN(__glewVertexAttribI4uivEXT) +#define glVertexAttribI4usvEXT GLEW_GET_FUN(__glewVertexAttribI4usvEXT) +#define glVertexAttribIPointerEXT GLEW_GET_FUN(__glewVertexAttribIPointerEXT) + +#define GLEW_EXT_gpu_shader4 GLEW_GET_VAR(__GLEW_EXT_gpu_shader4) + +#endif /* GL_EXT_gpu_shader4 */ + +/* ---------------------------- GL_EXT_histogram --------------------------- */ + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 + +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 + +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (GLAPIENTRY * PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLRESETMINMAXEXTPROC) (GLenum target); + +#define glGetHistogramEXT GLEW_GET_FUN(__glewGetHistogramEXT) +#define glGetHistogramParameterfvEXT GLEW_GET_FUN(__glewGetHistogramParameterfvEXT) +#define glGetHistogramParameterivEXT GLEW_GET_FUN(__glewGetHistogramParameterivEXT) +#define glGetMinmaxEXT GLEW_GET_FUN(__glewGetMinmaxEXT) +#define glGetMinmaxParameterfvEXT GLEW_GET_FUN(__glewGetMinmaxParameterfvEXT) +#define glGetMinmaxParameterivEXT GLEW_GET_FUN(__glewGetMinmaxParameterivEXT) +#define glHistogramEXT GLEW_GET_FUN(__glewHistogramEXT) +#define glMinmaxEXT GLEW_GET_FUN(__glewMinmaxEXT) +#define glResetHistogramEXT GLEW_GET_FUN(__glewResetHistogramEXT) +#define glResetMinmaxEXT GLEW_GET_FUN(__glewResetMinmaxEXT) + +#define GLEW_EXT_histogram GLEW_GET_VAR(__GLEW_EXT_histogram) + +#endif /* GL_EXT_histogram */ + +/* ----------------------- GL_EXT_index_array_formats ---------------------- */ + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 + +#define GLEW_EXT_index_array_formats GLEW_GET_VAR(__GLEW_EXT_index_array_formats) + +#endif /* GL_EXT_index_array_formats */ + +/* --------------------------- GL_EXT_index_func --------------------------- */ + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 + +typedef void (GLAPIENTRY * PFNGLINDEXFUNCEXTPROC) (GLenum func, GLfloat ref); + +#define glIndexFuncEXT GLEW_GET_FUN(__glewIndexFuncEXT) + +#define GLEW_EXT_index_func GLEW_GET_VAR(__GLEW_EXT_index_func) + +#endif /* GL_EXT_index_func */ + +/* ------------------------- GL_EXT_index_material ------------------------- */ + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 + +typedef void (GLAPIENTRY * PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glIndexMaterialEXT GLEW_GET_FUN(__glewIndexMaterialEXT) + +#define GLEW_EXT_index_material GLEW_GET_VAR(__GLEW_EXT_index_material) + +#endif /* GL_EXT_index_material */ + +/* -------------------------- GL_EXT_index_texture ------------------------- */ + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 + +#define GLEW_EXT_index_texture GLEW_GET_VAR(__GLEW_EXT_index_texture) + +#endif /* GL_EXT_index_texture */ + +/* -------------------------- GL_EXT_light_texture ------------------------- */ + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 + +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 + +typedef void (GLAPIENTRY * PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (GLAPIENTRY * PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); + +#define glApplyTextureEXT GLEW_GET_FUN(__glewApplyTextureEXT) +#define glTextureLightEXT GLEW_GET_FUN(__glewTextureLightEXT) +#define glTextureMaterialEXT GLEW_GET_FUN(__glewTextureMaterialEXT) + +#define GLEW_EXT_light_texture GLEW_GET_VAR(__GLEW_EXT_light_texture) + +#endif /* GL_EXT_light_texture */ + +/* ------------------------- GL_EXT_misc_attribute ------------------------- */ + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 + +#define GLEW_EXT_misc_attribute GLEW_GET_VAR(__GLEW_EXT_misc_attribute) + +#endif /* GL_EXT_misc_attribute */ + +/* ------------------------ GL_EXT_multi_draw_arrays ----------------------- */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const void *const *indices, GLsizei primcount); + +#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT) +#define glMultiDrawElementsEXT GLEW_GET_FUN(__glewMultiDrawElementsEXT) + +#define GLEW_EXT_multi_draw_arrays GLEW_GET_VAR(__GLEW_EXT_multi_draw_arrays) + +#endif /* GL_EXT_multi_draw_arrays */ + +/* --------------------------- GL_EXT_multisample -------------------------- */ + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 + +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); + +#define glSampleMaskEXT GLEW_GET_FUN(__glewSampleMaskEXT) +#define glSamplePatternEXT GLEW_GET_FUN(__glewSamplePatternEXT) + +#define GLEW_EXT_multisample GLEW_GET_VAR(__GLEW_EXT_multisample) + +#endif /* GL_EXT_multisample */ + +/* ---------------------- GL_EXT_packed_depth_stencil ---------------------- */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 + +#define GLEW_EXT_packed_depth_stencil GLEW_GET_VAR(__GLEW_EXT_packed_depth_stencil) + +#endif /* GL_EXT_packed_depth_stencil */ + +/* -------------------------- GL_EXT_packed_float -------------------------- */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 + +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C + +#define GLEW_EXT_packed_float GLEW_GET_VAR(__GLEW_EXT_packed_float) + +#endif /* GL_EXT_packed_float */ + +/* -------------------------- GL_EXT_packed_pixels ------------------------- */ + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 + +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 + +#define GLEW_EXT_packed_pixels GLEW_GET_VAR(__GLEW_EXT_packed_pixels) + +#endif /* GL_EXT_packed_pixels */ + +/* ------------------------ GL_EXT_paletted_texture ------------------------ */ + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 + +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_COLOR_TABLE_FORMAT_EXT 0x80D8 +#define GL_COLOR_TABLE_WIDTH_EXT 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_EXT 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_EXT 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_EXT 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_EXT 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_EXT 0x80DF +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint* params); + +#define glColorTableEXT GLEW_GET_FUN(__glewColorTableEXT) +#define glGetColorTableEXT GLEW_GET_FUN(__glewGetColorTableEXT) +#define glGetColorTableParameterfvEXT GLEW_GET_FUN(__glewGetColorTableParameterfvEXT) +#define glGetColorTableParameterivEXT GLEW_GET_FUN(__glewGetColorTableParameterivEXT) + +#define GLEW_EXT_paletted_texture GLEW_GET_VAR(__GLEW_EXT_paletted_texture) + +#endif /* GL_EXT_paletted_texture */ + +/* ----------------------- GL_EXT_pixel_buffer_object ---------------------- */ + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 + +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF + +#define GLEW_EXT_pixel_buffer_object GLEW_GET_VAR(__GLEW_EXT_pixel_buffer_object) + +#endif /* GL_EXT_pixel_buffer_object */ + +/* ------------------------- GL_EXT_pixel_transform ------------------------ */ + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 + +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 + +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetPixelTransformParameterfvEXT GLEW_GET_FUN(__glewGetPixelTransformParameterfvEXT) +#define glGetPixelTransformParameterivEXT GLEW_GET_FUN(__glewGetPixelTransformParameterivEXT) +#define glPixelTransformParameterfEXT GLEW_GET_FUN(__glewPixelTransformParameterfEXT) +#define glPixelTransformParameterfvEXT GLEW_GET_FUN(__glewPixelTransformParameterfvEXT) +#define glPixelTransformParameteriEXT GLEW_GET_FUN(__glewPixelTransformParameteriEXT) +#define glPixelTransformParameterivEXT GLEW_GET_FUN(__glewPixelTransformParameterivEXT) + +#define GLEW_EXT_pixel_transform GLEW_GET_VAR(__GLEW_EXT_pixel_transform) + +#endif /* GL_EXT_pixel_transform */ + +/* ------------------- GL_EXT_pixel_transform_color_table ------------------ */ + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 + +#define GLEW_EXT_pixel_transform_color_table GLEW_GET_VAR(__GLEW_EXT_pixel_transform_color_table) + +#endif /* GL_EXT_pixel_transform_color_table */ + +/* ------------------------ GL_EXT_point_parameters ------------------------ */ + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 + +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat* params); + +#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT) +#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT) + +#define GLEW_EXT_point_parameters GLEW_GET_VAR(__GLEW_EXT_point_parameters) + +#endif /* GL_EXT_point_parameters */ + +/* ------------------------- GL_EXT_polygon_offset ------------------------- */ + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 + +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); + +#define glPolygonOffsetEXT GLEW_GET_FUN(__glewPolygonOffsetEXT) + +#define GLEW_EXT_polygon_offset GLEW_GET_VAR(__GLEW_EXT_polygon_offset) + +#endif /* GL_EXT_polygon_offset */ + +/* ---------------------- GL_EXT_polygon_offset_clamp ---------------------- */ + +#ifndef GL_EXT_polygon_offset_clamp +#define GL_EXT_polygon_offset_clamp 1 + +#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B + +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); + +#define glPolygonOffsetClampEXT GLEW_GET_FUN(__glewPolygonOffsetClampEXT) + +#define GLEW_EXT_polygon_offset_clamp GLEW_GET_VAR(__GLEW_EXT_polygon_offset_clamp) + +#endif /* GL_EXT_polygon_offset_clamp */ + +/* ----------------------- GL_EXT_post_depth_coverage ---------------------- */ + +#ifndef GL_EXT_post_depth_coverage +#define GL_EXT_post_depth_coverage 1 + +#define GLEW_EXT_post_depth_coverage GLEW_GET_VAR(__GLEW_EXT_post_depth_coverage) + +#endif /* GL_EXT_post_depth_coverage */ + +/* ------------------------ GL_EXT_provoking_vertex ------------------------ */ + +#ifndef GL_EXT_provoking_vertex +#define GL_EXT_provoking_vertex 1 + +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_PROVOKING_VERTEX_EXT 0x8E4F + +typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); + +#define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT) + +#define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex) + +#endif /* GL_EXT_provoking_vertex */ + +/* ----------------------- GL_EXT_raster_multisample ----------------------- */ + +#ifndef GL_EXT_raster_multisample +#define GL_EXT_raster_multisample 1 + +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 + +typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); +typedef void (GLAPIENTRY * PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufsize, GLfloat* v); +typedef void (GLAPIENTRY * PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); + +#define glCoverageModulationNV GLEW_GET_FUN(__glewCoverageModulationNV) +#define glCoverageModulationTableNV GLEW_GET_FUN(__glewCoverageModulationTableNV) +#define glGetCoverageModulationTableNV GLEW_GET_FUN(__glewGetCoverageModulationTableNV) +#define glRasterSamplesEXT GLEW_GET_FUN(__glewRasterSamplesEXT) + +#define GLEW_EXT_raster_multisample GLEW_GET_VAR(__GLEW_EXT_raster_multisample) + +#endif /* GL_EXT_raster_multisample */ + +/* ------------------------- GL_EXT_rescale_normal ------------------------- */ + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 + +#define GL_RESCALE_NORMAL_EXT 0x803A + +#define GLEW_EXT_rescale_normal GLEW_GET_VAR(__GLEW_EXT_rescale_normal) + +#endif /* GL_EXT_rescale_normal */ + +/* -------------------------- GL_EXT_scene_marker -------------------------- */ + +#ifndef GL_EXT_scene_marker +#define GL_EXT_scene_marker 1 + +typedef void (GLAPIENTRY * PFNGLBEGINSCENEEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLENDSCENEEXTPROC) (void); + +#define glBeginSceneEXT GLEW_GET_FUN(__glewBeginSceneEXT) +#define glEndSceneEXT GLEW_GET_FUN(__glewEndSceneEXT) + +#define GLEW_EXT_scene_marker GLEW_GET_VAR(__GLEW_EXT_scene_marker) + +#endif /* GL_EXT_scene_marker */ + +/* ------------------------- GL_EXT_secondary_color ------------------------ */ + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 + +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E + +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); + +#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT) +#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT) +#define glSecondaryColor3dEXT GLEW_GET_FUN(__glewSecondaryColor3dEXT) +#define glSecondaryColor3dvEXT GLEW_GET_FUN(__glewSecondaryColor3dvEXT) +#define glSecondaryColor3fEXT GLEW_GET_FUN(__glewSecondaryColor3fEXT) +#define glSecondaryColor3fvEXT GLEW_GET_FUN(__glewSecondaryColor3fvEXT) +#define glSecondaryColor3iEXT GLEW_GET_FUN(__glewSecondaryColor3iEXT) +#define glSecondaryColor3ivEXT GLEW_GET_FUN(__glewSecondaryColor3ivEXT) +#define glSecondaryColor3sEXT GLEW_GET_FUN(__glewSecondaryColor3sEXT) +#define glSecondaryColor3svEXT GLEW_GET_FUN(__glewSecondaryColor3svEXT) +#define glSecondaryColor3ubEXT GLEW_GET_FUN(__glewSecondaryColor3ubEXT) +#define glSecondaryColor3ubvEXT GLEW_GET_FUN(__glewSecondaryColor3ubvEXT) +#define glSecondaryColor3uiEXT GLEW_GET_FUN(__glewSecondaryColor3uiEXT) +#define glSecondaryColor3uivEXT GLEW_GET_FUN(__glewSecondaryColor3uivEXT) +#define glSecondaryColor3usEXT GLEW_GET_FUN(__glewSecondaryColor3usEXT) +#define glSecondaryColor3usvEXT GLEW_GET_FUN(__glewSecondaryColor3usvEXT) +#define glSecondaryColorPointerEXT GLEW_GET_FUN(__glewSecondaryColorPointerEXT) + +#define GLEW_EXT_secondary_color GLEW_GET_VAR(__GLEW_EXT_secondary_color) + +#endif /* GL_EXT_secondary_color */ + +/* --------------------- GL_EXT_separate_shader_objects -------------------- */ + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 + +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D + +typedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); +typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar* string); +typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); + +#define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT) +#define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT) +#define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT) + +#define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects) + +#endif /* GL_EXT_separate_shader_objects */ + +/* --------------------- GL_EXT_separate_specular_color -------------------- */ + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 + +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA + +#define GLEW_EXT_separate_specular_color GLEW_GET_VAR(__GLEW_EXT_separate_specular_color) + +#endif /* GL_EXT_separate_specular_color */ + +/* ------------------- GL_EXT_shader_image_load_formatted ------------------ */ + +#ifndef GL_EXT_shader_image_load_formatted +#define GL_EXT_shader_image_load_formatted 1 + +#define GLEW_EXT_shader_image_load_formatted GLEW_GET_VAR(__GLEW_EXT_shader_image_load_formatted) + +#endif /* GL_EXT_shader_image_load_formatted */ + +/* --------------------- GL_EXT_shader_image_load_store -------------------- */ + +#ifndef GL_EXT_shader_image_load_store +#define GL_EXT_shader_image_load_store 1 + +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF + +typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (GLAPIENTRY * PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); + +#define glBindImageTextureEXT GLEW_GET_FUN(__glewBindImageTextureEXT) +#define glMemoryBarrierEXT GLEW_GET_FUN(__glewMemoryBarrierEXT) + +#define GLEW_EXT_shader_image_load_store GLEW_GET_VAR(__GLEW_EXT_shader_image_load_store) + +#endif /* GL_EXT_shader_image_load_store */ + +/* ----------------------- GL_EXT_shader_integer_mix ----------------------- */ + +#ifndef GL_EXT_shader_integer_mix +#define GL_EXT_shader_integer_mix 1 + +#define GLEW_EXT_shader_integer_mix GLEW_GET_VAR(__GLEW_EXT_shader_integer_mix) + +#endif /* GL_EXT_shader_integer_mix */ + +/* -------------------------- GL_EXT_shadow_funcs -------------------------- */ + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 + +#define GLEW_EXT_shadow_funcs GLEW_GET_VAR(__GLEW_EXT_shadow_funcs) + +#endif /* GL_EXT_shadow_funcs */ + +/* --------------------- GL_EXT_shared_texture_palette --------------------- */ + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 + +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB + +#define GLEW_EXT_shared_texture_palette GLEW_GET_VAR(__GLEW_EXT_shared_texture_palette) + +#endif /* GL_EXT_shared_texture_palette */ + +/* ------------------------- GL_EXT_sparse_texture2 ------------------------ */ + +#ifndef GL_EXT_sparse_texture2 +#define GL_EXT_sparse_texture2 1 + +#define GLEW_EXT_sparse_texture2 GLEW_GET_VAR(__GLEW_EXT_sparse_texture2) + +#endif /* GL_EXT_sparse_texture2 */ + +/* ------------------------ GL_EXT_stencil_clear_tag ----------------------- */ + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 + +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 + +#define GLEW_EXT_stencil_clear_tag GLEW_GET_VAR(__GLEW_EXT_stencil_clear_tag) + +#endif /* GL_EXT_stencil_clear_tag */ + +/* ------------------------ GL_EXT_stencil_two_side ------------------------ */ + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 + +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 + +typedef void (GLAPIENTRY * PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); + +#define glActiveStencilFaceEXT GLEW_GET_FUN(__glewActiveStencilFaceEXT) + +#define GLEW_EXT_stencil_two_side GLEW_GET_VAR(__GLEW_EXT_stencil_two_side) + +#endif /* GL_EXT_stencil_two_side */ + +/* -------------------------- GL_EXT_stencil_wrap -------------------------- */ + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 + +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 + +#define GLEW_EXT_stencil_wrap GLEW_GET_VAR(__GLEW_EXT_stencil_wrap) + +#endif /* GL_EXT_stencil_wrap */ + +/* --------------------------- GL_EXT_subtexture --------------------------- */ + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 + +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); + +#define glTexSubImage1DEXT GLEW_GET_FUN(__glewTexSubImage1DEXT) +#define glTexSubImage2DEXT GLEW_GET_FUN(__glewTexSubImage2DEXT) +#define glTexSubImage3DEXT GLEW_GET_FUN(__glewTexSubImage3DEXT) + +#define GLEW_EXT_subtexture GLEW_GET_VAR(__GLEW_EXT_subtexture) + +#endif /* GL_EXT_subtexture */ + +/* ----------------------------- GL_EXT_texture ---------------------------- */ + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 + +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 + +#define GLEW_EXT_texture GLEW_GET_VAR(__GLEW_EXT_texture) + +#endif /* GL_EXT_texture */ + +/* ---------------------------- GL_EXT_texture3D --------------------------- */ + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 + +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); + +#define glTexImage3DEXT GLEW_GET_FUN(__glewTexImage3DEXT) + +#define GLEW_EXT_texture3D GLEW_GET_VAR(__GLEW_EXT_texture3D) + +#endif /* GL_EXT_texture3D */ + +/* -------------------------- GL_EXT_texture_array ------------------------- */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 + +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); + +#define glFramebufferTextureLayerEXT GLEW_GET_FUN(__glewFramebufferTextureLayerEXT) + +#define GLEW_EXT_texture_array GLEW_GET_VAR(__GLEW_EXT_texture_array) + +#endif /* GL_EXT_texture_array */ + +/* ---------------------- GL_EXT_texture_buffer_object --------------------- */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 + +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E + +typedef void (GLAPIENTRY * PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); + +#define glTexBufferEXT GLEW_GET_FUN(__glewTexBufferEXT) + +#define GLEW_EXT_texture_buffer_object GLEW_GET_VAR(__GLEW_EXT_texture_buffer_object) + +#endif /* GL_EXT_texture_buffer_object */ + +/* -------------------- GL_EXT_texture_compression_dxt1 -------------------- */ + +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 + +#define GLEW_EXT_texture_compression_dxt1 GLEW_GET_VAR(__GLEW_EXT_texture_compression_dxt1) + +#endif /* GL_EXT_texture_compression_dxt1 */ + +/* -------------------- GL_EXT_texture_compression_latc -------------------- */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 + +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 + +#define GLEW_EXT_texture_compression_latc GLEW_GET_VAR(__GLEW_EXT_texture_compression_latc) + +#endif /* GL_EXT_texture_compression_latc */ + +/* -------------------- GL_EXT_texture_compression_rgtc -------------------- */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 + +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE + +#define GLEW_EXT_texture_compression_rgtc GLEW_GET_VAR(__GLEW_EXT_texture_compression_rgtc) + +#endif /* GL_EXT_texture_compression_rgtc */ + +/* -------------------- GL_EXT_texture_compression_s3tc -------------------- */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 + +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 + +#define GLEW_EXT_texture_compression_s3tc GLEW_GET_VAR(__GLEW_EXT_texture_compression_s3tc) + +#endif /* GL_EXT_texture_compression_s3tc */ + +/* ------------------------ GL_EXT_texture_cube_map ------------------------ */ + +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 + +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C + +#define GLEW_EXT_texture_cube_map GLEW_GET_VAR(__GLEW_EXT_texture_cube_map) + +#endif /* GL_EXT_texture_cube_map */ + +/* ----------------------- GL_EXT_texture_edge_clamp ----------------------- */ + +#ifndef GL_EXT_texture_edge_clamp +#define GL_EXT_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_EXT 0x812F + +#define GLEW_EXT_texture_edge_clamp GLEW_GET_VAR(__GLEW_EXT_texture_edge_clamp) + +#endif /* GL_EXT_texture_edge_clamp */ + +/* --------------------------- GL_EXT_texture_env -------------------------- */ + +#ifndef GL_EXT_texture_env +#define GL_EXT_texture_env 1 + +#define GLEW_EXT_texture_env GLEW_GET_VAR(__GLEW_EXT_texture_env) + +#endif /* GL_EXT_texture_env */ + +/* ------------------------- GL_EXT_texture_env_add ------------------------ */ + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 + +#define GLEW_EXT_texture_env_add GLEW_GET_VAR(__GLEW_EXT_texture_env_add) + +#endif /* GL_EXT_texture_env_add */ + +/* ----------------------- GL_EXT_texture_env_combine ---------------------- */ + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 + +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A + +#define GLEW_EXT_texture_env_combine GLEW_GET_VAR(__GLEW_EXT_texture_env_combine) + +#endif /* GL_EXT_texture_env_combine */ + +/* ------------------------ GL_EXT_texture_env_dot3 ------------------------ */ + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 + +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 + +#define GLEW_EXT_texture_env_dot3 GLEW_GET_VAR(__GLEW_EXT_texture_env_dot3) + +#endif /* GL_EXT_texture_env_dot3 */ + +/* ------------------- GL_EXT_texture_filter_anisotropic ------------------- */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 + +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF + +#define GLEW_EXT_texture_filter_anisotropic GLEW_GET_VAR(__GLEW_EXT_texture_filter_anisotropic) + +#endif /* GL_EXT_texture_filter_anisotropic */ + +/* ---------------------- GL_EXT_texture_filter_minmax --------------------- */ + +#ifndef GL_EXT_texture_filter_minmax +#define GL_EXT_texture_filter_minmax 1 + +#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 +#define GL_WEIGHTED_AVERAGE_EXT 0x9367 + +#define GLEW_EXT_texture_filter_minmax GLEW_GET_VAR(__GLEW_EXT_texture_filter_minmax) + +#endif /* GL_EXT_texture_filter_minmax */ + +/* ------------------------- GL_EXT_texture_integer ------------------------ */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 + +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E + +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); + +#define glClearColorIiEXT GLEW_GET_FUN(__glewClearColorIiEXT) +#define glClearColorIuiEXT GLEW_GET_FUN(__glewClearColorIuiEXT) +#define glGetTexParameterIivEXT GLEW_GET_FUN(__glewGetTexParameterIivEXT) +#define glGetTexParameterIuivEXT GLEW_GET_FUN(__glewGetTexParameterIuivEXT) +#define glTexParameterIivEXT GLEW_GET_FUN(__glewTexParameterIivEXT) +#define glTexParameterIuivEXT GLEW_GET_FUN(__glewTexParameterIuivEXT) + +#define GLEW_EXT_texture_integer GLEW_GET_VAR(__GLEW_EXT_texture_integer) + +#endif /* GL_EXT_texture_integer */ + +/* ------------------------ GL_EXT_texture_lod_bias ------------------------ */ + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 + +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 + +#define GLEW_EXT_texture_lod_bias GLEW_GET_VAR(__GLEW_EXT_texture_lod_bias) + +#endif /* GL_EXT_texture_lod_bias */ + +/* ---------------------- GL_EXT_texture_mirror_clamp ---------------------- */ + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 + +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 + +#define GLEW_EXT_texture_mirror_clamp GLEW_GET_VAR(__GLEW_EXT_texture_mirror_clamp) + +#endif /* GL_EXT_texture_mirror_clamp */ + +/* ------------------------- GL_EXT_texture_object ------------------------- */ + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 + +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A + +typedef GLboolean (GLAPIENTRY * PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint* textures, GLboolean* residences); +typedef void (GLAPIENTRY * PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (GLAPIENTRY * PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint* textures); +typedef void (GLAPIENTRY * PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint* textures); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint* textures, const GLclampf* priorities); + +#define glAreTexturesResidentEXT GLEW_GET_FUN(__glewAreTexturesResidentEXT) +#define glBindTextureEXT GLEW_GET_FUN(__glewBindTextureEXT) +#define glDeleteTexturesEXT GLEW_GET_FUN(__glewDeleteTexturesEXT) +#define glGenTexturesEXT GLEW_GET_FUN(__glewGenTexturesEXT) +#define glIsTextureEXT GLEW_GET_FUN(__glewIsTextureEXT) +#define glPrioritizeTexturesEXT GLEW_GET_FUN(__glewPrioritizeTexturesEXT) + +#define GLEW_EXT_texture_object GLEW_GET_VAR(__GLEW_EXT_texture_object) + +#endif /* GL_EXT_texture_object */ + +/* --------------------- GL_EXT_texture_perturb_normal --------------------- */ + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 + +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF + +typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode); + +#define glTextureNormalEXT GLEW_GET_FUN(__glewTextureNormalEXT) + +#define GLEW_EXT_texture_perturb_normal GLEW_GET_VAR(__GLEW_EXT_texture_perturb_normal) + +#endif /* GL_EXT_texture_perturb_normal */ + +/* ------------------------ GL_EXT_texture_rectangle ----------------------- */ + +#ifndef GL_EXT_texture_rectangle +#define GL_EXT_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_EXT 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8 + +#define GLEW_EXT_texture_rectangle GLEW_GET_VAR(__GLEW_EXT_texture_rectangle) + +#endif /* GL_EXT_texture_rectangle */ + +/* -------------------------- GL_EXT_texture_sRGB -------------------------- */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 + +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F + +#define GLEW_EXT_texture_sRGB GLEW_GET_VAR(__GLEW_EXT_texture_sRGB) + +#endif /* GL_EXT_texture_sRGB */ + +/* ----------------------- GL_EXT_texture_sRGB_decode ---------------------- */ + +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 + +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A + +#define GLEW_EXT_texture_sRGB_decode GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_decode) + +#endif /* GL_EXT_texture_sRGB_decode */ + +/* --------------------- GL_EXT_texture_shared_exponent -------------------- */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 + +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F + +#define GLEW_EXT_texture_shared_exponent GLEW_GET_VAR(__GLEW_EXT_texture_shared_exponent) + +#endif /* GL_EXT_texture_shared_exponent */ + +/* -------------------------- GL_EXT_texture_snorm ------------------------- */ + +#ifndef GL_EXT_texture_snorm +#define GL_EXT_texture_snorm 1 + +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_ALPHA_SNORM 0x9010 +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_ALPHA8_SNORM 0x9014 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_ALPHA16_SNORM 0x9018 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_INTENSITY16_SNORM 0x901B + +#define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm) + +#endif /* GL_EXT_texture_snorm */ + +/* ------------------------- GL_EXT_texture_swizzle ------------------------ */ + +#ifndef GL_EXT_texture_swizzle +#define GL_EXT_texture_swizzle 1 + +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 + +#define GLEW_EXT_texture_swizzle GLEW_GET_VAR(__GLEW_EXT_texture_swizzle) + +#endif /* GL_EXT_texture_swizzle */ + +/* --------------------------- GL_EXT_timer_query -------------------------- */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 + +#define GL_TIME_ELAPSED_EXT 0x88BF + +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64EXT *params); +typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64EXT *params); + +#define glGetQueryObjecti64vEXT GLEW_GET_FUN(__glewGetQueryObjecti64vEXT) +#define glGetQueryObjectui64vEXT GLEW_GET_FUN(__glewGetQueryObjectui64vEXT) + +#define GLEW_EXT_timer_query GLEW_GET_VAR(__GLEW_EXT_timer_query) + +#endif /* GL_EXT_timer_query */ + +/* ----------------------- GL_EXT_transform_feedback ----------------------- */ + +#ifndef GL_EXT_transform_feedback +#define GL_EXT_transform_feedback 1 + +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F + +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar * const* varyings, GLenum bufferMode); + +#define glBeginTransformFeedbackEXT GLEW_GET_FUN(__glewBeginTransformFeedbackEXT) +#define glBindBufferBaseEXT GLEW_GET_FUN(__glewBindBufferBaseEXT) +#define glBindBufferOffsetEXT GLEW_GET_FUN(__glewBindBufferOffsetEXT) +#define glBindBufferRangeEXT GLEW_GET_FUN(__glewBindBufferRangeEXT) +#define glEndTransformFeedbackEXT GLEW_GET_FUN(__glewEndTransformFeedbackEXT) +#define glGetTransformFeedbackVaryingEXT GLEW_GET_FUN(__glewGetTransformFeedbackVaryingEXT) +#define glTransformFeedbackVaryingsEXT GLEW_GET_FUN(__glewTransformFeedbackVaryingsEXT) + +#define GLEW_EXT_transform_feedback GLEW_GET_VAR(__GLEW_EXT_transform_feedback) + +#endif /* GL_EXT_transform_feedback */ + +/* -------------------------- GL_EXT_vertex_array -------------------------- */ + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 + +#define GL_DOUBLE_EXT 0x140A +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 + +typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); + +#define glArrayElementEXT GLEW_GET_FUN(__glewArrayElementEXT) +#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT) +#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT) +#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT) +#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT) +#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT) +#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT) +#define glVertexPointerEXT GLEW_GET_FUN(__glewVertexPointerEXT) + +#define GLEW_EXT_vertex_array GLEW_GET_VAR(__GLEW_EXT_vertex_array) + +#endif /* GL_EXT_vertex_array */ + +/* ------------------------ GL_EXT_vertex_array_bgra ----------------------- */ + +#ifndef GL_EXT_vertex_array_bgra +#define GL_EXT_vertex_array_bgra 1 + +#define GL_BGRA 0x80E1 + +#define GLEW_EXT_vertex_array_bgra GLEW_GET_VAR(__GLEW_EXT_vertex_array_bgra) + +#endif /* GL_EXT_vertex_array_bgra */ + +/* ----------------------- GL_EXT_vertex_attrib_64bit ---------------------- */ + +#ifndef GL_EXT_vertex_attrib_64bit +#define GL_EXT_vertex_attrib_64bit 1 + +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4_EXT 0x8FFE + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); + +#define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT) +#define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT) +#define glVertexAttribL1dEXT GLEW_GET_FUN(__glewVertexAttribL1dEXT) +#define glVertexAttribL1dvEXT GLEW_GET_FUN(__glewVertexAttribL1dvEXT) +#define glVertexAttribL2dEXT GLEW_GET_FUN(__glewVertexAttribL2dEXT) +#define glVertexAttribL2dvEXT GLEW_GET_FUN(__glewVertexAttribL2dvEXT) +#define glVertexAttribL3dEXT GLEW_GET_FUN(__glewVertexAttribL3dEXT) +#define glVertexAttribL3dvEXT GLEW_GET_FUN(__glewVertexAttribL3dvEXT) +#define glVertexAttribL4dEXT GLEW_GET_FUN(__glewVertexAttribL4dEXT) +#define glVertexAttribL4dvEXT GLEW_GET_FUN(__glewVertexAttribL4dvEXT) +#define glVertexAttribLPointerEXT GLEW_GET_FUN(__glewVertexAttribLPointerEXT) + +#define GLEW_EXT_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_EXT_vertex_attrib_64bit) + +#endif /* GL_EXT_vertex_attrib_64bit */ + +/* -------------------------- GL_EXT_vertex_shader ------------------------- */ + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 + +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED + +typedef void (GLAPIENTRY * PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef GLuint (GLAPIENTRY * PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (GLAPIENTRY * PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef void (GLAPIENTRY * PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (GLAPIENTRY * PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (GLAPIENTRY * PFNGLGENSYMBOLSEXTPROC) (GLenum dataType, GLenum storageType, GLenum range, GLuint components); +typedef GLuint (GLAPIENTRY * PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (GLAPIENTRY * PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); +typedef void (GLAPIENTRY * PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLboolean (GLAPIENTRY * PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (GLAPIENTRY * PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, void *addr); +typedef void (GLAPIENTRY * PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, void *addr); +typedef void (GLAPIENTRY * PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (GLAPIENTRY * PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (GLAPIENTRY * PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (GLAPIENTRY * PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (GLAPIENTRY * PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, void *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTBVEXTPROC) (GLuint id, GLbyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTDVEXTPROC) (GLuint id, GLdouble *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTFVEXTPROC) (GLuint id, GLfloat *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTIVEXTPROC) (GLuint id, GLint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTSVEXTPROC) (GLuint id, GLshort *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUBVEXTPROC) (GLuint id, GLubyte *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUIVEXTPROC) (GLuint id, GLuint *addr); +typedef void (GLAPIENTRY * PFNGLVARIANTUSVEXTPROC) (GLuint id, GLushort *addr); +typedef void (GLAPIENTRY * PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); + +#define glBeginVertexShaderEXT GLEW_GET_FUN(__glewBeginVertexShaderEXT) +#define glBindLightParameterEXT GLEW_GET_FUN(__glewBindLightParameterEXT) +#define glBindMaterialParameterEXT GLEW_GET_FUN(__glewBindMaterialParameterEXT) +#define glBindParameterEXT GLEW_GET_FUN(__glewBindParameterEXT) +#define glBindTexGenParameterEXT GLEW_GET_FUN(__glewBindTexGenParameterEXT) +#define glBindTextureUnitParameterEXT GLEW_GET_FUN(__glewBindTextureUnitParameterEXT) +#define glBindVertexShaderEXT GLEW_GET_FUN(__glewBindVertexShaderEXT) +#define glDeleteVertexShaderEXT GLEW_GET_FUN(__glewDeleteVertexShaderEXT) +#define glDisableVariantClientStateEXT GLEW_GET_FUN(__glewDisableVariantClientStateEXT) +#define glEnableVariantClientStateEXT GLEW_GET_FUN(__glewEnableVariantClientStateEXT) +#define glEndVertexShaderEXT GLEW_GET_FUN(__glewEndVertexShaderEXT) +#define glExtractComponentEXT GLEW_GET_FUN(__glewExtractComponentEXT) +#define glGenSymbolsEXT GLEW_GET_FUN(__glewGenSymbolsEXT) +#define glGenVertexShadersEXT GLEW_GET_FUN(__glewGenVertexShadersEXT) +#define glGetInvariantBooleanvEXT GLEW_GET_FUN(__glewGetInvariantBooleanvEXT) +#define glGetInvariantFloatvEXT GLEW_GET_FUN(__glewGetInvariantFloatvEXT) +#define glGetInvariantIntegervEXT GLEW_GET_FUN(__glewGetInvariantIntegervEXT) +#define glGetLocalConstantBooleanvEXT GLEW_GET_FUN(__glewGetLocalConstantBooleanvEXT) +#define glGetLocalConstantFloatvEXT GLEW_GET_FUN(__glewGetLocalConstantFloatvEXT) +#define glGetLocalConstantIntegervEXT GLEW_GET_FUN(__glewGetLocalConstantIntegervEXT) +#define glGetVariantBooleanvEXT GLEW_GET_FUN(__glewGetVariantBooleanvEXT) +#define glGetVariantFloatvEXT GLEW_GET_FUN(__glewGetVariantFloatvEXT) +#define glGetVariantIntegervEXT GLEW_GET_FUN(__glewGetVariantIntegervEXT) +#define glGetVariantPointervEXT GLEW_GET_FUN(__glewGetVariantPointervEXT) +#define glInsertComponentEXT GLEW_GET_FUN(__glewInsertComponentEXT) +#define glIsVariantEnabledEXT GLEW_GET_FUN(__glewIsVariantEnabledEXT) +#define glSetInvariantEXT GLEW_GET_FUN(__glewSetInvariantEXT) +#define glSetLocalConstantEXT GLEW_GET_FUN(__glewSetLocalConstantEXT) +#define glShaderOp1EXT GLEW_GET_FUN(__glewShaderOp1EXT) +#define glShaderOp2EXT GLEW_GET_FUN(__glewShaderOp2EXT) +#define glShaderOp3EXT GLEW_GET_FUN(__glewShaderOp3EXT) +#define glSwizzleEXT GLEW_GET_FUN(__glewSwizzleEXT) +#define glVariantPointerEXT GLEW_GET_FUN(__glewVariantPointerEXT) +#define glVariantbvEXT GLEW_GET_FUN(__glewVariantbvEXT) +#define glVariantdvEXT GLEW_GET_FUN(__glewVariantdvEXT) +#define glVariantfvEXT GLEW_GET_FUN(__glewVariantfvEXT) +#define glVariantivEXT GLEW_GET_FUN(__glewVariantivEXT) +#define glVariantsvEXT GLEW_GET_FUN(__glewVariantsvEXT) +#define glVariantubvEXT GLEW_GET_FUN(__glewVariantubvEXT) +#define glVariantuivEXT GLEW_GET_FUN(__glewVariantuivEXT) +#define glVariantusvEXT GLEW_GET_FUN(__glewVariantusvEXT) +#define glWriteMaskEXT GLEW_GET_FUN(__glewWriteMaskEXT) + +#define GLEW_EXT_vertex_shader GLEW_GET_VAR(__GLEW_EXT_vertex_shader) + +#endif /* GL_EXT_vertex_shader */ + +/* ------------------------ GL_EXT_vertex_weighting ------------------------ */ + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 + +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 + +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, void *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTFVEXTPROC) (GLfloat* weight); + +#define glVertexWeightPointerEXT GLEW_GET_FUN(__glewVertexWeightPointerEXT) +#define glVertexWeightfEXT GLEW_GET_FUN(__glewVertexWeightfEXT) +#define glVertexWeightfvEXT GLEW_GET_FUN(__glewVertexWeightfvEXT) + +#define GLEW_EXT_vertex_weighting GLEW_GET_VAR(__GLEW_EXT_vertex_weighting) + +#endif /* GL_EXT_vertex_weighting */ + +/* ------------------------- GL_EXT_x11_sync_object ------------------------ */ + +#ifndef GL_EXT_x11_sync_object +#define GL_EXT_x11_sync_object 1 + +#define GL_SYNC_X11_FENCE_EXT 0x90E1 + +typedef GLsync (GLAPIENTRY * PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); + +#define glImportSyncEXT GLEW_GET_FUN(__glewImportSyncEXT) + +#define GLEW_EXT_x11_sync_object GLEW_GET_VAR(__GLEW_EXT_x11_sync_object) + +#endif /* GL_EXT_x11_sync_object */ + +/* ---------------------- GL_GREMEDY_frame_terminator ---------------------- */ + +#ifndef GL_GREMEDY_frame_terminator +#define GL_GREMEDY_frame_terminator 1 + +typedef void (GLAPIENTRY * PFNGLFRAMETERMINATORGREMEDYPROC) (void); + +#define glFrameTerminatorGREMEDY GLEW_GET_FUN(__glewFrameTerminatorGREMEDY) + +#define GLEW_GREMEDY_frame_terminator GLEW_GET_VAR(__GLEW_GREMEDY_frame_terminator) + +#endif /* GL_GREMEDY_frame_terminator */ + +/* ------------------------ GL_GREMEDY_string_marker ----------------------- */ + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 + +typedef void (GLAPIENTRY * PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); + +#define glStringMarkerGREMEDY GLEW_GET_FUN(__glewStringMarkerGREMEDY) + +#define GLEW_GREMEDY_string_marker GLEW_GET_VAR(__GLEW_GREMEDY_string_marker) + +#endif /* GL_GREMEDY_string_marker */ + +/* --------------------- GL_HP_convolution_border_modes -------------------- */ + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 + +#define GLEW_HP_convolution_border_modes GLEW_GET_VAR(__GLEW_HP_convolution_border_modes) + +#endif /* GL_HP_convolution_border_modes */ + +/* ------------------------- GL_HP_image_transform ------------------------- */ + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 + +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glGetImageTransformParameterfvHP GLEW_GET_FUN(__glewGetImageTransformParameterfvHP) +#define glGetImageTransformParameterivHP GLEW_GET_FUN(__glewGetImageTransformParameterivHP) +#define glImageTransformParameterfHP GLEW_GET_FUN(__glewImageTransformParameterfHP) +#define glImageTransformParameterfvHP GLEW_GET_FUN(__glewImageTransformParameterfvHP) +#define glImageTransformParameteriHP GLEW_GET_FUN(__glewImageTransformParameteriHP) +#define glImageTransformParameterivHP GLEW_GET_FUN(__glewImageTransformParameterivHP) + +#define GLEW_HP_image_transform GLEW_GET_VAR(__GLEW_HP_image_transform) + +#endif /* GL_HP_image_transform */ + +/* -------------------------- GL_HP_occlusion_test ------------------------- */ + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 + +#define GLEW_HP_occlusion_test GLEW_GET_VAR(__GLEW_HP_occlusion_test) + +#endif /* GL_HP_occlusion_test */ + +/* ------------------------- GL_HP_texture_lighting ------------------------ */ + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 + +#define GLEW_HP_texture_lighting GLEW_GET_VAR(__GLEW_HP_texture_lighting) + +#endif /* GL_HP_texture_lighting */ + +/* --------------------------- GL_IBM_cull_vertex -------------------------- */ + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 + +#define GL_CULL_VERTEX_IBM 103050 + +#define GLEW_IBM_cull_vertex GLEW_GET_VAR(__GLEW_IBM_cull_vertex) + +#endif /* GL_IBM_cull_vertex */ + +/* ---------------------- GL_IBM_multimode_draw_arrays --------------------- */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 + +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum* mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (GLAPIENTRY * PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum* mode, const GLsizei *count, GLenum type, const void *const *indices, GLsizei primcount, GLint modestride); + +#define glMultiModeDrawArraysIBM GLEW_GET_FUN(__glewMultiModeDrawArraysIBM) +#define glMultiModeDrawElementsIBM GLEW_GET_FUN(__glewMultiModeDrawElementsIBM) + +#define GLEW_IBM_multimode_draw_arrays GLEW_GET_VAR(__GLEW_IBM_multimode_draw_arrays) + +#endif /* GL_IBM_multimode_draw_arrays */ + +/* ------------------------- GL_IBM_rasterpos_clip ------------------------- */ + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 + +#define GL_RASTER_POSITION_UNCLIPPED_IBM 103010 + +#define GLEW_IBM_rasterpos_clip GLEW_GET_VAR(__GLEW_IBM_rasterpos_clip) + +#endif /* GL_IBM_rasterpos_clip */ + +/* --------------------------- GL_IBM_static_data -------------------------- */ + +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 + +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 + +#define GLEW_IBM_static_data GLEW_GET_VAR(__GLEW_IBM_static_data) + +#endif /* GL_IBM_static_data */ + +/* --------------------- GL_IBM_texture_mirrored_repeat -------------------- */ + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 + +#define GL_MIRRORED_REPEAT_IBM 0x8370 + +#define GLEW_IBM_texture_mirrored_repeat GLEW_GET_VAR(__GLEW_IBM_texture_mirrored_repeat) + +#endif /* GL_IBM_texture_mirrored_repeat */ + +/* ----------------------- GL_IBM_vertex_array_lists ----------------------- */ + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 + +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean ** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void** pointer, GLint ptrstride); + +#define glColorPointerListIBM GLEW_GET_FUN(__glewColorPointerListIBM) +#define glEdgeFlagPointerListIBM GLEW_GET_FUN(__glewEdgeFlagPointerListIBM) +#define glFogCoordPointerListIBM GLEW_GET_FUN(__glewFogCoordPointerListIBM) +#define glIndexPointerListIBM GLEW_GET_FUN(__glewIndexPointerListIBM) +#define glNormalPointerListIBM GLEW_GET_FUN(__glewNormalPointerListIBM) +#define glSecondaryColorPointerListIBM GLEW_GET_FUN(__glewSecondaryColorPointerListIBM) +#define glTexCoordPointerListIBM GLEW_GET_FUN(__glewTexCoordPointerListIBM) +#define glVertexPointerListIBM GLEW_GET_FUN(__glewVertexPointerListIBM) + +#define GLEW_IBM_vertex_array_lists GLEW_GET_VAR(__GLEW_IBM_vertex_array_lists) + +#endif /* GL_IBM_vertex_array_lists */ + +/* -------------------------- GL_INGR_color_clamp -------------------------- */ + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 + +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 + +#define GLEW_INGR_color_clamp GLEW_GET_VAR(__GLEW_INGR_color_clamp) + +#endif /* GL_INGR_color_clamp */ + +/* ------------------------- GL_INGR_interlace_read ------------------------ */ + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 + +#define GL_INTERLACE_READ_INGR 0x8568 + +#define GLEW_INGR_interlace_read GLEW_GET_VAR(__GLEW_INGR_interlace_read) + +#endif /* GL_INGR_interlace_read */ + +/* ------------------- GL_INTEL_fragment_shader_ordering ------------------- */ + +#ifndef GL_INTEL_fragment_shader_ordering +#define GL_INTEL_fragment_shader_ordering 1 + +#define GLEW_INTEL_fragment_shader_ordering GLEW_GET_VAR(__GLEW_INTEL_fragment_shader_ordering) + +#endif /* GL_INTEL_fragment_shader_ordering */ + +/* ----------------------- GL_INTEL_framebuffer_CMAA ----------------------- */ + +#ifndef GL_INTEL_framebuffer_CMAA +#define GL_INTEL_framebuffer_CMAA 1 + +#define GLEW_INTEL_framebuffer_CMAA GLEW_GET_VAR(__GLEW_INTEL_framebuffer_CMAA) + +#endif /* GL_INTEL_framebuffer_CMAA */ + +/* -------------------------- GL_INTEL_map_texture ------------------------- */ + +#ifndef GL_INTEL_map_texture +#define GL_INTEL_map_texture 1 + +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF + +typedef void * (GLAPIENTRY * PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint* stride, GLenum *layout); +typedef void (GLAPIENTRY * PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); +typedef void (GLAPIENTRY * PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); + +#define glMapTexture2DINTEL GLEW_GET_FUN(__glewMapTexture2DINTEL) +#define glSyncTextureINTEL GLEW_GET_FUN(__glewSyncTextureINTEL) +#define glUnmapTexture2DINTEL GLEW_GET_FUN(__glewUnmapTexture2DINTEL) + +#define GLEW_INTEL_map_texture GLEW_GET_VAR(__GLEW_INTEL_map_texture) + +#endif /* GL_INTEL_map_texture */ + +/* ------------------------ GL_INTEL_parallel_arrays ----------------------- */ + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 + +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 + +typedef void (GLAPIENTRY * PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void** pointer); + +#define glColorPointervINTEL GLEW_GET_FUN(__glewColorPointervINTEL) +#define glNormalPointervINTEL GLEW_GET_FUN(__glewNormalPointervINTEL) +#define glTexCoordPointervINTEL GLEW_GET_FUN(__glewTexCoordPointervINTEL) +#define glVertexPointervINTEL GLEW_GET_FUN(__glewVertexPointervINTEL) + +#define GLEW_INTEL_parallel_arrays GLEW_GET_VAR(__GLEW_INTEL_parallel_arrays) + +#endif /* GL_INTEL_parallel_arrays */ + +/* ----------------------- GL_INTEL_performance_query ---------------------- */ + +#ifndef GL_INTEL_performance_query +#define GL_INTEL_performance_query 1 + +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x0000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x0001 +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 + +typedef void (GLAPIENTRY * PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GLAPIENTRY * PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint* queryHandle); +typedef void (GLAPIENTRY * PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GLAPIENTRY * PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GLAPIENTRY * PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint* queryId); +typedef void (GLAPIENTRY * PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint* nextQueryId); +typedef void (GLAPIENTRY * PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar* counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +typedef void (GLAPIENTRY * PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); +typedef void (GLAPIENTRY * PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar* queryName, GLuint *queryId); +typedef void (GLAPIENTRY * PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar* queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); + +#define glBeginPerfQueryINTEL GLEW_GET_FUN(__glewBeginPerfQueryINTEL) +#define glCreatePerfQueryINTEL GLEW_GET_FUN(__glewCreatePerfQueryINTEL) +#define glDeletePerfQueryINTEL GLEW_GET_FUN(__glewDeletePerfQueryINTEL) +#define glEndPerfQueryINTEL GLEW_GET_FUN(__glewEndPerfQueryINTEL) +#define glGetFirstPerfQueryIdINTEL GLEW_GET_FUN(__glewGetFirstPerfQueryIdINTEL) +#define glGetNextPerfQueryIdINTEL GLEW_GET_FUN(__glewGetNextPerfQueryIdINTEL) +#define glGetPerfCounterInfoINTEL GLEW_GET_FUN(__glewGetPerfCounterInfoINTEL) +#define glGetPerfQueryDataINTEL GLEW_GET_FUN(__glewGetPerfQueryDataINTEL) +#define glGetPerfQueryIdByNameINTEL GLEW_GET_FUN(__glewGetPerfQueryIdByNameINTEL) +#define glGetPerfQueryInfoINTEL GLEW_GET_FUN(__glewGetPerfQueryInfoINTEL) + +#define GLEW_INTEL_performance_query GLEW_GET_VAR(__GLEW_INTEL_performance_query) + +#endif /* GL_INTEL_performance_query */ + +/* ------------------------ GL_INTEL_texture_scissor ----------------------- */ + +#ifndef GL_INTEL_texture_scissor +#define GL_INTEL_texture_scissor 1 + +typedef void (GLAPIENTRY * PFNGLTEXSCISSORFUNCINTELPROC) (GLenum target, GLenum lfunc, GLenum hfunc); +typedef void (GLAPIENTRY * PFNGLTEXSCISSORINTELPROC) (GLenum target, GLclampf tlow, GLclampf thigh); + +#define glTexScissorFuncINTEL GLEW_GET_FUN(__glewTexScissorFuncINTEL) +#define glTexScissorINTEL GLEW_GET_FUN(__glewTexScissorINTEL) + +#define GLEW_INTEL_texture_scissor GLEW_GET_VAR(__GLEW_INTEL_texture_scissor) + +#endif /* GL_INTEL_texture_scissor */ + +/* --------------------- GL_KHR_blend_equation_advanced -------------------- */ + +#ifndef GL_KHR_blend_equation_advanced +#define GL_KHR_blend_equation_advanced 1 + +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 +#define GL_MULTIPLY_KHR 0x9294 +#define GL_SCREEN_KHR 0x9295 +#define GL_OVERLAY_KHR 0x9296 +#define GL_DARKEN_KHR 0x9297 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORBURN_KHR 0x929A +#define GL_HARDLIGHT_KHR 0x929B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_DIFFERENCE_KHR 0x929E +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_LUMINOSITY_KHR 0x92B0 + +typedef void (GLAPIENTRY * PFNGLBLENDBARRIERKHRPROC) (void); + +#define glBlendBarrierKHR GLEW_GET_FUN(__glewBlendBarrierKHR) + +#define GLEW_KHR_blend_equation_advanced GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced) + +#endif /* GL_KHR_blend_equation_advanced */ + +/* ---------------- GL_KHR_blend_equation_advanced_coherent ---------------- */ + +#ifndef GL_KHR_blend_equation_advanced_coherent +#define GL_KHR_blend_equation_advanced_coherent 1 + +#define GLEW_KHR_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_KHR_blend_equation_advanced_coherent) + +#endif /* GL_KHR_blend_equation_advanced_coherent */ + +/* ---------------------- GL_KHR_context_flush_control --------------------- */ + +#ifndef GL_KHR_context_flush_control +#define GL_KHR_context_flush_control 1 + +#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC + +#define GLEW_KHR_context_flush_control GLEW_GET_VAR(__GLEW_KHR_context_flush_control) + +#endif /* GL_KHR_context_flush_control */ + +/* ------------------------------ GL_KHR_debug ----------------------------- */ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 + +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_BUFFER 0x82E0 +#define GL_SHADER 0x82E1 +#define GL_PROGRAM 0x82E2 +#define GL_QUERY 0x82E3 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_SAMPLER 0x82E6 +#define GL_DISPLAY_LIST 0x82E7 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_OUTPUT 0x92E0 + +typedef void (GLAPIENTRY *GLDEBUGPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam); + +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled); +typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* buf); +typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, GLchar* messageLog); +typedef void (GLAPIENTRY * PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei* length, GLchar *label); +typedef void (GLAPIENTRY * PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei* length, GLchar *label); +typedef void (GLAPIENTRY * PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar* label); +typedef void (GLAPIENTRY * PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar* label); +typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) (void); +typedef void (GLAPIENTRY * PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar * message); + +#define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback) +#define glDebugMessageControl GLEW_GET_FUN(__glewDebugMessageControl) +#define glDebugMessageInsert GLEW_GET_FUN(__glewDebugMessageInsert) +#define glGetDebugMessageLog GLEW_GET_FUN(__glewGetDebugMessageLog) +#define glGetObjectLabel GLEW_GET_FUN(__glewGetObjectLabel) +#define glGetObjectPtrLabel GLEW_GET_FUN(__glewGetObjectPtrLabel) +#define glObjectLabel GLEW_GET_FUN(__glewObjectLabel) +#define glObjectPtrLabel GLEW_GET_FUN(__glewObjectPtrLabel) +#define glPopDebugGroup GLEW_GET_FUN(__glewPopDebugGroup) +#define glPushDebugGroup GLEW_GET_FUN(__glewPushDebugGroup) + +#define GLEW_KHR_debug GLEW_GET_VAR(__GLEW_KHR_debug) + +#endif /* GL_KHR_debug */ + +/* ---------------------------- GL_KHR_no_error ---------------------------- */ + +#ifndef GL_KHR_no_error +#define GL_KHR_no_error 1 + +#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 + +#define GLEW_KHR_no_error GLEW_GET_VAR(__GLEW_KHR_no_error) + +#endif /* GL_KHR_no_error */ + +/* ------------------ GL_KHR_robust_buffer_access_behavior ----------------- */ + +#ifndef GL_KHR_robust_buffer_access_behavior +#define GL_KHR_robust_buffer_access_behavior 1 + +#define GLEW_KHR_robust_buffer_access_behavior GLEW_GET_VAR(__GLEW_KHR_robust_buffer_access_behavior) + +#endif /* GL_KHR_robust_buffer_access_behavior */ + +/* --------------------------- GL_KHR_robustness --------------------------- */ + +#ifndef GL_KHR_robustness +#define GL_KHR_robustness 1 + +#define GL_CONTEXT_LOST 0x0507 +#define GL_LOSE_CONTEXT_ON_RESET 0x8252 +#define GL_GUILTY_CONTEXT_RESET 0x8253 +#define GL_INNOCENT_CONTEXT_RESET 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 +#define GL_NO_RESET_NOTIFICATION 0x8261 +#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 + +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params); +typedef void (GLAPIENTRY * PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); + +#define glGetnUniformfv GLEW_GET_FUN(__glewGetnUniformfv) +#define glGetnUniformiv GLEW_GET_FUN(__glewGetnUniformiv) +#define glGetnUniformuiv GLEW_GET_FUN(__glewGetnUniformuiv) +#define glReadnPixels GLEW_GET_FUN(__glewReadnPixels) + +#define GLEW_KHR_robustness GLEW_GET_VAR(__GLEW_KHR_robustness) + +#endif /* GL_KHR_robustness */ + +/* ------------------ GL_KHR_texture_compression_astc_hdr ------------------ */ + +#ifndef GL_KHR_texture_compression_astc_hdr +#define GL_KHR_texture_compression_astc_hdr 1 + +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD + +#define GLEW_KHR_texture_compression_astc_hdr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_hdr) + +#endif /* GL_KHR_texture_compression_astc_hdr */ + +/* ------------------ GL_KHR_texture_compression_astc_ldr ------------------ */ + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 1 + +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD + +#define GLEW_KHR_texture_compression_astc_ldr GLEW_GET_VAR(__GLEW_KHR_texture_compression_astc_ldr) + +#endif /* GL_KHR_texture_compression_astc_ldr */ + +/* -------------------------- GL_KTX_buffer_region ------------------------- */ + +#ifndef GL_KTX_buffer_region +#define GL_KTX_buffer_region 1 + +#define GL_KTX_FRONT_REGION 0x0 +#define GL_KTX_BACK_REGION 0x1 +#define GL_KTX_Z_REGION 0x2 +#define GL_KTX_STENCIL_REGION 0x3 + +typedef GLuint (GLAPIENTRY * PFNGLBUFFERREGIONENABLEDPROC) (void); +typedef void (GLAPIENTRY * PFNGLDELETEBUFFERREGIONPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLDRAWBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height, GLint xDest, GLint yDest); +typedef GLuint (GLAPIENTRY * PFNGLNEWBUFFERREGIONPROC) (GLenum region); +typedef void (GLAPIENTRY * PFNGLREADBUFFERREGIONPROC) (GLuint region, GLint x, GLint y, GLsizei width, GLsizei height); + +#define glBufferRegionEnabled GLEW_GET_FUN(__glewBufferRegionEnabled) +#define glDeleteBufferRegion GLEW_GET_FUN(__glewDeleteBufferRegion) +#define glDrawBufferRegion GLEW_GET_FUN(__glewDrawBufferRegion) +#define glNewBufferRegion GLEW_GET_FUN(__glewNewBufferRegion) +#define glReadBufferRegion GLEW_GET_FUN(__glewReadBufferRegion) + +#define GLEW_KTX_buffer_region GLEW_GET_VAR(__GLEW_KTX_buffer_region) + +#endif /* GL_KTX_buffer_region */ + +/* ------------------------- GL_MESAX_texture_stack ------------------------ */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 + +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E + +#define GLEW_MESAX_texture_stack GLEW_GET_VAR(__GLEW_MESAX_texture_stack) + +#endif /* GL_MESAX_texture_stack */ + +/* -------------------------- GL_MESA_pack_invert -------------------------- */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 + +#define GL_PACK_INVERT_MESA 0x8758 + +#define GLEW_MESA_pack_invert GLEW_GET_VAR(__GLEW_MESA_pack_invert) + +#endif /* GL_MESA_pack_invert */ + +/* ------------------------- GL_MESA_resize_buffers ------------------------ */ + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 + +typedef void (GLAPIENTRY * PFNGLRESIZEBUFFERSMESAPROC) (void); + +#define glResizeBuffersMESA GLEW_GET_FUN(__glewResizeBuffersMESA) + +#define GLEW_MESA_resize_buffers GLEW_GET_VAR(__GLEW_MESA_resize_buffers) + +#endif /* GL_MESA_resize_buffers */ + +/* --------------------------- GL_MESA_window_pos -------------------------- */ + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 + +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS2SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVMESAPROC) (const GLshort* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4IVMESAPROC) (const GLint* p); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p); + +#define glWindowPos2dMESA GLEW_GET_FUN(__glewWindowPos2dMESA) +#define glWindowPos2dvMESA GLEW_GET_FUN(__glewWindowPos2dvMESA) +#define glWindowPos2fMESA GLEW_GET_FUN(__glewWindowPos2fMESA) +#define glWindowPos2fvMESA GLEW_GET_FUN(__glewWindowPos2fvMESA) +#define glWindowPos2iMESA GLEW_GET_FUN(__glewWindowPos2iMESA) +#define glWindowPos2ivMESA GLEW_GET_FUN(__glewWindowPos2ivMESA) +#define glWindowPos2sMESA GLEW_GET_FUN(__glewWindowPos2sMESA) +#define glWindowPos2svMESA GLEW_GET_FUN(__glewWindowPos2svMESA) +#define glWindowPos3dMESA GLEW_GET_FUN(__glewWindowPos3dMESA) +#define glWindowPos3dvMESA GLEW_GET_FUN(__glewWindowPos3dvMESA) +#define glWindowPos3fMESA GLEW_GET_FUN(__glewWindowPos3fMESA) +#define glWindowPos3fvMESA GLEW_GET_FUN(__glewWindowPos3fvMESA) +#define glWindowPos3iMESA GLEW_GET_FUN(__glewWindowPos3iMESA) +#define glWindowPos3ivMESA GLEW_GET_FUN(__glewWindowPos3ivMESA) +#define glWindowPos3sMESA GLEW_GET_FUN(__glewWindowPos3sMESA) +#define glWindowPos3svMESA GLEW_GET_FUN(__glewWindowPos3svMESA) +#define glWindowPos4dMESA GLEW_GET_FUN(__glewWindowPos4dMESA) +#define glWindowPos4dvMESA GLEW_GET_FUN(__glewWindowPos4dvMESA) +#define glWindowPos4fMESA GLEW_GET_FUN(__glewWindowPos4fMESA) +#define glWindowPos4fvMESA GLEW_GET_FUN(__glewWindowPos4fvMESA) +#define glWindowPos4iMESA GLEW_GET_FUN(__glewWindowPos4iMESA) +#define glWindowPos4ivMESA GLEW_GET_FUN(__glewWindowPos4ivMESA) +#define glWindowPos4sMESA GLEW_GET_FUN(__glewWindowPos4sMESA) +#define glWindowPos4svMESA GLEW_GET_FUN(__glewWindowPos4svMESA) + +#define GLEW_MESA_window_pos GLEW_GET_VAR(__GLEW_MESA_window_pos) + +#endif /* GL_MESA_window_pos */ + +/* ------------------------- GL_MESA_ycbcr_texture ------------------------- */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 + +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 + +#define GLEW_MESA_ycbcr_texture GLEW_GET_VAR(__GLEW_MESA_ycbcr_texture) + +#endif /* GL_MESA_ycbcr_texture */ + +/* ----------------------- GL_NVX_conditional_render ----------------------- */ + +#ifndef GL_NVX_conditional_render +#define GL_NVX_conditional_render 1 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVXPROC) (void); + +#define glBeginConditionalRenderNVX GLEW_GET_FUN(__glewBeginConditionalRenderNVX) +#define glEndConditionalRenderNVX GLEW_GET_FUN(__glewEndConditionalRenderNVX) + +#define GLEW_NVX_conditional_render GLEW_GET_VAR(__GLEW_NVX_conditional_render) + +#endif /* GL_NVX_conditional_render */ + +/* ------------------------- GL_NVX_gpu_memory_info ------------------------ */ + +#ifndef GL_NVX_gpu_memory_info +#define GL_NVX_gpu_memory_info 1 + +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B + +#define GLEW_NVX_gpu_memory_info GLEW_GET_VAR(__GLEW_NVX_gpu_memory_info) + +#endif /* GL_NVX_gpu_memory_info */ + +/* ------------------- GL_NV_bindless_multi_draw_indirect ------------------ */ + +#ifndef GL_NV_bindless_multi_draw_indirect +#define GL_NV_bindless_multi_draw_indirect 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); + +#define glMultiDrawArraysIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessNV) +#define glMultiDrawElementsIndirectBindlessNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessNV) + +#define GLEW_NV_bindless_multi_draw_indirect GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect) + +#endif /* GL_NV_bindless_multi_draw_indirect */ + +/* ---------------- GL_NV_bindless_multi_draw_indirect_count --------------- */ + +#ifndef GL_NV_bindless_multi_draw_indirect_count +#define GL_NV_bindless_multi_draw_indirect_count 1 + +typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); + +#define glMultiDrawArraysIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawArraysIndirectBindlessCountNV) +#define glMultiDrawElementsIndirectBindlessCountNV GLEW_GET_FUN(__glewMultiDrawElementsIndirectBindlessCountNV) + +#define GLEW_NV_bindless_multi_draw_indirect_count GLEW_GET_VAR(__GLEW_NV_bindless_multi_draw_indirect_count) + +#endif /* GL_NV_bindless_multi_draw_indirect_count */ + +/* ------------------------- GL_NV_bindless_texture ------------------------ */ + +#ifndef GL_NV_bindless_texture +#define GL_NV_bindless_texture 1 + +typedef GLuint64 (GLAPIENTRY * PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); +typedef GLuint64 (GLAPIENTRY * PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); +typedef GLboolean (GLAPIENTRY * PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef GLboolean (GLAPIENTRY * PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64* values); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); +typedef void (GLAPIENTRY * PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64* value); + +#define glGetImageHandleNV GLEW_GET_FUN(__glewGetImageHandleNV) +#define glGetTextureHandleNV GLEW_GET_FUN(__glewGetTextureHandleNV) +#define glGetTextureSamplerHandleNV GLEW_GET_FUN(__glewGetTextureSamplerHandleNV) +#define glIsImageHandleResidentNV GLEW_GET_FUN(__glewIsImageHandleResidentNV) +#define glIsTextureHandleResidentNV GLEW_GET_FUN(__glewIsTextureHandleResidentNV) +#define glMakeImageHandleNonResidentNV GLEW_GET_FUN(__glewMakeImageHandleNonResidentNV) +#define glMakeImageHandleResidentNV GLEW_GET_FUN(__glewMakeImageHandleResidentNV) +#define glMakeTextureHandleNonResidentNV GLEW_GET_FUN(__glewMakeTextureHandleNonResidentNV) +#define glMakeTextureHandleResidentNV GLEW_GET_FUN(__glewMakeTextureHandleResidentNV) +#define glProgramUniformHandleui64NV GLEW_GET_FUN(__glewProgramUniformHandleui64NV) +#define glProgramUniformHandleui64vNV GLEW_GET_FUN(__glewProgramUniformHandleui64vNV) +#define glUniformHandleui64NV GLEW_GET_FUN(__glewUniformHandleui64NV) +#define glUniformHandleui64vNV GLEW_GET_FUN(__glewUniformHandleui64vNV) + +#define GLEW_NV_bindless_texture GLEW_GET_VAR(__GLEW_NV_bindless_texture) + +#endif /* GL_NV_bindless_texture */ + +/* --------------------- GL_NV_blend_equation_advanced --------------------- */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 + +#define GL_XOR_NV 0x1506 +#define GL_RED_NV 0x1903 +#define GL_GREEN_NV 0x1904 +#define GL_BLUE_NV 0x1905 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_DISJOINT_NV 0x9283 +#define GL_CONJOINT_NV 0x9284 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#define GL_SRC_NV 0x9286 +#define GL_DST_NV 0x9287 +#define GL_SRC_OVER_NV 0x9288 +#define GL_DST_OVER_NV 0x9289 +#define GL_SRC_IN_NV 0x928A +#define GL_DST_IN_NV 0x928B +#define GL_SRC_OUT_NV 0x928C +#define GL_DST_OUT_NV 0x928D +#define GL_SRC_ATOP_NV 0x928E +#define GL_DST_ATOP_NV 0x928F +#define GL_PLUS_NV 0x9291 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_MULTIPLY_NV 0x9294 +#define GL_SCREEN_NV 0x9295 +#define GL_OVERLAY_NV 0x9296 +#define GL_DARKEN_NV 0x9297 +#define GL_LIGHTEN_NV 0x9298 +#define GL_COLORDODGE_NV 0x9299 +#define GL_COLORBURN_NV 0x929A +#define GL_HARDLIGHT_NV 0x929B +#define GL_SOFTLIGHT_NV 0x929C +#define GL_DIFFERENCE_NV 0x929E +#define GL_MINUS_NV 0x929F +#define GL_EXCLUSION_NV 0x92A0 +#define GL_CONTRAST_NV 0x92A1 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_INVERT_OVG_NV 0x92B4 + +typedef void (GLAPIENTRY * PFNGLBLENDBARRIERNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); + +#define glBlendBarrierNV GLEW_GET_FUN(__glewBlendBarrierNV) +#define glBlendParameteriNV GLEW_GET_FUN(__glewBlendParameteriNV) + +#define GLEW_NV_blend_equation_advanced GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced) + +#endif /* GL_NV_blend_equation_advanced */ + +/* ----------------- GL_NV_blend_equation_advanced_coherent ---------------- */ + +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 + +#define GLEW_NV_blend_equation_advanced_coherent GLEW_GET_VAR(__GLEW_NV_blend_equation_advanced_coherent) + +#endif /* GL_NV_blend_equation_advanced_coherent */ + +/* --------------------------- GL_NV_blend_square -------------------------- */ + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 + +#define GLEW_NV_blend_square GLEW_GET_VAR(__GLEW_NV_blend_square) + +#endif /* GL_NV_blend_square */ + +/* ------------------------- GL_NV_compute_program5 ------------------------ */ + +#ifndef GL_NV_compute_program5 +#define GL_NV_compute_program5 1 + +#define GL_COMPUTE_PROGRAM_NV 0x90FB +#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC + +#define GLEW_NV_compute_program5 GLEW_GET_VAR(__GLEW_NV_compute_program5) + +#endif /* GL_NV_compute_program5 */ + +/* ------------------------ GL_NV_conditional_render ----------------------- */ + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 + +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 + +typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void); + +#define glBeginConditionalRenderNV GLEW_GET_FUN(__glewBeginConditionalRenderNV) +#define glEndConditionalRenderNV GLEW_GET_FUN(__glewEndConditionalRenderNV) + +#define GLEW_NV_conditional_render GLEW_GET_VAR(__GLEW_NV_conditional_render) + +#endif /* GL_NV_conditional_render */ + +/* ----------------------- GL_NV_conservative_raster ----------------------- */ + +#ifndef GL_NV_conservative_raster +#define GL_NV_conservative_raster 1 + +#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 +#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 +#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 +#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 + +typedef void (GLAPIENTRY * PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); + +#define glSubpixelPrecisionBiasNV GLEW_GET_FUN(__glewSubpixelPrecisionBiasNV) + +#define GLEW_NV_conservative_raster GLEW_GET_VAR(__GLEW_NV_conservative_raster) + +#endif /* GL_NV_conservative_raster */ + +/* -------------------- GL_NV_conservative_raster_dilate ------------------- */ + +#ifndef GL_NV_conservative_raster_dilate +#define GL_NV_conservative_raster_dilate 1 + +#define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 +#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A +#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B + +typedef void (GLAPIENTRY * PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); + +#define glConservativeRasterParameterfNV GLEW_GET_FUN(__glewConservativeRasterParameterfNV) + +#define GLEW_NV_conservative_raster_dilate GLEW_GET_VAR(__GLEW_NV_conservative_raster_dilate) + +#endif /* GL_NV_conservative_raster_dilate */ + +/* ----------------------- GL_NV_copy_depth_to_color ----------------------- */ + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 + +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F + +#define GLEW_NV_copy_depth_to_color GLEW_GET_VAR(__GLEW_NV_copy_depth_to_color) + +#endif /* GL_NV_copy_depth_to_color */ + +/* ---------------------------- GL_NV_copy_image --------------------------- */ + +#ifndef GL_NV_copy_image +#define GL_NV_copy_image 1 + +typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); + +#define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV) + +#define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image) + +#endif /* GL_NV_copy_image */ + +/* -------------------------- GL_NV_deep_texture3D ------------------------- */ + +#ifndef GL_NV_deep_texture3D +#define GL_NV_deep_texture3D 1 + +#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 +#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 + +#define GLEW_NV_deep_texture3D GLEW_GET_VAR(__GLEW_NV_deep_texture3D) + +#endif /* GL_NV_deep_texture3D */ + +/* ------------------------ GL_NV_depth_buffer_float ----------------------- */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 + +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (GLAPIENTRY * PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); + +#define glClearDepthdNV GLEW_GET_FUN(__glewClearDepthdNV) +#define glDepthBoundsdNV GLEW_GET_FUN(__glewDepthBoundsdNV) +#define glDepthRangedNV GLEW_GET_FUN(__glewDepthRangedNV) + +#define GLEW_NV_depth_buffer_float GLEW_GET_VAR(__GLEW_NV_depth_buffer_float) + +#endif /* GL_NV_depth_buffer_float */ + +/* --------------------------- GL_NV_depth_clamp --------------------------- */ + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 + +#define GL_DEPTH_CLAMP_NV 0x864F + +#define GLEW_NV_depth_clamp GLEW_GET_VAR(__GLEW_NV_depth_clamp) + +#endif /* GL_NV_depth_clamp */ + +/* ---------------------- GL_NV_depth_range_unclamped ---------------------- */ + +#ifndef GL_NV_depth_range_unclamped +#define GL_NV_depth_range_unclamped 1 + +#define GL_SAMPLE_COUNT_BITS_NV 0x8864 +#define GL_CURRENT_SAMPLE_COUNT_QUERY_NV 0x8865 +#define GL_QUERY_RESULT_NV 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_NV 0x8867 +#define GL_SAMPLE_COUNT_NV 0x8914 + +#define GLEW_NV_depth_range_unclamped GLEW_GET_VAR(__GLEW_NV_depth_range_unclamped) + +#endif /* GL_NV_depth_range_unclamped */ + +/* --------------------------- GL_NV_draw_texture -------------------------- */ + +#ifndef GL_NV_draw_texture +#define GL_NV_draw_texture 1 + +typedef void (GLAPIENTRY * PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); + +#define glDrawTextureNV GLEW_GET_FUN(__glewDrawTextureNV) + +#define GLEW_NV_draw_texture GLEW_GET_VAR(__GLEW_NV_draw_texture) + +#endif /* GL_NV_draw_texture */ + +/* ---------------------------- GL_NV_evaluators --------------------------- */ + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 + +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 + +typedef void (GLAPIENTRY * PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint* params); + +#define glEvalMapsNV GLEW_GET_FUN(__glewEvalMapsNV) +#define glGetMapAttribParameterfvNV GLEW_GET_FUN(__glewGetMapAttribParameterfvNV) +#define glGetMapAttribParameterivNV GLEW_GET_FUN(__glewGetMapAttribParameterivNV) +#define glGetMapControlPointsNV GLEW_GET_FUN(__glewGetMapControlPointsNV) +#define glGetMapParameterfvNV GLEW_GET_FUN(__glewGetMapParameterfvNV) +#define glGetMapParameterivNV GLEW_GET_FUN(__glewGetMapParameterivNV) +#define glMapControlPointsNV GLEW_GET_FUN(__glewMapControlPointsNV) +#define glMapParameterfvNV GLEW_GET_FUN(__glewMapParameterfvNV) +#define glMapParameterivNV GLEW_GET_FUN(__glewMapParameterivNV) + +#define GLEW_NV_evaluators GLEW_GET_VAR(__GLEW_NV_evaluators) + +#endif /* GL_NV_evaluators */ + +/* ----------------------- GL_NV_explicit_multisample ---------------------- */ + +#ifndef GL_NV_explicit_multisample +#define GL_NV_explicit_multisample 1 + +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 + +typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat* val); +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); +typedef void (GLAPIENTRY * PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); + +#define glGetMultisamplefvNV GLEW_GET_FUN(__glewGetMultisamplefvNV) +#define glSampleMaskIndexedNV GLEW_GET_FUN(__glewSampleMaskIndexedNV) +#define glTexRenderbufferNV GLEW_GET_FUN(__glewTexRenderbufferNV) + +#define GLEW_NV_explicit_multisample GLEW_GET_VAR(__GLEW_NV_explicit_multisample) + +#endif /* GL_NV_explicit_multisample */ + +/* ------------------------------ GL_NV_fence ------------------------------ */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 + +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 + +typedef void (GLAPIENTRY * PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint* fences); +typedef void (GLAPIENTRY * PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLGENFENCESNVPROC) (GLsizei n, GLuint* fences); +typedef void (GLAPIENTRY * PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISFENCENVPROC) (GLuint fence); +typedef void (GLAPIENTRY * PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +typedef GLboolean (GLAPIENTRY * PFNGLTESTFENCENVPROC) (GLuint fence); + +#define glDeleteFencesNV GLEW_GET_FUN(__glewDeleteFencesNV) +#define glFinishFenceNV GLEW_GET_FUN(__glewFinishFenceNV) +#define glGenFencesNV GLEW_GET_FUN(__glewGenFencesNV) +#define glGetFenceivNV GLEW_GET_FUN(__glewGetFenceivNV) +#define glIsFenceNV GLEW_GET_FUN(__glewIsFenceNV) +#define glSetFenceNV GLEW_GET_FUN(__glewSetFenceNV) +#define glTestFenceNV GLEW_GET_FUN(__glewTestFenceNV) + +#define GLEW_NV_fence GLEW_GET_VAR(__GLEW_NV_fence) + +#endif /* GL_NV_fence */ + +/* -------------------------- GL_NV_fill_rectangle ------------------------- */ + +#ifndef GL_NV_fill_rectangle +#define GL_NV_fill_rectangle 1 + +#define GL_FILL_RECTANGLE_NV 0x933C + +#define GLEW_NV_fill_rectangle GLEW_GET_VAR(__GLEW_NV_fill_rectangle) + +#endif /* GL_NV_fill_rectangle */ + +/* --------------------------- GL_NV_float_buffer -------------------------- */ + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 + +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E + +#define GLEW_NV_float_buffer GLEW_GET_VAR(__GLEW_NV_float_buffer) + +#endif /* GL_NV_float_buffer */ + +/* --------------------------- GL_NV_fog_distance -------------------------- */ + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 + +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C + +#define GLEW_NV_fog_distance GLEW_GET_VAR(__GLEW_NV_fog_distance) + +#endif /* GL_NV_fog_distance */ + +/* -------------------- GL_NV_fragment_coverage_to_color ------------------- */ + +#ifndef GL_NV_fragment_coverage_to_color +#define GL_NV_fragment_coverage_to_color 1 + +#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD +#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); + +#define glFragmentCoverageColorNV GLEW_GET_FUN(__glewFragmentCoverageColorNV) + +#define GLEW_NV_fragment_coverage_to_color GLEW_GET_VAR(__GLEW_NV_fragment_coverage_to_color) + +#endif /* GL_NV_fragment_coverage_to_color */ + +/* ------------------------- GL_NV_fragment_program ------------------------ */ + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 + +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 + +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble *params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLdouble v[]); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte* name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte* name, const GLfloat v[]); + +#define glGetProgramNamedParameterdvNV GLEW_GET_FUN(__glewGetProgramNamedParameterdvNV) +#define glGetProgramNamedParameterfvNV GLEW_GET_FUN(__glewGetProgramNamedParameterfvNV) +#define glProgramNamedParameter4dNV GLEW_GET_FUN(__glewProgramNamedParameter4dNV) +#define glProgramNamedParameter4dvNV GLEW_GET_FUN(__glewProgramNamedParameter4dvNV) +#define glProgramNamedParameter4fNV GLEW_GET_FUN(__glewProgramNamedParameter4fNV) +#define glProgramNamedParameter4fvNV GLEW_GET_FUN(__glewProgramNamedParameter4fvNV) + +#define GLEW_NV_fragment_program GLEW_GET_VAR(__GLEW_NV_fragment_program) + +#endif /* GL_NV_fragment_program */ + +/* ------------------------ GL_NV_fragment_program2 ------------------------ */ + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 + +#define GLEW_NV_fragment_program2 GLEW_GET_VAR(__GLEW_NV_fragment_program2) + +#endif /* GL_NV_fragment_program2 */ + +/* ------------------------ GL_NV_fragment_program4 ------------------------ */ + +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 + +#define GLEW_NV_fragment_program4 GLEW_GET_VAR(__GLEW_NV_fragment_program4) + +#endif /* GL_NV_fragment_program4 */ + +/* --------------------- GL_NV_fragment_program_option --------------------- */ + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 + +#define GLEW_NV_fragment_program_option GLEW_GET_VAR(__GLEW_NV_fragment_program_option) + +#endif /* GL_NV_fragment_program_option */ + +/* -------------------- GL_NV_fragment_shader_interlock -------------------- */ + +#ifndef GL_NV_fragment_shader_interlock +#define GL_NV_fragment_shader_interlock 1 + +#define GLEW_NV_fragment_shader_interlock GLEW_GET_VAR(__GLEW_NV_fragment_shader_interlock) + +#endif /* GL_NV_fragment_shader_interlock */ + +/* -------------------- GL_NV_framebuffer_mixed_samples -------------------- */ + +#ifndef GL_NV_framebuffer_mixed_samples +#define GL_NV_framebuffer_mixed_samples 1 + +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 + +#define GLEW_NV_framebuffer_mixed_samples GLEW_GET_VAR(__GLEW_NV_framebuffer_mixed_samples) + +#endif /* GL_NV_framebuffer_mixed_samples */ + +/* ----------------- GL_NV_framebuffer_multisample_coverage ---------------- */ + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 + +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 + +typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); + +#define glRenderbufferStorageMultisampleCoverageNV GLEW_GET_FUN(__glewRenderbufferStorageMultisampleCoverageNV) + +#define GLEW_NV_framebuffer_multisample_coverage GLEW_GET_VAR(__GLEW_NV_framebuffer_multisample_coverage) + +#endif /* GL_NV_framebuffer_multisample_coverage */ + +/* ------------------------ GL_NV_geometry_program4 ------------------------ */ + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 + +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 + +typedef void (GLAPIENTRY * PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); + +#define glProgramVertexLimitNV GLEW_GET_FUN(__glewProgramVertexLimitNV) + +#define GLEW_NV_geometry_program4 GLEW_GET_VAR(__GLEW_NV_geometry_program4) + +#endif /* GL_NV_geometry_program4 */ + +/* ------------------------- GL_NV_geometry_shader4 ------------------------ */ + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 + +#define GLEW_NV_geometry_shader4 GLEW_GET_VAR(__GLEW_NV_geometry_shader4) + +#endif /* GL_NV_geometry_shader4 */ + +/* ------------------- GL_NV_geometry_shader_passthrough ------------------- */ + +#ifndef GL_NV_geometry_shader_passthrough +#define GL_NV_geometry_shader_passthrough 1 + +#define GLEW_NV_geometry_shader_passthrough GLEW_GET_VAR(__GLEW_NV_geometry_shader_passthrough) + +#endif /* GL_NV_geometry_shader_passthrough */ + +/* --------------------------- GL_NV_gpu_program4 -------------------------- */ + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 + +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 + +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); + +#define glProgramEnvParameterI4iNV GLEW_GET_FUN(__glewProgramEnvParameterI4iNV) +#define glProgramEnvParameterI4ivNV GLEW_GET_FUN(__glewProgramEnvParameterI4ivNV) +#define glProgramEnvParameterI4uiNV GLEW_GET_FUN(__glewProgramEnvParameterI4uiNV) +#define glProgramEnvParameterI4uivNV GLEW_GET_FUN(__glewProgramEnvParameterI4uivNV) +#define glProgramEnvParametersI4ivNV GLEW_GET_FUN(__glewProgramEnvParametersI4ivNV) +#define glProgramEnvParametersI4uivNV GLEW_GET_FUN(__glewProgramEnvParametersI4uivNV) +#define glProgramLocalParameterI4iNV GLEW_GET_FUN(__glewProgramLocalParameterI4iNV) +#define glProgramLocalParameterI4ivNV GLEW_GET_FUN(__glewProgramLocalParameterI4ivNV) +#define glProgramLocalParameterI4uiNV GLEW_GET_FUN(__glewProgramLocalParameterI4uiNV) +#define glProgramLocalParameterI4uivNV GLEW_GET_FUN(__glewProgramLocalParameterI4uivNV) +#define glProgramLocalParametersI4ivNV GLEW_GET_FUN(__glewProgramLocalParametersI4ivNV) +#define glProgramLocalParametersI4uivNV GLEW_GET_FUN(__glewProgramLocalParametersI4uivNV) + +#define GLEW_NV_gpu_program4 GLEW_GET_VAR(__GLEW_NV_gpu_program4) + +#endif /* GL_NV_gpu_program4 */ + +/* --------------------------- GL_NV_gpu_program5 -------------------------- */ + +#ifndef GL_NV_gpu_program5 +#define GL_NV_gpu_program5 1 + +#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C +#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F + +#define GLEW_NV_gpu_program5 GLEW_GET_VAR(__GLEW_NV_gpu_program5) + +#endif /* GL_NV_gpu_program5 */ + +/* -------------------- GL_NV_gpu_program5_mem_extended -------------------- */ + +#ifndef GL_NV_gpu_program5_mem_extended +#define GL_NV_gpu_program5_mem_extended 1 + +#define GLEW_NV_gpu_program5_mem_extended GLEW_GET_VAR(__GLEW_NV_gpu_program5_mem_extended) + +#endif /* GL_NV_gpu_program5_mem_extended */ + +/* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */ + +#ifndef GL_NV_gpu_program_fp64 +#define GL_NV_gpu_program_fp64 1 + +#define GLEW_NV_gpu_program_fp64 GLEW_GET_VAR(__GLEW_NV_gpu_program_fp64) + +#endif /* GL_NV_gpu_program_fp64 */ + +/* --------------------------- GL_NV_gpu_shader5 --------------------------- */ + +#ifndef GL_NV_gpu_shader5 +#define GL_NV_gpu_shader5 1 + +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB + +typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); + +#define glGetUniformi64vNV GLEW_GET_FUN(__glewGetUniformi64vNV) +#define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV) +#define glProgramUniform1i64NV GLEW_GET_FUN(__glewProgramUniform1i64NV) +#define glProgramUniform1i64vNV GLEW_GET_FUN(__glewProgramUniform1i64vNV) +#define glProgramUniform1ui64NV GLEW_GET_FUN(__glewProgramUniform1ui64NV) +#define glProgramUniform1ui64vNV GLEW_GET_FUN(__glewProgramUniform1ui64vNV) +#define glProgramUniform2i64NV GLEW_GET_FUN(__glewProgramUniform2i64NV) +#define glProgramUniform2i64vNV GLEW_GET_FUN(__glewProgramUniform2i64vNV) +#define glProgramUniform2ui64NV GLEW_GET_FUN(__glewProgramUniform2ui64NV) +#define glProgramUniform2ui64vNV GLEW_GET_FUN(__glewProgramUniform2ui64vNV) +#define glProgramUniform3i64NV GLEW_GET_FUN(__glewProgramUniform3i64NV) +#define glProgramUniform3i64vNV GLEW_GET_FUN(__glewProgramUniform3i64vNV) +#define glProgramUniform3ui64NV GLEW_GET_FUN(__glewProgramUniform3ui64NV) +#define glProgramUniform3ui64vNV GLEW_GET_FUN(__glewProgramUniform3ui64vNV) +#define glProgramUniform4i64NV GLEW_GET_FUN(__glewProgramUniform4i64NV) +#define glProgramUniform4i64vNV GLEW_GET_FUN(__glewProgramUniform4i64vNV) +#define glProgramUniform4ui64NV GLEW_GET_FUN(__glewProgramUniform4ui64NV) +#define glProgramUniform4ui64vNV GLEW_GET_FUN(__glewProgramUniform4ui64vNV) +#define glUniform1i64NV GLEW_GET_FUN(__glewUniform1i64NV) +#define glUniform1i64vNV GLEW_GET_FUN(__glewUniform1i64vNV) +#define glUniform1ui64NV GLEW_GET_FUN(__glewUniform1ui64NV) +#define glUniform1ui64vNV GLEW_GET_FUN(__glewUniform1ui64vNV) +#define glUniform2i64NV GLEW_GET_FUN(__glewUniform2i64NV) +#define glUniform2i64vNV GLEW_GET_FUN(__glewUniform2i64vNV) +#define glUniform2ui64NV GLEW_GET_FUN(__glewUniform2ui64NV) +#define glUniform2ui64vNV GLEW_GET_FUN(__glewUniform2ui64vNV) +#define glUniform3i64NV GLEW_GET_FUN(__glewUniform3i64NV) +#define glUniform3i64vNV GLEW_GET_FUN(__glewUniform3i64vNV) +#define glUniform3ui64NV GLEW_GET_FUN(__glewUniform3ui64NV) +#define glUniform3ui64vNV GLEW_GET_FUN(__glewUniform3ui64vNV) +#define glUniform4i64NV GLEW_GET_FUN(__glewUniform4i64NV) +#define glUniform4i64vNV GLEW_GET_FUN(__glewUniform4i64vNV) +#define glUniform4ui64NV GLEW_GET_FUN(__glewUniform4ui64NV) +#define glUniform4ui64vNV GLEW_GET_FUN(__glewUniform4ui64vNV) + +#define GLEW_NV_gpu_shader5 GLEW_GET_VAR(__GLEW_NV_gpu_shader5) + +#endif /* GL_NV_gpu_shader5 */ + +/* ---------------------------- GL_NV_half_float --------------------------- */ + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 + +#define GL_HALF_FLOAT_NV 0x140B + +typedef unsigned short GLhalf; + +typedef void (GLAPIENTRY * PFNGLCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLCOLOR4HNVPROC) (GLhalf red, GLhalf green, GLhalf blue, GLhalf alpha); +typedef void (GLAPIENTRY * PFNGLCOLOR4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHNVPROC) (GLhalf fog); +typedef void (GLAPIENTRY * PFNGLFOGCOORDHVNVPROC) (const GLhalf* fog); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalf s); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLNORMAL3HNVPROC) (GLhalf nx, GLhalf ny, GLhalf nz); +typedef void (GLAPIENTRY * PFNGLNORMAL3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HNVPROC) (GLhalf red, GLhalf green, GLhalf blue); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HNVPROC) (GLhalf s); +typedef void (GLAPIENTRY * PFNGLTEXCOORD1HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HNVPROC) (GLhalf s, GLhalf t); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HNVPROC) (GLhalf s, GLhalf t, GLhalf r); +typedef void (GLAPIENTRY * PFNGLTEXCOORD3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HNVPROC) (GLhalf s, GLhalf t, GLhalf r, GLhalf q); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX2HNVPROC) (GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEX2HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX3HNVPROC) (GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEX3HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEX4HNVPROC) (GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEX4HVNVPROC) (const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalf x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalf x, GLhalf y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalf x, GLhalf y, GLhalf z, GLhalf w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalf* v); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHNVPROC) (GLhalf weight); +typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight); + +#define glColor3hNV GLEW_GET_FUN(__glewColor3hNV) +#define glColor3hvNV GLEW_GET_FUN(__glewColor3hvNV) +#define glColor4hNV GLEW_GET_FUN(__glewColor4hNV) +#define glColor4hvNV GLEW_GET_FUN(__glewColor4hvNV) +#define glFogCoordhNV GLEW_GET_FUN(__glewFogCoordhNV) +#define glFogCoordhvNV GLEW_GET_FUN(__glewFogCoordhvNV) +#define glMultiTexCoord1hNV GLEW_GET_FUN(__glewMultiTexCoord1hNV) +#define glMultiTexCoord1hvNV GLEW_GET_FUN(__glewMultiTexCoord1hvNV) +#define glMultiTexCoord2hNV GLEW_GET_FUN(__glewMultiTexCoord2hNV) +#define glMultiTexCoord2hvNV GLEW_GET_FUN(__glewMultiTexCoord2hvNV) +#define glMultiTexCoord3hNV GLEW_GET_FUN(__glewMultiTexCoord3hNV) +#define glMultiTexCoord3hvNV GLEW_GET_FUN(__glewMultiTexCoord3hvNV) +#define glMultiTexCoord4hNV GLEW_GET_FUN(__glewMultiTexCoord4hNV) +#define glMultiTexCoord4hvNV GLEW_GET_FUN(__glewMultiTexCoord4hvNV) +#define glNormal3hNV GLEW_GET_FUN(__glewNormal3hNV) +#define glNormal3hvNV GLEW_GET_FUN(__glewNormal3hvNV) +#define glSecondaryColor3hNV GLEW_GET_FUN(__glewSecondaryColor3hNV) +#define glSecondaryColor3hvNV GLEW_GET_FUN(__glewSecondaryColor3hvNV) +#define glTexCoord1hNV GLEW_GET_FUN(__glewTexCoord1hNV) +#define glTexCoord1hvNV GLEW_GET_FUN(__glewTexCoord1hvNV) +#define glTexCoord2hNV GLEW_GET_FUN(__glewTexCoord2hNV) +#define glTexCoord2hvNV GLEW_GET_FUN(__glewTexCoord2hvNV) +#define glTexCoord3hNV GLEW_GET_FUN(__glewTexCoord3hNV) +#define glTexCoord3hvNV GLEW_GET_FUN(__glewTexCoord3hvNV) +#define glTexCoord4hNV GLEW_GET_FUN(__glewTexCoord4hNV) +#define glTexCoord4hvNV GLEW_GET_FUN(__glewTexCoord4hvNV) +#define glVertex2hNV GLEW_GET_FUN(__glewVertex2hNV) +#define glVertex2hvNV GLEW_GET_FUN(__glewVertex2hvNV) +#define glVertex3hNV GLEW_GET_FUN(__glewVertex3hNV) +#define glVertex3hvNV GLEW_GET_FUN(__glewVertex3hvNV) +#define glVertex4hNV GLEW_GET_FUN(__glewVertex4hNV) +#define glVertex4hvNV GLEW_GET_FUN(__glewVertex4hvNV) +#define glVertexAttrib1hNV GLEW_GET_FUN(__glewVertexAttrib1hNV) +#define glVertexAttrib1hvNV GLEW_GET_FUN(__glewVertexAttrib1hvNV) +#define glVertexAttrib2hNV GLEW_GET_FUN(__glewVertexAttrib2hNV) +#define glVertexAttrib2hvNV GLEW_GET_FUN(__glewVertexAttrib2hvNV) +#define glVertexAttrib3hNV GLEW_GET_FUN(__glewVertexAttrib3hNV) +#define glVertexAttrib3hvNV GLEW_GET_FUN(__glewVertexAttrib3hvNV) +#define glVertexAttrib4hNV GLEW_GET_FUN(__glewVertexAttrib4hNV) +#define glVertexAttrib4hvNV GLEW_GET_FUN(__glewVertexAttrib4hvNV) +#define glVertexAttribs1hvNV GLEW_GET_FUN(__glewVertexAttribs1hvNV) +#define glVertexAttribs2hvNV GLEW_GET_FUN(__glewVertexAttribs2hvNV) +#define glVertexAttribs3hvNV GLEW_GET_FUN(__glewVertexAttribs3hvNV) +#define glVertexAttribs4hvNV GLEW_GET_FUN(__glewVertexAttribs4hvNV) +#define glVertexWeighthNV GLEW_GET_FUN(__glewVertexWeighthNV) +#define glVertexWeighthvNV GLEW_GET_FUN(__glewVertexWeighthvNV) + +#define GLEW_NV_half_float GLEW_GET_VAR(__GLEW_NV_half_float) + +#endif /* GL_NV_half_float */ + +/* ------------------- GL_NV_internalformat_sample_query ------------------- */ + +#ifndef GL_NV_internalformat_sample_query +#define GL_NV_internalformat_sample_query 1 + +#define GL_MULTISAMPLES_NV 0x9371 +#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 +#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 +#define GL_CONFORMANT_NV 0x9374 + +typedef void (GLAPIENTRY * PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei bufSize, GLint* params); + +#define glGetInternalformatSampleivNV GLEW_GET_FUN(__glewGetInternalformatSampleivNV) + +#define GLEW_NV_internalformat_sample_query GLEW_GET_VAR(__GLEW_NV_internalformat_sample_query) + +#endif /* GL_NV_internalformat_sample_query */ + +/* ------------------------ GL_NV_light_max_exponent ----------------------- */ + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 + +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 + +#define GLEW_NV_light_max_exponent GLEW_GET_VAR(__GLEW_NV_light_max_exponent) + +#endif /* GL_NV_light_max_exponent */ + +/* ----------------------- GL_NV_multisample_coverage ---------------------- */ + +#ifndef GL_NV_multisample_coverage +#define GL_NV_multisample_coverage 1 + +#define GL_COLOR_SAMPLES_NV 0x8E20 + +#define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage) + +#endif /* GL_NV_multisample_coverage */ + +/* --------------------- GL_NV_multisample_filter_hint --------------------- */ + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 + +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 + +#define GLEW_NV_multisample_filter_hint GLEW_GET_VAR(__GLEW_NV_multisample_filter_hint) + +#endif /* GL_NV_multisample_filter_hint */ + +/* ------------------------- GL_NV_occlusion_query ------------------------- */ + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 + +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 + +typedef void (GLAPIENTRY * PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); + +#define glBeginOcclusionQueryNV GLEW_GET_FUN(__glewBeginOcclusionQueryNV) +#define glDeleteOcclusionQueriesNV GLEW_GET_FUN(__glewDeleteOcclusionQueriesNV) +#define glEndOcclusionQueryNV GLEW_GET_FUN(__glewEndOcclusionQueryNV) +#define glGenOcclusionQueriesNV GLEW_GET_FUN(__glewGenOcclusionQueriesNV) +#define glGetOcclusionQueryivNV GLEW_GET_FUN(__glewGetOcclusionQueryivNV) +#define glGetOcclusionQueryuivNV GLEW_GET_FUN(__glewGetOcclusionQueryuivNV) +#define glIsOcclusionQueryNV GLEW_GET_FUN(__glewIsOcclusionQueryNV) + +#define GLEW_NV_occlusion_query GLEW_GET_VAR(__GLEW_NV_occlusion_query) + +#endif /* GL_NV_occlusion_query */ + +/* ----------------------- GL_NV_packed_depth_stencil ---------------------- */ + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 + +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA + +#define GLEW_NV_packed_depth_stencil GLEW_GET_VAR(__GLEW_NV_packed_depth_stencil) + +#endif /* GL_NV_packed_depth_stencil */ + +/* --------------------- GL_NV_parameter_buffer_object --------------------- */ + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 + +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 + +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLuint *params); +typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint buffer, GLuint index, GLsizei count, const GLfloat *params); + +#define glProgramBufferParametersIivNV GLEW_GET_FUN(__glewProgramBufferParametersIivNV) +#define glProgramBufferParametersIuivNV GLEW_GET_FUN(__glewProgramBufferParametersIuivNV) +#define glProgramBufferParametersfvNV GLEW_GET_FUN(__glewProgramBufferParametersfvNV) + +#define GLEW_NV_parameter_buffer_object GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object) + +#endif /* GL_NV_parameter_buffer_object */ + +/* --------------------- GL_NV_parameter_buffer_object2 -------------------- */ + +#ifndef GL_NV_parameter_buffer_object2 +#define GL_NV_parameter_buffer_object2 1 + +#define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2) + +#endif /* GL_NV_parameter_buffer_object2 */ + +/* -------------------------- GL_NV_path_rendering ------------------------- */ + +#ifndef GL_NV_path_rendering +#define GL_NV_path_rendering 1 + +#define GL_CLOSE_PATH_NV 0x00 +#define GL_BOLD_BIT_NV 0x01 +#define GL_GLYPH_WIDTH_BIT_NV 0x01 +#define GL_GLYPH_HEIGHT_BIT_NV 0x02 +#define GL_ITALIC_BIT_NV 0x02 +#define GL_MOVE_TO_NV 0x02 +#define GL_RELATIVE_MOVE_TO_NV 0x03 +#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#define GL_LINE_TO_NV 0x04 +#define GL_RELATIVE_LINE_TO_NV 0x05 +#define GL_HORIZONTAL_LINE_TO_NV 0x06 +#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 +#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 +#define GL_VERTICAL_LINE_TO_NV 0x08 +#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 +#define GL_QUADRATIC_CURVE_TO_NV 0x0A +#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B +#define GL_CUBIC_CURVE_TO_NV 0x0C +#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D +#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E +#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F +#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 +#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 +#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 +#define GL_SMALL_CCW_ARC_TO_NV 0x12 +#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 +#define GL_SMALL_CW_ARC_TO_NV 0x14 +#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 +#define GL_LARGE_CCW_ARC_TO_NV 0x16 +#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 +#define GL_LARGE_CW_ARC_TO_NV 0x18 +#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 +#define GL_CONIC_CURVE_TO_NV 0x1A +#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B +#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 +#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 +#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 +#define GL_ROUNDED_RECT_NV 0xE8 +#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 +#define GL_ROUNDED_RECT2_NV 0xEA +#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB +#define GL_ROUNDED_RECT4_NV 0xEC +#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED +#define GL_ROUNDED_RECT8_NV 0xEE +#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF +#define GL_RESTART_PATH_NV 0xF0 +#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 +#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 +#define GL_RECT_NV 0xF6 +#define GL_RELATIVE_RECT_NV 0xF7 +#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 +#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA +#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC +#define GL_ARC_TO_NV 0xFE +#define GL_RELATIVE_ARC_TO_NV 0xFF +#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PATH_FORMAT_SVG_NV 0x9070 +#define GL_PATH_FORMAT_PS_NV 0x9071 +#define GL_STANDARD_FONT_NAME_NV 0x9072 +#define GL_SYSTEM_FONT_NAME_NV 0x9073 +#define GL_FILE_NAME_NV 0x9074 +#define GL_PATH_STROKE_WIDTH_NV 0x9075 +#define GL_PATH_END_CAPS_NV 0x9076 +#define GL_PATH_INITIAL_END_CAP_NV 0x9077 +#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 +#define GL_PATH_JOIN_STYLE_NV 0x9079 +#define GL_PATH_MITER_LIMIT_NV 0x907A +#define GL_PATH_DASH_CAPS_NV 0x907B +#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C +#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D +#define GL_PATH_DASH_OFFSET_NV 0x907E +#define GL_PATH_CLIENT_LENGTH_NV 0x907F +#define GL_PATH_FILL_MODE_NV 0x9080 +#define GL_PATH_FILL_MASK_NV 0x9081 +#define GL_PATH_FILL_COVER_MODE_NV 0x9082 +#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 +#define GL_PATH_STROKE_MASK_NV 0x9084 +#define GL_PATH_STROKE_BOUND_NV 0x9086 +#define GL_COUNT_UP_NV 0x9088 +#define GL_COUNT_DOWN_NV 0x9089 +#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A +#define GL_CONVEX_HULL_NV 0x908B +#define GL_BOUNDING_BOX_NV 0x908D +#define GL_TRANSLATE_X_NV 0x908E +#define GL_TRANSLATE_Y_NV 0x908F +#define GL_TRANSLATE_2D_NV 0x9090 +#define GL_TRANSLATE_3D_NV 0x9091 +#define GL_AFFINE_2D_NV 0x9092 +#define GL_AFFINE_3D_NV 0x9094 +#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 +#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 +#define GL_UTF8_NV 0x909A +#define GL_UTF16_NV 0x909B +#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C +#define GL_PATH_COMMAND_COUNT_NV 0x909D +#define GL_PATH_COORD_COUNT_NV 0x909E +#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F +#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 +#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 +#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 +#define GL_SQUARE_NV 0x90A3 +#define GL_ROUND_NV 0x90A4 +#define GL_TRIANGULAR_NV 0x90A5 +#define GL_BEVEL_NV 0x90A6 +#define GL_MITER_REVERT_NV 0x90A7 +#define GL_MITER_TRUNCATE_NV 0x90A8 +#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 +#define GL_USE_MISSING_GLYPH_NV 0x90AA +#define GL_PATH_ERROR_POSITION_NV 0x90AB +#define GL_PATH_FOG_GEN_MODE_NV 0x90AC +#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD +#define GL_ADJACENT_PAIRS_NV 0x90AE +#define GL_FIRST_TO_REST_NV 0x90AF +#define GL_PATH_GEN_MODE_NV 0x90B0 +#define GL_PATH_GEN_COEFF_NV 0x90B1 +#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 +#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 +#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 +#define GL_MOVE_TO_RESETS_NV 0x90B5 +#define GL_MOVE_TO_CONTINUES_NV 0x90B6 +#define GL_PATH_STENCIL_FUNC_NV 0x90B7 +#define GL_PATH_STENCIL_REF_NV 0x90B8 +#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 +#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD +#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE +#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF +#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 +#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 +#define GL_FONT_UNAVAILABLE_NV 0x936A +#define GL_FONT_UNINTELLIGIBLE_NV 0x936B +#define GL_STANDARD_FONT_FORMAT_NV 0x936C +#define GL_FRAGMENT_INPUT_NV 0x936D +#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 +#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 +#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 +#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 +#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 +#define GL_FONT_ASCENDER_BIT_NV 0x00200000 +#define GL_FONT_DESCENDER_BIT_NV 0x00400000 +#define GL_FONT_HEIGHT_BIT_NV 0x00800000 +#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 +#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 +#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 +#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 +#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 +#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 + +typedef void (GLAPIENTRY * PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); +typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (GLAPIENTRY * PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); +typedef GLuint (GLAPIENTRY * PFNGLGENPATHSNVPROC) (GLsizei range); +typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat* value); +typedef void (GLAPIENTRY * PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint* value); +typedef void (GLAPIENTRY * PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte* commands); +typedef void (GLAPIENTRY * PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat* coords); +typedef void (GLAPIENTRY * PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat* dashArray); +typedef GLfloat (GLAPIENTRY * PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef void (GLAPIENTRY * PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat* metrics); +typedef void (GLAPIENTRY * PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat* value); +typedef void (GLAPIENTRY * PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint* value); +typedef void (GLAPIENTRY * PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat* value); +typedef void (GLAPIENTRY * PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint* value); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum* props, GLsizei bufSize, GLsizei *length, GLfloat *params); +typedef void (GLAPIENTRY * PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef GLboolean (GLAPIENTRY * PFNGLISPATHNVPROC) (GLuint path); +typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (GLAPIENTRY * PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat* m); +typedef void (GLAPIENTRY * PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat* coeffs); +typedef void (GLAPIENTRY * PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); +typedef void (GLAPIENTRY * PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GLAPIENTRY * PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum zfunc); +typedef void (GLAPIENTRY * PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat* dashArray); +typedef void (GLAPIENTRY * PFNGLPATHFOGGENNVPROC) (GLenum genMode); +typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (GLAPIENTRY * PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint baseAndCount[2]); +typedef void (GLAPIENTRY * PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GLAPIENTRY * PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void*charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (GLAPIENTRY * PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); +typedef void (GLAPIENTRY * PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat* value); +typedef void (GLAPIENTRY * PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); +typedef void (GLAPIENTRY * PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint* value); +typedef void (GLAPIENTRY * PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); +typedef void (GLAPIENTRY * PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (GLAPIENTRY * PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); +typedef void (GLAPIENTRY * PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte* commands, GLsizei numCoords, GLenum coordType, const void*coords); +typedef void (GLAPIENTRY * PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GLAPIENTRY * PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat* coeffs); +typedef GLboolean (GLAPIENTRY * PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat* x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +typedef void (GLAPIENTRY * PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat* coeffs); +typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GLAPIENTRY * PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +typedef void (GLAPIENTRY * PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat* transformValues); +typedef void (GLAPIENTRY * PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint paths[], const GLfloat weights[]); + +#define glCopyPathNV GLEW_GET_FUN(__glewCopyPathNV) +#define glCoverFillPathInstancedNV GLEW_GET_FUN(__glewCoverFillPathInstancedNV) +#define glCoverFillPathNV GLEW_GET_FUN(__glewCoverFillPathNV) +#define glCoverStrokePathInstancedNV GLEW_GET_FUN(__glewCoverStrokePathInstancedNV) +#define glCoverStrokePathNV GLEW_GET_FUN(__glewCoverStrokePathNV) +#define glDeletePathsNV GLEW_GET_FUN(__glewDeletePathsNV) +#define glGenPathsNV GLEW_GET_FUN(__glewGenPathsNV) +#define glGetPathColorGenfvNV GLEW_GET_FUN(__glewGetPathColorGenfvNV) +#define glGetPathColorGenivNV GLEW_GET_FUN(__glewGetPathColorGenivNV) +#define glGetPathCommandsNV GLEW_GET_FUN(__glewGetPathCommandsNV) +#define glGetPathCoordsNV GLEW_GET_FUN(__glewGetPathCoordsNV) +#define glGetPathDashArrayNV GLEW_GET_FUN(__glewGetPathDashArrayNV) +#define glGetPathLengthNV GLEW_GET_FUN(__glewGetPathLengthNV) +#define glGetPathMetricRangeNV GLEW_GET_FUN(__glewGetPathMetricRangeNV) +#define glGetPathMetricsNV GLEW_GET_FUN(__glewGetPathMetricsNV) +#define glGetPathParameterfvNV GLEW_GET_FUN(__glewGetPathParameterfvNV) +#define glGetPathParameterivNV GLEW_GET_FUN(__glewGetPathParameterivNV) +#define glGetPathSpacingNV GLEW_GET_FUN(__glewGetPathSpacingNV) +#define glGetPathTexGenfvNV GLEW_GET_FUN(__glewGetPathTexGenfvNV) +#define glGetPathTexGenivNV GLEW_GET_FUN(__glewGetPathTexGenivNV) +#define glGetProgramResourcefvNV GLEW_GET_FUN(__glewGetProgramResourcefvNV) +#define glInterpolatePathsNV GLEW_GET_FUN(__glewInterpolatePathsNV) +#define glIsPathNV GLEW_GET_FUN(__glewIsPathNV) +#define glIsPointInFillPathNV GLEW_GET_FUN(__glewIsPointInFillPathNV) +#define glIsPointInStrokePathNV GLEW_GET_FUN(__glewIsPointInStrokePathNV) +#define glMatrixLoad3x2fNV GLEW_GET_FUN(__glewMatrixLoad3x2fNV) +#define glMatrixLoad3x3fNV GLEW_GET_FUN(__glewMatrixLoad3x3fNV) +#define glMatrixLoadTranspose3x3fNV GLEW_GET_FUN(__glewMatrixLoadTranspose3x3fNV) +#define glMatrixMult3x2fNV GLEW_GET_FUN(__glewMatrixMult3x2fNV) +#define glMatrixMult3x3fNV GLEW_GET_FUN(__glewMatrixMult3x3fNV) +#define glMatrixMultTranspose3x3fNV GLEW_GET_FUN(__glewMatrixMultTranspose3x3fNV) +#define glPathColorGenNV GLEW_GET_FUN(__glewPathColorGenNV) +#define glPathCommandsNV GLEW_GET_FUN(__glewPathCommandsNV) +#define glPathCoordsNV GLEW_GET_FUN(__glewPathCoordsNV) +#define glPathCoverDepthFuncNV GLEW_GET_FUN(__glewPathCoverDepthFuncNV) +#define glPathDashArrayNV GLEW_GET_FUN(__glewPathDashArrayNV) +#define glPathFogGenNV GLEW_GET_FUN(__glewPathFogGenNV) +#define glPathGlyphIndexArrayNV GLEW_GET_FUN(__glewPathGlyphIndexArrayNV) +#define glPathGlyphIndexRangeNV GLEW_GET_FUN(__glewPathGlyphIndexRangeNV) +#define glPathGlyphRangeNV GLEW_GET_FUN(__glewPathGlyphRangeNV) +#define glPathGlyphsNV GLEW_GET_FUN(__glewPathGlyphsNV) +#define glPathMemoryGlyphIndexArrayNV GLEW_GET_FUN(__glewPathMemoryGlyphIndexArrayNV) +#define glPathParameterfNV GLEW_GET_FUN(__glewPathParameterfNV) +#define glPathParameterfvNV GLEW_GET_FUN(__glewPathParameterfvNV) +#define glPathParameteriNV GLEW_GET_FUN(__glewPathParameteriNV) +#define glPathParameterivNV GLEW_GET_FUN(__glewPathParameterivNV) +#define glPathStencilDepthOffsetNV GLEW_GET_FUN(__glewPathStencilDepthOffsetNV) +#define glPathStencilFuncNV GLEW_GET_FUN(__glewPathStencilFuncNV) +#define glPathStringNV GLEW_GET_FUN(__glewPathStringNV) +#define glPathSubCommandsNV GLEW_GET_FUN(__glewPathSubCommandsNV) +#define glPathSubCoordsNV GLEW_GET_FUN(__glewPathSubCoordsNV) +#define glPathTexGenNV GLEW_GET_FUN(__glewPathTexGenNV) +#define glPointAlongPathNV GLEW_GET_FUN(__glewPointAlongPathNV) +#define glProgramPathFragmentInputGenNV GLEW_GET_FUN(__glewProgramPathFragmentInputGenNV) +#define glStencilFillPathInstancedNV GLEW_GET_FUN(__glewStencilFillPathInstancedNV) +#define glStencilFillPathNV GLEW_GET_FUN(__glewStencilFillPathNV) +#define glStencilStrokePathInstancedNV GLEW_GET_FUN(__glewStencilStrokePathInstancedNV) +#define glStencilStrokePathNV GLEW_GET_FUN(__glewStencilStrokePathNV) +#define glStencilThenCoverFillPathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverFillPathInstancedNV) +#define glStencilThenCoverFillPathNV GLEW_GET_FUN(__glewStencilThenCoverFillPathNV) +#define glStencilThenCoverStrokePathInstancedNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathInstancedNV) +#define glStencilThenCoverStrokePathNV GLEW_GET_FUN(__glewStencilThenCoverStrokePathNV) +#define glTransformPathNV GLEW_GET_FUN(__glewTransformPathNV) +#define glWeightPathsNV GLEW_GET_FUN(__glewWeightPathsNV) + +#define GLEW_NV_path_rendering GLEW_GET_VAR(__GLEW_NV_path_rendering) + +#endif /* GL_NV_path_rendering */ + +/* -------------------- GL_NV_path_rendering_shared_edge ------------------- */ + +#ifndef GL_NV_path_rendering_shared_edge +#define GL_NV_path_rendering_shared_edge 1 + +#define GL_SHARED_EDGE_NV 0xC0 + +#define GLEW_NV_path_rendering_shared_edge GLEW_GET_VAR(__GLEW_NV_path_rendering_shared_edge) + +#endif /* GL_NV_path_rendering_shared_edge */ + +/* ------------------------- GL_NV_pixel_data_range ------------------------ */ + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 + +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D + +typedef void (GLAPIENTRY * PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, void *pointer); + +#define glFlushPixelDataRangeNV GLEW_GET_FUN(__glewFlushPixelDataRangeNV) +#define glPixelDataRangeNV GLEW_GET_FUN(__glewPixelDataRangeNV) + +#define GLEW_NV_pixel_data_range GLEW_GET_VAR(__GLEW_NV_pixel_data_range) + +#endif /* GL_NV_pixel_data_range */ + +/* --------------------------- GL_NV_point_sprite -------------------------- */ + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 + +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 + +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint* params); + +#define glPointParameteriNV GLEW_GET_FUN(__glewPointParameteriNV) +#define glPointParameterivNV GLEW_GET_FUN(__glewPointParameterivNV) + +#define GLEW_NV_point_sprite GLEW_GET_VAR(__GLEW_NV_point_sprite) + +#endif /* GL_NV_point_sprite */ + +/* -------------------------- GL_NV_present_video -------------------------- */ + +#ifndef GL_NV_present_video +#define GL_NV_present_video 1 + +#define GL_FRAME_NV 0x8E26 +#define GL_FIELDS_NV 0x8E27 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESENT_DURATION_NV 0x8E2B + +typedef void (GLAPIENTRY * PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint* params); +typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); + +#define glGetVideoi64vNV GLEW_GET_FUN(__glewGetVideoi64vNV) +#define glGetVideoivNV GLEW_GET_FUN(__glewGetVideoivNV) +#define glGetVideoui64vNV GLEW_GET_FUN(__glewGetVideoui64vNV) +#define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV) +#define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV) +#define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV) + +#define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video) + +#endif /* GL_NV_present_video */ + +/* ------------------------ GL_NV_primitive_restart ------------------------ */ + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 + +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 + +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTNVPROC) (void); + +#define glPrimitiveRestartIndexNV GLEW_GET_FUN(__glewPrimitiveRestartIndexNV) +#define glPrimitiveRestartNV GLEW_GET_FUN(__glewPrimitiveRestartNV) + +#define GLEW_NV_primitive_restart GLEW_GET_VAR(__GLEW_NV_primitive_restart) + +#endif /* GL_NV_primitive_restart */ + +/* ------------------------ GL_NV_register_combiners ----------------------- */ + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 + +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 + +typedef void (GLAPIENTRY * PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint* params); + +#define glCombinerInputNV GLEW_GET_FUN(__glewCombinerInputNV) +#define glCombinerOutputNV GLEW_GET_FUN(__glewCombinerOutputNV) +#define glCombinerParameterfNV GLEW_GET_FUN(__glewCombinerParameterfNV) +#define glCombinerParameterfvNV GLEW_GET_FUN(__glewCombinerParameterfvNV) +#define glCombinerParameteriNV GLEW_GET_FUN(__glewCombinerParameteriNV) +#define glCombinerParameterivNV GLEW_GET_FUN(__glewCombinerParameterivNV) +#define glFinalCombinerInputNV GLEW_GET_FUN(__glewFinalCombinerInputNV) +#define glGetCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetCombinerInputParameterfvNV) +#define glGetCombinerInputParameterivNV GLEW_GET_FUN(__glewGetCombinerInputParameterivNV) +#define glGetCombinerOutputParameterfvNV GLEW_GET_FUN(__glewGetCombinerOutputParameterfvNV) +#define glGetCombinerOutputParameterivNV GLEW_GET_FUN(__glewGetCombinerOutputParameterivNV) +#define glGetFinalCombinerInputParameterfvNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterfvNV) +#define glGetFinalCombinerInputParameterivNV GLEW_GET_FUN(__glewGetFinalCombinerInputParameterivNV) + +#define GLEW_NV_register_combiners GLEW_GET_VAR(__GLEW_NV_register_combiners) + +#endif /* GL_NV_register_combiners */ + +/* ----------------------- GL_NV_register_combiners2 ----------------------- */ + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 + +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 + +typedef void (GLAPIENTRY * PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat* params); + +#define glCombinerStageParameterfvNV GLEW_GET_FUN(__glewCombinerStageParameterfvNV) +#define glGetCombinerStageParameterfvNV GLEW_GET_FUN(__glewGetCombinerStageParameterfvNV) + +#define GLEW_NV_register_combiners2 GLEW_GET_VAR(__GLEW_NV_register_combiners2) + +#endif /* GL_NV_register_combiners2 */ + +/* ------------------------- GL_NV_sample_locations ------------------------ */ + +#ifndef GL_NV_sample_locations +#define GL_NV_sample_locations 1 + +#define GL_SAMPLE_LOCATION_NV 0x8E50 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat* v); + +#define glFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewFramebufferSampleLocationsfvNV) +#define glNamedFramebufferSampleLocationsfvNV GLEW_GET_FUN(__glewNamedFramebufferSampleLocationsfvNV) + +#define GLEW_NV_sample_locations GLEW_GET_VAR(__GLEW_NV_sample_locations) + +#endif /* GL_NV_sample_locations */ + +/* ------------------ GL_NV_sample_mask_override_coverage ------------------ */ + +#ifndef GL_NV_sample_mask_override_coverage +#define GL_NV_sample_mask_override_coverage 1 + +#define GLEW_NV_sample_mask_override_coverage GLEW_GET_VAR(__GLEW_NV_sample_mask_override_coverage) + +#endif /* GL_NV_sample_mask_override_coverage */ + +/* ---------------------- GL_NV_shader_atomic_counters --------------------- */ + +#ifndef GL_NV_shader_atomic_counters +#define GL_NV_shader_atomic_counters 1 + +#define GLEW_NV_shader_atomic_counters GLEW_GET_VAR(__GLEW_NV_shader_atomic_counters) + +#endif /* GL_NV_shader_atomic_counters */ + +/* ----------------------- GL_NV_shader_atomic_float ----------------------- */ + +#ifndef GL_NV_shader_atomic_float +#define GL_NV_shader_atomic_float 1 + +#define GLEW_NV_shader_atomic_float GLEW_GET_VAR(__GLEW_NV_shader_atomic_float) + +#endif /* GL_NV_shader_atomic_float */ + +/* -------------------- GL_NV_shader_atomic_fp16_vector -------------------- */ + +#ifndef GL_NV_shader_atomic_fp16_vector +#define GL_NV_shader_atomic_fp16_vector 1 + +#define GLEW_NV_shader_atomic_fp16_vector GLEW_GET_VAR(__GLEW_NV_shader_atomic_fp16_vector) + +#endif /* GL_NV_shader_atomic_fp16_vector */ + +/* ----------------------- GL_NV_shader_atomic_int64 ----------------------- */ + +#ifndef GL_NV_shader_atomic_int64 +#define GL_NV_shader_atomic_int64 1 + +#define GLEW_NV_shader_atomic_int64 GLEW_GET_VAR(__GLEW_NV_shader_atomic_int64) + +#endif /* GL_NV_shader_atomic_int64 */ + +/* ------------------------ GL_NV_shader_buffer_load ----------------------- */ + +#ifndef GL_NV_shader_buffer_load +#define GL_NV_shader_buffer_load 1 + +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 + +typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result); +typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params); +typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); +typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); +typedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); +typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); +typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value); +typedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); +typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value); + +#define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV) +#define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV) +#define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV) +#define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV) +#define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV) +#define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV) +#define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV) +#define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV) +#define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV) +#define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV) +#define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV) +#define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV) +#define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV) + +#define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load) + +#endif /* GL_NV_shader_buffer_load */ + +/* ------------------- GL_NV_shader_storage_buffer_object ------------------ */ + +#ifndef GL_NV_shader_storage_buffer_object +#define GL_NV_shader_storage_buffer_object 1 + +#define GLEW_NV_shader_storage_buffer_object GLEW_GET_VAR(__GLEW_NV_shader_storage_buffer_object) + +#endif /* GL_NV_shader_storage_buffer_object */ + +/* ----------------------- GL_NV_shader_thread_group ----------------------- */ + +#ifndef GL_NV_shader_thread_group +#define GL_NV_shader_thread_group 1 + +#define GL_WARP_SIZE_NV 0x9339 +#define GL_WARPS_PER_SM_NV 0x933A +#define GL_SM_COUNT_NV 0x933B + +#define GLEW_NV_shader_thread_group GLEW_GET_VAR(__GLEW_NV_shader_thread_group) + +#endif /* GL_NV_shader_thread_group */ + +/* ---------------------- GL_NV_shader_thread_shuffle ---------------------- */ + +#ifndef GL_NV_shader_thread_shuffle +#define GL_NV_shader_thread_shuffle 1 + +#define GLEW_NV_shader_thread_shuffle GLEW_GET_VAR(__GLEW_NV_shader_thread_shuffle) + +#endif /* GL_NV_shader_thread_shuffle */ + +/* ---------------------- GL_NV_tessellation_program5 ---------------------- */ + +#ifndef GL_NV_tessellation_program5 +#define GL_NV_tessellation_program5 1 + +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 + +#define GLEW_NV_tessellation_program5 GLEW_GET_VAR(__GLEW_NV_tessellation_program5) + +#endif /* GL_NV_tessellation_program5 */ + +/* -------------------------- GL_NV_texgen_emboss -------------------------- */ + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 + +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F + +#define GLEW_NV_texgen_emboss GLEW_GET_VAR(__GLEW_NV_texgen_emboss) + +#endif /* GL_NV_texgen_emboss */ + +/* ------------------------ GL_NV_texgen_reflection ------------------------ */ + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 + +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 + +#define GLEW_NV_texgen_reflection GLEW_GET_VAR(__GLEW_NV_texgen_reflection) + +#endif /* GL_NV_texgen_reflection */ + +/* ------------------------- GL_NV_texture_barrier ------------------------- */ + +#ifndef GL_NV_texture_barrier +#define GL_NV_texture_barrier 1 + +typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void); + +#define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV) + +#define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier) + +#endif /* GL_NV_texture_barrier */ + +/* --------------------- GL_NV_texture_compression_vtc --------------------- */ + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 + +#define GLEW_NV_texture_compression_vtc GLEW_GET_VAR(__GLEW_NV_texture_compression_vtc) + +#endif /* GL_NV_texture_compression_vtc */ + +/* ----------------------- GL_NV_texture_env_combine4 ---------------------- */ + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 + +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B + +#define GLEW_NV_texture_env_combine4 GLEW_GET_VAR(__GLEW_NV_texture_env_combine4) + +#endif /* GL_NV_texture_env_combine4 */ + +/* ---------------------- GL_NV_texture_expand_normal ---------------------- */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 + +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F + +#define GLEW_NV_texture_expand_normal GLEW_GET_VAR(__GLEW_NV_texture_expand_normal) + +#endif /* GL_NV_texture_expand_normal */ + +/* ----------------------- GL_NV_texture_multisample ----------------------- */ + +#ifndef GL_NV_texture_multisample +#define GL_NV_texture_multisample 1 + +#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 +#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (GLAPIENTRY * PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); + +#define glTexImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage2DMultisampleCoverageNV) +#define glTexImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTexImage3DMultisampleCoverageNV) +#define glTextureImage2DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage2DMultisampleCoverageNV) +#define glTextureImage2DMultisampleNV GLEW_GET_FUN(__glewTextureImage2DMultisampleNV) +#define glTextureImage3DMultisampleCoverageNV GLEW_GET_FUN(__glewTextureImage3DMultisampleCoverageNV) +#define glTextureImage3DMultisampleNV GLEW_GET_FUN(__glewTextureImage3DMultisampleNV) + +#define GLEW_NV_texture_multisample GLEW_GET_VAR(__GLEW_NV_texture_multisample) + +#endif /* GL_NV_texture_multisample */ + +/* ------------------------ GL_NV_texture_rectangle ------------------------ */ + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 + +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 + +#define GLEW_NV_texture_rectangle GLEW_GET_VAR(__GLEW_NV_texture_rectangle) + +#endif /* GL_NV_texture_rectangle */ + +/* -------------------------- GL_NV_texture_shader ------------------------- */ + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 + +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F + +#define GLEW_NV_texture_shader GLEW_GET_VAR(__GLEW_NV_texture_shader) + +#endif /* GL_NV_texture_shader */ + +/* ------------------------- GL_NV_texture_shader2 ------------------------- */ + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 + +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D + +#define GLEW_NV_texture_shader2 GLEW_GET_VAR(__GLEW_NV_texture_shader2) + +#endif /* GL_NV_texture_shader2 */ + +/* ------------------------- GL_NV_texture_shader3 ------------------------- */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 + +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 + +#define GLEW_NV_texture_shader3 GLEW_GET_VAR(__GLEW_NV_texture_shader3) + +#endif /* GL_NV_texture_shader3 */ + +/* ------------------------ GL_NV_transform_feedback ----------------------- */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 + +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F + +typedef void (GLAPIENTRY * PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (GLAPIENTRY * PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef GLint (GLAPIENTRY * PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLuint count, const GLint *attribs, GLenum bufferMode); +typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); + +#define glActiveVaryingNV GLEW_GET_FUN(__glewActiveVaryingNV) +#define glBeginTransformFeedbackNV GLEW_GET_FUN(__glewBeginTransformFeedbackNV) +#define glBindBufferBaseNV GLEW_GET_FUN(__glewBindBufferBaseNV) +#define glBindBufferOffsetNV GLEW_GET_FUN(__glewBindBufferOffsetNV) +#define glBindBufferRangeNV GLEW_GET_FUN(__glewBindBufferRangeNV) +#define glEndTransformFeedbackNV GLEW_GET_FUN(__glewEndTransformFeedbackNV) +#define glGetActiveVaryingNV GLEW_GET_FUN(__glewGetActiveVaryingNV) +#define glGetTransformFeedbackVaryingNV GLEW_GET_FUN(__glewGetTransformFeedbackVaryingNV) +#define glGetVaryingLocationNV GLEW_GET_FUN(__glewGetVaryingLocationNV) +#define glTransformFeedbackAttribsNV GLEW_GET_FUN(__glewTransformFeedbackAttribsNV) +#define glTransformFeedbackVaryingsNV GLEW_GET_FUN(__glewTransformFeedbackVaryingsNV) + +#define GLEW_NV_transform_feedback GLEW_GET_VAR(__GLEW_NV_transform_feedback) + +#endif /* GL_NV_transform_feedback */ + +/* ----------------------- GL_NV_transform_feedback2 ----------------------- */ + +#ifndef GL_NV_transform_feedback2 +#define GL_NV_transform_feedback2 1 + +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 + +typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); +typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids); +typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); +typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); + +#define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV) +#define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV) +#define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV) +#define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV) +#define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV) +#define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV) +#define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV) + +#define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2) + +#endif /* GL_NV_transform_feedback2 */ + +/* ------------------ GL_NV_uniform_buffer_unified_memory ------------------ */ + +#ifndef GL_NV_uniform_buffer_unified_memory +#define GL_NV_uniform_buffer_unified_memory 1 + +#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E +#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F +#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 + +#define GLEW_NV_uniform_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_uniform_buffer_unified_memory) + +#endif /* GL_NV_uniform_buffer_unified_memory */ + +/* -------------------------- GL_NV_vdpau_interop -------------------------- */ + +#ifndef GL_NV_vdpau_interop +#define GL_NV_vdpau_interop 1 + +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_WRITE_DISCARD_NV 0x88BE + +typedef GLintptr GLvdpauSurfaceNV; + +typedef void (GLAPIENTRY * PFNGLVDPAUFININVPROC) (void); +typedef void (GLAPIENTRY * PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values); +typedef void (GLAPIENTRY * PFNGLVDPAUINITNVPROC) (const void* vdpDevice, const void*getProcAddress); +typedef void (GLAPIENTRY * PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (GLAPIENTRY * PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces); +typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef void (GLAPIENTRY * PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); +typedef void (GLAPIENTRY * PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV* surfaces); +typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); + +#define glVDPAUFiniNV GLEW_GET_FUN(__glewVDPAUFiniNV) +#define glVDPAUGetSurfaceivNV GLEW_GET_FUN(__glewVDPAUGetSurfaceivNV) +#define glVDPAUInitNV GLEW_GET_FUN(__glewVDPAUInitNV) +#define glVDPAUIsSurfaceNV GLEW_GET_FUN(__glewVDPAUIsSurfaceNV) +#define glVDPAUMapSurfacesNV GLEW_GET_FUN(__glewVDPAUMapSurfacesNV) +#define glVDPAURegisterOutputSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterOutputSurfaceNV) +#define glVDPAURegisterVideoSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceNV) +#define glVDPAUSurfaceAccessNV GLEW_GET_FUN(__glewVDPAUSurfaceAccessNV) +#define glVDPAUUnmapSurfacesNV GLEW_GET_FUN(__glewVDPAUUnmapSurfacesNV) +#define glVDPAUUnregisterSurfaceNV GLEW_GET_FUN(__glewVDPAUUnregisterSurfaceNV) + +#define GLEW_NV_vdpau_interop GLEW_GET_VAR(__GLEW_NV_vdpau_interop) + +#endif /* GL_NV_vdpau_interop */ + +/* ------------------------ GL_NV_vertex_array_range ----------------------- */ + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 + +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 + +typedef void (GLAPIENTRY * PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void *pointer); + +#define glFlushVertexArrayRangeNV GLEW_GET_FUN(__glewFlushVertexArrayRangeNV) +#define glVertexArrayRangeNV GLEW_GET_FUN(__glewVertexArrayRangeNV) + +#define GLEW_NV_vertex_array_range GLEW_GET_VAR(__GLEW_NV_vertex_array_range) + +#endif /* GL_NV_vertex_array_range */ + +/* ----------------------- GL_NV_vertex_array_range2 ----------------------- */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 + +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 + +#define GLEW_NV_vertex_array_range2 GLEW_GET_VAR(__GLEW_NV_vertex_array_range2) + +#endif /* GL_NV_vertex_array_range2 */ + +/* ------------------- GL_NV_vertex_attrib_integer_64bit ------------------- */ + +#ifndef GL_NV_vertex_attrib_integer_64bit +#define GL_NV_vertex_attrib_integer_64bit 1 + +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F + +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT* params); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); + +#define glGetVertexAttribLi64vNV GLEW_GET_FUN(__glewGetVertexAttribLi64vNV) +#define glGetVertexAttribLui64vNV GLEW_GET_FUN(__glewGetVertexAttribLui64vNV) +#define glVertexAttribL1i64NV GLEW_GET_FUN(__glewVertexAttribL1i64NV) +#define glVertexAttribL1i64vNV GLEW_GET_FUN(__glewVertexAttribL1i64vNV) +#define glVertexAttribL1ui64NV GLEW_GET_FUN(__glewVertexAttribL1ui64NV) +#define glVertexAttribL1ui64vNV GLEW_GET_FUN(__glewVertexAttribL1ui64vNV) +#define glVertexAttribL2i64NV GLEW_GET_FUN(__glewVertexAttribL2i64NV) +#define glVertexAttribL2i64vNV GLEW_GET_FUN(__glewVertexAttribL2i64vNV) +#define glVertexAttribL2ui64NV GLEW_GET_FUN(__glewVertexAttribL2ui64NV) +#define glVertexAttribL2ui64vNV GLEW_GET_FUN(__glewVertexAttribL2ui64vNV) +#define glVertexAttribL3i64NV GLEW_GET_FUN(__glewVertexAttribL3i64NV) +#define glVertexAttribL3i64vNV GLEW_GET_FUN(__glewVertexAttribL3i64vNV) +#define glVertexAttribL3ui64NV GLEW_GET_FUN(__glewVertexAttribL3ui64NV) +#define glVertexAttribL3ui64vNV GLEW_GET_FUN(__glewVertexAttribL3ui64vNV) +#define glVertexAttribL4i64NV GLEW_GET_FUN(__glewVertexAttribL4i64NV) +#define glVertexAttribL4i64vNV GLEW_GET_FUN(__glewVertexAttribL4i64vNV) +#define glVertexAttribL4ui64NV GLEW_GET_FUN(__glewVertexAttribL4ui64NV) +#define glVertexAttribL4ui64vNV GLEW_GET_FUN(__glewVertexAttribL4ui64vNV) +#define glVertexAttribLFormatNV GLEW_GET_FUN(__glewVertexAttribLFormatNV) + +#define GLEW_NV_vertex_attrib_integer_64bit GLEW_GET_VAR(__GLEW_NV_vertex_attrib_integer_64bit) + +#endif /* GL_NV_vertex_attrib_integer_64bit */ + +/* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */ + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_NV_vertex_buffer_unified_memory 1 + +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 + +typedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); +typedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]); +typedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); + +#define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV) +#define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV) +#define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV) +#define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV) +#define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV) +#define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV) +#define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV) +#define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV) +#define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV) +#define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV) +#define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV) +#define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV) + +#define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory) + +#endif /* GL_NV_vertex_buffer_unified_memory */ + +/* -------------------------- GL_NV_vertex_program ------------------------- */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 + +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F + +typedef GLboolean (GLAPIENTRY * PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint* ids, GLboolean *residences); +typedef void (GLAPIENTRY * PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint* ids); +typedef void (GLAPIENTRY * PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte* program); +typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void** pointer); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint* params); +typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (GLAPIENTRY * PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte* program); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids); +typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei n, const GLdouble* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei n, const GLfloat* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei n, const GLshort* v); +typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei n, const GLubyte* v); + +#define glAreProgramsResidentNV GLEW_GET_FUN(__glewAreProgramsResidentNV) +#define glBindProgramNV GLEW_GET_FUN(__glewBindProgramNV) +#define glDeleteProgramsNV GLEW_GET_FUN(__glewDeleteProgramsNV) +#define glExecuteProgramNV GLEW_GET_FUN(__glewExecuteProgramNV) +#define glGenProgramsNV GLEW_GET_FUN(__glewGenProgramsNV) +#define glGetProgramParameterdvNV GLEW_GET_FUN(__glewGetProgramParameterdvNV) +#define glGetProgramParameterfvNV GLEW_GET_FUN(__glewGetProgramParameterfvNV) +#define glGetProgramStringNV GLEW_GET_FUN(__glewGetProgramStringNV) +#define glGetProgramivNV GLEW_GET_FUN(__glewGetProgramivNV) +#define glGetTrackMatrixivNV GLEW_GET_FUN(__glewGetTrackMatrixivNV) +#define glGetVertexAttribPointervNV GLEW_GET_FUN(__glewGetVertexAttribPointervNV) +#define glGetVertexAttribdvNV GLEW_GET_FUN(__glewGetVertexAttribdvNV) +#define glGetVertexAttribfvNV GLEW_GET_FUN(__glewGetVertexAttribfvNV) +#define glGetVertexAttribivNV GLEW_GET_FUN(__glewGetVertexAttribivNV) +#define glIsProgramNV GLEW_GET_FUN(__glewIsProgramNV) +#define glLoadProgramNV GLEW_GET_FUN(__glewLoadProgramNV) +#define glProgramParameter4dNV GLEW_GET_FUN(__glewProgramParameter4dNV) +#define glProgramParameter4dvNV GLEW_GET_FUN(__glewProgramParameter4dvNV) +#define glProgramParameter4fNV GLEW_GET_FUN(__glewProgramParameter4fNV) +#define glProgramParameter4fvNV GLEW_GET_FUN(__glewProgramParameter4fvNV) +#define glProgramParameters4dvNV GLEW_GET_FUN(__glewProgramParameters4dvNV) +#define glProgramParameters4fvNV GLEW_GET_FUN(__glewProgramParameters4fvNV) +#define glRequestResidentProgramsNV GLEW_GET_FUN(__glewRequestResidentProgramsNV) +#define glTrackMatrixNV GLEW_GET_FUN(__glewTrackMatrixNV) +#define glVertexAttrib1dNV GLEW_GET_FUN(__glewVertexAttrib1dNV) +#define glVertexAttrib1dvNV GLEW_GET_FUN(__glewVertexAttrib1dvNV) +#define glVertexAttrib1fNV GLEW_GET_FUN(__glewVertexAttrib1fNV) +#define glVertexAttrib1fvNV GLEW_GET_FUN(__glewVertexAttrib1fvNV) +#define glVertexAttrib1sNV GLEW_GET_FUN(__glewVertexAttrib1sNV) +#define glVertexAttrib1svNV GLEW_GET_FUN(__glewVertexAttrib1svNV) +#define glVertexAttrib2dNV GLEW_GET_FUN(__glewVertexAttrib2dNV) +#define glVertexAttrib2dvNV GLEW_GET_FUN(__glewVertexAttrib2dvNV) +#define glVertexAttrib2fNV GLEW_GET_FUN(__glewVertexAttrib2fNV) +#define glVertexAttrib2fvNV GLEW_GET_FUN(__glewVertexAttrib2fvNV) +#define glVertexAttrib2sNV GLEW_GET_FUN(__glewVertexAttrib2sNV) +#define glVertexAttrib2svNV GLEW_GET_FUN(__glewVertexAttrib2svNV) +#define glVertexAttrib3dNV GLEW_GET_FUN(__glewVertexAttrib3dNV) +#define glVertexAttrib3dvNV GLEW_GET_FUN(__glewVertexAttrib3dvNV) +#define glVertexAttrib3fNV GLEW_GET_FUN(__glewVertexAttrib3fNV) +#define glVertexAttrib3fvNV GLEW_GET_FUN(__glewVertexAttrib3fvNV) +#define glVertexAttrib3sNV GLEW_GET_FUN(__glewVertexAttrib3sNV) +#define glVertexAttrib3svNV GLEW_GET_FUN(__glewVertexAttrib3svNV) +#define glVertexAttrib4dNV GLEW_GET_FUN(__glewVertexAttrib4dNV) +#define glVertexAttrib4dvNV GLEW_GET_FUN(__glewVertexAttrib4dvNV) +#define glVertexAttrib4fNV GLEW_GET_FUN(__glewVertexAttrib4fNV) +#define glVertexAttrib4fvNV GLEW_GET_FUN(__glewVertexAttrib4fvNV) +#define glVertexAttrib4sNV GLEW_GET_FUN(__glewVertexAttrib4sNV) +#define glVertexAttrib4svNV GLEW_GET_FUN(__glewVertexAttrib4svNV) +#define glVertexAttrib4ubNV GLEW_GET_FUN(__glewVertexAttrib4ubNV) +#define glVertexAttrib4ubvNV GLEW_GET_FUN(__glewVertexAttrib4ubvNV) +#define glVertexAttribPointerNV GLEW_GET_FUN(__glewVertexAttribPointerNV) +#define glVertexAttribs1dvNV GLEW_GET_FUN(__glewVertexAttribs1dvNV) +#define glVertexAttribs1fvNV GLEW_GET_FUN(__glewVertexAttribs1fvNV) +#define glVertexAttribs1svNV GLEW_GET_FUN(__glewVertexAttribs1svNV) +#define glVertexAttribs2dvNV GLEW_GET_FUN(__glewVertexAttribs2dvNV) +#define glVertexAttribs2fvNV GLEW_GET_FUN(__glewVertexAttribs2fvNV) +#define glVertexAttribs2svNV GLEW_GET_FUN(__glewVertexAttribs2svNV) +#define glVertexAttribs3dvNV GLEW_GET_FUN(__glewVertexAttribs3dvNV) +#define glVertexAttribs3fvNV GLEW_GET_FUN(__glewVertexAttribs3fvNV) +#define glVertexAttribs3svNV GLEW_GET_FUN(__glewVertexAttribs3svNV) +#define glVertexAttribs4dvNV GLEW_GET_FUN(__glewVertexAttribs4dvNV) +#define glVertexAttribs4fvNV GLEW_GET_FUN(__glewVertexAttribs4fvNV) +#define glVertexAttribs4svNV GLEW_GET_FUN(__glewVertexAttribs4svNV) +#define glVertexAttribs4ubvNV GLEW_GET_FUN(__glewVertexAttribs4ubvNV) + +#define GLEW_NV_vertex_program GLEW_GET_VAR(__GLEW_NV_vertex_program) + +#endif /* GL_NV_vertex_program */ + +/* ------------------------ GL_NV_vertex_program1_1 ------------------------ */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 + +#define GLEW_NV_vertex_program1_1 GLEW_GET_VAR(__GLEW_NV_vertex_program1_1) + +#endif /* GL_NV_vertex_program1_1 */ + +/* ------------------------- GL_NV_vertex_program2 ------------------------- */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 + +#define GLEW_NV_vertex_program2 GLEW_GET_VAR(__GLEW_NV_vertex_program2) + +#endif /* GL_NV_vertex_program2 */ + +/* ---------------------- GL_NV_vertex_program2_option --------------------- */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 + +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 + +#define GLEW_NV_vertex_program2_option GLEW_GET_VAR(__GLEW_NV_vertex_program2_option) + +#endif /* GL_NV_vertex_program2_option */ + +/* ------------------------- GL_NV_vertex_program3 ------------------------- */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 + +#define MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C + +#define GLEW_NV_vertex_program3 GLEW_GET_VAR(__GLEW_NV_vertex_program3) + +#endif /* GL_NV_vertex_program3 */ + +/* ------------------------- GL_NV_vertex_program4 ------------------------- */ + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 + +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD + +#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4) + +#endif /* GL_NV_vertex_program4 */ + +/* -------------------------- GL_NV_video_capture -------------------------- */ + +#ifndef GL_NV_video_capture +#define GL_NV_video_capture 1 + +#define GL_VIDEO_BUFFER_NV 0x9020 +#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 +#define GL_FIELD_UPPER_NV 0x9022 +#define GL_FIELD_LOWER_NV 0x9023 +#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 +#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 +#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 +#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 +#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 +#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 +#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A +#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B +#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C +#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D +#define GL_PARTIAL_SUCCESS_NV 0x902E +#define GL_SUCCESS_NV 0x902F +#define GL_FAILURE_NV 0x9030 +#define GL_YCBYCR8_422_NV 0x9031 +#define GL_YCBAYCR8A_4224_NV 0x9032 +#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 +#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 +#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 +#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 +#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 +#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 +#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 +#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A +#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B +#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C + +typedef void (GLAPIENTRY * PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +typedef void (GLAPIENTRY * PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +typedef void (GLAPIENTRY * PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint* params); +typedef GLenum (GLAPIENTRY * PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint* sequence_num, GLuint64EXT *capture_time); +typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble* params); +typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint* params); + +#define glBeginVideoCaptureNV GLEW_GET_FUN(__glewBeginVideoCaptureNV) +#define glBindVideoCaptureStreamBufferNV GLEW_GET_FUN(__glewBindVideoCaptureStreamBufferNV) +#define glBindVideoCaptureStreamTextureNV GLEW_GET_FUN(__glewBindVideoCaptureStreamTextureNV) +#define glEndVideoCaptureNV GLEW_GET_FUN(__glewEndVideoCaptureNV) +#define glGetVideoCaptureStreamdvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamdvNV) +#define glGetVideoCaptureStreamfvNV GLEW_GET_FUN(__glewGetVideoCaptureStreamfvNV) +#define glGetVideoCaptureStreamivNV GLEW_GET_FUN(__glewGetVideoCaptureStreamivNV) +#define glGetVideoCaptureivNV GLEW_GET_FUN(__glewGetVideoCaptureivNV) +#define glVideoCaptureNV GLEW_GET_FUN(__glewVideoCaptureNV) +#define glVideoCaptureStreamParameterdvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterdvNV) +#define glVideoCaptureStreamParameterfvNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterfvNV) +#define glVideoCaptureStreamParameterivNV GLEW_GET_FUN(__glewVideoCaptureStreamParameterivNV) + +#define GLEW_NV_video_capture GLEW_GET_VAR(__GLEW_NV_video_capture) + +#endif /* GL_NV_video_capture */ + +/* ------------------------- GL_NV_viewport_array2 ------------------------- */ + +#ifndef GL_NV_viewport_array2 +#define GL_NV_viewport_array2 1 + +#define GLEW_NV_viewport_array2 GLEW_GET_VAR(__GLEW_NV_viewport_array2) + +#endif /* GL_NV_viewport_array2 */ + +/* ------------------------ GL_OES_byte_coordinates ------------------------ */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 + +#define GLEW_OES_byte_coordinates GLEW_GET_VAR(__GLEW_OES_byte_coordinates) + +#endif /* GL_OES_byte_coordinates */ + +/* ------------------- GL_OES_compressed_paletted_texture ------------------ */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 + +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 + +#define GLEW_OES_compressed_paletted_texture GLEW_GET_VAR(__GLEW_OES_compressed_paletted_texture) + +#endif /* GL_OES_compressed_paletted_texture */ + +/* --------------------------- GL_OES_read_format -------------------------- */ + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 + +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B + +#define GLEW_OES_read_format GLEW_GET_VAR(__GLEW_OES_read_format) + +#endif /* GL_OES_read_format */ + +/* ------------------------ GL_OES_single_precision ------------------------ */ + +#ifndef GL_OES_single_precision +#define GL_OES_single_precision 1 + +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); +typedef void (GLAPIENTRY * PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); +typedef void (GLAPIENTRY * PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); + +#define glClearDepthfOES GLEW_GET_FUN(__glewClearDepthfOES) +#define glClipPlanefOES GLEW_GET_FUN(__glewClipPlanefOES) +#define glDepthRangefOES GLEW_GET_FUN(__glewDepthRangefOES) +#define glFrustumfOES GLEW_GET_FUN(__glewFrustumfOES) +#define glGetClipPlanefOES GLEW_GET_FUN(__glewGetClipPlanefOES) +#define glOrthofOES GLEW_GET_FUN(__glewOrthofOES) + +#define GLEW_OES_single_precision GLEW_GET_VAR(__GLEW_OES_single_precision) + +#endif /* GL_OES_single_precision */ + +/* ---------------------------- GL_OML_interlace --------------------------- */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 + +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 + +#define GLEW_OML_interlace GLEW_GET_VAR(__GLEW_OML_interlace) + +#endif /* GL_OML_interlace */ + +/* ---------------------------- GL_OML_resample ---------------------------- */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 + +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 + +#define GLEW_OML_resample GLEW_GET_VAR(__GLEW_OML_resample) + +#endif /* GL_OML_resample */ + +/* ---------------------------- GL_OML_subsample --------------------------- */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 + +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 + +#define GLEW_OML_subsample GLEW_GET_VAR(__GLEW_OML_subsample) + +#endif /* GL_OML_subsample */ + +/* ---------------------------- GL_OVR_multiview --------------------------- */ + +#ifndef GL_OVR_multiview +#define GL_OVR_multiview 1 + +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 +#define GL_MAX_VIEWS_OVR 0x9631 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 +#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 + +typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); + +#define glFramebufferTextureMultiviewOVR GLEW_GET_FUN(__glewFramebufferTextureMultiviewOVR) + +#define GLEW_OVR_multiview GLEW_GET_VAR(__GLEW_OVR_multiview) + +#endif /* GL_OVR_multiview */ + +/* --------------------------- GL_OVR_multiview2 --------------------------- */ + +#ifndef GL_OVR_multiview2 +#define GL_OVR_multiview2 1 + +#define GLEW_OVR_multiview2 GLEW_GET_VAR(__GLEW_OVR_multiview2) + +#endif /* GL_OVR_multiview2 */ + +/* --------------------------- GL_PGI_misc_hints --------------------------- */ + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 + +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 107000 +#define GL_CONSERVE_MEMORY_HINT_PGI 107005 +#define GL_RECLAIM_MEMORY_HINT_PGI 107006 +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 107010 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 107011 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 107012 +#define GL_ALWAYS_FAST_HINT_PGI 107020 +#define GL_ALWAYS_SOFT_HINT_PGI 107021 +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 107022 +#define GL_ALLOW_DRAW_WIN_HINT_PGI 107023 +#define GL_ALLOW_DRAW_FRG_HINT_PGI 107024 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 107025 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 107030 +#define GL_STRICT_LIGHTING_HINT_PGI 107031 +#define GL_STRICT_SCISSOR_HINT_PGI 107032 +#define GL_FULL_STIPPLE_HINT_PGI 107033 +#define GL_CLIP_NEAR_HINT_PGI 107040 +#define GL_CLIP_FAR_HINT_PGI 107041 +#define GL_WIDE_LINE_HINT_PGI 107042 +#define GL_BACK_NORMALS_HINT_PGI 107043 + +#define GLEW_PGI_misc_hints GLEW_GET_VAR(__GLEW_PGI_misc_hints) + +#endif /* GL_PGI_misc_hints */ + +/* -------------------------- GL_PGI_vertex_hints -------------------------- */ + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 + +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_VERTEX_DATA_HINT_PGI 107050 +#define GL_VERTEX_CONSISTENT_HINT_PGI 107051 +#define GL_MATERIAL_SIDE_HINT_PGI 107052 +#define GL_MAX_VERTEX_HINT_PGI 107053 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 + +#define GLEW_PGI_vertex_hints GLEW_GET_VAR(__GLEW_PGI_vertex_hints) + +#endif /* GL_PGI_vertex_hints */ + +/* ---------------------- GL_REGAL_ES1_0_compatibility --------------------- */ + +#ifndef GL_REGAL_ES1_0_compatibility +#define GL_REGAL_ES1_0_compatibility 1 + +typedef int GLclampx; + +typedef void (GLAPIENTRY * PFNGLALPHAFUNCXPROC) (GLenum func, GLclampx ref); +typedef void (GLAPIENTRY * PFNGLCLEARCOLORXPROC) (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); +typedef void (GLAPIENTRY * PFNGLCLEARDEPTHXPROC) (GLclampx depth); +typedef void (GLAPIENTRY * PFNGLCOLOR4XPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (GLAPIENTRY * PFNGLDEPTHRANGEXPROC) (GLclampx zNear, GLclampx zFar); +typedef void (GLAPIENTRY * PFNGLFOGXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLFOGXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLFRUSTUMFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GLAPIENTRY * PFNGLFRUSTUMXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLLIGHTMODELXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLLIGHTXPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLLIGHTXVPROC) (GLenum light, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLLINEWIDTHXPROC) (GLfixed width); +typedef void (GLAPIENTRY * PFNGLLOADMATRIXXPROC) (const GLfixed* m); +typedef void (GLAPIENTRY * PFNGLMATERIALXPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLMATERIALXVPROC) (GLenum face, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLMULTMATRIXXPROC) (const GLfixed* m); +typedef void (GLAPIENTRY * PFNGLMULTITEXCOORD4XPROC) (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (GLAPIENTRY * PFNGLNORMAL3XPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (GLAPIENTRY * PFNGLORTHOFPROC) (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); +typedef void (GLAPIENTRY * PFNGLORTHOXPROC) (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); +typedef void (GLAPIENTRY * PFNGLPOINTSIZEXPROC) (GLfixed size); +typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETXPROC) (GLfixed factor, GLfixed units); +typedef void (GLAPIENTRY * PFNGLROTATEXPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAPIENTRY * PFNGLSAMPLECOVERAGEXPROC) (GLclampx value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSCALEXPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (GLAPIENTRY * PFNGLTEXENVXPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLTEXENVXVPROC) (GLenum target, GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLTRANSLATEXPROC) (GLfixed x, GLfixed y, GLfixed z); + +#define glAlphaFuncx GLEW_GET_FUN(__glewAlphaFuncx) +#define glClearColorx GLEW_GET_FUN(__glewClearColorx) +#define glClearDepthx GLEW_GET_FUN(__glewClearDepthx) +#define glColor4x GLEW_GET_FUN(__glewColor4x) +#define glDepthRangex GLEW_GET_FUN(__glewDepthRangex) +#define glFogx GLEW_GET_FUN(__glewFogx) +#define glFogxv GLEW_GET_FUN(__glewFogxv) +#define glFrustumf GLEW_GET_FUN(__glewFrustumf) +#define glFrustumx GLEW_GET_FUN(__glewFrustumx) +#define glLightModelx GLEW_GET_FUN(__glewLightModelx) +#define glLightModelxv GLEW_GET_FUN(__glewLightModelxv) +#define glLightx GLEW_GET_FUN(__glewLightx) +#define glLightxv GLEW_GET_FUN(__glewLightxv) +#define glLineWidthx GLEW_GET_FUN(__glewLineWidthx) +#define glLoadMatrixx GLEW_GET_FUN(__glewLoadMatrixx) +#define glMaterialx GLEW_GET_FUN(__glewMaterialx) +#define glMaterialxv GLEW_GET_FUN(__glewMaterialxv) +#define glMultMatrixx GLEW_GET_FUN(__glewMultMatrixx) +#define glMultiTexCoord4x GLEW_GET_FUN(__glewMultiTexCoord4x) +#define glNormal3x GLEW_GET_FUN(__glewNormal3x) +#define glOrthof GLEW_GET_FUN(__glewOrthof) +#define glOrthox GLEW_GET_FUN(__glewOrthox) +#define glPointSizex GLEW_GET_FUN(__glewPointSizex) +#define glPolygonOffsetx GLEW_GET_FUN(__glewPolygonOffsetx) +#define glRotatex GLEW_GET_FUN(__glewRotatex) +#define glSampleCoveragex GLEW_GET_FUN(__glewSampleCoveragex) +#define glScalex GLEW_GET_FUN(__glewScalex) +#define glTexEnvx GLEW_GET_FUN(__glewTexEnvx) +#define glTexEnvxv GLEW_GET_FUN(__glewTexEnvxv) +#define glTexParameterx GLEW_GET_FUN(__glewTexParameterx) +#define glTranslatex GLEW_GET_FUN(__glewTranslatex) + +#define GLEW_REGAL_ES1_0_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_0_compatibility) + +#endif /* GL_REGAL_ES1_0_compatibility */ + +/* ---------------------- GL_REGAL_ES1_1_compatibility --------------------- */ + +#ifndef GL_REGAL_ES1_1_compatibility +#define GL_REGAL_ES1_1_compatibility 1 + +typedef void (GLAPIENTRY * PFNGLCLIPPLANEFPROC) (GLenum plane, const GLfloat* equation); +typedef void (GLAPIENTRY * PFNGLCLIPPLANEXPROC) (GLenum plane, const GLfixed* equation); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEFPROC) (GLenum pname, GLfloat eqn[4]); +typedef void (GLAPIENTRY * PFNGLGETCLIPPLANEXPROC) (GLenum pname, GLfixed eqn[4]); +typedef void (GLAPIENTRY * PFNGLGETFIXEDVPROC) (GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETLIGHTXVPROC) (GLenum light, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETMATERIALXVPROC) (GLenum face, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETTEXENVXVPROC) (GLenum env, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERXVPROC) (GLenum target, GLenum pname, GLfixed* params); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXPROC) (GLenum pname, GLfixed param); +typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERXVPROC) (GLenum pname, const GLfixed* params); +typedef void (GLAPIENTRY * PFNGLPOINTSIZEPOINTEROESPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLTEXPARAMETERXVPROC) (GLenum target, GLenum pname, const GLfixed* params); + +#define glClipPlanef GLEW_GET_FUN(__glewClipPlanef) +#define glClipPlanex GLEW_GET_FUN(__glewClipPlanex) +#define glGetClipPlanef GLEW_GET_FUN(__glewGetClipPlanef) +#define glGetClipPlanex GLEW_GET_FUN(__glewGetClipPlanex) +#define glGetFixedv GLEW_GET_FUN(__glewGetFixedv) +#define glGetLightxv GLEW_GET_FUN(__glewGetLightxv) +#define glGetMaterialxv GLEW_GET_FUN(__glewGetMaterialxv) +#define glGetTexEnvxv GLEW_GET_FUN(__glewGetTexEnvxv) +#define glGetTexParameterxv GLEW_GET_FUN(__glewGetTexParameterxv) +#define glPointParameterx GLEW_GET_FUN(__glewPointParameterx) +#define glPointParameterxv GLEW_GET_FUN(__glewPointParameterxv) +#define glPointSizePointerOES GLEW_GET_FUN(__glewPointSizePointerOES) +#define glTexParameterxv GLEW_GET_FUN(__glewTexParameterxv) + +#define GLEW_REGAL_ES1_1_compatibility GLEW_GET_VAR(__GLEW_REGAL_ES1_1_compatibility) + +#endif /* GL_REGAL_ES1_1_compatibility */ + +/* ---------------------------- GL_REGAL_enable ---------------------------- */ + +#ifndef GL_REGAL_enable +#define GL_REGAL_enable 1 + +#define GL_ERROR_REGAL 0x9322 +#define GL_DEBUG_REGAL 0x9323 +#define GL_LOG_REGAL 0x9324 +#define GL_EMULATION_REGAL 0x9325 +#define GL_DRIVER_REGAL 0x9326 +#define GL_MISSING_REGAL 0x9360 +#define GL_TRACE_REGAL 0x9361 +#define GL_CACHE_REGAL 0x9362 +#define GL_CODE_REGAL 0x9363 +#define GL_STATISTICS_REGAL 0x9364 + +#define GLEW_REGAL_enable GLEW_GET_VAR(__GLEW_REGAL_enable) + +#endif /* GL_REGAL_enable */ + +/* ------------------------- GL_REGAL_error_string ------------------------- */ + +#ifndef GL_REGAL_error_string +#define GL_REGAL_error_string 1 + +typedef const GLchar* (GLAPIENTRY * PFNGLERRORSTRINGREGALPROC) (GLenum error); + +#define glErrorStringREGAL GLEW_GET_FUN(__glewErrorStringREGAL) + +#define GLEW_REGAL_error_string GLEW_GET_VAR(__GLEW_REGAL_error_string) + +#endif /* GL_REGAL_error_string */ + +/* ------------------------ GL_REGAL_extension_query ----------------------- */ + +#ifndef GL_REGAL_extension_query +#define GL_REGAL_extension_query 1 + +typedef GLboolean (GLAPIENTRY * PFNGLGETEXTENSIONREGALPROC) (const GLchar* ext); +typedef GLboolean (GLAPIENTRY * PFNGLISSUPPORTEDREGALPROC) (const GLchar* ext); + +#define glGetExtensionREGAL GLEW_GET_FUN(__glewGetExtensionREGAL) +#define glIsSupportedREGAL GLEW_GET_FUN(__glewIsSupportedREGAL) + +#define GLEW_REGAL_extension_query GLEW_GET_VAR(__GLEW_REGAL_extension_query) + +#endif /* GL_REGAL_extension_query */ + +/* ------------------------------ GL_REGAL_log ----------------------------- */ + +#ifndef GL_REGAL_log +#define GL_REGAL_log 1 + +#define GL_LOG_ERROR_REGAL 0x9319 +#define GL_LOG_WARNING_REGAL 0x931A +#define GL_LOG_INFO_REGAL 0x931B +#define GL_LOG_APP_REGAL 0x931C +#define GL_LOG_DRIVER_REGAL 0x931D +#define GL_LOG_INTERNAL_REGAL 0x931E +#define GL_LOG_DEBUG_REGAL 0x931F +#define GL_LOG_STATUS_REGAL 0x9320 +#define GL_LOG_HTTP_REGAL 0x9321 + +typedef void (APIENTRY *GLLOGPROCREGAL)(GLenum stream, GLsizei length, const GLchar *message, void *context); + +typedef void (GLAPIENTRY * PFNGLLOGMESSAGECALLBACKREGALPROC) (GLLOGPROCREGAL callback); + +#define glLogMessageCallbackREGAL GLEW_GET_FUN(__glewLogMessageCallbackREGAL) + +#define GLEW_REGAL_log GLEW_GET_VAR(__GLEW_REGAL_log) + +#endif /* GL_REGAL_log */ + +/* ------------------------- GL_REGAL_proc_address ------------------------- */ + +#ifndef GL_REGAL_proc_address +#define GL_REGAL_proc_address 1 + +typedef void * (GLAPIENTRY * PFNGLGETPROCADDRESSREGALPROC) (const GLchar *name); + +#define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) + +#define GLEW_REGAL_proc_address GLEW_GET_VAR(__GLEW_REGAL_proc_address) + +#endif /* GL_REGAL_proc_address */ + +/* ----------------------- GL_REND_screen_coordinates ---------------------- */ + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 + +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 + +#define GLEW_REND_screen_coordinates GLEW_GET_VAR(__GLEW_REND_screen_coordinates) + +#endif /* GL_REND_screen_coordinates */ + +/* ------------------------------- GL_S3_s3tc ------------------------------ */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 + +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 + +#define GLEW_S3_s3tc GLEW_GET_VAR(__GLEW_S3_s3tc) + +#endif /* GL_S3_s3tc */ + +/* -------------------------- GL_SGIS_color_range -------------------------- */ + +#ifndef GL_SGIS_color_range +#define GL_SGIS_color_range 1 + +#define GL_EXTENDED_RANGE_SGIS 0x85A5 +#define GL_MIN_RED_SGIS 0x85A6 +#define GL_MAX_RED_SGIS 0x85A7 +#define GL_MIN_GREEN_SGIS 0x85A8 +#define GL_MAX_GREEN_SGIS 0x85A9 +#define GL_MIN_BLUE_SGIS 0x85AA +#define GL_MAX_BLUE_SGIS 0x85AB +#define GL_MIN_ALPHA_SGIS 0x85AC +#define GL_MAX_ALPHA_SGIS 0x85AD + +#define GLEW_SGIS_color_range GLEW_GET_VAR(__GLEW_SGIS_color_range) + +#endif /* GL_SGIS_color_range */ + +/* ------------------------- GL_SGIS_detail_texture ------------------------ */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 + +typedef void (GLAPIENTRY * PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat* points); + +#define glDetailTexFuncSGIS GLEW_GET_FUN(__glewDetailTexFuncSGIS) +#define glGetDetailTexFuncSGIS GLEW_GET_FUN(__glewGetDetailTexFuncSGIS) + +#define GLEW_SGIS_detail_texture GLEW_GET_VAR(__GLEW_SGIS_detail_texture) + +#endif /* GL_SGIS_detail_texture */ + +/* -------------------------- GL_SGIS_fog_function ------------------------- */ + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 + +typedef void (GLAPIENTRY * PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat* points); +typedef void (GLAPIENTRY * PFNGLGETFOGFUNCSGISPROC) (GLfloat* points); + +#define glFogFuncSGIS GLEW_GET_FUN(__glewFogFuncSGIS) +#define glGetFogFuncSGIS GLEW_GET_FUN(__glewGetFogFuncSGIS) + +#define GLEW_SGIS_fog_function GLEW_GET_VAR(__GLEW_SGIS_fog_function) + +#endif /* GL_SGIS_fog_function */ + +/* ------------------------ GL_SGIS_generate_mipmap ------------------------ */ + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 + +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 + +#define GLEW_SGIS_generate_mipmap GLEW_GET_VAR(__GLEW_SGIS_generate_mipmap) + +#endif /* GL_SGIS_generate_mipmap */ + +/* -------------------------- GL_SGIS_multisample -------------------------- */ + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 + +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC + +typedef void (GLAPIENTRY * PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (GLAPIENTRY * PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); + +#define glSampleMaskSGIS GLEW_GET_FUN(__glewSampleMaskSGIS) +#define glSamplePatternSGIS GLEW_GET_FUN(__glewSamplePatternSGIS) + +#define GLEW_SGIS_multisample GLEW_GET_VAR(__GLEW_SGIS_multisample) + +#endif /* GL_SGIS_multisample */ + +/* ------------------------- GL_SGIS_pixel_texture ------------------------- */ + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 + +#define GLEW_SGIS_pixel_texture GLEW_GET_VAR(__GLEW_SGIS_pixel_texture) + +#endif /* GL_SGIS_pixel_texture */ + +/* ----------------------- GL_SGIS_point_line_texgen ----------------------- */ + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 + +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 + +#define GLEW_SGIS_point_line_texgen GLEW_GET_VAR(__GLEW_SGIS_point_line_texgen) + +#endif /* GL_SGIS_point_line_texgen */ + +/* ------------------------ GL_SGIS_sharpen_texture ------------------------ */ + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 + +typedef void (GLAPIENTRY * PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat* points); +typedef void (GLAPIENTRY * PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat* points); + +#define glGetSharpenTexFuncSGIS GLEW_GET_FUN(__glewGetSharpenTexFuncSGIS) +#define glSharpenTexFuncSGIS GLEW_GET_FUN(__glewSharpenTexFuncSGIS) + +#define GLEW_SGIS_sharpen_texture GLEW_GET_VAR(__GLEW_SGIS_sharpen_texture) + +#endif /* GL_SGIS_sharpen_texture */ + +/* --------------------------- GL_SGIS_texture4D --------------------------- */ + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 + +typedef void (GLAPIENTRY * PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei extent, GLenum format, GLenum type, const void *pixels); + +#define glTexImage4DSGIS GLEW_GET_FUN(__glewTexImage4DSGIS) +#define glTexSubImage4DSGIS GLEW_GET_FUN(__glewTexSubImage4DSGIS) + +#define GLEW_SGIS_texture4D GLEW_GET_VAR(__GLEW_SGIS_texture4D) + +#endif /* GL_SGIS_texture4D */ + +/* ---------------------- GL_SGIS_texture_border_clamp --------------------- */ + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 + +#define GL_CLAMP_TO_BORDER_SGIS 0x812D + +#define GLEW_SGIS_texture_border_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_border_clamp) + +#endif /* GL_SGIS_texture_border_clamp */ + +/* ----------------------- GL_SGIS_texture_edge_clamp ---------------------- */ + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 + +#define GL_CLAMP_TO_EDGE_SGIS 0x812F + +#define GLEW_SGIS_texture_edge_clamp GLEW_GET_VAR(__GLEW_SGIS_texture_edge_clamp) + +#endif /* GL_SGIS_texture_edge_clamp */ + +/* ------------------------ GL_SGIS_texture_filter4 ------------------------ */ + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 + +typedef void (GLAPIENTRY * PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat* weights); +typedef void (GLAPIENTRY * PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat* weights); + +#define glGetTexFilterFuncSGIS GLEW_GET_FUN(__glewGetTexFilterFuncSGIS) +#define glTexFilterFuncSGIS GLEW_GET_FUN(__glewTexFilterFuncSGIS) + +#define GLEW_SGIS_texture_filter4 GLEW_GET_VAR(__GLEW_SGIS_texture_filter4) + +#endif /* GL_SGIS_texture_filter4 */ + +/* -------------------------- GL_SGIS_texture_lod -------------------------- */ + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 + +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D + +#define GLEW_SGIS_texture_lod GLEW_GET_VAR(__GLEW_SGIS_texture_lod) + +#endif /* GL_SGIS_texture_lod */ + +/* ------------------------- GL_SGIS_texture_select ------------------------ */ + +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 + +#define GLEW_SGIS_texture_select GLEW_GET_VAR(__GLEW_SGIS_texture_select) + +#endif /* GL_SGIS_texture_select */ + +/* ----------------------------- GL_SGIX_async ----------------------------- */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 + +#define GL_ASYNC_MARKER_SGIX 0x8329 + +typedef void (GLAPIENTRY * PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef void (GLAPIENTRY * PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLint (GLAPIENTRY * PFNGLFINISHASYNCSGIXPROC) (GLuint* markerp); +typedef GLuint (GLAPIENTRY * PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef GLboolean (GLAPIENTRY * PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (GLAPIENTRY * PFNGLPOLLASYNCSGIXPROC) (GLuint* markerp); + +#define glAsyncMarkerSGIX GLEW_GET_FUN(__glewAsyncMarkerSGIX) +#define glDeleteAsyncMarkersSGIX GLEW_GET_FUN(__glewDeleteAsyncMarkersSGIX) +#define glFinishAsyncSGIX GLEW_GET_FUN(__glewFinishAsyncSGIX) +#define glGenAsyncMarkersSGIX GLEW_GET_FUN(__glewGenAsyncMarkersSGIX) +#define glIsAsyncMarkerSGIX GLEW_GET_FUN(__glewIsAsyncMarkerSGIX) +#define glPollAsyncSGIX GLEW_GET_FUN(__glewPollAsyncSGIX) + +#define GLEW_SGIX_async GLEW_GET_VAR(__GLEW_SGIX_async) + +#endif /* GL_SGIX_async */ + +/* ------------------------ GL_SGIX_async_histogram ------------------------ */ + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 + +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D + +#define GLEW_SGIX_async_histogram GLEW_GET_VAR(__GLEW_SGIX_async_histogram) + +#endif /* GL_SGIX_async_histogram */ + +/* -------------------------- GL_SGIX_async_pixel -------------------------- */ + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 + +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 + +#define GLEW_SGIX_async_pixel GLEW_GET_VAR(__GLEW_SGIX_async_pixel) + +#endif /* GL_SGIX_async_pixel */ + +/* ----------------------- GL_SGIX_blend_alpha_minmax ---------------------- */ + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 + +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 + +#define GLEW_SGIX_blend_alpha_minmax GLEW_GET_VAR(__GLEW_SGIX_blend_alpha_minmax) + +#endif /* GL_SGIX_blend_alpha_minmax */ + +/* ---------------------------- GL_SGIX_clipmap ---------------------------- */ + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 + +#define GLEW_SGIX_clipmap GLEW_GET_VAR(__GLEW_SGIX_clipmap) + +#endif /* GL_SGIX_clipmap */ + +/* ---------------------- GL_SGIX_convolution_accuracy --------------------- */ + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 + +#define GL_CONVOLUTION_HINT_SGIX 0x8316 + +#define GLEW_SGIX_convolution_accuracy GLEW_GET_VAR(__GLEW_SGIX_convolution_accuracy) + +#endif /* GL_SGIX_convolution_accuracy */ + +/* ------------------------- GL_SGIX_depth_texture ------------------------- */ + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 + +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 + +#define GLEW_SGIX_depth_texture GLEW_GET_VAR(__GLEW_SGIX_depth_texture) + +#endif /* GL_SGIX_depth_texture */ + +/* -------------------------- GL_SGIX_flush_raster ------------------------- */ + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 + +typedef void (GLAPIENTRY * PFNGLFLUSHRASTERSGIXPROC) (void); + +#define glFlushRasterSGIX GLEW_GET_FUN(__glewFlushRasterSGIX) + +#define GLEW_SGIX_flush_raster GLEW_GET_VAR(__GLEW_SGIX_flush_raster) + +#endif /* GL_SGIX_flush_raster */ + +/* --------------------------- GL_SGIX_fog_offset -------------------------- */ + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 + +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 + +#define GLEW_SGIX_fog_offset GLEW_GET_VAR(__GLEW_SGIX_fog_offset) + +#endif /* GL_SGIX_fog_offset */ + +/* -------------------------- GL_SGIX_fog_texture -------------------------- */ + +#ifndef GL_SGIX_fog_texture +#define GL_SGIX_fog_texture 1 + +#define GL_FOG_PATCHY_FACTOR_SGIX 0 +#define GL_FRAGMENT_FOG_SGIX 0 +#define GL_TEXTURE_FOG_SGIX 0 + +typedef void (GLAPIENTRY * PFNGLTEXTUREFOGSGIXPROC) (GLenum pname); + +#define glTextureFogSGIX GLEW_GET_FUN(__glewTextureFogSGIX) + +#define GLEW_SGIX_fog_texture GLEW_GET_VAR(__GLEW_SGIX_fog_texture) + +#endif /* GL_SGIX_fog_texture */ + +/* ------------------- GL_SGIX_fragment_specular_lighting ------------------ */ + +#ifndef GL_SGIX_fragment_specular_lighting +#define GL_SGIX_fragment_specular_lighting 1 + +typedef void (GLAPIENTRY * PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, const GLfloat param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, const GLint param); +typedef void (GLAPIENTRY * PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum value, GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum value, GLint* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat* data); +typedef void (GLAPIENTRY * PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint* data); + +#define glFragmentColorMaterialSGIX GLEW_GET_FUN(__glewFragmentColorMaterialSGIX) +#define glFragmentLightModelfSGIX GLEW_GET_FUN(__glewFragmentLightModelfSGIX) +#define glFragmentLightModelfvSGIX GLEW_GET_FUN(__glewFragmentLightModelfvSGIX) +#define glFragmentLightModeliSGIX GLEW_GET_FUN(__glewFragmentLightModeliSGIX) +#define glFragmentLightModelivSGIX GLEW_GET_FUN(__glewFragmentLightModelivSGIX) +#define glFragmentLightfSGIX GLEW_GET_FUN(__glewFragmentLightfSGIX) +#define glFragmentLightfvSGIX GLEW_GET_FUN(__glewFragmentLightfvSGIX) +#define glFragmentLightiSGIX GLEW_GET_FUN(__glewFragmentLightiSGIX) +#define glFragmentLightivSGIX GLEW_GET_FUN(__glewFragmentLightivSGIX) +#define glFragmentMaterialfSGIX GLEW_GET_FUN(__glewFragmentMaterialfSGIX) +#define glFragmentMaterialfvSGIX GLEW_GET_FUN(__glewFragmentMaterialfvSGIX) +#define glFragmentMaterialiSGIX GLEW_GET_FUN(__glewFragmentMaterialiSGIX) +#define glFragmentMaterialivSGIX GLEW_GET_FUN(__glewFragmentMaterialivSGIX) +#define glGetFragmentLightfvSGIX GLEW_GET_FUN(__glewGetFragmentLightfvSGIX) +#define glGetFragmentLightivSGIX GLEW_GET_FUN(__glewGetFragmentLightivSGIX) +#define glGetFragmentMaterialfvSGIX GLEW_GET_FUN(__glewGetFragmentMaterialfvSGIX) +#define glGetFragmentMaterialivSGIX GLEW_GET_FUN(__glewGetFragmentMaterialivSGIX) + +#define GLEW_SGIX_fragment_specular_lighting GLEW_GET_VAR(__GLEW_SGIX_fragment_specular_lighting) + +#endif /* GL_SGIX_fragment_specular_lighting */ + +/* --------------------------- GL_SGIX_framezoom --------------------------- */ + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 + +typedef void (GLAPIENTRY * PFNGLFRAMEZOOMSGIXPROC) (GLint factor); + +#define glFrameZoomSGIX GLEW_GET_FUN(__glewFrameZoomSGIX) + +#define GLEW_SGIX_framezoom GLEW_GET_VAR(__GLEW_SGIX_framezoom) + +#endif /* GL_SGIX_framezoom */ + +/* --------------------------- GL_SGIX_interlace --------------------------- */ + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 + +#define GL_INTERLACE_SGIX 0x8094 + +#define GLEW_SGIX_interlace GLEW_GET_VAR(__GLEW_SGIX_interlace) + +#endif /* GL_SGIX_interlace */ + +/* ------------------------- GL_SGIX_ir_instrument1 ------------------------ */ + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 + +#define GLEW_SGIX_ir_instrument1 GLEW_GET_VAR(__GLEW_SGIX_ir_instrument1) + +#endif /* GL_SGIX_ir_instrument1 */ + +/* ------------------------- GL_SGIX_list_priority ------------------------- */ + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 + +#define GLEW_SGIX_list_priority GLEW_GET_VAR(__GLEW_SGIX_list_priority) + +#endif /* GL_SGIX_list_priority */ + +/* ------------------------- GL_SGIX_pixel_texture ------------------------- */ + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 + +typedef void (GLAPIENTRY * PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); + +#define glPixelTexGenSGIX GLEW_GET_FUN(__glewPixelTexGenSGIX) + +#define GLEW_SGIX_pixel_texture GLEW_GET_VAR(__GLEW_SGIX_pixel_texture) + +#endif /* GL_SGIX_pixel_texture */ + +/* ----------------------- GL_SGIX_pixel_texture_bits ---------------------- */ + +#ifndef GL_SGIX_pixel_texture_bits +#define GL_SGIX_pixel_texture_bits 1 + +#define GLEW_SGIX_pixel_texture_bits GLEW_GET_VAR(__GLEW_SGIX_pixel_texture_bits) + +#endif /* GL_SGIX_pixel_texture_bits */ + +/* ------------------------ GL_SGIX_reference_plane ------------------------ */ + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 + +typedef void (GLAPIENTRY * PFNGLREFERENCEPLANESGIXPROC) (const GLdouble* equation); + +#define glReferencePlaneSGIX GLEW_GET_FUN(__glewReferencePlaneSGIX) + +#define GLEW_SGIX_reference_plane GLEW_GET_VAR(__GLEW_SGIX_reference_plane) + +#endif /* GL_SGIX_reference_plane */ + +/* ---------------------------- GL_SGIX_resample --------------------------- */ + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 + +#define GL_PACK_RESAMPLE_SGIX 0x842E +#define GL_UNPACK_RESAMPLE_SGIX 0x842F +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 + +#define GLEW_SGIX_resample GLEW_GET_VAR(__GLEW_SGIX_resample) + +#endif /* GL_SGIX_resample */ + +/* ----------------------------- GL_SGIX_shadow ---------------------------- */ + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 + +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D + +#define GLEW_SGIX_shadow GLEW_GET_VAR(__GLEW_SGIX_shadow) + +#endif /* GL_SGIX_shadow */ + +/* ------------------------- GL_SGIX_shadow_ambient ------------------------ */ + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 + +#define GL_SHADOW_AMBIENT_SGIX 0x80BF + +#define GLEW_SGIX_shadow_ambient GLEW_GET_VAR(__GLEW_SGIX_shadow_ambient) + +#endif /* GL_SGIX_shadow_ambient */ + +/* ----------------------------- GL_SGIX_sprite ---------------------------- */ + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 + +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (GLAPIENTRY * PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, GLint* params); + +#define glSpriteParameterfSGIX GLEW_GET_FUN(__glewSpriteParameterfSGIX) +#define glSpriteParameterfvSGIX GLEW_GET_FUN(__glewSpriteParameterfvSGIX) +#define glSpriteParameteriSGIX GLEW_GET_FUN(__glewSpriteParameteriSGIX) +#define glSpriteParameterivSGIX GLEW_GET_FUN(__glewSpriteParameterivSGIX) + +#define GLEW_SGIX_sprite GLEW_GET_VAR(__GLEW_SGIX_sprite) + +#endif /* GL_SGIX_sprite */ + +/* ----------------------- GL_SGIX_tag_sample_buffer ----------------------- */ + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 + +typedef void (GLAPIENTRY * PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); + +#define glTagSampleBufferSGIX GLEW_GET_FUN(__glewTagSampleBufferSGIX) + +#define GLEW_SGIX_tag_sample_buffer GLEW_GET_VAR(__GLEW_SGIX_tag_sample_buffer) + +#endif /* GL_SGIX_tag_sample_buffer */ + +/* ------------------------ GL_SGIX_texture_add_env ------------------------ */ + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 + +#define GLEW_SGIX_texture_add_env GLEW_GET_VAR(__GLEW_SGIX_texture_add_env) + +#endif /* GL_SGIX_texture_add_env */ + +/* -------------------- GL_SGIX_texture_coordinate_clamp ------------------- */ + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 + +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B + +#define GLEW_SGIX_texture_coordinate_clamp GLEW_GET_VAR(__GLEW_SGIX_texture_coordinate_clamp) + +#endif /* GL_SGIX_texture_coordinate_clamp */ + +/* ------------------------ GL_SGIX_texture_lod_bias ----------------------- */ + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 + +#define GLEW_SGIX_texture_lod_bias GLEW_GET_VAR(__GLEW_SGIX_texture_lod_bias) + +#endif /* GL_SGIX_texture_lod_bias */ + +/* ---------------------- GL_SGIX_texture_multi_buffer --------------------- */ + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 + +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E + +#define GLEW_SGIX_texture_multi_buffer GLEW_GET_VAR(__GLEW_SGIX_texture_multi_buffer) + +#endif /* GL_SGIX_texture_multi_buffer */ + +/* ------------------------- GL_SGIX_texture_range ------------------------- */ + +#ifndef GL_SGIX_texture_range +#define GL_SGIX_texture_range 1 + +#define GL_RGB_SIGNED_SGIX 0x85E0 +#define GL_RGBA_SIGNED_SGIX 0x85E1 +#define GL_ALPHA_SIGNED_SGIX 0x85E2 +#define GL_LUMINANCE_SIGNED_SGIX 0x85E3 +#define GL_INTENSITY_SIGNED_SGIX 0x85E4 +#define GL_LUMINANCE_ALPHA_SIGNED_SGIX 0x85E5 +#define GL_RGB16_SIGNED_SGIX 0x85E6 +#define GL_RGBA16_SIGNED_SGIX 0x85E7 +#define GL_ALPHA16_SIGNED_SGIX 0x85E8 +#define GL_LUMINANCE16_SIGNED_SGIX 0x85E9 +#define GL_INTENSITY16_SIGNED_SGIX 0x85EA +#define GL_LUMINANCE16_ALPHA16_SIGNED_SGIX 0x85EB +#define GL_RGB_EXTENDED_RANGE_SGIX 0x85EC +#define GL_RGBA_EXTENDED_RANGE_SGIX 0x85ED +#define GL_ALPHA_EXTENDED_RANGE_SGIX 0x85EE +#define GL_LUMINANCE_EXTENDED_RANGE_SGIX 0x85EF +#define GL_INTENSITY_EXTENDED_RANGE_SGIX 0x85F0 +#define GL_LUMINANCE_ALPHA_EXTENDED_RANGE_SGIX 0x85F1 +#define GL_RGB16_EXTENDED_RANGE_SGIX 0x85F2 +#define GL_RGBA16_EXTENDED_RANGE_SGIX 0x85F3 +#define GL_ALPHA16_EXTENDED_RANGE_SGIX 0x85F4 +#define GL_LUMINANCE16_EXTENDED_RANGE_SGIX 0x85F5 +#define GL_INTENSITY16_EXTENDED_RANGE_SGIX 0x85F6 +#define GL_LUMINANCE16_ALPHA16_EXTENDED_RANGE_SGIX 0x85F7 +#define GL_MIN_LUMINANCE_SGIS 0x85F8 +#define GL_MAX_LUMINANCE_SGIS 0x85F9 +#define GL_MIN_INTENSITY_SGIS 0x85FA +#define GL_MAX_INTENSITY_SGIS 0x85FB + +#define GLEW_SGIX_texture_range GLEW_GET_VAR(__GLEW_SGIX_texture_range) + +#endif /* GL_SGIX_texture_range */ + +/* ----------------------- GL_SGIX_texture_scale_bias ---------------------- */ + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 + +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C + +#define GLEW_SGIX_texture_scale_bias GLEW_GET_VAR(__GLEW_SGIX_texture_scale_bias) + +#endif /* GL_SGIX_texture_scale_bias */ + +/* ------------------------- GL_SGIX_vertex_preclip ------------------------ */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip) + +#endif /* GL_SGIX_vertex_preclip */ + +/* ---------------------- GL_SGIX_vertex_preclip_hint ---------------------- */ + +#ifndef GL_SGIX_vertex_preclip_hint +#define GL_SGIX_vertex_preclip_hint 1 + +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF + +#define GLEW_SGIX_vertex_preclip_hint GLEW_GET_VAR(__GLEW_SGIX_vertex_preclip_hint) + +#endif /* GL_SGIX_vertex_preclip_hint */ + +/* ----------------------------- GL_SGIX_ycrcb ----------------------------- */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 + +#define GLEW_SGIX_ycrcb GLEW_GET_VAR(__GLEW_SGIX_ycrcb) + +#endif /* GL_SGIX_ycrcb */ + +/* -------------------------- GL_SGI_color_matrix -------------------------- */ + +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 + +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB + +#define GLEW_SGI_color_matrix GLEW_GET_VAR(__GLEW_SGI_color_matrix) + +#endif /* GL_SGI_color_matrix */ + +/* --------------------------- GL_SGI_color_table -------------------------- */ + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 + +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF + +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint* params); +typedef void (GLAPIENTRY * PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (GLAPIENTRY * PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint* params); +typedef void (GLAPIENTRY * PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); + +#define glColorTableParameterfvSGI GLEW_GET_FUN(__glewColorTableParameterfvSGI) +#define glColorTableParameterivSGI GLEW_GET_FUN(__glewColorTableParameterivSGI) +#define glColorTableSGI GLEW_GET_FUN(__glewColorTableSGI) +#define glCopyColorTableSGI GLEW_GET_FUN(__glewCopyColorTableSGI) +#define glGetColorTableParameterfvSGI GLEW_GET_FUN(__glewGetColorTableParameterfvSGI) +#define glGetColorTableParameterivSGI GLEW_GET_FUN(__glewGetColorTableParameterivSGI) +#define glGetColorTableSGI GLEW_GET_FUN(__glewGetColorTableSGI) + +#define GLEW_SGI_color_table GLEW_GET_VAR(__GLEW_SGI_color_table) + +#endif /* GL_SGI_color_table */ + +/* ----------------------- GL_SGI_texture_color_table ---------------------- */ + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 + +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD + +#define GLEW_SGI_texture_color_table GLEW_GET_VAR(__GLEW_SGI_texture_color_table) + +#endif /* GL_SGI_texture_color_table */ + +/* ------------------------- GL_SUNX_constant_data ------------------------- */ + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 + +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 + +typedef void (GLAPIENTRY * PFNGLFINISHTEXTURESUNXPROC) (void); + +#define glFinishTextureSUNX GLEW_GET_FUN(__glewFinishTextureSUNX) + +#define GLEW_SUNX_constant_data GLEW_GET_VAR(__GLEW_SUNX_constant_data) + +#endif /* GL_SUNX_constant_data */ + +/* -------------------- GL_SUN_convolution_border_modes -------------------- */ + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 + +#define GL_WRAP_BORDER_SUN 0x81D4 + +#define GLEW_SUN_convolution_border_modes GLEW_GET_VAR(__GLEW_SUN_convolution_border_modes) + +#endif /* GL_SUN_convolution_border_modes */ + +/* -------------------------- GL_SUN_global_alpha -------------------------- */ + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 + +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA + +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +typedef void (GLAPIENTRY * PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); + +#define glGlobalAlphaFactorbSUN GLEW_GET_FUN(__glewGlobalAlphaFactorbSUN) +#define glGlobalAlphaFactordSUN GLEW_GET_FUN(__glewGlobalAlphaFactordSUN) +#define glGlobalAlphaFactorfSUN GLEW_GET_FUN(__glewGlobalAlphaFactorfSUN) +#define glGlobalAlphaFactoriSUN GLEW_GET_FUN(__glewGlobalAlphaFactoriSUN) +#define glGlobalAlphaFactorsSUN GLEW_GET_FUN(__glewGlobalAlphaFactorsSUN) +#define glGlobalAlphaFactorubSUN GLEW_GET_FUN(__glewGlobalAlphaFactorubSUN) +#define glGlobalAlphaFactoruiSUN GLEW_GET_FUN(__glewGlobalAlphaFactoruiSUN) +#define glGlobalAlphaFactorusSUN GLEW_GET_FUN(__glewGlobalAlphaFactorusSUN) + +#define GLEW_SUN_global_alpha GLEW_GET_VAR(__GLEW_SUN_global_alpha) + +#endif /* GL_SUN_global_alpha */ + +/* --------------------------- GL_SUN_mesh_array --------------------------- */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 + +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 + +#define GLEW_SUN_mesh_array GLEW_GET_VAR(__GLEW_SUN_mesh_array) + +#endif /* GL_SUN_mesh_array */ + +/* ------------------------ GL_SUN_read_video_pixels ----------------------- */ + +#ifndef GL_SUN_read_video_pixels +#define GL_SUN_read_video_pixels 1 + +typedef void (GLAPIENTRY * PFNGLREADVIDEOPIXELSSUNPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels); + +#define glReadVideoPixelsSUN GLEW_GET_FUN(__glewReadVideoPixelsSUN) + +#define GLEW_SUN_read_video_pixels GLEW_GET_VAR(__GLEW_SUN_read_video_pixels) + +#endif /* GL_SUN_read_video_pixels */ + +/* --------------------------- GL_SUN_slice_accum -------------------------- */ + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 + +#define GL_SLICE_ACCUM_SUN 0x85CC + +#define GLEW_SUN_slice_accum GLEW_GET_VAR(__GLEW_SUN_slice_accum) + +#endif /* GL_SUN_slice_accum */ + +/* -------------------------- GL_SUN_triangle_list ------------------------- */ + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 + +#define GL_RESTART_SUN 0x01 +#define GL_REPLACE_MIDDLE_SUN 0x02 +#define GL_REPLACE_OLDEST_SUN 0x03 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB + +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint* code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort* code); + +#define glReplacementCodePointerSUN GLEW_GET_FUN(__glewReplacementCodePointerSUN) +#define glReplacementCodeubSUN GLEW_GET_FUN(__glewReplacementCodeubSUN) +#define glReplacementCodeubvSUN GLEW_GET_FUN(__glewReplacementCodeubvSUN) +#define glReplacementCodeuiSUN GLEW_GET_FUN(__glewReplacementCodeuiSUN) +#define glReplacementCodeuivSUN GLEW_GET_FUN(__glewReplacementCodeuivSUN) +#define glReplacementCodeusSUN GLEW_GET_FUN(__glewReplacementCodeusSUN) +#define glReplacementCodeusvSUN GLEW_GET_FUN(__glewReplacementCodeusvSUN) + +#define GLEW_SUN_triangle_list GLEW_GET_VAR(__GLEW_SUN_triangle_list) + +#endif /* GL_SUN_triangle_list */ + +/* ----------------------------- GL_SUN_vertex ----------------------------- */ + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 + +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte* c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint* rc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint* rc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat* tc, const GLubyte *c, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (GLAPIENTRY * PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat* tc, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GLAPIENTRY * PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat* tc, const GLfloat *v); + +#define glColor3fVertex3fSUN GLEW_GET_FUN(__glewColor3fVertex3fSUN) +#define glColor3fVertex3fvSUN GLEW_GET_FUN(__glewColor3fVertex3fvSUN) +#define glColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fSUN) +#define glColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewColor4fNormal3fVertex3fvSUN) +#define glColor4ubVertex2fSUN GLEW_GET_FUN(__glewColor4ubVertex2fSUN) +#define glColor4ubVertex2fvSUN GLEW_GET_FUN(__glewColor4ubVertex2fvSUN) +#define glColor4ubVertex3fSUN GLEW_GET_FUN(__glewColor4ubVertex3fSUN) +#define glColor4ubVertex3fvSUN GLEW_GET_FUN(__glewColor4ubVertex3fvSUN) +#define glNormal3fVertex3fSUN GLEW_GET_FUN(__glewNormal3fVertex3fSUN) +#define glNormal3fVertex3fvSUN GLEW_GET_FUN(__glewNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fSUN) +#define glReplacementCodeuiColor3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor3fVertex3fvSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiColor4ubVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fSUN) +#define glReplacementCodeuiColor4ubVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiColor4ubVertex3fvSUN) +#define glReplacementCodeuiNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fSUN) +#define glReplacementCodeuiNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) +#define glReplacementCodeuiTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fSUN) +#define glReplacementCodeuiTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiTexCoord2fVertex3fvSUN) +#define glReplacementCodeuiVertex3fSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fSUN) +#define glReplacementCodeuiVertex3fvSUN GLEW_GET_FUN(__glewReplacementCodeuiVertex3fvSUN) +#define glTexCoord2fColor3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fSUN) +#define glTexCoord2fColor3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor3fVertex3fvSUN) +#define glTexCoord2fColor4fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fSUN) +#define glTexCoord2fColor4fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4fNormal3fVertex3fvSUN) +#define glTexCoord2fColor4ubVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fSUN) +#define glTexCoord2fColor4ubVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fColor4ubVertex3fvSUN) +#define glTexCoord2fNormal3fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fSUN) +#define glTexCoord2fNormal3fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fNormal3fVertex3fvSUN) +#define glTexCoord2fVertex3fSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fSUN) +#define glTexCoord2fVertex3fvSUN GLEW_GET_FUN(__glewTexCoord2fVertex3fvSUN) +#define glTexCoord4fColor4fNormal3fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fSUN) +#define glTexCoord4fColor4fNormal3fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fColor4fNormal3fVertex4fvSUN) +#define glTexCoord4fVertex4fSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fSUN) +#define glTexCoord4fVertex4fvSUN GLEW_GET_FUN(__glewTexCoord4fVertex4fvSUN) + +#define GLEW_SUN_vertex GLEW_GET_VAR(__GLEW_SUN_vertex) + +#endif /* GL_SUN_vertex */ + +/* -------------------------- GL_WIN_phong_shading ------------------------- */ + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 + +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB + +#define GLEW_WIN_phong_shading GLEW_GET_VAR(__GLEW_WIN_phong_shading) + +#endif /* GL_WIN_phong_shading */ + +/* -------------------------- GL_WIN_specular_fog -------------------------- */ + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 + +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC + +#define GLEW_WIN_specular_fog GLEW_GET_VAR(__GLEW_WIN_specular_fog) + +#endif /* GL_WIN_specular_fog */ + +/* ---------------------------- GL_WIN_swap_hint --------------------------- */ + +#ifndef GL_WIN_swap_hint +#define GL_WIN_swap_hint 1 + +typedef void (GLAPIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); + +#define glAddSwapHintRectWIN GLEW_GET_FUN(__glewAddSwapHintRectWIN) + +#define GLEW_WIN_swap_hint GLEW_GET_VAR(__GLEW_WIN_swap_hint) + +#endif /* GL_WIN_swap_hint */ + +/* ------------------------------------------------------------------------- */ + +#if defined(GLEW_MX) && defined(_WIN32) +#define GLEW_FUN_EXPORT +#else +#define GLEW_FUN_EXPORT GLEWAPI +#endif /* GLEW_MX */ + +#if defined(GLEW_MX) +#define GLEW_VAR_EXPORT +#else +#define GLEW_VAR_EXPORT GLEWAPI +#endif /* GLEW_MX */ + +#if defined(GLEW_MX) && defined(_WIN32) +struct GLEWContextStruct +{ +#endif /* GLEW_MX */ + +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DPROC __glewTexImage3D; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv; +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage; + +GLEW_FUN_EXPORT PFNGLBLENDCOLORPROC __glewBlendColor; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONPROC __glewBlendEquation; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer; +GLEW_FUN_EXPORT PFNGLFOGCOORDDPROC __glewFogCoordd; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVPROC __glewFogCoorddv; +GLEW_FUN_EXPORT PFNGLFOGCOORDFPROC __glewFogCoordf; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVPROC __glewFogCoordfv; +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFPROC __glewPointParameterf; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIPROC __glewPointParameteri; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DPROC __glewWindowPos2d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FPROC __glewWindowPos2f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IPROC __glewWindowPos2i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SPROC __glewWindowPos2s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DPROC __glewWindowPos3d; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FPROC __glewWindowPos3f; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IPROC __glewWindowPos3i; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SPROC __glewWindowPos3s; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYPROC __glewBeginQuery; +GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer; +GLEW_FUN_EXPORT PFNGLBUFFERDATAPROC __glewBufferData; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAPROC __glewBufferSubData; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSPROC __glewDeleteBuffers; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESPROC __glewDeleteQueries; +GLEW_FUN_EXPORT PFNGLENDQUERYPROC __glewEndQuery; +GLEW_FUN_EXPORT PFNGLGENBUFFERSPROC __glewGenBuffers; +GLEW_FUN_EXPORT PFNGLGENQUERIESPROC __glewGenQueries; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv; +GLEW_FUN_EXPORT PFNGLGETQUERYIVPROC __glewGetQueryiv; +GLEW_FUN_EXPORT PFNGLISBUFFERPROC __glewIsBuffer; +GLEW_FUN_EXPORT PFNGLISQUERYPROC __glewIsQuery; +GLEW_FUN_EXPORT PFNGLMAPBUFFERPROC __glewMapBuffer; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERPROC __glewUnmapBuffer; + +GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader; +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERPROC __glewCompileShader; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPROC __glewCreateProgram; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROC __glewCreateShader; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPROC __glewDeleteProgram; +GLEW_FUN_EXPORT PFNGLDELETESHADERPROC __glewDeleteShader; +GLEW_FUN_EXPORT PFNGLDETACHSHADERPROC __glewDetachShader; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSPROC __glewDrawBuffers; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform; +GLEW_FUN_EXPORT PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation; +GLEW_FUN_EXPORT PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVPROC __glewGetProgramiv; +GLEW_FUN_EXPORT PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEPROC __glewGetShaderSource; +GLEW_FUN_EXPORT PFNGLGETSHADERIVPROC __glewGetShaderiv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVPROC __glewGetUniformfv; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVPROC __glewGetUniformiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv; +GLEW_FUN_EXPORT PFNGLISPROGRAMPROC __glewIsProgram; +GLEW_FUN_EXPORT PFNGLISSHADERPROC __glewIsShader; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMPROC __glewLinkProgram; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEPROC __glewShaderSource; +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate; +GLEW_FUN_EXPORT PFNGLUNIFORM1FPROC __glewUniform1f; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVPROC __glewUniform1fv; +GLEW_FUN_EXPORT PFNGLUNIFORM1IPROC __glewUniform1i; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVPROC __glewUniform1iv; +GLEW_FUN_EXPORT PFNGLUNIFORM2FPROC __glewUniform2f; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVPROC __glewUniform2fv; +GLEW_FUN_EXPORT PFNGLUNIFORM2IPROC __glewUniform2i; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVPROC __glewUniform2iv; +GLEW_FUN_EXPORT PFNGLUNIFORM3FPROC __glewUniform3f; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVPROC __glewUniform3fv; +GLEW_FUN_EXPORT PFNGLUNIFORM3IPROC __glewUniform3i; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVPROC __glewUniform3iv; +GLEW_FUN_EXPORT PFNGLUNIFORM4FPROC __glewUniform4f; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVPROC __glewUniform4fv; +GLEW_FUN_EXPORT PFNGLUNIFORM4IPROC __glewUniform4i; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVPROC __glewUniform4iv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMPROC __glewUseProgram; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPROC __glewValidateProgram; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer; + +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv; + +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender; +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback; +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation; +GLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERFVPROC __glewClearBufferfv; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERIVPROC __glewClearBufferiv; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv; +GLEW_FUN_EXPORT PFNGLCOLORMASKIPROC __glewColorMaski; +GLEW_FUN_EXPORT PFNGLDISABLEIPROC __glewDisablei; +GLEW_FUN_EXPORT PFNGLENABLEIPROC __glewEnablei; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback; +GLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v; +GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation; +GLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv; +GLEW_FUN_EXPORT PFNGLISENABLEDIPROC __glewIsEnabledi; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIPROC __glewUniform1ui; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIVPROC __glewUniform1uiv; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIPROC __glewUniform2ui; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIVPROC __glewUniform2uiv; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIPROC __glewUniform3ui; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIVPROC __glewUniform3uiv; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIPROC __glewUniform4ui; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIVPROC __glewUniform4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced; +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex; +GLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v; +GLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v; + +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIPROC __glewBlendEquationi; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei; +GLEW_FUN_EXPORT PFNGLBLENDFUNCIPROC __glewBlendFunci; +GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading; + +GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus; +GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage; +GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEPROC __glewGetnTexImage; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv; + +GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX; + +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD; +GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD; +GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD; + +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD; + +GLEW_FUN_EXPORT PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD; +GLEW_FUN_EXPORT PFNGLGENNAMESAMDPROC __glewGenNamesAMD; +GLEW_FUN_EXPORT PFNGLISNAMEAMDPROC __glewIsNameAMD; + +GLEW_FUN_EXPORT PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD; + +GLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD; +GLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD; +GLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD; +GLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD; +GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD; +GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD; + +GLEW_FUN_EXPORT PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD; + +GLEW_FUN_EXPORT PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD; + +GLEW_FUN_EXPORT PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD; + +GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD; +GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD; + +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE; +GLEW_FUN_EXPORT PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE; +GLEW_FUN_EXPORT PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE; +GLEW_FUN_EXPORT PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE; +GLEW_FUN_EXPORT PFNGLISQUERYANGLEPROC __glewIsQueryANGLE; +GLEW_FUN_EXPORT PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE; + +GLEW_FUN_EXPORT PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE; +GLEW_FUN_EXPORT PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE; +GLEW_FUN_EXPORT PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE; +GLEW_FUN_EXPORT PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE; +GLEW_FUN_EXPORT PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE; +GLEW_FUN_EXPORT PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE; +GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE; + +GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE; +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE; +GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE; +GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE; + +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE; +GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE; + +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE; +GLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE; +GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHFPROC __glewClearDepthf; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEFPROC __glewDepthRangef; +GLEW_FUN_EXPORT PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat; +GLEW_FUN_EXPORT PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler; +GLEW_FUN_EXPORT PFNGLSHADERBINARYPROC __glewShaderBinary; + +GLEW_FUN_EXPORT PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion; + +GLEW_FUN_EXPORT PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance; + +GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB; +GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB; +GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB; +GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB; +GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed; +GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex; + +GLEW_FUN_EXPORT PFNGLBUFFERSTORAGEPROC __glewBufferStorage; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT; + +GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB; + +GLEW_FUN_EXPORT PFNGLCLEARBUFFERDATAPROC __glewClearBufferData; +GLEW_FUN_EXPORT PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT; + +GLEW_FUN_EXPORT PFNGLCLEARTEXIMAGEPROC __glewClearTexImage; +GLEW_FUN_EXPORT PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage; + +GLEW_FUN_EXPORT PFNGLCLIPCONTROLPROC __glewClipControl; + +GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB; + +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute; +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect; + +GLEW_FUN_EXPORT PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB; + +GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData; + +GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData; + +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB; +GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB; + +GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit; +GLEW_FUN_EXPORT PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer; +GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv; +GLEW_FUN_EXPORT PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D; +GLEW_FUN_EXPORT PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D; +GLEW_FUN_EXPORT PFNGLCREATEBUFFERSPROC __glewCreateBuffers; +GLEW_FUN_EXPORT PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines; +GLEW_FUN_EXPORT PFNGLCREATEQUERIESPROC __glewCreateQueries; +GLEW_FUN_EXPORT PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers; +GLEW_FUN_EXPORT PFNGLCREATESAMPLERSPROC __glewCreateSamplers; +GLEW_FUN_EXPORT PFNGLCREATETEXTURESPROC __glewCreateTextures; +GLEW_FUN_EXPORT PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks; +GLEW_FUN_EXPORT PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib; +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange; +GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v; +GLEW_FUN_EXPORT PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv; +GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData; +GLEW_FUN_EXPORT PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERPROC __glewTextureBuffer; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange; +GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB; +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB; +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB; +GLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer; +GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer; +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer; +GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus; +GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers; +GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer; +GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers; +GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers; +GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv; +GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv; +GLEW_FUN_EXPORT PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer; +GLEW_FUN_EXPORT PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary; +GLEW_FUN_EXPORT PFNGLPROGRAMBINARYPROC __glewProgramBinary; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri; + +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage; +GLEW_FUN_EXPORT PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv; +GLEW_FUN_EXPORT PFNGLUNIFORM1DPROC __glewUniform1d; +GLEW_FUN_EXPORT PFNGLUNIFORM1DVPROC __glewUniform1dv; +GLEW_FUN_EXPORT PFNGLUNIFORM2DPROC __glewUniform2d; +GLEW_FUN_EXPORT PFNGLUNIFORM2DVPROC __glewUniform2dv; +GLEW_FUN_EXPORT PFNGLUNIFORM3DPROC __glewUniform3d; +GLEW_FUN_EXPORT PFNGLUNIFORM3DVPROC __glewUniform3dv; +GLEW_FUN_EXPORT PFNGLUNIFORM4DPROC __glewUniform4d; +GLEW_FUN_EXPORT PFNGLUNIFORM4DVPROC __glewUniform4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPROC __glewGetColorTable; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPROC __glewGetHistogram; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPROC __glewGetMinmax; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter; +GLEW_FUN_EXPORT PFNGLHISTOGRAMPROC __glewHistogram; +GLEW_FUN_EXPORT PFNGLMINMAXPROC __glewMinmax; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMPROC __glewResetHistogram; +GLEW_FUN_EXPORT PFNGLRESETMINMAXPROC __glewResetMinmax; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB; + +GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ; + +GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v; + +GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData; +GLEW_FUN_EXPORT PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData; +GLEW_FUN_EXPORT PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer; +GLEW_FUN_EXPORT PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer; +GLEW_FUN_EXPORT PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage; +GLEW_FUN_EXPORT PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage; + +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange; +GLEW_FUN_EXPORT PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange; + +GLEW_FUN_EXPORT PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB; +GLEW_FUN_EXPORT PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase; +GLEW_FUN_EXPORT PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange; +GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures; +GLEW_FUN_EXPORT PFNGLBINDSAMPLERSPROC __glewBindSamplers; +GLEW_FUN_EXPORT PFNGLBINDTEXTURESPROC __glewBindTextures; +GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect; + +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB; + +GLEW_FUN_EXPORT PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB; +GLEW_FUN_EXPORT PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYARBPROC __glewBeginQueryARB; +GLEW_FUN_EXPORT PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB; +GLEW_FUN_EXPORT PFNGLENDQUERYARBPROC __glewEndQueryARB; +GLEW_FUN_EXPORT PFNGLGENQUERIESARBPROC __glewGenQueriesARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB; +GLEW_FUN_EXPORT PFNGLGETQUERYIVARBPROC __glewGetQueryivARB; +GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB; + +GLEW_FUN_EXPORT PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv; + +GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex; + +GLEW_FUN_EXPORT PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB; +GLEW_FUN_EXPORT PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB; +GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB; +GLEW_FUN_EXPORT PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB; +GLEW_FUN_EXPORT PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB; +GLEW_FUN_EXPORT PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB; +GLEW_FUN_EXPORT PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB; +GLEW_FUN_EXPORT PFNGLGETNMAPIVARBPROC __glewGetnMapivARB; +GLEW_FUN_EXPORT PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB; +GLEW_FUN_EXPORT PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB; +GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB; +GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB; +GLEW_FUN_EXPORT PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB; +GLEW_FUN_EXPORT PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB; +GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB; +GLEW_FUN_EXPORT PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB; + +GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB; + +GLEW_FUN_EXPORT PFNGLBINDSAMPLERPROC __glewBindSampler; +GLEW_FUN_EXPORT PFNGLDELETESAMPLERSPROC __glewDeleteSamplers; +GLEW_FUN_EXPORT PFNGLGENSAMPLERSPROC __glewGenSamplers; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv; +GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv; +GLEW_FUN_EXPORT PFNGLISSAMPLERPROC __glewIsSampler; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri; +GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv; + +GLEW_FUN_EXPORT PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram; +GLEW_FUN_EXPORT PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines; +GLEW_FUN_EXPORT PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv; +GLEW_FUN_EXPORT PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline; + +GLEW_FUN_EXPORT PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv; + +GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture; +GLEW_FUN_EXPORT PFNGLMEMORYBARRIERPROC __glewMemoryBarrier; + +GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB; +GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB; +GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB; +GLEW_FUN_EXPORT PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB; +GLEW_FUN_EXPORT PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB; +GLEW_FUN_EXPORT PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB; +GLEW_FUN_EXPORT PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB; +GLEW_FUN_EXPORT PFNGLGETHANDLEARBPROC __glewGetHandleARB; +GLEW_FUN_EXPORT PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB; +GLEW_FUN_EXPORT PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB; +GLEW_FUN_EXPORT PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB; +GLEW_FUN_EXPORT PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB; +GLEW_FUN_EXPORT PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FARBPROC __glewUniform1fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IARBPROC __glewUniform1iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FARBPROC __glewUniform2fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IARBPROC __glewUniform2iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FARBPROC __glewUniform3fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IARBPROC __glewUniform3iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FARBPROC __glewUniform4fARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IARBPROC __glewUniform4iARB; +GLEW_FUN_EXPORT PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB; +GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB; +GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB; +GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB; + +GLEW_FUN_EXPORT PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding; + +GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName; +GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName; +GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv; +GLEW_FUN_EXPORT PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex; +GLEW_FUN_EXPORT PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation; +GLEW_FUN_EXPORT PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv; +GLEW_FUN_EXPORT PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv; + +GLEW_FUN_EXPORT PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB; +GLEW_FUN_EXPORT PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB; +GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB; +GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB; +GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB; +GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB; + +GLEW_FUN_EXPORT PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB; + +GLEW_FUN_EXPORT PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB; +GLEW_FUN_EXPORT PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT; + +GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync; +GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync; +GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync; +GLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v; +GLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv; +GLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync; +GLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync; + +GLEW_FUN_EXPORT PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv; +GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIPROC __glewPatchParameteri; + +GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERPROC __glewTextureBarrier; + +GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB; + +GLEW_FUN_EXPORT PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT; + +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB; + +GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv; +GLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski; +GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample; + +GLEW_FUN_EXPORT PFNGLTEXSTORAGE1DPROC __glewTexStorage1D; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DPROC __glewTexStorage2D; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DPROC __glewTexStorage3D; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample; +GLEW_FUN_EXPORT PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLTEXTUREVIEWPROC __glewTextureView; + +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v; +GLEW_FUN_EXPORT PFNGLQUERYCOUNTERPROC __glewQueryCounter; + +GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback; +GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback; +GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks; +GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback; +GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback; +GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback; + +GLEW_FUN_EXPORT PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream; +GLEW_FUN_EXPORT PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed; +GLEW_FUN_EXPORT PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv; + +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced; + +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB; +GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName; +GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv; +GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v; +GLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex; +GLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices; +GLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays; +GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays; +GLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer; + +GLEW_FUN_EXPORT PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat; +GLEW_FUN_EXPORT PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor; + +GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB; +GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB; +GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTDVARBPROC __glewWeightdvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTFVARBPROC __glewWeightfvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTIVARBPROC __glewWeightivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTSVARBPROC __glewWeightsvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUBVARBPROC __glewWeightubvARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUIVARBPROC __glewWeightuivARB; +GLEW_FUN_EXPORT PFNGLWEIGHTUSVARBPROC __glewWeightusvARB; + +GLEW_FUN_EXPORT PFNGLBINDBUFFERARBPROC __glewBindBufferARB; +GLEW_FUN_EXPORT PFNGLBUFFERDATAARBPROC __glewBufferDataARB; +GLEW_FUN_EXPORT PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB; +GLEW_FUN_EXPORT PFNGLGENBUFFERSARBPROC __glewGenBuffersARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB; +GLEW_FUN_EXPORT PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB; +GLEW_FUN_EXPORT PFNGLISBUFFERARBPROC __glewIsBufferARB; +GLEW_FUN_EXPORT PFNGLMAPBUFFERARBPROC __glewMapBufferARB; +GLEW_FUN_EXPORT PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB; + +GLEW_FUN_EXPORT PFNGLBINDPROGRAMARBPROC __glewBindProgramARB; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB; +GLEW_FUN_EXPORT PFNGLISPROGRAMARBPROC __glewIsProgramARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB; +GLEW_FUN_EXPORT PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB; + +GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB; +GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB; +GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB; + +GLEW_FUN_EXPORT PFNGLCOLORP3UIPROC __glewColorP3ui; +GLEW_FUN_EXPORT PFNGLCOLORP3UIVPROC __glewColorP3uiv; +GLEW_FUN_EXPORT PFNGLCOLORP4UIPROC __glewColorP4ui; +GLEW_FUN_EXPORT PFNGLCOLORP4UIVPROC __glewColorP4uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv; +GLEW_FUN_EXPORT PFNGLNORMALP3UIPROC __glewNormalP3ui; +GLEW_FUN_EXPORT PFNGLNORMALP3UIVPROC __glewNormalP3uiv; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv; +GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui; +GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv; +GLEW_FUN_EXPORT PFNGLVERTEXP2UIPROC __glewVertexP2ui; +GLEW_FUN_EXPORT PFNGLVERTEXP2UIVPROC __glewVertexP2uiv; +GLEW_FUN_EXPORT PFNGLVERTEXP3UIPROC __glewVertexP3ui; +GLEW_FUN_EXPORT PFNGLVERTEXP3UIVPROC __glewVertexP3uiv; +GLEW_FUN_EXPORT PFNGLVERTEXP4UIPROC __glewVertexP4ui; +GLEW_FUN_EXPORT PFNGLVERTEXP4UIVPROC __glewVertexP4uiv; + +GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed; +GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v; +GLEW_FUN_EXPORT PFNGLGETFLOATI_VPROC __glewGetFloati_v; +GLEW_FUN_EXPORT PFNGLSCISSORARRAYVPROC __glewScissorArrayv; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDPROC __glewScissorIndexed; +GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv; +GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf; +GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB; + +GLEW_FUN_EXPORT PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI; + +GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI; +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI; +GLEW_FUN_EXPORT PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI; + +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI; +GLEW_FUN_EXPORT PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI; + +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI; +GLEW_FUN_EXPORT PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI; +GLEW_FUN_EXPORT PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI; +GLEW_FUN_EXPORT PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI; +GLEW_FUN_EXPORT PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI; +GLEW_FUN_EXPORT PFNGLSAMPLEMAPATIPROC __glewSampleMapATI; +GLEW_FUN_EXPORT PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI; + +GLEW_FUN_EXPORT PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI; + +GLEW_FUN_EXPORT PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI; +GLEW_FUN_EXPORT PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI; + +GLEW_FUN_EXPORT PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI; +GLEW_FUN_EXPORT PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI; + +GLEW_FUN_EXPORT PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI; +GLEW_FUN_EXPORT PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI; +GLEW_FUN_EXPORT PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI; +GLEW_FUN_EXPORT PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI; +GLEW_FUN_EXPORT PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI; +GLEW_FUN_EXPORT PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI; + +GLEW_FUN_EXPORT PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI; +GLEW_FUN_EXPORT PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI; +GLEW_FUN_EXPORT PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI; +GLEW_FUN_EXPORT PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT; +GLEW_FUN_EXPORT PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT; + +GLEW_FUN_EXPORT PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT; + +GLEW_FUN_EXPORT PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT; + +GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT; +GLEW_FUN_EXPORT PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT; + +GLEW_FUN_EXPORT PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT; +GLEW_FUN_EXPORT PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT; + +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT; +GLEW_FUN_EXPORT PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT; +GLEW_FUN_EXPORT PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT; + +GLEW_FUN_EXPORT PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT; + +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT; +GLEW_FUN_EXPORT PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT; +GLEW_FUN_EXPORT PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT; + +GLEW_FUN_EXPORT PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT; +GLEW_FUN_EXPORT PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT; +GLEW_FUN_EXPORT PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT; + +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT; + +GLEW_FUN_EXPORT PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT; +GLEW_FUN_EXPORT PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT; +GLEW_FUN_EXPORT PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT; +GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT; +GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT; +GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT; +GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT; +GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT; +GLEW_FUN_EXPORT PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT; +GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT; +GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT; +GLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT; +GLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT; +GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT; +GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT; +GLEW_FUN_EXPORT PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT; +GLEW_FUN_EXPORT PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT; +GLEW_FUN_EXPORT PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT; +GLEW_FUN_EXPORT PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT; +GLEW_FUN_EXPORT PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT; +GLEW_FUN_EXPORT PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT; +GLEW_FUN_EXPORT PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT; +GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT; +GLEW_FUN_EXPORT PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT; +GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT; +GLEW_FUN_EXPORT PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT; +GLEW_FUN_EXPORT PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT; +GLEW_FUN_EXPORT PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT; +GLEW_FUN_EXPORT PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT; +GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT; + +GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT; +GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT; +GLEW_FUN_EXPORT PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT; +GLEW_FUN_EXPORT PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT; +GLEW_FUN_EXPORT PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT; +GLEW_FUN_EXPORT PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT; + +GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT; +GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT; + +GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT; + +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT; +GLEW_FUN_EXPORT PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT; +GLEW_FUN_EXPORT PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT; + +GLEW_FUN_EXPORT PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT; +GLEW_FUN_EXPORT PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT; +GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT; +GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT; +GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT; +GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT; +GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT; +GLEW_FUN_EXPORT PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT; +GLEW_FUN_EXPORT PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT; +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT; +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT; + +GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT; +GLEW_FUN_EXPORT PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT; + +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT; +GLEW_FUN_EXPORT PFNGLHISTOGRAMEXTPROC __glewHistogramEXT; +GLEW_FUN_EXPORT PFNGLMINMAXEXTPROC __glewMinmaxEXT; +GLEW_FUN_EXPORT PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT; +GLEW_FUN_EXPORT PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT; + +GLEW_FUN_EXPORT PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT; + +GLEW_FUN_EXPORT PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT; + +GLEW_FUN_EXPORT PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT; +GLEW_FUN_EXPORT PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT; +GLEW_FUN_EXPORT PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEEXTPROC __glewColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT; + +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT; +GLEW_FUN_EXPORT PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT; + +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT; + +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT; + +GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT; + +GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV; +GLEW_FUN_EXPORT PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV; +GLEW_FUN_EXPORT PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV; +GLEW_FUN_EXPORT PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT; + +GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT; +GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT; + +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT; + +GLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT; +GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT; +GLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT; + +GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT; +GLEW_FUN_EXPORT PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT; + +GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT; + +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT; + +GLEW_FUN_EXPORT PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT; + +GLEW_FUN_EXPORT PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT; +GLEW_FUN_EXPORT PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT; + +GLEW_FUN_EXPORT PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT; +GLEW_FUN_EXPORT PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT; +GLEW_FUN_EXPORT PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT; +GLEW_FUN_EXPORT PFNGLISTEXTUREEXTPROC __glewIsTextureEXT; +GLEW_FUN_EXPORT PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT; + +GLEW_FUN_EXPORT PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT; + +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT; +GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT; + +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT; +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT; +GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT; + +GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT; +GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT; +GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT; +GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT; +GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT; + +GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT; +GLEW_FUN_EXPORT PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT; +GLEW_FUN_EXPORT PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT; +GLEW_FUN_EXPORT PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT; +GLEW_FUN_EXPORT PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT; +GLEW_FUN_EXPORT PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT; +GLEW_FUN_EXPORT PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT; +GLEW_FUN_EXPORT PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT; +GLEW_FUN_EXPORT PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT; +GLEW_FUN_EXPORT PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT; +GLEW_FUN_EXPORT PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT; +GLEW_FUN_EXPORT PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT; +GLEW_FUN_EXPORT PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT; +GLEW_FUN_EXPORT PFNGLSWIZZLEEXTPROC __glewSwizzleEXT; +GLEW_FUN_EXPORT PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT; +GLEW_FUN_EXPORT PFNGLVARIANTBVEXTPROC __glewVariantbvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTDVEXTPROC __glewVariantdvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTFVEXTPROC __glewVariantfvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTIVEXTPROC __glewVariantivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTSVEXTPROC __glewVariantsvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT; +GLEW_FUN_EXPORT PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT; +GLEW_FUN_EXPORT PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT; + +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT; + +GLEW_FUN_EXPORT PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT; + +GLEW_FUN_EXPORT PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY; + +GLEW_FUN_EXPORT PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY; + +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP; +GLEW_FUN_EXPORT PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP; + +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM; +GLEW_FUN_EXPORT PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM; +GLEW_FUN_EXPORT PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM; + +GLEW_FUN_EXPORT PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL; +GLEW_FUN_EXPORT PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL; +GLEW_FUN_EXPORT PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL; + +GLEW_FUN_EXPORT PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL; +GLEW_FUN_EXPORT PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL; +GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL; +GLEW_FUN_EXPORT PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL; + +GLEW_FUN_EXPORT PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL; +GLEW_FUN_EXPORT PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL; +GLEW_FUN_EXPORT PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL; +GLEW_FUN_EXPORT PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL; + +GLEW_FUN_EXPORT PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL; +GLEW_FUN_EXPORT PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL; + +GLEW_FUN_EXPORT PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR; + +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl; +GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert; +GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog; +GLEW_FUN_EXPORT PFNGLGETOBJECTLABELPROC __glewGetObjectLabel; +GLEW_FUN_EXPORT PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel; +GLEW_FUN_EXPORT PFNGLOBJECTLABELPROC __glewObjectLabel; +GLEW_FUN_EXPORT PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel; +GLEW_FUN_EXPORT PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup; +GLEW_FUN_EXPORT PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup; + +GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv; +GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv; +GLEW_FUN_EXPORT PFNGLREADNPIXELSPROC __glewReadnPixels; + +GLEW_FUN_EXPORT PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled; +GLEW_FUN_EXPORT PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion; +GLEW_FUN_EXPORT PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion; +GLEW_FUN_EXPORT PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion; +GLEW_FUN_EXPORT PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion; + +GLEW_FUN_EXPORT PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA; + +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA; +GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA; + +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV; + +GLEW_FUN_EXPORT PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV; +GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV; + +GLEW_FUN_EXPORT PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV; +GLEW_FUN_EXPORT PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV; +GLEW_FUN_EXPORT PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV; +GLEW_FUN_EXPORT PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV; +GLEW_FUN_EXPORT PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV; + +GLEW_FUN_EXPORT PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV; +GLEW_FUN_EXPORT PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV; + +GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV; +GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV; + +GLEW_FUN_EXPORT PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV; + +GLEW_FUN_EXPORT PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV; + +GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV; +GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV; + +GLEW_FUN_EXPORT PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV; + +GLEW_FUN_EXPORT PFNGLEVALMAPSNVPROC __glewEvalMapsNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV; +GLEW_FUN_EXPORT PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV; +GLEW_FUN_EXPORT PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV; +GLEW_FUN_EXPORT PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV; + +GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV; +GLEW_FUN_EXPORT PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV; +GLEW_FUN_EXPORT PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV; + +GLEW_FUN_EXPORT PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV; +GLEW_FUN_EXPORT PFNGLFINISHFENCENVPROC __glewFinishFenceNV; +GLEW_FUN_EXPORT PFNGLGENFENCESNVPROC __glewGenFencesNV; +GLEW_FUN_EXPORT PFNGLGETFENCEIVNVPROC __glewGetFenceivNV; +GLEW_FUN_EXPORT PFNGLISFENCENVPROC __glewIsFenceNV; +GLEW_FUN_EXPORT PFNGLSETFENCENVPROC __glewSetFenceNV; +GLEW_FUN_EXPORT PFNGLTESTFENCENVPROC __glewTestFenceNV; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV; + +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV; + +GLEW_FUN_EXPORT PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV; + +GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV; +GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV; + +GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV; +GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV; +GLEW_FUN_EXPORT PFNGLCOLOR4HVNVPROC __glewColor4hvNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHNVPROC __glewFogCoordhNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HNVPROC __glewNormal3hNV; +GLEW_FUN_EXPORT PFNGLNORMAL3HVNVPROC __glewNormal3hvNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV; +GLEW_FUN_EXPORT PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HNVPROC __glewVertex2hNV; +GLEW_FUN_EXPORT PFNGLVERTEX2HVNVPROC __glewVertex2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HNVPROC __glewVertex3hNV; +GLEW_FUN_EXPORT PFNGLVERTEX3HVNVPROC __glewVertex3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HNVPROC __glewVertex4hNV; +GLEW_FUN_EXPORT PFNGLVERTEX4HVNVPROC __glewVertex4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV; +GLEW_FUN_EXPORT PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV; + +GLEW_FUN_EXPORT PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV; + +GLEW_FUN_EXPORT PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV; +GLEW_FUN_EXPORT PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV; +GLEW_FUN_EXPORT PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV; +GLEW_FUN_EXPORT PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV; + +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV; +GLEW_FUN_EXPORT PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV; + +GLEW_FUN_EXPORT PFNGLCOPYPATHNVPROC __glewCopyPathNV; +GLEW_FUN_EXPORT PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV; +GLEW_FUN_EXPORT PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV; +GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV; +GLEW_FUN_EXPORT PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV; +GLEW_FUN_EXPORT PFNGLDELETEPATHSNVPROC __glewDeletePathsNV; +GLEW_FUN_EXPORT PFNGLGENPATHSNVPROC __glewGenPathsNV; +GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV; +GLEW_FUN_EXPORT PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV; +GLEW_FUN_EXPORT PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV; +GLEW_FUN_EXPORT PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV; +GLEW_FUN_EXPORT PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV; +GLEW_FUN_EXPORT PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV; +GLEW_FUN_EXPORT PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV; +GLEW_FUN_EXPORT PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV; +GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV; +GLEW_FUN_EXPORT PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV; +GLEW_FUN_EXPORT PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV; +GLEW_FUN_EXPORT PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV; +GLEW_FUN_EXPORT PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV; +GLEW_FUN_EXPORT PFNGLISPATHNVPROC __glewIsPathNV; +GLEW_FUN_EXPORT PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV; +GLEW_FUN_EXPORT PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV; +GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV; +GLEW_FUN_EXPORT PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV; +GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV; +GLEW_FUN_EXPORT PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV; +GLEW_FUN_EXPORT PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV; +GLEW_FUN_EXPORT PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV; +GLEW_FUN_EXPORT PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV; +GLEW_FUN_EXPORT PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV; +GLEW_FUN_EXPORT PFNGLPATHCOORDSNVPROC __glewPathCoordsNV; +GLEW_FUN_EXPORT PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV; +GLEW_FUN_EXPORT PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV; +GLEW_FUN_EXPORT PFNGLPATHFOGGENNVPROC __glewPathFogGenNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV; +GLEW_FUN_EXPORT PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV; +GLEW_FUN_EXPORT PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV; +GLEW_FUN_EXPORT PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV; +GLEW_FUN_EXPORT PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV; +GLEW_FUN_EXPORT PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV; +GLEW_FUN_EXPORT PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV; +GLEW_FUN_EXPORT PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV; +GLEW_FUN_EXPORT PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV; +GLEW_FUN_EXPORT PFNGLPATHSTRINGNVPROC __glewPathStringNV; +GLEW_FUN_EXPORT PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV; +GLEW_FUN_EXPORT PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV; +GLEW_FUN_EXPORT PFNGLPATHTEXGENNVPROC __glewPathTexGenNV; +GLEW_FUN_EXPORT PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV; +GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV; +GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV; +GLEW_FUN_EXPORT PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV; +GLEW_FUN_EXPORT PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV; + +GLEW_FUN_EXPORT PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV; +GLEW_FUN_EXPORT PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV; + +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV; + +GLEW_FUN_EXPORT PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV; +GLEW_FUN_EXPORT PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV; +GLEW_FUN_EXPORT PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV; + +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV; +GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV; +GLEW_FUN_EXPORT PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV; +GLEW_FUN_EXPORT PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV; +GLEW_FUN_EXPORT PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV; + +GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV; +GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV; + +GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV; +GLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV; +GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV; +GLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV; +GLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV; +GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV; +GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV; +GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV; +GLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV; +GLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV; + +GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV; +GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV; +GLEW_FUN_EXPORT PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV; + +GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV; +GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV; +GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV; +GLEW_FUN_EXPORT PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV; +GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV; +GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV; + +GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV; +GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV; +GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV; +GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV; + +GLEW_FUN_EXPORT PFNGLVDPAUFININVPROC __glewVDPAUFiniNV; +GLEW_FUN_EXPORT PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV; +GLEW_FUN_EXPORT PFNGLVDPAUINITNVPROC __glewVDPAUInitNV; +GLEW_FUN_EXPORT PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV; +GLEW_FUN_EXPORT PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV; +GLEW_FUN_EXPORT PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV; +GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV; +GLEW_FUN_EXPORT PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV; +GLEW_FUN_EXPORT PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV; +GLEW_FUN_EXPORT PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV; + +GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV; +GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV; + +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV; + +GLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV; +GLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV; +GLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV; +GLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV; +GLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV; +GLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV; +GLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV; +GLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV; +GLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV; +GLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV; + +GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV; +GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV; +GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV; +GLEW_FUN_EXPORT PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV; +GLEW_FUN_EXPORT PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV; +GLEW_FUN_EXPORT PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV; +GLEW_FUN_EXPORT PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV; +GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV; +GLEW_FUN_EXPORT PFNGLISPROGRAMNVPROC __glewIsProgramNV; +GLEW_FUN_EXPORT PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV; +GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV; +GLEW_FUN_EXPORT PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV; +GLEW_FUN_EXPORT PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV; +GLEW_FUN_EXPORT PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV; + +GLEW_FUN_EXPORT PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV; +GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV; +GLEW_FUN_EXPORT PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV; +GLEW_FUN_EXPORT PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV; +GLEW_FUN_EXPORT PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV; +GLEW_FUN_EXPORT PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV; +GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV; +GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV; +GLEW_FUN_EXPORT PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV; + +GLEW_FUN_EXPORT PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES; +GLEW_FUN_EXPORT PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES; +GLEW_FUN_EXPORT PFNGLFRUSTUMFOESPROC __glewFrustumfOES; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES; +GLEW_FUN_EXPORT PFNGLORTHOFOESPROC __glewOrthofOES; + +GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR; + +GLEW_FUN_EXPORT PFNGLALPHAFUNCXPROC __glewAlphaFuncx; +GLEW_FUN_EXPORT PFNGLCLEARCOLORXPROC __glewClearColorx; +GLEW_FUN_EXPORT PFNGLCLEARDEPTHXPROC __glewClearDepthx; +GLEW_FUN_EXPORT PFNGLCOLOR4XPROC __glewColor4x; +GLEW_FUN_EXPORT PFNGLDEPTHRANGEXPROC __glewDepthRangex; +GLEW_FUN_EXPORT PFNGLFOGXPROC __glewFogx; +GLEW_FUN_EXPORT PFNGLFOGXVPROC __glewFogxv; +GLEW_FUN_EXPORT PFNGLFRUSTUMFPROC __glewFrustumf; +GLEW_FUN_EXPORT PFNGLFRUSTUMXPROC __glewFrustumx; +GLEW_FUN_EXPORT PFNGLLIGHTMODELXPROC __glewLightModelx; +GLEW_FUN_EXPORT PFNGLLIGHTMODELXVPROC __glewLightModelxv; +GLEW_FUN_EXPORT PFNGLLIGHTXPROC __glewLightx; +GLEW_FUN_EXPORT PFNGLLIGHTXVPROC __glewLightxv; +GLEW_FUN_EXPORT PFNGLLINEWIDTHXPROC __glewLineWidthx; +GLEW_FUN_EXPORT PFNGLLOADMATRIXXPROC __glewLoadMatrixx; +GLEW_FUN_EXPORT PFNGLMATERIALXPROC __glewMaterialx; +GLEW_FUN_EXPORT PFNGLMATERIALXVPROC __glewMaterialxv; +GLEW_FUN_EXPORT PFNGLMULTMATRIXXPROC __glewMultMatrixx; +GLEW_FUN_EXPORT PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x; +GLEW_FUN_EXPORT PFNGLNORMAL3XPROC __glewNormal3x; +GLEW_FUN_EXPORT PFNGLORTHOFPROC __glewOrthof; +GLEW_FUN_EXPORT PFNGLORTHOXPROC __glewOrthox; +GLEW_FUN_EXPORT PFNGLPOINTSIZEXPROC __glewPointSizex; +GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx; +GLEW_FUN_EXPORT PFNGLROTATEXPROC __glewRotatex; +GLEW_FUN_EXPORT PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex; +GLEW_FUN_EXPORT PFNGLSCALEXPROC __glewScalex; +GLEW_FUN_EXPORT PFNGLTEXENVXPROC __glewTexEnvx; +GLEW_FUN_EXPORT PFNGLTEXENVXVPROC __glewTexEnvxv; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERXPROC __glewTexParameterx; +GLEW_FUN_EXPORT PFNGLTRANSLATEXPROC __glewTranslatex; + +GLEW_FUN_EXPORT PFNGLCLIPPLANEFPROC __glewClipPlanef; +GLEW_FUN_EXPORT PFNGLCLIPPLANEXPROC __glewClipPlanex; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef; +GLEW_FUN_EXPORT PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex; +GLEW_FUN_EXPORT PFNGLGETFIXEDVPROC __glewGetFixedv; +GLEW_FUN_EXPORT PFNGLGETLIGHTXVPROC __glewGetLightxv; +GLEW_FUN_EXPORT PFNGLGETMATERIALXVPROC __glewGetMaterialxv; +GLEW_FUN_EXPORT PFNGLGETTEXENVXVPROC __glewGetTexEnvxv; +GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXPROC __glewPointParameterx; +GLEW_FUN_EXPORT PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv; +GLEW_FUN_EXPORT PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES; +GLEW_FUN_EXPORT PFNGLTEXPARAMETERXVPROC __glewTexParameterxv; + +GLEW_FUN_EXPORT PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL; + +GLEW_FUN_EXPORT PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL; +GLEW_FUN_EXPORT PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL; + +GLEW_FUN_EXPORT PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL; + +GLEW_FUN_EXPORT PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL; + +GLEW_FUN_EXPORT PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS; +GLEW_FUN_EXPORT PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS; + +GLEW_FUN_EXPORT PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS; +GLEW_FUN_EXPORT PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS; + +GLEW_FUN_EXPORT PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS; +GLEW_FUN_EXPORT PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS; + +GLEW_FUN_EXPORT PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS; +GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS; + +GLEW_FUN_EXPORT PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS; +GLEW_FUN_EXPORT PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS; + +GLEW_FUN_EXPORT PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX; +GLEW_FUN_EXPORT PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX; +GLEW_FUN_EXPORT PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX; +GLEW_FUN_EXPORT PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX; + +GLEW_FUN_EXPORT PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX; + +GLEW_FUN_EXPORT PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX; + +GLEW_FUN_EXPORT PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX; +GLEW_FUN_EXPORT PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX; +GLEW_FUN_EXPORT PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX; + +GLEW_FUN_EXPORT PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX; + +GLEW_FUN_EXPORT PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX; + +GLEW_FUN_EXPORT PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX; + +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX; +GLEW_FUN_EXPORT PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX; + +GLEW_FUN_EXPORT PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX; + +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLCOLORTABLESGIPROC __glewColorTableSGI; +GLEW_FUN_EXPORT PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI; +GLEW_FUN_EXPORT PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI; + +GLEW_FUN_EXPORT PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX; + +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN; +GLEW_FUN_EXPORT PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN; + +GLEW_FUN_EXPORT PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN; + +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN; + +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN; +GLEW_FUN_EXPORT PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN; +GLEW_FUN_EXPORT PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN; + +GLEW_FUN_EXPORT PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN; + +#if defined(GLEW_MX) && !defined(_WIN32) +struct GLEWContextStruct +{ +#endif /* GLEW_MX */ + +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_2; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_3; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_4; +GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_5; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer; +GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_blend_minmax_factor; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gcn_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_gpu_shader_int64; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_interleaved_elements; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_occlusion_query_event; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_pinned_memory; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_query_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sample_positions; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_atomic_counter_ops; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_value_export; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_trinary_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_sparse_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_stencil_operation_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback4; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_layer; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator; +GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_viewport_index; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_pack_reverse_row_order; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_program_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt1; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt3; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_compression_dxt5; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_texture_usage; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ANGLE_translated_shader_source; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators; +GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_1_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_2_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES3_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_arrays_of_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_base_instance; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_bindless_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_buffer_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clear_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_clip_control; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compressed_texture_pixel_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compute_variable_group_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conditional_render_inverted; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_conservative_depth; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cull_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_debug_output; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_derivative_control; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_direct_state_access; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_enhanced_layouts; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_uniform_location; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_layer_viewport; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader_interlock; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_no_attachments; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_program_binary; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_texture_sub_image; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_int64; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_indirect_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_instanced_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_internalformat_query2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_invalidate_subdata; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_alignment; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_map_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_bind; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_parallel_shader_compile; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pipeline_statistics_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_post_depth_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_program_interface_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_query_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robust_buffer_access_behavior; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_application_isolation; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness_share_group_isolation; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_locations; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cubemap_per_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counter_ops; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_atomic_counters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_ballot; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_clock; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_draw_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_group_vote; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_load_store; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_image_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_precision; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_stencil_export; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_storage_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_image_samples; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_viewport_layer_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_420pack; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_packing; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sparse_texture_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_stencil_texturing; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_barrier; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object_rgb32; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_range; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_bptc; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_filter_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_levels; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_stencil8; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_storage_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_view; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback2; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback3; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback_overflow_query; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_64bit; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_binding; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_route; +GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_vertex_shader_output_point_size; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_draw_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_text_fragment_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_compression_3dc; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_env_combine3; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_float; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_texture_mirror_once; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_attrib_array_object; +GLEW_VAR_EXPORT GLboolean __GLEW_ATI_vertex_streams; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_422_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_Cg_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_abgr; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_bindable_uniform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_equation_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_func_separate; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_logic_op; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_blend_subtract; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_clip_volume_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cmyka; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_color_subtable; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_compiled_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_convolution; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_coordinate_frame; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_copy_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_label; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_debug_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_depth_bounds_test; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_direct_state_access; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_buffers2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_instanced; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_draw_range_elements; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fog_coord; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_fragment_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_blit; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_framebuffer_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_program_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_gpu_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_array_formats; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_func; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_material; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_index_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_light_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_misc_attribute; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multi_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_float; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_packed_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_paletted_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_post_depth_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_raster_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_formatted; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_integer_mix; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_sparse_texture2; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_two_side; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_wrap; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_subtexture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture3D; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_dxt1; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_latc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_rgtc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_compression_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_cube_map; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_add; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_combine; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_env_dot3; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_anisotropic; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_filter_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_integer; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_mirror_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_decode; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_attrib_64bit; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting; +GLEW_VAR_EXPORT GLboolean __GLEW_EXT_x11_sync_object; +GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator; +GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_string_marker; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_image_transform; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_occlusion_test; +GLEW_VAR_EXPORT GLboolean __GLEW_HP_texture_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_cull_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_multimode_draw_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_rasterpos_clip; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_static_data; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_texture_mirrored_repeat; +GLEW_VAR_EXPORT GLboolean __GLEW_IBM_vertex_array_lists; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_color_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_INGR_interlace_read; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_fragment_shader_ordering; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_framebuffer_CMAA; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_map_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_parallel_arrays; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_performance_query; +GLEW_VAR_EXPORT GLboolean __GLEW_INTEL_texture_scissor; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_blend_equation_advanced_coherent; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_context_flush_control; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_debug; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_no_error; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robust_buffer_access_behavior; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_robustness; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_hdr; +GLEW_VAR_EXPORT GLboolean __GLEW_KHR_texture_compression_astc_ldr; +GLEW_VAR_EXPORT GLboolean __GLEW_KTX_buffer_region; +GLEW_VAR_EXPORT GLboolean __GLEW_MESAX_texture_stack; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos; +GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_conditional_render; +GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_multi_draw_indirect_count; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_bindless_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_equation_advanced_coherent; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_compute_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_conservative_raster_dilate; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_deep_texture3D; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_draw_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_evaluators; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_explicit_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fence; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fill_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_float_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fog_distance; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_coverage_to_color; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_program_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_fragment_shader_interlock; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_mixed_samples; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader_passthrough; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5_mem_extended; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_internalformat_sample_query; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_path_rendering_shared_edge; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_locations; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_sample_mask_override_coverage; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_counters; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_float; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_fp16_vector; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_atomic_int64; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_storage_buffer_object; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_group; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_thread_shuffle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_rectangle; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_uniform_buffer_unified_memory; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_attrib_integer_64bit; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2_option; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program3; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program4; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_video_capture; +GLEW_VAR_EXPORT GLboolean __GLEW_NV_viewport_array2; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_byte_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_compressed_paletted_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_read_format; +GLEW_VAR_EXPORT GLboolean __GLEW_OES_single_precision; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_OML_subsample; +GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview; +GLEW_VAR_EXPORT GLboolean __GLEW_OVR_multiview2; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_misc_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_PGI_vertex_hints; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_0_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_ES1_1_compatibility; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_enable; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_error_string; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_extension_query; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_log; +GLEW_VAR_EXPORT GLboolean __GLEW_REGAL_proc_address; +GLEW_VAR_EXPORT GLboolean __GLEW_REND_screen_coordinates; +GLEW_VAR_EXPORT GLboolean __GLEW_S3_s3tc; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_color_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_detail_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_fog_function; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_generate_mipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_multisample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_point_line_texgen; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_sharpen_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture4D; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_border_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_edge_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_filter4; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_lod; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIS_texture_select; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_histogram; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_async_pixel; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_blend_alpha_minmax; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_clipmap; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_convolution_accuracy; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_depth_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_flush_raster; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_offset; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fog_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_fragment_specular_lighting; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_framezoom; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_interlace; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ir_instrument1; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_list_priority; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_pixel_texture_bits; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_reference_plane; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_resample; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_shadow_ambient; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_sprite; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_tag_sample_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_add_env; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_coordinate_clamp; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_lod_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_multi_buffer; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_range; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_texture_scale_bias; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_vertex_preclip_hint; +GLEW_VAR_EXPORT GLboolean __GLEW_SGIX_ycrcb; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_matrix; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SGI_texture_color_table; +GLEW_VAR_EXPORT GLboolean __GLEW_SUNX_constant_data; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_convolution_border_modes; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_global_alpha; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_mesh_array; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_read_video_pixels; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_slice_accum; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_triangle_list; +GLEW_VAR_EXPORT GLboolean __GLEW_SUN_vertex; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_phong_shading; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_specular_fog; +GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint; + +#ifdef GLEW_MX +}; /* GLEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------- */ + +/* error codes */ +#define GLEW_OK 0 +#define GLEW_NO_ERROR 0 +#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */ +#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* Need at least OpenGL 1.1 */ +#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* Need at least GLX 1.2 */ + +/* string codes */ +#define GLEW_VERSION 1 +#define GLEW_VERSION_MAJOR 2 +#define GLEW_VERSION_MINOR 3 +#define GLEW_VERSION_MICRO 4 + +/* ------------------------------------------------------------------------- */ + +/* GLEW version info */ + +/* +VERSION 1.13.0 +VERSION_MAJOR 1 +VERSION_MINOR 13 +VERSION_MICRO 0 +*/ + +/* API */ +#ifdef GLEW_MX + +typedef struct GLEWContextStruct GLEWContext; +GLEWAPI GLenum GLEWAPIENTRY glewContextInit (GLEWContext *ctx); +GLEWAPI GLboolean GLEWAPIENTRY glewContextIsSupported (const GLEWContext *ctx, const char *name); + +#define glewInit() glewContextInit(glewGetContext()) +#define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x) +#define glewIsExtensionSupported(x) glewIsSupported(x) + +#define GLEW_GET_VAR(x) (*(const GLboolean*)&(glewGetContext()->x)) +#ifdef _WIN32 +# define GLEW_GET_FUN(x) glewGetContext()->x +#else +# define GLEW_GET_FUN(x) x +#endif + +#else /* GLEW_MX */ + +GLEWAPI GLenum GLEWAPIENTRY glewInit (void); +GLEWAPI GLboolean GLEWAPIENTRY glewIsSupported (const char *name); +#define glewIsExtensionSupported(x) glewIsSupported(x) + +#define GLEW_GET_VAR(x) (*(const GLboolean*)&x) +#define GLEW_GET_FUN(x) x + +#endif /* GLEW_MX */ + +GLEWAPI GLboolean glewExperimental; +GLEWAPI GLboolean GLEWAPIENTRY glewGetExtension (const char *name); +GLEWAPI const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error); +GLEWAPI const GLubyte * GLEWAPIENTRY glewGetString (GLenum name); + +#ifdef __cplusplus +} +#endif + +#ifdef GLEW_APIENTRY_DEFINED +#undef GLEW_APIENTRY_DEFINED +#undef APIENTRY +#endif + +#ifdef GLEW_CALLBACK_DEFINED +#undef GLEW_CALLBACK_DEFINED +#undef CALLBACK +#endif + +#ifdef GLEW_WINGDIAPI_DEFINED +#undef GLEW_WINGDIAPI_DEFINED +#undef WINGDIAPI +#endif + +#undef GLAPI +/* #undef GLEWAPI */ + +#endif /* __glew_h__ */ diff --git a/deps/GLEW/glew/include/GL/glxew.h b/deps/GLEW/glew/include/GL/glxew.h new file mode 100644 index 0000000000..d803d260b3 --- /dev/null +++ b/deps/GLEW/glew/include/GL/glxew.h @@ -0,0 +1,1772 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2015, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * 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. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 OWNER OR 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. +*/ + +/* + * Mesa 3-D graphics library + * Version: 7.0 + * + * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. + * + * 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 + * BRIAN PAUL 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. + */ + +/* +** Copyright (c) 2007 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are 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 Materials. +** +** THE MATERIALS ARE 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 +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#ifndef __glxew_h__ +#define __glxew_h__ +#define __GLXEW_H__ + +#ifdef __glxext_h_ +#error glxext.h included before glxew.h +#endif + +#if defined(GLX_H) || defined(__GLX_glx_h__) || defined(__glx_h__) +#error glx.h included before glxew.h +#endif + +#define __glxext_h_ + +#define GLX_H +#define __GLX_glx_h__ +#define __glx_h__ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* ---------------------------- GLX_VERSION_1_0 --------------------------- */ + +#ifndef GLX_VERSION_1_0 +#define GLX_VERSION_1_0 1 + +#define GLX_USE_GL 1 +#define GLX_BUFFER_SIZE 2 +#define GLX_LEVEL 3 +#define GLX_RGBA 4 +#define GLX_DOUBLEBUFFER 5 +#define GLX_STEREO 6 +#define GLX_AUX_BUFFERS 7 +#define GLX_RED_SIZE 8 +#define GLX_GREEN_SIZE 9 +#define GLX_BLUE_SIZE 10 +#define GLX_ALPHA_SIZE 11 +#define GLX_DEPTH_SIZE 12 +#define GLX_STENCIL_SIZE 13 +#define GLX_ACCUM_RED_SIZE 14 +#define GLX_ACCUM_GREEN_SIZE 15 +#define GLX_ACCUM_BLUE_SIZE 16 +#define GLX_ACCUM_ALPHA_SIZE 17 +#define GLX_BAD_SCREEN 1 +#define GLX_BAD_ATTRIBUTE 2 +#define GLX_NO_EXTENSION 3 +#define GLX_BAD_VISUAL 4 +#define GLX_BAD_CONTEXT 5 +#define GLX_BAD_VALUE 6 +#define GLX_BAD_ENUM 7 + +typedef XID GLXDrawable; +typedef XID GLXPixmap; +#ifdef __sun +typedef struct __glXContextRec *GLXContext; +#else +typedef struct __GLXcontextRec *GLXContext; +#endif + +typedef unsigned int GLXVideoDeviceNV; + +extern Bool glXQueryExtension (Display *dpy, int *errorBase, int *eventBase); +extern Bool glXQueryVersion (Display *dpy, int *major, int *minor); +extern int glXGetConfig (Display *dpy, XVisualInfo *vis, int attrib, int *value); +extern XVisualInfo* glXChooseVisual (Display *dpy, int screen, int *attribList); +extern GLXPixmap glXCreateGLXPixmap (Display *dpy, XVisualInfo *vis, Pixmap pixmap); +extern void glXDestroyGLXPixmap (Display *dpy, GLXPixmap pix); +extern GLXContext glXCreateContext (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); +extern void glXDestroyContext (Display *dpy, GLXContext ctx); +extern Bool glXIsDirect (Display *dpy, GLXContext ctx); +extern void glXCopyContext (Display *dpy, GLXContext src, GLXContext dst, GLulong mask); +extern Bool glXMakeCurrent (Display *dpy, GLXDrawable drawable, GLXContext ctx); +extern GLXContext glXGetCurrentContext (void); +extern GLXDrawable glXGetCurrentDrawable (void); +extern void glXWaitGL (void); +extern void glXWaitX (void); +extern void glXSwapBuffers (Display *dpy, GLXDrawable drawable); +extern void glXUseXFont (Font font, int first, int count, int listBase); + +#define GLXEW_VERSION_1_0 GLXEW_GET_VAR(__GLXEW_VERSION_1_0) + +#endif /* GLX_VERSION_1_0 */ + +/* ---------------------------- GLX_VERSION_1_1 --------------------------- */ + +#ifndef GLX_VERSION_1_1 +#define GLX_VERSION_1_1 + +#define GLX_VENDOR 0x1 +#define GLX_VERSION 0x2 +#define GLX_EXTENSIONS 0x3 + +extern const char* glXQueryExtensionsString (Display *dpy, int screen); +extern const char* glXGetClientString (Display *dpy, int name); +extern const char* glXQueryServerString (Display *dpy, int screen, int name); + +#define GLXEW_VERSION_1_1 GLXEW_GET_VAR(__GLXEW_VERSION_1_1) + +#endif /* GLX_VERSION_1_1 */ + +/* ---------------------------- GLX_VERSION_1_2 ---------------------------- */ + +#ifndef GLX_VERSION_1_2 +#define GLX_VERSION_1_2 1 + +typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void); + +#define glXGetCurrentDisplay GLXEW_GET_FUN(__glewXGetCurrentDisplay) + +#define GLXEW_VERSION_1_2 GLXEW_GET_VAR(__GLXEW_VERSION_1_2) + +#endif /* GLX_VERSION_1_2 */ + +/* ---------------------------- GLX_VERSION_1_3 ---------------------------- */ + +#ifndef GLX_VERSION_1_3 +#define GLX_VERSION_1_3 1 + +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_RGBA_BIT 0x00000001 +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_CONFIG_CAVEAT 0x20 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_NONE 0x8000 +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_TRUE_COLOR 0x8002 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_STATIC_GRAY 0x8007 +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 +#define GLX_VISUAL_ID 0x800B +#define GLX_SCREEN 0x800C +#define GLX_NON_CONFORMANT_CONFIG 0x800D +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_PBUFFER_HEIGHT 0x8040 +#define GLX_PBUFFER_WIDTH 0x8041 +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_DONT_CARE 0xFFFFFFFF + +typedef XID GLXFBConfigID; +typedef XID GLXPbuffer; +typedef XID GLXWindow; +typedef struct __GLXFBConfigRec *GLXFBConfig; + +typedef struct { + int event_type; + int draw_type; + unsigned long serial; + Bool send_event; + Display *display; + GLXDrawable drawable; + unsigned int buffer_mask; + unsigned int aux_buffer; + int x, y; + int width, height; + int count; +} GLXPbufferClobberEvent; +typedef union __GLXEvent { + GLXPbufferClobberEvent glxpbufferclobber; + long pad[24]; +} GLXEvent; + +typedef GLXFBConfig* ( * PFNGLXCHOOSEFBCONFIGPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef GLXContext ( * PFNGLXCREATENEWCONTEXTPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef GLXPbuffer ( * PFNGLXCREATEPBUFFERPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); +typedef GLXPixmap ( * PFNGLXCREATEPIXMAPPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); +typedef GLXWindow ( * PFNGLXCREATEWINDOWPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); +typedef void ( * PFNGLXDESTROYPBUFFERPROC) (Display *dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXDESTROYPIXMAPPROC) (Display *dpy, GLXPixmap pixmap); +typedef void ( * PFNGLXDESTROYWINDOWPROC) (Display *dpy, GLXWindow win); +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLEPROC) (void); +typedef int ( * PFNGLXGETFBCONFIGATTRIBPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); +typedef GLXFBConfig* ( * PFNGLXGETFBCONFIGSPROC) (Display *dpy, int screen, int *nelements); +typedef void ( * PFNGLXGETSELECTEDEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); +typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGPROC) (Display *dpy, GLXFBConfig config); +typedef Bool ( * PFNGLXMAKECONTEXTCURRENTPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef int ( * PFNGLXQUERYCONTEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); +typedef void ( * PFNGLXQUERYDRAWABLEPROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); + +#define glXChooseFBConfig GLXEW_GET_FUN(__glewXChooseFBConfig) +#define glXCreateNewContext GLXEW_GET_FUN(__glewXCreateNewContext) +#define glXCreatePbuffer GLXEW_GET_FUN(__glewXCreatePbuffer) +#define glXCreatePixmap GLXEW_GET_FUN(__glewXCreatePixmap) +#define glXCreateWindow GLXEW_GET_FUN(__glewXCreateWindow) +#define glXDestroyPbuffer GLXEW_GET_FUN(__glewXDestroyPbuffer) +#define glXDestroyPixmap GLXEW_GET_FUN(__glewXDestroyPixmap) +#define glXDestroyWindow GLXEW_GET_FUN(__glewXDestroyWindow) +#define glXGetCurrentReadDrawable GLXEW_GET_FUN(__glewXGetCurrentReadDrawable) +#define glXGetFBConfigAttrib GLXEW_GET_FUN(__glewXGetFBConfigAttrib) +#define glXGetFBConfigs GLXEW_GET_FUN(__glewXGetFBConfigs) +#define glXGetSelectedEvent GLXEW_GET_FUN(__glewXGetSelectedEvent) +#define glXGetVisualFromFBConfig GLXEW_GET_FUN(__glewXGetVisualFromFBConfig) +#define glXMakeContextCurrent GLXEW_GET_FUN(__glewXMakeContextCurrent) +#define glXQueryContext GLXEW_GET_FUN(__glewXQueryContext) +#define glXQueryDrawable GLXEW_GET_FUN(__glewXQueryDrawable) +#define glXSelectEvent GLXEW_GET_FUN(__glewXSelectEvent) + +#define GLXEW_VERSION_1_3 GLXEW_GET_VAR(__GLXEW_VERSION_1_3) + +#endif /* GLX_VERSION_1_3 */ + +/* ---------------------------- GLX_VERSION_1_4 ---------------------------- */ + +#ifndef GLX_VERSION_1_4 +#define GLX_VERSION_1_4 1 + +#define GLX_SAMPLE_BUFFERS 100000 +#define GLX_SAMPLES 100001 + +extern void ( * glXGetProcAddress (const GLubyte *procName)) (void); + +#define GLXEW_VERSION_1_4 GLXEW_GET_VAR(__GLXEW_VERSION_1_4) + +#endif /* GLX_VERSION_1_4 */ + +/* -------------------------- GLX_3DFX_multisample ------------------------- */ + +#ifndef GLX_3DFX_multisample +#define GLX_3DFX_multisample 1 + +#define GLX_SAMPLE_BUFFERS_3DFX 0x8050 +#define GLX_SAMPLES_3DFX 0x8051 + +#define GLXEW_3DFX_multisample GLXEW_GET_VAR(__GLXEW_3DFX_multisample) + +#endif /* GLX_3DFX_multisample */ + +/* ------------------------ GLX_AMD_gpu_association ------------------------ */ + +#ifndef GLX_AMD_gpu_association +#define GLX_AMD_gpu_association 1 + +#define GLX_GPU_VENDOR_AMD 0x1F00 +#define GLX_GPU_RENDERER_STRING_AMD 0x1F01 +#define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 +#define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 +#define GLX_GPU_RAM_AMD 0x21A3 +#define GLX_GPU_CLOCK_AMD 0x21A4 +#define GLX_GPU_NUM_PIPES_AMD 0x21A5 +#define GLX_GPU_NUM_SIMD_AMD 0x21A6 +#define GLX_GPU_NUM_RB_AMD 0x21A7 +#define GLX_GPU_NUM_SPI_AMD 0x21A8 + +typedef void ( * PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC) (GLXContext dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC) (unsigned int id, GLXContext share_list); +typedef GLXContext ( * PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (unsigned int id, GLXContext share_context, const int* attribList); +typedef Bool ( * PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC) (GLXContext ctx); +typedef unsigned int ( * PFNGLXGETCONTEXTGPUIDAMDPROC) (GLXContext ctx); +typedef GLXContext ( * PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); +typedef unsigned int ( * PFNGLXGETGPUIDSAMDPROC) (unsigned int maxCount, unsigned int* ids); +typedef int ( * PFNGLXGETGPUINFOAMDPROC) (unsigned int id, int property, GLenum dataType, unsigned int size, void* data); +typedef Bool ( * PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (GLXContext ctx); + +#define glXBlitContextFramebufferAMD GLXEW_GET_FUN(__glewXBlitContextFramebufferAMD) +#define glXCreateAssociatedContextAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAMD) +#define glXCreateAssociatedContextAttribsAMD GLXEW_GET_FUN(__glewXCreateAssociatedContextAttribsAMD) +#define glXDeleteAssociatedContextAMD GLXEW_GET_FUN(__glewXDeleteAssociatedContextAMD) +#define glXGetContextGPUIDAMD GLXEW_GET_FUN(__glewXGetContextGPUIDAMD) +#define glXGetCurrentAssociatedContextAMD GLXEW_GET_FUN(__glewXGetCurrentAssociatedContextAMD) +#define glXGetGPUIDsAMD GLXEW_GET_FUN(__glewXGetGPUIDsAMD) +#define glXGetGPUInfoAMD GLXEW_GET_FUN(__glewXGetGPUInfoAMD) +#define glXMakeAssociatedContextCurrentAMD GLXEW_GET_FUN(__glewXMakeAssociatedContextCurrentAMD) + +#define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association) + +#endif /* GLX_AMD_gpu_association */ + +/* --------------------- GLX_ARB_context_flush_control --------------------- */ + +#ifndef GLX_ARB_context_flush_control +#define GLX_ARB_context_flush_control 1 + +#define GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0x0000 +#define GLX_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097 +#define GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098 + +#define GLXEW_ARB_context_flush_control GLXEW_GET_VAR(__GLXEW_ARB_context_flush_control) + +#endif /* GLX_ARB_context_flush_control */ + +/* ------------------------- GLX_ARB_create_context ------------------------ */ + +#ifndef GLX_ARB_create_context +#define GLX_ARB_create_context 1 + +#define GLX_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 +#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define GLX_CONTEXT_FLAGS_ARB 0x2094 + +typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list); + +#define glXCreateContextAttribsARB GLXEW_GET_FUN(__glewXCreateContextAttribsARB) + +#define GLXEW_ARB_create_context GLXEW_GET_VAR(__GLXEW_ARB_create_context) + +#endif /* GLX_ARB_create_context */ + +/* --------------------- GLX_ARB_create_context_profile -------------------- */ + +#ifndef GLX_ARB_create_context_profile +#define GLX_ARB_create_context_profile 1 + +#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 +#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 + +#define GLXEW_ARB_create_context_profile GLXEW_GET_VAR(__GLXEW_ARB_create_context_profile) + +#endif /* GLX_ARB_create_context_profile */ + +/* ------------------- GLX_ARB_create_context_robustness ------------------- */ + +#ifndef GLX_ARB_create_context_robustness +#define GLX_ARB_create_context_robustness 1 + +#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261 + +#define GLXEW_ARB_create_context_robustness GLXEW_GET_VAR(__GLXEW_ARB_create_context_robustness) + +#endif /* GLX_ARB_create_context_robustness */ + +/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */ + +#ifndef GLX_ARB_fbconfig_float +#define GLX_ARB_fbconfig_float 1 + +#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004 +#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9 + +#define GLXEW_ARB_fbconfig_float GLXEW_GET_VAR(__GLXEW_ARB_fbconfig_float) + +#endif /* GLX_ARB_fbconfig_float */ + +/* ------------------------ GLX_ARB_framebuffer_sRGB ----------------------- */ + +#ifndef GLX_ARB_framebuffer_sRGB +#define GLX_ARB_framebuffer_sRGB 1 + +#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2 + +#define GLXEW_ARB_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_ARB_framebuffer_sRGB) + +#endif /* GLX_ARB_framebuffer_sRGB */ + +/* ------------------------ GLX_ARB_get_proc_address ----------------------- */ + +#ifndef GLX_ARB_get_proc_address +#define GLX_ARB_get_proc_address 1 + +extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void); + +#define GLXEW_ARB_get_proc_address GLXEW_GET_VAR(__GLXEW_ARB_get_proc_address) + +#endif /* GLX_ARB_get_proc_address */ + +/* -------------------------- GLX_ARB_multisample -------------------------- */ + +#ifndef GLX_ARB_multisample +#define GLX_ARB_multisample 1 + +#define GLX_SAMPLE_BUFFERS_ARB 100000 +#define GLX_SAMPLES_ARB 100001 + +#define GLXEW_ARB_multisample GLXEW_GET_VAR(__GLXEW_ARB_multisample) + +#endif /* GLX_ARB_multisample */ + +/* ---------------- GLX_ARB_robustness_application_isolation --------------- */ + +#ifndef GLX_ARB_robustness_application_isolation +#define GLX_ARB_robustness_application_isolation 1 + +#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define GLXEW_ARB_robustness_application_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_application_isolation) + +#endif /* GLX_ARB_robustness_application_isolation */ + +/* ---------------- GLX_ARB_robustness_share_group_isolation --------------- */ + +#ifndef GLX_ARB_robustness_share_group_isolation +#define GLX_ARB_robustness_share_group_isolation 1 + +#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define GLXEW_ARB_robustness_share_group_isolation GLXEW_GET_VAR(__GLXEW_ARB_robustness_share_group_isolation) + +#endif /* GLX_ARB_robustness_share_group_isolation */ + +/* ---------------------- GLX_ARB_vertex_buffer_object --------------------- */ + +#ifndef GLX_ARB_vertex_buffer_object +#define GLX_ARB_vertex_buffer_object 1 + +#define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095 + +#define GLXEW_ARB_vertex_buffer_object GLXEW_GET_VAR(__GLXEW_ARB_vertex_buffer_object) + +#endif /* GLX_ARB_vertex_buffer_object */ + +/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */ + +#ifndef GLX_ATI_pixel_format_float +#define GLX_ATI_pixel_format_float 1 + +#define GLX_RGBA_FLOAT_ATI_BIT 0x00000100 + +#define GLXEW_ATI_pixel_format_float GLXEW_GET_VAR(__GLXEW_ATI_pixel_format_float) + +#endif /* GLX_ATI_pixel_format_float */ + +/* ------------------------- GLX_ATI_render_texture ------------------------ */ + +#ifndef GLX_ATI_render_texture +#define GLX_ATI_render_texture 1 + +#define GLX_BIND_TO_TEXTURE_RGB_ATI 0x9800 +#define GLX_BIND_TO_TEXTURE_RGBA_ATI 0x9801 +#define GLX_TEXTURE_FORMAT_ATI 0x9802 +#define GLX_TEXTURE_TARGET_ATI 0x9803 +#define GLX_MIPMAP_TEXTURE_ATI 0x9804 +#define GLX_TEXTURE_RGB_ATI 0x9805 +#define GLX_TEXTURE_RGBA_ATI 0x9806 +#define GLX_NO_TEXTURE_ATI 0x9807 +#define GLX_TEXTURE_CUBE_MAP_ATI 0x9808 +#define GLX_TEXTURE_1D_ATI 0x9809 +#define GLX_TEXTURE_2D_ATI 0x980A +#define GLX_MIPMAP_LEVEL_ATI 0x980B +#define GLX_CUBE_MAP_FACE_ATI 0x980C +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_X_ATI 0x980D +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_X_ATI 0x980E +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Y_ATI 0x980F +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Y_ATI 0x9810 +#define GLX_TEXTURE_CUBE_MAP_POSITIVE_Z_ATI 0x9811 +#define GLX_TEXTURE_CUBE_MAP_NEGATIVE_Z_ATI 0x9812 +#define GLX_FRONT_LEFT_ATI 0x9813 +#define GLX_FRONT_RIGHT_ATI 0x9814 +#define GLX_BACK_LEFT_ATI 0x9815 +#define GLX_BACK_RIGHT_ATI 0x9816 +#define GLX_AUX0_ATI 0x9817 +#define GLX_AUX1_ATI 0x9818 +#define GLX_AUX2_ATI 0x9819 +#define GLX_AUX3_ATI 0x981A +#define GLX_AUX4_ATI 0x981B +#define GLX_AUX5_ATI 0x981C +#define GLX_AUX6_ATI 0x981D +#define GLX_AUX7_ATI 0x981E +#define GLX_AUX8_ATI 0x981F +#define GLX_AUX9_ATI 0x9820 +#define GLX_BIND_TO_TEXTURE_LUMINANCE_ATI 0x9821 +#define GLX_BIND_TO_TEXTURE_INTENSITY_ATI 0x9822 + +typedef void ( * PFNGLXBINDTEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); +typedef void ( * PFNGLXDRAWABLEATTRIBATIPROC) (Display *dpy, GLXDrawable draw, const int *attrib_list); +typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, int buffer); + +#define glXBindTexImageATI GLXEW_GET_FUN(__glewXBindTexImageATI) +#define glXDrawableAttribATI GLXEW_GET_FUN(__glewXDrawableAttribATI) +#define glXReleaseTexImageATI GLXEW_GET_FUN(__glewXReleaseTexImageATI) + +#define GLXEW_ATI_render_texture GLXEW_GET_VAR(__GLXEW_ATI_render_texture) + +#endif /* GLX_ATI_render_texture */ + +/* --------------------------- GLX_EXT_buffer_age -------------------------- */ + +#ifndef GLX_EXT_buffer_age +#define GLX_EXT_buffer_age 1 + +#define GLX_BACK_BUFFER_AGE_EXT 0x20F4 + +#define GLXEW_EXT_buffer_age GLXEW_GET_VAR(__GLXEW_EXT_buffer_age) + +#endif /* GLX_EXT_buffer_age */ + +/* ------------------- GLX_EXT_create_context_es2_profile ------------------ */ + +#ifndef GLX_EXT_create_context_es2_profile +#define GLX_EXT_create_context_es2_profile 1 + +#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 + +#define GLXEW_EXT_create_context_es2_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es2_profile) + +#endif /* GLX_EXT_create_context_es2_profile */ + +/* ------------------- GLX_EXT_create_context_es_profile ------------------- */ + +#ifndef GLX_EXT_create_context_es_profile +#define GLX_EXT_create_context_es_profile 1 + +#define GLX_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 + +#define GLXEW_EXT_create_context_es_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es_profile) + +#endif /* GLX_EXT_create_context_es_profile */ + +/* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */ + +#ifndef GLX_EXT_fbconfig_packed_float +#define GLX_EXT_fbconfig_packed_float 1 + +#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008 +#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1 + +#define GLXEW_EXT_fbconfig_packed_float GLXEW_GET_VAR(__GLXEW_EXT_fbconfig_packed_float) + +#endif /* GLX_EXT_fbconfig_packed_float */ + +/* ------------------------ GLX_EXT_framebuffer_sRGB ----------------------- */ + +#ifndef GLX_EXT_framebuffer_sRGB +#define GLX_EXT_framebuffer_sRGB 1 + +#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2 + +#define GLXEW_EXT_framebuffer_sRGB GLXEW_GET_VAR(__GLXEW_EXT_framebuffer_sRGB) + +#endif /* GLX_EXT_framebuffer_sRGB */ + +/* ------------------------- GLX_EXT_import_context ------------------------ */ + +#ifndef GLX_EXT_import_context +#define GLX_EXT_import_context 1 + +#define GLX_SHARE_CONTEXT_EXT 0x800A +#define GLX_VISUAL_ID_EXT 0x800B +#define GLX_SCREEN_EXT 0x800C + +typedef XID GLXContextID; + +typedef void ( * PFNGLXFREECONTEXTEXTPROC) (Display* dpy, GLXContext context); +typedef GLXContextID ( * PFNGLXGETCONTEXTIDEXTPROC) (const GLXContext context); +typedef GLXContext ( * PFNGLXIMPORTCONTEXTEXTPROC) (Display* dpy, GLXContextID contextID); +typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context, int attribute,int *value); + +#define glXFreeContextEXT GLXEW_GET_FUN(__glewXFreeContextEXT) +#define glXGetContextIDEXT GLXEW_GET_FUN(__glewXGetContextIDEXT) +#define glXImportContextEXT GLXEW_GET_FUN(__glewXImportContextEXT) +#define glXQueryContextInfoEXT GLXEW_GET_FUN(__glewXQueryContextInfoEXT) + +#define GLXEW_EXT_import_context GLXEW_GET_VAR(__GLXEW_EXT_import_context) + +#endif /* GLX_EXT_import_context */ + +/* -------------------------- GLX_EXT_scene_marker ------------------------- */ + +#ifndef GLX_EXT_scene_marker +#define GLX_EXT_scene_marker 1 + +#define GLXEW_EXT_scene_marker GLXEW_GET_VAR(__GLXEW_EXT_scene_marker) + +#endif /* GLX_EXT_scene_marker */ + +/* -------------------------- GLX_EXT_stereo_tree -------------------------- */ + +#ifndef GLX_EXT_stereo_tree +#define GLX_EXT_stereo_tree 1 + +#define GLX_STEREO_NOTIFY_EXT 0x00000000 +#define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001 +#define GLX_STEREO_TREE_EXT 0x20F5 + +#define GLXEW_EXT_stereo_tree GLXEW_GET_VAR(__GLXEW_EXT_stereo_tree) + +#endif /* GLX_EXT_stereo_tree */ + +/* -------------------------- GLX_EXT_swap_control ------------------------- */ + +#ifndef GLX_EXT_swap_control +#define GLX_EXT_swap_control 1 + +#define GLX_SWAP_INTERVAL_EXT 0x20F1 +#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2 + +typedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval); + +#define glXSwapIntervalEXT GLXEW_GET_FUN(__glewXSwapIntervalEXT) + +#define GLXEW_EXT_swap_control GLXEW_GET_VAR(__GLXEW_EXT_swap_control) + +#endif /* GLX_EXT_swap_control */ + +/* ----------------------- GLX_EXT_swap_control_tear ----------------------- */ + +#ifndef GLX_EXT_swap_control_tear +#define GLX_EXT_swap_control_tear 1 + +#define GLX_LATE_SWAPS_TEAR_EXT 0x20F3 + +#define GLXEW_EXT_swap_control_tear GLXEW_GET_VAR(__GLXEW_EXT_swap_control_tear) + +#endif /* GLX_EXT_swap_control_tear */ + +/* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */ + +#ifndef GLX_EXT_texture_from_pixmap +#define GLX_EXT_texture_from_pixmap 1 + +#define GLX_TEXTURE_1D_BIT_EXT 0x00000001 +#define GLX_TEXTURE_2D_BIT_EXT 0x00000002 +#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 +#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0 +#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1 +#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2 +#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3 +#define GLX_Y_INVERTED_EXT 0x20D4 +#define GLX_TEXTURE_FORMAT_EXT 0x20D5 +#define GLX_TEXTURE_TARGET_EXT 0x20D6 +#define GLX_MIPMAP_TEXTURE_EXT 0x20D7 +#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 +#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 +#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA +#define GLX_TEXTURE_1D_EXT 0x20DB +#define GLX_TEXTURE_2D_EXT 0x20DC +#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD +#define GLX_FRONT_LEFT_EXT 0x20DE +#define GLX_FRONT_RIGHT_EXT 0x20DF +#define GLX_BACK_LEFT_EXT 0x20E0 +#define GLX_BACK_RIGHT_EXT 0x20E1 +#define GLX_AUX0_EXT 0x20E2 +#define GLX_AUX1_EXT 0x20E3 +#define GLX_AUX2_EXT 0x20E4 +#define GLX_AUX3_EXT 0x20E5 +#define GLX_AUX4_EXT 0x20E6 +#define GLX_AUX5_EXT 0x20E7 +#define GLX_AUX6_EXT 0x20E8 +#define GLX_AUX7_EXT 0x20E9 +#define GLX_AUX8_EXT 0x20EA +#define GLX_AUX9_EXT 0x20EB + +typedef void ( * PFNGLXBINDTEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer, const int *attrib_list); +typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* display, GLXDrawable drawable, int buffer); + +#define glXBindTexImageEXT GLXEW_GET_FUN(__glewXBindTexImageEXT) +#define glXReleaseTexImageEXT GLXEW_GET_FUN(__glewXReleaseTexImageEXT) + +#define GLXEW_EXT_texture_from_pixmap GLXEW_GET_VAR(__GLXEW_EXT_texture_from_pixmap) + +#endif /* GLX_EXT_texture_from_pixmap */ + +/* -------------------------- GLX_EXT_visual_info -------------------------- */ + +#ifndef GLX_EXT_visual_info +#define GLX_EXT_visual_info 1 + +#define GLX_X_VISUAL_TYPE_EXT 0x22 +#define GLX_TRANSPARENT_TYPE_EXT 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 +#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 +#define GLX_NONE_EXT 0x8000 +#define GLX_TRUE_COLOR_EXT 0x8002 +#define GLX_DIRECT_COLOR_EXT 0x8003 +#define GLX_PSEUDO_COLOR_EXT 0x8004 +#define GLX_STATIC_COLOR_EXT 0x8005 +#define GLX_GRAY_SCALE_EXT 0x8006 +#define GLX_STATIC_GRAY_EXT 0x8007 +#define GLX_TRANSPARENT_RGB_EXT 0x8008 +#define GLX_TRANSPARENT_INDEX_EXT 0x8009 + +#define GLXEW_EXT_visual_info GLXEW_GET_VAR(__GLXEW_EXT_visual_info) + +#endif /* GLX_EXT_visual_info */ + +/* ------------------------- GLX_EXT_visual_rating ------------------------- */ + +#ifndef GLX_EXT_visual_rating +#define GLX_EXT_visual_rating 1 + +#define GLX_VISUAL_CAVEAT_EXT 0x20 +#define GLX_SLOW_VISUAL_EXT 0x8001 +#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D + +#define GLXEW_EXT_visual_rating GLXEW_GET_VAR(__GLXEW_EXT_visual_rating) + +#endif /* GLX_EXT_visual_rating */ + +/* -------------------------- GLX_INTEL_swap_event ------------------------- */ + +#ifndef GLX_INTEL_swap_event +#define GLX_INTEL_swap_event 1 + +#define GLX_EXCHANGE_COMPLETE_INTEL 0x8180 +#define GLX_COPY_COMPLETE_INTEL 0x8181 +#define GLX_FLIP_COMPLETE_INTEL 0x8182 +#define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000 + +#define GLXEW_INTEL_swap_event GLXEW_GET_VAR(__GLXEW_INTEL_swap_event) + +#endif /* GLX_INTEL_swap_event */ + +/* -------------------------- GLX_MESA_agp_offset -------------------------- */ + +#ifndef GLX_MESA_agp_offset +#define GLX_MESA_agp_offset 1 + +typedef unsigned int ( * PFNGLXGETAGPOFFSETMESAPROC) (const void* pointer); + +#define glXGetAGPOffsetMESA GLXEW_GET_FUN(__glewXGetAGPOffsetMESA) + +#define GLXEW_MESA_agp_offset GLXEW_GET_VAR(__GLXEW_MESA_agp_offset) + +#endif /* GLX_MESA_agp_offset */ + +/* ------------------------ GLX_MESA_copy_sub_buffer ----------------------- */ + +#ifndef GLX_MESA_copy_sub_buffer +#define GLX_MESA_copy_sub_buffer 1 + +typedef void ( * PFNGLXCOPYSUBBUFFERMESAPROC) (Display* dpy, GLXDrawable drawable, int x, int y, int width, int height); + +#define glXCopySubBufferMESA GLXEW_GET_FUN(__glewXCopySubBufferMESA) + +#define GLXEW_MESA_copy_sub_buffer GLXEW_GET_VAR(__GLXEW_MESA_copy_sub_buffer) + +#endif /* GLX_MESA_copy_sub_buffer */ + +/* ------------------------ GLX_MESA_pixmap_colormap ----------------------- */ + +#ifndef GLX_MESA_pixmap_colormap +#define GLX_MESA_pixmap_colormap 1 + +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPMESAPROC) (Display* dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap); + +#define glXCreateGLXPixmapMESA GLXEW_GET_FUN(__glewXCreateGLXPixmapMESA) + +#define GLXEW_MESA_pixmap_colormap GLXEW_GET_VAR(__GLXEW_MESA_pixmap_colormap) + +#endif /* GLX_MESA_pixmap_colormap */ + +/* ------------------------ GLX_MESA_query_renderer ------------------------ */ + +#ifndef GLX_MESA_query_renderer +#define GLX_MESA_query_renderer 1 + +#define GLX_RENDERER_VENDOR_ID_MESA 0x8183 +#define GLX_RENDERER_DEVICE_ID_MESA 0x8184 +#define GLX_RENDERER_VERSION_MESA 0x8185 +#define GLX_RENDERER_ACCELERATED_MESA 0x8186 +#define GLX_RENDERER_VIDEO_MEMORY_MESA 0x8187 +#define GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA 0x8188 +#define GLX_RENDERER_PREFERRED_PROFILE_MESA 0x8189 +#define GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA 0x818A +#define GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA 0x818B +#define GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA 0x818C +#define GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA 0x818D +#define GLX_RENDERER_ID_MESA 0x818E + +typedef Bool ( * PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC) (int attribute, unsigned int* value); +typedef const char* ( * PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC) (int attribute); +typedef Bool ( * PFNGLXQUERYRENDERERINTEGERMESAPROC) (Display* dpy, int screen, int renderer, int attribute, unsigned int *value); +typedef const char* ( * PFNGLXQUERYRENDERERSTRINGMESAPROC) (Display *dpy, int screen, int renderer, int attribute); + +#define glXQueryCurrentRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererIntegerMESA) +#define glXQueryCurrentRendererStringMESA GLXEW_GET_FUN(__glewXQueryCurrentRendererStringMESA) +#define glXQueryRendererIntegerMESA GLXEW_GET_FUN(__glewXQueryRendererIntegerMESA) +#define glXQueryRendererStringMESA GLXEW_GET_FUN(__glewXQueryRendererStringMESA) + +#define GLXEW_MESA_query_renderer GLXEW_GET_VAR(__GLXEW_MESA_query_renderer) + +#endif /* GLX_MESA_query_renderer */ + +/* ------------------------ GLX_MESA_release_buffers ----------------------- */ + +#ifndef GLX_MESA_release_buffers +#define GLX_MESA_release_buffers 1 + +typedef Bool ( * PFNGLXRELEASEBUFFERSMESAPROC) (Display* dpy, GLXDrawable d); + +#define glXReleaseBuffersMESA GLXEW_GET_FUN(__glewXReleaseBuffersMESA) + +#define GLXEW_MESA_release_buffers GLXEW_GET_VAR(__GLXEW_MESA_release_buffers) + +#endif /* GLX_MESA_release_buffers */ + +/* ------------------------- GLX_MESA_set_3dfx_mode ------------------------ */ + +#ifndef GLX_MESA_set_3dfx_mode +#define GLX_MESA_set_3dfx_mode 1 + +#define GLX_3DFX_WINDOW_MODE_MESA 0x1 +#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2 + +typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode); + +#define glXSet3DfxModeMESA GLXEW_GET_FUN(__glewXSet3DfxModeMESA) + +#define GLXEW_MESA_set_3dfx_mode GLXEW_GET_VAR(__GLXEW_MESA_set_3dfx_mode) + +#endif /* GLX_MESA_set_3dfx_mode */ + +/* ------------------------- GLX_MESA_swap_control ------------------------- */ + +#ifndef GLX_MESA_swap_control +#define GLX_MESA_swap_control 1 + +typedef int ( * PFNGLXGETSWAPINTERVALMESAPROC) (void); +typedef int ( * PFNGLXSWAPINTERVALMESAPROC) (unsigned int interval); + +#define glXGetSwapIntervalMESA GLXEW_GET_FUN(__glewXGetSwapIntervalMESA) +#define glXSwapIntervalMESA GLXEW_GET_FUN(__glewXSwapIntervalMESA) + +#define GLXEW_MESA_swap_control GLXEW_GET_VAR(__GLXEW_MESA_swap_control) + +#endif /* GLX_MESA_swap_control */ + +/* --------------------------- GLX_NV_copy_buffer -------------------------- */ + +#ifndef GLX_NV_copy_buffer +#define GLX_NV_copy_buffer 1 + +typedef void ( * PFNGLXCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void ( * PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC) (Display* dpy, GLXContext readCtx, GLXContext writeCtx, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); + +#define glXCopyBufferSubDataNV GLXEW_GET_FUN(__glewXCopyBufferSubDataNV) +#define glXNamedCopyBufferSubDataNV GLXEW_GET_FUN(__glewXNamedCopyBufferSubDataNV) + +#define GLXEW_NV_copy_buffer GLXEW_GET_VAR(__GLXEW_NV_copy_buffer) + +#endif /* GLX_NV_copy_buffer */ + +/* --------------------------- GLX_NV_copy_image --------------------------- */ + +#ifndef GLX_NV_copy_image +#define GLX_NV_copy_image 1 + +typedef void ( * PFNGLXCOPYIMAGESUBDATANVPROC) (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); + +#define glXCopyImageSubDataNV GLXEW_GET_FUN(__glewXCopyImageSubDataNV) + +#define GLXEW_NV_copy_image GLXEW_GET_VAR(__GLXEW_NV_copy_image) + +#endif /* GLX_NV_copy_image */ + +/* ------------------------ GLX_NV_delay_before_swap ----------------------- */ + +#ifndef GLX_NV_delay_before_swap +#define GLX_NV_delay_before_swap 1 + +typedef Bool ( * PFNGLXDELAYBEFORESWAPNVPROC) (Display* dpy, GLXDrawable drawable, GLfloat seconds); + +#define glXDelayBeforeSwapNV GLXEW_GET_FUN(__glewXDelayBeforeSwapNV) + +#define GLXEW_NV_delay_before_swap GLXEW_GET_VAR(__GLXEW_NV_delay_before_swap) + +#endif /* GLX_NV_delay_before_swap */ + +/* -------------------------- GLX_NV_float_buffer -------------------------- */ + +#ifndef GLX_NV_float_buffer +#define GLX_NV_float_buffer 1 + +#define GLX_FLOAT_COMPONENTS_NV 0x20B0 + +#define GLXEW_NV_float_buffer GLXEW_GET_VAR(__GLXEW_NV_float_buffer) + +#endif /* GLX_NV_float_buffer */ + +/* ---------------------- GLX_NV_multisample_coverage ---------------------- */ + +#ifndef GLX_NV_multisample_coverage +#define GLX_NV_multisample_coverage 1 + +#define GLX_COLOR_SAMPLES_NV 0x20B3 +#define GLX_COVERAGE_SAMPLES_NV 100001 + +#define GLXEW_NV_multisample_coverage GLXEW_GET_VAR(__GLXEW_NV_multisample_coverage) + +#endif /* GLX_NV_multisample_coverage */ + +/* -------------------------- GLX_NV_present_video ------------------------- */ + +#ifndef GLX_NV_present_video +#define GLX_NV_present_video 1 + +#define GLX_NUM_VIDEO_SLOTS_NV 0x20F0 + +typedef int ( * PFNGLXBINDVIDEODEVICENVPROC) (Display* dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list); +typedef unsigned int* ( * PFNGLXENUMERATEVIDEODEVICESNVPROC) (Display *dpy, int screen, int *nelements); + +#define glXBindVideoDeviceNV GLXEW_GET_FUN(__glewXBindVideoDeviceNV) +#define glXEnumerateVideoDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoDevicesNV) + +#define GLXEW_NV_present_video GLXEW_GET_VAR(__GLXEW_NV_present_video) + +#endif /* GLX_NV_present_video */ + +/* --------------------------- GLX_NV_swap_group --------------------------- */ + +#ifndef GLX_NV_swap_group +#define GLX_NV_swap_group 1 + +typedef Bool ( * PFNGLXBINDSWAPBARRIERNVPROC) (Display* dpy, GLuint group, GLuint barrier); +typedef Bool ( * PFNGLXJOINSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint group); +typedef Bool ( * PFNGLXQUERYFRAMECOUNTNVPROC) (Display* dpy, int screen, GLuint *count); +typedef Bool ( * PFNGLXQUERYMAXSWAPGROUPSNVPROC) (Display* dpy, int screen, GLuint *maxGroups, GLuint *maxBarriers); +typedef Bool ( * PFNGLXQUERYSWAPGROUPNVPROC) (Display* dpy, GLXDrawable drawable, GLuint *group, GLuint *barrier); +typedef Bool ( * PFNGLXRESETFRAMECOUNTNVPROC) (Display* dpy, int screen); + +#define glXBindSwapBarrierNV GLXEW_GET_FUN(__glewXBindSwapBarrierNV) +#define glXJoinSwapGroupNV GLXEW_GET_FUN(__glewXJoinSwapGroupNV) +#define glXQueryFrameCountNV GLXEW_GET_FUN(__glewXQueryFrameCountNV) +#define glXQueryMaxSwapGroupsNV GLXEW_GET_FUN(__glewXQueryMaxSwapGroupsNV) +#define glXQuerySwapGroupNV GLXEW_GET_FUN(__glewXQuerySwapGroupNV) +#define glXResetFrameCountNV GLXEW_GET_FUN(__glewXResetFrameCountNV) + +#define GLXEW_NV_swap_group GLXEW_GET_VAR(__GLXEW_NV_swap_group) + +#endif /* GLX_NV_swap_group */ + +/* ----------------------- GLX_NV_vertex_array_range ----------------------- */ + +#ifndef GLX_NV_vertex_array_range +#define GLX_NV_vertex_array_range 1 + +typedef void * ( * PFNGLXALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); +typedef void ( * PFNGLXFREEMEMORYNVPROC) (void *pointer); + +#define glXAllocateMemoryNV GLXEW_GET_FUN(__glewXAllocateMemoryNV) +#define glXFreeMemoryNV GLXEW_GET_FUN(__glewXFreeMemoryNV) + +#define GLXEW_NV_vertex_array_range GLXEW_GET_VAR(__GLXEW_NV_vertex_array_range) + +#endif /* GLX_NV_vertex_array_range */ + +/* -------------------------- GLX_NV_video_capture ------------------------- */ + +#ifndef GLX_NV_video_capture +#define GLX_NV_video_capture 1 + +#define GLX_DEVICE_ID_NV 0x20CD +#define GLX_UNIQUE_ID_NV 0x20CE +#define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF + +typedef XID GLXVideoCaptureDeviceNV; + +typedef int ( * PFNGLXBINDVIDEOCAPTUREDEVICENVPROC) (Display* dpy, unsigned int video_capture_slot, GLXVideoCaptureDeviceNV device); +typedef GLXVideoCaptureDeviceNV * ( * PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC) (Display* dpy, int screen, int *nelements); +typedef void ( * PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); +typedef int ( * PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device, int attribute, int *value); +typedef void ( * PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC) (Display* dpy, GLXVideoCaptureDeviceNV device); + +#define glXBindVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXBindVideoCaptureDeviceNV) +#define glXEnumerateVideoCaptureDevicesNV GLXEW_GET_FUN(__glewXEnumerateVideoCaptureDevicesNV) +#define glXLockVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXLockVideoCaptureDeviceNV) +#define glXQueryVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXQueryVideoCaptureDeviceNV) +#define glXReleaseVideoCaptureDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoCaptureDeviceNV) + +#define GLXEW_NV_video_capture GLXEW_GET_VAR(__GLXEW_NV_video_capture) + +#endif /* GLX_NV_video_capture */ + +/* ---------------------------- GLX_NV_video_out --------------------------- */ + +#ifndef GLX_NV_video_out +#define GLX_NV_video_out 1 + +#define GLX_VIDEO_OUT_COLOR_NV 0x20C3 +#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4 +#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5 +#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 +#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 +#define GLX_VIDEO_OUT_FRAME_NV 0x20C8 +#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9 +#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA +#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB +#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC + +typedef int ( * PFNGLXBINDVIDEOIMAGENVPROC) (Display* dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer); +typedef int ( * PFNGLXGETVIDEODEVICENVPROC) (Display* dpy, int screen, int numVideoDevices, GLXVideoDeviceNV *pVideoDevice); +typedef int ( * PFNGLXGETVIDEOINFONVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); +typedef int ( * PFNGLXRELEASEVIDEODEVICENVPROC) (Display* dpy, int screen, GLXVideoDeviceNV VideoDevice); +typedef int ( * PFNGLXRELEASEVIDEOIMAGENVPROC) (Display* dpy, GLXPbuffer pbuf); +typedef int ( * PFNGLXSENDPBUFFERTOVIDEONVPROC) (Display* dpy, GLXPbuffer pbuf, int iBufferType, unsigned long *pulCounterPbuffer, GLboolean bBlock); + +#define glXBindVideoImageNV GLXEW_GET_FUN(__glewXBindVideoImageNV) +#define glXGetVideoDeviceNV GLXEW_GET_FUN(__glewXGetVideoDeviceNV) +#define glXGetVideoInfoNV GLXEW_GET_FUN(__glewXGetVideoInfoNV) +#define glXReleaseVideoDeviceNV GLXEW_GET_FUN(__glewXReleaseVideoDeviceNV) +#define glXReleaseVideoImageNV GLXEW_GET_FUN(__glewXReleaseVideoImageNV) +#define glXSendPbufferToVideoNV GLXEW_GET_FUN(__glewXSendPbufferToVideoNV) + +#define GLXEW_NV_video_out GLXEW_GET_VAR(__GLXEW_NV_video_out) + +#endif /* GLX_NV_video_out */ + +/* -------------------------- GLX_OML_swap_method -------------------------- */ + +#ifndef GLX_OML_swap_method +#define GLX_OML_swap_method 1 + +#define GLX_SWAP_METHOD_OML 0x8060 +#define GLX_SWAP_EXCHANGE_OML 0x8061 +#define GLX_SWAP_COPY_OML 0x8062 +#define GLX_SWAP_UNDEFINED_OML 0x8063 + +#define GLXEW_OML_swap_method GLXEW_GET_VAR(__GLXEW_OML_swap_method) + +#endif /* GLX_OML_swap_method */ + +/* -------------------------- GLX_OML_sync_control ------------------------- */ + +#ifndef GLX_OML_sync_control +#define GLX_OML_sync_control 1 + +typedef Bool ( * PFNGLXGETMSCRATEOMLPROC) (Display* dpy, GLXDrawable drawable, int32_t* numerator, int32_t* denominator); +typedef Bool ( * PFNGLXGETSYNCVALUESOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t* ust, int64_t* msc, int64_t* sbc); +typedef int64_t ( * PFNGLXSWAPBUFFERSMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder); +typedef Bool ( * PFNGLXWAITFORMSCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t* ust, int64_t* msc, int64_t* sbc); +typedef Bool ( * PFNGLXWAITFORSBCOMLPROC) (Display* dpy, GLXDrawable drawable, int64_t target_sbc, int64_t* ust, int64_t* msc, int64_t* sbc); + +#define glXGetMscRateOML GLXEW_GET_FUN(__glewXGetMscRateOML) +#define glXGetSyncValuesOML GLXEW_GET_FUN(__glewXGetSyncValuesOML) +#define glXSwapBuffersMscOML GLXEW_GET_FUN(__glewXSwapBuffersMscOML) +#define glXWaitForMscOML GLXEW_GET_FUN(__glewXWaitForMscOML) +#define glXWaitForSbcOML GLXEW_GET_FUN(__glewXWaitForSbcOML) + +#define GLXEW_OML_sync_control GLXEW_GET_VAR(__GLXEW_OML_sync_control) + +#endif /* GLX_OML_sync_control */ + +/* ------------------------ GLX_SGIS_blended_overlay ----------------------- */ + +#ifndef GLX_SGIS_blended_overlay +#define GLX_SGIS_blended_overlay 1 + +#define GLX_BLENDED_RGBA_SGIS 0x8025 + +#define GLXEW_SGIS_blended_overlay GLXEW_GET_VAR(__GLXEW_SGIS_blended_overlay) + +#endif /* GLX_SGIS_blended_overlay */ + +/* -------------------------- GLX_SGIS_color_range ------------------------- */ + +#ifndef GLX_SGIS_color_range +#define GLX_SGIS_color_range 1 + +#define GLXEW_SGIS_color_range GLXEW_GET_VAR(__GLXEW_SGIS_color_range) + +#endif /* GLX_SGIS_color_range */ + +/* -------------------------- GLX_SGIS_multisample ------------------------- */ + +#ifndef GLX_SGIS_multisample +#define GLX_SGIS_multisample 1 + +#define GLX_SAMPLE_BUFFERS_SGIS 100000 +#define GLX_SAMPLES_SGIS 100001 + +#define GLXEW_SGIS_multisample GLXEW_GET_VAR(__GLXEW_SGIS_multisample) + +#endif /* GLX_SGIS_multisample */ + +/* ---------------------- GLX_SGIS_shared_multisample ---------------------- */ + +#ifndef GLX_SGIS_shared_multisample +#define GLX_SGIS_shared_multisample 1 + +#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026 +#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027 + +#define GLXEW_SGIS_shared_multisample GLXEW_GET_VAR(__GLXEW_SGIS_shared_multisample) + +#endif /* GLX_SGIS_shared_multisample */ + +/* --------------------------- GLX_SGIX_fbconfig --------------------------- */ + +#ifndef GLX_SGIX_fbconfig +#define GLX_SGIX_fbconfig 1 + +#define GLX_RGBA_BIT_SGIX 0x00000001 +#define GLX_WINDOW_BIT_SGIX 0x00000001 +#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002 +#define GLX_PIXMAP_BIT_SGIX 0x00000002 +#define GLX_SCREEN_EXT 0x800C +#define GLX_DRAWABLE_TYPE_SGIX 0x8010 +#define GLX_RENDER_TYPE_SGIX 0x8011 +#define GLX_X_RENDERABLE_SGIX 0x8012 +#define GLX_FBCONFIG_ID_SGIX 0x8013 +#define GLX_RGBA_TYPE_SGIX 0x8014 +#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015 + +typedef XID GLXFBConfigIDSGIX; +typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; + +typedef GLXFBConfigSGIX* ( * PFNGLXCHOOSEFBCONFIGSGIXPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef GLXContext ( * PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef GLXPixmap ( * PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC) (Display* dpy, GLXFBConfig config, Pixmap pixmap); +typedef int ( * PFNGLXGETFBCONFIGATTRIBSGIXPROC) (Display* dpy, GLXFBConfigSGIX config, int attribute, int *value); +typedef GLXFBConfigSGIX ( * PFNGLXGETFBCONFIGFROMVISUALSGIXPROC) (Display* dpy, XVisualInfo *vis); +typedef XVisualInfo* ( * PFNGLXGETVISUALFROMFBCONFIGSGIXPROC) (Display *dpy, GLXFBConfig config); + +#define glXChooseFBConfigSGIX GLXEW_GET_FUN(__glewXChooseFBConfigSGIX) +#define glXCreateContextWithConfigSGIX GLXEW_GET_FUN(__glewXCreateContextWithConfigSGIX) +#define glXCreateGLXPixmapWithConfigSGIX GLXEW_GET_FUN(__glewXCreateGLXPixmapWithConfigSGIX) +#define glXGetFBConfigAttribSGIX GLXEW_GET_FUN(__glewXGetFBConfigAttribSGIX) +#define glXGetFBConfigFromVisualSGIX GLXEW_GET_FUN(__glewXGetFBConfigFromVisualSGIX) +#define glXGetVisualFromFBConfigSGIX GLXEW_GET_FUN(__glewXGetVisualFromFBConfigSGIX) + +#define GLXEW_SGIX_fbconfig GLXEW_GET_VAR(__GLXEW_SGIX_fbconfig) + +#endif /* GLX_SGIX_fbconfig */ + +/* --------------------------- GLX_SGIX_hyperpipe -------------------------- */ + +#ifndef GLX_SGIX_hyperpipe +#define GLX_SGIX_hyperpipe 1 + +#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001 +#define GLX_PIPE_RECT_SGIX 0x00000001 +#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002 +#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002 +#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003 +#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004 +#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80 +#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91 +#define GLX_BAD_HYPERPIPE_SGIX 92 +#define GLX_HYPERPIPE_ID_SGIX 0x8030 + +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int networkId; +} GLXHyperpipeNetworkSGIX; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int XOrigin; + int YOrigin; + int maxHeight; + int maxWidth; +} GLXPipeRectLimits; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int channel; + unsigned int participationType; + int timeSlice; +} GLXHyperpipeConfigSGIX; +typedef struct { + char pipeName[GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX]; + int srcXOrigin; + int srcYOrigin; + int srcWidth; + int srcHeight; + int destXOrigin; + int destYOrigin; + int destWidth; + int destHeight; +} GLXPipeRect; + +typedef int ( * PFNGLXBINDHYPERPIPESGIXPROC) (Display *dpy, int hpId); +typedef int ( * PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId); +typedef int ( * PFNGLXHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList); +typedef int ( * PFNGLXHYPERPIPECONFIGSGIXPROC) (Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId); +typedef int ( * PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList); +typedef int ( * PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC) (Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList); +typedef GLXHyperpipeConfigSGIX * ( * PFNGLXQUERYHYPERPIPECONFIGSGIXPROC) (Display *dpy, int hpId, int *npipes); +typedef GLXHyperpipeNetworkSGIX * ( * PFNGLXQUERYHYPERPIPENETWORKSGIXPROC) (Display *dpy, int *npipes); + +#define glXBindHyperpipeSGIX GLXEW_GET_FUN(__glewXBindHyperpipeSGIX) +#define glXDestroyHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXDestroyHyperpipeConfigSGIX) +#define glXHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXHyperpipeAttribSGIX) +#define glXHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXHyperpipeConfigSGIX) +#define glXQueryHyperpipeAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeAttribSGIX) +#define glXQueryHyperpipeBestAttribSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeBestAttribSGIX) +#define glXQueryHyperpipeConfigSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeConfigSGIX) +#define glXQueryHyperpipeNetworkSGIX GLXEW_GET_FUN(__glewXQueryHyperpipeNetworkSGIX) + +#define GLXEW_SGIX_hyperpipe GLXEW_GET_VAR(__GLXEW_SGIX_hyperpipe) + +#endif /* GLX_SGIX_hyperpipe */ + +/* ---------------------------- GLX_SGIX_pbuffer --------------------------- */ + +#ifndef GLX_SGIX_pbuffer +#define GLX_SGIX_pbuffer 1 + +#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004 +#define GLX_PBUFFER_BIT_SGIX 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008 +#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010 +#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020 +#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040 +#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080 +#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100 +#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017 +#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018 +#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 +#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A +#define GLX_PRESERVED_CONTENTS_SGIX 0x801B +#define GLX_LARGEST_PBUFFER_SGIX 0x801C +#define GLX_WIDTH_SGIX 0x801D +#define GLX_HEIGHT_SGIX 0x801E +#define GLX_EVENT_MASK_SGIX 0x801F +#define GLX_DAMAGED_SGIX 0x8020 +#define GLX_SAVED_SGIX 0x8021 +#define GLX_WINDOW_SGIX 0x8022 +#define GLX_PBUFFER_SGIX 0x8023 +#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000 + +typedef XID GLXPbufferSGIX; +typedef struct { int type; unsigned long serial; Bool send_event; Display *display; GLXDrawable drawable; int event_type; int draw_type; unsigned int mask; int x, y; int width, height; int count; } GLXBufferClobberEventSGIX; + +typedef GLXPbuffer ( * PFNGLXCREATEGLXPBUFFERSGIXPROC) (Display* dpy, GLXFBConfig config, unsigned int width, unsigned int height, int *attrib_list); +typedef void ( * PFNGLXDESTROYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf); +typedef void ( * PFNGLXGETSELECTEDEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long *mask); +typedef void ( * PFNGLXQUERYGLXPBUFFERSGIXPROC) (Display* dpy, GLXPbuffer pbuf, int attribute, unsigned int *value); +typedef void ( * PFNGLXSELECTEVENTSGIXPROC) (Display* dpy, GLXDrawable drawable, unsigned long mask); + +#define glXCreateGLXPbufferSGIX GLXEW_GET_FUN(__glewXCreateGLXPbufferSGIX) +#define glXDestroyGLXPbufferSGIX GLXEW_GET_FUN(__glewXDestroyGLXPbufferSGIX) +#define glXGetSelectedEventSGIX GLXEW_GET_FUN(__glewXGetSelectedEventSGIX) +#define glXQueryGLXPbufferSGIX GLXEW_GET_FUN(__glewXQueryGLXPbufferSGIX) +#define glXSelectEventSGIX GLXEW_GET_FUN(__glewXSelectEventSGIX) + +#define GLXEW_SGIX_pbuffer GLXEW_GET_VAR(__GLXEW_SGIX_pbuffer) + +#endif /* GLX_SGIX_pbuffer */ + +/* ------------------------- GLX_SGIX_swap_barrier ------------------------- */ + +#ifndef GLX_SGIX_swap_barrier +#define GLX_SGIX_swap_barrier 1 + +typedef void ( * PFNGLXBINDSWAPBARRIERSGIXPROC) (Display *dpy, GLXDrawable drawable, int barrier); +typedef Bool ( * PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC) (Display *dpy, int screen, int *max); + +#define glXBindSwapBarrierSGIX GLXEW_GET_FUN(__glewXBindSwapBarrierSGIX) +#define glXQueryMaxSwapBarriersSGIX GLXEW_GET_FUN(__glewXQueryMaxSwapBarriersSGIX) + +#define GLXEW_SGIX_swap_barrier GLXEW_GET_VAR(__GLXEW_SGIX_swap_barrier) + +#endif /* GLX_SGIX_swap_barrier */ + +/* -------------------------- GLX_SGIX_swap_group -------------------------- */ + +#ifndef GLX_SGIX_swap_group +#define GLX_SGIX_swap_group 1 + +typedef void ( * PFNGLXJOINSWAPGROUPSGIXPROC) (Display *dpy, GLXDrawable drawable, GLXDrawable member); + +#define glXJoinSwapGroupSGIX GLXEW_GET_FUN(__glewXJoinSwapGroupSGIX) + +#define GLXEW_SGIX_swap_group GLXEW_GET_VAR(__GLXEW_SGIX_swap_group) + +#endif /* GLX_SGIX_swap_group */ + +/* ------------------------- GLX_SGIX_video_resize ------------------------- */ + +#ifndef GLX_SGIX_video_resize +#define GLX_SGIX_video_resize 1 + +#define GLX_SYNC_FRAME_SGIX 0x00000000 +#define GLX_SYNC_SWAP_SGIX 0x00000001 + +typedef int ( * PFNGLXBINDCHANNELTOWINDOWSGIXPROC) (Display* display, int screen, int channel, Window window); +typedef int ( * PFNGLXCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int x, int y, int w, int h); +typedef int ( * PFNGLXCHANNELRECTSYNCSGIXPROC) (Display* display, int screen, int channel, GLenum synctype); +typedef int ( * PFNGLXQUERYCHANNELDELTASSGIXPROC) (Display* display, int screen, int channel, int *x, int *y, int *w, int *h); +typedef int ( * PFNGLXQUERYCHANNELRECTSGIXPROC) (Display* display, int screen, int channel, int *dx, int *dy, int *dw, int *dh); + +#define glXBindChannelToWindowSGIX GLXEW_GET_FUN(__glewXBindChannelToWindowSGIX) +#define glXChannelRectSGIX GLXEW_GET_FUN(__glewXChannelRectSGIX) +#define glXChannelRectSyncSGIX GLXEW_GET_FUN(__glewXChannelRectSyncSGIX) +#define glXQueryChannelDeltasSGIX GLXEW_GET_FUN(__glewXQueryChannelDeltasSGIX) +#define glXQueryChannelRectSGIX GLXEW_GET_FUN(__glewXQueryChannelRectSGIX) + +#define GLXEW_SGIX_video_resize GLXEW_GET_VAR(__GLXEW_SGIX_video_resize) + +#endif /* GLX_SGIX_video_resize */ + +/* ---------------------- GLX_SGIX_visual_select_group --------------------- */ + +#ifndef GLX_SGIX_visual_select_group +#define GLX_SGIX_visual_select_group 1 + +#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028 + +#define GLXEW_SGIX_visual_select_group GLXEW_GET_VAR(__GLXEW_SGIX_visual_select_group) + +#endif /* GLX_SGIX_visual_select_group */ + +/* ---------------------------- GLX_SGI_cushion ---------------------------- */ + +#ifndef GLX_SGI_cushion +#define GLX_SGI_cushion 1 + +typedef void ( * PFNGLXCUSHIONSGIPROC) (Display* dpy, Window window, float cushion); + +#define glXCushionSGI GLXEW_GET_FUN(__glewXCushionSGI) + +#define GLXEW_SGI_cushion GLXEW_GET_VAR(__GLXEW_SGI_cushion) + +#endif /* GLX_SGI_cushion */ + +/* ----------------------- GLX_SGI_make_current_read ----------------------- */ + +#ifndef GLX_SGI_make_current_read +#define GLX_SGI_make_current_read 1 + +typedef GLXDrawable ( * PFNGLXGETCURRENTREADDRAWABLESGIPROC) (void); +typedef Bool ( * PFNGLXMAKECURRENTREADSGIPROC) (Display* dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); + +#define glXGetCurrentReadDrawableSGI GLXEW_GET_FUN(__glewXGetCurrentReadDrawableSGI) +#define glXMakeCurrentReadSGI GLXEW_GET_FUN(__glewXMakeCurrentReadSGI) + +#define GLXEW_SGI_make_current_read GLXEW_GET_VAR(__GLXEW_SGI_make_current_read) + +#endif /* GLX_SGI_make_current_read */ + +/* -------------------------- GLX_SGI_swap_control ------------------------- */ + +#ifndef GLX_SGI_swap_control +#define GLX_SGI_swap_control 1 + +typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval); + +#define glXSwapIntervalSGI GLXEW_GET_FUN(__glewXSwapIntervalSGI) + +#define GLXEW_SGI_swap_control GLXEW_GET_VAR(__GLXEW_SGI_swap_control) + +#endif /* GLX_SGI_swap_control */ + +/* --------------------------- GLX_SGI_video_sync -------------------------- */ + +#ifndef GLX_SGI_video_sync +#define GLX_SGI_video_sync 1 + +typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int* count); +typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count); + +#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI) +#define glXWaitVideoSyncSGI GLXEW_GET_FUN(__glewXWaitVideoSyncSGI) + +#define GLXEW_SGI_video_sync GLXEW_GET_VAR(__GLXEW_SGI_video_sync) + +#endif /* GLX_SGI_video_sync */ + +/* --------------------- GLX_SUN_get_transparent_index --------------------- */ + +#ifndef GLX_SUN_get_transparent_index +#define GLX_SUN_get_transparent_index 1 + +typedef Status ( * PFNGLXGETTRANSPARENTINDEXSUNPROC) (Display* dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex); + +#define glXGetTransparentIndexSUN GLXEW_GET_FUN(__glewXGetTransparentIndexSUN) + +#define GLXEW_SUN_get_transparent_index GLXEW_GET_VAR(__GLXEW_SUN_get_transparent_index) + +#endif /* GLX_SUN_get_transparent_index */ + +/* -------------------------- GLX_SUN_video_resize ------------------------- */ + +#ifndef GLX_SUN_video_resize +#define GLX_SUN_video_resize 1 + +#define GLX_VIDEO_RESIZE_SUN 0x8171 +#define GL_VIDEO_RESIZE_COMPENSATION_SUN 0x85CD + +typedef int ( * PFNGLXGETVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float* factor); +typedef int ( * PFNGLXVIDEORESIZESUNPROC) (Display* display, GLXDrawable window, float factor); + +#define glXGetVideoResizeSUN GLXEW_GET_FUN(__glewXGetVideoResizeSUN) +#define glXVideoResizeSUN GLXEW_GET_FUN(__glewXVideoResizeSUN) + +#define GLXEW_SUN_video_resize GLXEW_GET_VAR(__GLXEW_SUN_video_resize) + +#endif /* GLX_SUN_video_resize */ + +/* ------------------------------------------------------------------------- */ + +#ifdef GLEW_MX +#define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT +#define GLXEW_VAR_EXPORT +#else +#define GLXEW_FUN_EXPORT GLEW_FUN_EXPORT +#define GLXEW_VAR_EXPORT GLEW_VAR_EXPORT +#endif /* GLEW_MX */ + +GLXEW_FUN_EXPORT PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay; + +GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig; +GLXEW_FUN_EXPORT PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext; +GLXEW_FUN_EXPORT PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer; +GLXEW_FUN_EXPORT PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap; +GLXEW_FUN_EXPORT PFNGLXCREATEWINDOWPROC __glewXCreateWindow; +GLXEW_FUN_EXPORT PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer; +GLXEW_FUN_EXPORT PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap; +GLXEW_FUN_EXPORT PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow; +GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable; +GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib; +GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs; +GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent; +GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig; +GLXEW_FUN_EXPORT PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent; +GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTPROC __glewXQueryContext; +GLXEW_FUN_EXPORT PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable; +GLXEW_FUN_EXPORT PFNGLXSELECTEVENTPROC __glewXSelectEvent; + +GLXEW_FUN_EXPORT PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD; +GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD; +GLXEW_FUN_EXPORT PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD; +GLXEW_FUN_EXPORT PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD; +GLXEW_FUN_EXPORT PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD; +GLXEW_FUN_EXPORT PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD; +GLXEW_FUN_EXPORT PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD; + +GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB; + +GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI; +GLXEW_FUN_EXPORT PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI; +GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI; + +GLXEW_FUN_EXPORT PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT; +GLXEW_FUN_EXPORT PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT; +GLXEW_FUN_EXPORT PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT; +GLXEW_FUN_EXPORT PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT; + +GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT; + +GLXEW_FUN_EXPORT PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT; +GLXEW_FUN_EXPORT PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT; + +GLXEW_FUN_EXPORT PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA; + +GLXEW_FUN_EXPORT PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA; + +GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA; + +GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA; +GLXEW_FUN_EXPORT PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA; +GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA; +GLXEW_FUN_EXPORT PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA; + +GLXEW_FUN_EXPORT PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA; + +GLXEW_FUN_EXPORT PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA; + +GLXEW_FUN_EXPORT PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA; +GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA; + +GLXEW_FUN_EXPORT PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV; +GLXEW_FUN_EXPORT PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV; + +GLXEW_FUN_EXPORT PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV; + +GLXEW_FUN_EXPORT PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV; + +GLXEW_FUN_EXPORT PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV; +GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV; + +GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV; +GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV; +GLXEW_FUN_EXPORT PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV; +GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV; +GLXEW_FUN_EXPORT PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV; +GLXEW_FUN_EXPORT PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV; + +GLXEW_FUN_EXPORT PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV; +GLXEW_FUN_EXPORT PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV; + +GLXEW_FUN_EXPORT PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV; +GLXEW_FUN_EXPORT PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV; +GLXEW_FUN_EXPORT PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV; +GLXEW_FUN_EXPORT PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV; +GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV; + +GLXEW_FUN_EXPORT PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV; +GLXEW_FUN_EXPORT PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV; +GLXEW_FUN_EXPORT PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV; +GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV; +GLXEW_FUN_EXPORT PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV; +GLXEW_FUN_EXPORT PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV; + +GLXEW_FUN_EXPORT PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML; +GLXEW_FUN_EXPORT PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML; +GLXEW_FUN_EXPORT PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML; +GLXEW_FUN_EXPORT PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML; +GLXEW_FUN_EXPORT PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML; + +GLXEW_FUN_EXPORT PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX; +GLXEW_FUN_EXPORT PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX; +GLXEW_FUN_EXPORT PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX; + +GLXEW_FUN_EXPORT PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX; +GLXEW_FUN_EXPORT PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX; +GLXEW_FUN_EXPORT PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX; + +GLXEW_FUN_EXPORT PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX; +GLXEW_FUN_EXPORT PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX; +GLXEW_FUN_EXPORT PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX; +GLXEW_FUN_EXPORT PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX; + +GLXEW_FUN_EXPORT PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX; + +GLXEW_FUN_EXPORT PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX; + +GLXEW_FUN_EXPORT PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX; +GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX; +GLXEW_FUN_EXPORT PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX; +GLXEW_FUN_EXPORT PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX; + +GLXEW_FUN_EXPORT PFNGLXCUSHIONSGIPROC __glewXCushionSGI; + +GLXEW_FUN_EXPORT PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI; +GLXEW_FUN_EXPORT PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI; + +GLXEW_FUN_EXPORT PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI; + +GLXEW_FUN_EXPORT PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI; +GLXEW_FUN_EXPORT PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI; + +GLXEW_FUN_EXPORT PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN; + +GLXEW_FUN_EXPORT PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN; +GLXEW_FUN_EXPORT PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN; + +#if defined(GLEW_MX) +struct GLXEWContextStruct +{ +#endif /* GLEW_MX */ + +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_0; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_1; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_2; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_3; +GLXEW_VAR_EXPORT GLboolean __GLXEW_VERSION_1_4; +GLXEW_VAR_EXPORT GLboolean __GLXEW_3DFX_multisample; +GLXEW_VAR_EXPORT GLboolean __GLXEW_AMD_gpu_association; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_context_flush_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_profile; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_create_context_robustness; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_fbconfig_float; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_get_proc_address; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_multisample; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_application_isolation; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_robustness_share_group_isolation; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_pixel_format_float; +GLXEW_VAR_EXPORT GLboolean __GLXEW_ATI_render_texture; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_buffer_age; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_create_context_es_profile; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_import_context; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_scene_marker; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_stereo_tree; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_swap_control_tear; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_info; +GLXEW_VAR_EXPORT GLboolean __GLXEW_EXT_visual_rating; +GLXEW_VAR_EXPORT GLboolean __GLXEW_INTEL_swap_event; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_agp_offset; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_query_renderer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_release_buffers; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode; +GLXEW_VAR_EXPORT GLboolean __GLXEW_MESA_swap_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_buffer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_copy_image; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_delay_before_swap; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_float_buffer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_multisample_coverage; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_present_video; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_swap_group; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_vertex_array_range; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_capture; +GLXEW_VAR_EXPORT GLboolean __GLXEW_NV_video_out; +GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_swap_method; +GLXEW_VAR_EXPORT GLboolean __GLXEW_OML_sync_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_blended_overlay; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_color_range; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_multisample; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIS_shared_multisample; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_fbconfig; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_hyperpipe; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_pbuffer; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_barrier; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_swap_group; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_video_resize; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGIX_visual_select_group; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_cushion; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_make_current_read; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_swap_control; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SGI_video_sync; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_get_transparent_index; +GLXEW_VAR_EXPORT GLboolean __GLXEW_SUN_video_resize; + +#ifdef GLEW_MX +}; /* GLXEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------ */ + +#ifdef GLEW_MX + +typedef struct GLXEWContextStruct GLXEWContext; +GLEWAPI GLenum GLEWAPIENTRY glxewContextInit (GLXEWContext *ctx); +GLEWAPI GLboolean GLEWAPIENTRY glxewContextIsSupported (const GLXEWContext *ctx, const char *name); + +#define glxewInit() glxewContextInit(glxewGetContext()) +#define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x) + +#define GLXEW_GET_VAR(x) (*(const GLboolean*)&(glxewGetContext()->x)) +#define GLXEW_GET_FUN(x) x + +#else /* GLEW_MX */ + +GLEWAPI GLenum GLEWAPIENTRY glxewInit (); +GLEWAPI GLboolean GLEWAPIENTRY glxewIsSupported (const char *name); + +#define GLXEW_GET_VAR(x) (*(const GLboolean*)&x) +#define GLXEW_GET_FUN(x) x + +#endif /* GLEW_MX */ + +GLEWAPI GLboolean GLEWAPIENTRY glxewGetExtension (const char *name); + +#ifdef __cplusplus +} +#endif + +#endif /* __glxew_h__ */ diff --git a/deps/GLEW/glew/include/GL/wglew.h b/deps/GLEW/glew/include/GL/wglew.h new file mode 100644 index 0000000000..c13c54a5ff --- /dev/null +++ b/deps/GLEW/glew/include/GL/wglew.h @@ -0,0 +1,1456 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2015, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * 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. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 OWNER OR 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. +*/ + +/* +** Copyright (c) 2007 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are 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 Materials. +** +** THE MATERIALS ARE 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 +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +#ifndef __wglew_h__ +#define __wglew_h__ +#define __WGLEW_H__ + +#ifdef __wglext_h_ +#error wglext.h included before wglew.h +#endif + +#define __wglext_h_ + +#if !defined(WINAPI) +# ifndef WIN32_LEAN_AND_MEAN +# define WIN32_LEAN_AND_MEAN 1 +# endif +# ifdef NOGDI +# undef NOGDI +# endif +#include +# undef WIN32_LEAN_AND_MEAN +#endif + +/* + * GLEW_STATIC needs to be set when using the static version. + * GLEW_BUILD is set when building the DLL version. + */ +#ifdef GLEW_STATIC +# define GLEWAPI extern +#else +# ifdef GLEW_BUILD +# define GLEWAPI extern __declspec(dllexport) +# else +# define GLEWAPI extern __declspec(dllimport) +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* -------------------------- WGL_3DFX_multisample ------------------------- */ + +#ifndef WGL_3DFX_multisample +#define WGL_3DFX_multisample 1 + +#define WGL_SAMPLE_BUFFERS_3DFX 0x2060 +#define WGL_SAMPLES_3DFX 0x2061 + +#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) + +#endif /* WGL_3DFX_multisample */ + +/* ------------------------- WGL_3DL_stereo_control ------------------------ */ + +#ifndef WGL_3DL_stereo_control +#define WGL_3DL_stereo_control 1 + +#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 +#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 +#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 +#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 + +typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); + +#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) + +#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) + +#endif /* WGL_3DL_stereo_control */ + +/* ------------------------ WGL_AMD_gpu_association ------------------------ */ + +#ifndef WGL_AMD_gpu_association +#define WGL_AMD_gpu_association 1 + +#define WGL_GPU_VENDOR_AMD 0x1F00 +#define WGL_GPU_RENDERER_STRING_AMD 0x1F01 +#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 +#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 +#define WGL_GPU_RAM_AMD 0x21A3 +#define WGL_GPU_CLOCK_AMD 0x21A4 +#define WGL_GPU_NUM_PIPES_AMD 0x21A5 +#define WGL_GPU_NUM_SIMD_AMD 0x21A6 +#define WGL_GPU_NUM_RB_AMD 0x21A7 +#define WGL_GPU_NUM_SPI_AMD 0x21A8 + +typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id); +typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList); +typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc); +typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc); +typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); +typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids); +typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data); +typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc); + +#define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD) +#define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD) +#define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD) +#define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD) +#define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD) +#define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD) +#define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD) +#define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD) +#define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD) + +#define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association) + +#endif /* WGL_AMD_gpu_association */ + +/* ------------------------- WGL_ARB_buffer_region ------------------------- */ + +#ifndef WGL_ARB_buffer_region +#define WGL_ARB_buffer_region 1 + +#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 +#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 +#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 +#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 + +typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); +typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); +typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); +typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); + +#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) +#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) +#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) +#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) + +#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) + +#endif /* WGL_ARB_buffer_region */ + +/* --------------------- WGL_ARB_context_flush_control --------------------- */ + +#ifndef WGL_ARB_context_flush_control +#define WGL_ARB_context_flush_control 1 + +#define WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0x0000 +#define WGL_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097 +#define WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098 + +#define WGLEW_ARB_context_flush_control WGLEW_GET_VAR(__WGLEW_ARB_context_flush_control) + +#endif /* WGL_ARB_context_flush_control */ + +/* ------------------------- WGL_ARB_create_context ------------------------ */ + +#ifndef WGL_ARB_create_context +#define WGL_ARB_create_context 1 + +#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 +#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 +#define WGL_CONTEXT_FLAGS_ARB 0x2094 +#define ERROR_INVALID_VERSION_ARB 0x2095 +#define ERROR_INVALID_PROFILE_ARB 0x2096 + +typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList); + +#define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB) + +#define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context) + +#endif /* WGL_ARB_create_context */ + +/* --------------------- WGL_ARB_create_context_profile -------------------- */ + +#ifndef WGL_ARB_create_context_profile +#define WGL_ARB_create_context_profile 1 + +#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 +#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 + +#define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile) + +#endif /* WGL_ARB_create_context_profile */ + +/* ------------------- WGL_ARB_create_context_robustness ------------------- */ + +#ifndef WGL_ARB_create_context_robustness +#define WGL_ARB_create_context_robustness 1 + +#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 + +#define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness) + +#endif /* WGL_ARB_create_context_robustness */ + +/* ----------------------- WGL_ARB_extensions_string ----------------------- */ + +#ifndef WGL_ARB_extensions_string +#define WGL_ARB_extensions_string 1 + +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); + +#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) + +#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) + +#endif /* WGL_ARB_extensions_string */ + +/* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */ + +#ifndef WGL_ARB_framebuffer_sRGB +#define WGL_ARB_framebuffer_sRGB 1 + +#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 + +#define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB) + +#endif /* WGL_ARB_framebuffer_sRGB */ + +/* ----------------------- WGL_ARB_make_current_read ----------------------- */ + +#ifndef WGL_ARB_make_current_read +#define WGL_ARB_make_current_read 1 + +#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 +#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 + +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + +#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) +#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) + +#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) + +#endif /* WGL_ARB_make_current_read */ + +/* -------------------------- WGL_ARB_multisample -------------------------- */ + +#ifndef WGL_ARB_multisample +#define WGL_ARB_multisample 1 + +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 + +#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) + +#endif /* WGL_ARB_multisample */ + +/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ + +#ifndef WGL_ARB_pbuffer +#define WGL_ARB_pbuffer 1 + +#define WGL_DRAW_TO_PBUFFER_ARB 0x202D +#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E +#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 +#define WGL_PBUFFER_LARGEST_ARB 0x2033 +#define WGL_PBUFFER_WIDTH_ARB 0x2034 +#define WGL_PBUFFER_HEIGHT_ARB 0x2035 +#define WGL_PBUFFER_LOST_ARB 0x2036 + +DECLARE_HANDLE(HPBUFFERARB); + +typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); + +#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) +#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) +#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) +#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) +#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) + +#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) + +#endif /* WGL_ARB_pbuffer */ + +/* -------------------------- WGL_ARB_pixel_format ------------------------- */ + +#ifndef WGL_ARB_pixel_format +#define WGL_ARB_pixel_format 1 + +#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 +#define WGL_DRAW_TO_WINDOW_ARB 0x2001 +#define WGL_DRAW_TO_BITMAP_ARB 0x2002 +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_NEED_PALETTE_ARB 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 +#define WGL_SWAP_METHOD_ARB 0x2007 +#define WGL_NUMBER_OVERLAYS_ARB 0x2008 +#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 +#define WGL_TRANSPARENT_ARB 0x200A +#define WGL_SHARE_DEPTH_ARB 0x200C +#define WGL_SHARE_STENCIL_ARB 0x200D +#define WGL_SHARE_ACCUM_ARB 0x200E +#define WGL_SUPPORT_GDI_ARB 0x200F +#define WGL_SUPPORT_OPENGL_ARB 0x2010 +#define WGL_DOUBLE_BUFFER_ARB 0x2011 +#define WGL_STEREO_ARB 0x2012 +#define WGL_PIXEL_TYPE_ARB 0x2013 +#define WGL_COLOR_BITS_ARB 0x2014 +#define WGL_RED_BITS_ARB 0x2015 +#define WGL_RED_SHIFT_ARB 0x2016 +#define WGL_GREEN_BITS_ARB 0x2017 +#define WGL_GREEN_SHIFT_ARB 0x2018 +#define WGL_BLUE_BITS_ARB 0x2019 +#define WGL_BLUE_SHIFT_ARB 0x201A +#define WGL_ALPHA_BITS_ARB 0x201B +#define WGL_ALPHA_SHIFT_ARB 0x201C +#define WGL_ACCUM_BITS_ARB 0x201D +#define WGL_ACCUM_RED_BITS_ARB 0x201E +#define WGL_ACCUM_GREEN_BITS_ARB 0x201F +#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 +#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 +#define WGL_DEPTH_BITS_ARB 0x2022 +#define WGL_STENCIL_BITS_ARB 0x2023 +#define WGL_AUX_BUFFERS_ARB 0x2024 +#define WGL_NO_ACCELERATION_ARB 0x2025 +#define WGL_GENERIC_ACCELERATION_ARB 0x2026 +#define WGL_FULL_ACCELERATION_ARB 0x2027 +#define WGL_SWAP_EXCHANGE_ARB 0x2028 +#define WGL_SWAP_COPY_ARB 0x2029 +#define WGL_SWAP_UNDEFINED_ARB 0x202A +#define WGL_TYPE_RGBA_ARB 0x202B +#define WGL_TYPE_COLORINDEX_ARB 0x202C +#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 +#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 +#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 +#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A +#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B + +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues); + +#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) +#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) +#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) + +#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) + +#endif /* WGL_ARB_pixel_format */ + +/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ + +#ifndef WGL_ARB_pixel_format_float +#define WGL_ARB_pixel_format_float 1 + +#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 + +#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) + +#endif /* WGL_ARB_pixel_format_float */ + +/* ------------------------- WGL_ARB_render_texture ------------------------ */ + +#ifndef WGL_ARB_render_texture +#define WGL_ARB_render_texture 1 + +#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 +#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 +#define WGL_TEXTURE_FORMAT_ARB 0x2072 +#define WGL_TEXTURE_TARGET_ARB 0x2073 +#define WGL_MIPMAP_TEXTURE_ARB 0x2074 +#define WGL_TEXTURE_RGB_ARB 0x2075 +#define WGL_TEXTURE_RGBA_ARB 0x2076 +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 +#define WGL_TEXTURE_1D_ARB 0x2079 +#define WGL_TEXTURE_2D_ARB 0x207A +#define WGL_MIPMAP_LEVEL_ARB 0x207B +#define WGL_CUBE_MAP_FACE_ARB 0x207C +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 +#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 +#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 +#define WGL_FRONT_LEFT_ARB 0x2083 +#define WGL_FRONT_RIGHT_ARB 0x2084 +#define WGL_BACK_LEFT_ARB 0x2085 +#define WGL_BACK_RIGHT_ARB 0x2086 +#define WGL_AUX0_ARB 0x2087 +#define WGL_AUX1_ARB 0x2088 +#define WGL_AUX2_ARB 0x2089 +#define WGL_AUX3_ARB 0x208A +#define WGL_AUX4_ARB 0x208B +#define WGL_AUX5_ARB 0x208C +#define WGL_AUX6_ARB 0x208D +#define WGL_AUX7_ARB 0x208E +#define WGL_AUX8_ARB 0x208F +#define WGL_AUX9_ARB 0x2090 + +typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); +typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); + +#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) +#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) +#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) + +#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) + +#endif /* WGL_ARB_render_texture */ + +/* ---------------- WGL_ARB_robustness_application_isolation --------------- */ + +#ifndef WGL_ARB_robustness_application_isolation +#define WGL_ARB_robustness_application_isolation 1 + +#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define WGLEW_ARB_robustness_application_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_application_isolation) + +#endif /* WGL_ARB_robustness_application_isolation */ + +/* ---------------- WGL_ARB_robustness_share_group_isolation --------------- */ + +#ifndef WGL_ARB_robustness_share_group_isolation +#define WGL_ARB_robustness_share_group_isolation 1 + +#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008 + +#define WGLEW_ARB_robustness_share_group_isolation WGLEW_GET_VAR(__WGLEW_ARB_robustness_share_group_isolation) + +#endif /* WGL_ARB_robustness_share_group_isolation */ + +/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ + +#ifndef WGL_ATI_pixel_format_float +#define WGL_ATI_pixel_format_float 1 + +#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 + +#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) + +#endif /* WGL_ATI_pixel_format_float */ + +/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ + +#ifndef WGL_ATI_render_texture_rectangle +#define WGL_ATI_render_texture_rectangle 1 + +#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 + +#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) + +#endif /* WGL_ATI_render_texture_rectangle */ + +/* ------------------- WGL_EXT_create_context_es2_profile ------------------ */ + +#ifndef WGL_EXT_create_context_es2_profile +#define WGL_EXT_create_context_es2_profile 1 + +#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 + +#define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile) + +#endif /* WGL_EXT_create_context_es2_profile */ + +/* ------------------- WGL_EXT_create_context_es_profile ------------------- */ + +#ifndef WGL_EXT_create_context_es_profile +#define WGL_EXT_create_context_es_profile 1 + +#define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004 + +#define WGLEW_EXT_create_context_es_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es_profile) + +#endif /* WGL_EXT_create_context_es_profile */ + +/* -------------------------- WGL_EXT_depth_float -------------------------- */ + +#ifndef WGL_EXT_depth_float +#define WGL_EXT_depth_float 1 + +#define WGL_DEPTH_FLOAT_EXT 0x2040 + +#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) + +#endif /* WGL_EXT_depth_float */ + +/* ---------------------- WGL_EXT_display_color_table ---------------------- */ + +#ifndef WGL_EXT_display_color_table +#define WGL_EXT_display_color_table 1 + +typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); +typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length); + +#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) +#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) +#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) +#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) + +#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) + +#endif /* WGL_EXT_display_color_table */ + +/* ----------------------- WGL_EXT_extensions_string ----------------------- */ + +#ifndef WGL_EXT_extensions_string +#define WGL_EXT_extensions_string 1 + +typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); + +#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) + +#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) + +#endif /* WGL_EXT_extensions_string */ + +/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ + +#ifndef WGL_EXT_framebuffer_sRGB +#define WGL_EXT_framebuffer_sRGB 1 + +#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 + +#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) + +#endif /* WGL_EXT_framebuffer_sRGB */ + +/* ----------------------- WGL_EXT_make_current_read ----------------------- */ + +#ifndef WGL_EXT_make_current_read +#define WGL_EXT_make_current_read 1 + +#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 + +typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); + +#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) +#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) + +#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) + +#endif /* WGL_EXT_make_current_read */ + +/* -------------------------- WGL_EXT_multisample -------------------------- */ + +#ifndef WGL_EXT_multisample +#define WGL_EXT_multisample 1 + +#define WGL_SAMPLE_BUFFERS_EXT 0x2041 +#define WGL_SAMPLES_EXT 0x2042 + +#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) + +#endif /* WGL_EXT_multisample */ + +/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ + +#ifndef WGL_EXT_pbuffer +#define WGL_EXT_pbuffer 1 + +#define WGL_DRAW_TO_PBUFFER_EXT 0x202D +#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E +#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F +#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 +#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 +#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 +#define WGL_PBUFFER_LARGEST_EXT 0x2033 +#define WGL_PBUFFER_WIDTH_EXT 0x2034 +#define WGL_PBUFFER_HEIGHT_EXT 0x2035 + +DECLARE_HANDLE(HPBUFFEREXT); + +typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); +typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); +typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); +typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); +typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); + +#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) +#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) +#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) +#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) +#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) + +#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) + +#endif /* WGL_EXT_pbuffer */ + +/* -------------------------- WGL_EXT_pixel_format ------------------------- */ + +#ifndef WGL_EXT_pixel_format +#define WGL_EXT_pixel_format 1 + +#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 +#define WGL_DRAW_TO_WINDOW_EXT 0x2001 +#define WGL_DRAW_TO_BITMAP_EXT 0x2002 +#define WGL_ACCELERATION_EXT 0x2003 +#define WGL_NEED_PALETTE_EXT 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 +#define WGL_SWAP_METHOD_EXT 0x2007 +#define WGL_NUMBER_OVERLAYS_EXT 0x2008 +#define WGL_NUMBER_UNDERLAYS_EXT 0x2009 +#define WGL_TRANSPARENT_EXT 0x200A +#define WGL_TRANSPARENT_VALUE_EXT 0x200B +#define WGL_SHARE_DEPTH_EXT 0x200C +#define WGL_SHARE_STENCIL_EXT 0x200D +#define WGL_SHARE_ACCUM_EXT 0x200E +#define WGL_SUPPORT_GDI_EXT 0x200F +#define WGL_SUPPORT_OPENGL_EXT 0x2010 +#define WGL_DOUBLE_BUFFER_EXT 0x2011 +#define WGL_STEREO_EXT 0x2012 +#define WGL_PIXEL_TYPE_EXT 0x2013 +#define WGL_COLOR_BITS_EXT 0x2014 +#define WGL_RED_BITS_EXT 0x2015 +#define WGL_RED_SHIFT_EXT 0x2016 +#define WGL_GREEN_BITS_EXT 0x2017 +#define WGL_GREEN_SHIFT_EXT 0x2018 +#define WGL_BLUE_BITS_EXT 0x2019 +#define WGL_BLUE_SHIFT_EXT 0x201A +#define WGL_ALPHA_BITS_EXT 0x201B +#define WGL_ALPHA_SHIFT_EXT 0x201C +#define WGL_ACCUM_BITS_EXT 0x201D +#define WGL_ACCUM_RED_BITS_EXT 0x201E +#define WGL_ACCUM_GREEN_BITS_EXT 0x201F +#define WGL_ACCUM_BLUE_BITS_EXT 0x2020 +#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 +#define WGL_DEPTH_BITS_EXT 0x2022 +#define WGL_STENCIL_BITS_EXT 0x2023 +#define WGL_AUX_BUFFERS_EXT 0x2024 +#define WGL_NO_ACCELERATION_EXT 0x2025 +#define WGL_GENERIC_ACCELERATION_EXT 0x2026 +#define WGL_FULL_ACCELERATION_EXT 0x2027 +#define WGL_SWAP_EXCHANGE_EXT 0x2028 +#define WGL_SWAP_COPY_EXT 0x2029 +#define WGL_SWAP_UNDEFINED_EXT 0x202A +#define WGL_TYPE_RGBA_EXT 0x202B +#define WGL_TYPE_COLORINDEX_EXT 0x202C + +typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues); + +#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) +#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) +#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) + +#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) + +#endif /* WGL_EXT_pixel_format */ + +/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ + +#ifndef WGL_EXT_pixel_format_packed_float +#define WGL_EXT_pixel_format_packed_float 1 + +#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 + +#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) + +#endif /* WGL_EXT_pixel_format_packed_float */ + +/* -------------------------- WGL_EXT_swap_control ------------------------- */ + +#ifndef WGL_EXT_swap_control +#define WGL_EXT_swap_control 1 + +typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); +typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); + +#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) +#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) + +#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) + +#endif /* WGL_EXT_swap_control */ + +/* ----------------------- WGL_EXT_swap_control_tear ----------------------- */ + +#ifndef WGL_EXT_swap_control_tear +#define WGL_EXT_swap_control_tear 1 + +#define WGLEW_EXT_swap_control_tear WGLEW_GET_VAR(__WGLEW_EXT_swap_control_tear) + +#endif /* WGL_EXT_swap_control_tear */ + +/* --------------------- WGL_I3D_digital_video_control --------------------- */ + +#ifndef WGL_I3D_digital_video_control +#define WGL_I3D_digital_video_control 1 + +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 +#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 +#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 +#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 + +typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); + +#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) +#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) + +#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) + +#endif /* WGL_I3D_digital_video_control */ + +/* ----------------------------- WGL_I3D_gamma ----------------------------- */ + +#ifndef WGL_I3D_gamma +#define WGL_I3D_gamma 1 + +#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E +#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F + +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue); +typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); + +#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) +#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) +#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) +#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) + +#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) + +#endif /* WGL_I3D_gamma */ + +/* ---------------------------- WGL_I3D_genlock ---------------------------- */ + +#ifndef WGL_I3D_genlock +#define WGL_I3D_genlock 1 + +#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 +#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 +#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 +#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 +#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 +#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 +#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A +#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B +#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C + +typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); +typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); +typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); +typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); +typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay); + +#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) +#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) +#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) +#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) +#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) +#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) +#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) +#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) +#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) +#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) +#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) +#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) + +#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) + +#endif /* WGL_I3D_genlock */ + +/* -------------------------- WGL_I3D_image_buffer ------------------------- */ + +#ifndef WGL_I3D_image_buffer +#define WGL_I3D_image_buffer 1 + +#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 +#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 + +typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count); +typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); +typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); +typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count); + +#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) +#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) +#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) +#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) + +#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) + +#endif /* WGL_I3D_image_buffer */ + +/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ + +#ifndef WGL_I3D_swap_frame_lock +#define WGL_I3D_swap_frame_lock 1 + +typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID); +typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); + +#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) +#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) +#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) +#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) + +#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) + +#endif /* WGL_I3D_swap_frame_lock */ + +/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ + +#ifndef WGL_I3D_swap_frame_usage +#define WGL_I3D_swap_frame_usage 1 + +typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); +typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); + +#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) +#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) +#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) +#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) + +#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) + +#endif /* WGL_I3D_swap_frame_usage */ + +/* --------------------------- WGL_NV_DX_interop --------------------------- */ + +#ifndef WGL_NV_DX_interop +#define WGL_NV_DX_interop 1 + +#define WGL_ACCESS_READ_ONLY_NV 0x0000 +#define WGL_ACCESS_READ_WRITE_NV 0x0001 +#define WGL_ACCESS_WRITE_DISCARD_NV 0x0002 + +typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice); +typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); +typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access); +typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice); +typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access); +typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle); +typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); +typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject); + +#define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV) +#define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV) +#define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV) +#define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV) +#define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV) +#define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV) +#define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV) +#define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV) + +#define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop) + +#endif /* WGL_NV_DX_interop */ + +/* --------------------------- WGL_NV_DX_interop2 -------------------------- */ + +#ifndef WGL_NV_DX_interop2 +#define WGL_NV_DX_interop2 1 + +#define WGLEW_NV_DX_interop2 WGLEW_GET_VAR(__WGLEW_NV_DX_interop2) + +#endif /* WGL_NV_DX_interop2 */ + +/* --------------------------- WGL_NV_copy_image --------------------------- */ + +#ifndef WGL_NV_copy_image +#define WGL_NV_copy_image 1 + +typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); + +#define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV) + +#define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image) + +#endif /* WGL_NV_copy_image */ + +/* ------------------------ WGL_NV_delay_before_swap ----------------------- */ + +#ifndef WGL_NV_delay_before_swap +#define WGL_NV_delay_before_swap 1 + +typedef BOOL (WINAPI * PFNWGLDELAYBEFORESWAPNVPROC) (HDC hDC, GLfloat seconds); + +#define wglDelayBeforeSwapNV WGLEW_GET_FUN(__wglewDelayBeforeSwapNV) + +#define WGLEW_NV_delay_before_swap WGLEW_GET_VAR(__WGLEW_NV_delay_before_swap) + +#endif /* WGL_NV_delay_before_swap */ + +/* -------------------------- WGL_NV_float_buffer -------------------------- */ + +#ifndef WGL_NV_float_buffer +#define WGL_NV_float_buffer 1 + +#define WGL_FLOAT_COMPONENTS_NV 0x20B0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 +#define WGL_TEXTURE_FLOAT_R_NV 0x20B5 +#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 +#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 +#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 + +#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) + +#endif /* WGL_NV_float_buffer */ + +/* -------------------------- WGL_NV_gpu_affinity -------------------------- */ + +#ifndef WGL_NV_gpu_affinity +#define WGL_NV_gpu_affinity 1 + +#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 +#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 + +DECLARE_HANDLE(HGPUNV); +typedef struct _GPU_DEVICE { + DWORD cb; + CHAR DeviceName[32]; + CHAR DeviceString[128]; + DWORD Flags; + RECT rcVirtualScreen; +} GPU_DEVICE, *PGPU_DEVICE; + +typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); +typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); +typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); +typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); +typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); + +#define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV) +#define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV) +#define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV) +#define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV) +#define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV) + +#define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity) + +#endif /* WGL_NV_gpu_affinity */ + +/* ---------------------- WGL_NV_multisample_coverage ---------------------- */ + +#ifndef WGL_NV_multisample_coverage +#define WGL_NV_multisample_coverage 1 + +#define WGL_COVERAGE_SAMPLES_NV 0x2042 +#define WGL_COLOR_SAMPLES_NV 0x20B9 + +#define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage) + +#endif /* WGL_NV_multisample_coverage */ + +/* -------------------------- WGL_NV_present_video ------------------------- */ + +#ifndef WGL_NV_present_video +#define WGL_NV_present_video 1 + +#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 + +DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); + +typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList); +typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList); +typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue); + +#define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV) +#define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV) +#define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV) + +#define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video) + +#endif /* WGL_NV_present_video */ + +/* ---------------------- WGL_NV_render_depth_texture ---------------------- */ + +#ifndef WGL_NV_render_depth_texture +#define WGL_NV_render_depth_texture 1 + +#define WGL_NO_TEXTURE_ARB 0x2077 +#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 +#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 +#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 +#define WGL_DEPTH_COMPONENT_NV 0x20A7 + +#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) + +#endif /* WGL_NV_render_depth_texture */ + +/* -------------------- WGL_NV_render_texture_rectangle -------------------- */ + +#ifndef WGL_NV_render_texture_rectangle +#define WGL_NV_render_texture_rectangle 1 + +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 +#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 +#define WGL_TEXTURE_RECTANGLE_NV 0x20A2 + +#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) + +#endif /* WGL_NV_render_texture_rectangle */ + +/* --------------------------- WGL_NV_swap_group --------------------------- */ + +#ifndef WGL_NV_swap_group +#define WGL_NV_swap_group 1 + +typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); +typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); +typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count); +typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers); +typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier); +typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); + +#define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV) +#define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV) +#define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV) +#define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV) +#define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV) +#define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV) + +#define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group) + +#endif /* WGL_NV_swap_group */ + +/* ----------------------- WGL_NV_vertex_array_range ----------------------- */ + +#ifndef WGL_NV_vertex_array_range +#define WGL_NV_vertex_array_range 1 + +typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); +typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); + +#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) +#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) + +#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) + +#endif /* WGL_NV_vertex_array_range */ + +/* -------------------------- WGL_NV_video_capture ------------------------- */ + +#ifndef WGL_NV_video_capture +#define WGL_NV_video_capture 1 + +#define WGL_UNIQUE_ID_NV 0x20CE +#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF + +DECLARE_HANDLE(HVIDEOINPUTDEVICENV); + +typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); +typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList); +typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); +typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue); +typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); + +#define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV) +#define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV) +#define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV) +#define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV) +#define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV) + +#define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture) + +#endif /* WGL_NV_video_capture */ + +/* -------------------------- WGL_NV_video_output -------------------------- */ + +#ifndef WGL_NV_video_output +#define WGL_NV_video_output 1 + +#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 +#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 +#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 +#define WGL_VIDEO_OUT_COLOR_NV 0x20C3 +#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 +#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 +#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 +#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 +#define WGL_VIDEO_OUT_FRAME 0x20C8 +#define WGL_VIDEO_OUT_FIELD_1 0x20C9 +#define WGL_VIDEO_OUT_FIELD_2 0x20CA +#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB +#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC + +DECLARE_HANDLE(HPVIDEODEV); + +typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); +typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice); +typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); +typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); +typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); +typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock); + +#define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV) +#define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV) +#define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV) +#define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV) +#define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV) +#define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV) + +#define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output) + +#endif /* WGL_NV_video_output */ + +/* -------------------------- WGL_OML_sync_control ------------------------- */ + +#ifndef WGL_OML_sync_control +#define WGL_OML_sync_control 1 + +typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator); +typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc); +typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); +typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc); +typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc); + +#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) +#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) +#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) +#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) +#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) +#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) + +#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) + +#endif /* WGL_OML_sync_control */ + +/* ------------------------------------------------------------------------- */ + +#ifdef GLEW_MX +#define WGLEW_FUN_EXPORT +#define WGLEW_VAR_EXPORT +#else +#define WGLEW_FUN_EXPORT GLEW_FUN_EXPORT +#define WGLEW_VAR_EXPORT GLEW_VAR_EXPORT +#endif /* GLEW_MX */ + +#ifdef GLEW_MX +struct WGLEWContextStruct +{ +#endif /* GLEW_MX */ + +WGLEW_FUN_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; + +WGLEW_FUN_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD; +WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD; +WGLEW_FUN_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD; +WGLEW_FUN_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD; +WGLEW_FUN_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD; +WGLEW_FUN_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD; +WGLEW_FUN_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD; +WGLEW_FUN_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD; +WGLEW_FUN_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD; + +WGLEW_FUN_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; +WGLEW_FUN_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; +WGLEW_FUN_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; +WGLEW_FUN_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; + +WGLEW_FUN_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB; + +WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; + +WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; +WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; + +WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; +WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; +WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; +WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; +WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; + +WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; + +WGLEW_FUN_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; +WGLEW_FUN_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; +WGLEW_FUN_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; + +WGLEW_FUN_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; +WGLEW_FUN_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; +WGLEW_FUN_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; +WGLEW_FUN_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; + +WGLEW_FUN_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; + +WGLEW_FUN_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; +WGLEW_FUN_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; + +WGLEW_FUN_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; +WGLEW_FUN_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; +WGLEW_FUN_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; +WGLEW_FUN_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; +WGLEW_FUN_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; + +WGLEW_FUN_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; +WGLEW_FUN_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; + +WGLEW_FUN_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; +WGLEW_FUN_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; + +WGLEW_FUN_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; +WGLEW_FUN_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; + +WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; +WGLEW_FUN_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; +WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; +WGLEW_FUN_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; + +WGLEW_FUN_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; +WGLEW_FUN_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; +WGLEW_FUN_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; +WGLEW_FUN_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; +WGLEW_FUN_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; +WGLEW_FUN_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; + +WGLEW_FUN_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; +WGLEW_FUN_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; +WGLEW_FUN_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; +WGLEW_FUN_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; + +WGLEW_FUN_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; +WGLEW_FUN_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; +WGLEW_FUN_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; +WGLEW_FUN_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; + +WGLEW_FUN_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; +WGLEW_FUN_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; +WGLEW_FUN_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; +WGLEW_FUN_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; + +WGLEW_FUN_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV; +WGLEW_FUN_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV; +WGLEW_FUN_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV; +WGLEW_FUN_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV; +WGLEW_FUN_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV; +WGLEW_FUN_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV; +WGLEW_FUN_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV; +WGLEW_FUN_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV; + +WGLEW_FUN_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV; + +WGLEW_FUN_EXPORT PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV; + +WGLEW_FUN_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV; +WGLEW_FUN_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV; +WGLEW_FUN_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV; +WGLEW_FUN_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV; +WGLEW_FUN_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV; + +WGLEW_FUN_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV; +WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV; +WGLEW_FUN_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV; + +WGLEW_FUN_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV; +WGLEW_FUN_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV; +WGLEW_FUN_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV; +WGLEW_FUN_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV; +WGLEW_FUN_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV; +WGLEW_FUN_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV; + +WGLEW_FUN_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; +WGLEW_FUN_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; + +WGLEW_FUN_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV; +WGLEW_FUN_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV; +WGLEW_FUN_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV; +WGLEW_FUN_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV; +WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV; + +WGLEW_FUN_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV; +WGLEW_FUN_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV; +WGLEW_FUN_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV; +WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV; +WGLEW_FUN_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV; +WGLEW_FUN_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV; + +WGLEW_FUN_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; +WGLEW_FUN_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; +WGLEW_FUN_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; +WGLEW_FUN_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; +WGLEW_FUN_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; +WGLEW_FUN_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; +WGLEW_VAR_EXPORT GLboolean __WGLEW_3DFX_multisample; +WGLEW_VAR_EXPORT GLboolean __WGLEW_3DL_stereo_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_AMD_gpu_association; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_buffer_region; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_context_flush_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_profile; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_create_context_robustness; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_extensions_string; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_make_current_read; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_multisample; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pbuffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_render_texture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_application_isolation; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ARB_robustness_share_group_isolation; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_create_context_es_profile; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_depth_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_display_color_table; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_extensions_string; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_make_current_read; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_multisample; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pbuffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_EXT_swap_control_tear; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_digital_video_control; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_gamma; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_genlock; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_image_buffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; +WGLEW_VAR_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_DX_interop2; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_copy_image; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_delay_before_swap; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_float_buffer; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_gpu_affinity; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_multisample_coverage; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_present_video; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_depth_texture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_swap_group; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_vertex_array_range; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_capture; +WGLEW_VAR_EXPORT GLboolean __WGLEW_NV_video_output; +WGLEW_VAR_EXPORT GLboolean __WGLEW_OML_sync_control; + +#ifdef GLEW_MX +}; /* WGLEWContextStruct */ +#endif /* GLEW_MX */ + +/* ------------------------------------------------------------------------- */ + +#ifdef GLEW_MX + +typedef struct WGLEWContextStruct WGLEWContext; +GLEWAPI GLenum GLEWAPIENTRY wglewContextInit (WGLEWContext *ctx); +GLEWAPI GLboolean GLEWAPIENTRY wglewContextIsSupported (const WGLEWContext *ctx, const char *name); + +#define wglewInit() wglewContextInit(wglewGetContext()) +#define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x) + +#define WGLEW_GET_VAR(x) (*(const GLboolean*)&(wglewGetContext()->x)) +#define WGLEW_GET_FUN(x) wglewGetContext()->x + +#else /* GLEW_MX */ + +GLEWAPI GLenum GLEWAPIENTRY wglewInit (); +GLEWAPI GLboolean GLEWAPIENTRY wglewIsSupported (const char *name); + +#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) +#define WGLEW_GET_FUN(x) x + +#endif /* GLEW_MX */ + +GLEWAPI GLboolean GLEWAPIENTRY wglewGetExtension (const char *name); + +#ifdef __cplusplus +} +#endif + +#undef GLEWAPI + +#endif /* __wglew_h__ */ diff --git a/deps/GLEW/glew/src/glew.c b/deps/GLEW/glew/src/glew.c new file mode 100644 index 0000000000..2ed1c74a5d --- /dev/null +++ b/deps/GLEW/glew/src/glew.c @@ -0,0 +1,18614 @@ +/* +** The OpenGL Extension Wrangler Library +** Copyright (C) 2008-2015, Nigel Stewart +** Copyright (C) 2002-2008, Milan Ikits +** Copyright (C) 2002-2008, Marcelo E. Magallon +** Copyright (C) 2002, Lev Povalahev +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are met: +** +** * Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** * 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. +** * The name of the author may be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 OWNER OR 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. +*/ + +#if 1 +// #ifdef SLIC3R_GUI + +#include + +#if defined(_WIN32) +# include +#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) +# include +#endif + +#include /* For size_t */ + +/* + * Define glewGetContext and related helper macros. + */ +#ifdef GLEW_MX +# define glewGetContext() ctx +# ifdef _WIN32 +# define GLEW_CONTEXT_ARG_DEF_INIT GLEWContext* ctx +# define GLEW_CONTEXT_ARG_VAR_INIT ctx +# define wglewGetContext() ctx +# define WGLEW_CONTEXT_ARG_DEF_INIT WGLEWContext* ctx +# define WGLEW_CONTEXT_ARG_DEF_LIST WGLEWContext* ctx +# else /* _WIN32 */ +# define GLEW_CONTEXT_ARG_DEF_INIT void +# define GLEW_CONTEXT_ARG_VAR_INIT +# define glxewGetContext() ctx +# define GLXEW_CONTEXT_ARG_DEF_INIT void +# define GLXEW_CONTEXT_ARG_DEF_LIST GLXEWContext* ctx +# endif /* _WIN32 */ +# define GLEW_CONTEXT_ARG_DEF_LIST GLEWContext* ctx +#else /* GLEW_MX */ +# define GLEW_CONTEXT_ARG_DEF_INIT void +# define GLEW_CONTEXT_ARG_VAR_INIT +# define GLEW_CONTEXT_ARG_DEF_LIST void +# define WGLEW_CONTEXT_ARG_DEF_INIT void +# define WGLEW_CONTEXT_ARG_DEF_LIST void +# define GLXEW_CONTEXT_ARG_DEF_INIT void +# define GLXEW_CONTEXT_ARG_DEF_LIST void +#endif /* GLEW_MX */ + +#if defined(GLEW_REGAL) + +/* In GLEW_REGAL mode we call direcly into the linked + libRegal.so glGetProcAddressREGAL for looking up + the GL function pointers. */ + +# undef glGetProcAddressREGAL +# ifdef WIN32 +extern void * __stdcall glGetProcAddressREGAL(const GLchar *name); +static void * (__stdcall * regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; +# else +extern void * glGetProcAddressREGAL(const GLchar *name); +static void * (*regalGetProcAddress) (const GLchar *) = glGetProcAddressREGAL; +# endif +# define glGetProcAddressREGAL GLEW_GET_FUN(__glewGetProcAddressREGAL) + +#elif defined(__sgi) || defined (__sun) || defined(__HAIKU__) || defined(GLEW_APPLE_GLX) +#include +#include +#include + +void* dlGetProcAddress (const GLubyte* name) +{ + static void* h = NULL; + static void* gpa; + + if (h == NULL) + { + if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL; + gpa = dlsym(h, "glXGetProcAddress"); + } + + if (gpa != NULL) + return ((void*(*)(const GLubyte*))gpa)(name); + else + return dlsym(h, (const char*)name); +} +#endif /* __sgi || __sun || GLEW_APPLE_GLX */ + +#if defined(__APPLE__) +#include +#include +#include + +#ifdef MAC_OS_X_VERSION_10_3 + +#include + +void* NSGLGetProcAddress (const GLubyte *name) +{ + static void* image = NULL; + void* addr; + if (NULL == image) + { + image = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_LAZY); + } + if( !image ) return NULL; + addr = dlsym(image, (const char*)name); + if( addr ) return addr; +#ifdef GLEW_APPLE_GLX + return dlGetProcAddress( name ); // try next for glx symbols +#else + return NULL; +#endif +} +#else + +#include + +void* NSGLGetProcAddress (const GLubyte *name) +{ + static const struct mach_header* image = NULL; + NSSymbol symbol; + char* symbolName; + if (NULL == image) + { + image = NSAddImage("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", NSADDIMAGE_OPTION_RETURN_ON_ERROR); + } + /* prepend a '_' for the Unix C symbol mangling convention */ + symbolName = malloc(strlen((const char*)name) + 2); + strcpy(symbolName+1, (const char*)name); + symbolName[0] = '_'; + symbol = NULL; + /* if (NSIsSymbolNameDefined(symbolName)) + symbol = NSLookupAndBindSymbol(symbolName); */ + symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL; + free(symbolName); + if( symbol ) return NSAddressOfSymbol(symbol); +#ifdef GLEW_APPLE_GLX + return dlGetProcAddress( name ); // try next for glx symbols +#else + return NULL; +#endif +} +#endif /* MAC_OS_X_VERSION_10_3 */ +#endif /* __APPLE__ */ + +/* + * Define glewGetProcAddress. + */ +#if defined(GLEW_REGAL) +# define glewGetProcAddress(name) regalGetProcAddress((const GLchar *) name) +#elif defined(_WIN32) +# define glewGetProcAddress(name) wglGetProcAddress((LPCSTR)name) +#elif defined(__APPLE__) && !defined(GLEW_APPLE_GLX) +# define glewGetProcAddress(name) NSGLGetProcAddress(name) +#elif defined(__sgi) || defined(__sun) || defined(__HAIKU__) +# define glewGetProcAddress(name) dlGetProcAddress(name) +#elif defined(__ANDROID__) +# define glewGetProcAddress(name) NULL /* TODO */ +#elif defined(__native_client__) +# define glewGetProcAddress(name) NULL /* TODO */ +#else /* __linux */ +# define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) +#endif + +/* + * Redefine GLEW_GET_VAR etc without const cast + */ + +#undef GLEW_GET_VAR +#ifdef GLEW_MX +# define GLEW_GET_VAR(x) (glewGetContext()->x) +#else /* GLEW_MX */ +# define GLEW_GET_VAR(x) (x) +#endif /* GLEW_MX */ + +#ifdef WGLEW_GET_VAR +# undef WGLEW_GET_VAR +# ifdef GLEW_MX +# define WGLEW_GET_VAR(x) (wglewGetContext()->x) +# else /* GLEW_MX */ +# define WGLEW_GET_VAR(x) (x) +# endif /* GLEW_MX */ +#endif /* WGLEW_GET_VAR */ + +#ifdef GLXEW_GET_VAR +# undef GLXEW_GET_VAR +# ifdef GLEW_MX +# define GLXEW_GET_VAR(x) (glxewGetContext()->x) +# else /* GLEW_MX */ +# define GLXEW_GET_VAR(x) (x) +# endif /* GLEW_MX */ +#endif /* GLXEW_GET_VAR */ + +/* + * GLEW, just like OpenGL or GLU, does not rely on the standard C library. + * These functions implement the functionality required in this file. + */ +static GLuint _glewStrLen (const GLubyte* s) +{ + GLuint i=0; + if (s == NULL) return 0; + while (s[i] != '\0') i++; + return i; +} + +static GLuint _glewStrCLen (const GLubyte* s, GLubyte c) +{ + GLuint i=0; + if (s == NULL) return 0; + while (s[i] != '\0' && s[i] != c) i++; + return (s[i] == '\0' || s[i] == c) ? i : 0; +} + +static GLboolean _glewStrSame (const GLubyte* a, const GLubyte* b, GLuint n) +{ + GLuint i=0; + if(a == NULL || b == NULL) + return (a == NULL && b == NULL && n == 0) ? GL_TRUE : GL_FALSE; + while (i < n && a[i] != '\0' && b[i] != '\0' && a[i] == b[i]) i++; + return i == n ? GL_TRUE : GL_FALSE; +} + +static GLboolean _glewStrSame1 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) +{ + while (*na > 0 && (**a == ' ' || **a == '\n' || **a == '\r' || **a == '\t')) + { + (*a)++; + (*na)--; + } + if(*na >= nb) + { + GLuint i=0; + while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; + if(i == nb) + { + *a = *a + nb; + *na = *na - nb; + return GL_TRUE; + } + } + return GL_FALSE; +} + +static GLboolean _glewStrSame2 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) +{ + if(*na >= nb) + { + GLuint i=0; + while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; + if(i == nb) + { + *a = *a + nb; + *na = *na - nb; + return GL_TRUE; + } + } + return GL_FALSE; +} + +static GLboolean _glewStrSame3 (const GLubyte** a, GLuint* na, const GLubyte* b, GLuint nb) +{ + if(*na >= nb) + { + GLuint i=0; + while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++; + if (i == nb && (*na == nb || (*a)[i] == ' ' || (*a)[i] == '\n' || (*a)[i] == '\r' || (*a)[i] == '\t')) + { + *a = *a + nb; + *na = *na - nb; + return GL_TRUE; + } + } + return GL_FALSE; +} + +/* + * Search for name in the extensions string. Use of strstr() + * is not sufficient because extension names can be prefixes of + * other extension names. Could use strtok() but the constant + * string returned by glGetString might be in read-only memory. + */ +static GLboolean _glewSearchExtension (const char* name, const GLubyte *start, const GLubyte *end) +{ + const GLubyte* p; + GLuint len = _glewStrLen((const GLubyte*)name); + p = start; + while (p < end) + { + GLuint n = _glewStrCLen(p, ' '); + if (len == n && _glewStrSame((const GLubyte*)name, p, n)) return GL_TRUE; + p += n+1; + } + return GL_FALSE; +} + +#if !defined(_WIN32) || !defined(GLEW_MX) + +PFNGLCOPYTEXSUBIMAGE3DPROC __glewCopyTexSubImage3D = NULL; +PFNGLDRAWRANGEELEMENTSPROC __glewDrawRangeElements = NULL; +PFNGLTEXIMAGE3DPROC __glewTexImage3D = NULL; +PFNGLTEXSUBIMAGE3DPROC __glewTexSubImage3D = NULL; + +PFNGLACTIVETEXTUREPROC __glewActiveTexture = NULL; +PFNGLCLIENTACTIVETEXTUREPROC __glewClientActiveTexture = NULL; +PFNGLCOMPRESSEDTEXIMAGE1DPROC __glewCompressedTexImage1D = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DPROC __glewCompressedTexImage2D = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DPROC __glewCompressedTexImage3D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC __glewCompressedTexSubImage1D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC __glewCompressedTexSubImage2D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC __glewCompressedTexSubImage3D = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEPROC __glewGetCompressedTexImage = NULL; +PFNGLLOADTRANSPOSEMATRIXDPROC __glewLoadTransposeMatrixd = NULL; +PFNGLLOADTRANSPOSEMATRIXFPROC __glewLoadTransposeMatrixf = NULL; +PFNGLMULTTRANSPOSEMATRIXDPROC __glewMultTransposeMatrixd = NULL; +PFNGLMULTTRANSPOSEMATRIXFPROC __glewMultTransposeMatrixf = NULL; +PFNGLMULTITEXCOORD1DPROC __glewMultiTexCoord1d = NULL; +PFNGLMULTITEXCOORD1DVPROC __glewMultiTexCoord1dv = NULL; +PFNGLMULTITEXCOORD1FPROC __glewMultiTexCoord1f = NULL; +PFNGLMULTITEXCOORD1FVPROC __glewMultiTexCoord1fv = NULL; +PFNGLMULTITEXCOORD1IPROC __glewMultiTexCoord1i = NULL; +PFNGLMULTITEXCOORD1IVPROC __glewMultiTexCoord1iv = NULL; +PFNGLMULTITEXCOORD1SPROC __glewMultiTexCoord1s = NULL; +PFNGLMULTITEXCOORD1SVPROC __glewMultiTexCoord1sv = NULL; +PFNGLMULTITEXCOORD2DPROC __glewMultiTexCoord2d = NULL; +PFNGLMULTITEXCOORD2DVPROC __glewMultiTexCoord2dv = NULL; +PFNGLMULTITEXCOORD2FPROC __glewMultiTexCoord2f = NULL; +PFNGLMULTITEXCOORD2FVPROC __glewMultiTexCoord2fv = NULL; +PFNGLMULTITEXCOORD2IPROC __glewMultiTexCoord2i = NULL; +PFNGLMULTITEXCOORD2IVPROC __glewMultiTexCoord2iv = NULL; +PFNGLMULTITEXCOORD2SPROC __glewMultiTexCoord2s = NULL; +PFNGLMULTITEXCOORD2SVPROC __glewMultiTexCoord2sv = NULL; +PFNGLMULTITEXCOORD3DPROC __glewMultiTexCoord3d = NULL; +PFNGLMULTITEXCOORD3DVPROC __glewMultiTexCoord3dv = NULL; +PFNGLMULTITEXCOORD3FPROC __glewMultiTexCoord3f = NULL; +PFNGLMULTITEXCOORD3FVPROC __glewMultiTexCoord3fv = NULL; +PFNGLMULTITEXCOORD3IPROC __glewMultiTexCoord3i = NULL; +PFNGLMULTITEXCOORD3IVPROC __glewMultiTexCoord3iv = NULL; +PFNGLMULTITEXCOORD3SPROC __glewMultiTexCoord3s = NULL; +PFNGLMULTITEXCOORD3SVPROC __glewMultiTexCoord3sv = NULL; +PFNGLMULTITEXCOORD4DPROC __glewMultiTexCoord4d = NULL; +PFNGLMULTITEXCOORD4DVPROC __glewMultiTexCoord4dv = NULL; +PFNGLMULTITEXCOORD4FPROC __glewMultiTexCoord4f = NULL; +PFNGLMULTITEXCOORD4FVPROC __glewMultiTexCoord4fv = NULL; +PFNGLMULTITEXCOORD4IPROC __glewMultiTexCoord4i = NULL; +PFNGLMULTITEXCOORD4IVPROC __glewMultiTexCoord4iv = NULL; +PFNGLMULTITEXCOORD4SPROC __glewMultiTexCoord4s = NULL; +PFNGLMULTITEXCOORD4SVPROC __glewMultiTexCoord4sv = NULL; +PFNGLSAMPLECOVERAGEPROC __glewSampleCoverage = NULL; + +PFNGLBLENDCOLORPROC __glewBlendColor = NULL; +PFNGLBLENDEQUATIONPROC __glewBlendEquation = NULL; +PFNGLBLENDFUNCSEPARATEPROC __glewBlendFuncSeparate = NULL; +PFNGLFOGCOORDPOINTERPROC __glewFogCoordPointer = NULL; +PFNGLFOGCOORDDPROC __glewFogCoordd = NULL; +PFNGLFOGCOORDDVPROC __glewFogCoorddv = NULL; +PFNGLFOGCOORDFPROC __glewFogCoordf = NULL; +PFNGLFOGCOORDFVPROC __glewFogCoordfv = NULL; +PFNGLMULTIDRAWARRAYSPROC __glewMultiDrawArrays = NULL; +PFNGLMULTIDRAWELEMENTSPROC __glewMultiDrawElements = NULL; +PFNGLPOINTPARAMETERFPROC __glewPointParameterf = NULL; +PFNGLPOINTPARAMETERFVPROC __glewPointParameterfv = NULL; +PFNGLPOINTPARAMETERIPROC __glewPointParameteri = NULL; +PFNGLPOINTPARAMETERIVPROC __glewPointParameteriv = NULL; +PFNGLSECONDARYCOLOR3BPROC __glewSecondaryColor3b = NULL; +PFNGLSECONDARYCOLOR3BVPROC __glewSecondaryColor3bv = NULL; +PFNGLSECONDARYCOLOR3DPROC __glewSecondaryColor3d = NULL; +PFNGLSECONDARYCOLOR3DVPROC __glewSecondaryColor3dv = NULL; +PFNGLSECONDARYCOLOR3FPROC __glewSecondaryColor3f = NULL; +PFNGLSECONDARYCOLOR3FVPROC __glewSecondaryColor3fv = NULL; +PFNGLSECONDARYCOLOR3IPROC __glewSecondaryColor3i = NULL; +PFNGLSECONDARYCOLOR3IVPROC __glewSecondaryColor3iv = NULL; +PFNGLSECONDARYCOLOR3SPROC __glewSecondaryColor3s = NULL; +PFNGLSECONDARYCOLOR3SVPROC __glewSecondaryColor3sv = NULL; +PFNGLSECONDARYCOLOR3UBPROC __glewSecondaryColor3ub = NULL; +PFNGLSECONDARYCOLOR3UBVPROC __glewSecondaryColor3ubv = NULL; +PFNGLSECONDARYCOLOR3UIPROC __glewSecondaryColor3ui = NULL; +PFNGLSECONDARYCOLOR3UIVPROC __glewSecondaryColor3uiv = NULL; +PFNGLSECONDARYCOLOR3USPROC __glewSecondaryColor3us = NULL; +PFNGLSECONDARYCOLOR3USVPROC __glewSecondaryColor3usv = NULL; +PFNGLSECONDARYCOLORPOINTERPROC __glewSecondaryColorPointer = NULL; +PFNGLWINDOWPOS2DPROC __glewWindowPos2d = NULL; +PFNGLWINDOWPOS2DVPROC __glewWindowPos2dv = NULL; +PFNGLWINDOWPOS2FPROC __glewWindowPos2f = NULL; +PFNGLWINDOWPOS2FVPROC __glewWindowPos2fv = NULL; +PFNGLWINDOWPOS2IPROC __glewWindowPos2i = NULL; +PFNGLWINDOWPOS2IVPROC __glewWindowPos2iv = NULL; +PFNGLWINDOWPOS2SPROC __glewWindowPos2s = NULL; +PFNGLWINDOWPOS2SVPROC __glewWindowPos2sv = NULL; +PFNGLWINDOWPOS3DPROC __glewWindowPos3d = NULL; +PFNGLWINDOWPOS3DVPROC __glewWindowPos3dv = NULL; +PFNGLWINDOWPOS3FPROC __glewWindowPos3f = NULL; +PFNGLWINDOWPOS3FVPROC __glewWindowPos3fv = NULL; +PFNGLWINDOWPOS3IPROC __glewWindowPos3i = NULL; +PFNGLWINDOWPOS3IVPROC __glewWindowPos3iv = NULL; +PFNGLWINDOWPOS3SPROC __glewWindowPos3s = NULL; +PFNGLWINDOWPOS3SVPROC __glewWindowPos3sv = NULL; + +PFNGLBEGINQUERYPROC __glewBeginQuery = NULL; +PFNGLBINDBUFFERPROC __glewBindBuffer = NULL; +PFNGLBUFFERDATAPROC __glewBufferData = NULL; +PFNGLBUFFERSUBDATAPROC __glewBufferSubData = NULL; +PFNGLDELETEBUFFERSPROC __glewDeleteBuffers = NULL; +PFNGLDELETEQUERIESPROC __glewDeleteQueries = NULL; +PFNGLENDQUERYPROC __glewEndQuery = NULL; +PFNGLGENBUFFERSPROC __glewGenBuffers = NULL; +PFNGLGENQUERIESPROC __glewGenQueries = NULL; +PFNGLGETBUFFERPARAMETERIVPROC __glewGetBufferParameteriv = NULL; +PFNGLGETBUFFERPOINTERVPROC __glewGetBufferPointerv = NULL; +PFNGLGETBUFFERSUBDATAPROC __glewGetBufferSubData = NULL; +PFNGLGETQUERYOBJECTIVPROC __glewGetQueryObjectiv = NULL; +PFNGLGETQUERYOBJECTUIVPROC __glewGetQueryObjectuiv = NULL; +PFNGLGETQUERYIVPROC __glewGetQueryiv = NULL; +PFNGLISBUFFERPROC __glewIsBuffer = NULL; +PFNGLISQUERYPROC __glewIsQuery = NULL; +PFNGLMAPBUFFERPROC __glewMapBuffer = NULL; +PFNGLUNMAPBUFFERPROC __glewUnmapBuffer = NULL; + +PFNGLATTACHSHADERPROC __glewAttachShader = NULL; +PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation = NULL; +PFNGLBLENDEQUATIONSEPARATEPROC __glewBlendEquationSeparate = NULL; +PFNGLCOMPILESHADERPROC __glewCompileShader = NULL; +PFNGLCREATEPROGRAMPROC __glewCreateProgram = NULL; +PFNGLCREATESHADERPROC __glewCreateShader = NULL; +PFNGLDELETEPROGRAMPROC __glewDeleteProgram = NULL; +PFNGLDELETESHADERPROC __glewDeleteShader = NULL; +PFNGLDETACHSHADERPROC __glewDetachShader = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYPROC __glewDisableVertexAttribArray = NULL; +PFNGLDRAWBUFFERSPROC __glewDrawBuffers = NULL; +PFNGLENABLEVERTEXATTRIBARRAYPROC __glewEnableVertexAttribArray = NULL; +PFNGLGETACTIVEATTRIBPROC __glewGetActiveAttrib = NULL; +PFNGLGETACTIVEUNIFORMPROC __glewGetActiveUniform = NULL; +PFNGLGETATTACHEDSHADERSPROC __glewGetAttachedShaders = NULL; +PFNGLGETATTRIBLOCATIONPROC __glewGetAttribLocation = NULL; +PFNGLGETPROGRAMINFOLOGPROC __glewGetProgramInfoLog = NULL; +PFNGLGETPROGRAMIVPROC __glewGetProgramiv = NULL; +PFNGLGETSHADERINFOLOGPROC __glewGetShaderInfoLog = NULL; +PFNGLGETSHADERSOURCEPROC __glewGetShaderSource = NULL; +PFNGLGETSHADERIVPROC __glewGetShaderiv = NULL; +PFNGLGETUNIFORMLOCATIONPROC __glewGetUniformLocation = NULL; +PFNGLGETUNIFORMFVPROC __glewGetUniformfv = NULL; +PFNGLGETUNIFORMIVPROC __glewGetUniformiv = NULL; +PFNGLGETVERTEXATTRIBPOINTERVPROC __glewGetVertexAttribPointerv = NULL; +PFNGLGETVERTEXATTRIBDVPROC __glewGetVertexAttribdv = NULL; +PFNGLGETVERTEXATTRIBFVPROC __glewGetVertexAttribfv = NULL; +PFNGLGETVERTEXATTRIBIVPROC __glewGetVertexAttribiv = NULL; +PFNGLISPROGRAMPROC __glewIsProgram = NULL; +PFNGLISSHADERPROC __glewIsShader = NULL; +PFNGLLINKPROGRAMPROC __glewLinkProgram = NULL; +PFNGLSHADERSOURCEPROC __glewShaderSource = NULL; +PFNGLSTENCILFUNCSEPARATEPROC __glewStencilFuncSeparate = NULL; +PFNGLSTENCILMASKSEPARATEPROC __glewStencilMaskSeparate = NULL; +PFNGLSTENCILOPSEPARATEPROC __glewStencilOpSeparate = NULL; +PFNGLUNIFORM1FPROC __glewUniform1f = NULL; +PFNGLUNIFORM1FVPROC __glewUniform1fv = NULL; +PFNGLUNIFORM1IPROC __glewUniform1i = NULL; +PFNGLUNIFORM1IVPROC __glewUniform1iv = NULL; +PFNGLUNIFORM2FPROC __glewUniform2f = NULL; +PFNGLUNIFORM2FVPROC __glewUniform2fv = NULL; +PFNGLUNIFORM2IPROC __glewUniform2i = NULL; +PFNGLUNIFORM2IVPROC __glewUniform2iv = NULL; +PFNGLUNIFORM3FPROC __glewUniform3f = NULL; +PFNGLUNIFORM3FVPROC __glewUniform3fv = NULL; +PFNGLUNIFORM3IPROC __glewUniform3i = NULL; +PFNGLUNIFORM3IVPROC __glewUniform3iv = NULL; +PFNGLUNIFORM4FPROC __glewUniform4f = NULL; +PFNGLUNIFORM4FVPROC __glewUniform4fv = NULL; +PFNGLUNIFORM4IPROC __glewUniform4i = NULL; +PFNGLUNIFORM4IVPROC __glewUniform4iv = NULL; +PFNGLUNIFORMMATRIX2FVPROC __glewUniformMatrix2fv = NULL; +PFNGLUNIFORMMATRIX3FVPROC __glewUniformMatrix3fv = NULL; +PFNGLUNIFORMMATRIX4FVPROC __glewUniformMatrix4fv = NULL; +PFNGLUSEPROGRAMPROC __glewUseProgram = NULL; +PFNGLVALIDATEPROGRAMPROC __glewValidateProgram = NULL; +PFNGLVERTEXATTRIB1DPROC __glewVertexAttrib1d = NULL; +PFNGLVERTEXATTRIB1DVPROC __glewVertexAttrib1dv = NULL; +PFNGLVERTEXATTRIB1FPROC __glewVertexAttrib1f = NULL; +PFNGLVERTEXATTRIB1FVPROC __glewVertexAttrib1fv = NULL; +PFNGLVERTEXATTRIB1SPROC __glewVertexAttrib1s = NULL; +PFNGLVERTEXATTRIB1SVPROC __glewVertexAttrib1sv = NULL; +PFNGLVERTEXATTRIB2DPROC __glewVertexAttrib2d = NULL; +PFNGLVERTEXATTRIB2DVPROC __glewVertexAttrib2dv = NULL; +PFNGLVERTEXATTRIB2FPROC __glewVertexAttrib2f = NULL; +PFNGLVERTEXATTRIB2FVPROC __glewVertexAttrib2fv = NULL; +PFNGLVERTEXATTRIB2SPROC __glewVertexAttrib2s = NULL; +PFNGLVERTEXATTRIB2SVPROC __glewVertexAttrib2sv = NULL; +PFNGLVERTEXATTRIB3DPROC __glewVertexAttrib3d = NULL; +PFNGLVERTEXATTRIB3DVPROC __glewVertexAttrib3dv = NULL; +PFNGLVERTEXATTRIB3FPROC __glewVertexAttrib3f = NULL; +PFNGLVERTEXATTRIB3FVPROC __glewVertexAttrib3fv = NULL; +PFNGLVERTEXATTRIB3SPROC __glewVertexAttrib3s = NULL; +PFNGLVERTEXATTRIB3SVPROC __glewVertexAttrib3sv = NULL; +PFNGLVERTEXATTRIB4NBVPROC __glewVertexAttrib4Nbv = NULL; +PFNGLVERTEXATTRIB4NIVPROC __glewVertexAttrib4Niv = NULL; +PFNGLVERTEXATTRIB4NSVPROC __glewVertexAttrib4Nsv = NULL; +PFNGLVERTEXATTRIB4NUBPROC __glewVertexAttrib4Nub = NULL; +PFNGLVERTEXATTRIB4NUBVPROC __glewVertexAttrib4Nubv = NULL; +PFNGLVERTEXATTRIB4NUIVPROC __glewVertexAttrib4Nuiv = NULL; +PFNGLVERTEXATTRIB4NUSVPROC __glewVertexAttrib4Nusv = NULL; +PFNGLVERTEXATTRIB4BVPROC __glewVertexAttrib4bv = NULL; +PFNGLVERTEXATTRIB4DPROC __glewVertexAttrib4d = NULL; +PFNGLVERTEXATTRIB4DVPROC __glewVertexAttrib4dv = NULL; +PFNGLVERTEXATTRIB4FPROC __glewVertexAttrib4f = NULL; +PFNGLVERTEXATTRIB4FVPROC __glewVertexAttrib4fv = NULL; +PFNGLVERTEXATTRIB4IVPROC __glewVertexAttrib4iv = NULL; +PFNGLVERTEXATTRIB4SPROC __glewVertexAttrib4s = NULL; +PFNGLVERTEXATTRIB4SVPROC __glewVertexAttrib4sv = NULL; +PFNGLVERTEXATTRIB4UBVPROC __glewVertexAttrib4ubv = NULL; +PFNGLVERTEXATTRIB4UIVPROC __glewVertexAttrib4uiv = NULL; +PFNGLVERTEXATTRIB4USVPROC __glewVertexAttrib4usv = NULL; +PFNGLVERTEXATTRIBPOINTERPROC __glewVertexAttribPointer = NULL; + +PFNGLUNIFORMMATRIX2X3FVPROC __glewUniformMatrix2x3fv = NULL; +PFNGLUNIFORMMATRIX2X4FVPROC __glewUniformMatrix2x4fv = NULL; +PFNGLUNIFORMMATRIX3X2FVPROC __glewUniformMatrix3x2fv = NULL; +PFNGLUNIFORMMATRIX3X4FVPROC __glewUniformMatrix3x4fv = NULL; +PFNGLUNIFORMMATRIX4X2FVPROC __glewUniformMatrix4x2fv = NULL; +PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv = NULL; + +PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender = NULL; +PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback = NULL; +PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation = NULL; +PFNGLCLAMPCOLORPROC __glewClampColor = NULL; +PFNGLCLEARBUFFERFIPROC __glewClearBufferfi = NULL; +PFNGLCLEARBUFFERFVPROC __glewClearBufferfv = NULL; +PFNGLCLEARBUFFERIVPROC __glewClearBufferiv = NULL; +PFNGLCLEARBUFFERUIVPROC __glewClearBufferuiv = NULL; +PFNGLCOLORMASKIPROC __glewColorMaski = NULL; +PFNGLDISABLEIPROC __glewDisablei = NULL; +PFNGLENABLEIPROC __glewEnablei = NULL; +PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender = NULL; +PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback = NULL; +PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v = NULL; +PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation = NULL; +PFNGLGETSTRINGIPROC __glewGetStringi = NULL; +PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv = NULL; +PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGPROC __glewGetTransformFeedbackVarying = NULL; +PFNGLGETUNIFORMUIVPROC __glewGetUniformuiv = NULL; +PFNGLGETVERTEXATTRIBIIVPROC __glewGetVertexAttribIiv = NULL; +PFNGLGETVERTEXATTRIBIUIVPROC __glewGetVertexAttribIuiv = NULL; +PFNGLISENABLEDIPROC __glewIsEnabledi = NULL; +PFNGLTEXPARAMETERIIVPROC __glewTexParameterIiv = NULL; +PFNGLTEXPARAMETERIUIVPROC __glewTexParameterIuiv = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSPROC __glewTransformFeedbackVaryings = NULL; +PFNGLUNIFORM1UIPROC __glewUniform1ui = NULL; +PFNGLUNIFORM1UIVPROC __glewUniform1uiv = NULL; +PFNGLUNIFORM2UIPROC __glewUniform2ui = NULL; +PFNGLUNIFORM2UIVPROC __glewUniform2uiv = NULL; +PFNGLUNIFORM3UIPROC __glewUniform3ui = NULL; +PFNGLUNIFORM3UIVPROC __glewUniform3uiv = NULL; +PFNGLUNIFORM4UIPROC __glewUniform4ui = NULL; +PFNGLUNIFORM4UIVPROC __glewUniform4uiv = NULL; +PFNGLVERTEXATTRIBI1IPROC __glewVertexAttribI1i = NULL; +PFNGLVERTEXATTRIBI1IVPROC __glewVertexAttribI1iv = NULL; +PFNGLVERTEXATTRIBI1UIPROC __glewVertexAttribI1ui = NULL; +PFNGLVERTEXATTRIBI1UIVPROC __glewVertexAttribI1uiv = NULL; +PFNGLVERTEXATTRIBI2IPROC __glewVertexAttribI2i = NULL; +PFNGLVERTEXATTRIBI2IVPROC __glewVertexAttribI2iv = NULL; +PFNGLVERTEXATTRIBI2UIPROC __glewVertexAttribI2ui = NULL; +PFNGLVERTEXATTRIBI2UIVPROC __glewVertexAttribI2uiv = NULL; +PFNGLVERTEXATTRIBI3IPROC __glewVertexAttribI3i = NULL; +PFNGLVERTEXATTRIBI3IVPROC __glewVertexAttribI3iv = NULL; +PFNGLVERTEXATTRIBI3UIPROC __glewVertexAttribI3ui = NULL; +PFNGLVERTEXATTRIBI3UIVPROC __glewVertexAttribI3uiv = NULL; +PFNGLVERTEXATTRIBI4BVPROC __glewVertexAttribI4bv = NULL; +PFNGLVERTEXATTRIBI4IPROC __glewVertexAttribI4i = NULL; +PFNGLVERTEXATTRIBI4IVPROC __glewVertexAttribI4iv = NULL; +PFNGLVERTEXATTRIBI4SVPROC __glewVertexAttribI4sv = NULL; +PFNGLVERTEXATTRIBI4UBVPROC __glewVertexAttribI4ubv = NULL; +PFNGLVERTEXATTRIBI4UIPROC __glewVertexAttribI4ui = NULL; +PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv = NULL; +PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv = NULL; +PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer = NULL; + +PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced = NULL; +PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced = NULL; +PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex = NULL; +PFNGLTEXBUFFERPROC __glewTexBuffer = NULL; + +PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture = NULL; +PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v = NULL; +PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v = NULL; + +PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor = NULL; + +PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei = NULL; +PFNGLBLENDEQUATIONIPROC __glewBlendEquationi = NULL; +PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei = NULL; +PFNGLBLENDFUNCIPROC __glewBlendFunci = NULL; +PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading = NULL; + +PFNGLGETGRAPHICSRESETSTATUSPROC __glewGetGraphicsResetStatus = NULL; +PFNGLGETNCOMPRESSEDTEXIMAGEPROC __glewGetnCompressedTexImage = NULL; +PFNGLGETNTEXIMAGEPROC __glewGetnTexImage = NULL; +PFNGLGETNUNIFORMDVPROC __glewGetnUniformdv = NULL; + +PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX = NULL; + +PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD = NULL; +PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD = NULL; +PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD = NULL; +PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD = NULL; + +PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD = NULL; +PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD = NULL; +PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD = NULL; +PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD = NULL; + +PFNGLVERTEXATTRIBPARAMETERIAMDPROC __glewVertexAttribParameteriAMD = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC __glewMultiDrawArraysIndirectAMD = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC __glewMultiDrawElementsIndirectAMD = NULL; + +PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD = NULL; +PFNGLGENNAMESAMDPROC __glewGenNamesAMD = NULL; +PFNGLISNAMEAMDPROC __glewIsNameAMD = NULL; + +PFNGLQUERYOBJECTPARAMETERUIAMDPROC __glewQueryObjectParameteruiAMD = NULL; + +PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD = NULL; +PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD = NULL; +PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD = NULL; +PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD = NULL; +PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD = NULL; +PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD = NULL; +PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD = NULL; +PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD = NULL; +PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD = NULL; +PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD = NULL; +PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD = NULL; + +PFNGLSETMULTISAMPLEFVAMDPROC __glewSetMultisamplefvAMD = NULL; + +PFNGLTEXSTORAGESPARSEAMDPROC __glewTexStorageSparseAMD = NULL; +PFNGLTEXTURESTORAGESPARSEAMDPROC __glewTextureStorageSparseAMD = NULL; + +PFNGLSTENCILOPVALUEAMDPROC __glewStencilOpValueAMD = NULL; + +PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD = NULL; +PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD = NULL; + +PFNGLBLITFRAMEBUFFERANGLEPROC __glewBlitFramebufferANGLE = NULL; + +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC __glewRenderbufferStorageMultisampleANGLE = NULL; + +PFNGLDRAWARRAYSINSTANCEDANGLEPROC __glewDrawArraysInstancedANGLE = NULL; +PFNGLDRAWELEMENTSINSTANCEDANGLEPROC __glewDrawElementsInstancedANGLE = NULL; +PFNGLVERTEXATTRIBDIVISORANGLEPROC __glewVertexAttribDivisorANGLE = NULL; + +PFNGLBEGINQUERYANGLEPROC __glewBeginQueryANGLE = NULL; +PFNGLDELETEQUERIESANGLEPROC __glewDeleteQueriesANGLE = NULL; +PFNGLENDQUERYANGLEPROC __glewEndQueryANGLE = NULL; +PFNGLGENQUERIESANGLEPROC __glewGenQueriesANGLE = NULL; +PFNGLGETQUERYOBJECTI64VANGLEPROC __glewGetQueryObjecti64vANGLE = NULL; +PFNGLGETQUERYOBJECTIVANGLEPROC __glewGetQueryObjectivANGLE = NULL; +PFNGLGETQUERYOBJECTUI64VANGLEPROC __glewGetQueryObjectui64vANGLE = NULL; +PFNGLGETQUERYOBJECTUIVANGLEPROC __glewGetQueryObjectuivANGLE = NULL; +PFNGLGETQUERYIVANGLEPROC __glewGetQueryivANGLE = NULL; +PFNGLISQUERYANGLEPROC __glewIsQueryANGLE = NULL; +PFNGLQUERYCOUNTERANGLEPROC __glewQueryCounterANGLE = NULL; + +PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC __glewGetTranslatedShaderSourceANGLE = NULL; + +PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL; +PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL; +PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL; +PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC __glewMultiDrawElementArrayAPPLE = NULL; +PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC __glewMultiDrawRangeElementArrayAPPLE = NULL; + +PFNGLDELETEFENCESAPPLEPROC __glewDeleteFencesAPPLE = NULL; +PFNGLFINISHFENCEAPPLEPROC __glewFinishFenceAPPLE = NULL; +PFNGLFINISHOBJECTAPPLEPROC __glewFinishObjectAPPLE = NULL; +PFNGLGENFENCESAPPLEPROC __glewGenFencesAPPLE = NULL; +PFNGLISFENCEAPPLEPROC __glewIsFenceAPPLE = NULL; +PFNGLSETFENCEAPPLEPROC __glewSetFenceAPPLE = NULL; +PFNGLTESTFENCEAPPLEPROC __glewTestFenceAPPLE = NULL; +PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE = NULL; + +PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE = NULL; + +PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE = NULL; +PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE = NULL; +PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE = NULL; + +PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE = NULL; +PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE = NULL; + +PFNGLBINDVERTEXARRAYAPPLEPROC __glewBindVertexArrayAPPLE = NULL; +PFNGLDELETEVERTEXARRAYSAPPLEPROC __glewDeleteVertexArraysAPPLE = NULL; +PFNGLGENVERTEXARRAYSAPPLEPROC __glewGenVertexArraysAPPLE = NULL; +PFNGLISVERTEXARRAYAPPLEPROC __glewIsVertexArrayAPPLE = NULL; + +PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE = NULL; +PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE = NULL; +PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE = NULL; + +PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE = NULL; +PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE = NULL; +PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE = NULL; +PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE = NULL; +PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE = NULL; +PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE = NULL; +PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE = NULL; + +PFNGLCLEARDEPTHFPROC __glewClearDepthf = NULL; +PFNGLDEPTHRANGEFPROC __glewDepthRangef = NULL; +PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat = NULL; +PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler = NULL; +PFNGLSHADERBINARYPROC __glewShaderBinary = NULL; + +PFNGLMEMORYBARRIERBYREGIONPROC __glewMemoryBarrierByRegion = NULL; + +PFNGLPRIMITIVEBOUNDINGBOXARBPROC __glewPrimitiveBoundingBoxARB = NULL; + +PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC __glewDrawArraysInstancedBaseInstance = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC __glewDrawElementsInstancedBaseInstance = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC __glewDrawElementsInstancedBaseVertexBaseInstance = NULL; + +PFNGLGETIMAGEHANDLEARBPROC __glewGetImageHandleARB = NULL; +PFNGLGETTEXTUREHANDLEARBPROC __glewGetTextureHandleARB = NULL; +PFNGLGETTEXTURESAMPLERHANDLEARBPROC __glewGetTextureSamplerHandleARB = NULL; +PFNGLGETVERTEXATTRIBLUI64VARBPROC __glewGetVertexAttribLui64vARB = NULL; +PFNGLISIMAGEHANDLERESIDENTARBPROC __glewIsImageHandleResidentARB = NULL; +PFNGLISTEXTUREHANDLERESIDENTARBPROC __glewIsTextureHandleResidentARB = NULL; +PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC __glewMakeImageHandleNonResidentARB = NULL; +PFNGLMAKEIMAGEHANDLERESIDENTARBPROC __glewMakeImageHandleResidentARB = NULL; +PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC __glewMakeTextureHandleNonResidentARB = NULL; +PFNGLMAKETEXTUREHANDLERESIDENTARBPROC __glewMakeTextureHandleResidentARB = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC __glewProgramUniformHandleui64ARB = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC __glewProgramUniformHandleui64vARB = NULL; +PFNGLUNIFORMHANDLEUI64ARBPROC __glewUniformHandleui64ARB = NULL; +PFNGLUNIFORMHANDLEUI64VARBPROC __glewUniformHandleui64vARB = NULL; +PFNGLVERTEXATTRIBL1UI64ARBPROC __glewVertexAttribL1ui64ARB = NULL; +PFNGLVERTEXATTRIBL1UI64VARBPROC __glewVertexAttribL1ui64vARB = NULL; + +PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed = NULL; +PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex = NULL; + +PFNGLBUFFERSTORAGEPROC __glewBufferStorage = NULL; +PFNGLNAMEDBUFFERSTORAGEEXTPROC __glewNamedBufferStorageEXT = NULL; + +PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB = NULL; + +PFNGLCLEARBUFFERDATAPROC __glewClearBufferData = NULL; +PFNGLCLEARBUFFERSUBDATAPROC __glewClearBufferSubData = NULL; +PFNGLCLEARNAMEDBUFFERDATAEXTPROC __glewClearNamedBufferDataEXT = NULL; +PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC __glewClearNamedBufferSubDataEXT = NULL; + +PFNGLCLEARTEXIMAGEPROC __glewClearTexImage = NULL; +PFNGLCLEARTEXSUBIMAGEPROC __glewClearTexSubImage = NULL; + +PFNGLCLIPCONTROLPROC __glewClipControl = NULL; + +PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL; + +PFNGLDISPATCHCOMPUTEPROC __glewDispatchCompute = NULL; +PFNGLDISPATCHCOMPUTEINDIRECTPROC __glewDispatchComputeIndirect = NULL; + +PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC __glewDispatchComputeGroupSizeARB = NULL; + +PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData = NULL; + +PFNGLCOPYIMAGESUBDATAPROC __glewCopyImageSubData = NULL; + +PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB = NULL; +PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB = NULL; +PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB = NULL; +PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB = NULL; + +PFNGLBINDTEXTUREUNITPROC __glewBindTextureUnit = NULL; +PFNGLBLITNAMEDFRAMEBUFFERPROC __glewBlitNamedFramebuffer = NULL; +PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC __glewCheckNamedFramebufferStatus = NULL; +PFNGLCLEARNAMEDBUFFERDATAPROC __glewClearNamedBufferData = NULL; +PFNGLCLEARNAMEDBUFFERSUBDATAPROC __glewClearNamedBufferSubData = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERFIPROC __glewClearNamedFramebufferfi = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERFVPROC __glewClearNamedFramebufferfv = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERIVPROC __glewClearNamedFramebufferiv = NULL; +PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC __glewClearNamedFramebufferuiv = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC __glewCompressedTextureSubImage1D = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC __glewCompressedTextureSubImage2D = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC __glewCompressedTextureSubImage3D = NULL; +PFNGLCOPYNAMEDBUFFERSUBDATAPROC __glewCopyNamedBufferSubData = NULL; +PFNGLCOPYTEXTURESUBIMAGE1DPROC __glewCopyTextureSubImage1D = NULL; +PFNGLCOPYTEXTURESUBIMAGE2DPROC __glewCopyTextureSubImage2D = NULL; +PFNGLCOPYTEXTURESUBIMAGE3DPROC __glewCopyTextureSubImage3D = NULL; +PFNGLCREATEBUFFERSPROC __glewCreateBuffers = NULL; +PFNGLCREATEFRAMEBUFFERSPROC __glewCreateFramebuffers = NULL; +PFNGLCREATEPROGRAMPIPELINESPROC __glewCreateProgramPipelines = NULL; +PFNGLCREATEQUERIESPROC __glewCreateQueries = NULL; +PFNGLCREATERENDERBUFFERSPROC __glewCreateRenderbuffers = NULL; +PFNGLCREATESAMPLERSPROC __glewCreateSamplers = NULL; +PFNGLCREATETEXTURESPROC __glewCreateTextures = NULL; +PFNGLCREATETRANSFORMFEEDBACKSPROC __glewCreateTransformFeedbacks = NULL; +PFNGLCREATEVERTEXARRAYSPROC __glewCreateVertexArrays = NULL; +PFNGLDISABLEVERTEXARRAYATTRIBPROC __glewDisableVertexArrayAttrib = NULL; +PFNGLENABLEVERTEXARRAYATTRIBPROC __glewEnableVertexArrayAttrib = NULL; +PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC __glewFlushMappedNamedBufferRange = NULL; +PFNGLGENERATETEXTUREMIPMAPPROC __glewGenerateTextureMipmap = NULL; +PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC __glewGetCompressedTextureImage = NULL; +PFNGLGETNAMEDBUFFERPARAMETERI64VPROC __glewGetNamedBufferParameteri64v = NULL; +PFNGLGETNAMEDBUFFERPARAMETERIVPROC __glewGetNamedBufferParameteriv = NULL; +PFNGLGETNAMEDBUFFERPOINTERVPROC __glewGetNamedBufferPointerv = NULL; +PFNGLGETNAMEDBUFFERSUBDATAPROC __glewGetNamedBufferSubData = NULL; +PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetNamedFramebufferAttachmentParameteriv = NULL; +PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC __glewGetNamedFramebufferParameteriv = NULL; +PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC __glewGetNamedRenderbufferParameteriv = NULL; +PFNGLGETQUERYBUFFEROBJECTI64VPROC __glewGetQueryBufferObjecti64v = NULL; +PFNGLGETQUERYBUFFEROBJECTIVPROC __glewGetQueryBufferObjectiv = NULL; +PFNGLGETQUERYBUFFEROBJECTUI64VPROC __glewGetQueryBufferObjectui64v = NULL; +PFNGLGETQUERYBUFFEROBJECTUIVPROC __glewGetQueryBufferObjectuiv = NULL; +PFNGLGETTEXTUREIMAGEPROC __glewGetTextureImage = NULL; +PFNGLGETTEXTURELEVELPARAMETERFVPROC __glewGetTextureLevelParameterfv = NULL; +PFNGLGETTEXTURELEVELPARAMETERIVPROC __glewGetTextureLevelParameteriv = NULL; +PFNGLGETTEXTUREPARAMETERIIVPROC __glewGetTextureParameterIiv = NULL; +PFNGLGETTEXTUREPARAMETERIUIVPROC __glewGetTextureParameterIuiv = NULL; +PFNGLGETTEXTUREPARAMETERFVPROC __glewGetTextureParameterfv = NULL; +PFNGLGETTEXTUREPARAMETERIVPROC __glewGetTextureParameteriv = NULL; +PFNGLGETTRANSFORMFEEDBACKI64_VPROC __glewGetTransformFeedbacki64_v = NULL; +PFNGLGETTRANSFORMFEEDBACKI_VPROC __glewGetTransformFeedbacki_v = NULL; +PFNGLGETTRANSFORMFEEDBACKIVPROC __glewGetTransformFeedbackiv = NULL; +PFNGLGETVERTEXARRAYINDEXED64IVPROC __glewGetVertexArrayIndexed64iv = NULL; +PFNGLGETVERTEXARRAYINDEXEDIVPROC __glewGetVertexArrayIndexediv = NULL; +PFNGLGETVERTEXARRAYIVPROC __glewGetVertexArrayiv = NULL; +PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC __glewInvalidateNamedFramebufferData = NULL; +PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC __glewInvalidateNamedFramebufferSubData = NULL; +PFNGLMAPNAMEDBUFFERPROC __glewMapNamedBuffer = NULL; +PFNGLMAPNAMEDBUFFERRANGEPROC __glewMapNamedBufferRange = NULL; +PFNGLNAMEDBUFFERDATAPROC __glewNamedBufferData = NULL; +PFNGLNAMEDBUFFERSTORAGEPROC __glewNamedBufferStorage = NULL; +PFNGLNAMEDBUFFERSUBDATAPROC __glewNamedBufferSubData = NULL; +PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC __glewNamedFramebufferDrawBuffer = NULL; +PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC __glewNamedFramebufferDrawBuffers = NULL; +PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC __glewNamedFramebufferParameteri = NULL; +PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC __glewNamedFramebufferReadBuffer = NULL; +PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC __glewNamedFramebufferRenderbuffer = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTUREPROC __glewNamedFramebufferTexture = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC __glewNamedFramebufferTextureLayer = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEPROC __glewNamedRenderbufferStorage = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewNamedRenderbufferStorageMultisample = NULL; +PFNGLTEXTUREBUFFERPROC __glewTextureBuffer = NULL; +PFNGLTEXTUREBUFFERRANGEPROC __glewTextureBufferRange = NULL; +PFNGLTEXTUREPARAMETERIIVPROC __glewTextureParameterIiv = NULL; +PFNGLTEXTUREPARAMETERIUIVPROC __glewTextureParameterIuiv = NULL; +PFNGLTEXTUREPARAMETERFPROC __glewTextureParameterf = NULL; +PFNGLTEXTUREPARAMETERFVPROC __glewTextureParameterfv = NULL; +PFNGLTEXTUREPARAMETERIPROC __glewTextureParameteri = NULL; +PFNGLTEXTUREPARAMETERIVPROC __glewTextureParameteriv = NULL; +PFNGLTEXTURESTORAGE1DPROC __glewTextureStorage1D = NULL; +PFNGLTEXTURESTORAGE2DPROC __glewTextureStorage2D = NULL; +PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC __glewTextureStorage2DMultisample = NULL; +PFNGLTEXTURESTORAGE3DPROC __glewTextureStorage3D = NULL; +PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC __glewTextureStorage3DMultisample = NULL; +PFNGLTEXTURESUBIMAGE1DPROC __glewTextureSubImage1D = NULL; +PFNGLTEXTURESUBIMAGE2DPROC __glewTextureSubImage2D = NULL; +PFNGLTEXTURESUBIMAGE3DPROC __glewTextureSubImage3D = NULL; +PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC __glewTransformFeedbackBufferBase = NULL; +PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC __glewTransformFeedbackBufferRange = NULL; +PFNGLUNMAPNAMEDBUFFERPROC __glewUnmapNamedBuffer = NULL; +PFNGLVERTEXARRAYATTRIBBINDINGPROC __glewVertexArrayAttribBinding = NULL; +PFNGLVERTEXARRAYATTRIBFORMATPROC __glewVertexArrayAttribFormat = NULL; +PFNGLVERTEXARRAYATTRIBIFORMATPROC __glewVertexArrayAttribIFormat = NULL; +PFNGLVERTEXARRAYATTRIBLFORMATPROC __glewVertexArrayAttribLFormat = NULL; +PFNGLVERTEXARRAYBINDINGDIVISORPROC __glewVertexArrayBindingDivisor = NULL; +PFNGLVERTEXARRAYELEMENTBUFFERPROC __glewVertexArrayElementBuffer = NULL; +PFNGLVERTEXARRAYVERTEXBUFFERPROC __glewVertexArrayVertexBuffer = NULL; +PFNGLVERTEXARRAYVERTEXBUFFERSPROC __glewVertexArrayVertexBuffers = NULL; + +PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB = NULL; + +PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB = NULL; +PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB = NULL; +PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB = NULL; +PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB = NULL; + +PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex = NULL; +PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex = NULL; +PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex = NULL; + +PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect = NULL; +PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect = NULL; + +PFNGLFRAMEBUFFERPARAMETERIPROC __glewFramebufferParameteri = NULL; +PFNGLGETFRAMEBUFFERPARAMETERIVPROC __glewGetFramebufferParameteriv = NULL; +PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC __glewGetNamedFramebufferParameterivEXT = NULL; +PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC __glewNamedFramebufferParameteriEXT = NULL; + +PFNGLBINDFRAMEBUFFERPROC __glewBindFramebuffer = NULL; +PFNGLBINDRENDERBUFFERPROC __glewBindRenderbuffer = NULL; +PFNGLBLITFRAMEBUFFERPROC __glewBlitFramebuffer = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus = NULL; +PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers = NULL; +PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers = NULL; +PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer = NULL; +PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D = NULL; +PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D = NULL; +PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL; +PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers = NULL; +PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers = NULL; +PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC __glewGetFramebufferAttachmentParameteriv = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVPROC __glewGetRenderbufferParameteriv = NULL; +PFNGLISFRAMEBUFFERPROC __glewIsFramebuffer = NULL; +PFNGLISRENDERBUFFERPROC __glewIsRenderbuffer = NULL; +PFNGLRENDERBUFFERSTORAGEPROC __glewRenderbufferStorage = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC __glewRenderbufferStorageMultisample = NULL; + +PFNGLFRAMEBUFFERTEXTUREARBPROC __glewFramebufferTextureARB = NULL; +PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB = NULL; +PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB = NULL; + +PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary = NULL; +PFNGLPROGRAMBINARYPROC __glewProgramBinary = NULL; +PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri = NULL; + +PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC __glewGetCompressedTextureSubImage = NULL; +PFNGLGETTEXTURESUBIMAGEPROC __glewGetTextureSubImage = NULL; + +PFNGLGETUNIFORMDVPROC __glewGetUniformdv = NULL; +PFNGLUNIFORM1DPROC __glewUniform1d = NULL; +PFNGLUNIFORM1DVPROC __glewUniform1dv = NULL; +PFNGLUNIFORM2DPROC __glewUniform2d = NULL; +PFNGLUNIFORM2DVPROC __glewUniform2dv = NULL; +PFNGLUNIFORM3DPROC __glewUniform3d = NULL; +PFNGLUNIFORM3DVPROC __glewUniform3dv = NULL; +PFNGLUNIFORM4DPROC __glewUniform4d = NULL; +PFNGLUNIFORM4DVPROC __glewUniform4dv = NULL; +PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv = NULL; +PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv = NULL; +PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv = NULL; +PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv = NULL; +PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv = NULL; +PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv = NULL; +PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv = NULL; +PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv = NULL; +PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv = NULL; + +PFNGLGETUNIFORMI64VARBPROC __glewGetUniformi64vARB = NULL; +PFNGLGETUNIFORMUI64VARBPROC __glewGetUniformui64vARB = NULL; +PFNGLGETNUNIFORMI64VARBPROC __glewGetnUniformi64vARB = NULL; +PFNGLGETNUNIFORMUI64VARBPROC __glewGetnUniformui64vARB = NULL; +PFNGLPROGRAMUNIFORM1I64ARBPROC __glewProgramUniform1i64ARB = NULL; +PFNGLPROGRAMUNIFORM1I64VARBPROC __glewProgramUniform1i64vARB = NULL; +PFNGLPROGRAMUNIFORM1UI64ARBPROC __glewProgramUniform1ui64ARB = NULL; +PFNGLPROGRAMUNIFORM1UI64VARBPROC __glewProgramUniform1ui64vARB = NULL; +PFNGLPROGRAMUNIFORM2I64ARBPROC __glewProgramUniform2i64ARB = NULL; +PFNGLPROGRAMUNIFORM2I64VARBPROC __glewProgramUniform2i64vARB = NULL; +PFNGLPROGRAMUNIFORM2UI64ARBPROC __glewProgramUniform2ui64ARB = NULL; +PFNGLPROGRAMUNIFORM2UI64VARBPROC __glewProgramUniform2ui64vARB = NULL; +PFNGLPROGRAMUNIFORM3I64ARBPROC __glewProgramUniform3i64ARB = NULL; +PFNGLPROGRAMUNIFORM3I64VARBPROC __glewProgramUniform3i64vARB = NULL; +PFNGLPROGRAMUNIFORM3UI64ARBPROC __glewProgramUniform3ui64ARB = NULL; +PFNGLPROGRAMUNIFORM3UI64VARBPROC __glewProgramUniform3ui64vARB = NULL; +PFNGLPROGRAMUNIFORM4I64ARBPROC __glewProgramUniform4i64ARB = NULL; +PFNGLPROGRAMUNIFORM4I64VARBPROC __glewProgramUniform4i64vARB = NULL; +PFNGLPROGRAMUNIFORM4UI64ARBPROC __glewProgramUniform4ui64ARB = NULL; +PFNGLPROGRAMUNIFORM4UI64VARBPROC __glewProgramUniform4ui64vARB = NULL; +PFNGLUNIFORM1I64ARBPROC __glewUniform1i64ARB = NULL; +PFNGLUNIFORM1I64VARBPROC __glewUniform1i64vARB = NULL; +PFNGLUNIFORM1UI64ARBPROC __glewUniform1ui64ARB = NULL; +PFNGLUNIFORM1UI64VARBPROC __glewUniform1ui64vARB = NULL; +PFNGLUNIFORM2I64ARBPROC __glewUniform2i64ARB = NULL; +PFNGLUNIFORM2I64VARBPROC __glewUniform2i64vARB = NULL; +PFNGLUNIFORM2UI64ARBPROC __glewUniform2ui64ARB = NULL; +PFNGLUNIFORM2UI64VARBPROC __glewUniform2ui64vARB = NULL; +PFNGLUNIFORM3I64ARBPROC __glewUniform3i64ARB = NULL; +PFNGLUNIFORM3I64VARBPROC __glewUniform3i64vARB = NULL; +PFNGLUNIFORM3UI64ARBPROC __glewUniform3ui64ARB = NULL; +PFNGLUNIFORM3UI64VARBPROC __glewUniform3ui64vARB = NULL; +PFNGLUNIFORM4I64ARBPROC __glewUniform4i64ARB = NULL; +PFNGLUNIFORM4I64VARBPROC __glewUniform4i64vARB = NULL; +PFNGLUNIFORM4UI64ARBPROC __glewUniform4ui64ARB = NULL; +PFNGLUNIFORM4UI64VARBPROC __glewUniform4ui64vARB = NULL; + +PFNGLCOLORSUBTABLEPROC __glewColorSubTable = NULL; +PFNGLCOLORTABLEPROC __glewColorTable = NULL; +PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv = NULL; +PFNGLCOLORTABLEPARAMETERIVPROC __glewColorTableParameteriv = NULL; +PFNGLCONVOLUTIONFILTER1DPROC __glewConvolutionFilter1D = NULL; +PFNGLCONVOLUTIONFILTER2DPROC __glewConvolutionFilter2D = NULL; +PFNGLCONVOLUTIONPARAMETERFPROC __glewConvolutionParameterf = NULL; +PFNGLCONVOLUTIONPARAMETERFVPROC __glewConvolutionParameterfv = NULL; +PFNGLCONVOLUTIONPARAMETERIPROC __glewConvolutionParameteri = NULL; +PFNGLCONVOLUTIONPARAMETERIVPROC __glewConvolutionParameteriv = NULL; +PFNGLCOPYCOLORSUBTABLEPROC __glewCopyColorSubTable = NULL; +PFNGLCOPYCOLORTABLEPROC __glewCopyColorTable = NULL; +PFNGLCOPYCONVOLUTIONFILTER1DPROC __glewCopyConvolutionFilter1D = NULL; +PFNGLCOPYCONVOLUTIONFILTER2DPROC __glewCopyConvolutionFilter2D = NULL; +PFNGLGETCOLORTABLEPROC __glewGetColorTable = NULL; +PFNGLGETCOLORTABLEPARAMETERFVPROC __glewGetColorTableParameterfv = NULL; +PFNGLGETCOLORTABLEPARAMETERIVPROC __glewGetColorTableParameteriv = NULL; +PFNGLGETCONVOLUTIONFILTERPROC __glewGetConvolutionFilter = NULL; +PFNGLGETCONVOLUTIONPARAMETERFVPROC __glewGetConvolutionParameterfv = NULL; +PFNGLGETCONVOLUTIONPARAMETERIVPROC __glewGetConvolutionParameteriv = NULL; +PFNGLGETHISTOGRAMPROC __glewGetHistogram = NULL; +PFNGLGETHISTOGRAMPARAMETERFVPROC __glewGetHistogramParameterfv = NULL; +PFNGLGETHISTOGRAMPARAMETERIVPROC __glewGetHistogramParameteriv = NULL; +PFNGLGETMINMAXPROC __glewGetMinmax = NULL; +PFNGLGETMINMAXPARAMETERFVPROC __glewGetMinmaxParameterfv = NULL; +PFNGLGETMINMAXPARAMETERIVPROC __glewGetMinmaxParameteriv = NULL; +PFNGLGETSEPARABLEFILTERPROC __glewGetSeparableFilter = NULL; +PFNGLHISTOGRAMPROC __glewHistogram = NULL; +PFNGLMINMAXPROC __glewMinmax = NULL; +PFNGLRESETHISTOGRAMPROC __glewResetHistogram = NULL; +PFNGLRESETMINMAXPROC __glewResetMinmax = NULL; +PFNGLSEPARABLEFILTER2DPROC __glewSeparableFilter2D = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC __glewMultiDrawArraysIndirectCountARB = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC __glewMultiDrawElementsIndirectCountARB = NULL; + +PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB = NULL; +PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB = NULL; +PFNGLVERTEXATTRIBDIVISORARBPROC __glewVertexAttribDivisorARB = NULL; + +PFNGLGETINTERNALFORMATIVPROC __glewGetInternalformativ = NULL; + +PFNGLGETINTERNALFORMATI64VPROC __glewGetInternalformati64v = NULL; + +PFNGLINVALIDATEBUFFERDATAPROC __glewInvalidateBufferData = NULL; +PFNGLINVALIDATEBUFFERSUBDATAPROC __glewInvalidateBufferSubData = NULL; +PFNGLINVALIDATEFRAMEBUFFERPROC __glewInvalidateFramebuffer = NULL; +PFNGLINVALIDATESUBFRAMEBUFFERPROC __glewInvalidateSubFramebuffer = NULL; +PFNGLINVALIDATETEXIMAGEPROC __glewInvalidateTexImage = NULL; +PFNGLINVALIDATETEXSUBIMAGEPROC __glewInvalidateTexSubImage = NULL; + +PFNGLFLUSHMAPPEDBUFFERRANGEPROC __glewFlushMappedBufferRange = NULL; +PFNGLMAPBUFFERRANGEPROC __glewMapBufferRange = NULL; + +PFNGLCURRENTPALETTEMATRIXARBPROC __glewCurrentPaletteMatrixARB = NULL; +PFNGLMATRIXINDEXPOINTERARBPROC __glewMatrixIndexPointerARB = NULL; +PFNGLMATRIXINDEXUBVARBPROC __glewMatrixIndexubvARB = NULL; +PFNGLMATRIXINDEXUIVARBPROC __glewMatrixIndexuivARB = NULL; +PFNGLMATRIXINDEXUSVARBPROC __glewMatrixIndexusvARB = NULL; + +PFNGLBINDBUFFERSBASEPROC __glewBindBuffersBase = NULL; +PFNGLBINDBUFFERSRANGEPROC __glewBindBuffersRange = NULL; +PFNGLBINDIMAGETEXTURESPROC __glewBindImageTextures = NULL; +PFNGLBINDSAMPLERSPROC __glewBindSamplers = NULL; +PFNGLBINDTEXTURESPROC __glewBindTextures = NULL; +PFNGLBINDVERTEXBUFFERSPROC __glewBindVertexBuffers = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTPROC __glewMultiDrawArraysIndirect = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTPROC __glewMultiDrawElementsIndirect = NULL; + +PFNGLSAMPLECOVERAGEARBPROC __glewSampleCoverageARB = NULL; + +PFNGLACTIVETEXTUREARBPROC __glewActiveTextureARB = NULL; +PFNGLCLIENTACTIVETEXTUREARBPROC __glewClientActiveTextureARB = NULL; +PFNGLMULTITEXCOORD1DARBPROC __glewMultiTexCoord1dARB = NULL; +PFNGLMULTITEXCOORD1DVARBPROC __glewMultiTexCoord1dvARB = NULL; +PFNGLMULTITEXCOORD1FARBPROC __glewMultiTexCoord1fARB = NULL; +PFNGLMULTITEXCOORD1FVARBPROC __glewMultiTexCoord1fvARB = NULL; +PFNGLMULTITEXCOORD1IARBPROC __glewMultiTexCoord1iARB = NULL; +PFNGLMULTITEXCOORD1IVARBPROC __glewMultiTexCoord1ivARB = NULL; +PFNGLMULTITEXCOORD1SARBPROC __glewMultiTexCoord1sARB = NULL; +PFNGLMULTITEXCOORD1SVARBPROC __glewMultiTexCoord1svARB = NULL; +PFNGLMULTITEXCOORD2DARBPROC __glewMultiTexCoord2dARB = NULL; +PFNGLMULTITEXCOORD2DVARBPROC __glewMultiTexCoord2dvARB = NULL; +PFNGLMULTITEXCOORD2FARBPROC __glewMultiTexCoord2fARB = NULL; +PFNGLMULTITEXCOORD2FVARBPROC __glewMultiTexCoord2fvARB = NULL; +PFNGLMULTITEXCOORD2IARBPROC __glewMultiTexCoord2iARB = NULL; +PFNGLMULTITEXCOORD2IVARBPROC __glewMultiTexCoord2ivARB = NULL; +PFNGLMULTITEXCOORD2SARBPROC __glewMultiTexCoord2sARB = NULL; +PFNGLMULTITEXCOORD2SVARBPROC __glewMultiTexCoord2svARB = NULL; +PFNGLMULTITEXCOORD3DARBPROC __glewMultiTexCoord3dARB = NULL; +PFNGLMULTITEXCOORD3DVARBPROC __glewMultiTexCoord3dvARB = NULL; +PFNGLMULTITEXCOORD3FARBPROC __glewMultiTexCoord3fARB = NULL; +PFNGLMULTITEXCOORD3FVARBPROC __glewMultiTexCoord3fvARB = NULL; +PFNGLMULTITEXCOORD3IARBPROC __glewMultiTexCoord3iARB = NULL; +PFNGLMULTITEXCOORD3IVARBPROC __glewMultiTexCoord3ivARB = NULL; +PFNGLMULTITEXCOORD3SARBPROC __glewMultiTexCoord3sARB = NULL; +PFNGLMULTITEXCOORD3SVARBPROC __glewMultiTexCoord3svARB = NULL; +PFNGLMULTITEXCOORD4DARBPROC __glewMultiTexCoord4dARB = NULL; +PFNGLMULTITEXCOORD4DVARBPROC __glewMultiTexCoord4dvARB = NULL; +PFNGLMULTITEXCOORD4FARBPROC __glewMultiTexCoord4fARB = NULL; +PFNGLMULTITEXCOORD4FVARBPROC __glewMultiTexCoord4fvARB = NULL; +PFNGLMULTITEXCOORD4IARBPROC __glewMultiTexCoord4iARB = NULL; +PFNGLMULTITEXCOORD4IVARBPROC __glewMultiTexCoord4ivARB = NULL; +PFNGLMULTITEXCOORD4SARBPROC __glewMultiTexCoord4sARB = NULL; +PFNGLMULTITEXCOORD4SVARBPROC __glewMultiTexCoord4svARB = NULL; + +PFNGLBEGINQUERYARBPROC __glewBeginQueryARB = NULL; +PFNGLDELETEQUERIESARBPROC __glewDeleteQueriesARB = NULL; +PFNGLENDQUERYARBPROC __glewEndQueryARB = NULL; +PFNGLGENQUERIESARBPROC __glewGenQueriesARB = NULL; +PFNGLGETQUERYOBJECTIVARBPROC __glewGetQueryObjectivARB = NULL; +PFNGLGETQUERYOBJECTUIVARBPROC __glewGetQueryObjectuivARB = NULL; +PFNGLGETQUERYIVARBPROC __glewGetQueryivARB = NULL; +PFNGLISQUERYARBPROC __glewIsQueryARB = NULL; + +PFNGLMAXSHADERCOMPILERTHREADSARBPROC __glewMaxShaderCompilerThreadsARB = NULL; + +PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB = NULL; +PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB = NULL; + +PFNGLGETPROGRAMINTERFACEIVPROC __glewGetProgramInterfaceiv = NULL; +PFNGLGETPROGRAMRESOURCEINDEXPROC __glewGetProgramResourceIndex = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONPROC __glewGetProgramResourceLocation = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC __glewGetProgramResourceLocationIndex = NULL; +PFNGLGETPROGRAMRESOURCENAMEPROC __glewGetProgramResourceName = NULL; +PFNGLGETPROGRAMRESOURCEIVPROC __glewGetProgramResourceiv = NULL; + +PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex = NULL; + +PFNGLGETGRAPHICSRESETSTATUSARBPROC __glewGetGraphicsResetStatusARB = NULL; +PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB = NULL; +PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB = NULL; +PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB = NULL; +PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB = NULL; +PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB = NULL; +PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB = NULL; +PFNGLGETNMAPIVARBPROC __glewGetnMapivARB = NULL; +PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB = NULL; +PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB = NULL; +PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB = NULL; +PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB = NULL; +PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB = NULL; +PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB = NULL; +PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB = NULL; +PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB = NULL; +PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB = NULL; +PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB = NULL; +PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB = NULL; +PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB = NULL; + +PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewFramebufferSampleLocationsfvARB = NULL; +PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC __glewNamedFramebufferSampleLocationsfvARB = NULL; + +PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB = NULL; + +PFNGLBINDSAMPLERPROC __glewBindSampler = NULL; +PFNGLDELETESAMPLERSPROC __glewDeleteSamplers = NULL; +PFNGLGENSAMPLERSPROC __glewGenSamplers = NULL; +PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv = NULL; +PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv = NULL; +PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv = NULL; +PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv = NULL; +PFNGLISSAMPLERPROC __glewIsSampler = NULL; +PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv = NULL; +PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv = NULL; +PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf = NULL; +PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv = NULL; +PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri = NULL; +PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv = NULL; + +PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram = NULL; +PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline = NULL; +PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv = NULL; +PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines = NULL; +PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines = NULL; +PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog = NULL; +PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv = NULL; +PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline = NULL; +PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d = NULL; +PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv = NULL; +PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f = NULL; +PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv = NULL; +PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i = NULL; +PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv = NULL; +PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui = NULL; +PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv = NULL; +PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d = NULL; +PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv = NULL; +PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f = NULL; +PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv = NULL; +PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i = NULL; +PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv = NULL; +PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui = NULL; +PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv = NULL; +PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d = NULL; +PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv = NULL; +PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f = NULL; +PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv = NULL; +PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i = NULL; +PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv = NULL; +PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui = NULL; +PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv = NULL; +PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d = NULL; +PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv = NULL; +PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f = NULL; +PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv = NULL; +PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i = NULL; +PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv = NULL; +PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui = NULL; +PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv = NULL; +PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages = NULL; +PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline = NULL; + +PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC __glewGetActiveAtomicCounterBufferiv = NULL; + +PFNGLBINDIMAGETEXTUREPROC __glewBindImageTexture = NULL; +PFNGLMEMORYBARRIERPROC __glewMemoryBarrier = NULL; + +PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB = NULL; +PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB = NULL; +PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB = NULL; +PFNGLCREATESHADEROBJECTARBPROC __glewCreateShaderObjectARB = NULL; +PFNGLDELETEOBJECTARBPROC __glewDeleteObjectARB = NULL; +PFNGLDETACHOBJECTARBPROC __glewDetachObjectARB = NULL; +PFNGLGETACTIVEUNIFORMARBPROC __glewGetActiveUniformARB = NULL; +PFNGLGETATTACHEDOBJECTSARBPROC __glewGetAttachedObjectsARB = NULL; +PFNGLGETHANDLEARBPROC __glewGetHandleARB = NULL; +PFNGLGETINFOLOGARBPROC __glewGetInfoLogARB = NULL; +PFNGLGETOBJECTPARAMETERFVARBPROC __glewGetObjectParameterfvARB = NULL; +PFNGLGETOBJECTPARAMETERIVARBPROC __glewGetObjectParameterivARB = NULL; +PFNGLGETSHADERSOURCEARBPROC __glewGetShaderSourceARB = NULL; +PFNGLGETUNIFORMLOCATIONARBPROC __glewGetUniformLocationARB = NULL; +PFNGLGETUNIFORMFVARBPROC __glewGetUniformfvARB = NULL; +PFNGLGETUNIFORMIVARBPROC __glewGetUniformivARB = NULL; +PFNGLLINKPROGRAMARBPROC __glewLinkProgramARB = NULL; +PFNGLSHADERSOURCEARBPROC __glewShaderSourceARB = NULL; +PFNGLUNIFORM1FARBPROC __glewUniform1fARB = NULL; +PFNGLUNIFORM1FVARBPROC __glewUniform1fvARB = NULL; +PFNGLUNIFORM1IARBPROC __glewUniform1iARB = NULL; +PFNGLUNIFORM1IVARBPROC __glewUniform1ivARB = NULL; +PFNGLUNIFORM2FARBPROC __glewUniform2fARB = NULL; +PFNGLUNIFORM2FVARBPROC __glewUniform2fvARB = NULL; +PFNGLUNIFORM2IARBPROC __glewUniform2iARB = NULL; +PFNGLUNIFORM2IVARBPROC __glewUniform2ivARB = NULL; +PFNGLUNIFORM3FARBPROC __glewUniform3fARB = NULL; +PFNGLUNIFORM3FVARBPROC __glewUniform3fvARB = NULL; +PFNGLUNIFORM3IARBPROC __glewUniform3iARB = NULL; +PFNGLUNIFORM3IVARBPROC __glewUniform3ivARB = NULL; +PFNGLUNIFORM4FARBPROC __glewUniform4fARB = NULL; +PFNGLUNIFORM4FVARBPROC __glewUniform4fvARB = NULL; +PFNGLUNIFORM4IARBPROC __glewUniform4iARB = NULL; +PFNGLUNIFORM4IVARBPROC __glewUniform4ivARB = NULL; +PFNGLUNIFORMMATRIX2FVARBPROC __glewUniformMatrix2fvARB = NULL; +PFNGLUNIFORMMATRIX3FVARBPROC __glewUniformMatrix3fvARB = NULL; +PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB = NULL; +PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB = NULL; +PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB = NULL; + +PFNGLSHADERSTORAGEBLOCKBINDINGPROC __glewShaderStorageBlockBinding = NULL; + +PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName = NULL; +PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName = NULL; +PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv = NULL; +PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv = NULL; +PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex = NULL; +PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation = NULL; +PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv = NULL; +PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv = NULL; + +PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB = NULL; +PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB = NULL; +PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB = NULL; +PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB = NULL; +PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB = NULL; +PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB = NULL; + +PFNGLBUFFERPAGECOMMITMENTARBPROC __glewBufferPageCommitmentARB = NULL; + +PFNGLTEXPAGECOMMITMENTARBPROC __glewTexPageCommitmentARB = NULL; +PFNGLTEXTUREPAGECOMMITMENTEXTPROC __glewTexturePageCommitmentEXT = NULL; + +PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync = NULL; +PFNGLDELETESYNCPROC __glewDeleteSync = NULL; +PFNGLFENCESYNCPROC __glewFenceSync = NULL; +PFNGLGETINTEGER64VPROC __glewGetInteger64v = NULL; +PFNGLGETSYNCIVPROC __glewGetSynciv = NULL; +PFNGLISSYNCPROC __glewIsSync = NULL; +PFNGLWAITSYNCPROC __glewWaitSync = NULL; + +PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv = NULL; +PFNGLPATCHPARAMETERIPROC __glewPatchParameteri = NULL; + +PFNGLTEXTUREBARRIERPROC __glewTextureBarrier = NULL; + +PFNGLTEXBUFFERARBPROC __glewTexBufferARB = NULL; + +PFNGLTEXBUFFERRANGEPROC __glewTexBufferRange = NULL; +PFNGLTEXTUREBUFFERRANGEEXTPROC __glewTextureBufferRangeEXT = NULL; + +PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DARBPROC __glewCompressedTexImage2DARB = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DARBPROC __glewCompressedTexImage3DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC __glewCompressedTexSubImage1DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB = NULL; + +PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv = NULL; +PFNGLSAMPLEMASKIPROC __glewSampleMaski = NULL; +PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample = NULL; +PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample = NULL; + +PFNGLTEXSTORAGE1DPROC __glewTexStorage1D = NULL; +PFNGLTEXSTORAGE2DPROC __glewTexStorage2D = NULL; +PFNGLTEXSTORAGE3DPROC __glewTexStorage3D = NULL; +PFNGLTEXTURESTORAGE1DEXTPROC __glewTextureStorage1DEXT = NULL; +PFNGLTEXTURESTORAGE2DEXTPROC __glewTextureStorage2DEXT = NULL; +PFNGLTEXTURESTORAGE3DEXTPROC __glewTextureStorage3DEXT = NULL; + +PFNGLTEXSTORAGE2DMULTISAMPLEPROC __glewTexStorage2DMultisample = NULL; +PFNGLTEXSTORAGE3DMULTISAMPLEPROC __glewTexStorage3DMultisample = NULL; +PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC __glewTextureStorage2DMultisampleEXT = NULL; +PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC __glewTextureStorage3DMultisampleEXT = NULL; + +PFNGLTEXTUREVIEWPROC __glewTextureView = NULL; + +PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v = NULL; +PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v = NULL; +PFNGLQUERYCOUNTERPROC __glewQueryCounter = NULL; + +PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback = NULL; +PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks = NULL; +PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback = NULL; +PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks = NULL; +PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback = NULL; +PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback = NULL; +PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback = NULL; + +PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed = NULL; +PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream = NULL; +PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed = NULL; +PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv = NULL; + +PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC __glewDrawTransformFeedbackInstanced = NULL; +PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC __glewDrawTransformFeedbackStreamInstanced = NULL; + +PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB = NULL; +PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB = NULL; +PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB = NULL; +PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB = NULL; + +PFNGLBINDBUFFERBASEPROC __glewBindBufferBase = NULL; +PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange = NULL; +PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName = NULL; +PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv = NULL; +PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName = NULL; +PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv = NULL; +PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v = NULL; +PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex = NULL; +PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices = NULL; +PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding = NULL; + +PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray = NULL; +PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays = NULL; +PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays = NULL; +PFNGLISVERTEXARRAYPROC __glewIsVertexArray = NULL; + +PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv = NULL; +PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d = NULL; +PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv = NULL; +PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d = NULL; +PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv = NULL; +PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d = NULL; +PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv = NULL; +PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d = NULL; +PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv = NULL; +PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer = NULL; + +PFNGLBINDVERTEXBUFFERPROC __glewBindVertexBuffer = NULL; +PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC __glewVertexArrayBindVertexBufferEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC __glewVertexArrayVertexAttribBindingEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC __glewVertexArrayVertexAttribFormatEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC __glewVertexArrayVertexAttribIFormatEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC __glewVertexArrayVertexAttribLFormatEXT = NULL; +PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC __glewVertexArrayVertexBindingDivisorEXT = NULL; +PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding = NULL; +PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat = NULL; +PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat = NULL; +PFNGLVERTEXATTRIBLFORMATPROC __glewVertexAttribLFormat = NULL; +PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor = NULL; + +PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB = NULL; +PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB = NULL; +PFNGLWEIGHTBVARBPROC __glewWeightbvARB = NULL; +PFNGLWEIGHTDVARBPROC __glewWeightdvARB = NULL; +PFNGLWEIGHTFVARBPROC __glewWeightfvARB = NULL; +PFNGLWEIGHTIVARBPROC __glewWeightivARB = NULL; +PFNGLWEIGHTSVARBPROC __glewWeightsvARB = NULL; +PFNGLWEIGHTUBVARBPROC __glewWeightubvARB = NULL; +PFNGLWEIGHTUIVARBPROC __glewWeightuivARB = NULL; +PFNGLWEIGHTUSVARBPROC __glewWeightusvARB = NULL; + +PFNGLBINDBUFFERARBPROC __glewBindBufferARB = NULL; +PFNGLBUFFERDATAARBPROC __glewBufferDataARB = NULL; +PFNGLBUFFERSUBDATAARBPROC __glewBufferSubDataARB = NULL; +PFNGLDELETEBUFFERSARBPROC __glewDeleteBuffersARB = NULL; +PFNGLGENBUFFERSARBPROC __glewGenBuffersARB = NULL; +PFNGLGETBUFFERPARAMETERIVARBPROC __glewGetBufferParameterivARB = NULL; +PFNGLGETBUFFERPOINTERVARBPROC __glewGetBufferPointervARB = NULL; +PFNGLGETBUFFERSUBDATAARBPROC __glewGetBufferSubDataARB = NULL; +PFNGLISBUFFERARBPROC __glewIsBufferARB = NULL; +PFNGLMAPBUFFERARBPROC __glewMapBufferARB = NULL; +PFNGLUNMAPBUFFERARBPROC __glewUnmapBufferARB = NULL; + +PFNGLBINDPROGRAMARBPROC __glewBindProgramARB = NULL; +PFNGLDELETEPROGRAMSARBPROC __glewDeleteProgramsARB = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYARBPROC __glewDisableVertexAttribArrayARB = NULL; +PFNGLENABLEVERTEXATTRIBARRAYARBPROC __glewEnableVertexAttribArrayARB = NULL; +PFNGLGENPROGRAMSARBPROC __glewGenProgramsARB = NULL; +PFNGLGETPROGRAMENVPARAMETERDVARBPROC __glewGetProgramEnvParameterdvARB = NULL; +PFNGLGETPROGRAMENVPARAMETERFVARBPROC __glewGetProgramEnvParameterfvARB = NULL; +PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC __glewGetProgramLocalParameterdvARB = NULL; +PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC __glewGetProgramLocalParameterfvARB = NULL; +PFNGLGETPROGRAMSTRINGARBPROC __glewGetProgramStringARB = NULL; +PFNGLGETPROGRAMIVARBPROC __glewGetProgramivARB = NULL; +PFNGLGETVERTEXATTRIBPOINTERVARBPROC __glewGetVertexAttribPointervARB = NULL; +PFNGLGETVERTEXATTRIBDVARBPROC __glewGetVertexAttribdvARB = NULL; +PFNGLGETVERTEXATTRIBFVARBPROC __glewGetVertexAttribfvARB = NULL; +PFNGLGETVERTEXATTRIBIVARBPROC __glewGetVertexAttribivARB = NULL; +PFNGLISPROGRAMARBPROC __glewIsProgramARB = NULL; +PFNGLPROGRAMENVPARAMETER4DARBPROC __glewProgramEnvParameter4dARB = NULL; +PFNGLPROGRAMENVPARAMETER4DVARBPROC __glewProgramEnvParameter4dvARB = NULL; +PFNGLPROGRAMENVPARAMETER4FARBPROC __glewProgramEnvParameter4fARB = NULL; +PFNGLPROGRAMENVPARAMETER4FVARBPROC __glewProgramEnvParameter4fvARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4DARBPROC __glewProgramLocalParameter4dARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4DVARBPROC __glewProgramLocalParameter4dvARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4FARBPROC __glewProgramLocalParameter4fARB = NULL; +PFNGLPROGRAMLOCALPARAMETER4FVARBPROC __glewProgramLocalParameter4fvARB = NULL; +PFNGLPROGRAMSTRINGARBPROC __glewProgramStringARB = NULL; +PFNGLVERTEXATTRIB1DARBPROC __glewVertexAttrib1dARB = NULL; +PFNGLVERTEXATTRIB1DVARBPROC __glewVertexAttrib1dvARB = NULL; +PFNGLVERTEXATTRIB1FARBPROC __glewVertexAttrib1fARB = NULL; +PFNGLVERTEXATTRIB1FVARBPROC __glewVertexAttrib1fvARB = NULL; +PFNGLVERTEXATTRIB1SARBPROC __glewVertexAttrib1sARB = NULL; +PFNGLVERTEXATTRIB1SVARBPROC __glewVertexAttrib1svARB = NULL; +PFNGLVERTEXATTRIB2DARBPROC __glewVertexAttrib2dARB = NULL; +PFNGLVERTEXATTRIB2DVARBPROC __glewVertexAttrib2dvARB = NULL; +PFNGLVERTEXATTRIB2FARBPROC __glewVertexAttrib2fARB = NULL; +PFNGLVERTEXATTRIB2FVARBPROC __glewVertexAttrib2fvARB = NULL; +PFNGLVERTEXATTRIB2SARBPROC __glewVertexAttrib2sARB = NULL; +PFNGLVERTEXATTRIB2SVARBPROC __glewVertexAttrib2svARB = NULL; +PFNGLVERTEXATTRIB3DARBPROC __glewVertexAttrib3dARB = NULL; +PFNGLVERTEXATTRIB3DVARBPROC __glewVertexAttrib3dvARB = NULL; +PFNGLVERTEXATTRIB3FARBPROC __glewVertexAttrib3fARB = NULL; +PFNGLVERTEXATTRIB3FVARBPROC __glewVertexAttrib3fvARB = NULL; +PFNGLVERTEXATTRIB3SARBPROC __glewVertexAttrib3sARB = NULL; +PFNGLVERTEXATTRIB3SVARBPROC __glewVertexAttrib3svARB = NULL; +PFNGLVERTEXATTRIB4NBVARBPROC __glewVertexAttrib4NbvARB = NULL; +PFNGLVERTEXATTRIB4NIVARBPROC __glewVertexAttrib4NivARB = NULL; +PFNGLVERTEXATTRIB4NSVARBPROC __glewVertexAttrib4NsvARB = NULL; +PFNGLVERTEXATTRIB4NUBARBPROC __glewVertexAttrib4NubARB = NULL; +PFNGLVERTEXATTRIB4NUBVARBPROC __glewVertexAttrib4NubvARB = NULL; +PFNGLVERTEXATTRIB4NUIVARBPROC __glewVertexAttrib4NuivARB = NULL; +PFNGLVERTEXATTRIB4NUSVARBPROC __glewVertexAttrib4NusvARB = NULL; +PFNGLVERTEXATTRIB4BVARBPROC __glewVertexAttrib4bvARB = NULL; +PFNGLVERTEXATTRIB4DARBPROC __glewVertexAttrib4dARB = NULL; +PFNGLVERTEXATTRIB4DVARBPROC __glewVertexAttrib4dvARB = NULL; +PFNGLVERTEXATTRIB4FARBPROC __glewVertexAttrib4fARB = NULL; +PFNGLVERTEXATTRIB4FVARBPROC __glewVertexAttrib4fvARB = NULL; +PFNGLVERTEXATTRIB4IVARBPROC __glewVertexAttrib4ivARB = NULL; +PFNGLVERTEXATTRIB4SARBPROC __glewVertexAttrib4sARB = NULL; +PFNGLVERTEXATTRIB4SVARBPROC __glewVertexAttrib4svARB = NULL; +PFNGLVERTEXATTRIB4UBVARBPROC __glewVertexAttrib4ubvARB = NULL; +PFNGLVERTEXATTRIB4UIVARBPROC __glewVertexAttrib4uivARB = NULL; +PFNGLVERTEXATTRIB4USVARBPROC __glewVertexAttrib4usvARB = NULL; +PFNGLVERTEXATTRIBPOINTERARBPROC __glewVertexAttribPointerARB = NULL; + +PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB = NULL; +PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB = NULL; +PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB = NULL; + +PFNGLCOLORP3UIPROC __glewColorP3ui = NULL; +PFNGLCOLORP3UIVPROC __glewColorP3uiv = NULL; +PFNGLCOLORP4UIPROC __glewColorP4ui = NULL; +PFNGLCOLORP4UIVPROC __glewColorP4uiv = NULL; +PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui = NULL; +PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv = NULL; +PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui = NULL; +PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv = NULL; +PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui = NULL; +PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv = NULL; +PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui = NULL; +PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv = NULL; +PFNGLNORMALP3UIPROC __glewNormalP3ui = NULL; +PFNGLNORMALP3UIVPROC __glewNormalP3uiv = NULL; +PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui = NULL; +PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv = NULL; +PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui = NULL; +PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv = NULL; +PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui = NULL; +PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv = NULL; +PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui = NULL; +PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv = NULL; +PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui = NULL; +PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv = NULL; +PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui = NULL; +PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv = NULL; +PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui = NULL; +PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv = NULL; +PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui = NULL; +PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv = NULL; +PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui = NULL; +PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv = NULL; +PFNGLVERTEXP2UIPROC __glewVertexP2ui = NULL; +PFNGLVERTEXP2UIVPROC __glewVertexP2uiv = NULL; +PFNGLVERTEXP3UIPROC __glewVertexP3ui = NULL; +PFNGLVERTEXP3UIVPROC __glewVertexP3uiv = NULL; +PFNGLVERTEXP4UIPROC __glewVertexP4ui = NULL; +PFNGLVERTEXP4UIVPROC __glewVertexP4uiv = NULL; + +PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv = NULL; +PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed = NULL; +PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v = NULL; +PFNGLGETFLOATI_VPROC __glewGetFloati_v = NULL; +PFNGLSCISSORARRAYVPROC __glewScissorArrayv = NULL; +PFNGLSCISSORINDEXEDPROC __glewScissorIndexed = NULL; +PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv = NULL; +PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv = NULL; +PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf = NULL; +PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv = NULL; + +PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB = NULL; +PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB = NULL; +PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB = NULL; +PFNGLWINDOWPOS2FVARBPROC __glewWindowPos2fvARB = NULL; +PFNGLWINDOWPOS2IARBPROC __glewWindowPos2iARB = NULL; +PFNGLWINDOWPOS2IVARBPROC __glewWindowPos2ivARB = NULL; +PFNGLWINDOWPOS2SARBPROC __glewWindowPos2sARB = NULL; +PFNGLWINDOWPOS2SVARBPROC __glewWindowPos2svARB = NULL; +PFNGLWINDOWPOS3DARBPROC __glewWindowPos3dARB = NULL; +PFNGLWINDOWPOS3DVARBPROC __glewWindowPos3dvARB = NULL; +PFNGLWINDOWPOS3FARBPROC __glewWindowPos3fARB = NULL; +PFNGLWINDOWPOS3FVARBPROC __glewWindowPos3fvARB = NULL; +PFNGLWINDOWPOS3IARBPROC __glewWindowPos3iARB = NULL; +PFNGLWINDOWPOS3IVARBPROC __glewWindowPos3ivARB = NULL; +PFNGLWINDOWPOS3SARBPROC __glewWindowPos3sARB = NULL; +PFNGLWINDOWPOS3SVARBPROC __glewWindowPos3svARB = NULL; + +PFNGLDRAWBUFFERSATIPROC __glewDrawBuffersATI = NULL; + +PFNGLDRAWELEMENTARRAYATIPROC __glewDrawElementArrayATI = NULL; +PFNGLDRAWRANGEELEMENTARRAYATIPROC __glewDrawRangeElementArrayATI = NULL; +PFNGLELEMENTPOINTERATIPROC __glewElementPointerATI = NULL; + +PFNGLGETTEXBUMPPARAMETERFVATIPROC __glewGetTexBumpParameterfvATI = NULL; +PFNGLGETTEXBUMPPARAMETERIVATIPROC __glewGetTexBumpParameterivATI = NULL; +PFNGLTEXBUMPPARAMETERFVATIPROC __glewTexBumpParameterfvATI = NULL; +PFNGLTEXBUMPPARAMETERIVATIPROC __glewTexBumpParameterivATI = NULL; + +PFNGLALPHAFRAGMENTOP1ATIPROC __glewAlphaFragmentOp1ATI = NULL; +PFNGLALPHAFRAGMENTOP2ATIPROC __glewAlphaFragmentOp2ATI = NULL; +PFNGLALPHAFRAGMENTOP3ATIPROC __glewAlphaFragmentOp3ATI = NULL; +PFNGLBEGINFRAGMENTSHADERATIPROC __glewBeginFragmentShaderATI = NULL; +PFNGLBINDFRAGMENTSHADERATIPROC __glewBindFragmentShaderATI = NULL; +PFNGLCOLORFRAGMENTOP1ATIPROC __glewColorFragmentOp1ATI = NULL; +PFNGLCOLORFRAGMENTOP2ATIPROC __glewColorFragmentOp2ATI = NULL; +PFNGLCOLORFRAGMENTOP3ATIPROC __glewColorFragmentOp3ATI = NULL; +PFNGLDELETEFRAGMENTSHADERATIPROC __glewDeleteFragmentShaderATI = NULL; +PFNGLENDFRAGMENTSHADERATIPROC __glewEndFragmentShaderATI = NULL; +PFNGLGENFRAGMENTSHADERSATIPROC __glewGenFragmentShadersATI = NULL; +PFNGLPASSTEXCOORDATIPROC __glewPassTexCoordATI = NULL; +PFNGLSAMPLEMAPATIPROC __glewSampleMapATI = NULL; +PFNGLSETFRAGMENTSHADERCONSTANTATIPROC __glewSetFragmentShaderConstantATI = NULL; + +PFNGLMAPOBJECTBUFFERATIPROC __glewMapObjectBufferATI = NULL; +PFNGLUNMAPOBJECTBUFFERATIPROC __glewUnmapObjectBufferATI = NULL; + +PFNGLPNTRIANGLESFATIPROC __glewPNTrianglesfATI = NULL; +PFNGLPNTRIANGLESIATIPROC __glewPNTrianglesiATI = NULL; + +PFNGLSTENCILFUNCSEPARATEATIPROC __glewStencilFuncSeparateATI = NULL; +PFNGLSTENCILOPSEPARATEATIPROC __glewStencilOpSeparateATI = NULL; + +PFNGLARRAYOBJECTATIPROC __glewArrayObjectATI = NULL; +PFNGLFREEOBJECTBUFFERATIPROC __glewFreeObjectBufferATI = NULL; +PFNGLGETARRAYOBJECTFVATIPROC __glewGetArrayObjectfvATI = NULL; +PFNGLGETARRAYOBJECTIVATIPROC __glewGetArrayObjectivATI = NULL; +PFNGLGETOBJECTBUFFERFVATIPROC __glewGetObjectBufferfvATI = NULL; +PFNGLGETOBJECTBUFFERIVATIPROC __glewGetObjectBufferivATI = NULL; +PFNGLGETVARIANTARRAYOBJECTFVATIPROC __glewGetVariantArrayObjectfvATI = NULL; +PFNGLGETVARIANTARRAYOBJECTIVATIPROC __glewGetVariantArrayObjectivATI = NULL; +PFNGLISOBJECTBUFFERATIPROC __glewIsObjectBufferATI = NULL; +PFNGLNEWOBJECTBUFFERATIPROC __glewNewObjectBufferATI = NULL; +PFNGLUPDATEOBJECTBUFFERATIPROC __glewUpdateObjectBufferATI = NULL; +PFNGLVARIANTARRAYOBJECTATIPROC __glewVariantArrayObjectATI = NULL; + +PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC __glewGetVertexAttribArrayObjectfvATI = NULL; +PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC __glewGetVertexAttribArrayObjectivATI = NULL; +PFNGLVERTEXATTRIBARRAYOBJECTATIPROC __glewVertexAttribArrayObjectATI = NULL; + +PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC __glewClientActiveVertexStreamATI = NULL; +PFNGLNORMALSTREAM3BATIPROC __glewNormalStream3bATI = NULL; +PFNGLNORMALSTREAM3BVATIPROC __glewNormalStream3bvATI = NULL; +PFNGLNORMALSTREAM3DATIPROC __glewNormalStream3dATI = NULL; +PFNGLNORMALSTREAM3DVATIPROC __glewNormalStream3dvATI = NULL; +PFNGLNORMALSTREAM3FATIPROC __glewNormalStream3fATI = NULL; +PFNGLNORMALSTREAM3FVATIPROC __glewNormalStream3fvATI = NULL; +PFNGLNORMALSTREAM3IATIPROC __glewNormalStream3iATI = NULL; +PFNGLNORMALSTREAM3IVATIPROC __glewNormalStream3ivATI = NULL; +PFNGLNORMALSTREAM3SATIPROC __glewNormalStream3sATI = NULL; +PFNGLNORMALSTREAM3SVATIPROC __glewNormalStream3svATI = NULL; +PFNGLVERTEXBLENDENVFATIPROC __glewVertexBlendEnvfATI = NULL; +PFNGLVERTEXBLENDENVIATIPROC __glewVertexBlendEnviATI = NULL; +PFNGLVERTEXSTREAM1DATIPROC __glewVertexStream1dATI = NULL; +PFNGLVERTEXSTREAM1DVATIPROC __glewVertexStream1dvATI = NULL; +PFNGLVERTEXSTREAM1FATIPROC __glewVertexStream1fATI = NULL; +PFNGLVERTEXSTREAM1FVATIPROC __glewVertexStream1fvATI = NULL; +PFNGLVERTEXSTREAM1IATIPROC __glewVertexStream1iATI = NULL; +PFNGLVERTEXSTREAM1IVATIPROC __glewVertexStream1ivATI = NULL; +PFNGLVERTEXSTREAM1SATIPROC __glewVertexStream1sATI = NULL; +PFNGLVERTEXSTREAM1SVATIPROC __glewVertexStream1svATI = NULL; +PFNGLVERTEXSTREAM2DATIPROC __glewVertexStream2dATI = NULL; +PFNGLVERTEXSTREAM2DVATIPROC __glewVertexStream2dvATI = NULL; +PFNGLVERTEXSTREAM2FATIPROC __glewVertexStream2fATI = NULL; +PFNGLVERTEXSTREAM2FVATIPROC __glewVertexStream2fvATI = NULL; +PFNGLVERTEXSTREAM2IATIPROC __glewVertexStream2iATI = NULL; +PFNGLVERTEXSTREAM2IVATIPROC __glewVertexStream2ivATI = NULL; +PFNGLVERTEXSTREAM2SATIPROC __glewVertexStream2sATI = NULL; +PFNGLVERTEXSTREAM2SVATIPROC __glewVertexStream2svATI = NULL; +PFNGLVERTEXSTREAM3DATIPROC __glewVertexStream3dATI = NULL; +PFNGLVERTEXSTREAM3DVATIPROC __glewVertexStream3dvATI = NULL; +PFNGLVERTEXSTREAM3FATIPROC __glewVertexStream3fATI = NULL; +PFNGLVERTEXSTREAM3FVATIPROC __glewVertexStream3fvATI = NULL; +PFNGLVERTEXSTREAM3IATIPROC __glewVertexStream3iATI = NULL; +PFNGLVERTEXSTREAM3IVATIPROC __glewVertexStream3ivATI = NULL; +PFNGLVERTEXSTREAM3SATIPROC __glewVertexStream3sATI = NULL; +PFNGLVERTEXSTREAM3SVATIPROC __glewVertexStream3svATI = NULL; +PFNGLVERTEXSTREAM4DATIPROC __glewVertexStream4dATI = NULL; +PFNGLVERTEXSTREAM4DVATIPROC __glewVertexStream4dvATI = NULL; +PFNGLVERTEXSTREAM4FATIPROC __glewVertexStream4fATI = NULL; +PFNGLVERTEXSTREAM4FVATIPROC __glewVertexStream4fvATI = NULL; +PFNGLVERTEXSTREAM4IATIPROC __glewVertexStream4iATI = NULL; +PFNGLVERTEXSTREAM4IVATIPROC __glewVertexStream4ivATI = NULL; +PFNGLVERTEXSTREAM4SATIPROC __glewVertexStream4sATI = NULL; +PFNGLVERTEXSTREAM4SVATIPROC __glewVertexStream4svATI = NULL; + +PFNGLGETUNIFORMBUFFERSIZEEXTPROC __glewGetUniformBufferSizeEXT = NULL; +PFNGLGETUNIFORMOFFSETEXTPROC __glewGetUniformOffsetEXT = NULL; +PFNGLUNIFORMBUFFEREXTPROC __glewUniformBufferEXT = NULL; + +PFNGLBLENDCOLOREXTPROC __glewBlendColorEXT = NULL; + +PFNGLBLENDEQUATIONSEPARATEEXTPROC __glewBlendEquationSeparateEXT = NULL; + +PFNGLBLENDFUNCSEPARATEEXTPROC __glewBlendFuncSeparateEXT = NULL; + +PFNGLBLENDEQUATIONEXTPROC __glewBlendEquationEXT = NULL; + +PFNGLCOLORSUBTABLEEXTPROC __glewColorSubTableEXT = NULL; +PFNGLCOPYCOLORSUBTABLEEXTPROC __glewCopyColorSubTableEXT = NULL; + +PFNGLLOCKARRAYSEXTPROC __glewLockArraysEXT = NULL; +PFNGLUNLOCKARRAYSEXTPROC __glewUnlockArraysEXT = NULL; + +PFNGLCONVOLUTIONFILTER1DEXTPROC __glewConvolutionFilter1DEXT = NULL; +PFNGLCONVOLUTIONFILTER2DEXTPROC __glewConvolutionFilter2DEXT = NULL; +PFNGLCONVOLUTIONPARAMETERFEXTPROC __glewConvolutionParameterfEXT = NULL; +PFNGLCONVOLUTIONPARAMETERFVEXTPROC __glewConvolutionParameterfvEXT = NULL; +PFNGLCONVOLUTIONPARAMETERIEXTPROC __glewConvolutionParameteriEXT = NULL; +PFNGLCONVOLUTIONPARAMETERIVEXTPROC __glewConvolutionParameterivEXT = NULL; +PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC __glewCopyConvolutionFilter1DEXT = NULL; +PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC __glewCopyConvolutionFilter2DEXT = NULL; +PFNGLGETCONVOLUTIONFILTEREXTPROC __glewGetConvolutionFilterEXT = NULL; +PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC __glewGetConvolutionParameterfvEXT = NULL; +PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC __glewGetConvolutionParameterivEXT = NULL; +PFNGLGETSEPARABLEFILTEREXTPROC __glewGetSeparableFilterEXT = NULL; +PFNGLSEPARABLEFILTER2DEXTPROC __glewSeparableFilter2DEXT = NULL; + +PFNGLBINORMALPOINTEREXTPROC __glewBinormalPointerEXT = NULL; +PFNGLTANGENTPOINTEREXTPROC __glewTangentPointerEXT = NULL; + +PFNGLCOPYTEXIMAGE1DEXTPROC __glewCopyTexImage1DEXT = NULL; +PFNGLCOPYTEXIMAGE2DEXTPROC __glewCopyTexImage2DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE1DEXTPROC __glewCopyTexSubImage1DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE2DEXTPROC __glewCopyTexSubImage2DEXT = NULL; +PFNGLCOPYTEXSUBIMAGE3DEXTPROC __glewCopyTexSubImage3DEXT = NULL; + +PFNGLCULLPARAMETERDVEXTPROC __glewCullParameterdvEXT = NULL; +PFNGLCULLPARAMETERFVEXTPROC __glewCullParameterfvEXT = NULL; + +PFNGLGETOBJECTLABELEXTPROC __glewGetObjectLabelEXT = NULL; +PFNGLLABELOBJECTEXTPROC __glewLabelObjectEXT = NULL; + +PFNGLINSERTEVENTMARKEREXTPROC __glewInsertEventMarkerEXT = NULL; +PFNGLPOPGROUPMARKEREXTPROC __glewPopGroupMarkerEXT = NULL; +PFNGLPUSHGROUPMARKEREXTPROC __glewPushGroupMarkerEXT = NULL; + +PFNGLDEPTHBOUNDSEXTPROC __glewDepthBoundsEXT = NULL; + +PFNGLBINDMULTITEXTUREEXTPROC __glewBindMultiTextureEXT = NULL; +PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC __glewCheckNamedFramebufferStatusEXT = NULL; +PFNGLCLIENTATTRIBDEFAULTEXTPROC __glewClientAttribDefaultEXT = NULL; +PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC __glewCompressedMultiTexImage1DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC __glewCompressedMultiTexImage2DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC __glewCompressedMultiTexImage3DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC __glewCompressedMultiTexSubImage1DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC __glewCompressedMultiTexSubImage2DEXT = NULL; +PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC __glewCompressedMultiTexSubImage3DEXT = NULL; +PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC __glewCompressedTextureImage1DEXT = NULL; +PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC __glewCompressedTextureImage2DEXT = NULL; +PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC __glewCompressedTextureImage3DEXT = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC __glewCompressedTextureSubImage1DEXT = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC __glewCompressedTextureSubImage2DEXT = NULL; +PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC __glewCompressedTextureSubImage3DEXT = NULL; +PFNGLCOPYMULTITEXIMAGE1DEXTPROC __glewCopyMultiTexImage1DEXT = NULL; +PFNGLCOPYMULTITEXIMAGE2DEXTPROC __glewCopyMultiTexImage2DEXT = NULL; +PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC __glewCopyMultiTexSubImage1DEXT = NULL; +PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC __glewCopyMultiTexSubImage2DEXT = NULL; +PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC __glewCopyMultiTexSubImage3DEXT = NULL; +PFNGLCOPYTEXTUREIMAGE1DEXTPROC __glewCopyTextureImage1DEXT = NULL; +PFNGLCOPYTEXTUREIMAGE2DEXTPROC __glewCopyTextureImage2DEXT = NULL; +PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT = NULL; +PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT = NULL; +PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT = NULL; +PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT = NULL; +PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT = NULL; +PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT = NULL; +PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT = NULL; +PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT = NULL; +PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT = NULL; +PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT = NULL; +PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT = NULL; +PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT = NULL; +PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT = NULL; +PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT = NULL; +PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT = NULL; +PFNGLGENERATEMULTITEXMIPMAPEXTPROC __glewGenerateMultiTexMipmapEXT = NULL; +PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT = NULL; +PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT = NULL; +PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT = NULL; +PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT = NULL; +PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT = NULL; +PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT = NULL; +PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT = NULL; +PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT = NULL; +PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT = NULL; +PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT = NULL; +PFNGLGETMULTITEXGENDVEXTPROC __glewGetMultiTexGendvEXT = NULL; +PFNGLGETMULTITEXGENFVEXTPROC __glewGetMultiTexGenfvEXT = NULL; +PFNGLGETMULTITEXGENIVEXTPROC __glewGetMultiTexGenivEXT = NULL; +PFNGLGETMULTITEXIMAGEEXTPROC __glewGetMultiTexImageEXT = NULL; +PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC __glewGetMultiTexLevelParameterfvEXT = NULL; +PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC __glewGetMultiTexLevelParameterivEXT = NULL; +PFNGLGETMULTITEXPARAMETERIIVEXTPROC __glewGetMultiTexParameterIivEXT = NULL; +PFNGLGETMULTITEXPARAMETERIUIVEXTPROC __glewGetMultiTexParameterIuivEXT = NULL; +PFNGLGETMULTITEXPARAMETERFVEXTPROC __glewGetMultiTexParameterfvEXT = NULL; +PFNGLGETMULTITEXPARAMETERIVEXTPROC __glewGetMultiTexParameterivEXT = NULL; +PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC __glewGetNamedBufferParameterivEXT = NULL; +PFNGLGETNAMEDBUFFERPOINTERVEXTPROC __glewGetNamedBufferPointervEXT = NULL; +PFNGLGETNAMEDBUFFERSUBDATAEXTPROC __glewGetNamedBufferSubDataEXT = NULL; +PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetNamedFramebufferAttachmentParameterivEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC __glewGetNamedProgramLocalParameterIivEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC __glewGetNamedProgramLocalParameterIuivEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC __glewGetNamedProgramLocalParameterdvEXT = NULL; +PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC __glewGetNamedProgramLocalParameterfvEXT = NULL; +PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT = NULL; +PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT = NULL; +PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT = NULL; +PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT = NULL; +PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT = NULL; +PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT = NULL; +PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT = NULL; +PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT = NULL; +PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT = NULL; +PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT = NULL; +PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT = NULL; +PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT = NULL; +PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT = NULL; +PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT = NULL; +PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT = NULL; +PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT = NULL; +PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT = NULL; +PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT = NULL; +PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT = NULL; +PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT = NULL; +PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT = NULL; +PFNGLMATRIXLOADTRANSPOSEFEXTPROC __glewMatrixLoadTransposefEXT = NULL; +PFNGLMATRIXLOADDEXTPROC __glewMatrixLoaddEXT = NULL; +PFNGLMATRIXLOADFEXTPROC __glewMatrixLoadfEXT = NULL; +PFNGLMATRIXMULTTRANSPOSEDEXTPROC __glewMatrixMultTransposedEXT = NULL; +PFNGLMATRIXMULTTRANSPOSEFEXTPROC __glewMatrixMultTransposefEXT = NULL; +PFNGLMATRIXMULTDEXTPROC __glewMatrixMultdEXT = NULL; +PFNGLMATRIXMULTFEXTPROC __glewMatrixMultfEXT = NULL; +PFNGLMATRIXORTHOEXTPROC __glewMatrixOrthoEXT = NULL; +PFNGLMATRIXPOPEXTPROC __glewMatrixPopEXT = NULL; +PFNGLMATRIXPUSHEXTPROC __glewMatrixPushEXT = NULL; +PFNGLMATRIXROTATEDEXTPROC __glewMatrixRotatedEXT = NULL; +PFNGLMATRIXROTATEFEXTPROC __glewMatrixRotatefEXT = NULL; +PFNGLMATRIXSCALEDEXTPROC __glewMatrixScaledEXT = NULL; +PFNGLMATRIXSCALEFEXTPROC __glewMatrixScalefEXT = NULL; +PFNGLMATRIXTRANSLATEDEXTPROC __glewMatrixTranslatedEXT = NULL; +PFNGLMATRIXTRANSLATEFEXTPROC __glewMatrixTranslatefEXT = NULL; +PFNGLMULTITEXBUFFEREXTPROC __glewMultiTexBufferEXT = NULL; +PFNGLMULTITEXCOORDPOINTEREXTPROC __glewMultiTexCoordPointerEXT = NULL; +PFNGLMULTITEXENVFEXTPROC __glewMultiTexEnvfEXT = NULL; +PFNGLMULTITEXENVFVEXTPROC __glewMultiTexEnvfvEXT = NULL; +PFNGLMULTITEXENVIEXTPROC __glewMultiTexEnviEXT = NULL; +PFNGLMULTITEXENVIVEXTPROC __glewMultiTexEnvivEXT = NULL; +PFNGLMULTITEXGENDEXTPROC __glewMultiTexGendEXT = NULL; +PFNGLMULTITEXGENDVEXTPROC __glewMultiTexGendvEXT = NULL; +PFNGLMULTITEXGENFEXTPROC __glewMultiTexGenfEXT = NULL; +PFNGLMULTITEXGENFVEXTPROC __glewMultiTexGenfvEXT = NULL; +PFNGLMULTITEXGENIEXTPROC __glewMultiTexGeniEXT = NULL; +PFNGLMULTITEXGENIVEXTPROC __glewMultiTexGenivEXT = NULL; +PFNGLMULTITEXIMAGE1DEXTPROC __glewMultiTexImage1DEXT = NULL; +PFNGLMULTITEXIMAGE2DEXTPROC __glewMultiTexImage2DEXT = NULL; +PFNGLMULTITEXIMAGE3DEXTPROC __glewMultiTexImage3DEXT = NULL; +PFNGLMULTITEXPARAMETERIIVEXTPROC __glewMultiTexParameterIivEXT = NULL; +PFNGLMULTITEXPARAMETERIUIVEXTPROC __glewMultiTexParameterIuivEXT = NULL; +PFNGLMULTITEXPARAMETERFEXTPROC __glewMultiTexParameterfEXT = NULL; +PFNGLMULTITEXPARAMETERFVEXTPROC __glewMultiTexParameterfvEXT = NULL; +PFNGLMULTITEXPARAMETERIEXTPROC __glewMultiTexParameteriEXT = NULL; +PFNGLMULTITEXPARAMETERIVEXTPROC __glewMultiTexParameterivEXT = NULL; +PFNGLMULTITEXRENDERBUFFEREXTPROC __glewMultiTexRenderbufferEXT = NULL; +PFNGLMULTITEXSUBIMAGE1DEXTPROC __glewMultiTexSubImage1DEXT = NULL; +PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT = NULL; +PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT = NULL; +PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT = NULL; +PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT = NULL; +PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT = NULL; +PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC __glewNamedFramebufferTexture3DEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC __glewNamedFramebufferTextureEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC __glewNamedFramebufferTextureFaceEXT = NULL; +PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC __glewNamedFramebufferTextureLayerEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC __glewNamedProgramLocalParameter4dEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC __glewNamedProgramLocalParameter4dvEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC __glewNamedProgramLocalParameter4fEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC __glewNamedProgramLocalParameter4fvEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC __glewNamedProgramLocalParameterI4iEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC __glewNamedProgramLocalParameterI4ivEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC __glewNamedProgramLocalParameterI4uiEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC __glewNamedProgramLocalParameterI4uivEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC __glewNamedProgramLocalParameters4fvEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC __glewNamedProgramLocalParametersI4ivEXT = NULL; +PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC __glewNamedProgramLocalParametersI4uivEXT = NULL; +PFNGLNAMEDPROGRAMSTRINGEXTPROC __glewNamedProgramStringEXT = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC __glewNamedRenderbufferStorageEXT = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC __glewNamedRenderbufferStorageMultisampleCoverageEXT = NULL; +PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewNamedRenderbufferStorageMultisampleEXT = NULL; +PFNGLPROGRAMUNIFORM1FEXTPROC __glewProgramUniform1fEXT = NULL; +PFNGLPROGRAMUNIFORM1FVEXTPROC __glewProgramUniform1fvEXT = NULL; +PFNGLPROGRAMUNIFORM1IEXTPROC __glewProgramUniform1iEXT = NULL; +PFNGLPROGRAMUNIFORM1IVEXTPROC __glewProgramUniform1ivEXT = NULL; +PFNGLPROGRAMUNIFORM1UIEXTPROC __glewProgramUniform1uiEXT = NULL; +PFNGLPROGRAMUNIFORM1UIVEXTPROC __glewProgramUniform1uivEXT = NULL; +PFNGLPROGRAMUNIFORM2FEXTPROC __glewProgramUniform2fEXT = NULL; +PFNGLPROGRAMUNIFORM2FVEXTPROC __glewProgramUniform2fvEXT = NULL; +PFNGLPROGRAMUNIFORM2IEXTPROC __glewProgramUniform2iEXT = NULL; +PFNGLPROGRAMUNIFORM2IVEXTPROC __glewProgramUniform2ivEXT = NULL; +PFNGLPROGRAMUNIFORM2UIEXTPROC __glewProgramUniform2uiEXT = NULL; +PFNGLPROGRAMUNIFORM2UIVEXTPROC __glewProgramUniform2uivEXT = NULL; +PFNGLPROGRAMUNIFORM3FEXTPROC __glewProgramUniform3fEXT = NULL; +PFNGLPROGRAMUNIFORM3FVEXTPROC __glewProgramUniform3fvEXT = NULL; +PFNGLPROGRAMUNIFORM3IEXTPROC __glewProgramUniform3iEXT = NULL; +PFNGLPROGRAMUNIFORM3IVEXTPROC __glewProgramUniform3ivEXT = NULL; +PFNGLPROGRAMUNIFORM3UIEXTPROC __glewProgramUniform3uiEXT = NULL; +PFNGLPROGRAMUNIFORM3UIVEXTPROC __glewProgramUniform3uivEXT = NULL; +PFNGLPROGRAMUNIFORM4FEXTPROC __glewProgramUniform4fEXT = NULL; +PFNGLPROGRAMUNIFORM4FVEXTPROC __glewProgramUniform4fvEXT = NULL; +PFNGLPROGRAMUNIFORM4IEXTPROC __glewProgramUniform4iEXT = NULL; +PFNGLPROGRAMUNIFORM4IVEXTPROC __glewProgramUniform4ivEXT = NULL; +PFNGLPROGRAMUNIFORM4UIEXTPROC __glewProgramUniform4uiEXT = NULL; +PFNGLPROGRAMUNIFORM4UIVEXTPROC __glewProgramUniform4uivEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC __glewProgramUniformMatrix2fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC __glewProgramUniformMatrix2x3fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC __glewProgramUniformMatrix2x4fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC __glewProgramUniformMatrix3fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC __glewProgramUniformMatrix3x2fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC __glewProgramUniformMatrix3x4fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC __glewProgramUniformMatrix4fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC __glewProgramUniformMatrix4x2fvEXT = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC __glewProgramUniformMatrix4x3fvEXT = NULL; +PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC __glewPushClientAttribDefaultEXT = NULL; +PFNGLTEXTUREBUFFEREXTPROC __glewTextureBufferEXT = NULL; +PFNGLTEXTUREIMAGE1DEXTPROC __glewTextureImage1DEXT = NULL; +PFNGLTEXTUREIMAGE2DEXTPROC __glewTextureImage2DEXT = NULL; +PFNGLTEXTUREIMAGE3DEXTPROC __glewTextureImage3DEXT = NULL; +PFNGLTEXTUREPARAMETERIIVEXTPROC __glewTextureParameterIivEXT = NULL; +PFNGLTEXTUREPARAMETERIUIVEXTPROC __glewTextureParameterIuivEXT = NULL; +PFNGLTEXTUREPARAMETERFEXTPROC __glewTextureParameterfEXT = NULL; +PFNGLTEXTUREPARAMETERFVEXTPROC __glewTextureParameterfvEXT = NULL; +PFNGLTEXTUREPARAMETERIEXTPROC __glewTextureParameteriEXT = NULL; +PFNGLTEXTUREPARAMETERIVEXTPROC __glewTextureParameterivEXT = NULL; +PFNGLTEXTURERENDERBUFFEREXTPROC __glewTextureRenderbufferEXT = NULL; +PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT = NULL; +PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT = NULL; +PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT = NULL; +PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT = NULL; +PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT = NULL; +PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT = NULL; +PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT = NULL; +PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT = NULL; +PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT = NULL; +PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT = NULL; +PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT = NULL; +PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC __glewVertexArrayVertexAttribDivisorEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT = NULL; +PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT = NULL; + +PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT = NULL; +PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT = NULL; +PFNGLENABLEINDEXEDEXTPROC __glewEnableIndexedEXT = NULL; +PFNGLGETBOOLEANINDEXEDVEXTPROC __glewGetBooleanIndexedvEXT = NULL; +PFNGLGETINTEGERINDEXEDVEXTPROC __glewGetIntegerIndexedvEXT = NULL; +PFNGLISENABLEDINDEXEDEXTPROC __glewIsEnabledIndexedEXT = NULL; + +PFNGLDRAWARRAYSINSTANCEDEXTPROC __glewDrawArraysInstancedEXT = NULL; +PFNGLDRAWELEMENTSINSTANCEDEXTPROC __glewDrawElementsInstancedEXT = NULL; + +PFNGLDRAWRANGEELEMENTSEXTPROC __glewDrawRangeElementsEXT = NULL; + +PFNGLFOGCOORDPOINTEREXTPROC __glewFogCoordPointerEXT = NULL; +PFNGLFOGCOORDDEXTPROC __glewFogCoorddEXT = NULL; +PFNGLFOGCOORDDVEXTPROC __glewFogCoorddvEXT = NULL; +PFNGLFOGCOORDFEXTPROC __glewFogCoordfEXT = NULL; +PFNGLFOGCOORDFVEXTPROC __glewFogCoordfvEXT = NULL; + +PFNGLFRAGMENTCOLORMATERIALEXTPROC __glewFragmentColorMaterialEXT = NULL; +PFNGLFRAGMENTLIGHTMODELFEXTPROC __glewFragmentLightModelfEXT = NULL; +PFNGLFRAGMENTLIGHTMODELFVEXTPROC __glewFragmentLightModelfvEXT = NULL; +PFNGLFRAGMENTLIGHTMODELIEXTPROC __glewFragmentLightModeliEXT = NULL; +PFNGLFRAGMENTLIGHTMODELIVEXTPROC __glewFragmentLightModelivEXT = NULL; +PFNGLFRAGMENTLIGHTFEXTPROC __glewFragmentLightfEXT = NULL; +PFNGLFRAGMENTLIGHTFVEXTPROC __glewFragmentLightfvEXT = NULL; +PFNGLFRAGMENTLIGHTIEXTPROC __glewFragmentLightiEXT = NULL; +PFNGLFRAGMENTLIGHTIVEXTPROC __glewFragmentLightivEXT = NULL; +PFNGLFRAGMENTMATERIALFEXTPROC __glewFragmentMaterialfEXT = NULL; +PFNGLFRAGMENTMATERIALFVEXTPROC __glewFragmentMaterialfvEXT = NULL; +PFNGLFRAGMENTMATERIALIEXTPROC __glewFragmentMaterialiEXT = NULL; +PFNGLFRAGMENTMATERIALIVEXTPROC __glewFragmentMaterialivEXT = NULL; +PFNGLGETFRAGMENTLIGHTFVEXTPROC __glewGetFragmentLightfvEXT = NULL; +PFNGLGETFRAGMENTLIGHTIVEXTPROC __glewGetFragmentLightivEXT = NULL; +PFNGLGETFRAGMENTMATERIALFVEXTPROC __glewGetFragmentMaterialfvEXT = NULL; +PFNGLGETFRAGMENTMATERIALIVEXTPROC __glewGetFragmentMaterialivEXT = NULL; +PFNGLLIGHTENVIEXTPROC __glewLightEnviEXT = NULL; + +PFNGLBLITFRAMEBUFFEREXTPROC __glewBlitFramebufferEXT = NULL; + +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC __glewRenderbufferStorageMultisampleEXT = NULL; + +PFNGLBINDFRAMEBUFFEREXTPROC __glewBindFramebufferEXT = NULL; +PFNGLBINDRENDERBUFFEREXTPROC __glewBindRenderbufferEXT = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC __glewCheckFramebufferStatusEXT = NULL; +PFNGLDELETEFRAMEBUFFERSEXTPROC __glewDeleteFramebuffersEXT = NULL; +PFNGLDELETERENDERBUFFERSEXTPROC __glewDeleteRenderbuffersEXT = NULL; +PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC __glewFramebufferRenderbufferEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE1DEXTPROC __glewFramebufferTexture1DEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE2DEXTPROC __glewFramebufferTexture2DEXT = NULL; +PFNGLFRAMEBUFFERTEXTURE3DEXTPROC __glewFramebufferTexture3DEXT = NULL; +PFNGLGENFRAMEBUFFERSEXTPROC __glewGenFramebuffersEXT = NULL; +PFNGLGENRENDERBUFFERSEXTPROC __glewGenRenderbuffersEXT = NULL; +PFNGLGENERATEMIPMAPEXTPROC __glewGenerateMipmapEXT = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC __glewGetFramebufferAttachmentParameterivEXT = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC __glewGetRenderbufferParameterivEXT = NULL; +PFNGLISFRAMEBUFFEREXTPROC __glewIsFramebufferEXT = NULL; +PFNGLISRENDERBUFFEREXTPROC __glewIsRenderbufferEXT = NULL; +PFNGLRENDERBUFFERSTORAGEEXTPROC __glewRenderbufferStorageEXT = NULL; + +PFNGLFRAMEBUFFERTEXTUREEXTPROC __glewFramebufferTextureEXT = NULL; +PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC __glewFramebufferTextureFaceEXT = NULL; +PFNGLPROGRAMPARAMETERIEXTPROC __glewProgramParameteriEXT = NULL; + +PFNGLPROGRAMENVPARAMETERS4FVEXTPROC __glewProgramEnvParameters4fvEXT = NULL; +PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC __glewProgramLocalParameters4fvEXT = NULL; + +PFNGLBINDFRAGDATALOCATIONEXTPROC __glewBindFragDataLocationEXT = NULL; +PFNGLGETFRAGDATALOCATIONEXTPROC __glewGetFragDataLocationEXT = NULL; +PFNGLGETUNIFORMUIVEXTPROC __glewGetUniformuivEXT = NULL; +PFNGLGETVERTEXATTRIBIIVEXTPROC __glewGetVertexAttribIivEXT = NULL; +PFNGLGETVERTEXATTRIBIUIVEXTPROC __glewGetVertexAttribIuivEXT = NULL; +PFNGLUNIFORM1UIEXTPROC __glewUniform1uiEXT = NULL; +PFNGLUNIFORM1UIVEXTPROC __glewUniform1uivEXT = NULL; +PFNGLUNIFORM2UIEXTPROC __glewUniform2uiEXT = NULL; +PFNGLUNIFORM2UIVEXTPROC __glewUniform2uivEXT = NULL; +PFNGLUNIFORM3UIEXTPROC __glewUniform3uiEXT = NULL; +PFNGLUNIFORM3UIVEXTPROC __glewUniform3uivEXT = NULL; +PFNGLUNIFORM4UIEXTPROC __glewUniform4uiEXT = NULL; +PFNGLUNIFORM4UIVEXTPROC __glewUniform4uivEXT = NULL; +PFNGLVERTEXATTRIBI1IEXTPROC __glewVertexAttribI1iEXT = NULL; +PFNGLVERTEXATTRIBI1IVEXTPROC __glewVertexAttribI1ivEXT = NULL; +PFNGLVERTEXATTRIBI1UIEXTPROC __glewVertexAttribI1uiEXT = NULL; +PFNGLVERTEXATTRIBI1UIVEXTPROC __glewVertexAttribI1uivEXT = NULL; +PFNGLVERTEXATTRIBI2IEXTPROC __glewVertexAttribI2iEXT = NULL; +PFNGLVERTEXATTRIBI2IVEXTPROC __glewVertexAttribI2ivEXT = NULL; +PFNGLVERTEXATTRIBI2UIEXTPROC __glewVertexAttribI2uiEXT = NULL; +PFNGLVERTEXATTRIBI2UIVEXTPROC __glewVertexAttribI2uivEXT = NULL; +PFNGLVERTEXATTRIBI3IEXTPROC __glewVertexAttribI3iEXT = NULL; +PFNGLVERTEXATTRIBI3IVEXTPROC __glewVertexAttribI3ivEXT = NULL; +PFNGLVERTEXATTRIBI3UIEXTPROC __glewVertexAttribI3uiEXT = NULL; +PFNGLVERTEXATTRIBI3UIVEXTPROC __glewVertexAttribI3uivEXT = NULL; +PFNGLVERTEXATTRIBI4BVEXTPROC __glewVertexAttribI4bvEXT = NULL; +PFNGLVERTEXATTRIBI4IEXTPROC __glewVertexAttribI4iEXT = NULL; +PFNGLVERTEXATTRIBI4IVEXTPROC __glewVertexAttribI4ivEXT = NULL; +PFNGLVERTEXATTRIBI4SVEXTPROC __glewVertexAttribI4svEXT = NULL; +PFNGLVERTEXATTRIBI4UBVEXTPROC __glewVertexAttribI4ubvEXT = NULL; +PFNGLVERTEXATTRIBI4UIEXTPROC __glewVertexAttribI4uiEXT = NULL; +PFNGLVERTEXATTRIBI4UIVEXTPROC __glewVertexAttribI4uivEXT = NULL; +PFNGLVERTEXATTRIBI4USVEXTPROC __glewVertexAttribI4usvEXT = NULL; +PFNGLVERTEXATTRIBIPOINTEREXTPROC __glewVertexAttribIPointerEXT = NULL; + +PFNGLGETHISTOGRAMEXTPROC __glewGetHistogramEXT = NULL; +PFNGLGETHISTOGRAMPARAMETERFVEXTPROC __glewGetHistogramParameterfvEXT = NULL; +PFNGLGETHISTOGRAMPARAMETERIVEXTPROC __glewGetHistogramParameterivEXT = NULL; +PFNGLGETMINMAXEXTPROC __glewGetMinmaxEXT = NULL; +PFNGLGETMINMAXPARAMETERFVEXTPROC __glewGetMinmaxParameterfvEXT = NULL; +PFNGLGETMINMAXPARAMETERIVEXTPROC __glewGetMinmaxParameterivEXT = NULL; +PFNGLHISTOGRAMEXTPROC __glewHistogramEXT = NULL; +PFNGLMINMAXEXTPROC __glewMinmaxEXT = NULL; +PFNGLRESETHISTOGRAMEXTPROC __glewResetHistogramEXT = NULL; +PFNGLRESETMINMAXEXTPROC __glewResetMinmaxEXT = NULL; + +PFNGLINDEXFUNCEXTPROC __glewIndexFuncEXT = NULL; + +PFNGLINDEXMATERIALEXTPROC __glewIndexMaterialEXT = NULL; + +PFNGLAPPLYTEXTUREEXTPROC __glewApplyTextureEXT = NULL; +PFNGLTEXTURELIGHTEXTPROC __glewTextureLightEXT = NULL; +PFNGLTEXTUREMATERIALEXTPROC __glewTextureMaterialEXT = NULL; + +PFNGLMULTIDRAWARRAYSEXTPROC __glewMultiDrawArraysEXT = NULL; +PFNGLMULTIDRAWELEMENTSEXTPROC __glewMultiDrawElementsEXT = NULL; + +PFNGLSAMPLEMASKEXTPROC __glewSampleMaskEXT = NULL; +PFNGLSAMPLEPATTERNEXTPROC __glewSamplePatternEXT = NULL; + +PFNGLCOLORTABLEEXTPROC __glewColorTableEXT = NULL; +PFNGLGETCOLORTABLEEXTPROC __glewGetColorTableEXT = NULL; +PFNGLGETCOLORTABLEPARAMETERFVEXTPROC __glewGetColorTableParameterfvEXT = NULL; +PFNGLGETCOLORTABLEPARAMETERIVEXTPROC __glewGetColorTableParameterivEXT = NULL; + +PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC __glewGetPixelTransformParameterfvEXT = NULL; +PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC __glewGetPixelTransformParameterivEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERFEXTPROC __glewPixelTransformParameterfEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC __glewPixelTransformParameterfvEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERIEXTPROC __glewPixelTransformParameteriEXT = NULL; +PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC __glewPixelTransformParameterivEXT = NULL; + +PFNGLPOINTPARAMETERFEXTPROC __glewPointParameterfEXT = NULL; +PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT = NULL; + +PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT = NULL; + +PFNGLPOLYGONOFFSETCLAMPEXTPROC __glewPolygonOffsetClampEXT = NULL; + +PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT = NULL; + +PFNGLCOVERAGEMODULATIONNVPROC __glewCoverageModulationNV = NULL; +PFNGLCOVERAGEMODULATIONTABLENVPROC __glewCoverageModulationTableNV = NULL; +PFNGLGETCOVERAGEMODULATIONTABLENVPROC __glewGetCoverageModulationTableNV = NULL; +PFNGLRASTERSAMPLESEXTPROC __glewRasterSamplesEXT = NULL; + +PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT = NULL; +PFNGLENDSCENEEXTPROC __glewEndSceneEXT = NULL; + +PFNGLSECONDARYCOLOR3BEXTPROC __glewSecondaryColor3bEXT = NULL; +PFNGLSECONDARYCOLOR3BVEXTPROC __glewSecondaryColor3bvEXT = NULL; +PFNGLSECONDARYCOLOR3DEXTPROC __glewSecondaryColor3dEXT = NULL; +PFNGLSECONDARYCOLOR3DVEXTPROC __glewSecondaryColor3dvEXT = NULL; +PFNGLSECONDARYCOLOR3FEXTPROC __glewSecondaryColor3fEXT = NULL; +PFNGLSECONDARYCOLOR3FVEXTPROC __glewSecondaryColor3fvEXT = NULL; +PFNGLSECONDARYCOLOR3IEXTPROC __glewSecondaryColor3iEXT = NULL; +PFNGLSECONDARYCOLOR3IVEXTPROC __glewSecondaryColor3ivEXT = NULL; +PFNGLSECONDARYCOLOR3SEXTPROC __glewSecondaryColor3sEXT = NULL; +PFNGLSECONDARYCOLOR3SVEXTPROC __glewSecondaryColor3svEXT = NULL; +PFNGLSECONDARYCOLOR3UBEXTPROC __glewSecondaryColor3ubEXT = NULL; +PFNGLSECONDARYCOLOR3UBVEXTPROC __glewSecondaryColor3ubvEXT = NULL; +PFNGLSECONDARYCOLOR3UIEXTPROC __glewSecondaryColor3uiEXT = NULL; +PFNGLSECONDARYCOLOR3UIVEXTPROC __glewSecondaryColor3uivEXT = NULL; +PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT = NULL; +PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT = NULL; +PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT = NULL; + +PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT = NULL; +PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT = NULL; +PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT = NULL; + +PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT = NULL; +PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT = NULL; + +PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT = NULL; + +PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT = NULL; +PFNGLTEXSUBIMAGE2DEXTPROC __glewTexSubImage2DEXT = NULL; +PFNGLTEXSUBIMAGE3DEXTPROC __glewTexSubImage3DEXT = NULL; + +PFNGLTEXIMAGE3DEXTPROC __glewTexImage3DEXT = NULL; + +PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC __glewFramebufferTextureLayerEXT = NULL; + +PFNGLTEXBUFFEREXTPROC __glewTexBufferEXT = NULL; + +PFNGLCLEARCOLORIIEXTPROC __glewClearColorIiEXT = NULL; +PFNGLCLEARCOLORIUIEXTPROC __glewClearColorIuiEXT = NULL; +PFNGLGETTEXPARAMETERIIVEXTPROC __glewGetTexParameterIivEXT = NULL; +PFNGLGETTEXPARAMETERIUIVEXTPROC __glewGetTexParameterIuivEXT = NULL; +PFNGLTEXPARAMETERIIVEXTPROC __glewTexParameterIivEXT = NULL; +PFNGLTEXPARAMETERIUIVEXTPROC __glewTexParameterIuivEXT = NULL; + +PFNGLARETEXTURESRESIDENTEXTPROC __glewAreTexturesResidentEXT = NULL; +PFNGLBINDTEXTUREEXTPROC __glewBindTextureEXT = NULL; +PFNGLDELETETEXTURESEXTPROC __glewDeleteTexturesEXT = NULL; +PFNGLGENTEXTURESEXTPROC __glewGenTexturesEXT = NULL; +PFNGLISTEXTUREEXTPROC __glewIsTextureEXT = NULL; +PFNGLPRIORITIZETEXTURESEXTPROC __glewPrioritizeTexturesEXT = NULL; + +PFNGLTEXTURENORMALEXTPROC __glewTextureNormalEXT = NULL; + +PFNGLGETQUERYOBJECTI64VEXTPROC __glewGetQueryObjecti64vEXT = NULL; +PFNGLGETQUERYOBJECTUI64VEXTPROC __glewGetQueryObjectui64vEXT = NULL; + +PFNGLBEGINTRANSFORMFEEDBACKEXTPROC __glewBeginTransformFeedbackEXT = NULL; +PFNGLBINDBUFFERBASEEXTPROC __glewBindBufferBaseEXT = NULL; +PFNGLBINDBUFFEROFFSETEXTPROC __glewBindBufferOffsetEXT = NULL; +PFNGLBINDBUFFERRANGEEXTPROC __glewBindBufferRangeEXT = NULL; +PFNGLENDTRANSFORMFEEDBACKEXTPROC __glewEndTransformFeedbackEXT = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC __glewGetTransformFeedbackVaryingEXT = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC __glewTransformFeedbackVaryingsEXT = NULL; + +PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT = NULL; +PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT = NULL; +PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT = NULL; +PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT = NULL; +PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT = NULL; +PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT = NULL; +PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT = NULL; +PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT = NULL; + +PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT = NULL; +PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT = NULL; +PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT = NULL; +PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT = NULL; +PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT = NULL; +PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT = NULL; +PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT = NULL; +PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT = NULL; +PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT = NULL; +PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT = NULL; +PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT = NULL; + +PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT = NULL; +PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT = NULL; +PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT = NULL; +PFNGLBINDPARAMETEREXTPROC __glewBindParameterEXT = NULL; +PFNGLBINDTEXGENPARAMETEREXTPROC __glewBindTexGenParameterEXT = NULL; +PFNGLBINDTEXTUREUNITPARAMETEREXTPROC __glewBindTextureUnitParameterEXT = NULL; +PFNGLBINDVERTEXSHADEREXTPROC __glewBindVertexShaderEXT = NULL; +PFNGLDELETEVERTEXSHADEREXTPROC __glewDeleteVertexShaderEXT = NULL; +PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC __glewDisableVariantClientStateEXT = NULL; +PFNGLENABLEVARIANTCLIENTSTATEEXTPROC __glewEnableVariantClientStateEXT = NULL; +PFNGLENDVERTEXSHADEREXTPROC __glewEndVertexShaderEXT = NULL; +PFNGLEXTRACTCOMPONENTEXTPROC __glewExtractComponentEXT = NULL; +PFNGLGENSYMBOLSEXTPROC __glewGenSymbolsEXT = NULL; +PFNGLGENVERTEXSHADERSEXTPROC __glewGenVertexShadersEXT = NULL; +PFNGLGETINVARIANTBOOLEANVEXTPROC __glewGetInvariantBooleanvEXT = NULL; +PFNGLGETINVARIANTFLOATVEXTPROC __glewGetInvariantFloatvEXT = NULL; +PFNGLGETINVARIANTINTEGERVEXTPROC __glewGetInvariantIntegervEXT = NULL; +PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC __glewGetLocalConstantBooleanvEXT = NULL; +PFNGLGETLOCALCONSTANTFLOATVEXTPROC __glewGetLocalConstantFloatvEXT = NULL; +PFNGLGETLOCALCONSTANTINTEGERVEXTPROC __glewGetLocalConstantIntegervEXT = NULL; +PFNGLGETVARIANTBOOLEANVEXTPROC __glewGetVariantBooleanvEXT = NULL; +PFNGLGETVARIANTFLOATVEXTPROC __glewGetVariantFloatvEXT = NULL; +PFNGLGETVARIANTINTEGERVEXTPROC __glewGetVariantIntegervEXT = NULL; +PFNGLGETVARIANTPOINTERVEXTPROC __glewGetVariantPointervEXT = NULL; +PFNGLINSERTCOMPONENTEXTPROC __glewInsertComponentEXT = NULL; +PFNGLISVARIANTENABLEDEXTPROC __glewIsVariantEnabledEXT = NULL; +PFNGLSETINVARIANTEXTPROC __glewSetInvariantEXT = NULL; +PFNGLSETLOCALCONSTANTEXTPROC __glewSetLocalConstantEXT = NULL; +PFNGLSHADEROP1EXTPROC __glewShaderOp1EXT = NULL; +PFNGLSHADEROP2EXTPROC __glewShaderOp2EXT = NULL; +PFNGLSHADEROP3EXTPROC __glewShaderOp3EXT = NULL; +PFNGLSWIZZLEEXTPROC __glewSwizzleEXT = NULL; +PFNGLVARIANTPOINTEREXTPROC __glewVariantPointerEXT = NULL; +PFNGLVARIANTBVEXTPROC __glewVariantbvEXT = NULL; +PFNGLVARIANTDVEXTPROC __glewVariantdvEXT = NULL; +PFNGLVARIANTFVEXTPROC __glewVariantfvEXT = NULL; +PFNGLVARIANTIVEXTPROC __glewVariantivEXT = NULL; +PFNGLVARIANTSVEXTPROC __glewVariantsvEXT = NULL; +PFNGLVARIANTUBVEXTPROC __glewVariantubvEXT = NULL; +PFNGLVARIANTUIVEXTPROC __glewVariantuivEXT = NULL; +PFNGLVARIANTUSVEXTPROC __glewVariantusvEXT = NULL; +PFNGLWRITEMASKEXTPROC __glewWriteMaskEXT = NULL; + +PFNGLVERTEXWEIGHTPOINTEREXTPROC __glewVertexWeightPointerEXT = NULL; +PFNGLVERTEXWEIGHTFEXTPROC __glewVertexWeightfEXT = NULL; +PFNGLVERTEXWEIGHTFVEXTPROC __glewVertexWeightfvEXT = NULL; + +PFNGLIMPORTSYNCEXTPROC __glewImportSyncEXT = NULL; + +PFNGLFRAMETERMINATORGREMEDYPROC __glewFrameTerminatorGREMEDY = NULL; + +PFNGLSTRINGMARKERGREMEDYPROC __glewStringMarkerGREMEDY = NULL; + +PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC __glewGetImageTransformParameterfvHP = NULL; +PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC __glewGetImageTransformParameterivHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERFHPPROC __glewImageTransformParameterfHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERFVHPPROC __glewImageTransformParameterfvHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERIHPPROC __glewImageTransformParameteriHP = NULL; +PFNGLIMAGETRANSFORMPARAMETERIVHPPROC __glewImageTransformParameterivHP = NULL; + +PFNGLMULTIMODEDRAWARRAYSIBMPROC __glewMultiModeDrawArraysIBM = NULL; +PFNGLMULTIMODEDRAWELEMENTSIBMPROC __glewMultiModeDrawElementsIBM = NULL; + +PFNGLCOLORPOINTERLISTIBMPROC __glewColorPointerListIBM = NULL; +PFNGLEDGEFLAGPOINTERLISTIBMPROC __glewEdgeFlagPointerListIBM = NULL; +PFNGLFOGCOORDPOINTERLISTIBMPROC __glewFogCoordPointerListIBM = NULL; +PFNGLINDEXPOINTERLISTIBMPROC __glewIndexPointerListIBM = NULL; +PFNGLNORMALPOINTERLISTIBMPROC __glewNormalPointerListIBM = NULL; +PFNGLSECONDARYCOLORPOINTERLISTIBMPROC __glewSecondaryColorPointerListIBM = NULL; +PFNGLTEXCOORDPOINTERLISTIBMPROC __glewTexCoordPointerListIBM = NULL; +PFNGLVERTEXPOINTERLISTIBMPROC __glewVertexPointerListIBM = NULL; + +PFNGLMAPTEXTURE2DINTELPROC __glewMapTexture2DINTEL = NULL; +PFNGLSYNCTEXTUREINTELPROC __glewSyncTextureINTEL = NULL; +PFNGLUNMAPTEXTURE2DINTELPROC __glewUnmapTexture2DINTEL = NULL; + +PFNGLCOLORPOINTERVINTELPROC __glewColorPointervINTEL = NULL; +PFNGLNORMALPOINTERVINTELPROC __glewNormalPointervINTEL = NULL; +PFNGLTEXCOORDPOINTERVINTELPROC __glewTexCoordPointervINTEL = NULL; +PFNGLVERTEXPOINTERVINTELPROC __glewVertexPointervINTEL = NULL; + +PFNGLBEGINPERFQUERYINTELPROC __glewBeginPerfQueryINTEL = NULL; +PFNGLCREATEPERFQUERYINTELPROC __glewCreatePerfQueryINTEL = NULL; +PFNGLDELETEPERFQUERYINTELPROC __glewDeletePerfQueryINTEL = NULL; +PFNGLENDPERFQUERYINTELPROC __glewEndPerfQueryINTEL = NULL; +PFNGLGETFIRSTPERFQUERYIDINTELPROC __glewGetFirstPerfQueryIdINTEL = NULL; +PFNGLGETNEXTPERFQUERYIDINTELPROC __glewGetNextPerfQueryIdINTEL = NULL; +PFNGLGETPERFCOUNTERINFOINTELPROC __glewGetPerfCounterInfoINTEL = NULL; +PFNGLGETPERFQUERYDATAINTELPROC __glewGetPerfQueryDataINTEL = NULL; +PFNGLGETPERFQUERYIDBYNAMEINTELPROC __glewGetPerfQueryIdByNameINTEL = NULL; +PFNGLGETPERFQUERYINFOINTELPROC __glewGetPerfQueryInfoINTEL = NULL; + +PFNGLTEXSCISSORFUNCINTELPROC __glewTexScissorFuncINTEL = NULL; +PFNGLTEXSCISSORINTELPROC __glewTexScissorINTEL = NULL; + +PFNGLBLENDBARRIERKHRPROC __glewBlendBarrierKHR = NULL; + +PFNGLDEBUGMESSAGECALLBACKPROC __glewDebugMessageCallback = NULL; +PFNGLDEBUGMESSAGECONTROLPROC __glewDebugMessageControl = NULL; +PFNGLDEBUGMESSAGEINSERTPROC __glewDebugMessageInsert = NULL; +PFNGLGETDEBUGMESSAGELOGPROC __glewGetDebugMessageLog = NULL; +PFNGLGETOBJECTLABELPROC __glewGetObjectLabel = NULL; +PFNGLGETOBJECTPTRLABELPROC __glewGetObjectPtrLabel = NULL; +PFNGLOBJECTLABELPROC __glewObjectLabel = NULL; +PFNGLOBJECTPTRLABELPROC __glewObjectPtrLabel = NULL; +PFNGLPOPDEBUGGROUPPROC __glewPopDebugGroup = NULL; +PFNGLPUSHDEBUGGROUPPROC __glewPushDebugGroup = NULL; + +PFNGLGETNUNIFORMFVPROC __glewGetnUniformfv = NULL; +PFNGLGETNUNIFORMIVPROC __glewGetnUniformiv = NULL; +PFNGLGETNUNIFORMUIVPROC __glewGetnUniformuiv = NULL; +PFNGLREADNPIXELSPROC __glewReadnPixels = NULL; + +PFNGLBUFFERREGIONENABLEDPROC __glewBufferRegionEnabled = NULL; +PFNGLDELETEBUFFERREGIONPROC __glewDeleteBufferRegion = NULL; +PFNGLDRAWBUFFERREGIONPROC __glewDrawBufferRegion = NULL; +PFNGLNEWBUFFERREGIONPROC __glewNewBufferRegion = NULL; +PFNGLREADBUFFERREGIONPROC __glewReadBufferRegion = NULL; + +PFNGLRESIZEBUFFERSMESAPROC __glewResizeBuffersMESA = NULL; + +PFNGLWINDOWPOS2DMESAPROC __glewWindowPos2dMESA = NULL; +PFNGLWINDOWPOS2DVMESAPROC __glewWindowPos2dvMESA = NULL; +PFNGLWINDOWPOS2FMESAPROC __glewWindowPos2fMESA = NULL; +PFNGLWINDOWPOS2FVMESAPROC __glewWindowPos2fvMESA = NULL; +PFNGLWINDOWPOS2IMESAPROC __glewWindowPos2iMESA = NULL; +PFNGLWINDOWPOS2IVMESAPROC __glewWindowPos2ivMESA = NULL; +PFNGLWINDOWPOS2SMESAPROC __glewWindowPos2sMESA = NULL; +PFNGLWINDOWPOS2SVMESAPROC __glewWindowPos2svMESA = NULL; +PFNGLWINDOWPOS3DMESAPROC __glewWindowPos3dMESA = NULL; +PFNGLWINDOWPOS3DVMESAPROC __glewWindowPos3dvMESA = NULL; +PFNGLWINDOWPOS3FMESAPROC __glewWindowPos3fMESA = NULL; +PFNGLWINDOWPOS3FVMESAPROC __glewWindowPos3fvMESA = NULL; +PFNGLWINDOWPOS3IMESAPROC __glewWindowPos3iMESA = NULL; +PFNGLWINDOWPOS3IVMESAPROC __glewWindowPos3ivMESA = NULL; +PFNGLWINDOWPOS3SMESAPROC __glewWindowPos3sMESA = NULL; +PFNGLWINDOWPOS3SVMESAPROC __glewWindowPos3svMESA = NULL; +PFNGLWINDOWPOS4DMESAPROC __glewWindowPos4dMESA = NULL; +PFNGLWINDOWPOS4DVMESAPROC __glewWindowPos4dvMESA = NULL; +PFNGLWINDOWPOS4FMESAPROC __glewWindowPos4fMESA = NULL; +PFNGLWINDOWPOS4FVMESAPROC __glewWindowPos4fvMESA = NULL; +PFNGLWINDOWPOS4IMESAPROC __glewWindowPos4iMESA = NULL; +PFNGLWINDOWPOS4IVMESAPROC __glewWindowPos4ivMESA = NULL; +PFNGLWINDOWPOS4SMESAPROC __glewWindowPos4sMESA = NULL; +PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL; + +PFNGLBEGINCONDITIONALRENDERNVXPROC __glewBeginConditionalRenderNVX = NULL; +PFNGLENDCONDITIONALRENDERNVXPROC __glewEndConditionalRenderNVX = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC __glewMultiDrawArraysIndirectBindlessNV = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC __glewMultiDrawElementsIndirectBindlessNV = NULL; + +PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawArraysIndirectBindlessCountNV = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC __glewMultiDrawElementsIndirectBindlessCountNV = NULL; + +PFNGLGETIMAGEHANDLENVPROC __glewGetImageHandleNV = NULL; +PFNGLGETTEXTUREHANDLENVPROC __glewGetTextureHandleNV = NULL; +PFNGLGETTEXTURESAMPLERHANDLENVPROC __glewGetTextureSamplerHandleNV = NULL; +PFNGLISIMAGEHANDLERESIDENTNVPROC __glewIsImageHandleResidentNV = NULL; +PFNGLISTEXTUREHANDLERESIDENTNVPROC __glewIsTextureHandleResidentNV = NULL; +PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC __glewMakeImageHandleNonResidentNV = NULL; +PFNGLMAKEIMAGEHANDLERESIDENTNVPROC __glewMakeImageHandleResidentNV = NULL; +PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC __glewMakeTextureHandleNonResidentNV = NULL; +PFNGLMAKETEXTUREHANDLERESIDENTNVPROC __glewMakeTextureHandleResidentNV = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC __glewProgramUniformHandleui64NV = NULL; +PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC __glewProgramUniformHandleui64vNV = NULL; +PFNGLUNIFORMHANDLEUI64NVPROC __glewUniformHandleui64NV = NULL; +PFNGLUNIFORMHANDLEUI64VNVPROC __glewUniformHandleui64vNV = NULL; + +PFNGLBLENDBARRIERNVPROC __glewBlendBarrierNV = NULL; +PFNGLBLENDPARAMETERINVPROC __glewBlendParameteriNV = NULL; + +PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV = NULL; +PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV = NULL; + +PFNGLSUBPIXELPRECISIONBIASNVPROC __glewSubpixelPrecisionBiasNV = NULL; + +PFNGLCONSERVATIVERASTERPARAMETERFNVPROC __glewConservativeRasterParameterfNV = NULL; + +PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV = NULL; + +PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL; +PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL; +PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL; + +PFNGLDRAWTEXTURENVPROC __glewDrawTextureNV = NULL; + +PFNGLEVALMAPSNVPROC __glewEvalMapsNV = NULL; +PFNGLGETMAPATTRIBPARAMETERFVNVPROC __glewGetMapAttribParameterfvNV = NULL; +PFNGLGETMAPATTRIBPARAMETERIVNVPROC __glewGetMapAttribParameterivNV = NULL; +PFNGLGETMAPCONTROLPOINTSNVPROC __glewGetMapControlPointsNV = NULL; +PFNGLGETMAPPARAMETERFVNVPROC __glewGetMapParameterfvNV = NULL; +PFNGLGETMAPPARAMETERIVNVPROC __glewGetMapParameterivNV = NULL; +PFNGLMAPCONTROLPOINTSNVPROC __glewMapControlPointsNV = NULL; +PFNGLMAPPARAMETERFVNVPROC __glewMapParameterfvNV = NULL; +PFNGLMAPPARAMETERIVNVPROC __glewMapParameterivNV = NULL; + +PFNGLGETMULTISAMPLEFVNVPROC __glewGetMultisamplefvNV = NULL; +PFNGLSAMPLEMASKINDEXEDNVPROC __glewSampleMaskIndexedNV = NULL; +PFNGLTEXRENDERBUFFERNVPROC __glewTexRenderbufferNV = NULL; + +PFNGLDELETEFENCESNVPROC __glewDeleteFencesNV = NULL; +PFNGLFINISHFENCENVPROC __glewFinishFenceNV = NULL; +PFNGLGENFENCESNVPROC __glewGenFencesNV = NULL; +PFNGLGETFENCEIVNVPROC __glewGetFenceivNV = NULL; +PFNGLISFENCENVPROC __glewIsFenceNV = NULL; +PFNGLSETFENCENVPROC __glewSetFenceNV = NULL; +PFNGLTESTFENCENVPROC __glewTestFenceNV = NULL; + +PFNGLFRAGMENTCOVERAGECOLORNVPROC __glewFragmentCoverageColorNV = NULL; + +PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC __glewGetProgramNamedParameterdvNV = NULL; +PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC __glewGetProgramNamedParameterfvNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4DNVPROC __glewProgramNamedParameter4dNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC __glewProgramNamedParameter4dvNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4FNVPROC __glewProgramNamedParameter4fNV = NULL; +PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC __glewProgramNamedParameter4fvNV = NULL; + +PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC __glewRenderbufferStorageMultisampleCoverageNV = NULL; + +PFNGLPROGRAMVERTEXLIMITNVPROC __glewProgramVertexLimitNV = NULL; + +PFNGLPROGRAMENVPARAMETERI4INVPROC __glewProgramEnvParameterI4iNV = NULL; +PFNGLPROGRAMENVPARAMETERI4IVNVPROC __glewProgramEnvParameterI4ivNV = NULL; +PFNGLPROGRAMENVPARAMETERI4UINVPROC __glewProgramEnvParameterI4uiNV = NULL; +PFNGLPROGRAMENVPARAMETERI4UIVNVPROC __glewProgramEnvParameterI4uivNV = NULL; +PFNGLPROGRAMENVPARAMETERSI4IVNVPROC __glewProgramEnvParametersI4ivNV = NULL; +PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC __glewProgramEnvParametersI4uivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4INVPROC __glewProgramLocalParameterI4iNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC __glewProgramLocalParameterI4ivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4UINVPROC __glewProgramLocalParameterI4uiNV = NULL; +PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV = NULL; +PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV = NULL; + +PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV = NULL; +PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV = NULL; +PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV = NULL; +PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV = NULL; +PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV = NULL; +PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV = NULL; +PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV = NULL; +PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV = NULL; +PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV = NULL; +PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV = NULL; +PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV = NULL; +PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV = NULL; +PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV = NULL; +PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV = NULL; +PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV = NULL; +PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV = NULL; +PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV = NULL; +PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV = NULL; +PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV = NULL; +PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV = NULL; +PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV = NULL; +PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV = NULL; +PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV = NULL; +PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV = NULL; +PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV = NULL; +PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV = NULL; +PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV = NULL; +PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV = NULL; +PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV = NULL; +PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV = NULL; +PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV = NULL; +PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV = NULL; +PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV = NULL; +PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV = NULL; + +PFNGLCOLOR3HNVPROC __glewColor3hNV = NULL; +PFNGLCOLOR3HVNVPROC __glewColor3hvNV = NULL; +PFNGLCOLOR4HNVPROC __glewColor4hNV = NULL; +PFNGLCOLOR4HVNVPROC __glewColor4hvNV = NULL; +PFNGLFOGCOORDHNVPROC __glewFogCoordhNV = NULL; +PFNGLFOGCOORDHVNVPROC __glewFogCoordhvNV = NULL; +PFNGLMULTITEXCOORD1HNVPROC __glewMultiTexCoord1hNV = NULL; +PFNGLMULTITEXCOORD1HVNVPROC __glewMultiTexCoord1hvNV = NULL; +PFNGLMULTITEXCOORD2HNVPROC __glewMultiTexCoord2hNV = NULL; +PFNGLMULTITEXCOORD2HVNVPROC __glewMultiTexCoord2hvNV = NULL; +PFNGLMULTITEXCOORD3HNVPROC __glewMultiTexCoord3hNV = NULL; +PFNGLMULTITEXCOORD3HVNVPROC __glewMultiTexCoord3hvNV = NULL; +PFNGLMULTITEXCOORD4HNVPROC __glewMultiTexCoord4hNV = NULL; +PFNGLMULTITEXCOORD4HVNVPROC __glewMultiTexCoord4hvNV = NULL; +PFNGLNORMAL3HNVPROC __glewNormal3hNV = NULL; +PFNGLNORMAL3HVNVPROC __glewNormal3hvNV = NULL; +PFNGLSECONDARYCOLOR3HNVPROC __glewSecondaryColor3hNV = NULL; +PFNGLSECONDARYCOLOR3HVNVPROC __glewSecondaryColor3hvNV = NULL; +PFNGLTEXCOORD1HNVPROC __glewTexCoord1hNV = NULL; +PFNGLTEXCOORD1HVNVPROC __glewTexCoord1hvNV = NULL; +PFNGLTEXCOORD2HNVPROC __glewTexCoord2hNV = NULL; +PFNGLTEXCOORD2HVNVPROC __glewTexCoord2hvNV = NULL; +PFNGLTEXCOORD3HNVPROC __glewTexCoord3hNV = NULL; +PFNGLTEXCOORD3HVNVPROC __glewTexCoord3hvNV = NULL; +PFNGLTEXCOORD4HNVPROC __glewTexCoord4hNV = NULL; +PFNGLTEXCOORD4HVNVPROC __glewTexCoord4hvNV = NULL; +PFNGLVERTEX2HNVPROC __glewVertex2hNV = NULL; +PFNGLVERTEX2HVNVPROC __glewVertex2hvNV = NULL; +PFNGLVERTEX3HNVPROC __glewVertex3hNV = NULL; +PFNGLVERTEX3HVNVPROC __glewVertex3hvNV = NULL; +PFNGLVERTEX4HNVPROC __glewVertex4hNV = NULL; +PFNGLVERTEX4HVNVPROC __glewVertex4hvNV = NULL; +PFNGLVERTEXATTRIB1HNVPROC __glewVertexAttrib1hNV = NULL; +PFNGLVERTEXATTRIB1HVNVPROC __glewVertexAttrib1hvNV = NULL; +PFNGLVERTEXATTRIB2HNVPROC __glewVertexAttrib2hNV = NULL; +PFNGLVERTEXATTRIB2HVNVPROC __glewVertexAttrib2hvNV = NULL; +PFNGLVERTEXATTRIB3HNVPROC __glewVertexAttrib3hNV = NULL; +PFNGLVERTEXATTRIB3HVNVPROC __glewVertexAttrib3hvNV = NULL; +PFNGLVERTEXATTRIB4HNVPROC __glewVertexAttrib4hNV = NULL; +PFNGLVERTEXATTRIB4HVNVPROC __glewVertexAttrib4hvNV = NULL; +PFNGLVERTEXATTRIBS1HVNVPROC __glewVertexAttribs1hvNV = NULL; +PFNGLVERTEXATTRIBS2HVNVPROC __glewVertexAttribs2hvNV = NULL; +PFNGLVERTEXATTRIBS3HVNVPROC __glewVertexAttribs3hvNV = NULL; +PFNGLVERTEXATTRIBS4HVNVPROC __glewVertexAttribs4hvNV = NULL; +PFNGLVERTEXWEIGHTHNVPROC __glewVertexWeighthNV = NULL; +PFNGLVERTEXWEIGHTHVNVPROC __glewVertexWeighthvNV = NULL; + +PFNGLGETINTERNALFORMATSAMPLEIVNVPROC __glewGetInternalformatSampleivNV = NULL; + +PFNGLBEGINOCCLUSIONQUERYNVPROC __glewBeginOcclusionQueryNV = NULL; +PFNGLDELETEOCCLUSIONQUERIESNVPROC __glewDeleteOcclusionQueriesNV = NULL; +PFNGLENDOCCLUSIONQUERYNVPROC __glewEndOcclusionQueryNV = NULL; +PFNGLGENOCCLUSIONQUERIESNVPROC __glewGenOcclusionQueriesNV = NULL; +PFNGLGETOCCLUSIONQUERYIVNVPROC __glewGetOcclusionQueryivNV = NULL; +PFNGLGETOCCLUSIONQUERYUIVNVPROC __glewGetOcclusionQueryuivNV = NULL; +PFNGLISOCCLUSIONQUERYNVPROC __glewIsOcclusionQueryNV = NULL; + +PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC __glewProgramBufferParametersIivNV = NULL; +PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC __glewProgramBufferParametersIuivNV = NULL; +PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC __glewProgramBufferParametersfvNV = NULL; + +PFNGLCOPYPATHNVPROC __glewCopyPathNV = NULL; +PFNGLCOVERFILLPATHINSTANCEDNVPROC __glewCoverFillPathInstancedNV = NULL; +PFNGLCOVERFILLPATHNVPROC __glewCoverFillPathNV = NULL; +PFNGLCOVERSTROKEPATHINSTANCEDNVPROC __glewCoverStrokePathInstancedNV = NULL; +PFNGLCOVERSTROKEPATHNVPROC __glewCoverStrokePathNV = NULL; +PFNGLDELETEPATHSNVPROC __glewDeletePathsNV = NULL; +PFNGLGENPATHSNVPROC __glewGenPathsNV = NULL; +PFNGLGETPATHCOLORGENFVNVPROC __glewGetPathColorGenfvNV = NULL; +PFNGLGETPATHCOLORGENIVNVPROC __glewGetPathColorGenivNV = NULL; +PFNGLGETPATHCOMMANDSNVPROC __glewGetPathCommandsNV = NULL; +PFNGLGETPATHCOORDSNVPROC __glewGetPathCoordsNV = NULL; +PFNGLGETPATHDASHARRAYNVPROC __glewGetPathDashArrayNV = NULL; +PFNGLGETPATHLENGTHNVPROC __glewGetPathLengthNV = NULL; +PFNGLGETPATHMETRICRANGENVPROC __glewGetPathMetricRangeNV = NULL; +PFNGLGETPATHMETRICSNVPROC __glewGetPathMetricsNV = NULL; +PFNGLGETPATHPARAMETERFVNVPROC __glewGetPathParameterfvNV = NULL; +PFNGLGETPATHPARAMETERIVNVPROC __glewGetPathParameterivNV = NULL; +PFNGLGETPATHSPACINGNVPROC __glewGetPathSpacingNV = NULL; +PFNGLGETPATHTEXGENFVNVPROC __glewGetPathTexGenfvNV = NULL; +PFNGLGETPATHTEXGENIVNVPROC __glewGetPathTexGenivNV = NULL; +PFNGLGETPROGRAMRESOURCEFVNVPROC __glewGetProgramResourcefvNV = NULL; +PFNGLINTERPOLATEPATHSNVPROC __glewInterpolatePathsNV = NULL; +PFNGLISPATHNVPROC __glewIsPathNV = NULL; +PFNGLISPOINTINFILLPATHNVPROC __glewIsPointInFillPathNV = NULL; +PFNGLISPOINTINSTROKEPATHNVPROC __glewIsPointInStrokePathNV = NULL; +PFNGLMATRIXLOAD3X2FNVPROC __glewMatrixLoad3x2fNV = NULL; +PFNGLMATRIXLOAD3X3FNVPROC __glewMatrixLoad3x3fNV = NULL; +PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC __glewMatrixLoadTranspose3x3fNV = NULL; +PFNGLMATRIXMULT3X2FNVPROC __glewMatrixMult3x2fNV = NULL; +PFNGLMATRIXMULT3X3FNVPROC __glewMatrixMult3x3fNV = NULL; +PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC __glewMatrixMultTranspose3x3fNV = NULL; +PFNGLPATHCOLORGENNVPROC __glewPathColorGenNV = NULL; +PFNGLPATHCOMMANDSNVPROC __glewPathCommandsNV = NULL; +PFNGLPATHCOORDSNVPROC __glewPathCoordsNV = NULL; +PFNGLPATHCOVERDEPTHFUNCNVPROC __glewPathCoverDepthFuncNV = NULL; +PFNGLPATHDASHARRAYNVPROC __glewPathDashArrayNV = NULL; +PFNGLPATHFOGGENNVPROC __glewPathFogGenNV = NULL; +PFNGLPATHGLYPHINDEXARRAYNVPROC __glewPathGlyphIndexArrayNV = NULL; +PFNGLPATHGLYPHINDEXRANGENVPROC __glewPathGlyphIndexRangeNV = NULL; +PFNGLPATHGLYPHRANGENVPROC __glewPathGlyphRangeNV = NULL; +PFNGLPATHGLYPHSNVPROC __glewPathGlyphsNV = NULL; +PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC __glewPathMemoryGlyphIndexArrayNV = NULL; +PFNGLPATHPARAMETERFNVPROC __glewPathParameterfNV = NULL; +PFNGLPATHPARAMETERFVNVPROC __glewPathParameterfvNV = NULL; +PFNGLPATHPARAMETERINVPROC __glewPathParameteriNV = NULL; +PFNGLPATHPARAMETERIVNVPROC __glewPathParameterivNV = NULL; +PFNGLPATHSTENCILDEPTHOFFSETNVPROC __glewPathStencilDepthOffsetNV = NULL; +PFNGLPATHSTENCILFUNCNVPROC __glewPathStencilFuncNV = NULL; +PFNGLPATHSTRINGNVPROC __glewPathStringNV = NULL; +PFNGLPATHSUBCOMMANDSNVPROC __glewPathSubCommandsNV = NULL; +PFNGLPATHSUBCOORDSNVPROC __glewPathSubCoordsNV = NULL; +PFNGLPATHTEXGENNVPROC __glewPathTexGenNV = NULL; +PFNGLPOINTALONGPATHNVPROC __glewPointAlongPathNV = NULL; +PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC __glewProgramPathFragmentInputGenNV = NULL; +PFNGLSTENCILFILLPATHINSTANCEDNVPROC __glewStencilFillPathInstancedNV = NULL; +PFNGLSTENCILFILLPATHNVPROC __glewStencilFillPathNV = NULL; +PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC __glewStencilStrokePathInstancedNV = NULL; +PFNGLSTENCILSTROKEPATHNVPROC __glewStencilStrokePathNV = NULL; +PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC __glewStencilThenCoverFillPathInstancedNV = NULL; +PFNGLSTENCILTHENCOVERFILLPATHNVPROC __glewStencilThenCoverFillPathNV = NULL; +PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC __glewStencilThenCoverStrokePathInstancedNV = NULL; +PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC __glewStencilThenCoverStrokePathNV = NULL; +PFNGLTRANSFORMPATHNVPROC __glewTransformPathNV = NULL; +PFNGLWEIGHTPATHSNVPROC __glewWeightPathsNV = NULL; + +PFNGLFLUSHPIXELDATARANGENVPROC __glewFlushPixelDataRangeNV = NULL; +PFNGLPIXELDATARANGENVPROC __glewPixelDataRangeNV = NULL; + +PFNGLPOINTPARAMETERINVPROC __glewPointParameteriNV = NULL; +PFNGLPOINTPARAMETERIVNVPROC __glewPointParameterivNV = NULL; + +PFNGLGETVIDEOI64VNVPROC __glewGetVideoi64vNV = NULL; +PFNGLGETVIDEOIVNVPROC __glewGetVideoivNV = NULL; +PFNGLGETVIDEOUI64VNVPROC __glewGetVideoui64vNV = NULL; +PFNGLGETVIDEOUIVNVPROC __glewGetVideouivNV = NULL; +PFNGLPRESENTFRAMEDUALFILLNVPROC __glewPresentFrameDualFillNV = NULL; +PFNGLPRESENTFRAMEKEYEDNVPROC __glewPresentFrameKeyedNV = NULL; + +PFNGLPRIMITIVERESTARTINDEXNVPROC __glewPrimitiveRestartIndexNV = NULL; +PFNGLPRIMITIVERESTARTNVPROC __glewPrimitiveRestartNV = NULL; + +PFNGLCOMBINERINPUTNVPROC __glewCombinerInputNV = NULL; +PFNGLCOMBINEROUTPUTNVPROC __glewCombinerOutputNV = NULL; +PFNGLCOMBINERPARAMETERFNVPROC __glewCombinerParameterfNV = NULL; +PFNGLCOMBINERPARAMETERFVNVPROC __glewCombinerParameterfvNV = NULL; +PFNGLCOMBINERPARAMETERINVPROC __glewCombinerParameteriNV = NULL; +PFNGLCOMBINERPARAMETERIVNVPROC __glewCombinerParameterivNV = NULL; +PFNGLFINALCOMBINERINPUTNVPROC __glewFinalCombinerInputNV = NULL; +PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC __glewGetCombinerInputParameterfvNV = NULL; +PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC __glewGetCombinerInputParameterivNV = NULL; +PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC __glewGetCombinerOutputParameterfvNV = NULL; +PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC __glewGetCombinerOutputParameterivNV = NULL; +PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC __glewGetFinalCombinerInputParameterfvNV = NULL; +PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameterivNV = NULL; + +PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV = NULL; +PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV = NULL; + +PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewFramebufferSampleLocationsfvNV = NULL; +PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC __glewNamedFramebufferSampleLocationsfvNV = NULL; + +PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV = NULL; +PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV = NULL; +PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV = NULL; +PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV = NULL; +PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV = NULL; +PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV = NULL; +PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV = NULL; +PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV = NULL; +PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV = NULL; +PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV = NULL; +PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV = NULL; +PFNGLUNIFORMUI64NVPROC __glewUniformui64NV = NULL; +PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV = NULL; + +PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV = NULL; + +PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTexImage2DMultisampleCoverageNV = NULL; +PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTexImage3DMultisampleCoverageNV = NULL; +PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC __glewTextureImage2DMultisampleCoverageNV = NULL; +PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC __glewTextureImage2DMultisampleNV = NULL; +PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC __glewTextureImage3DMultisampleCoverageNV = NULL; +PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC __glewTextureImage3DMultisampleNV = NULL; + +PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV = NULL; +PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV = NULL; +PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV = NULL; +PFNGLBINDBUFFEROFFSETNVPROC __glewBindBufferOffsetNV = NULL; +PFNGLBINDBUFFERRANGENVPROC __glewBindBufferRangeNV = NULL; +PFNGLENDTRANSFORMFEEDBACKNVPROC __glewEndTransformFeedbackNV = NULL; +PFNGLGETACTIVEVARYINGNVPROC __glewGetActiveVaryingNV = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC __glewGetTransformFeedbackVaryingNV = NULL; +PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV = NULL; +PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV = NULL; + +PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV = NULL; +PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV = NULL; +PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV = NULL; +PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV = NULL; +PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV = NULL; +PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV = NULL; +PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV = NULL; + +PFNGLVDPAUFININVPROC __glewVDPAUFiniNV = NULL; +PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV = NULL; +PFNGLVDPAUINITNVPROC __glewVDPAUInitNV = NULL; +PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV = NULL; +PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV = NULL; +PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV = NULL; +PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV = NULL; +PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV = NULL; +PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV = NULL; +PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV = NULL; + +PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV = NULL; +PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV = NULL; + +PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV = NULL; +PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV = NULL; +PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV = NULL; +PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV = NULL; +PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV = NULL; +PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV = NULL; +PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV = NULL; +PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV = NULL; +PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV = NULL; +PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV = NULL; +PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV = NULL; +PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV = NULL; +PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV = NULL; +PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV = NULL; +PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV = NULL; +PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV = NULL; +PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV = NULL; +PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV = NULL; +PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV = NULL; + +PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV = NULL; +PFNGLCOLORFORMATNVPROC __glewColorFormatNV = NULL; +PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV = NULL; +PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV = NULL; +PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV = NULL; +PFNGLINDEXFORMATNVPROC __glewIndexFormatNV = NULL; +PFNGLNORMALFORMATNVPROC __glewNormalFormatNV = NULL; +PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV = NULL; +PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV = NULL; +PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV = NULL; +PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV = NULL; +PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV = NULL; + +PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV = NULL; +PFNGLBINDPROGRAMNVPROC __glewBindProgramNV = NULL; +PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV = NULL; +PFNGLEXECUTEPROGRAMNVPROC __glewExecuteProgramNV = NULL; +PFNGLGENPROGRAMSNVPROC __glewGenProgramsNV = NULL; +PFNGLGETPROGRAMPARAMETERDVNVPROC __glewGetProgramParameterdvNV = NULL; +PFNGLGETPROGRAMPARAMETERFVNVPROC __glewGetProgramParameterfvNV = NULL; +PFNGLGETPROGRAMSTRINGNVPROC __glewGetProgramStringNV = NULL; +PFNGLGETPROGRAMIVNVPROC __glewGetProgramivNV = NULL; +PFNGLGETTRACKMATRIXIVNVPROC __glewGetTrackMatrixivNV = NULL; +PFNGLGETVERTEXATTRIBPOINTERVNVPROC __glewGetVertexAttribPointervNV = NULL; +PFNGLGETVERTEXATTRIBDVNVPROC __glewGetVertexAttribdvNV = NULL; +PFNGLGETVERTEXATTRIBFVNVPROC __glewGetVertexAttribfvNV = NULL; +PFNGLGETVERTEXATTRIBIVNVPROC __glewGetVertexAttribivNV = NULL; +PFNGLISPROGRAMNVPROC __glewIsProgramNV = NULL; +PFNGLLOADPROGRAMNVPROC __glewLoadProgramNV = NULL; +PFNGLPROGRAMPARAMETER4DNVPROC __glewProgramParameter4dNV = NULL; +PFNGLPROGRAMPARAMETER4DVNVPROC __glewProgramParameter4dvNV = NULL; +PFNGLPROGRAMPARAMETER4FNVPROC __glewProgramParameter4fNV = NULL; +PFNGLPROGRAMPARAMETER4FVNVPROC __glewProgramParameter4fvNV = NULL; +PFNGLPROGRAMPARAMETERS4DVNVPROC __glewProgramParameters4dvNV = NULL; +PFNGLPROGRAMPARAMETERS4FVNVPROC __glewProgramParameters4fvNV = NULL; +PFNGLREQUESTRESIDENTPROGRAMSNVPROC __glewRequestResidentProgramsNV = NULL; +PFNGLTRACKMATRIXNVPROC __glewTrackMatrixNV = NULL; +PFNGLVERTEXATTRIB1DNVPROC __glewVertexAttrib1dNV = NULL; +PFNGLVERTEXATTRIB1DVNVPROC __glewVertexAttrib1dvNV = NULL; +PFNGLVERTEXATTRIB1FNVPROC __glewVertexAttrib1fNV = NULL; +PFNGLVERTEXATTRIB1FVNVPROC __glewVertexAttrib1fvNV = NULL; +PFNGLVERTEXATTRIB1SNVPROC __glewVertexAttrib1sNV = NULL; +PFNGLVERTEXATTRIB1SVNVPROC __glewVertexAttrib1svNV = NULL; +PFNGLVERTEXATTRIB2DNVPROC __glewVertexAttrib2dNV = NULL; +PFNGLVERTEXATTRIB2DVNVPROC __glewVertexAttrib2dvNV = NULL; +PFNGLVERTEXATTRIB2FNVPROC __glewVertexAttrib2fNV = NULL; +PFNGLVERTEXATTRIB2FVNVPROC __glewVertexAttrib2fvNV = NULL; +PFNGLVERTEXATTRIB2SNVPROC __glewVertexAttrib2sNV = NULL; +PFNGLVERTEXATTRIB2SVNVPROC __glewVertexAttrib2svNV = NULL; +PFNGLVERTEXATTRIB3DNVPROC __glewVertexAttrib3dNV = NULL; +PFNGLVERTEXATTRIB3DVNVPROC __glewVertexAttrib3dvNV = NULL; +PFNGLVERTEXATTRIB3FNVPROC __glewVertexAttrib3fNV = NULL; +PFNGLVERTEXATTRIB3FVNVPROC __glewVertexAttrib3fvNV = NULL; +PFNGLVERTEXATTRIB3SNVPROC __glewVertexAttrib3sNV = NULL; +PFNGLVERTEXATTRIB3SVNVPROC __glewVertexAttrib3svNV = NULL; +PFNGLVERTEXATTRIB4DNVPROC __glewVertexAttrib4dNV = NULL; +PFNGLVERTEXATTRIB4DVNVPROC __glewVertexAttrib4dvNV = NULL; +PFNGLVERTEXATTRIB4FNVPROC __glewVertexAttrib4fNV = NULL; +PFNGLVERTEXATTRIB4FVNVPROC __glewVertexAttrib4fvNV = NULL; +PFNGLVERTEXATTRIB4SNVPROC __glewVertexAttrib4sNV = NULL; +PFNGLVERTEXATTRIB4SVNVPROC __glewVertexAttrib4svNV = NULL; +PFNGLVERTEXATTRIB4UBNVPROC __glewVertexAttrib4ubNV = NULL; +PFNGLVERTEXATTRIB4UBVNVPROC __glewVertexAttrib4ubvNV = NULL; +PFNGLVERTEXATTRIBPOINTERNVPROC __glewVertexAttribPointerNV = NULL; +PFNGLVERTEXATTRIBS1DVNVPROC __glewVertexAttribs1dvNV = NULL; +PFNGLVERTEXATTRIBS1FVNVPROC __glewVertexAttribs1fvNV = NULL; +PFNGLVERTEXATTRIBS1SVNVPROC __glewVertexAttribs1svNV = NULL; +PFNGLVERTEXATTRIBS2DVNVPROC __glewVertexAttribs2dvNV = NULL; +PFNGLVERTEXATTRIBS2FVNVPROC __glewVertexAttribs2fvNV = NULL; +PFNGLVERTEXATTRIBS2SVNVPROC __glewVertexAttribs2svNV = NULL; +PFNGLVERTEXATTRIBS3DVNVPROC __glewVertexAttribs3dvNV = NULL; +PFNGLVERTEXATTRIBS3FVNVPROC __glewVertexAttribs3fvNV = NULL; +PFNGLVERTEXATTRIBS3SVNVPROC __glewVertexAttribs3svNV = NULL; +PFNGLVERTEXATTRIBS4DVNVPROC __glewVertexAttribs4dvNV = NULL; +PFNGLVERTEXATTRIBS4FVNVPROC __glewVertexAttribs4fvNV = NULL; +PFNGLVERTEXATTRIBS4SVNVPROC __glewVertexAttribs4svNV = NULL; +PFNGLVERTEXATTRIBS4UBVNVPROC __glewVertexAttribs4ubvNV = NULL; + +PFNGLBEGINVIDEOCAPTURENVPROC __glewBeginVideoCaptureNV = NULL; +PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC __glewBindVideoCaptureStreamBufferNV = NULL; +PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC __glewBindVideoCaptureStreamTextureNV = NULL; +PFNGLENDVIDEOCAPTURENVPROC __glewEndVideoCaptureNV = NULL; +PFNGLGETVIDEOCAPTURESTREAMDVNVPROC __glewGetVideoCaptureStreamdvNV = NULL; +PFNGLGETVIDEOCAPTURESTREAMFVNVPROC __glewGetVideoCaptureStreamfvNV = NULL; +PFNGLGETVIDEOCAPTURESTREAMIVNVPROC __glewGetVideoCaptureStreamivNV = NULL; +PFNGLGETVIDEOCAPTUREIVNVPROC __glewGetVideoCaptureivNV = NULL; +PFNGLVIDEOCAPTURENVPROC __glewVideoCaptureNV = NULL; +PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC __glewVideoCaptureStreamParameterdvNV = NULL; +PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC __glewVideoCaptureStreamParameterfvNV = NULL; +PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC __glewVideoCaptureStreamParameterivNV = NULL; + +PFNGLCLEARDEPTHFOESPROC __glewClearDepthfOES = NULL; +PFNGLCLIPPLANEFOESPROC __glewClipPlanefOES = NULL; +PFNGLDEPTHRANGEFOESPROC __glewDepthRangefOES = NULL; +PFNGLFRUSTUMFOESPROC __glewFrustumfOES = NULL; +PFNGLGETCLIPPLANEFOESPROC __glewGetClipPlanefOES = NULL; +PFNGLORTHOFOESPROC __glewOrthofOES = NULL; + +PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC __glewFramebufferTextureMultiviewOVR = NULL; + +PFNGLALPHAFUNCXPROC __glewAlphaFuncx = NULL; +PFNGLCLEARCOLORXPROC __glewClearColorx = NULL; +PFNGLCLEARDEPTHXPROC __glewClearDepthx = NULL; +PFNGLCOLOR4XPROC __glewColor4x = NULL; +PFNGLDEPTHRANGEXPROC __glewDepthRangex = NULL; +PFNGLFOGXPROC __glewFogx = NULL; +PFNGLFOGXVPROC __glewFogxv = NULL; +PFNGLFRUSTUMFPROC __glewFrustumf = NULL; +PFNGLFRUSTUMXPROC __glewFrustumx = NULL; +PFNGLLIGHTMODELXPROC __glewLightModelx = NULL; +PFNGLLIGHTMODELXVPROC __glewLightModelxv = NULL; +PFNGLLIGHTXPROC __glewLightx = NULL; +PFNGLLIGHTXVPROC __glewLightxv = NULL; +PFNGLLINEWIDTHXPROC __glewLineWidthx = NULL; +PFNGLLOADMATRIXXPROC __glewLoadMatrixx = NULL; +PFNGLMATERIALXPROC __glewMaterialx = NULL; +PFNGLMATERIALXVPROC __glewMaterialxv = NULL; +PFNGLMULTMATRIXXPROC __glewMultMatrixx = NULL; +PFNGLMULTITEXCOORD4XPROC __glewMultiTexCoord4x = NULL; +PFNGLNORMAL3XPROC __glewNormal3x = NULL; +PFNGLORTHOFPROC __glewOrthof = NULL; +PFNGLORTHOXPROC __glewOrthox = NULL; +PFNGLPOINTSIZEXPROC __glewPointSizex = NULL; +PFNGLPOLYGONOFFSETXPROC __glewPolygonOffsetx = NULL; +PFNGLROTATEXPROC __glewRotatex = NULL; +PFNGLSAMPLECOVERAGEXPROC __glewSampleCoveragex = NULL; +PFNGLSCALEXPROC __glewScalex = NULL; +PFNGLTEXENVXPROC __glewTexEnvx = NULL; +PFNGLTEXENVXVPROC __glewTexEnvxv = NULL; +PFNGLTEXPARAMETERXPROC __glewTexParameterx = NULL; +PFNGLTRANSLATEXPROC __glewTranslatex = NULL; + +PFNGLCLIPPLANEFPROC __glewClipPlanef = NULL; +PFNGLCLIPPLANEXPROC __glewClipPlanex = NULL; +PFNGLGETCLIPPLANEFPROC __glewGetClipPlanef = NULL; +PFNGLGETCLIPPLANEXPROC __glewGetClipPlanex = NULL; +PFNGLGETFIXEDVPROC __glewGetFixedv = NULL; +PFNGLGETLIGHTXVPROC __glewGetLightxv = NULL; +PFNGLGETMATERIALXVPROC __glewGetMaterialxv = NULL; +PFNGLGETTEXENVXVPROC __glewGetTexEnvxv = NULL; +PFNGLGETTEXPARAMETERXVPROC __glewGetTexParameterxv = NULL; +PFNGLPOINTPARAMETERXPROC __glewPointParameterx = NULL; +PFNGLPOINTPARAMETERXVPROC __glewPointParameterxv = NULL; +PFNGLPOINTSIZEPOINTEROESPROC __glewPointSizePointerOES = NULL; +PFNGLTEXPARAMETERXVPROC __glewTexParameterxv = NULL; + +PFNGLERRORSTRINGREGALPROC __glewErrorStringREGAL = NULL; + +PFNGLGETEXTENSIONREGALPROC __glewGetExtensionREGAL = NULL; +PFNGLISSUPPORTEDREGALPROC __glewIsSupportedREGAL = NULL; + +PFNGLLOGMESSAGECALLBACKREGALPROC __glewLogMessageCallbackREGAL = NULL; + +PFNGLGETPROCADDRESSREGALPROC __glewGetProcAddressREGAL = NULL; + +PFNGLDETAILTEXFUNCSGISPROC __glewDetailTexFuncSGIS = NULL; +PFNGLGETDETAILTEXFUNCSGISPROC __glewGetDetailTexFuncSGIS = NULL; + +PFNGLFOGFUNCSGISPROC __glewFogFuncSGIS = NULL; +PFNGLGETFOGFUNCSGISPROC __glewGetFogFuncSGIS = NULL; + +PFNGLSAMPLEMASKSGISPROC __glewSampleMaskSGIS = NULL; +PFNGLSAMPLEPATTERNSGISPROC __glewSamplePatternSGIS = NULL; + +PFNGLGETSHARPENTEXFUNCSGISPROC __glewGetSharpenTexFuncSGIS = NULL; +PFNGLSHARPENTEXFUNCSGISPROC __glewSharpenTexFuncSGIS = NULL; + +PFNGLTEXIMAGE4DSGISPROC __glewTexImage4DSGIS = NULL; +PFNGLTEXSUBIMAGE4DSGISPROC __glewTexSubImage4DSGIS = NULL; + +PFNGLGETTEXFILTERFUNCSGISPROC __glewGetTexFilterFuncSGIS = NULL; +PFNGLTEXFILTERFUNCSGISPROC __glewTexFilterFuncSGIS = NULL; + +PFNGLASYNCMARKERSGIXPROC __glewAsyncMarkerSGIX = NULL; +PFNGLDELETEASYNCMARKERSSGIXPROC __glewDeleteAsyncMarkersSGIX = NULL; +PFNGLFINISHASYNCSGIXPROC __glewFinishAsyncSGIX = NULL; +PFNGLGENASYNCMARKERSSGIXPROC __glewGenAsyncMarkersSGIX = NULL; +PFNGLISASYNCMARKERSGIXPROC __glewIsAsyncMarkerSGIX = NULL; +PFNGLPOLLASYNCSGIXPROC __glewPollAsyncSGIX = NULL; + +PFNGLFLUSHRASTERSGIXPROC __glewFlushRasterSGIX = NULL; + +PFNGLTEXTUREFOGSGIXPROC __glewTextureFogSGIX = NULL; + +PFNGLFRAGMENTCOLORMATERIALSGIXPROC __glewFragmentColorMaterialSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELFSGIXPROC __glewFragmentLightModelfSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELFVSGIXPROC __glewFragmentLightModelfvSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELISGIXPROC __glewFragmentLightModeliSGIX = NULL; +PFNGLFRAGMENTLIGHTMODELIVSGIXPROC __glewFragmentLightModelivSGIX = NULL; +PFNGLFRAGMENTLIGHTFSGIXPROC __glewFragmentLightfSGIX = NULL; +PFNGLFRAGMENTLIGHTFVSGIXPROC __glewFragmentLightfvSGIX = NULL; +PFNGLFRAGMENTLIGHTISGIXPROC __glewFragmentLightiSGIX = NULL; +PFNGLFRAGMENTLIGHTIVSGIXPROC __glewFragmentLightivSGIX = NULL; +PFNGLFRAGMENTMATERIALFSGIXPROC __glewFragmentMaterialfSGIX = NULL; +PFNGLFRAGMENTMATERIALFVSGIXPROC __glewFragmentMaterialfvSGIX = NULL; +PFNGLFRAGMENTMATERIALISGIXPROC __glewFragmentMaterialiSGIX = NULL; +PFNGLFRAGMENTMATERIALIVSGIXPROC __glewFragmentMaterialivSGIX = NULL; +PFNGLGETFRAGMENTLIGHTFVSGIXPROC __glewGetFragmentLightfvSGIX = NULL; +PFNGLGETFRAGMENTLIGHTIVSGIXPROC __glewGetFragmentLightivSGIX = NULL; +PFNGLGETFRAGMENTMATERIALFVSGIXPROC __glewGetFragmentMaterialfvSGIX = NULL; +PFNGLGETFRAGMENTMATERIALIVSGIXPROC __glewGetFragmentMaterialivSGIX = NULL; + +PFNGLFRAMEZOOMSGIXPROC __glewFrameZoomSGIX = NULL; + +PFNGLPIXELTEXGENSGIXPROC __glewPixelTexGenSGIX = NULL; + +PFNGLREFERENCEPLANESGIXPROC __glewReferencePlaneSGIX = NULL; + +PFNGLSPRITEPARAMETERFSGIXPROC __glewSpriteParameterfSGIX = NULL; +PFNGLSPRITEPARAMETERFVSGIXPROC __glewSpriteParameterfvSGIX = NULL; +PFNGLSPRITEPARAMETERISGIXPROC __glewSpriteParameteriSGIX = NULL; +PFNGLSPRITEPARAMETERIVSGIXPROC __glewSpriteParameterivSGIX = NULL; + +PFNGLTAGSAMPLEBUFFERSGIXPROC __glewTagSampleBufferSGIX = NULL; + +PFNGLCOLORTABLEPARAMETERFVSGIPROC __glewColorTableParameterfvSGI = NULL; +PFNGLCOLORTABLEPARAMETERIVSGIPROC __glewColorTableParameterivSGI = NULL; +PFNGLCOLORTABLESGIPROC __glewColorTableSGI = NULL; +PFNGLCOPYCOLORTABLESGIPROC __glewCopyColorTableSGI = NULL; +PFNGLGETCOLORTABLEPARAMETERFVSGIPROC __glewGetColorTableParameterfvSGI = NULL; +PFNGLGETCOLORTABLEPARAMETERIVSGIPROC __glewGetColorTableParameterivSGI = NULL; +PFNGLGETCOLORTABLESGIPROC __glewGetColorTableSGI = NULL; + +PFNGLFINISHTEXTURESUNXPROC __glewFinishTextureSUNX = NULL; + +PFNGLGLOBALALPHAFACTORBSUNPROC __glewGlobalAlphaFactorbSUN = NULL; +PFNGLGLOBALALPHAFACTORDSUNPROC __glewGlobalAlphaFactordSUN = NULL; +PFNGLGLOBALALPHAFACTORFSUNPROC __glewGlobalAlphaFactorfSUN = NULL; +PFNGLGLOBALALPHAFACTORISUNPROC __glewGlobalAlphaFactoriSUN = NULL; +PFNGLGLOBALALPHAFACTORSSUNPROC __glewGlobalAlphaFactorsSUN = NULL; +PFNGLGLOBALALPHAFACTORUBSUNPROC __glewGlobalAlphaFactorubSUN = NULL; +PFNGLGLOBALALPHAFACTORUISUNPROC __glewGlobalAlphaFactoruiSUN = NULL; +PFNGLGLOBALALPHAFACTORUSSUNPROC __glewGlobalAlphaFactorusSUN = NULL; + +PFNGLREADVIDEOPIXELSSUNPROC __glewReadVideoPixelsSUN = NULL; + +PFNGLREPLACEMENTCODEPOINTERSUNPROC __glewReplacementCodePointerSUN = NULL; +PFNGLREPLACEMENTCODEUBSUNPROC __glewReplacementCodeubSUN = NULL; +PFNGLREPLACEMENTCODEUBVSUNPROC __glewReplacementCodeubvSUN = NULL; +PFNGLREPLACEMENTCODEUISUNPROC __glewReplacementCodeuiSUN = NULL; +PFNGLREPLACEMENTCODEUIVSUNPROC __glewReplacementCodeuivSUN = NULL; +PFNGLREPLACEMENTCODEUSSUNPROC __glewReplacementCodeusSUN = NULL; +PFNGLREPLACEMENTCODEUSVSUNPROC __glewReplacementCodeusvSUN = NULL; + +PFNGLCOLOR3FVERTEX3FSUNPROC __glewColor3fVertex3fSUN = NULL; +PFNGLCOLOR3FVERTEX3FVSUNPROC __glewColor3fVertex3fvSUN = NULL; +PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewColor4fNormal3fVertex3fSUN = NULL; +PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewColor4fNormal3fVertex3fvSUN = NULL; +PFNGLCOLOR4UBVERTEX2FSUNPROC __glewColor4ubVertex2fSUN = NULL; +PFNGLCOLOR4UBVERTEX2FVSUNPROC __glewColor4ubVertex2fvSUN = NULL; +PFNGLCOLOR4UBVERTEX3FSUNPROC __glewColor4ubVertex3fSUN = NULL; +PFNGLCOLOR4UBVERTEX3FVSUNPROC __glewColor4ubVertex3fvSUN = NULL; +PFNGLNORMAL3FVERTEX3FSUNPROC __glewNormal3fVertex3fSUN = NULL; +PFNGLNORMAL3FVERTEX3FVSUNPROC __glewNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC __glewReplacementCodeuiColor3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiColor4fNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC __glewReplacementCodeuiColor4ubVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC __glewReplacementCodeuiColor4ubVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC __glewReplacementCodeuiTexCoord2fVertex3fvSUN = NULL; +PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC __glewReplacementCodeuiVertex3fSUN = NULL; +PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC __glewReplacementCodeuiVertex3fvSUN = NULL; +PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC __glewTexCoord2fColor3fVertex3fSUN = NULL; +PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC __glewTexCoord2fColor3fVertex3fvSUN = NULL; +PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fSUN = NULL; +PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fColor4fNormal3fVertex3fvSUN = NULL; +PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC __glewTexCoord2fColor4ubVertex3fSUN = NULL; +PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC __glewTexCoord2fColor4ubVertex3fvSUN = NULL; +PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC __glewTexCoord2fNormal3fVertex3fSUN = NULL; +PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC __glewTexCoord2fNormal3fVertex3fvSUN = NULL; +PFNGLTEXCOORD2FVERTEX3FSUNPROC __glewTexCoord2fVertex3fSUN = NULL; +PFNGLTEXCOORD2FVERTEX3FVSUNPROC __glewTexCoord2fVertex3fvSUN = NULL; +PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fSUN = NULL; +PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC __glewTexCoord4fColor4fNormal3fVertex4fvSUN = NULL; +PFNGLTEXCOORD4FVERTEX4FSUNPROC __glewTexCoord4fVertex4fSUN = NULL; +PFNGLTEXCOORD4FVERTEX4FVSUNPROC __glewTexCoord4fVertex4fvSUN = NULL; + +PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN = NULL; + +#endif /* !WIN32 || !GLEW_MX */ + +#if !defined(GLEW_MX) + +GLboolean __GLEW_VERSION_1_1 = GL_FALSE; +GLboolean __GLEW_VERSION_1_2 = GL_FALSE; +GLboolean __GLEW_VERSION_1_2_1 = GL_FALSE; +GLboolean __GLEW_VERSION_1_3 = GL_FALSE; +GLboolean __GLEW_VERSION_1_4 = GL_FALSE; +GLboolean __GLEW_VERSION_1_5 = GL_FALSE; +GLboolean __GLEW_VERSION_2_0 = GL_FALSE; +GLboolean __GLEW_VERSION_2_1 = GL_FALSE; +GLboolean __GLEW_VERSION_3_0 = GL_FALSE; +GLboolean __GLEW_VERSION_3_1 = GL_FALSE; +GLboolean __GLEW_VERSION_3_2 = GL_FALSE; +GLboolean __GLEW_VERSION_3_3 = GL_FALSE; +GLboolean __GLEW_VERSION_4_0 = GL_FALSE; +GLboolean __GLEW_VERSION_4_1 = GL_FALSE; +GLboolean __GLEW_VERSION_4_2 = GL_FALSE; +GLboolean __GLEW_VERSION_4_3 = GL_FALSE; +GLboolean __GLEW_VERSION_4_4 = GL_FALSE; +GLboolean __GLEW_VERSION_4_5 = GL_FALSE; +GLboolean __GLEW_3DFX_multisample = GL_FALSE; +GLboolean __GLEW_3DFX_tbuffer = GL_FALSE; +GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE; +GLboolean __GLEW_AMD_blend_minmax_factor = GL_FALSE; +GLboolean __GLEW_AMD_conservative_depth = GL_FALSE; +GLboolean __GLEW_AMD_debug_output = GL_FALSE; +GLboolean __GLEW_AMD_depth_clamp_separate = GL_FALSE; +GLboolean __GLEW_AMD_draw_buffers_blend = GL_FALSE; +GLboolean __GLEW_AMD_gcn_shader = GL_FALSE; +GLboolean __GLEW_AMD_gpu_shader_int64 = GL_FALSE; +GLboolean __GLEW_AMD_interleaved_elements = GL_FALSE; +GLboolean __GLEW_AMD_multi_draw_indirect = GL_FALSE; +GLboolean __GLEW_AMD_name_gen_delete = GL_FALSE; +GLboolean __GLEW_AMD_occlusion_query_event = GL_FALSE; +GLboolean __GLEW_AMD_performance_monitor = GL_FALSE; +GLboolean __GLEW_AMD_pinned_memory = GL_FALSE; +GLboolean __GLEW_AMD_query_buffer_object = GL_FALSE; +GLboolean __GLEW_AMD_sample_positions = GL_FALSE; +GLboolean __GLEW_AMD_seamless_cubemap_per_texture = GL_FALSE; +GLboolean __GLEW_AMD_shader_atomic_counter_ops = GL_FALSE; +GLboolean __GLEW_AMD_shader_stencil_export = GL_FALSE; +GLboolean __GLEW_AMD_shader_stencil_value_export = GL_FALSE; +GLboolean __GLEW_AMD_shader_trinary_minmax = GL_FALSE; +GLboolean __GLEW_AMD_sparse_texture = GL_FALSE; +GLboolean __GLEW_AMD_stencil_operation_extended = GL_FALSE; +GLboolean __GLEW_AMD_texture_texture4 = GL_FALSE; +GLboolean __GLEW_AMD_transform_feedback3_lines_triangles = GL_FALSE; +GLboolean __GLEW_AMD_transform_feedback4 = GL_FALSE; +GLboolean __GLEW_AMD_vertex_shader_layer = GL_FALSE; +GLboolean __GLEW_AMD_vertex_shader_tessellator = GL_FALSE; +GLboolean __GLEW_AMD_vertex_shader_viewport_index = GL_FALSE; +GLboolean __GLEW_ANGLE_depth_texture = GL_FALSE; +GLboolean __GLEW_ANGLE_framebuffer_blit = GL_FALSE; +GLboolean __GLEW_ANGLE_framebuffer_multisample = GL_FALSE; +GLboolean __GLEW_ANGLE_instanced_arrays = GL_FALSE; +GLboolean __GLEW_ANGLE_pack_reverse_row_order = GL_FALSE; +GLboolean __GLEW_ANGLE_program_binary = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_compression_dxt1 = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_compression_dxt3 = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_compression_dxt5 = GL_FALSE; +GLboolean __GLEW_ANGLE_texture_usage = GL_FALSE; +GLboolean __GLEW_ANGLE_timer_query = GL_FALSE; +GLboolean __GLEW_ANGLE_translated_shader_source = GL_FALSE; +GLboolean __GLEW_APPLE_aux_depth_stencil = GL_FALSE; +GLboolean __GLEW_APPLE_client_storage = GL_FALSE; +GLboolean __GLEW_APPLE_element_array = GL_FALSE; +GLboolean __GLEW_APPLE_fence = GL_FALSE; +GLboolean __GLEW_APPLE_float_pixels = GL_FALSE; +GLboolean __GLEW_APPLE_flush_buffer_range = GL_FALSE; +GLboolean __GLEW_APPLE_object_purgeable = GL_FALSE; +GLboolean __GLEW_APPLE_pixel_buffer = GL_FALSE; +GLboolean __GLEW_APPLE_rgb_422 = GL_FALSE; +GLboolean __GLEW_APPLE_row_bytes = GL_FALSE; +GLboolean __GLEW_APPLE_specular_vector = GL_FALSE; +GLboolean __GLEW_APPLE_texture_range = GL_FALSE; +GLboolean __GLEW_APPLE_transform_hint = GL_FALSE; +GLboolean __GLEW_APPLE_vertex_array_object = GL_FALSE; +GLboolean __GLEW_APPLE_vertex_array_range = GL_FALSE; +GLboolean __GLEW_APPLE_vertex_program_evaluators = GL_FALSE; +GLboolean __GLEW_APPLE_ycbcr_422 = GL_FALSE; +GLboolean __GLEW_ARB_ES2_compatibility = GL_FALSE; +GLboolean __GLEW_ARB_ES3_1_compatibility = GL_FALSE; +GLboolean __GLEW_ARB_ES3_2_compatibility = GL_FALSE; +GLboolean __GLEW_ARB_ES3_compatibility = GL_FALSE; +GLboolean __GLEW_ARB_arrays_of_arrays = GL_FALSE; +GLboolean __GLEW_ARB_base_instance = GL_FALSE; +GLboolean __GLEW_ARB_bindless_texture = GL_FALSE; +GLboolean __GLEW_ARB_blend_func_extended = GL_FALSE; +GLboolean __GLEW_ARB_buffer_storage = GL_FALSE; +GLboolean __GLEW_ARB_cl_event = GL_FALSE; +GLboolean __GLEW_ARB_clear_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_clear_texture = GL_FALSE; +GLboolean __GLEW_ARB_clip_control = GL_FALSE; +GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE; +GLboolean __GLEW_ARB_compatibility = GL_FALSE; +GLboolean __GLEW_ARB_compressed_texture_pixel_storage = GL_FALSE; +GLboolean __GLEW_ARB_compute_shader = GL_FALSE; +GLboolean __GLEW_ARB_compute_variable_group_size = GL_FALSE; +GLboolean __GLEW_ARB_conditional_render_inverted = GL_FALSE; +GLboolean __GLEW_ARB_conservative_depth = GL_FALSE; +GLboolean __GLEW_ARB_copy_buffer = GL_FALSE; +GLboolean __GLEW_ARB_copy_image = GL_FALSE; +GLboolean __GLEW_ARB_cull_distance = GL_FALSE; +GLboolean __GLEW_ARB_debug_output = GL_FALSE; +GLboolean __GLEW_ARB_depth_buffer_float = GL_FALSE; +GLboolean __GLEW_ARB_depth_clamp = GL_FALSE; +GLboolean __GLEW_ARB_depth_texture = GL_FALSE; +GLboolean __GLEW_ARB_derivative_control = GL_FALSE; +GLboolean __GLEW_ARB_direct_state_access = GL_FALSE; +GLboolean __GLEW_ARB_draw_buffers = GL_FALSE; +GLboolean __GLEW_ARB_draw_buffers_blend = GL_FALSE; +GLboolean __GLEW_ARB_draw_elements_base_vertex = GL_FALSE; +GLboolean __GLEW_ARB_draw_indirect = GL_FALSE; +GLboolean __GLEW_ARB_draw_instanced = GL_FALSE; +GLboolean __GLEW_ARB_enhanced_layouts = GL_FALSE; +GLboolean __GLEW_ARB_explicit_attrib_location = GL_FALSE; +GLboolean __GLEW_ARB_explicit_uniform_location = GL_FALSE; +GLboolean __GLEW_ARB_fragment_coord_conventions = GL_FALSE; +GLboolean __GLEW_ARB_fragment_layer_viewport = GL_FALSE; +GLboolean __GLEW_ARB_fragment_program = GL_FALSE; +GLboolean __GLEW_ARB_fragment_program_shadow = GL_FALSE; +GLboolean __GLEW_ARB_fragment_shader = GL_FALSE; +GLboolean __GLEW_ARB_fragment_shader_interlock = GL_FALSE; +GLboolean __GLEW_ARB_framebuffer_no_attachments = GL_FALSE; +GLboolean __GLEW_ARB_framebuffer_object = GL_FALSE; +GLboolean __GLEW_ARB_framebuffer_sRGB = GL_FALSE; +GLboolean __GLEW_ARB_geometry_shader4 = GL_FALSE; +GLboolean __GLEW_ARB_get_program_binary = GL_FALSE; +GLboolean __GLEW_ARB_get_texture_sub_image = GL_FALSE; +GLboolean __GLEW_ARB_gpu_shader5 = GL_FALSE; +GLboolean __GLEW_ARB_gpu_shader_fp64 = GL_FALSE; +GLboolean __GLEW_ARB_gpu_shader_int64 = GL_FALSE; +GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE; +GLboolean __GLEW_ARB_half_float_vertex = GL_FALSE; +GLboolean __GLEW_ARB_imaging = GL_FALSE; +GLboolean __GLEW_ARB_indirect_parameters = GL_FALSE; +GLboolean __GLEW_ARB_instanced_arrays = GL_FALSE; +GLboolean __GLEW_ARB_internalformat_query = GL_FALSE; +GLboolean __GLEW_ARB_internalformat_query2 = GL_FALSE; +GLboolean __GLEW_ARB_invalidate_subdata = GL_FALSE; +GLboolean __GLEW_ARB_map_buffer_alignment = GL_FALSE; +GLboolean __GLEW_ARB_map_buffer_range = GL_FALSE; +GLboolean __GLEW_ARB_matrix_palette = GL_FALSE; +GLboolean __GLEW_ARB_multi_bind = GL_FALSE; +GLboolean __GLEW_ARB_multi_draw_indirect = GL_FALSE; +GLboolean __GLEW_ARB_multisample = GL_FALSE; +GLboolean __GLEW_ARB_multitexture = GL_FALSE; +GLboolean __GLEW_ARB_occlusion_query = GL_FALSE; +GLboolean __GLEW_ARB_occlusion_query2 = GL_FALSE; +GLboolean __GLEW_ARB_parallel_shader_compile = GL_FALSE; +GLboolean __GLEW_ARB_pipeline_statistics_query = GL_FALSE; +GLboolean __GLEW_ARB_pixel_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_point_parameters = GL_FALSE; +GLboolean __GLEW_ARB_point_sprite = GL_FALSE; +GLboolean __GLEW_ARB_post_depth_coverage = GL_FALSE; +GLboolean __GLEW_ARB_program_interface_query = GL_FALSE; +GLboolean __GLEW_ARB_provoking_vertex = GL_FALSE; +GLboolean __GLEW_ARB_query_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_robust_buffer_access_behavior = GL_FALSE; +GLboolean __GLEW_ARB_robustness = GL_FALSE; +GLboolean __GLEW_ARB_robustness_application_isolation = GL_FALSE; +GLboolean __GLEW_ARB_robustness_share_group_isolation = GL_FALSE; +GLboolean __GLEW_ARB_sample_locations = GL_FALSE; +GLboolean __GLEW_ARB_sample_shading = GL_FALSE; +GLboolean __GLEW_ARB_sampler_objects = GL_FALSE; +GLboolean __GLEW_ARB_seamless_cube_map = GL_FALSE; +GLboolean __GLEW_ARB_seamless_cubemap_per_texture = GL_FALSE; +GLboolean __GLEW_ARB_separate_shader_objects = GL_FALSE; +GLboolean __GLEW_ARB_shader_atomic_counter_ops = GL_FALSE; +GLboolean __GLEW_ARB_shader_atomic_counters = GL_FALSE; +GLboolean __GLEW_ARB_shader_ballot = GL_FALSE; +GLboolean __GLEW_ARB_shader_bit_encoding = GL_FALSE; +GLboolean __GLEW_ARB_shader_clock = GL_FALSE; +GLboolean __GLEW_ARB_shader_draw_parameters = GL_FALSE; +GLboolean __GLEW_ARB_shader_group_vote = GL_FALSE; +GLboolean __GLEW_ARB_shader_image_load_store = GL_FALSE; +GLboolean __GLEW_ARB_shader_image_size = GL_FALSE; +GLboolean __GLEW_ARB_shader_objects = GL_FALSE; +GLboolean __GLEW_ARB_shader_precision = GL_FALSE; +GLboolean __GLEW_ARB_shader_stencil_export = GL_FALSE; +GLboolean __GLEW_ARB_shader_storage_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_shader_subroutine = GL_FALSE; +GLboolean __GLEW_ARB_shader_texture_image_samples = GL_FALSE; +GLboolean __GLEW_ARB_shader_texture_lod = GL_FALSE; +GLboolean __GLEW_ARB_shader_viewport_layer_array = GL_FALSE; +GLboolean __GLEW_ARB_shading_language_100 = GL_FALSE; +GLboolean __GLEW_ARB_shading_language_420pack = GL_FALSE; +GLboolean __GLEW_ARB_shading_language_include = GL_FALSE; +GLboolean __GLEW_ARB_shading_language_packing = GL_FALSE; +GLboolean __GLEW_ARB_shadow = GL_FALSE; +GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE; +GLboolean __GLEW_ARB_sparse_buffer = GL_FALSE; +GLboolean __GLEW_ARB_sparse_texture = GL_FALSE; +GLboolean __GLEW_ARB_sparse_texture2 = GL_FALSE; +GLboolean __GLEW_ARB_sparse_texture_clamp = GL_FALSE; +GLboolean __GLEW_ARB_stencil_texturing = GL_FALSE; +GLboolean __GLEW_ARB_sync = GL_FALSE; +GLboolean __GLEW_ARB_tessellation_shader = GL_FALSE; +GLboolean __GLEW_ARB_texture_barrier = GL_FALSE; +GLboolean __GLEW_ARB_texture_border_clamp = GL_FALSE; +GLboolean __GLEW_ARB_texture_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_texture_buffer_object_rgb32 = GL_FALSE; +GLboolean __GLEW_ARB_texture_buffer_range = GL_FALSE; +GLboolean __GLEW_ARB_texture_compression = GL_FALSE; +GLboolean __GLEW_ARB_texture_compression_bptc = GL_FALSE; +GLboolean __GLEW_ARB_texture_compression_rgtc = GL_FALSE; +GLboolean __GLEW_ARB_texture_cube_map = GL_FALSE; +GLboolean __GLEW_ARB_texture_cube_map_array = GL_FALSE; +GLboolean __GLEW_ARB_texture_env_add = GL_FALSE; +GLboolean __GLEW_ARB_texture_env_combine = GL_FALSE; +GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE; +GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE; +GLboolean __GLEW_ARB_texture_filter_minmax = GL_FALSE; +GLboolean __GLEW_ARB_texture_float = GL_FALSE; +GLboolean __GLEW_ARB_texture_gather = GL_FALSE; +GLboolean __GLEW_ARB_texture_mirror_clamp_to_edge = GL_FALSE; +GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE; +GLboolean __GLEW_ARB_texture_multisample = GL_FALSE; +GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE; +GLboolean __GLEW_ARB_texture_query_levels = GL_FALSE; +GLboolean __GLEW_ARB_texture_query_lod = GL_FALSE; +GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE; +GLboolean __GLEW_ARB_texture_rg = GL_FALSE; +GLboolean __GLEW_ARB_texture_rgb10_a2ui = GL_FALSE; +GLboolean __GLEW_ARB_texture_stencil8 = GL_FALSE; +GLboolean __GLEW_ARB_texture_storage = GL_FALSE; +GLboolean __GLEW_ARB_texture_storage_multisample = GL_FALSE; +GLboolean __GLEW_ARB_texture_swizzle = GL_FALSE; +GLboolean __GLEW_ARB_texture_view = GL_FALSE; +GLboolean __GLEW_ARB_timer_query = GL_FALSE; +GLboolean __GLEW_ARB_transform_feedback2 = GL_FALSE; +GLboolean __GLEW_ARB_transform_feedback3 = GL_FALSE; +GLboolean __GLEW_ARB_transform_feedback_instanced = GL_FALSE; +GLboolean __GLEW_ARB_transform_feedback_overflow_query = GL_FALSE; +GLboolean __GLEW_ARB_transpose_matrix = GL_FALSE; +GLboolean __GLEW_ARB_uniform_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_vertex_array_bgra = GL_FALSE; +GLboolean __GLEW_ARB_vertex_array_object = GL_FALSE; +GLboolean __GLEW_ARB_vertex_attrib_64bit = GL_FALSE; +GLboolean __GLEW_ARB_vertex_attrib_binding = GL_FALSE; +GLboolean __GLEW_ARB_vertex_blend = GL_FALSE; +GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE; +GLboolean __GLEW_ARB_vertex_program = GL_FALSE; +GLboolean __GLEW_ARB_vertex_shader = GL_FALSE; +GLboolean __GLEW_ARB_vertex_type_10f_11f_11f_rev = GL_FALSE; +GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev = GL_FALSE; +GLboolean __GLEW_ARB_viewport_array = GL_FALSE; +GLboolean __GLEW_ARB_window_pos = GL_FALSE; +GLboolean __GLEW_ATIX_point_sprites = GL_FALSE; +GLboolean __GLEW_ATIX_texture_env_combine3 = GL_FALSE; +GLboolean __GLEW_ATIX_texture_env_route = GL_FALSE; +GLboolean __GLEW_ATIX_vertex_shader_output_point_size = GL_FALSE; +GLboolean __GLEW_ATI_draw_buffers = GL_FALSE; +GLboolean __GLEW_ATI_element_array = GL_FALSE; +GLboolean __GLEW_ATI_envmap_bumpmap = GL_FALSE; +GLboolean __GLEW_ATI_fragment_shader = GL_FALSE; +GLboolean __GLEW_ATI_map_object_buffer = GL_FALSE; +GLboolean __GLEW_ATI_meminfo = GL_FALSE; +GLboolean __GLEW_ATI_pn_triangles = GL_FALSE; +GLboolean __GLEW_ATI_separate_stencil = GL_FALSE; +GLboolean __GLEW_ATI_shader_texture_lod = GL_FALSE; +GLboolean __GLEW_ATI_text_fragment_shader = GL_FALSE; +GLboolean __GLEW_ATI_texture_compression_3dc = GL_FALSE; +GLboolean __GLEW_ATI_texture_env_combine3 = GL_FALSE; +GLboolean __GLEW_ATI_texture_float = GL_FALSE; +GLboolean __GLEW_ATI_texture_mirror_once = GL_FALSE; +GLboolean __GLEW_ATI_vertex_array_object = GL_FALSE; +GLboolean __GLEW_ATI_vertex_attrib_array_object = GL_FALSE; +GLboolean __GLEW_ATI_vertex_streams = GL_FALSE; +GLboolean __GLEW_EXT_422_pixels = GL_FALSE; +GLboolean __GLEW_EXT_Cg_shader = GL_FALSE; +GLboolean __GLEW_EXT_abgr = GL_FALSE; +GLboolean __GLEW_EXT_bgra = GL_FALSE; +GLboolean __GLEW_EXT_bindable_uniform = GL_FALSE; +GLboolean __GLEW_EXT_blend_color = GL_FALSE; +GLboolean __GLEW_EXT_blend_equation_separate = GL_FALSE; +GLboolean __GLEW_EXT_blend_func_separate = GL_FALSE; +GLboolean __GLEW_EXT_blend_logic_op = GL_FALSE; +GLboolean __GLEW_EXT_blend_minmax = GL_FALSE; +GLboolean __GLEW_EXT_blend_subtract = GL_FALSE; +GLboolean __GLEW_EXT_clip_volume_hint = GL_FALSE; +GLboolean __GLEW_EXT_cmyka = GL_FALSE; +GLboolean __GLEW_EXT_color_subtable = GL_FALSE; +GLboolean __GLEW_EXT_compiled_vertex_array = GL_FALSE; +GLboolean __GLEW_EXT_convolution = GL_FALSE; +GLboolean __GLEW_EXT_coordinate_frame = GL_FALSE; +GLboolean __GLEW_EXT_copy_texture = GL_FALSE; +GLboolean __GLEW_EXT_cull_vertex = GL_FALSE; +GLboolean __GLEW_EXT_debug_label = GL_FALSE; +GLboolean __GLEW_EXT_debug_marker = GL_FALSE; +GLboolean __GLEW_EXT_depth_bounds_test = GL_FALSE; +GLboolean __GLEW_EXT_direct_state_access = GL_FALSE; +GLboolean __GLEW_EXT_draw_buffers2 = GL_FALSE; +GLboolean __GLEW_EXT_draw_instanced = GL_FALSE; +GLboolean __GLEW_EXT_draw_range_elements = GL_FALSE; +GLboolean __GLEW_EXT_fog_coord = GL_FALSE; +GLboolean __GLEW_EXT_fragment_lighting = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_blit = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_multisample = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_multisample_blit_scaled = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_object = GL_FALSE; +GLboolean __GLEW_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean __GLEW_EXT_geometry_shader4 = GL_FALSE; +GLboolean __GLEW_EXT_gpu_program_parameters = GL_FALSE; +GLboolean __GLEW_EXT_gpu_shader4 = GL_FALSE; +GLboolean __GLEW_EXT_histogram = GL_FALSE; +GLboolean __GLEW_EXT_index_array_formats = GL_FALSE; +GLboolean __GLEW_EXT_index_func = GL_FALSE; +GLboolean __GLEW_EXT_index_material = GL_FALSE; +GLboolean __GLEW_EXT_index_texture = GL_FALSE; +GLboolean __GLEW_EXT_light_texture = GL_FALSE; +GLboolean __GLEW_EXT_misc_attribute = GL_FALSE; +GLboolean __GLEW_EXT_multi_draw_arrays = GL_FALSE; +GLboolean __GLEW_EXT_multisample = GL_FALSE; +GLboolean __GLEW_EXT_packed_depth_stencil = GL_FALSE; +GLboolean __GLEW_EXT_packed_float = GL_FALSE; +GLboolean __GLEW_EXT_packed_pixels = GL_FALSE; +GLboolean __GLEW_EXT_paletted_texture = GL_FALSE; +GLboolean __GLEW_EXT_pixel_buffer_object = GL_FALSE; +GLboolean __GLEW_EXT_pixel_transform = GL_FALSE; +GLboolean __GLEW_EXT_pixel_transform_color_table = GL_FALSE; +GLboolean __GLEW_EXT_point_parameters = GL_FALSE; +GLboolean __GLEW_EXT_polygon_offset = GL_FALSE; +GLboolean __GLEW_EXT_polygon_offset_clamp = GL_FALSE; +GLboolean __GLEW_EXT_post_depth_coverage = GL_FALSE; +GLboolean __GLEW_EXT_provoking_vertex = GL_FALSE; +GLboolean __GLEW_EXT_raster_multisample = GL_FALSE; +GLboolean __GLEW_EXT_rescale_normal = GL_FALSE; +GLboolean __GLEW_EXT_scene_marker = GL_FALSE; +GLboolean __GLEW_EXT_secondary_color = GL_FALSE; +GLboolean __GLEW_EXT_separate_shader_objects = GL_FALSE; +GLboolean __GLEW_EXT_separate_specular_color = GL_FALSE; +GLboolean __GLEW_EXT_shader_image_load_formatted = GL_FALSE; +GLboolean __GLEW_EXT_shader_image_load_store = GL_FALSE; +GLboolean __GLEW_EXT_shader_integer_mix = GL_FALSE; +GLboolean __GLEW_EXT_shadow_funcs = GL_FALSE; +GLboolean __GLEW_EXT_shared_texture_palette = GL_FALSE; +GLboolean __GLEW_EXT_sparse_texture2 = GL_FALSE; +GLboolean __GLEW_EXT_stencil_clear_tag = GL_FALSE; +GLboolean __GLEW_EXT_stencil_two_side = GL_FALSE; +GLboolean __GLEW_EXT_stencil_wrap = GL_FALSE; +GLboolean __GLEW_EXT_subtexture = GL_FALSE; +GLboolean __GLEW_EXT_texture = GL_FALSE; +GLboolean __GLEW_EXT_texture3D = GL_FALSE; +GLboolean __GLEW_EXT_texture_array = GL_FALSE; +GLboolean __GLEW_EXT_texture_buffer_object = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_dxt1 = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_latc = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_rgtc = GL_FALSE; +GLboolean __GLEW_EXT_texture_compression_s3tc = GL_FALSE; +GLboolean __GLEW_EXT_texture_cube_map = GL_FALSE; +GLboolean __GLEW_EXT_texture_edge_clamp = GL_FALSE; +GLboolean __GLEW_EXT_texture_env = GL_FALSE; +GLboolean __GLEW_EXT_texture_env_add = GL_FALSE; +GLboolean __GLEW_EXT_texture_env_combine = GL_FALSE; +GLboolean __GLEW_EXT_texture_env_dot3 = GL_FALSE; +GLboolean __GLEW_EXT_texture_filter_anisotropic = GL_FALSE; +GLboolean __GLEW_EXT_texture_filter_minmax = GL_FALSE; +GLboolean __GLEW_EXT_texture_integer = GL_FALSE; +GLboolean __GLEW_EXT_texture_lod_bias = GL_FALSE; +GLboolean __GLEW_EXT_texture_mirror_clamp = GL_FALSE; +GLboolean __GLEW_EXT_texture_object = GL_FALSE; +GLboolean __GLEW_EXT_texture_perturb_normal = GL_FALSE; +GLboolean __GLEW_EXT_texture_rectangle = GL_FALSE; +GLboolean __GLEW_EXT_texture_sRGB = GL_FALSE; +GLboolean __GLEW_EXT_texture_sRGB_decode = GL_FALSE; +GLboolean __GLEW_EXT_texture_shared_exponent = GL_FALSE; +GLboolean __GLEW_EXT_texture_snorm = GL_FALSE; +GLboolean __GLEW_EXT_texture_swizzle = GL_FALSE; +GLboolean __GLEW_EXT_timer_query = GL_FALSE; +GLboolean __GLEW_EXT_transform_feedback = GL_FALSE; +GLboolean __GLEW_EXT_vertex_array = GL_FALSE; +GLboolean __GLEW_EXT_vertex_array_bgra = GL_FALSE; +GLboolean __GLEW_EXT_vertex_attrib_64bit = GL_FALSE; +GLboolean __GLEW_EXT_vertex_shader = GL_FALSE; +GLboolean __GLEW_EXT_vertex_weighting = GL_FALSE; +GLboolean __GLEW_EXT_x11_sync_object = GL_FALSE; +GLboolean __GLEW_GREMEDY_frame_terminator = GL_FALSE; +GLboolean __GLEW_GREMEDY_string_marker = GL_FALSE; +GLboolean __GLEW_HP_convolution_border_modes = GL_FALSE; +GLboolean __GLEW_HP_image_transform = GL_FALSE; +GLboolean __GLEW_HP_occlusion_test = GL_FALSE; +GLboolean __GLEW_HP_texture_lighting = GL_FALSE; +GLboolean __GLEW_IBM_cull_vertex = GL_FALSE; +GLboolean __GLEW_IBM_multimode_draw_arrays = GL_FALSE; +GLboolean __GLEW_IBM_rasterpos_clip = GL_FALSE; +GLboolean __GLEW_IBM_static_data = GL_FALSE; +GLboolean __GLEW_IBM_texture_mirrored_repeat = GL_FALSE; +GLboolean __GLEW_IBM_vertex_array_lists = GL_FALSE; +GLboolean __GLEW_INGR_color_clamp = GL_FALSE; +GLboolean __GLEW_INGR_interlace_read = GL_FALSE; +GLboolean __GLEW_INTEL_fragment_shader_ordering = GL_FALSE; +GLboolean __GLEW_INTEL_framebuffer_CMAA = GL_FALSE; +GLboolean __GLEW_INTEL_map_texture = GL_FALSE; +GLboolean __GLEW_INTEL_parallel_arrays = GL_FALSE; +GLboolean __GLEW_INTEL_performance_query = GL_FALSE; +GLboolean __GLEW_INTEL_texture_scissor = GL_FALSE; +GLboolean __GLEW_KHR_blend_equation_advanced = GL_FALSE; +GLboolean __GLEW_KHR_blend_equation_advanced_coherent = GL_FALSE; +GLboolean __GLEW_KHR_context_flush_control = GL_FALSE; +GLboolean __GLEW_KHR_debug = GL_FALSE; +GLboolean __GLEW_KHR_no_error = GL_FALSE; +GLboolean __GLEW_KHR_robust_buffer_access_behavior = GL_FALSE; +GLboolean __GLEW_KHR_robustness = GL_FALSE; +GLboolean __GLEW_KHR_texture_compression_astc_hdr = GL_FALSE; +GLboolean __GLEW_KHR_texture_compression_astc_ldr = GL_FALSE; +GLboolean __GLEW_KTX_buffer_region = GL_FALSE; +GLboolean __GLEW_MESAX_texture_stack = GL_FALSE; +GLboolean __GLEW_MESA_pack_invert = GL_FALSE; +GLboolean __GLEW_MESA_resize_buffers = GL_FALSE; +GLboolean __GLEW_MESA_window_pos = GL_FALSE; +GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE; +GLboolean __GLEW_NVX_conditional_render = GL_FALSE; +GLboolean __GLEW_NVX_gpu_memory_info = GL_FALSE; +GLboolean __GLEW_NV_bindless_multi_draw_indirect = GL_FALSE; +GLboolean __GLEW_NV_bindless_multi_draw_indirect_count = GL_FALSE; +GLboolean __GLEW_NV_bindless_texture = GL_FALSE; +GLboolean __GLEW_NV_blend_equation_advanced = GL_FALSE; +GLboolean __GLEW_NV_blend_equation_advanced_coherent = GL_FALSE; +GLboolean __GLEW_NV_blend_square = GL_FALSE; +GLboolean __GLEW_NV_compute_program5 = GL_FALSE; +GLboolean __GLEW_NV_conditional_render = GL_FALSE; +GLboolean __GLEW_NV_conservative_raster = GL_FALSE; +GLboolean __GLEW_NV_conservative_raster_dilate = GL_FALSE; +GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE; +GLboolean __GLEW_NV_copy_image = GL_FALSE; +GLboolean __GLEW_NV_deep_texture3D = GL_FALSE; +GLboolean __GLEW_NV_depth_buffer_float = GL_FALSE; +GLboolean __GLEW_NV_depth_clamp = GL_FALSE; +GLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE; +GLboolean __GLEW_NV_draw_texture = GL_FALSE; +GLboolean __GLEW_NV_evaluators = GL_FALSE; +GLboolean __GLEW_NV_explicit_multisample = GL_FALSE; +GLboolean __GLEW_NV_fence = GL_FALSE; +GLboolean __GLEW_NV_fill_rectangle = GL_FALSE; +GLboolean __GLEW_NV_float_buffer = GL_FALSE; +GLboolean __GLEW_NV_fog_distance = GL_FALSE; +GLboolean __GLEW_NV_fragment_coverage_to_color = GL_FALSE; +GLboolean __GLEW_NV_fragment_program = GL_FALSE; +GLboolean __GLEW_NV_fragment_program2 = GL_FALSE; +GLboolean __GLEW_NV_fragment_program4 = GL_FALSE; +GLboolean __GLEW_NV_fragment_program_option = GL_FALSE; +GLboolean __GLEW_NV_fragment_shader_interlock = GL_FALSE; +GLboolean __GLEW_NV_framebuffer_mixed_samples = GL_FALSE; +GLboolean __GLEW_NV_framebuffer_multisample_coverage = GL_FALSE; +GLboolean __GLEW_NV_geometry_program4 = GL_FALSE; +GLboolean __GLEW_NV_geometry_shader4 = GL_FALSE; +GLboolean __GLEW_NV_geometry_shader_passthrough = GL_FALSE; +GLboolean __GLEW_NV_gpu_program4 = GL_FALSE; +GLboolean __GLEW_NV_gpu_program5 = GL_FALSE; +GLboolean __GLEW_NV_gpu_program5_mem_extended = GL_FALSE; +GLboolean __GLEW_NV_gpu_program_fp64 = GL_FALSE; +GLboolean __GLEW_NV_gpu_shader5 = GL_FALSE; +GLboolean __GLEW_NV_half_float = GL_FALSE; +GLboolean __GLEW_NV_internalformat_sample_query = GL_FALSE; +GLboolean __GLEW_NV_light_max_exponent = GL_FALSE; +GLboolean __GLEW_NV_multisample_coverage = GL_FALSE; +GLboolean __GLEW_NV_multisample_filter_hint = GL_FALSE; +GLboolean __GLEW_NV_occlusion_query = GL_FALSE; +GLboolean __GLEW_NV_packed_depth_stencil = GL_FALSE; +GLboolean __GLEW_NV_parameter_buffer_object = GL_FALSE; +GLboolean __GLEW_NV_parameter_buffer_object2 = GL_FALSE; +GLboolean __GLEW_NV_path_rendering = GL_FALSE; +GLboolean __GLEW_NV_path_rendering_shared_edge = GL_FALSE; +GLboolean __GLEW_NV_pixel_data_range = GL_FALSE; +GLboolean __GLEW_NV_point_sprite = GL_FALSE; +GLboolean __GLEW_NV_present_video = GL_FALSE; +GLboolean __GLEW_NV_primitive_restart = GL_FALSE; +GLboolean __GLEW_NV_register_combiners = GL_FALSE; +GLboolean __GLEW_NV_register_combiners2 = GL_FALSE; +GLboolean __GLEW_NV_sample_locations = GL_FALSE; +GLboolean __GLEW_NV_sample_mask_override_coverage = GL_FALSE; +GLboolean __GLEW_NV_shader_atomic_counters = GL_FALSE; +GLboolean __GLEW_NV_shader_atomic_float = GL_FALSE; +GLboolean __GLEW_NV_shader_atomic_fp16_vector = GL_FALSE; +GLboolean __GLEW_NV_shader_atomic_int64 = GL_FALSE; +GLboolean __GLEW_NV_shader_buffer_load = GL_FALSE; +GLboolean __GLEW_NV_shader_storage_buffer_object = GL_FALSE; +GLboolean __GLEW_NV_shader_thread_group = GL_FALSE; +GLboolean __GLEW_NV_shader_thread_shuffle = GL_FALSE; +GLboolean __GLEW_NV_tessellation_program5 = GL_FALSE; +GLboolean __GLEW_NV_texgen_emboss = GL_FALSE; +GLboolean __GLEW_NV_texgen_reflection = GL_FALSE; +GLboolean __GLEW_NV_texture_barrier = GL_FALSE; +GLboolean __GLEW_NV_texture_compression_vtc = GL_FALSE; +GLboolean __GLEW_NV_texture_env_combine4 = GL_FALSE; +GLboolean __GLEW_NV_texture_expand_normal = GL_FALSE; +GLboolean __GLEW_NV_texture_multisample = GL_FALSE; +GLboolean __GLEW_NV_texture_rectangle = GL_FALSE; +GLboolean __GLEW_NV_texture_shader = GL_FALSE; +GLboolean __GLEW_NV_texture_shader2 = GL_FALSE; +GLboolean __GLEW_NV_texture_shader3 = GL_FALSE; +GLboolean __GLEW_NV_transform_feedback = GL_FALSE; +GLboolean __GLEW_NV_transform_feedback2 = GL_FALSE; +GLboolean __GLEW_NV_uniform_buffer_unified_memory = GL_FALSE; +GLboolean __GLEW_NV_vdpau_interop = GL_FALSE; +GLboolean __GLEW_NV_vertex_array_range = GL_FALSE; +GLboolean __GLEW_NV_vertex_array_range2 = GL_FALSE; +GLboolean __GLEW_NV_vertex_attrib_integer_64bit = GL_FALSE; +GLboolean __GLEW_NV_vertex_buffer_unified_memory = GL_FALSE; +GLboolean __GLEW_NV_vertex_program = GL_FALSE; +GLboolean __GLEW_NV_vertex_program1_1 = GL_FALSE; +GLboolean __GLEW_NV_vertex_program2 = GL_FALSE; +GLboolean __GLEW_NV_vertex_program2_option = GL_FALSE; +GLboolean __GLEW_NV_vertex_program3 = GL_FALSE; +GLboolean __GLEW_NV_vertex_program4 = GL_FALSE; +GLboolean __GLEW_NV_video_capture = GL_FALSE; +GLboolean __GLEW_NV_viewport_array2 = GL_FALSE; +GLboolean __GLEW_OES_byte_coordinates = GL_FALSE; +GLboolean __GLEW_OES_compressed_paletted_texture = GL_FALSE; +GLboolean __GLEW_OES_read_format = GL_FALSE; +GLboolean __GLEW_OES_single_precision = GL_FALSE; +GLboolean __GLEW_OML_interlace = GL_FALSE; +GLboolean __GLEW_OML_resample = GL_FALSE; +GLboolean __GLEW_OML_subsample = GL_FALSE; +GLboolean __GLEW_OVR_multiview = GL_FALSE; +GLboolean __GLEW_OVR_multiview2 = GL_FALSE; +GLboolean __GLEW_PGI_misc_hints = GL_FALSE; +GLboolean __GLEW_PGI_vertex_hints = GL_FALSE; +GLboolean __GLEW_REGAL_ES1_0_compatibility = GL_FALSE; +GLboolean __GLEW_REGAL_ES1_1_compatibility = GL_FALSE; +GLboolean __GLEW_REGAL_enable = GL_FALSE; +GLboolean __GLEW_REGAL_error_string = GL_FALSE; +GLboolean __GLEW_REGAL_extension_query = GL_FALSE; +GLboolean __GLEW_REGAL_log = GL_FALSE; +GLboolean __GLEW_REGAL_proc_address = GL_FALSE; +GLboolean __GLEW_REND_screen_coordinates = GL_FALSE; +GLboolean __GLEW_S3_s3tc = GL_FALSE; +GLboolean __GLEW_SGIS_color_range = GL_FALSE; +GLboolean __GLEW_SGIS_detail_texture = GL_FALSE; +GLboolean __GLEW_SGIS_fog_function = GL_FALSE; +GLboolean __GLEW_SGIS_generate_mipmap = GL_FALSE; +GLboolean __GLEW_SGIS_multisample = GL_FALSE; +GLboolean __GLEW_SGIS_pixel_texture = GL_FALSE; +GLboolean __GLEW_SGIS_point_line_texgen = GL_FALSE; +GLboolean __GLEW_SGIS_sharpen_texture = GL_FALSE; +GLboolean __GLEW_SGIS_texture4D = GL_FALSE; +GLboolean __GLEW_SGIS_texture_border_clamp = GL_FALSE; +GLboolean __GLEW_SGIS_texture_edge_clamp = GL_FALSE; +GLboolean __GLEW_SGIS_texture_filter4 = GL_FALSE; +GLboolean __GLEW_SGIS_texture_lod = GL_FALSE; +GLboolean __GLEW_SGIS_texture_select = GL_FALSE; +GLboolean __GLEW_SGIX_async = GL_FALSE; +GLboolean __GLEW_SGIX_async_histogram = GL_FALSE; +GLboolean __GLEW_SGIX_async_pixel = GL_FALSE; +GLboolean __GLEW_SGIX_blend_alpha_minmax = GL_FALSE; +GLboolean __GLEW_SGIX_clipmap = GL_FALSE; +GLboolean __GLEW_SGIX_convolution_accuracy = GL_FALSE; +GLboolean __GLEW_SGIX_depth_texture = GL_FALSE; +GLboolean __GLEW_SGIX_flush_raster = GL_FALSE; +GLboolean __GLEW_SGIX_fog_offset = GL_FALSE; +GLboolean __GLEW_SGIX_fog_texture = GL_FALSE; +GLboolean __GLEW_SGIX_fragment_specular_lighting = GL_FALSE; +GLboolean __GLEW_SGIX_framezoom = GL_FALSE; +GLboolean __GLEW_SGIX_interlace = GL_FALSE; +GLboolean __GLEW_SGIX_ir_instrument1 = GL_FALSE; +GLboolean __GLEW_SGIX_list_priority = GL_FALSE; +GLboolean __GLEW_SGIX_pixel_texture = GL_FALSE; +GLboolean __GLEW_SGIX_pixel_texture_bits = GL_FALSE; +GLboolean __GLEW_SGIX_reference_plane = GL_FALSE; +GLboolean __GLEW_SGIX_resample = GL_FALSE; +GLboolean __GLEW_SGIX_shadow = GL_FALSE; +GLboolean __GLEW_SGIX_shadow_ambient = GL_FALSE; +GLboolean __GLEW_SGIX_sprite = GL_FALSE; +GLboolean __GLEW_SGIX_tag_sample_buffer = GL_FALSE; +GLboolean __GLEW_SGIX_texture_add_env = GL_FALSE; +GLboolean __GLEW_SGIX_texture_coordinate_clamp = GL_FALSE; +GLboolean __GLEW_SGIX_texture_lod_bias = GL_FALSE; +GLboolean __GLEW_SGIX_texture_multi_buffer = GL_FALSE; +GLboolean __GLEW_SGIX_texture_range = GL_FALSE; +GLboolean __GLEW_SGIX_texture_scale_bias = GL_FALSE; +GLboolean __GLEW_SGIX_vertex_preclip = GL_FALSE; +GLboolean __GLEW_SGIX_vertex_preclip_hint = GL_FALSE; +GLboolean __GLEW_SGIX_ycrcb = GL_FALSE; +GLboolean __GLEW_SGI_color_matrix = GL_FALSE; +GLboolean __GLEW_SGI_color_table = GL_FALSE; +GLboolean __GLEW_SGI_texture_color_table = GL_FALSE; +GLboolean __GLEW_SUNX_constant_data = GL_FALSE; +GLboolean __GLEW_SUN_convolution_border_modes = GL_FALSE; +GLboolean __GLEW_SUN_global_alpha = GL_FALSE; +GLboolean __GLEW_SUN_mesh_array = GL_FALSE; +GLboolean __GLEW_SUN_read_video_pixels = GL_FALSE; +GLboolean __GLEW_SUN_slice_accum = GL_FALSE; +GLboolean __GLEW_SUN_triangle_list = GL_FALSE; +GLboolean __GLEW_SUN_vertex = GL_FALSE; +GLboolean __GLEW_WIN_phong_shading = GL_FALSE; +GLboolean __GLEW_WIN_specular_fog = GL_FALSE; +GLboolean __GLEW_WIN_swap_hint = GL_FALSE; + +#endif /* !GLEW_MX */ + +#ifdef GL_VERSION_1_2 + +static GLboolean _glewInit_GL_VERSION_1_2 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3D")) == NULL) || r; + r = ((glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElements")) == NULL) || r; + r = ((glTexImage3D = (PFNGLTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexImage3D")) == NULL) || r; + r = ((glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3D")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_1_2 */ + +#ifdef GL_VERSION_1_3 + +static GLboolean _glewInit_GL_VERSION_1_3 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glActiveTexture = (PFNGLACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glActiveTexture")) == NULL) || r; + r = ((glClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTexture")) == NULL) || r; + r = ((glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1D")) == NULL) || r; + r = ((glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2D")) == NULL) || r; + r = ((glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3D")) == NULL) || r; + r = ((glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1D")) == NULL) || r; + r = ((glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2D")) == NULL) || r; + r = ((glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3D")) == NULL) || r; + r = ((glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImage")) == NULL) || r; + r = ((glLoadTransposeMatrixd = (PFNGLLOADTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixd")) == NULL) || r; + r = ((glLoadTransposeMatrixf = (PFNGLLOADTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixf")) == NULL) || r; + r = ((glMultTransposeMatrixd = (PFNGLMULTTRANSPOSEMATRIXDPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixd")) == NULL) || r; + r = ((glMultTransposeMatrixf = (PFNGLMULTTRANSPOSEMATRIXFPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixf")) == NULL) || r; + r = ((glMultiTexCoord1d = (PFNGLMULTITEXCOORD1DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1d")) == NULL) || r; + r = ((glMultiTexCoord1dv = (PFNGLMULTITEXCOORD1DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dv")) == NULL) || r; + r = ((glMultiTexCoord1f = (PFNGLMULTITEXCOORD1FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1f")) == NULL) || r; + r = ((glMultiTexCoord1fv = (PFNGLMULTITEXCOORD1FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fv")) == NULL) || r; + r = ((glMultiTexCoord1i = (PFNGLMULTITEXCOORD1IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1i")) == NULL) || r; + r = ((glMultiTexCoord1iv = (PFNGLMULTITEXCOORD1IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iv")) == NULL) || r; + r = ((glMultiTexCoord1s = (PFNGLMULTITEXCOORD1SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1s")) == NULL) || r; + r = ((glMultiTexCoord1sv = (PFNGLMULTITEXCOORD1SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sv")) == NULL) || r; + r = ((glMultiTexCoord2d = (PFNGLMULTITEXCOORD2DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2d")) == NULL) || r; + r = ((glMultiTexCoord2dv = (PFNGLMULTITEXCOORD2DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dv")) == NULL) || r; + r = ((glMultiTexCoord2f = (PFNGLMULTITEXCOORD2FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2f")) == NULL) || r; + r = ((glMultiTexCoord2fv = (PFNGLMULTITEXCOORD2FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fv")) == NULL) || r; + r = ((glMultiTexCoord2i = (PFNGLMULTITEXCOORD2IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2i")) == NULL) || r; + r = ((glMultiTexCoord2iv = (PFNGLMULTITEXCOORD2IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iv")) == NULL) || r; + r = ((glMultiTexCoord2s = (PFNGLMULTITEXCOORD2SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2s")) == NULL) || r; + r = ((glMultiTexCoord2sv = (PFNGLMULTITEXCOORD2SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sv")) == NULL) || r; + r = ((glMultiTexCoord3d = (PFNGLMULTITEXCOORD3DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3d")) == NULL) || r; + r = ((glMultiTexCoord3dv = (PFNGLMULTITEXCOORD3DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dv")) == NULL) || r; + r = ((glMultiTexCoord3f = (PFNGLMULTITEXCOORD3FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3f")) == NULL) || r; + r = ((glMultiTexCoord3fv = (PFNGLMULTITEXCOORD3FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fv")) == NULL) || r; + r = ((glMultiTexCoord3i = (PFNGLMULTITEXCOORD3IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3i")) == NULL) || r; + r = ((glMultiTexCoord3iv = (PFNGLMULTITEXCOORD3IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iv")) == NULL) || r; + r = ((glMultiTexCoord3s = (PFNGLMULTITEXCOORD3SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3s")) == NULL) || r; + r = ((glMultiTexCoord3sv = (PFNGLMULTITEXCOORD3SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sv")) == NULL) || r; + r = ((glMultiTexCoord4d = (PFNGLMULTITEXCOORD4DPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4d")) == NULL) || r; + r = ((glMultiTexCoord4dv = (PFNGLMULTITEXCOORD4DVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dv")) == NULL) || r; + r = ((glMultiTexCoord4f = (PFNGLMULTITEXCOORD4FPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4f")) == NULL) || r; + r = ((glMultiTexCoord4fv = (PFNGLMULTITEXCOORD4FVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fv")) == NULL) || r; + r = ((glMultiTexCoord4i = (PFNGLMULTITEXCOORD4IPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4i")) == NULL) || r; + r = ((glMultiTexCoord4iv = (PFNGLMULTITEXCOORD4IVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iv")) == NULL) || r; + r = ((glMultiTexCoord4s = (PFNGLMULTITEXCOORD4SPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4s")) == NULL) || r; + r = ((glMultiTexCoord4sv = (PFNGLMULTITEXCOORD4SVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sv")) == NULL) || r; + r = ((glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverage")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_1_3 */ + +#ifdef GL_VERSION_1_4 + +static GLboolean _glewInit_GL_VERSION_1_4 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendColor = (PFNGLBLENDCOLORPROC)glewGetProcAddress((const GLubyte*)"glBlendColor")) == NULL) || r; + r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; + r = ((glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparate")) == NULL) || r; + r = ((glFogCoordPointer = (PFNGLFOGCOORDPOINTERPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointer")) == NULL) || r; + r = ((glFogCoordd = (PFNGLFOGCOORDDPROC)glewGetProcAddress((const GLubyte*)"glFogCoordd")) == NULL) || r; + r = ((glFogCoorddv = (PFNGLFOGCOORDDVPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddv")) == NULL) || r; + r = ((glFogCoordf = (PFNGLFOGCOORDFPROC)glewGetProcAddress((const GLubyte*)"glFogCoordf")) == NULL) || r; + r = ((glFogCoordfv = (PFNGLFOGCOORDFVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfv")) == NULL) || r; + r = ((glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArrays")) == NULL) || r; + r = ((glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElements")) == NULL) || r; + r = ((glPointParameterf = (PFNGLPOINTPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glPointParameterf")) == NULL) || r; + r = ((glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfv")) == NULL) || r; + r = ((glPointParameteri = (PFNGLPOINTPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPointParameteri")) == NULL) || r; + r = ((glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriv")) == NULL) || r; + r = ((glSecondaryColor3b = (PFNGLSECONDARYCOLOR3BPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3b")) == NULL) || r; + r = ((glSecondaryColor3bv = (PFNGLSECONDARYCOLOR3BVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bv")) == NULL) || r; + r = ((glSecondaryColor3d = (PFNGLSECONDARYCOLOR3DPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3d")) == NULL) || r; + r = ((glSecondaryColor3dv = (PFNGLSECONDARYCOLOR3DVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dv")) == NULL) || r; + r = ((glSecondaryColor3f = (PFNGLSECONDARYCOLOR3FPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3f")) == NULL) || r; + r = ((glSecondaryColor3fv = (PFNGLSECONDARYCOLOR3FVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fv")) == NULL) || r; + r = ((glSecondaryColor3i = (PFNGLSECONDARYCOLOR3IPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3i")) == NULL) || r; + r = ((glSecondaryColor3iv = (PFNGLSECONDARYCOLOR3IVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iv")) == NULL) || r; + r = ((glSecondaryColor3s = (PFNGLSECONDARYCOLOR3SPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3s")) == NULL) || r; + r = ((glSecondaryColor3sv = (PFNGLSECONDARYCOLOR3SVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sv")) == NULL) || r; + r = ((glSecondaryColor3ub = (PFNGLSECONDARYCOLOR3UBPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ub")) == NULL) || r; + r = ((glSecondaryColor3ubv = (PFNGLSECONDARYCOLOR3UBVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubv")) == NULL) || r; + r = ((glSecondaryColor3ui = (PFNGLSECONDARYCOLOR3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ui")) == NULL) || r; + r = ((glSecondaryColor3uiv = (PFNGLSECONDARYCOLOR3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiv")) == NULL) || r; + r = ((glSecondaryColor3us = (PFNGLSECONDARYCOLOR3USPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3us")) == NULL) || r; + r = ((glSecondaryColor3usv = (PFNGLSECONDARYCOLOR3USVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usv")) == NULL) || r; + r = ((glSecondaryColorPointer = (PFNGLSECONDARYCOLORPOINTERPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointer")) == NULL) || r; + r = ((glWindowPos2d = (PFNGLWINDOWPOS2DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2d")) == NULL) || r; + r = ((glWindowPos2dv = (PFNGLWINDOWPOS2DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dv")) == NULL) || r; + r = ((glWindowPos2f = (PFNGLWINDOWPOS2FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2f")) == NULL) || r; + r = ((glWindowPos2fv = (PFNGLWINDOWPOS2FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fv")) == NULL) || r; + r = ((glWindowPos2i = (PFNGLWINDOWPOS2IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2i")) == NULL) || r; + r = ((glWindowPos2iv = (PFNGLWINDOWPOS2IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iv")) == NULL) || r; + r = ((glWindowPos2s = (PFNGLWINDOWPOS2SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2s")) == NULL) || r; + r = ((glWindowPos2sv = (PFNGLWINDOWPOS2SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sv")) == NULL) || r; + r = ((glWindowPos3d = (PFNGLWINDOWPOS3DPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3d")) == NULL) || r; + r = ((glWindowPos3dv = (PFNGLWINDOWPOS3DVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dv")) == NULL) || r; + r = ((glWindowPos3f = (PFNGLWINDOWPOS3FPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3f")) == NULL) || r; + r = ((glWindowPos3fv = (PFNGLWINDOWPOS3FVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fv")) == NULL) || r; + r = ((glWindowPos3i = (PFNGLWINDOWPOS3IPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3i")) == NULL) || r; + r = ((glWindowPos3iv = (PFNGLWINDOWPOS3IVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iv")) == NULL) || r; + r = ((glWindowPos3s = (PFNGLWINDOWPOS3SPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3s")) == NULL) || r; + r = ((glWindowPos3sv = (PFNGLWINDOWPOS3SVPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sv")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_1_4 */ + +#ifdef GL_VERSION_1_5 + +static GLboolean _glewInit_GL_VERSION_1_5 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginQuery = (PFNGLBEGINQUERYPROC)glewGetProcAddress((const GLubyte*)"glBeginQuery")) == NULL) || r; + r = ((glBindBuffer = (PFNGLBINDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindBuffer")) == NULL) || r; + r = ((glBufferData = (PFNGLBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferData")) == NULL) || r; + r = ((glBufferSubData = (PFNGLBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glBufferSubData")) == NULL) || r; + r = ((glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffers")) == NULL) || r; + r = ((glDeleteQueries = (PFNGLDELETEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueries")) == NULL) || r; + r = ((glEndQuery = (PFNGLENDQUERYPROC)glewGetProcAddress((const GLubyte*)"glEndQuery")) == NULL) || r; + r = ((glGenBuffers = (PFNGLGENBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenBuffers")) == NULL) || r; + r = ((glGenQueries = (PFNGLGENQUERIESPROC)glewGetProcAddress((const GLubyte*)"glGenQueries")) == NULL) || r; + r = ((glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteriv")) == NULL) || r; + r = ((glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointerv")) == NULL) || r; + r = ((glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubData")) == NULL) || r; + r = ((glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectiv")) == NULL) || r; + r = ((glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuiv")) == NULL) || r; + r = ((glGetQueryiv = (PFNGLGETQUERYIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryiv")) == NULL) || r; + r = ((glIsBuffer = (PFNGLISBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsBuffer")) == NULL) || r; + r = ((glIsQuery = (PFNGLISQUERYPROC)glewGetProcAddress((const GLubyte*)"glIsQuery")) == NULL) || r; + r = ((glMapBuffer = (PFNGLMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapBuffer")) == NULL) || r; + r = ((glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapBuffer")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_1_5 */ + +#ifdef GL_VERSION_2_0 + +static GLboolean _glewInit_GL_VERSION_2_0 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAttachShader = (PFNGLATTACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glAttachShader")) == NULL) || r; + r = ((glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocation")) == NULL) || r; + r = ((glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparate")) == NULL) || r; + r = ((glCompileShader = (PFNGLCOMPILESHADERPROC)glewGetProcAddress((const GLubyte*)"glCompileShader")) == NULL) || r; + r = ((glCreateProgram = (PFNGLCREATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glCreateProgram")) == NULL) || r; + r = ((glCreateShader = (PFNGLCREATESHADERPROC)glewGetProcAddress((const GLubyte*)"glCreateShader")) == NULL) || r; + r = ((glDeleteProgram = (PFNGLDELETEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgram")) == NULL) || r; + r = ((glDeleteShader = (PFNGLDELETESHADERPROC)glewGetProcAddress((const GLubyte*)"glDeleteShader")) == NULL) || r; + r = ((glDetachShader = (PFNGLDETACHSHADERPROC)glewGetProcAddress((const GLubyte*)"glDetachShader")) == NULL) || r; + r = ((glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArray")) == NULL) || r; + r = ((glDrawBuffers = (PFNGLDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffers")) == NULL) || r; + r = ((glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArray")) == NULL) || r; + r = ((glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttrib")) == NULL) || r; + r = ((glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniform")) == NULL) || r; + r = ((glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedShaders")) == NULL) || r; + r = ((glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocation")) == NULL) || r; + r = ((glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInfoLog")) == NULL) || r; + r = ((glGetProgramiv = (PFNGLGETPROGRAMIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramiv")) == NULL) || r; + r = ((glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetShaderInfoLog")) == NULL) || r; + r = ((glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSource")) == NULL) || r; + r = ((glGetShaderiv = (PFNGLGETSHADERIVPROC)glewGetProcAddress((const GLubyte*)"glGetShaderiv")) == NULL) || r; + r = ((glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocation")) == NULL) || r; + r = ((glGetUniformfv = (PFNGLGETUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfv")) == NULL) || r; + r = ((glGetUniformiv = (PFNGLGETUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformiv")) == NULL) || r; + r = ((glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointerv")) == NULL) || r; + r = ((glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdv")) == NULL) || r; + r = ((glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfv")) == NULL) || r; + r = ((glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribiv")) == NULL) || r; + r = ((glIsProgram = (PFNGLISPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glIsProgram")) == NULL) || r; + r = ((glIsShader = (PFNGLISSHADERPROC)glewGetProcAddress((const GLubyte*)"glIsShader")) == NULL) || r; + r = ((glLinkProgram = (PFNGLLINKPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glLinkProgram")) == NULL) || r; + r = ((glShaderSource = (PFNGLSHADERSOURCEPROC)glewGetProcAddress((const GLubyte*)"glShaderSource")) == NULL) || r; + r = ((glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparate")) == NULL) || r; + r = ((glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilMaskSeparate")) == NULL) || r; + r = ((glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparate")) == NULL) || r; + r = ((glUniform1f = (PFNGLUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glUniform1f")) == NULL) || r; + r = ((glUniform1fv = (PFNGLUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glUniform1fv")) == NULL) || r; + r = ((glUniform1i = (PFNGLUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glUniform1i")) == NULL) || r; + r = ((glUniform1iv = (PFNGLUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glUniform1iv")) == NULL) || r; + r = ((glUniform2f = (PFNGLUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glUniform2f")) == NULL) || r; + r = ((glUniform2fv = (PFNGLUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glUniform2fv")) == NULL) || r; + r = ((glUniform2i = (PFNGLUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glUniform2i")) == NULL) || r; + r = ((glUniform2iv = (PFNGLUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glUniform2iv")) == NULL) || r; + r = ((glUniform3f = (PFNGLUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glUniform3f")) == NULL) || r; + r = ((glUniform3fv = (PFNGLUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glUniform3fv")) == NULL) || r; + r = ((glUniform3i = (PFNGLUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glUniform3i")) == NULL) || r; + r = ((glUniform3iv = (PFNGLUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glUniform3iv")) == NULL) || r; + r = ((glUniform4f = (PFNGLUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glUniform4f")) == NULL) || r; + r = ((glUniform4fv = (PFNGLUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glUniform4fv")) == NULL) || r; + r = ((glUniform4i = (PFNGLUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glUniform4i")) == NULL) || r; + r = ((glUniform4iv = (PFNGLUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glUniform4iv")) == NULL) || r; + r = ((glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fv")) == NULL) || r; + r = ((glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fv")) == NULL) || r; + r = ((glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fv")) == NULL) || r; + r = ((glUseProgram = (PFNGLUSEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glUseProgram")) == NULL) || r; + r = ((glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glValidateProgram")) == NULL) || r; + r = ((glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1d")) == NULL) || r; + r = ((glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dv")) == NULL) || r; + r = ((glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1f")) == NULL) || r; + r = ((glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fv")) == NULL) || r; + r = ((glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1s")) == NULL) || r; + r = ((glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sv")) == NULL) || r; + r = ((glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2d")) == NULL) || r; + r = ((glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dv")) == NULL) || r; + r = ((glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2f")) == NULL) || r; + r = ((glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fv")) == NULL) || r; + r = ((glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2s")) == NULL) || r; + r = ((glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sv")) == NULL) || r; + r = ((glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3d")) == NULL) || r; + r = ((glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dv")) == NULL) || r; + r = ((glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3f")) == NULL) || r; + r = ((glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fv")) == NULL) || r; + r = ((glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3s")) == NULL) || r; + r = ((glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sv")) == NULL) || r; + r = ((glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nbv")) == NULL) || r; + r = ((glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Niv")) == NULL) || r; + r = ((glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nsv")) == NULL) || r; + r = ((glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nub")) == NULL) || r; + r = ((glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nubv")) == NULL) || r; + r = ((glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nuiv")) == NULL) || r; + r = ((glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4Nusv")) == NULL) || r; + r = ((glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bv")) == NULL) || r; + r = ((glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4d")) == NULL) || r; + r = ((glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dv")) == NULL) || r; + r = ((glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4f")) == NULL) || r; + r = ((glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fv")) == NULL) || r; + r = ((glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4iv")) == NULL) || r; + r = ((glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4s")) == NULL) || r; + r = ((glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sv")) == NULL) || r; + r = ((glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubv")) == NULL) || r; + r = ((glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uiv")) == NULL) || r; + r = ((glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usv")) == NULL) || r; + r = ((glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointer")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_2_0 */ + +#ifdef GL_VERSION_2_1 + +static GLboolean _glewInit_GL_VERSION_2_1 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3fv")) == NULL) || r; + r = ((glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4fv")) == NULL) || r; + r = ((glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2fv")) == NULL) || r; + r = ((glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4fv")) == NULL) || r; + r = ((glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2fv")) == NULL) || r; + r = ((glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3fv")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_2_1 */ + +#ifdef GL_VERSION_3_0 + +static GLboolean _glewInit_GL_VERSION_3_0 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRender")) == NULL) || r; + r = ((glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedback")) == NULL) || r; + r = ((glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocation")) == NULL) || r; + r = ((glClampColor = (PFNGLCLAMPCOLORPROC)glewGetProcAddress((const GLubyte*)"glClampColor")) == NULL) || r; + r = ((glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfi")) == NULL) || r; + r = ((glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfv")) == NULL) || r; + r = ((glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferiv")) == NULL) || r; + r = ((glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearBufferuiv")) == NULL) || r; + r = ((glColorMaski = (PFNGLCOLORMASKIPROC)glewGetProcAddress((const GLubyte*)"glColorMaski")) == NULL) || r; + r = ((glDisablei = (PFNGLDISABLEIPROC)glewGetProcAddress((const GLubyte*)"glDisablei")) == NULL) || r; + r = ((glEnablei = (PFNGLENABLEIPROC)glewGetProcAddress((const GLubyte*)"glEnablei")) == NULL) || r; + r = ((glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRender")) == NULL) || r; + r = ((glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedback")) == NULL) || r; + r = ((glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)glewGetProcAddress((const GLubyte*)"glGetBooleani_v")) == NULL) || r; + r = ((glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocation")) == NULL) || r; + r = ((glGetStringi = (PFNGLGETSTRINGIPROC)glewGetProcAddress((const GLubyte*)"glGetStringi")) == NULL) || r; + r = ((glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIiv")) == NULL) || r; + r = ((glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuiv")) == NULL) || r; + r = ((glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVarying")) == NULL) || r; + r = ((glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuiv")) == NULL) || r; + r = ((glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIiv")) == NULL) || r; + r = ((glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuiv")) == NULL) || r; + r = ((glIsEnabledi = (PFNGLISENABLEDIPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledi")) == NULL) || r; + r = ((glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIiv")) == NULL) || r; + r = ((glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuiv")) == NULL) || r; + r = ((glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryings")) == NULL) || r; + r = ((glUniform1ui = (PFNGLUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui")) == NULL) || r; + r = ((glUniform1uiv = (PFNGLUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiv")) == NULL) || r; + r = ((glUniform2ui = (PFNGLUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui")) == NULL) || r; + r = ((glUniform2uiv = (PFNGLUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiv")) == NULL) || r; + r = ((glUniform3ui = (PFNGLUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui")) == NULL) || r; + r = ((glUniform3uiv = (PFNGLUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiv")) == NULL) || r; + r = ((glUniform4ui = (PFNGLUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui")) == NULL) || r; + r = ((glUniform4uiv = (PFNGLUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiv")) == NULL) || r; + r = ((glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1i")) == NULL) || r; + r = ((glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iv")) == NULL) || r; + r = ((glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ui")) == NULL) || r; + r = ((glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiv")) == NULL) || r; + r = ((glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2i")) == NULL) || r; + r = ((glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iv")) == NULL) || r; + r = ((glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ui")) == NULL) || r; + r = ((glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiv")) == NULL) || r; + r = ((glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3i")) == NULL) || r; + r = ((glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iv")) == NULL) || r; + r = ((glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ui")) == NULL) || r; + r = ((glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiv")) == NULL) || r; + r = ((glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bv")) == NULL) || r; + r = ((glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4i")) == NULL) || r; + r = ((glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iv")) == NULL) || r; + r = ((glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4sv")) == NULL) || r; + r = ((glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubv")) == NULL) || r; + r = ((glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ui")) == NULL) || r; + r = ((glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiv")) == NULL) || r; + r = ((glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usv")) == NULL) || r; + r = ((glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointer")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_3_0 */ + +#ifdef GL_VERSION_3_1 + +static GLboolean _glewInit_GL_VERSION_3_1 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstanced")) == NULL) || r; + r = ((glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstanced")) == NULL) || r; + r = ((glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndex")) == NULL) || r; + r = ((glTexBuffer = (PFNGLTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTexBuffer")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_3_1 */ + +#ifdef GL_VERSION_3_2 + +static GLboolean _glewInit_GL_VERSION_3_2 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture")) == NULL) || r; + r = ((glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteri64v")) == NULL) || r; + r = ((glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64i_v")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_3_2 */ + +#ifdef GL_VERSION_3_3 + +static GLboolean _glewInit_GL_VERSION_3_3 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisor")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_3_3 */ + +#ifdef GL_VERSION_4_0 + +static GLboolean _glewInit_GL_VERSION_4_0 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparatei")) == NULL) || r; + r = ((glBlendEquationi = (PFNGLBLENDEQUATIONIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationi")) == NULL) || r; + r = ((glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparatei")) == NULL) || r; + r = ((glBlendFunci = (PFNGLBLENDFUNCIPROC)glewGetProcAddress((const GLubyte*)"glBlendFunci")) == NULL) || r; + r = ((glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShading")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_4_0 */ + +#ifdef GL_VERSION_4_5 + +static GLboolean _glewInit_GL_VERSION_4_5 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetGraphicsResetStatus = (PFNGLGETGRAPHICSRESETSTATUSPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatus")) == NULL) || r; + r = ((glGetnCompressedTexImage = (PFNGLGETNCOMPRESSEDTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImage")) == NULL) || r; + r = ((glGetnTexImage = (PFNGLGETNTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImage")) == NULL) || r; + r = ((glGetnUniformdv = (PFNGLGETNUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdv")) == NULL) || r; + + return r; +} + +#endif /* GL_VERSION_4_5 */ + +#ifdef GL_3DFX_tbuffer + +static GLboolean _glewInit_GL_3DFX_tbuffer (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTbufferMask3DFX = (PFNGLTBUFFERMASK3DFXPROC)glewGetProcAddress((const GLubyte*)"glTbufferMask3DFX")) == NULL) || r; + + return r; +} + +#endif /* GL_3DFX_tbuffer */ + +#ifdef GL_AMD_debug_output + +static GLboolean _glewInit_GL_AMD_debug_output (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDebugMessageCallbackAMD = (PFNGLDEBUGMESSAGECALLBACKAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackAMD")) == NULL) || r; + r = ((glDebugMessageEnableAMD = (PFNGLDEBUGMESSAGEENABLEAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageEnableAMD")) == NULL) || r; + r = ((glDebugMessageInsertAMD = (PFNGLDEBUGMESSAGEINSERTAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertAMD")) == NULL) || r; + r = ((glGetDebugMessageLogAMD = (PFNGLGETDEBUGMESSAGELOGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_debug_output */ + +#ifdef GL_AMD_draw_buffers_blend + +static GLboolean _glewInit_GL_AMD_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquationIndexedAMD = (PFNGLBLENDEQUATIONINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationIndexedAMD")) == NULL) || r; + r = ((glBlendEquationSeparateIndexedAMD = (PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateIndexedAMD")) == NULL) || r; + r = ((glBlendFuncIndexedAMD = (PFNGLBLENDFUNCINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncIndexedAMD")) == NULL) || r; + r = ((glBlendFuncSeparateIndexedAMD = (PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateIndexedAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_draw_buffers_blend */ + +#ifdef GL_AMD_interleaved_elements + +static GLboolean _glewInit_GL_AMD_interleaved_elements (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glVertexAttribParameteriAMD = (PFNGLVERTEXATTRIBPARAMETERIAMDPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribParameteriAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_interleaved_elements */ + +#ifdef GL_AMD_multi_draw_indirect + +static GLboolean _glewInit_GL_AMD_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectAMD = (PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectAMD")) == NULL) || r; + r = ((glMultiDrawElementsIndirectAMD = (PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_multi_draw_indirect */ + +#ifdef GL_AMD_name_gen_delete + +static GLboolean _glewInit_GL_AMD_name_gen_delete (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDeleteNamesAMD = (PFNGLDELETENAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamesAMD")) == NULL) || r; + r = ((glGenNamesAMD = (PFNGLGENNAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glGenNamesAMD")) == NULL) || r; + r = ((glIsNameAMD = (PFNGLISNAMEAMDPROC)glewGetProcAddress((const GLubyte*)"glIsNameAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_name_gen_delete */ + +#ifdef GL_AMD_occlusion_query_event + +static GLboolean _glewInit_GL_AMD_occlusion_query_event (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glQueryObjectParameteruiAMD = (PFNGLQUERYOBJECTPARAMETERUIAMDPROC)glewGetProcAddress((const GLubyte*)"glQueryObjectParameteruiAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_occlusion_query_event */ + +#ifdef GL_AMD_performance_monitor + +static GLboolean _glewInit_GL_AMD_performance_monitor (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginPerfMonitorAMD = (PFNGLBEGINPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfMonitorAMD")) == NULL) || r; + r = ((glDeletePerfMonitorsAMD = (PFNGLDELETEPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfMonitorsAMD")) == NULL) || r; + r = ((glEndPerfMonitorAMD = (PFNGLENDPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glEndPerfMonitorAMD")) == NULL) || r; + r = ((glGenPerfMonitorsAMD = (PFNGLGENPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glGenPerfMonitorsAMD")) == NULL) || r; + r = ((glGetPerfMonitorCounterDataAMD = (PFNGLGETPERFMONITORCOUNTERDATAAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterDataAMD")) == NULL) || r; + r = ((glGetPerfMonitorCounterInfoAMD = (PFNGLGETPERFMONITORCOUNTERINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterInfoAMD")) == NULL) || r; + r = ((glGetPerfMonitorCounterStringAMD = (PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterStringAMD")) == NULL) || r; + r = ((glGetPerfMonitorCountersAMD = (PFNGLGETPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCountersAMD")) == NULL) || r; + r = ((glGetPerfMonitorGroupStringAMD = (PFNGLGETPERFMONITORGROUPSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupStringAMD")) == NULL) || r; + r = ((glGetPerfMonitorGroupsAMD = (PFNGLGETPERFMONITORGROUPSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupsAMD")) == NULL) || r; + r = ((glSelectPerfMonitorCountersAMD = (PFNGLSELECTPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glSelectPerfMonitorCountersAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_performance_monitor */ + +#ifdef GL_AMD_sample_positions + +static GLboolean _glewInit_GL_AMD_sample_positions (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glSetMultisamplefvAMD = (PFNGLSETMULTISAMPLEFVAMDPROC)glewGetProcAddress((const GLubyte*)"glSetMultisamplefvAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_sample_positions */ + +#ifdef GL_AMD_sparse_texture + +static GLboolean _glewInit_GL_AMD_sparse_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexStorageSparseAMD = (PFNGLTEXSTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTexStorageSparseAMD")) == NULL) || r; + r = ((glTextureStorageSparseAMD = (PFNGLTEXTURESTORAGESPARSEAMDPROC)glewGetProcAddress((const GLubyte*)"glTextureStorageSparseAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_sparse_texture */ + +#ifdef GL_AMD_stencil_operation_extended + +static GLboolean _glewInit_GL_AMD_stencil_operation_extended (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glStencilOpValueAMD = (PFNGLSTENCILOPVALUEAMDPROC)glewGetProcAddress((const GLubyte*)"glStencilOpValueAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_stencil_operation_extended */ + +#ifdef GL_AMD_vertex_shader_tessellator + +static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTessellationFactorAMD = (PFNGLTESSELLATIONFACTORAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationFactorAMD")) == NULL) || r; + r = ((glTessellationModeAMD = (PFNGLTESSELLATIONMODEAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationModeAMD")) == NULL) || r; + + return r; +} + +#endif /* GL_AMD_vertex_shader_tessellator */ + +#ifdef GL_ANGLE_framebuffer_blit + +static GLboolean _glewInit_GL_ANGLE_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlitFramebufferANGLE = (PFNGLBLITFRAMEBUFFERANGLEPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_framebuffer_blit */ + +#ifdef GL_ANGLE_framebuffer_multisample + +static GLboolean _glewInit_GL_ANGLE_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glRenderbufferStorageMultisampleANGLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_framebuffer_multisample */ + +#ifdef GL_ANGLE_instanced_arrays + +static GLboolean _glewInit_GL_ANGLE_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstancedANGLE = (PFNGLDRAWARRAYSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedANGLE")) == NULL) || r; + r = ((glDrawElementsInstancedANGLE = (PFNGLDRAWELEMENTSINSTANCEDANGLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedANGLE")) == NULL) || r; + r = ((glVertexAttribDivisorANGLE = (PFNGLVERTEXATTRIBDIVISORANGLEPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_instanced_arrays */ + +#ifdef GL_ANGLE_timer_query + +static GLboolean _glewInit_GL_ANGLE_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginQueryANGLE = (PFNGLBEGINQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryANGLE")) == NULL) || r; + r = ((glDeleteQueriesANGLE = (PFNGLDELETEQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesANGLE")) == NULL) || r; + r = ((glEndQueryANGLE = (PFNGLENDQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glEndQueryANGLE")) == NULL) || r; + r = ((glGenQueriesANGLE = (PFNGLGENQUERIESANGLEPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesANGLE")) == NULL) || r; + r = ((glGetQueryObjecti64vANGLE = (PFNGLGETQUERYOBJECTI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vANGLE")) == NULL) || r; + r = ((glGetQueryObjectivANGLE = (PFNGLGETQUERYOBJECTIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivANGLE")) == NULL) || r; + r = ((glGetQueryObjectui64vANGLE = (PFNGLGETQUERYOBJECTUI64VANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vANGLE")) == NULL) || r; + r = ((glGetQueryObjectuivANGLE = (PFNGLGETQUERYOBJECTUIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivANGLE")) == NULL) || r; + r = ((glGetQueryivANGLE = (PFNGLGETQUERYIVANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivANGLE")) == NULL) || r; + r = ((glIsQueryANGLE = (PFNGLISQUERYANGLEPROC)glewGetProcAddress((const GLubyte*)"glIsQueryANGLE")) == NULL) || r; + r = ((glQueryCounterANGLE = (PFNGLQUERYCOUNTERANGLEPROC)glewGetProcAddress((const GLubyte*)"glQueryCounterANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_timer_query */ + +#ifdef GL_ANGLE_translated_shader_source + +static GLboolean _glewInit_GL_ANGLE_translated_shader_source (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetTranslatedShaderSourceANGLE = (PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)glewGetProcAddress((const GLubyte*)"glGetTranslatedShaderSourceANGLE")) == NULL) || r; + + return r; +} + +#endif /* GL_ANGLE_translated_shader_source */ + +#ifdef GL_APPLE_element_array + +static GLboolean _glewInit_GL_APPLE_element_array (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawElementArrayAPPLE = (PFNGLDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayAPPLE")) == NULL) || r; + r = ((glDrawRangeElementArrayAPPLE = (PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayAPPLE")) == NULL) || r; + r = ((glElementPointerAPPLE = (PFNGLELEMENTPOINTERAPPLEPROC)glewGetProcAddress((const GLubyte*)"glElementPointerAPPLE")) == NULL) || r; + r = ((glMultiDrawElementArrayAPPLE = (PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementArrayAPPLE")) == NULL) || r; + r = ((glMultiDrawRangeElementArrayAPPLE = (PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawRangeElementArrayAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_element_array */ + +#ifdef GL_APPLE_fence + +static GLboolean _glewInit_GL_APPLE_fence (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDeleteFencesAPPLE = (PFNGLDELETEFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesAPPLE")) == NULL) || r; + r = ((glFinishFenceAPPLE = (PFNGLFINISHFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceAPPLE")) == NULL) || r; + r = ((glFinishObjectAPPLE = (PFNGLFINISHOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFinishObjectAPPLE")) == NULL) || r; + r = ((glGenFencesAPPLE = (PFNGLGENFENCESAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenFencesAPPLE")) == NULL) || r; + r = ((glIsFenceAPPLE = (PFNGLISFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsFenceAPPLE")) == NULL) || r; + r = ((glSetFenceAPPLE = (PFNGLSETFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glSetFenceAPPLE")) == NULL) || r; + r = ((glTestFenceAPPLE = (PFNGLTESTFENCEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestFenceAPPLE")) == NULL) || r; + r = ((glTestObjectAPPLE = (PFNGLTESTOBJECTAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTestObjectAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_fence */ + +#ifdef GL_APPLE_flush_buffer_range + +static GLboolean _glewInit_GL_APPLE_flush_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBufferParameteriAPPLE = (PFNGLBUFFERPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBufferParameteriAPPLE")) == NULL) || r; + r = ((glFlushMappedBufferRangeAPPLE = (PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRangeAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_flush_buffer_range */ + +#ifdef GL_APPLE_object_purgeable + +static GLboolean _glewInit_GL_APPLE_object_purgeable (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetObjectParameterivAPPLE = (PFNGLGETOBJECTPARAMETERIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivAPPLE")) == NULL) || r; + r = ((glObjectPurgeableAPPLE = (PFNGLOBJECTPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectPurgeableAPPLE")) == NULL) || r; + r = ((glObjectUnpurgeableAPPLE = (PFNGLOBJECTUNPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectUnpurgeableAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_object_purgeable */ + +#ifdef GL_APPLE_texture_range + +static GLboolean _glewInit_GL_APPLE_texture_range (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetTexParameterPointervAPPLE = (PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterPointervAPPLE")) == NULL) || r; + r = ((glTextureRangeAPPLE = (PFNGLTEXTURERANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureRangeAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_texture_range */ + +#ifdef GL_APPLE_vertex_array_object + +static GLboolean _glewInit_GL_APPLE_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindVertexArrayAPPLE = (PFNGLBINDVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArrayAPPLE")) == NULL) || r; + r = ((glDeleteVertexArraysAPPLE = (PFNGLDELETEVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArraysAPPLE")) == NULL) || r; + r = ((glGenVertexArraysAPPLE = (PFNGLGENVERTEXARRAYSAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArraysAPPLE")) == NULL) || r; + r = ((glIsVertexArrayAPPLE = (PFNGLISVERTEXARRAYAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArrayAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_vertex_array_object */ + +#ifdef GL_APPLE_vertex_array_range + +static GLboolean _glewInit_GL_APPLE_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFlushVertexArrayRangeAPPLE = (PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeAPPLE")) == NULL) || r; + r = ((glVertexArrayParameteriAPPLE = (PFNGLVERTEXARRAYPARAMETERIAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayParameteriAPPLE")) == NULL) || r; + r = ((glVertexArrayRangeAPPLE = (PFNGLVERTEXARRAYRANGEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_vertex_array_range */ + +#ifdef GL_APPLE_vertex_program_evaluators + +static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDisableVertexAttribAPPLE = (PFNGLDISABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribAPPLE")) == NULL) || r; + r = ((glEnableVertexAttribAPPLE = (PFNGLENABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribAPPLE")) == NULL) || r; + r = ((glIsVertexAttribEnabledAPPLE = (PFNGLISVERTEXATTRIBENABLEDAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexAttribEnabledAPPLE")) == NULL) || r; + r = ((glMapVertexAttrib1dAPPLE = (PFNGLMAPVERTEXATTRIB1DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1dAPPLE")) == NULL) || r; + r = ((glMapVertexAttrib1fAPPLE = (PFNGLMAPVERTEXATTRIB1FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1fAPPLE")) == NULL) || r; + r = ((glMapVertexAttrib2dAPPLE = (PFNGLMAPVERTEXATTRIB2DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2dAPPLE")) == NULL) || r; + r = ((glMapVertexAttrib2fAPPLE = (PFNGLMAPVERTEXATTRIB2FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2fAPPLE")) == NULL) || r; + + return r; +} + +#endif /* GL_APPLE_vertex_program_evaluators */ + +#ifdef GL_ARB_ES2_compatibility + +static GLboolean _glewInit_GL_ARB_ES2_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClearDepthf = (PFNGLCLEARDEPTHFPROC)glewGetProcAddress((const GLubyte*)"glClearDepthf")) == NULL) || r; + r = ((glDepthRangef = (PFNGLDEPTHRANGEFPROC)glewGetProcAddress((const GLubyte*)"glDepthRangef")) == NULL) || r; + r = ((glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC)glewGetProcAddress((const GLubyte*)"glGetShaderPrecisionFormat")) == NULL) || r; + r = ((glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC)glewGetProcAddress((const GLubyte*)"glReleaseShaderCompiler")) == NULL) || r; + r = ((glShaderBinary = (PFNGLSHADERBINARYPROC)glewGetProcAddress((const GLubyte*)"glShaderBinary")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_ES2_compatibility */ + +#ifdef GL_ARB_ES3_1_compatibility + +static GLboolean _glewInit_GL_ARB_ES3_1_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMemoryBarrierByRegion = (PFNGLMEMORYBARRIERBYREGIONPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierByRegion")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_ES3_1_compatibility */ + +#ifdef GL_ARB_ES3_2_compatibility + +static GLboolean _glewInit_GL_ARB_ES3_2_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPrimitiveBoundingBoxARB = (PFNGLPRIMITIVEBOUNDINGBOXARBPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveBoundingBoxARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_ES3_2_compatibility */ + +#ifdef GL_ARB_base_instance + +static GLboolean _glewInit_GL_ARB_base_instance (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedBaseInstance")) == NULL) || r; + r = ((glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseInstance")) == NULL) || r; + r = ((glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertexBaseInstance")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_base_instance */ + +#ifdef GL_ARB_bindless_texture + +static GLboolean _glewInit_GL_ARB_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetImageHandleARB = (PFNGLGETIMAGEHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleARB")) == NULL) || r; + r = ((glGetTextureHandleARB = (PFNGLGETTEXTUREHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleARB")) == NULL) || r; + r = ((glGetTextureSamplerHandleARB = (PFNGLGETTEXTURESAMPLERHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleARB")) == NULL) || r; + r = ((glGetVertexAttribLui64vARB = (PFNGLGETVERTEXATTRIBLUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vARB")) == NULL) || r; + r = ((glIsImageHandleResidentARB = (PFNGLISIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentARB")) == NULL) || r; + r = ((glIsTextureHandleResidentARB = (PFNGLISTEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentARB")) == NULL) || r; + r = ((glMakeImageHandleNonResidentARB = (PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentARB")) == NULL) || r; + r = ((glMakeImageHandleResidentARB = (PFNGLMAKEIMAGEHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentARB")) == NULL) || r; + r = ((glMakeTextureHandleNonResidentARB = (PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentARB")) == NULL) || r; + r = ((glMakeTextureHandleResidentARB = (PFNGLMAKETEXTUREHANDLERESIDENTARBPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentARB")) == NULL) || r; + r = ((glProgramUniformHandleui64ARB = (PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64ARB")) == NULL) || r; + r = ((glProgramUniformHandleui64vARB = (PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vARB")) == NULL) || r; + r = ((glUniformHandleui64ARB = (PFNGLUNIFORMHANDLEUI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64ARB")) == NULL) || r; + r = ((glUniformHandleui64vARB = (PFNGLUNIFORMHANDLEUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vARB")) == NULL) || r; + r = ((glVertexAttribL1ui64ARB = (PFNGLVERTEXATTRIBL1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64ARB")) == NULL) || r; + r = ((glVertexAttribL1ui64vARB = (PFNGLVERTEXATTRIBL1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_bindless_texture */ + +#ifdef GL_ARB_blend_func_extended + +static GLboolean _glewInit_GL_ARB_blend_func_extended (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexed")) == NULL) || r; + r = ((glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndex")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_blend_func_extended */ + +#ifdef GL_ARB_buffer_storage + +static GLboolean _glewInit_GL_ARB_buffer_storage (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBufferStorage = (PFNGLBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glBufferStorage")) == NULL) || r; + r = ((glNamedBufferStorageEXT = (PFNGLNAMEDBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorageEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_buffer_storage */ + +#ifdef GL_ARB_cl_event + +static GLboolean _glewInit_GL_ARB_cl_event (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCreateSyncFromCLeventARB = (PFNGLCREATESYNCFROMCLEVENTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateSyncFromCLeventARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_cl_event */ + +#ifdef GL_ARB_clear_buffer_object + +static GLboolean _glewInit_GL_ARB_clear_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClearBufferData = (PFNGLCLEARBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferData")) == NULL) || r; + r = ((glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearBufferSubData")) == NULL) || r; + r = ((glClearNamedBufferDataEXT = (PFNGLCLEARNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferDataEXT")) == NULL) || r; + r = ((glClearNamedBufferSubDataEXT = (PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubDataEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_clear_buffer_object */ + +#ifdef GL_ARB_clear_texture + +static GLboolean _glewInit_GL_ARB_clear_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClearTexImage = (PFNGLCLEARTEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexImage")) == NULL) || r; + r = ((glClearTexSubImage = (PFNGLCLEARTEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glClearTexSubImage")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_clear_texture */ + +#ifdef GL_ARB_clip_control + +static GLboolean _glewInit_GL_ARB_clip_control (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClipControl = (PFNGLCLIPCONTROLPROC)glewGetProcAddress((const GLubyte*)"glClipControl")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_clip_control */ + +#ifdef GL_ARB_color_buffer_float + +static GLboolean _glewInit_GL_ARB_color_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClampColorARB = (PFNGLCLAMPCOLORARBPROC)glewGetProcAddress((const GLubyte*)"glClampColorARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_color_buffer_float */ + +#ifdef GL_ARB_compute_shader + +static GLboolean _glewInit_GL_ARB_compute_shader (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)glewGetProcAddress((const GLubyte*)"glDispatchCompute")) == NULL) || r; + r = ((glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeIndirect")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_compute_shader */ + +#ifdef GL_ARB_compute_variable_group_size + +static GLboolean _glewInit_GL_ARB_compute_variable_group_size (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDispatchComputeGroupSizeARB = (PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC)glewGetProcAddress((const GLubyte*)"glDispatchComputeGroupSizeARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_compute_variable_group_size */ + +#ifdef GL_ARB_copy_buffer + +static GLboolean _glewInit_GL_ARB_copy_buffer (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubData")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_copy_buffer */ + +#ifdef GL_ARB_copy_image + +static GLboolean _glewInit_GL_ARB_copy_image (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubData")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_copy_image */ + +#ifdef GL_ARB_debug_output + +static GLboolean _glewInit_GL_ARB_debug_output (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackARB")) == NULL) || r; + r = ((glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControlARB")) == NULL) || r; + r = ((glDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertARB")) == NULL) || r; + r = ((glGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_debug_output */ + +#ifdef GL_ARB_direct_state_access + +static GLboolean _glewInit_GL_ARB_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindTextureUnit = (PFNGLBINDTEXTUREUNITPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnit")) == NULL) || r; + r = ((glBlitNamedFramebuffer = (PFNGLBLITNAMEDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitNamedFramebuffer")) == NULL) || r; + r = ((glCheckNamedFramebufferStatus = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatus")) == NULL) || r; + r = ((glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferData")) == NULL) || r; + r = ((glClearNamedBufferSubData = (PFNGLCLEARNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glClearNamedBufferSubData")) == NULL) || r; + r = ((glClearNamedFramebufferfi = (PFNGLCLEARNAMEDFRAMEBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfi")) == NULL) || r; + r = ((glClearNamedFramebufferfv = (PFNGLCLEARNAMEDFRAMEBUFFERFVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferfv")) == NULL) || r; + r = ((glClearNamedFramebufferiv = (PFNGLCLEARNAMEDFRAMEBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferiv")) == NULL) || r; + r = ((glClearNamedFramebufferuiv = (PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC)glewGetProcAddress((const GLubyte*)"glClearNamedFramebufferuiv")) == NULL) || r; + r = ((glCompressedTextureSubImage1D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1D")) == NULL) || r; + r = ((glCompressedTextureSubImage2D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2D")) == NULL) || r; + r = ((glCompressedTextureSubImage3D = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3D")) == NULL) || r; + r = ((glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyNamedBufferSubData")) == NULL) || r; + r = ((glCopyTextureSubImage1D = (PFNGLCOPYTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1D")) == NULL) || r; + r = ((glCopyTextureSubImage2D = (PFNGLCOPYTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2D")) == NULL) || r; + r = ((glCopyTextureSubImage3D = (PFNGLCOPYTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3D")) == NULL) || r; + r = ((glCreateBuffers = (PFNGLCREATEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateBuffers")) == NULL) || r; + r = ((glCreateFramebuffers = (PFNGLCREATEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateFramebuffers")) == NULL) || r; + r = ((glCreateProgramPipelines = (PFNGLCREATEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramPipelines")) == NULL) || r; + r = ((glCreateQueries = (PFNGLCREATEQUERIESPROC)glewGetProcAddress((const GLubyte*)"glCreateQueries")) == NULL) || r; + r = ((glCreateRenderbuffers = (PFNGLCREATERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glCreateRenderbuffers")) == NULL) || r; + r = ((glCreateSamplers = (PFNGLCREATESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glCreateSamplers")) == NULL) || r; + r = ((glCreateTextures = (PFNGLCREATETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glCreateTextures")) == NULL) || r; + r = ((glCreateTransformFeedbacks = (PFNGLCREATETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glCreateTransformFeedbacks")) == NULL) || r; + r = ((glCreateVertexArrays = (PFNGLCREATEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glCreateVertexArrays")) == NULL) || r; + r = ((glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttrib")) == NULL) || r; + r = ((glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttrib")) == NULL) || r; + r = ((glFlushMappedNamedBufferRange = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRange")) == NULL) || r; + r = ((glGenerateTextureMipmap = (PFNGLGENERATETEXTUREMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmap")) == NULL) || r; + r = ((glGetCompressedTextureImage = (PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImage")) == NULL) || r; + r = ((glGetNamedBufferParameteri64v = (PFNGLGETNAMEDBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteri64v")) == NULL) || r; + r = ((glGetNamedBufferParameteriv = (PFNGLGETNAMEDBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameteriv")) == NULL) || r; + r = ((glGetNamedBufferPointerv = (PFNGLGETNAMEDBUFFERPOINTERVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointerv")) == NULL) || r; + r = ((glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubData")) == NULL) || r; + r = ((glGetNamedFramebufferAttachmentParameteriv = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameteriv")) == NULL) || r; + r = ((glGetNamedFramebufferParameteriv = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameteriv")) == NULL) || r; + r = ((glGetNamedRenderbufferParameteriv = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameteriv")) == NULL) || r; + r = ((glGetQueryBufferObjecti64v = (PFNGLGETQUERYBUFFEROBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjecti64v")) == NULL) || r; + r = ((glGetQueryBufferObjectiv = (PFNGLGETQUERYBUFFEROBJECTIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectiv")) == NULL) || r; + r = ((glGetQueryBufferObjectui64v = (PFNGLGETQUERYBUFFEROBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectui64v")) == NULL) || r; + r = ((glGetQueryBufferObjectuiv = (PFNGLGETQUERYBUFFEROBJECTUIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryBufferObjectuiv")) == NULL) || r; + r = ((glGetTextureImage = (PFNGLGETTEXTUREIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImage")) == NULL) || r; + r = ((glGetTextureLevelParameterfv = (PFNGLGETTEXTURELEVELPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfv")) == NULL) || r; + r = ((glGetTextureLevelParameteriv = (PFNGLGETTEXTURELEVELPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameteriv")) == NULL) || r; + r = ((glGetTextureParameterIiv = (PFNGLGETTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIiv")) == NULL) || r; + r = ((glGetTextureParameterIuiv = (PFNGLGETTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuiv")) == NULL) || r; + r = ((glGetTextureParameterfv = (PFNGLGETTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfv")) == NULL) || r; + r = ((glGetTextureParameteriv = (PFNGLGETTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameteriv")) == NULL) || r; + r = ((glGetTransformFeedbacki64_v = (PFNGLGETTRANSFORMFEEDBACKI64_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki64_v")) == NULL) || r; + r = ((glGetTransformFeedbacki_v = (PFNGLGETTRANSFORMFEEDBACKI_VPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbacki_v")) == NULL) || r; + r = ((glGetTransformFeedbackiv = (PFNGLGETTRANSFORMFEEDBACKIVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackiv")) == NULL) || r; + r = ((glGetVertexArrayIndexed64iv = (PFNGLGETVERTEXARRAYINDEXED64IVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexed64iv")) == NULL) || r; + r = ((glGetVertexArrayIndexediv = (PFNGLGETVERTEXARRAYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIndexediv")) == NULL) || r; + r = ((glGetVertexArrayiv = (PFNGLGETVERTEXARRAYIVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayiv")) == NULL) || r; + r = ((glInvalidateNamedFramebufferData = (PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferData")) == NULL) || r; + r = ((glInvalidateNamedFramebufferSubData = (PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateNamedFramebufferSubData")) == NULL) || r; + r = ((glMapNamedBuffer = (PFNGLMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBuffer")) == NULL) || r; + r = ((glMapNamedBufferRange = (PFNGLMAPNAMEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRange")) == NULL) || r; + r = ((glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferData")) == NULL) || r; + r = ((glNamedBufferStorage = (PFNGLNAMEDBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferStorage")) == NULL) || r; + r = ((glNamedBufferSubData = (PFNGLNAMEDBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubData")) == NULL) || r; + r = ((glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffer")) == NULL) || r; + r = ((glNamedFramebufferDrawBuffers = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferDrawBuffers")) == NULL) || r; + r = ((glNamedFramebufferParameteri = (PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteri")) == NULL) || r; + r = ((glNamedFramebufferReadBuffer = (PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferReadBuffer")) == NULL) || r; + r = ((glNamedFramebufferRenderbuffer = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbuffer")) == NULL) || r; + r = ((glNamedFramebufferTexture = (PFNGLNAMEDFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture")) == NULL) || r; + r = ((glNamedFramebufferTextureLayer = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayer")) == NULL) || r; + r = ((glNamedRenderbufferStorage = (PFNGLNAMEDRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorage")) == NULL) || r; + r = ((glNamedRenderbufferStorageMultisample = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisample")) == NULL) || r; + r = ((glTextureBuffer = (PFNGLTEXTUREBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTextureBuffer")) == NULL) || r; + r = ((glTextureBufferRange = (PFNGLTEXTUREBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRange")) == NULL) || r; + r = ((glTextureParameterIiv = (PFNGLTEXTUREPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIiv")) == NULL) || r; + r = ((glTextureParameterIuiv = (PFNGLTEXTUREPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuiv")) == NULL) || r; + r = ((glTextureParameterf = (PFNGLTEXTUREPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterf")) == NULL) || r; + r = ((glTextureParameterfv = (PFNGLTEXTUREPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfv")) == NULL) || r; + r = ((glTextureParameteri = (PFNGLTEXTUREPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteri")) == NULL) || r; + r = ((glTextureParameteriv = (PFNGLTEXTUREPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriv")) == NULL) || r; + r = ((glTextureStorage1D = (PFNGLTEXTURESTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1D")) == NULL) || r; + r = ((glTextureStorage2D = (PFNGLTEXTURESTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2D")) == NULL) || r; + r = ((glTextureStorage2DMultisample = (PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisample")) == NULL) || r; + r = ((glTextureStorage3D = (PFNGLTEXTURESTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3D")) == NULL) || r; + r = ((glTextureStorage3DMultisample = (PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisample")) == NULL) || r; + r = ((glTextureSubImage1D = (PFNGLTEXTURESUBIMAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1D")) == NULL) || r; + r = ((glTextureSubImage2D = (PFNGLTEXTURESUBIMAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2D")) == NULL) || r; + r = ((glTextureSubImage3D = (PFNGLTEXTURESUBIMAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3D")) == NULL) || r; + r = ((glTransformFeedbackBufferBase = (PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferBase")) == NULL) || r; + r = ((glTransformFeedbackBufferRange = (PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackBufferRange")) == NULL) || r; + r = ((glUnmapNamedBuffer = (PFNGLUNMAPNAMEDBUFFERPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBuffer")) == NULL) || r; + r = ((glVertexArrayAttribBinding = (PFNGLVERTEXARRAYATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribBinding")) == NULL) || r; + r = ((glVertexArrayAttribFormat = (PFNGLVERTEXARRAYATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribFormat")) == NULL) || r; + r = ((glVertexArrayAttribIFormat = (PFNGLVERTEXARRAYATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribIFormat")) == NULL) || r; + r = ((glVertexArrayAttribLFormat = (PFNGLVERTEXARRAYATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayAttribLFormat")) == NULL) || r; + r = ((glVertexArrayBindingDivisor = (PFNGLVERTEXARRAYBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindingDivisor")) == NULL) || r; + r = ((glVertexArrayElementBuffer = (PFNGLVERTEXARRAYELEMENTBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayElementBuffer")) == NULL) || r; + r = ((glVertexArrayVertexBuffer = (PFNGLVERTEXARRAYVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffer")) == NULL) || r; + r = ((glVertexArrayVertexBuffers = (PFNGLVERTEXARRAYVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBuffers")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_direct_state_access */ + +#ifdef GL_ARB_draw_buffers + +static GLboolean _glewInit_GL_ARB_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawBuffersARB = (PFNGLDRAWBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_draw_buffers */ + +#ifdef GL_ARB_draw_buffers_blend + +static GLboolean _glewInit_GL_ARB_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiARB")) == NULL) || r; + r = ((glBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiARB")) == NULL) || r; + r = ((glBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiARB")) == NULL) || r; + r = ((glBlendFunciARB = (PFNGLBLENDFUNCIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_draw_buffers_blend */ + +#ifdef GL_ARB_draw_elements_base_vertex + +static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertex")) == NULL) || r; + r = ((glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertex")) == NULL) || r; + r = ((glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertex")) == NULL) || r; + r = ((glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertex")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_draw_elements_base_vertex */ + +#ifdef GL_ARB_draw_indirect + +static GLboolean _glewInit_GL_ARB_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysIndirect")) == NULL) || r; + r = ((glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsIndirect")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_draw_indirect */ + +#ifdef GL_ARB_framebuffer_no_attachments + +static GLboolean _glewInit_GL_ARB_framebuffer_no_attachments (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glFramebufferParameteri")) == NULL) || r; + r = ((glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameteriv")) == NULL) || r; + r = ((glGetNamedFramebufferParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferParameterivEXT")) == NULL) || r; + r = ((glNamedFramebufferParameteriEXT = (PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferParameteriEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_framebuffer_no_attachments */ + +#ifdef GL_ARB_framebuffer_object + +static GLboolean _glewInit_GL_ARB_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindFramebuffer")) == NULL) || r; + r = ((glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbuffer")) == NULL) || r; + r = ((glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebuffer")) == NULL) || r; + r = ((glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatus")) == NULL) || r; + r = ((glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffers")) == NULL) || r; + r = ((glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffers")) == NULL) || r; + r = ((glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbuffer")) == NULL) || r; + r = ((glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1D")) == NULL) || r; + r = ((glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2D")) == NULL) || r; + r = ((glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3D")) == NULL) || r; + r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayer")) == NULL) || r; + r = ((glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffers")) == NULL) || r; + r = ((glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffers")) == NULL) || r; + r = ((glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmap")) == NULL) || r; + r = ((glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameteriv")) == NULL) || r; + r = ((glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameteriv")) == NULL) || r; + r = ((glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsFramebuffer")) == NULL) || r; + r = ((glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbuffer")) == NULL) || r; + r = ((glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorage")) == NULL) || r; + r = ((glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisample")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_framebuffer_object */ + +#ifdef GL_ARB_geometry_shader4 + +static GLboolean _glewInit_GL_ARB_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferTextureARB = (PFNGLFRAMEBUFFERTEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureARB")) == NULL) || r; + r = ((glFramebufferTextureFaceARB = (PFNGLFRAMEBUFFERTEXTUREFACEARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceARB")) == NULL) || r; + r = ((glFramebufferTextureLayerARB = (PFNGLFRAMEBUFFERTEXTURELAYERARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerARB")) == NULL) || r; + r = ((glProgramParameteriARB = (PFNGLPROGRAMPARAMETERIARBPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_geometry_shader4 */ + +#ifdef GL_ARB_get_program_binary + +static GLboolean _glewInit_GL_ARB_get_program_binary (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glGetProgramBinary")) == NULL) || r; + r = ((glProgramBinary = (PFNGLPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glProgramBinary")) == NULL) || r; + r = ((glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteri")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_get_program_binary */ + +#ifdef GL_ARB_get_texture_sub_image + +static GLboolean _glewInit_GL_ARB_get_texture_sub_image (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetCompressedTextureSubImage = (PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureSubImage")) == NULL) || r; + r = ((glGetTextureSubImage = (PFNGLGETTEXTURESUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSubImage")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_get_texture_sub_image */ + +#ifdef GL_ARB_gpu_shader_fp64 + +static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetUniformdv = (PFNGLGETUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformdv")) == NULL) || r; + r = ((glUniform1d = (PFNGLUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glUniform1d")) == NULL) || r; + r = ((glUniform1dv = (PFNGLUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glUniform1dv")) == NULL) || r; + r = ((glUniform2d = (PFNGLUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glUniform2d")) == NULL) || r; + r = ((glUniform2dv = (PFNGLUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glUniform2dv")) == NULL) || r; + r = ((glUniform3d = (PFNGLUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glUniform3d")) == NULL) || r; + r = ((glUniform3dv = (PFNGLUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glUniform3dv")) == NULL) || r; + r = ((glUniform4d = (PFNGLUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glUniform4d")) == NULL) || r; + r = ((glUniform4dv = (PFNGLUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glUniform4dv")) == NULL) || r; + r = ((glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2dv")) == NULL) || r; + r = ((glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3dv")) == NULL) || r; + r = ((glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4dv")) == NULL) || r; + r = ((glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3dv")) == NULL) || r; + r = ((glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2dv")) == NULL) || r; + r = ((glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4dv")) == NULL) || r; + r = ((glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4dv")) == NULL) || r; + r = ((glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2dv")) == NULL) || r; + r = ((glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3dv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_gpu_shader_fp64 */ + +#ifdef GL_ARB_gpu_shader_int64 + +static GLboolean _glewInit_GL_ARB_gpu_shader_int64 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetUniformi64vARB = (PFNGLGETUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vARB")) == NULL) || r; + r = ((glGetUniformui64vARB = (PFNGLGETUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vARB")) == NULL) || r; + r = ((glGetnUniformi64vARB = (PFNGLGETNUNIFORMI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformi64vARB")) == NULL) || r; + r = ((glGetnUniformui64vARB = (PFNGLGETNUNIFORMUI64VARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformui64vARB")) == NULL) || r; + r = ((glProgramUniform1i64ARB = (PFNGLPROGRAMUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64ARB")) == NULL) || r; + r = ((glProgramUniform1i64vARB = (PFNGLPROGRAMUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vARB")) == NULL) || r; + r = ((glProgramUniform1ui64ARB = (PFNGLPROGRAMUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64ARB")) == NULL) || r; + r = ((glProgramUniform1ui64vARB = (PFNGLPROGRAMUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vARB")) == NULL) || r; + r = ((glProgramUniform2i64ARB = (PFNGLPROGRAMUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64ARB")) == NULL) || r; + r = ((glProgramUniform2i64vARB = (PFNGLPROGRAMUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vARB")) == NULL) || r; + r = ((glProgramUniform2ui64ARB = (PFNGLPROGRAMUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64ARB")) == NULL) || r; + r = ((glProgramUniform2ui64vARB = (PFNGLPROGRAMUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vARB")) == NULL) || r; + r = ((glProgramUniform3i64ARB = (PFNGLPROGRAMUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64ARB")) == NULL) || r; + r = ((glProgramUniform3i64vARB = (PFNGLPROGRAMUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vARB")) == NULL) || r; + r = ((glProgramUniform3ui64ARB = (PFNGLPROGRAMUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64ARB")) == NULL) || r; + r = ((glProgramUniform3ui64vARB = (PFNGLPROGRAMUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vARB")) == NULL) || r; + r = ((glProgramUniform4i64ARB = (PFNGLPROGRAMUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64ARB")) == NULL) || r; + r = ((glProgramUniform4i64vARB = (PFNGLPROGRAMUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vARB")) == NULL) || r; + r = ((glProgramUniform4ui64ARB = (PFNGLPROGRAMUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64ARB")) == NULL) || r; + r = ((glProgramUniform4ui64vARB = (PFNGLPROGRAMUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vARB")) == NULL) || r; + r = ((glUniform1i64ARB = (PFNGLUNIFORM1I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64ARB")) == NULL) || r; + r = ((glUniform1i64vARB = (PFNGLUNIFORM1I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vARB")) == NULL) || r; + r = ((glUniform1ui64ARB = (PFNGLUNIFORM1UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64ARB")) == NULL) || r; + r = ((glUniform1ui64vARB = (PFNGLUNIFORM1UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vARB")) == NULL) || r; + r = ((glUniform2i64ARB = (PFNGLUNIFORM2I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64ARB")) == NULL) || r; + r = ((glUniform2i64vARB = (PFNGLUNIFORM2I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vARB")) == NULL) || r; + r = ((glUniform2ui64ARB = (PFNGLUNIFORM2UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64ARB")) == NULL) || r; + r = ((glUniform2ui64vARB = (PFNGLUNIFORM2UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vARB")) == NULL) || r; + r = ((glUniform3i64ARB = (PFNGLUNIFORM3I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64ARB")) == NULL) || r; + r = ((glUniform3i64vARB = (PFNGLUNIFORM3I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vARB")) == NULL) || r; + r = ((glUniform3ui64ARB = (PFNGLUNIFORM3UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64ARB")) == NULL) || r; + r = ((glUniform3ui64vARB = (PFNGLUNIFORM3UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vARB")) == NULL) || r; + r = ((glUniform4i64ARB = (PFNGLUNIFORM4I64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64ARB")) == NULL) || r; + r = ((glUniform4i64vARB = (PFNGLUNIFORM4I64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vARB")) == NULL) || r; + r = ((glUniform4ui64ARB = (PFNGLUNIFORM4UI64ARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64ARB")) == NULL) || r; + r = ((glUniform4ui64vARB = (PFNGLUNIFORM4UI64VARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_gpu_shader_int64 */ + +#ifdef GL_ARB_imaging + +static GLboolean _glewInit_GL_ARB_imaging (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquation = (PFNGLBLENDEQUATIONPROC)glewGetProcAddress((const GLubyte*)"glBlendEquation")) == NULL) || r; + r = ((glColorSubTable = (PFNGLCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorSubTable")) == NULL) || r; + r = ((glColorTable = (PFNGLCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glColorTable")) == NULL) || r; + r = ((glColorTableParameterfv = (PFNGLCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfv")) == NULL) || r; + r = ((glColorTableParameteriv = (PFNGLCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameteriv")) == NULL) || r; + r = ((glConvolutionFilter1D = (PFNGLCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1D")) == NULL) || r; + r = ((glConvolutionFilter2D = (PFNGLCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2D")) == NULL) || r; + r = ((glConvolutionParameterf = (PFNGLCONVOLUTIONPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterf")) == NULL) || r; + r = ((glConvolutionParameterfv = (PFNGLCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfv")) == NULL) || r; + r = ((glConvolutionParameteri = (PFNGLCONVOLUTIONPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteri")) == NULL) || r; + r = ((glConvolutionParameteriv = (PFNGLCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriv")) == NULL) || r; + r = ((glCopyColorSubTable = (PFNGLCOPYCOLORSUBTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTable")) == NULL) || r; + r = ((glCopyColorTable = (PFNGLCOPYCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTable")) == NULL) || r; + r = ((glCopyConvolutionFilter1D = (PFNGLCOPYCONVOLUTIONFILTER1DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1D")) == NULL) || r; + r = ((glCopyConvolutionFilter2D = (PFNGLCOPYCONVOLUTIONFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2D")) == NULL) || r; + r = ((glGetColorTable = (PFNGLGETCOLORTABLEPROC)glewGetProcAddress((const GLubyte*)"glGetColorTable")) == NULL) || r; + r = ((glGetColorTableParameterfv = (PFNGLGETCOLORTABLEPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfv")) == NULL) || r; + r = ((glGetColorTableParameteriv = (PFNGLGETCOLORTABLEPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameteriv")) == NULL) || r; + r = ((glGetConvolutionFilter = (PFNGLGETCONVOLUTIONFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilter")) == NULL) || r; + r = ((glGetConvolutionParameterfv = (PFNGLGETCONVOLUTIONPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfv")) == NULL) || r; + r = ((glGetConvolutionParameteriv = (PFNGLGETCONVOLUTIONPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameteriv")) == NULL) || r; + r = ((glGetHistogram = (PFNGLGETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glGetHistogram")) == NULL) || r; + r = ((glGetHistogramParameterfv = (PFNGLGETHISTOGRAMPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfv")) == NULL) || r; + r = ((glGetHistogramParameteriv = (PFNGLGETHISTOGRAMPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameteriv")) == NULL) || r; + r = ((glGetMinmax = (PFNGLGETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glGetMinmax")) == NULL) || r; + r = ((glGetMinmaxParameterfv = (PFNGLGETMINMAXPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfv")) == NULL) || r; + r = ((glGetMinmaxParameteriv = (PFNGLGETMINMAXPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameteriv")) == NULL) || r; + r = ((glGetSeparableFilter = (PFNGLGETSEPARABLEFILTERPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilter")) == NULL) || r; + r = ((glHistogram = (PFNGLHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glHistogram")) == NULL) || r; + r = ((glMinmax = (PFNGLMINMAXPROC)glewGetProcAddress((const GLubyte*)"glMinmax")) == NULL) || r; + r = ((glResetHistogram = (PFNGLRESETHISTOGRAMPROC)glewGetProcAddress((const GLubyte*)"glResetHistogram")) == NULL) || r; + r = ((glResetMinmax = (PFNGLRESETMINMAXPROC)glewGetProcAddress((const GLubyte*)"glResetMinmax")) == NULL) || r; + r = ((glSeparableFilter2D = (PFNGLSEPARABLEFILTER2DPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2D")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_imaging */ + +#ifdef GL_ARB_indirect_parameters + +static GLboolean _glewInit_GL_ARB_indirect_parameters (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectCountARB = (PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectCountARB")) == NULL) || r; + r = ((glMultiDrawElementsIndirectCountARB = (PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectCountARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_indirect_parameters */ + +#ifdef GL_ARB_instanced_arrays + +static GLboolean _glewInit_GL_ARB_instanced_arrays (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstancedARB = (PFNGLDRAWARRAYSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedARB")) == NULL) || r; + r = ((glDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedARB")) == NULL) || r; + r = ((glVertexAttribDivisorARB = (PFNGLVERTEXATTRIBDIVISORARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisorARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_instanced_arrays */ + +#ifdef GL_ARB_internalformat_query + +static GLboolean _glewInit_GL_ARB_internalformat_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformativ")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_internalformat_query */ + +#ifdef GL_ARB_internalformat_query2 + +static GLboolean _glewInit_GL_ARB_internalformat_query2 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformati64v")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_internalformat_query2 */ + +#ifdef GL_ARB_invalidate_subdata + +static GLboolean _glewInit_GL_ARB_invalidate_subdata (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferData")) == NULL) || r; + r = ((glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glInvalidateBufferSubData")) == NULL) || r; + r = ((glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateFramebuffer")) == NULL) || r; + r = ((glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC)glewGetProcAddress((const GLubyte*)"glInvalidateSubFramebuffer")) == NULL) || r; + r = ((glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexImage")) == NULL) || r; + r = ((glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC)glewGetProcAddress((const GLubyte*)"glInvalidateTexSubImage")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_invalidate_subdata */ + +#ifdef GL_ARB_map_buffer_range + +static GLboolean _glewInit_GL_ARB_map_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedBufferRange")) == NULL) || r; + r = ((glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glMapBufferRange")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_map_buffer_range */ + +#ifdef GL_ARB_matrix_palette + +static GLboolean _glewInit_GL_ARB_matrix_palette (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCurrentPaletteMatrixARB = (PFNGLCURRENTPALETTEMATRIXARBPROC)glewGetProcAddress((const GLubyte*)"glCurrentPaletteMatrixARB")) == NULL) || r; + r = ((glMatrixIndexPointerARB = (PFNGLMATRIXINDEXPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexPointerARB")) == NULL) || r; + r = ((glMatrixIndexubvARB = (PFNGLMATRIXINDEXUBVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexubvARB")) == NULL) || r; + r = ((glMatrixIndexuivARB = (PFNGLMATRIXINDEXUIVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexuivARB")) == NULL) || r; + r = ((glMatrixIndexusvARB = (PFNGLMATRIXINDEXUSVARBPROC)glewGetProcAddress((const GLubyte*)"glMatrixIndexusvARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_matrix_palette */ + +#ifdef GL_ARB_multi_bind + +static GLboolean _glewInit_GL_ARB_multi_bind (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindBuffersBase = (PFNGLBINDBUFFERSBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersBase")) == NULL) || r; + r = ((glBindBuffersRange = (PFNGLBINDBUFFERSRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBuffersRange")) == NULL) || r; + r = ((glBindImageTextures = (PFNGLBINDIMAGETEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextures")) == NULL) || r; + r = ((glBindSamplers = (PFNGLBINDSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glBindSamplers")) == NULL) || r; + r = ((glBindTextures = (PFNGLBINDTEXTURESPROC)glewGetProcAddress((const GLubyte*)"glBindTextures")) == NULL) || r; + r = ((glBindVertexBuffers = (PFNGLBINDVERTEXBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffers")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_multi_bind */ + +#ifdef GL_ARB_multi_draw_indirect + +static GLboolean _glewInit_GL_ARB_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirect")) == NULL) || r; + r = ((glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirect")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_multi_draw_indirect */ + +#ifdef GL_ARB_multisample + +static GLboolean _glewInit_GL_ARB_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glSampleCoverageARB = (PFNGLSAMPLECOVERAGEARBPROC)glewGetProcAddress((const GLubyte*)"glSampleCoverageARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_multisample */ + +#ifdef GL_ARB_multitexture + +static GLboolean _glewInit_GL_ARB_multitexture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glActiveTextureARB")) == NULL) || r; + r = ((glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC)glewGetProcAddress((const GLubyte*)"glClientActiveTextureARB")) == NULL) || r; + r = ((glMultiTexCoord1dARB = (PFNGLMULTITEXCOORD1DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dARB")) == NULL) || r; + r = ((glMultiTexCoord1dvARB = (PFNGLMULTITEXCOORD1DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1dvARB")) == NULL) || r; + r = ((glMultiTexCoord1fARB = (PFNGLMULTITEXCOORD1FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fARB")) == NULL) || r; + r = ((glMultiTexCoord1fvARB = (PFNGLMULTITEXCOORD1FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1fvARB")) == NULL) || r; + r = ((glMultiTexCoord1iARB = (PFNGLMULTITEXCOORD1IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1iARB")) == NULL) || r; + r = ((glMultiTexCoord1ivARB = (PFNGLMULTITEXCOORD1IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1ivARB")) == NULL) || r; + r = ((glMultiTexCoord1sARB = (PFNGLMULTITEXCOORD1SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1sARB")) == NULL) || r; + r = ((glMultiTexCoord1svARB = (PFNGLMULTITEXCOORD1SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1svARB")) == NULL) || r; + r = ((glMultiTexCoord2dARB = (PFNGLMULTITEXCOORD2DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dARB")) == NULL) || r; + r = ((glMultiTexCoord2dvARB = (PFNGLMULTITEXCOORD2DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2dvARB")) == NULL) || r; + r = ((glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fARB")) == NULL) || r; + r = ((glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2fvARB")) == NULL) || r; + r = ((glMultiTexCoord2iARB = (PFNGLMULTITEXCOORD2IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2iARB")) == NULL) || r; + r = ((glMultiTexCoord2ivARB = (PFNGLMULTITEXCOORD2IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2ivARB")) == NULL) || r; + r = ((glMultiTexCoord2sARB = (PFNGLMULTITEXCOORD2SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2sARB")) == NULL) || r; + r = ((glMultiTexCoord2svARB = (PFNGLMULTITEXCOORD2SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2svARB")) == NULL) || r; + r = ((glMultiTexCoord3dARB = (PFNGLMULTITEXCOORD3DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dARB")) == NULL) || r; + r = ((glMultiTexCoord3dvARB = (PFNGLMULTITEXCOORD3DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3dvARB")) == NULL) || r; + r = ((glMultiTexCoord3fARB = (PFNGLMULTITEXCOORD3FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fARB")) == NULL) || r; + r = ((glMultiTexCoord3fvARB = (PFNGLMULTITEXCOORD3FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3fvARB")) == NULL) || r; + r = ((glMultiTexCoord3iARB = (PFNGLMULTITEXCOORD3IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3iARB")) == NULL) || r; + r = ((glMultiTexCoord3ivARB = (PFNGLMULTITEXCOORD3IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3ivARB")) == NULL) || r; + r = ((glMultiTexCoord3sARB = (PFNGLMULTITEXCOORD3SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3sARB")) == NULL) || r; + r = ((glMultiTexCoord3svARB = (PFNGLMULTITEXCOORD3SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3svARB")) == NULL) || r; + r = ((glMultiTexCoord4dARB = (PFNGLMULTITEXCOORD4DARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dARB")) == NULL) || r; + r = ((glMultiTexCoord4dvARB = (PFNGLMULTITEXCOORD4DVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4dvARB")) == NULL) || r; + r = ((glMultiTexCoord4fARB = (PFNGLMULTITEXCOORD4FARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fARB")) == NULL) || r; + r = ((glMultiTexCoord4fvARB = (PFNGLMULTITEXCOORD4FVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4fvARB")) == NULL) || r; + r = ((glMultiTexCoord4iARB = (PFNGLMULTITEXCOORD4IARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4iARB")) == NULL) || r; + r = ((glMultiTexCoord4ivARB = (PFNGLMULTITEXCOORD4IVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4ivARB")) == NULL) || r; + r = ((glMultiTexCoord4sARB = (PFNGLMULTITEXCOORD4SARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4sARB")) == NULL) || r; + r = ((glMultiTexCoord4svARB = (PFNGLMULTITEXCOORD4SVARBPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4svARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_multitexture */ + +#ifdef GL_ARB_occlusion_query + +static GLboolean _glewInit_GL_ARB_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginQueryARB = (PFNGLBEGINQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryARB")) == NULL) || r; + r = ((glDeleteQueriesARB = (PFNGLDELETEQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteQueriesARB")) == NULL) || r; + r = ((glEndQueryARB = (PFNGLENDQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glEndQueryARB")) == NULL) || r; + r = ((glGenQueriesARB = (PFNGLGENQUERIESARBPROC)glewGetProcAddress((const GLubyte*)"glGenQueriesARB")) == NULL) || r; + r = ((glGetQueryObjectivARB = (PFNGLGETQUERYOBJECTIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectivARB")) == NULL) || r; + r = ((glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectuivARB")) == NULL) || r; + r = ((glGetQueryivARB = (PFNGLGETQUERYIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetQueryivARB")) == NULL) || r; + r = ((glIsQueryARB = (PFNGLISQUERYARBPROC)glewGetProcAddress((const GLubyte*)"glIsQueryARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_occlusion_query */ + +#ifdef GL_ARB_parallel_shader_compile + +static GLboolean _glewInit_GL_ARB_parallel_shader_compile (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMaxShaderCompilerThreadsARB = (PFNGLMAXSHADERCOMPILERTHREADSARBPROC)glewGetProcAddress((const GLubyte*)"glMaxShaderCompilerThreadsARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_parallel_shader_compile */ + +#ifdef GL_ARB_point_parameters + +static GLboolean _glewInit_GL_ARB_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPointParameterfARB = (PFNGLPOINTPARAMETERFARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfARB")) == NULL) || r; + r = ((glPointParameterfvARB = (PFNGLPOINTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_point_parameters */ + +#ifdef GL_ARB_program_interface_query + +static GLboolean _glewInit_GL_ARB_program_interface_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramInterfaceiv")) == NULL) || r; + r = ((glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceIndex")) == NULL) || r; + r = ((glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocation")) == NULL) || r; + r = ((glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceLocationIndex")) == NULL) || r; + r = ((glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceName")) == NULL) || r; + r = ((glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourceiv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_program_interface_query */ + +#ifdef GL_ARB_provoking_vertex + +static GLboolean _glewInit_GL_ARB_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertex")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_provoking_vertex */ + +#ifdef GL_ARB_robustness + +static GLboolean _glewInit_GL_ARB_robustness (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetGraphicsResetStatusARB = (PFNGLGETGRAPHICSRESETSTATUSARBPROC)glewGetProcAddress((const GLubyte*)"glGetGraphicsResetStatusARB")) == NULL) || r; + r = ((glGetnColorTableARB = (PFNGLGETNCOLORTABLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnColorTableARB")) == NULL) || r; + r = ((glGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImageARB")) == NULL) || r; + r = ((glGetnConvolutionFilterARB = (PFNGLGETNCONVOLUTIONFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnConvolutionFilterARB")) == NULL) || r; + r = ((glGetnHistogramARB = (PFNGLGETNHISTOGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glGetnHistogramARB")) == NULL) || r; + r = ((glGetnMapdvARB = (PFNGLGETNMAPDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapdvARB")) == NULL) || r; + r = ((glGetnMapfvARB = (PFNGLGETNMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapfvARB")) == NULL) || r; + r = ((glGetnMapivARB = (PFNGLGETNMAPIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapivARB")) == NULL) || r; + r = ((glGetnMinmaxARB = (PFNGLGETNMINMAXARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMinmaxARB")) == NULL) || r; + r = ((glGetnPixelMapfvARB = (PFNGLGETNPIXELMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapfvARB")) == NULL) || r; + r = ((glGetnPixelMapuivARB = (PFNGLGETNPIXELMAPUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapuivARB")) == NULL) || r; + r = ((glGetnPixelMapusvARB = (PFNGLGETNPIXELMAPUSVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapusvARB")) == NULL) || r; + r = ((glGetnPolygonStippleARB = (PFNGLGETNPOLYGONSTIPPLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPolygonStippleARB")) == NULL) || r; + r = ((glGetnSeparableFilterARB = (PFNGLGETNSEPARABLEFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnSeparableFilterARB")) == NULL) || r; + r = ((glGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImageARB")) == NULL) || r; + r = ((glGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdvARB")) == NULL) || r; + r = ((glGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfvARB")) == NULL) || r; + r = ((glGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformivARB")) == NULL) || r; + r = ((glGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuivARB")) == NULL) || r; + r = ((glReadnPixelsARB = (PFNGLREADNPIXELSARBPROC)glewGetProcAddress((const GLubyte*)"glReadnPixelsARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_robustness */ + +#ifdef GL_ARB_sample_locations + +static GLboolean _glewInit_GL_ARB_sample_locations (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferSampleLocationsfvARB = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvARB")) == NULL) || r; + r = ((glNamedFramebufferSampleLocationsfvARB = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sample_locations */ + +#ifdef GL_ARB_sample_shading + +static GLboolean _glewInit_GL_ARB_sample_shading (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShadingARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sample_shading */ + +#ifdef GL_ARB_sampler_objects + +static GLboolean _glewInit_GL_ARB_sampler_objects (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindSampler = (PFNGLBINDSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glBindSampler")) == NULL) || r; + r = ((glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteSamplers")) == NULL) || r; + r = ((glGenSamplers = (PFNGLGENSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glGenSamplers")) == NULL) || r; + r = ((glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIiv")) == NULL) || r; + r = ((glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIuiv")) == NULL) || r; + r = ((glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterfv")) == NULL) || r; + r = ((glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameteriv")) == NULL) || r; + r = ((glIsSampler = (PFNGLISSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glIsSampler")) == NULL) || r; + r = ((glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIiv")) == NULL) || r; + r = ((glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIuiv")) == NULL) || r; + r = ((glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterf")) == NULL) || r; + r = ((glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterfv")) == NULL) || r; + r = ((glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteri")) == NULL) || r; + r = ((glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteriv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sampler_objects */ + +#ifdef GL_ARB_separate_shader_objects + +static GLboolean _glewInit_GL_ARB_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glActiveShaderProgram")) == NULL) || r; + r = ((glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glBindProgramPipeline")) == NULL) || r; + r = ((glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramv")) == NULL) || r; + r = ((glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramPipelines")) == NULL) || r; + r = ((glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glGenProgramPipelines")) == NULL) || r; + r = ((glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineInfoLog")) == NULL) || r; + r = ((glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineiv")) == NULL) || r; + r = ((glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glIsProgramPipeline")) == NULL) || r; + r = ((glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1d")) == NULL) || r; + r = ((glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dv")) == NULL) || r; + r = ((glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1f")) == NULL) || r; + r = ((glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fv")) == NULL) || r; + r = ((glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i")) == NULL) || r; + r = ((glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iv")) == NULL) || r; + r = ((glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui")) == NULL) || r; + r = ((glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiv")) == NULL) || r; + r = ((glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2d")) == NULL) || r; + r = ((glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dv")) == NULL) || r; + r = ((glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2f")) == NULL) || r; + r = ((glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fv")) == NULL) || r; + r = ((glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i")) == NULL) || r; + r = ((glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iv")) == NULL) || r; + r = ((glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui")) == NULL) || r; + r = ((glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiv")) == NULL) || r; + r = ((glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3d")) == NULL) || r; + r = ((glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dv")) == NULL) || r; + r = ((glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3f")) == NULL) || r; + r = ((glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fv")) == NULL) || r; + r = ((glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i")) == NULL) || r; + r = ((glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iv")) == NULL) || r; + r = ((glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui")) == NULL) || r; + r = ((glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiv")) == NULL) || r; + r = ((glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4d")) == NULL) || r; + r = ((glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dv")) == NULL) || r; + r = ((glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4f")) == NULL) || r; + r = ((glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fv")) == NULL) || r; + r = ((glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i")) == NULL) || r; + r = ((glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iv")) == NULL) || r; + r = ((glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui")) == NULL) || r; + r = ((glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiv")) == NULL) || r; + r = ((glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dv")) == NULL) || r; + r = ((glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fv")) == NULL) || r; + r = ((glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dv")) == NULL) || r; + r = ((glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fv")) == NULL) || r; + r = ((glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dv")) == NULL) || r; + r = ((glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fv")) == NULL) || r; + r = ((glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dv")) == NULL) || r; + r = ((glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fv")) == NULL) || r; + r = ((glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dv")) == NULL) || r; + r = ((glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fv")) == NULL) || r; + r = ((glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dv")) == NULL) || r; + r = ((glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fv")) == NULL) || r; + r = ((glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dv")) == NULL) || r; + r = ((glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fv")) == NULL) || r; + r = ((glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dv")) == NULL) || r; + r = ((glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fv")) == NULL) || r; + r = ((glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dv")) == NULL) || r; + r = ((glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fv")) == NULL) || r; + r = ((glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC)glewGetProcAddress((const GLubyte*)"glUseProgramStages")) == NULL) || r; + r = ((glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramPipeline")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_separate_shader_objects */ + +#ifdef GL_ARB_shader_atomic_counters + +static GLboolean _glewInit_GL_ARB_shader_atomic_counters (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAtomicCounterBufferiv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_shader_atomic_counters */ + +#ifdef GL_ARB_shader_image_load_store + +static GLboolean _glewInit_GL_ARB_shader_image_load_store (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)glewGetProcAddress((const GLubyte*)"glBindImageTexture")) == NULL) || r; + r = ((glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrier")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_shader_image_load_store */ + +#ifdef GL_ARB_shader_objects + +static GLboolean _glewInit_GL_ARB_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glAttachObjectARB")) == NULL) || r; + r = ((glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderARB")) == NULL) || r; + r = ((glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateProgramObjectARB")) == NULL) || r; + r = ((glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderObjectARB")) == NULL) || r; + r = ((glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteObjectARB")) == NULL) || r; + r = ((glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glDetachObjectARB")) == NULL) || r; + r = ((glGetActiveUniformARB = (PFNGLGETACTIVEUNIFORMARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformARB")) == NULL) || r; + r = ((glGetAttachedObjectsARB = (PFNGLGETATTACHEDOBJECTSARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttachedObjectsARB")) == NULL) || r; + r = ((glGetHandleARB = (PFNGLGETHANDLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetHandleARB")) == NULL) || r; + r = ((glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetInfoLogARB")) == NULL) || r; + r = ((glGetObjectParameterfvARB = (PFNGLGETOBJECTPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterfvARB")) == NULL) || r; + r = ((glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivARB")) == NULL) || r; + r = ((glGetShaderSourceARB = (PFNGLGETSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glGetShaderSourceARB")) == NULL) || r; + r = ((glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformLocationARB")) == NULL) || r; + r = ((glGetUniformfvARB = (PFNGLGETUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformfvARB")) == NULL) || r; + r = ((glGetUniformivARB = (PFNGLGETUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetUniformivARB")) == NULL) || r; + r = ((glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glLinkProgramARB")) == NULL) || r; + r = ((glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)glewGetProcAddress((const GLubyte*)"glShaderSourceARB")) == NULL) || r; + r = ((glUniform1fARB = (PFNGLUNIFORM1FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fARB")) == NULL) || r; + r = ((glUniform1fvARB = (PFNGLUNIFORM1FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1fvARB")) == NULL) || r; + r = ((glUniform1iARB = (PFNGLUNIFORM1IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1iARB")) == NULL) || r; + r = ((glUniform1ivARB = (PFNGLUNIFORM1IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform1ivARB")) == NULL) || r; + r = ((glUniform2fARB = (PFNGLUNIFORM2FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fARB")) == NULL) || r; + r = ((glUniform2fvARB = (PFNGLUNIFORM2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2fvARB")) == NULL) || r; + r = ((glUniform2iARB = (PFNGLUNIFORM2IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2iARB")) == NULL) || r; + r = ((glUniform2ivARB = (PFNGLUNIFORM2IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform2ivARB")) == NULL) || r; + r = ((glUniform3fARB = (PFNGLUNIFORM3FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fARB")) == NULL) || r; + r = ((glUniform3fvARB = (PFNGLUNIFORM3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3fvARB")) == NULL) || r; + r = ((glUniform3iARB = (PFNGLUNIFORM3IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3iARB")) == NULL) || r; + r = ((glUniform3ivARB = (PFNGLUNIFORM3IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform3ivARB")) == NULL) || r; + r = ((glUniform4fARB = (PFNGLUNIFORM4FARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fARB")) == NULL) || r; + r = ((glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4fvARB")) == NULL) || r; + r = ((glUniform4iARB = (PFNGLUNIFORM4IARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4iARB")) == NULL) || r; + r = ((glUniform4ivARB = (PFNGLUNIFORM4IVARBPROC)glewGetProcAddress((const GLubyte*)"glUniform4ivARB")) == NULL) || r; + r = ((glUniformMatrix2fvARB = (PFNGLUNIFORMMATRIX2FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2fvARB")) == NULL) || r; + r = ((glUniformMatrix3fvARB = (PFNGLUNIFORMMATRIX3FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3fvARB")) == NULL) || r; + r = ((glUniformMatrix4fvARB = (PFNGLUNIFORMMATRIX4FVARBPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4fvARB")) == NULL) || r; + r = ((glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)glewGetProcAddress((const GLubyte*)"glUseProgramObjectARB")) == NULL) || r; + r = ((glValidateProgramARB = (PFNGLVALIDATEPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_shader_objects */ + +#ifdef GL_ARB_shader_storage_buffer_object + +static GLboolean _glewInit_GL_ARB_shader_storage_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glShaderStorageBlockBinding")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_shader_storage_buffer_object */ + +#ifdef GL_ARB_shader_subroutine + +static GLboolean _glewInit_GL_ARB_shader_subroutine (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineName")) == NULL) || r; + r = ((glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformName")) == NULL) || r; + r = ((glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformiv")) == NULL) || r; + r = ((glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStageiv")) == NULL) || r; + r = ((glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineIndex")) == NULL) || r; + r = ((glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineUniformLocation")) == NULL) || r; + r = ((glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformSubroutineuiv")) == NULL) || r; + r = ((glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC)glewGetProcAddress((const GLubyte*)"glUniformSubroutinesuiv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_shader_subroutine */ + +#ifdef GL_ARB_shading_language_include + +static GLboolean _glewInit_GL_ARB_shading_language_include (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCompileShaderIncludeARB = (PFNGLCOMPILESHADERINCLUDEARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderIncludeARB")) == NULL) || r; + r = ((glDeleteNamedStringARB = (PFNGLDELETENAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamedStringARB")) == NULL) || r; + r = ((glGetNamedStringARB = (PFNGLGETNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringARB")) == NULL) || r; + r = ((glGetNamedStringivARB = (PFNGLGETNAMEDSTRINGIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringivARB")) == NULL) || r; + r = ((glIsNamedStringARB = (PFNGLISNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glIsNamedStringARB")) == NULL) || r; + r = ((glNamedStringARB = (PFNGLNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glNamedStringARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_shading_language_include */ + +#ifdef GL_ARB_sparse_buffer + +static GLboolean _glewInit_GL_ARB_sparse_buffer (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBufferPageCommitmentARB = (PFNGLBUFFERPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glBufferPageCommitmentARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sparse_buffer */ + +#ifdef GL_ARB_sparse_texture + +static GLboolean _glewInit_GL_ARB_sparse_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexPageCommitmentARB = (PFNGLTEXPAGECOMMITMENTARBPROC)glewGetProcAddress((const GLubyte*)"glTexPageCommitmentARB")) == NULL) || r; + r = ((glTexturePageCommitmentEXT = (PFNGLTEXTUREPAGECOMMITMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glTexturePageCommitmentEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sparse_texture */ + +#ifdef GL_ARB_sync + +static GLboolean _glewInit_GL_ARB_sync (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSync")) == NULL) || r; + r = ((glDeleteSync = (PFNGLDELETESYNCPROC)glewGetProcAddress((const GLubyte*)"glDeleteSync")) == NULL) || r; + r = ((glFenceSync = (PFNGLFENCESYNCPROC)glewGetProcAddress((const GLubyte*)"glFenceSync")) == NULL) || r; + r = ((glGetInteger64v = (PFNGLGETINTEGER64VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64v")) == NULL) || r; + r = ((glGetSynciv = (PFNGLGETSYNCIVPROC)glewGetProcAddress((const GLubyte*)"glGetSynciv")) == NULL) || r; + r = ((glIsSync = (PFNGLISSYNCPROC)glewGetProcAddress((const GLubyte*)"glIsSync")) == NULL) || r; + r = ((glWaitSync = (PFNGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glWaitSync")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_sync */ + +#ifdef GL_ARB_tessellation_shader + +static GLboolean _glewInit_GL_ARB_tessellation_shader (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPatchParameterfv")) == NULL) || r; + r = ((glPatchParameteri = (PFNGLPATCHPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPatchParameteri")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_tessellation_shader */ + +#ifdef GL_ARB_texture_barrier + +static GLboolean _glewInit_GL_ARB_texture_barrier (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTextureBarrier = (PFNGLTEXTUREBARRIERPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrier")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_barrier */ + +#ifdef GL_ARB_texture_buffer_object + +static GLboolean _glewInit_GL_ARB_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexBufferARB = (PFNGLTEXBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glTexBufferARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_buffer_object */ + +#ifdef GL_ARB_texture_buffer_range + +static GLboolean _glewInit_GL_ARB_texture_buffer_range (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glTexBufferRange")) == NULL) || r; + r = ((glTextureBufferRangeEXT = (PFNGLTEXTUREBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferRangeEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_buffer_range */ + +#ifdef GL_ARB_texture_compression + +static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCompressedTexImage1DARB = (PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage1DARB")) == NULL) || r; + r = ((glCompressedTexImage2DARB = (PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage2DARB")) == NULL) || r; + r = ((glCompressedTexImage3DARB = (PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexImage3DARB")) == NULL) || r; + r = ((glCompressedTexSubImage1DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage1DARB")) == NULL) || r; + r = ((glCompressedTexSubImage2DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage2DARB")) == NULL) || r; + r = ((glCompressedTexSubImage3DARB = (PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)glewGetProcAddress((const GLubyte*)"glCompressedTexSubImage3DARB")) == NULL) || r; + r = ((glGetCompressedTexImageARB = (PFNGLGETCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTexImageARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_compression */ + +#ifdef GL_ARB_texture_multisample + +static GLboolean _glewInit_GL_ARB_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefv")) == NULL) || r; + r = ((glSampleMaski = (PFNGLSAMPLEMASKIPROC)glewGetProcAddress((const GLubyte*)"glSampleMaski")) == NULL) || r; + r = ((glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisample")) == NULL) || r; + r = ((glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisample")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_multisample */ + +#ifdef GL_ARB_texture_storage + +static GLboolean _glewInit_GL_ARB_texture_storage (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexStorage1D = (PFNGLTEXSTORAGE1DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage1D")) == NULL) || r; + r = ((glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2D")) == NULL) || r; + r = ((glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3D")) == NULL) || r; + r = ((glTextureStorage1DEXT = (PFNGLTEXTURESTORAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage1DEXT")) == NULL) || r; + r = ((glTextureStorage2DEXT = (PFNGLTEXTURESTORAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DEXT")) == NULL) || r; + r = ((glTextureStorage3DEXT = (PFNGLTEXTURESTORAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_storage */ + +#ifdef GL_ARB_texture_storage_multisample + +static GLboolean _glewInit_GL_ARB_texture_storage_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage2DMultisample")) == NULL) || r; + r = ((glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexStorage3DMultisample")) == NULL) || r; + r = ((glTextureStorage2DMultisampleEXT = (PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage2DMultisampleEXT")) == NULL) || r; + r = ((glTextureStorage3DMultisampleEXT = (PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureStorage3DMultisampleEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_storage_multisample */ + +#ifdef GL_ARB_texture_view + +static GLboolean _glewInit_GL_ARB_texture_view (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTextureView = (PFNGLTEXTUREVIEWPROC)glewGetProcAddress((const GLubyte*)"glTextureView")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_texture_view */ + +#ifdef GL_ARB_timer_query + +static GLboolean _glewInit_GL_ARB_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64v")) == NULL) || r; + r = ((glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64v")) == NULL) || r; + r = ((glQueryCounter = (PFNGLQUERYCOUNTERPROC)glewGetProcAddress((const GLubyte*)"glQueryCounter")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_timer_query */ + +#ifdef GL_ARB_transform_feedback2 + +static GLboolean _glewInit_GL_ARB_transform_feedback2 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedback")) == NULL) || r; + r = ((glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacks")) == NULL) || r; + r = ((glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedback")) == NULL) || r; + r = ((glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacks")) == NULL) || r; + r = ((glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedback")) == NULL) || r; + r = ((glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedback")) == NULL) || r; + r = ((glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedback")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_transform_feedback2 */ + +#ifdef GL_ARB_transform_feedback3 + +static GLboolean _glewInit_GL_ARB_transform_feedback3 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryIndexed")) == NULL) || r; + r = ((glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStream")) == NULL) || r; + r = ((glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glEndQueryIndexed")) == NULL) || r; + r = ((glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryIndexediv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_transform_feedback3 */ + +#ifdef GL_ARB_transform_feedback_instanced + +static GLboolean _glewInit_GL_ARB_transform_feedback_instanced (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackInstanced")) == NULL) || r; + r = ((glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStreamInstanced")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_transform_feedback_instanced */ + +#ifdef GL_ARB_transpose_matrix + +static GLboolean _glewInit_GL_ARB_transpose_matrix (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glLoadTransposeMatrixdARB = (PFNGLLOADTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixdARB")) == NULL) || r; + r = ((glLoadTransposeMatrixfARB = (PFNGLLOADTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glLoadTransposeMatrixfARB")) == NULL) || r; + r = ((glMultTransposeMatrixdARB = (PFNGLMULTTRANSPOSEMATRIXDARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixdARB")) == NULL) || r; + r = ((glMultTransposeMatrixfARB = (PFNGLMULTTRANSPOSEMATRIXFARBPROC)glewGetProcAddress((const GLubyte*)"glMultTransposeMatrixfARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_transpose_matrix */ + +#ifdef GL_ARB_uniform_buffer_object + +static GLboolean _glewInit_GL_ARB_uniform_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBase")) == NULL) || r; + r = ((glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRange")) == NULL) || r; + r = ((glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockName")) == NULL) || r; + r = ((glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockiv")) == NULL) || r; + r = ((glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformName")) == NULL) || r; + r = ((glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformsiv")) == NULL) || r; + r = ((glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_v")) == NULL) || r; + r = ((glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBlockIndex")) == NULL) || r; + r = ((glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)glewGetProcAddress((const GLubyte*)"glGetUniformIndices")) == NULL) || r; + r = ((glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glUniformBlockBinding")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_uniform_buffer_object */ + +#ifdef GL_ARB_vertex_array_object + +static GLboolean _glewInit_GL_ARB_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glBindVertexArray")) == NULL) || r; + r = ((glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexArrays")) == NULL) || r; + r = ((glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)glewGetProcAddress((const GLubyte*)"glGenVertexArrays")) == NULL) || r; + r = ((glIsVertexArray = (PFNGLISVERTEXARRAYPROC)glewGetProcAddress((const GLubyte*)"glIsVertexArray")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_array_object */ + +#ifdef GL_ARB_vertex_attrib_64bit + +static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdv")) == NULL) || r; + r = ((glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1d")) == NULL) || r; + r = ((glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dv")) == NULL) || r; + r = ((glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2d")) == NULL) || r; + r = ((glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dv")) == NULL) || r; + r = ((glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3d")) == NULL) || r; + r = ((glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dv")) == NULL) || r; + r = ((glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4d")) == NULL) || r; + r = ((glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dv")) == NULL) || r; + r = ((glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointer")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_attrib_64bit */ + +#ifdef GL_ARB_vertex_attrib_binding + +static GLboolean _glewInit_GL_ARB_vertex_attrib_binding (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glBindVertexBuffer")) == NULL) || r; + r = ((glVertexArrayBindVertexBufferEXT = (PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayBindVertexBufferEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribBindingEXT = (PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribBindingEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribFormatEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribIFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIFormatEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribLFormatEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLFormatEXT")) == NULL) || r; + r = ((glVertexArrayVertexBindingDivisorEXT = (PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexBindingDivisorEXT")) == NULL) || r; + r = ((glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribBinding")) == NULL) || r; + r = ((glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormat")) == NULL) || r; + r = ((glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormat")) == NULL) || r; + r = ((glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormat")) == NULL) || r; + r = ((glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexBindingDivisor")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_attrib_binding */ + +#ifdef GL_ARB_vertex_blend + +static GLboolean _glewInit_GL_ARB_vertex_blend (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glVertexBlendARB = (PFNGLVERTEXBLENDARBPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendARB")) == NULL) || r; + r = ((glWeightPointerARB = (PFNGLWEIGHTPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glWeightPointerARB")) == NULL) || r; + r = ((glWeightbvARB = (PFNGLWEIGHTBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightbvARB")) == NULL) || r; + r = ((glWeightdvARB = (PFNGLWEIGHTDVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightdvARB")) == NULL) || r; + r = ((glWeightfvARB = (PFNGLWEIGHTFVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightfvARB")) == NULL) || r; + r = ((glWeightivARB = (PFNGLWEIGHTIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightivARB")) == NULL) || r; + r = ((glWeightsvARB = (PFNGLWEIGHTSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightsvARB")) == NULL) || r; + r = ((glWeightubvARB = (PFNGLWEIGHTUBVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightubvARB")) == NULL) || r; + r = ((glWeightuivARB = (PFNGLWEIGHTUIVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightuivARB")) == NULL) || r; + r = ((glWeightusvARB = (PFNGLWEIGHTUSVARBPROC)glewGetProcAddress((const GLubyte*)"glWeightusvARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_blend */ + +#ifdef GL_ARB_vertex_buffer_object + +static GLboolean _glewInit_GL_ARB_vertex_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindBufferARB = (PFNGLBINDBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glBindBufferARB")) == NULL) || r; + r = ((glBufferDataARB = (PFNGLBUFFERDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferDataARB")) == NULL) || r; + r = ((glBufferSubDataARB = (PFNGLBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glBufferSubDataARB")) == NULL) || r; + r = ((glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteBuffersARB")) == NULL) || r; + r = ((glGenBuffersARB = (PFNGLGENBUFFERSARBPROC)glewGetProcAddress((const GLubyte*)"glGenBuffersARB")) == NULL) || r; + r = ((glGetBufferParameterivARB = (PFNGLGETBUFFERPARAMETERIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterivARB")) == NULL) || r; + r = ((glGetBufferPointervARB = (PFNGLGETBUFFERPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferPointervARB")) == NULL) || r; + r = ((glGetBufferSubDataARB = (PFNGLGETBUFFERSUBDATAARBPROC)glewGetProcAddress((const GLubyte*)"glGetBufferSubDataARB")) == NULL) || r; + r = ((glIsBufferARB = (PFNGLISBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glIsBufferARB")) == NULL) || r; + r = ((glMapBufferARB = (PFNGLMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glMapBufferARB")) == NULL) || r; + r = ((glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"glUnmapBufferARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_buffer_object */ + +#ifdef GL_ARB_vertex_program + +static GLboolean _glewInit_GL_ARB_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindProgramARB = (PFNGLBINDPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glBindProgramARB")) == NULL) || r; + r = ((glDeleteProgramsARB = (PFNGLDELETEPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsARB")) == NULL) || r; + r = ((glDisableVertexAttribArrayARB = (PFNGLDISABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribArrayARB")) == NULL) || r; + r = ((glEnableVertexAttribArrayARB = (PFNGLENABLEVERTEXATTRIBARRAYARBPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribArrayARB")) == NULL) || r; + r = ((glGenProgramsARB = (PFNGLGENPROGRAMSARBPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsARB")) == NULL) || r; + r = ((glGetProgramEnvParameterdvARB = (PFNGLGETPROGRAMENVPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterdvARB")) == NULL) || r; + r = ((glGetProgramEnvParameterfvARB = (PFNGLGETPROGRAMENVPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramEnvParameterfvARB")) == NULL) || r; + r = ((glGetProgramLocalParameterdvARB = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterdvARB")) == NULL) || r; + r = ((glGetProgramLocalParameterfvARB = (PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramLocalParameterfvARB")) == NULL) || r; + r = ((glGetProgramStringARB = (PFNGLGETPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringARB")) == NULL) || r; + r = ((glGetProgramivARB = (PFNGLGETPROGRAMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivARB")) == NULL) || r; + r = ((glGetVertexAttribPointervARB = (PFNGLGETVERTEXATTRIBPOINTERVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervARB")) == NULL) || r; + r = ((glGetVertexAttribdvARB = (PFNGLGETVERTEXATTRIBDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvARB")) == NULL) || r; + r = ((glGetVertexAttribfvARB = (PFNGLGETVERTEXATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvARB")) == NULL) || r; + r = ((glGetVertexAttribivARB = (PFNGLGETVERTEXATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivARB")) == NULL) || r; + r = ((glIsProgramARB = (PFNGLISPROGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glIsProgramARB")) == NULL) || r; + r = ((glProgramEnvParameter4dARB = (PFNGLPROGRAMENVPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dARB")) == NULL) || r; + r = ((glProgramEnvParameter4dvARB = (PFNGLPROGRAMENVPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4dvARB")) == NULL) || r; + r = ((glProgramEnvParameter4fARB = (PFNGLPROGRAMENVPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fARB")) == NULL) || r; + r = ((glProgramEnvParameter4fvARB = (PFNGLPROGRAMENVPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameter4fvARB")) == NULL) || r; + r = ((glProgramLocalParameter4dARB = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dARB")) == NULL) || r; + r = ((glProgramLocalParameter4dvARB = (PFNGLPROGRAMLOCALPARAMETER4DVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4dvARB")) == NULL) || r; + r = ((glProgramLocalParameter4fARB = (PFNGLPROGRAMLOCALPARAMETER4FARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fARB")) == NULL) || r; + r = ((glProgramLocalParameter4fvARB = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameter4fvARB")) == NULL) || r; + r = ((glProgramStringARB = (PFNGLPROGRAMSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glProgramStringARB")) == NULL) || r; + r = ((glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dARB")) == NULL) || r; + r = ((glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvARB")) == NULL) || r; + r = ((glVertexAttrib1fARB = (PFNGLVERTEXATTRIB1FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fARB")) == NULL) || r; + r = ((glVertexAttrib1fvARB = (PFNGLVERTEXATTRIB1FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvARB")) == NULL) || r; + r = ((glVertexAttrib1sARB = (PFNGLVERTEXATTRIB1SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sARB")) == NULL) || r; + r = ((glVertexAttrib1svARB = (PFNGLVERTEXATTRIB1SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svARB")) == NULL) || r; + r = ((glVertexAttrib2dARB = (PFNGLVERTEXATTRIB2DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dARB")) == NULL) || r; + r = ((glVertexAttrib2dvARB = (PFNGLVERTEXATTRIB2DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvARB")) == NULL) || r; + r = ((glVertexAttrib2fARB = (PFNGLVERTEXATTRIB2FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fARB")) == NULL) || r; + r = ((glVertexAttrib2fvARB = (PFNGLVERTEXATTRIB2FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvARB")) == NULL) || r; + r = ((glVertexAttrib2sARB = (PFNGLVERTEXATTRIB2SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sARB")) == NULL) || r; + r = ((glVertexAttrib2svARB = (PFNGLVERTEXATTRIB2SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svARB")) == NULL) || r; + r = ((glVertexAttrib3dARB = (PFNGLVERTEXATTRIB3DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dARB")) == NULL) || r; + r = ((glVertexAttrib3dvARB = (PFNGLVERTEXATTRIB3DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvARB")) == NULL) || r; + r = ((glVertexAttrib3fARB = (PFNGLVERTEXATTRIB3FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fARB")) == NULL) || r; + r = ((glVertexAttrib3fvARB = (PFNGLVERTEXATTRIB3FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvARB")) == NULL) || r; + r = ((glVertexAttrib3sARB = (PFNGLVERTEXATTRIB3SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sARB")) == NULL) || r; + r = ((glVertexAttrib3svARB = (PFNGLVERTEXATTRIB3SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svARB")) == NULL) || r; + r = ((glVertexAttrib4NbvARB = (PFNGLVERTEXATTRIB4NBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NbvARB")) == NULL) || r; + r = ((glVertexAttrib4NivARB = (PFNGLVERTEXATTRIB4NIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NivARB")) == NULL) || r; + r = ((glVertexAttrib4NsvARB = (PFNGLVERTEXATTRIB4NSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NsvARB")) == NULL) || r; + r = ((glVertexAttrib4NubARB = (PFNGLVERTEXATTRIB4NUBARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubARB")) == NULL) || r; + r = ((glVertexAttrib4NubvARB = (PFNGLVERTEXATTRIB4NUBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NubvARB")) == NULL) || r; + r = ((glVertexAttrib4NuivARB = (PFNGLVERTEXATTRIB4NUIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NuivARB")) == NULL) || r; + r = ((glVertexAttrib4NusvARB = (PFNGLVERTEXATTRIB4NUSVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4NusvARB")) == NULL) || r; + r = ((glVertexAttrib4bvARB = (PFNGLVERTEXATTRIB4BVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4bvARB")) == NULL) || r; + r = ((glVertexAttrib4dARB = (PFNGLVERTEXATTRIB4DARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dARB")) == NULL) || r; + r = ((glVertexAttrib4dvARB = (PFNGLVERTEXATTRIB4DVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvARB")) == NULL) || r; + r = ((glVertexAttrib4fARB = (PFNGLVERTEXATTRIB4FARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fARB")) == NULL) || r; + r = ((glVertexAttrib4fvARB = (PFNGLVERTEXATTRIB4FVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvARB")) == NULL) || r; + r = ((glVertexAttrib4ivARB = (PFNGLVERTEXATTRIB4IVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ivARB")) == NULL) || r; + r = ((glVertexAttrib4sARB = (PFNGLVERTEXATTRIB4SARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sARB")) == NULL) || r; + r = ((glVertexAttrib4svARB = (PFNGLVERTEXATTRIB4SVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svARB")) == NULL) || r; + r = ((glVertexAttrib4ubvARB = (PFNGLVERTEXATTRIB4UBVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvARB")) == NULL) || r; + r = ((glVertexAttrib4uivARB = (PFNGLVERTEXATTRIB4UIVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4uivARB")) == NULL) || r; + r = ((glVertexAttrib4usvARB = (PFNGLVERTEXATTRIB4USVARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4usvARB")) == NULL) || r; + r = ((glVertexAttribPointerARB = (PFNGLVERTEXATTRIBPOINTERARBPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_program */ + +#ifdef GL_ARB_vertex_shader + +static GLboolean _glewInit_GL_ARB_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glBindAttribLocationARB")) == NULL) || r; + r = ((glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"glGetActiveAttribARB")) == NULL) || r; + r = ((glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)glewGetProcAddress((const GLubyte*)"glGetAttribLocationARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_shader */ + +#ifdef GL_ARB_vertex_type_2_10_10_10_rev + +static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColorP3ui = (PFNGLCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glColorP3ui")) == NULL) || r; + r = ((glColorP3uiv = (PFNGLCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP3uiv")) == NULL) || r; + r = ((glColorP4ui = (PFNGLCOLORP4UIPROC)glewGetProcAddress((const GLubyte*)"glColorP4ui")) == NULL) || r; + r = ((glColorP4uiv = (PFNGLCOLORP4UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP4uiv")) == NULL) || r; + r = ((glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1ui")) == NULL) || r; + r = ((glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1uiv")) == NULL) || r; + r = ((glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2ui")) == NULL) || r; + r = ((glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2uiv")) == NULL) || r; + r = ((glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3ui")) == NULL) || r; + r = ((glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3uiv")) == NULL) || r; + r = ((glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4ui")) == NULL) || r; + r = ((glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4uiv")) == NULL) || r; + r = ((glNormalP3ui = (PFNGLNORMALP3UIPROC)glewGetProcAddress((const GLubyte*)"glNormalP3ui")) == NULL) || r; + r = ((glNormalP3uiv = (PFNGLNORMALP3UIVPROC)glewGetProcAddress((const GLubyte*)"glNormalP3uiv")) == NULL) || r; + r = ((glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3ui")) == NULL) || r; + r = ((glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3uiv")) == NULL) || r; + r = ((glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1ui")) == NULL) || r; + r = ((glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1uiv")) == NULL) || r; + r = ((glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2ui")) == NULL) || r; + r = ((glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2uiv")) == NULL) || r; + r = ((glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3ui")) == NULL) || r; + r = ((glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3uiv")) == NULL) || r; + r = ((glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4ui")) == NULL) || r; + r = ((glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4uiv")) == NULL) || r; + r = ((glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1ui")) == NULL) || r; + r = ((glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1uiv")) == NULL) || r; + r = ((glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2ui")) == NULL) || r; + r = ((glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2uiv")) == NULL) || r; + r = ((glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3ui")) == NULL) || r; + r = ((glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3uiv")) == NULL) || r; + r = ((glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4ui")) == NULL) || r; + r = ((glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4uiv")) == NULL) || r; + r = ((glVertexP2ui = (PFNGLVERTEXP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP2ui")) == NULL) || r; + r = ((glVertexP2uiv = (PFNGLVERTEXP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP2uiv")) == NULL) || r; + r = ((glVertexP3ui = (PFNGLVERTEXP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP3ui")) == NULL) || r; + r = ((glVertexP3uiv = (PFNGLVERTEXP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP3uiv")) == NULL) || r; + r = ((glVertexP4ui = (PFNGLVERTEXP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP4ui")) == NULL) || r; + r = ((glVertexP4uiv = (PFNGLVERTEXP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP4uiv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ + +#ifdef GL_ARB_viewport_array + +static GLboolean _glewInit_GL_ARB_viewport_array (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayv")) == NULL) || r; + r = ((glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexed")) == NULL) || r; + r = ((glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_v")) == NULL) || r; + r = ((glGetFloati_v = (PFNGLGETFLOATI_VPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_v")) == NULL) || r; + r = ((glScissorArrayv = (PFNGLSCISSORARRAYVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayv")) == NULL) || r; + r = ((glScissorIndexed = (PFNGLSCISSORINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexed")) == NULL) || r; + r = ((glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedv")) == NULL) || r; + r = ((glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayv")) == NULL) || r; + r = ((glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedf")) == NULL) || r; + r = ((glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfv")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_viewport_array */ + +#ifdef GL_ARB_window_pos + +static GLboolean _glewInit_GL_ARB_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glWindowPos2dARB = (PFNGLWINDOWPOS2DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dARB")) == NULL) || r; + r = ((glWindowPos2dvARB = (PFNGLWINDOWPOS2DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvARB")) == NULL) || r; + r = ((glWindowPos2fARB = (PFNGLWINDOWPOS2FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fARB")) == NULL) || r; + r = ((glWindowPos2fvARB = (PFNGLWINDOWPOS2FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvARB")) == NULL) || r; + r = ((glWindowPos2iARB = (PFNGLWINDOWPOS2IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iARB")) == NULL) || r; + r = ((glWindowPos2ivARB = (PFNGLWINDOWPOS2IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivARB")) == NULL) || r; + r = ((glWindowPos2sARB = (PFNGLWINDOWPOS2SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sARB")) == NULL) || r; + r = ((glWindowPos2svARB = (PFNGLWINDOWPOS2SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svARB")) == NULL) || r; + r = ((glWindowPos3dARB = (PFNGLWINDOWPOS3DARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dARB")) == NULL) || r; + r = ((glWindowPos3dvARB = (PFNGLWINDOWPOS3DVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvARB")) == NULL) || r; + r = ((glWindowPos3fARB = (PFNGLWINDOWPOS3FARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fARB")) == NULL) || r; + r = ((glWindowPos3fvARB = (PFNGLWINDOWPOS3FVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvARB")) == NULL) || r; + r = ((glWindowPos3iARB = (PFNGLWINDOWPOS3IARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iARB")) == NULL) || r; + r = ((glWindowPos3ivARB = (PFNGLWINDOWPOS3IVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivARB")) == NULL) || r; + r = ((glWindowPos3sARB = (PFNGLWINDOWPOS3SARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sARB")) == NULL) || r; + r = ((glWindowPos3svARB = (PFNGLWINDOWPOS3SVARBPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svARB")) == NULL) || r; + + return r; +} + +#endif /* GL_ARB_window_pos */ + +#ifdef GL_ATI_draw_buffers + +static GLboolean _glewInit_GL_ATI_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawBuffersATI = (PFNGLDRAWBUFFERSATIPROC)glewGetProcAddress((const GLubyte*)"glDrawBuffersATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_draw_buffers */ + +#ifdef GL_ATI_element_array + +static GLboolean _glewInit_GL_ATI_element_array (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawElementArrayATI = (PFNGLDRAWELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawElementArrayATI")) == NULL) || r; + r = ((glDrawRangeElementArrayATI = (PFNGLDRAWRANGEELEMENTARRAYATIPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementArrayATI")) == NULL) || r; + r = ((glElementPointerATI = (PFNGLELEMENTPOINTERATIPROC)glewGetProcAddress((const GLubyte*)"glElementPointerATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_element_array */ + +#ifdef GL_ATI_envmap_bumpmap + +static GLboolean _glewInit_GL_ATI_envmap_bumpmap (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetTexBumpParameterfvATI = (PFNGLGETTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterfvATI")) == NULL) || r; + r = ((glGetTexBumpParameterivATI = (PFNGLGETTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetTexBumpParameterivATI")) == NULL) || r; + r = ((glTexBumpParameterfvATI = (PFNGLTEXBUMPPARAMETERFVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterfvATI")) == NULL) || r; + r = ((glTexBumpParameterivATI = (PFNGLTEXBUMPPARAMETERIVATIPROC)glewGetProcAddress((const GLubyte*)"glTexBumpParameterivATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_envmap_bumpmap */ + +#ifdef GL_ATI_fragment_shader + +static GLboolean _glewInit_GL_ATI_fragment_shader (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAlphaFragmentOp1ATI = (PFNGLALPHAFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp1ATI")) == NULL) || r; + r = ((glAlphaFragmentOp2ATI = (PFNGLALPHAFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp2ATI")) == NULL) || r; + r = ((glAlphaFragmentOp3ATI = (PFNGLALPHAFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glAlphaFragmentOp3ATI")) == NULL) || r; + r = ((glBeginFragmentShaderATI = (PFNGLBEGINFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBeginFragmentShaderATI")) == NULL) || r; + r = ((glBindFragmentShaderATI = (PFNGLBINDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glBindFragmentShaderATI")) == NULL) || r; + r = ((glColorFragmentOp1ATI = (PFNGLCOLORFRAGMENTOP1ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp1ATI")) == NULL) || r; + r = ((glColorFragmentOp2ATI = (PFNGLCOLORFRAGMENTOP2ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp2ATI")) == NULL) || r; + r = ((glColorFragmentOp3ATI = (PFNGLCOLORFRAGMENTOP3ATIPROC)glewGetProcAddress((const GLubyte*)"glColorFragmentOp3ATI")) == NULL) || r; + r = ((glDeleteFragmentShaderATI = (PFNGLDELETEFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glDeleteFragmentShaderATI")) == NULL) || r; + r = ((glEndFragmentShaderATI = (PFNGLENDFRAGMENTSHADERATIPROC)glewGetProcAddress((const GLubyte*)"glEndFragmentShaderATI")) == NULL) || r; + r = ((glGenFragmentShadersATI = (PFNGLGENFRAGMENTSHADERSATIPROC)glewGetProcAddress((const GLubyte*)"glGenFragmentShadersATI")) == NULL) || r; + r = ((glPassTexCoordATI = (PFNGLPASSTEXCOORDATIPROC)glewGetProcAddress((const GLubyte*)"glPassTexCoordATI")) == NULL) || r; + r = ((glSampleMapATI = (PFNGLSAMPLEMAPATIPROC)glewGetProcAddress((const GLubyte*)"glSampleMapATI")) == NULL) || r; + r = ((glSetFragmentShaderConstantATI = (PFNGLSETFRAGMENTSHADERCONSTANTATIPROC)glewGetProcAddress((const GLubyte*)"glSetFragmentShaderConstantATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_fragment_shader */ + +#ifdef GL_ATI_map_object_buffer + +static GLboolean _glewInit_GL_ATI_map_object_buffer (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMapObjectBufferATI = (PFNGLMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glMapObjectBufferATI")) == NULL) || r; + r = ((glUnmapObjectBufferATI = (PFNGLUNMAPOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUnmapObjectBufferATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_map_object_buffer */ + +#ifdef GL_ATI_pn_triangles + +static GLboolean _glewInit_GL_ATI_pn_triangles (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPNTrianglesfATI = (PFNGLPNTRIANGLESFATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesfATI")) == NULL) || r; + r = ((glPNTrianglesiATI = (PFNGLPNTRIANGLESIATIPROC)glewGetProcAddress((const GLubyte*)"glPNTrianglesiATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_pn_triangles */ + +#ifdef GL_ATI_separate_stencil + +static GLboolean _glewInit_GL_ATI_separate_stencil (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glStencilFuncSeparateATI = (PFNGLSTENCILFUNCSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilFuncSeparateATI")) == NULL) || r; + r = ((glStencilOpSeparateATI = (PFNGLSTENCILOPSEPARATEATIPROC)glewGetProcAddress((const GLubyte*)"glStencilOpSeparateATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_separate_stencil */ + +#ifdef GL_ATI_vertex_array_object + +static GLboolean _glewInit_GL_ATI_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glArrayObjectATI = (PFNGLARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glArrayObjectATI")) == NULL) || r; + r = ((glFreeObjectBufferATI = (PFNGLFREEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glFreeObjectBufferATI")) == NULL) || r; + r = ((glGetArrayObjectfvATI = (PFNGLGETARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectfvATI")) == NULL) || r; + r = ((glGetArrayObjectivATI = (PFNGLGETARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetArrayObjectivATI")) == NULL) || r; + r = ((glGetObjectBufferfvATI = (PFNGLGETOBJECTBUFFERFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferfvATI")) == NULL) || r; + r = ((glGetObjectBufferivATI = (PFNGLGETOBJECTBUFFERIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetObjectBufferivATI")) == NULL) || r; + r = ((glGetVariantArrayObjectfvATI = (PFNGLGETVARIANTARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectfvATI")) == NULL) || r; + r = ((glGetVariantArrayObjectivATI = (PFNGLGETVARIANTARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVariantArrayObjectivATI")) == NULL) || r; + r = ((glIsObjectBufferATI = (PFNGLISOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glIsObjectBufferATI")) == NULL) || r; + r = ((glNewObjectBufferATI = (PFNGLNEWOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glNewObjectBufferATI")) == NULL) || r; + r = ((glUpdateObjectBufferATI = (PFNGLUPDATEOBJECTBUFFERATIPROC)glewGetProcAddress((const GLubyte*)"glUpdateObjectBufferATI")) == NULL) || r; + r = ((glVariantArrayObjectATI = (PFNGLVARIANTARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVariantArrayObjectATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_vertex_array_object */ + +#ifdef GL_ATI_vertex_attrib_array_object + +static GLboolean _glewInit_GL_ATI_vertex_attrib_array_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetVertexAttribArrayObjectfvATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectfvATI")) == NULL) || r; + r = ((glGetVertexAttribArrayObjectivATI = (PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribArrayObjectivATI")) == NULL) || r; + r = ((glVertexAttribArrayObjectATI = (PFNGLVERTEXATTRIBARRAYOBJECTATIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribArrayObjectATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_vertex_attrib_array_object */ + +#ifdef GL_ATI_vertex_streams + +static GLboolean _glewInit_GL_ATI_vertex_streams (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClientActiveVertexStreamATI = (PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC)glewGetProcAddress((const GLubyte*)"glClientActiveVertexStreamATI")) == NULL) || r; + r = ((glNormalStream3bATI = (PFNGLNORMALSTREAM3BATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bATI")) == NULL) || r; + r = ((glNormalStream3bvATI = (PFNGLNORMALSTREAM3BVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3bvATI")) == NULL) || r; + r = ((glNormalStream3dATI = (PFNGLNORMALSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dATI")) == NULL) || r; + r = ((glNormalStream3dvATI = (PFNGLNORMALSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3dvATI")) == NULL) || r; + r = ((glNormalStream3fATI = (PFNGLNORMALSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fATI")) == NULL) || r; + r = ((glNormalStream3fvATI = (PFNGLNORMALSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3fvATI")) == NULL) || r; + r = ((glNormalStream3iATI = (PFNGLNORMALSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3iATI")) == NULL) || r; + r = ((glNormalStream3ivATI = (PFNGLNORMALSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3ivATI")) == NULL) || r; + r = ((glNormalStream3sATI = (PFNGLNORMALSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3sATI")) == NULL) || r; + r = ((glNormalStream3svATI = (PFNGLNORMALSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glNormalStream3svATI")) == NULL) || r; + r = ((glVertexBlendEnvfATI = (PFNGLVERTEXBLENDENVFATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnvfATI")) == NULL) || r; + r = ((glVertexBlendEnviATI = (PFNGLVERTEXBLENDENVIATIPROC)glewGetProcAddress((const GLubyte*)"glVertexBlendEnviATI")) == NULL) || r; + r = ((glVertexStream1dATI = (PFNGLVERTEXSTREAM1DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dATI")) == NULL) || r; + r = ((glVertexStream1dvATI = (PFNGLVERTEXSTREAM1DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1dvATI")) == NULL) || r; + r = ((glVertexStream1fATI = (PFNGLVERTEXSTREAM1FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fATI")) == NULL) || r; + r = ((glVertexStream1fvATI = (PFNGLVERTEXSTREAM1FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1fvATI")) == NULL) || r; + r = ((glVertexStream1iATI = (PFNGLVERTEXSTREAM1IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1iATI")) == NULL) || r; + r = ((glVertexStream1ivATI = (PFNGLVERTEXSTREAM1IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1ivATI")) == NULL) || r; + r = ((glVertexStream1sATI = (PFNGLVERTEXSTREAM1SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1sATI")) == NULL) || r; + r = ((glVertexStream1svATI = (PFNGLVERTEXSTREAM1SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream1svATI")) == NULL) || r; + r = ((glVertexStream2dATI = (PFNGLVERTEXSTREAM2DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dATI")) == NULL) || r; + r = ((glVertexStream2dvATI = (PFNGLVERTEXSTREAM2DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2dvATI")) == NULL) || r; + r = ((glVertexStream2fATI = (PFNGLVERTEXSTREAM2FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fATI")) == NULL) || r; + r = ((glVertexStream2fvATI = (PFNGLVERTEXSTREAM2FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2fvATI")) == NULL) || r; + r = ((glVertexStream2iATI = (PFNGLVERTEXSTREAM2IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2iATI")) == NULL) || r; + r = ((glVertexStream2ivATI = (PFNGLVERTEXSTREAM2IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2ivATI")) == NULL) || r; + r = ((glVertexStream2sATI = (PFNGLVERTEXSTREAM2SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2sATI")) == NULL) || r; + r = ((glVertexStream2svATI = (PFNGLVERTEXSTREAM2SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream2svATI")) == NULL) || r; + r = ((glVertexStream3dATI = (PFNGLVERTEXSTREAM3DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dATI")) == NULL) || r; + r = ((glVertexStream3dvATI = (PFNGLVERTEXSTREAM3DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3dvATI")) == NULL) || r; + r = ((glVertexStream3fATI = (PFNGLVERTEXSTREAM3FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fATI")) == NULL) || r; + r = ((glVertexStream3fvATI = (PFNGLVERTEXSTREAM3FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3fvATI")) == NULL) || r; + r = ((glVertexStream3iATI = (PFNGLVERTEXSTREAM3IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3iATI")) == NULL) || r; + r = ((glVertexStream3ivATI = (PFNGLVERTEXSTREAM3IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3ivATI")) == NULL) || r; + r = ((glVertexStream3sATI = (PFNGLVERTEXSTREAM3SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3sATI")) == NULL) || r; + r = ((glVertexStream3svATI = (PFNGLVERTEXSTREAM3SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream3svATI")) == NULL) || r; + r = ((glVertexStream4dATI = (PFNGLVERTEXSTREAM4DATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dATI")) == NULL) || r; + r = ((glVertexStream4dvATI = (PFNGLVERTEXSTREAM4DVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4dvATI")) == NULL) || r; + r = ((glVertexStream4fATI = (PFNGLVERTEXSTREAM4FATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fATI")) == NULL) || r; + r = ((glVertexStream4fvATI = (PFNGLVERTEXSTREAM4FVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4fvATI")) == NULL) || r; + r = ((glVertexStream4iATI = (PFNGLVERTEXSTREAM4IATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4iATI")) == NULL) || r; + r = ((glVertexStream4ivATI = (PFNGLVERTEXSTREAM4IVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4ivATI")) == NULL) || r; + r = ((glVertexStream4sATI = (PFNGLVERTEXSTREAM4SATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4sATI")) == NULL) || r; + r = ((glVertexStream4svATI = (PFNGLVERTEXSTREAM4SVATIPROC)glewGetProcAddress((const GLubyte*)"glVertexStream4svATI")) == NULL) || r; + + return r; +} + +#endif /* GL_ATI_vertex_streams */ + +#ifdef GL_EXT_bindable_uniform + +static GLboolean _glewInit_GL_EXT_bindable_uniform (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetUniformBufferSizeEXT = (PFNGLGETUNIFORMBUFFERSIZEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBufferSizeEXT")) == NULL) || r; + r = ((glGetUniformOffsetEXT = (PFNGLGETUNIFORMOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformOffsetEXT")) == NULL) || r; + r = ((glUniformBufferEXT = (PFNGLUNIFORMBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUniformBufferEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_bindable_uniform */ + +#ifdef GL_EXT_blend_color + +static GLboolean _glewInit_GL_EXT_blend_color (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendColorEXT = (PFNGLBLENDCOLOREXTPROC)glewGetProcAddress((const GLubyte*)"glBlendColorEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_blend_color */ + +#ifdef GL_EXT_blend_equation_separate + +static GLboolean _glewInit_GL_EXT_blend_equation_separate (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquationSeparateEXT = (PFNGLBLENDEQUATIONSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_blend_equation_separate */ + +#ifdef GL_EXT_blend_func_separate + +static GLboolean _glewInit_GL_EXT_blend_func_separate (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendFuncSeparateEXT = (PFNGLBLENDFUNCSEPARATEEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_blend_func_separate */ + +#ifdef GL_EXT_blend_minmax + +static GLboolean _glewInit_GL_EXT_blend_minmax (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendEquationEXT = (PFNGLBLENDEQUATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_blend_minmax */ + +#ifdef GL_EXT_color_subtable + +static GLboolean _glewInit_GL_EXT_color_subtable (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColorSubTableEXT = (PFNGLCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorSubTableEXT")) == NULL) || r; + r = ((glCopyColorSubTableEXT = (PFNGLCOPYCOLORSUBTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyColorSubTableEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_color_subtable */ + +#ifdef GL_EXT_compiled_vertex_array + +static GLboolean _glewInit_GL_EXT_compiled_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glLockArraysEXT = (PFNGLLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glLockArraysEXT")) == NULL) || r; + r = ((glUnlockArraysEXT = (PFNGLUNLOCKARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glUnlockArraysEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_compiled_vertex_array */ + +#ifdef GL_EXT_convolution + +static GLboolean _glewInit_GL_EXT_convolution (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glConvolutionFilter1DEXT = (PFNGLCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter1DEXT")) == NULL) || r; + r = ((glConvolutionFilter2DEXT = (PFNGLCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionFilter2DEXT")) == NULL) || r; + r = ((glConvolutionParameterfEXT = (PFNGLCONVOLUTIONPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfEXT")) == NULL) || r; + r = ((glConvolutionParameterfvEXT = (PFNGLCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterfvEXT")) == NULL) || r; + r = ((glConvolutionParameteriEXT = (PFNGLCONVOLUTIONPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameteriEXT")) == NULL) || r; + r = ((glConvolutionParameterivEXT = (PFNGLCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glConvolutionParameterivEXT")) == NULL) || r; + r = ((glCopyConvolutionFilter1DEXT = (PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter1DEXT")) == NULL) || r; + r = ((glCopyConvolutionFilter2DEXT = (PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyConvolutionFilter2DEXT")) == NULL) || r; + r = ((glGetConvolutionFilterEXT = (PFNGLGETCONVOLUTIONFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionFilterEXT")) == NULL) || r; + r = ((glGetConvolutionParameterfvEXT = (PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterfvEXT")) == NULL) || r; + r = ((glGetConvolutionParameterivEXT = (PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetConvolutionParameterivEXT")) == NULL) || r; + r = ((glGetSeparableFilterEXT = (PFNGLGETSEPARABLEFILTEREXTPROC)glewGetProcAddress((const GLubyte*)"glGetSeparableFilterEXT")) == NULL) || r; + r = ((glSeparableFilter2DEXT = (PFNGLSEPARABLEFILTER2DEXTPROC)glewGetProcAddress((const GLubyte*)"glSeparableFilter2DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_convolution */ + +#ifdef GL_EXT_coordinate_frame + +static GLboolean _glewInit_GL_EXT_coordinate_frame (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBinormalPointerEXT = (PFNGLBINORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glBinormalPointerEXT")) == NULL) || r; + r = ((glTangentPointerEXT = (PFNGLTANGENTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTangentPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_coordinate_frame */ + +#ifdef GL_EXT_copy_texture + +static GLboolean _glewInit_GL_EXT_copy_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCopyTexImage1DEXT = (PFNGLCOPYTEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage1DEXT")) == NULL) || r; + r = ((glCopyTexImage2DEXT = (PFNGLCOPYTEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexImage2DEXT")) == NULL) || r; + r = ((glCopyTexSubImage1DEXT = (PFNGLCOPYTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage1DEXT")) == NULL) || r; + r = ((glCopyTexSubImage2DEXT = (PFNGLCOPYTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage2DEXT")) == NULL) || r; + r = ((glCopyTexSubImage3DEXT = (PFNGLCOPYTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTexSubImage3DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_copy_texture */ + +#ifdef GL_EXT_cull_vertex + +static GLboolean _glewInit_GL_EXT_cull_vertex (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCullParameterdvEXT = (PFNGLCULLPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterdvEXT")) == NULL) || r; + r = ((glCullParameterfvEXT = (PFNGLCULLPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glCullParameterfvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_cull_vertex */ + +#ifdef GL_EXT_debug_label + +static GLboolean _glewInit_GL_EXT_debug_label (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetObjectLabelEXT = (PFNGLGETOBJECTLABELEXTPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabelEXT")) == NULL) || r; + r = ((glLabelObjectEXT = (PFNGLLABELOBJECTEXTPROC)glewGetProcAddress((const GLubyte*)"glLabelObjectEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_debug_label */ + +#ifdef GL_EXT_debug_marker + +static GLboolean _glewInit_GL_EXT_debug_marker (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glInsertEventMarkerEXT = (PFNGLINSERTEVENTMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glInsertEventMarkerEXT")) == NULL) || r; + r = ((glPopGroupMarkerEXT = (PFNGLPOPGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPopGroupMarkerEXT")) == NULL) || r; + r = ((glPushGroupMarkerEXT = (PFNGLPUSHGROUPMARKEREXTPROC)glewGetProcAddress((const GLubyte*)"glPushGroupMarkerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_debug_marker */ + +#ifdef GL_EXT_depth_bounds_test + +static GLboolean _glewInit_GL_EXT_depth_bounds_test (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDepthBoundsEXT = (PFNGLDEPTHBOUNDSEXTPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_depth_bounds_test */ + +#ifdef GL_EXT_direct_state_access + +static GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindMultiTextureEXT = (PFNGLBINDMULTITEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindMultiTextureEXT")) == NULL) || r; + r = ((glCheckNamedFramebufferStatusEXT = (PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckNamedFramebufferStatusEXT")) == NULL) || r; + r = ((glClientAttribDefaultEXT = (PFNGLCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glClientAttribDefaultEXT")) == NULL) || r; + r = ((glCompressedMultiTexImage1DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage1DEXT")) == NULL) || r; + r = ((glCompressedMultiTexImage2DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage2DEXT")) == NULL) || r; + r = ((glCompressedMultiTexImage3DEXT = (PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexImage3DEXT")) == NULL) || r; + r = ((glCompressedMultiTexSubImage1DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage1DEXT")) == NULL) || r; + r = ((glCompressedMultiTexSubImage2DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage2DEXT")) == NULL) || r; + r = ((glCompressedMultiTexSubImage3DEXT = (PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedMultiTexSubImage3DEXT")) == NULL) || r; + r = ((glCompressedTextureImage1DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage1DEXT")) == NULL) || r; + r = ((glCompressedTextureImage2DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage2DEXT")) == NULL) || r; + r = ((glCompressedTextureImage3DEXT = (PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureImage3DEXT")) == NULL) || r; + r = ((glCompressedTextureSubImage1DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage1DEXT")) == NULL) || r; + r = ((glCompressedTextureSubImage2DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage2DEXT")) == NULL) || r; + r = ((glCompressedTextureSubImage3DEXT = (PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCompressedTextureSubImage3DEXT")) == NULL) || r; + r = ((glCopyMultiTexImage1DEXT = (PFNGLCOPYMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage1DEXT")) == NULL) || r; + r = ((glCopyMultiTexImage2DEXT = (PFNGLCOPYMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexImage2DEXT")) == NULL) || r; + r = ((glCopyMultiTexSubImage1DEXT = (PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage1DEXT")) == NULL) || r; + r = ((glCopyMultiTexSubImage2DEXT = (PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage2DEXT")) == NULL) || r; + r = ((glCopyMultiTexSubImage3DEXT = (PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyMultiTexSubImage3DEXT")) == NULL) || r; + r = ((glCopyTextureImage1DEXT = (PFNGLCOPYTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage1DEXT")) == NULL) || r; + r = ((glCopyTextureImage2DEXT = (PFNGLCOPYTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureImage2DEXT")) == NULL) || r; + r = ((glCopyTextureSubImage1DEXT = (PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage1DEXT")) == NULL) || r; + r = ((glCopyTextureSubImage2DEXT = (PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2DEXT")) == NULL) || r; + r = ((glCopyTextureSubImage3DEXT = (PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3DEXT")) == NULL) || r; + r = ((glDisableClientStateIndexedEXT = (PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateIndexedEXT")) == NULL) || r; + r = ((glDisableClientStateiEXT = (PFNGLDISABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateiEXT")) == NULL) || r; + r = ((glDisableVertexArrayAttribEXT = (PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttribEXT")) == NULL) || r; + r = ((glDisableVertexArrayEXT = (PFNGLDISABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayEXT")) == NULL) || r; + r = ((glEnableClientStateIndexedEXT = (PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateIndexedEXT")) == NULL) || r; + r = ((glEnableClientStateiEXT = (PFNGLENABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateiEXT")) == NULL) || r; + r = ((glEnableVertexArrayAttribEXT = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttribEXT")) == NULL) || r; + r = ((glEnableVertexArrayEXT = (PFNGLENABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayEXT")) == NULL) || r; + r = ((glFlushMappedNamedBufferRangeEXT = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRangeEXT")) == NULL) || r; + r = ((glFramebufferDrawBufferEXT = (PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBufferEXT")) == NULL) || r; + r = ((glFramebufferDrawBuffersEXT = (PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBuffersEXT")) == NULL) || r; + r = ((glFramebufferReadBufferEXT = (PFNGLFRAMEBUFFERREADBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferReadBufferEXT")) == NULL) || r; + r = ((glGenerateMultiTexMipmapEXT = (PFNGLGENERATEMULTITEXMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMultiTexMipmapEXT")) == NULL) || r; + r = ((glGenerateTextureMipmapEXT = (PFNGLGENERATETEXTUREMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateTextureMipmapEXT")) == NULL) || r; + r = ((glGetCompressedMultiTexImageEXT = (PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedMultiTexImageEXT")) == NULL) || r; + r = ((glGetCompressedTextureImageEXT = (PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImageEXT")) == NULL) || r; + r = ((glGetDoubleIndexedvEXT = (PFNGLGETDOUBLEINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoubleIndexedvEXT")) == NULL) || r; + r = ((glGetDoublei_vEXT = (PFNGLGETDOUBLEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_vEXT")) == NULL) || r; + r = ((glGetFloatIndexedvEXT = (PFNGLGETFLOATINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloatIndexedvEXT")) == NULL) || r; + r = ((glGetFloati_vEXT = (PFNGLGETFLOATI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vEXT")) == NULL) || r; + r = ((glGetFramebufferParameterivEXT = (PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterivEXT")) == NULL) || r; + r = ((glGetMultiTexEnvfvEXT = (PFNGLGETMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvfvEXT")) == NULL) || r; + r = ((glGetMultiTexEnvivEXT = (PFNGLGETMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvivEXT")) == NULL) || r; + r = ((glGetMultiTexGendvEXT = (PFNGLGETMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGendvEXT")) == NULL) || r; + r = ((glGetMultiTexGenfvEXT = (PFNGLGETMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenfvEXT")) == NULL) || r; + r = ((glGetMultiTexGenivEXT = (PFNGLGETMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexGenivEXT")) == NULL) || r; + r = ((glGetMultiTexImageEXT = (PFNGLGETMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexImageEXT")) == NULL) || r; + r = ((glGetMultiTexLevelParameterfvEXT = (PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterfvEXT")) == NULL) || r; + r = ((glGetMultiTexLevelParameterivEXT = (PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexLevelParameterivEXT")) == NULL) || r; + r = ((glGetMultiTexParameterIivEXT = (PFNGLGETMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIivEXT")) == NULL) || r; + r = ((glGetMultiTexParameterIuivEXT = (PFNGLGETMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterIuivEXT")) == NULL) || r; + r = ((glGetMultiTexParameterfvEXT = (PFNGLGETMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterfvEXT")) == NULL) || r; + r = ((glGetMultiTexParameterivEXT = (PFNGLGETMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexParameterivEXT")) == NULL) || r; + r = ((glGetNamedBufferParameterivEXT = (PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterivEXT")) == NULL) || r; + r = ((glGetNamedBufferPointervEXT = (PFNGLGETNAMEDBUFFERPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferPointervEXT")) == NULL) || r; + r = ((glGetNamedBufferSubDataEXT = (PFNGLGETNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferSubDataEXT")) == NULL) || r; + r = ((glGetNamedFramebufferAttachmentParameterivEXT = (PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedFramebufferAttachmentParameterivEXT")) == NULL) || r; + r = ((glGetNamedProgramLocalParameterIivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIivEXT")) == NULL) || r; + r = ((glGetNamedProgramLocalParameterIuivEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterIuivEXT")) == NULL) || r; + r = ((glGetNamedProgramLocalParameterdvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterdvEXT")) == NULL) || r; + r = ((glGetNamedProgramLocalParameterfvEXT = (PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramLocalParameterfvEXT")) == NULL) || r; + r = ((glGetNamedProgramStringEXT = (PFNGLGETNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramStringEXT")) == NULL) || r; + r = ((glGetNamedProgramivEXT = (PFNGLGETNAMEDPROGRAMIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramivEXT")) == NULL) || r; + r = ((glGetNamedRenderbufferParameterivEXT = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameterivEXT")) == NULL) || r; + r = ((glGetPointerIndexedvEXT = (PFNGLGETPOINTERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointerIndexedvEXT")) == NULL) || r; + r = ((glGetPointeri_vEXT = (PFNGLGETPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointeri_vEXT")) == NULL) || r; + r = ((glGetTextureImageEXT = (PFNGLGETTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImageEXT")) == NULL) || r; + r = ((glGetTextureLevelParameterfvEXT = (PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfvEXT")) == NULL) || r; + r = ((glGetTextureLevelParameterivEXT = (PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterivEXT")) == NULL) || r; + r = ((glGetTextureParameterIivEXT = (PFNGLGETTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIivEXT")) == NULL) || r; + r = ((glGetTextureParameterIuivEXT = (PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuivEXT")) == NULL) || r; + r = ((glGetTextureParameterfvEXT = (PFNGLGETTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfvEXT")) == NULL) || r; + r = ((glGetTextureParameterivEXT = (PFNGLGETTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterivEXT")) == NULL) || r; + r = ((glGetVertexArrayIntegeri_vEXT = (PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegeri_vEXT")) == NULL) || r; + r = ((glGetVertexArrayIntegervEXT = (PFNGLGETVERTEXARRAYINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegervEXT")) == NULL) || r; + r = ((glGetVertexArrayPointeri_vEXT = (PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointeri_vEXT")) == NULL) || r; + r = ((glGetVertexArrayPointervEXT = (PFNGLGETVERTEXARRAYPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointervEXT")) == NULL) || r; + r = ((glMapNamedBufferEXT = (PFNGLMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferEXT")) == NULL) || r; + r = ((glMapNamedBufferRangeEXT = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRangeEXT")) == NULL) || r; + r = ((glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixFrustumEXT")) == NULL) || r; + r = ((glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadIdentityEXT")) == NULL) || r; + r = ((glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposedEXT")) == NULL) || r; + r = ((glMatrixLoadTransposefEXT = (PFNGLMATRIXLOADTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposefEXT")) == NULL) || r; + r = ((glMatrixLoaddEXT = (PFNGLMATRIXLOADDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoaddEXT")) == NULL) || r; + r = ((glMatrixLoadfEXT = (PFNGLMATRIXLOADFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadfEXT")) == NULL) || r; + r = ((glMatrixMultTransposedEXT = (PFNGLMATRIXMULTTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposedEXT")) == NULL) || r; + r = ((glMatrixMultTransposefEXT = (PFNGLMATRIXMULTTRANSPOSEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTransposefEXT")) == NULL) || r; + r = ((glMatrixMultdEXT = (PFNGLMATRIXMULTDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultdEXT")) == NULL) || r; + r = ((glMatrixMultfEXT = (PFNGLMATRIXMULTFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultfEXT")) == NULL) || r; + r = ((glMatrixOrthoEXT = (PFNGLMATRIXORTHOEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixOrthoEXT")) == NULL) || r; + r = ((glMatrixPopEXT = (PFNGLMATRIXPOPEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPopEXT")) == NULL) || r; + r = ((glMatrixPushEXT = (PFNGLMATRIXPUSHEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixPushEXT")) == NULL) || r; + r = ((glMatrixRotatedEXT = (PFNGLMATRIXROTATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatedEXT")) == NULL) || r; + r = ((glMatrixRotatefEXT = (PFNGLMATRIXROTATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixRotatefEXT")) == NULL) || r; + r = ((glMatrixScaledEXT = (PFNGLMATRIXSCALEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScaledEXT")) == NULL) || r; + r = ((glMatrixScalefEXT = (PFNGLMATRIXSCALEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixScalefEXT")) == NULL) || r; + r = ((glMatrixTranslatedEXT = (PFNGLMATRIXTRANSLATEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatedEXT")) == NULL) || r; + r = ((glMatrixTranslatefEXT = (PFNGLMATRIXTRANSLATEFEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixTranslatefEXT")) == NULL) || r; + r = ((glMultiTexBufferEXT = (PFNGLMULTITEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexBufferEXT")) == NULL) || r; + r = ((glMultiTexCoordPointerEXT = (PFNGLMULTITEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordPointerEXT")) == NULL) || r; + r = ((glMultiTexEnvfEXT = (PFNGLMULTITEXENVFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfEXT")) == NULL) || r; + r = ((glMultiTexEnvfvEXT = (PFNGLMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvfvEXT")) == NULL) || r; + r = ((glMultiTexEnviEXT = (PFNGLMULTITEXENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnviEXT")) == NULL) || r; + r = ((glMultiTexEnvivEXT = (PFNGLMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexEnvivEXT")) == NULL) || r; + r = ((glMultiTexGendEXT = (PFNGLMULTITEXGENDEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendEXT")) == NULL) || r; + r = ((glMultiTexGendvEXT = (PFNGLMULTITEXGENDVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGendvEXT")) == NULL) || r; + r = ((glMultiTexGenfEXT = (PFNGLMULTITEXGENFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfEXT")) == NULL) || r; + r = ((glMultiTexGenfvEXT = (PFNGLMULTITEXGENFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenfvEXT")) == NULL) || r; + r = ((glMultiTexGeniEXT = (PFNGLMULTITEXGENIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGeniEXT")) == NULL) || r; + r = ((glMultiTexGenivEXT = (PFNGLMULTITEXGENIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexGenivEXT")) == NULL) || r; + r = ((glMultiTexImage1DEXT = (PFNGLMULTITEXIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage1DEXT")) == NULL) || r; + r = ((glMultiTexImage2DEXT = (PFNGLMULTITEXIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage2DEXT")) == NULL) || r; + r = ((glMultiTexImage3DEXT = (PFNGLMULTITEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexImage3DEXT")) == NULL) || r; + r = ((glMultiTexParameterIivEXT = (PFNGLMULTITEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIivEXT")) == NULL) || r; + r = ((glMultiTexParameterIuivEXT = (PFNGLMULTITEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterIuivEXT")) == NULL) || r; + r = ((glMultiTexParameterfEXT = (PFNGLMULTITEXPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfEXT")) == NULL) || r; + r = ((glMultiTexParameterfvEXT = (PFNGLMULTITEXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterfvEXT")) == NULL) || r; + r = ((glMultiTexParameteriEXT = (PFNGLMULTITEXPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameteriEXT")) == NULL) || r; + r = ((glMultiTexParameterivEXT = (PFNGLMULTITEXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexParameterivEXT")) == NULL) || r; + r = ((glMultiTexRenderbufferEXT = (PFNGLMULTITEXRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexRenderbufferEXT")) == NULL) || r; + r = ((glMultiTexSubImage1DEXT = (PFNGLMULTITEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage1DEXT")) == NULL) || r; + r = ((glMultiTexSubImage2DEXT = (PFNGLMULTITEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage2DEXT")) == NULL) || r; + r = ((glMultiTexSubImage3DEXT = (PFNGLMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage3DEXT")) == NULL) || r; + r = ((glNamedBufferDataEXT = (PFNGLNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferDataEXT")) == NULL) || r; + r = ((glNamedBufferSubDataEXT = (PFNGLNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubDataEXT")) == NULL) || r; + r = ((glNamedCopyBufferSubDataEXT = (PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedCopyBufferSubDataEXT")) == NULL) || r; + r = ((glNamedFramebufferRenderbufferEXT = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbufferEXT")) == NULL) || r; + r = ((glNamedFramebufferTexture1DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture1DEXT")) == NULL) || r; + r = ((glNamedFramebufferTexture2DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture2DEXT")) == NULL) || r; + r = ((glNamedFramebufferTexture3DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture3DEXT")) == NULL) || r; + r = ((glNamedFramebufferTextureEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureEXT")) == NULL) || r; + r = ((glNamedFramebufferTextureFaceEXT = (PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureFaceEXT")) == NULL) || r; + r = ((glNamedFramebufferTextureLayerEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTextureLayerEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameter4dEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameter4dvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4dvEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameter4fEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameter4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameter4fvEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameterI4iEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4iEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameterI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4ivEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameterI4uiEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uiEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameterI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameterI4uivEXT")) == NULL) || r; + r = ((glNamedProgramLocalParameters4fvEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParameters4fvEXT")) == NULL) || r; + r = ((glNamedProgramLocalParametersI4ivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4ivEXT")) == NULL) || r; + r = ((glNamedProgramLocalParametersI4uivEXT = (PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramLocalParametersI4uivEXT")) == NULL) || r; + r = ((glNamedProgramStringEXT = (PFNGLNAMEDPROGRAMSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedProgramStringEXT")) == NULL) || r; + r = ((glNamedRenderbufferStorageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageEXT")) == NULL) || r; + r = ((glNamedRenderbufferStorageMultisampleCoverageEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleCoverageEXT")) == NULL) || r; + r = ((glNamedRenderbufferStorageMultisampleEXT = (PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedRenderbufferStorageMultisampleEXT")) == NULL) || r; + r = ((glProgramUniform1fEXT = (PFNGLPROGRAMUNIFORM1FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fEXT")) == NULL) || r; + r = ((glProgramUniform1fvEXT = (PFNGLPROGRAMUNIFORM1FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fvEXT")) == NULL) || r; + r = ((glProgramUniform1iEXT = (PFNGLPROGRAMUNIFORM1IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iEXT")) == NULL) || r; + r = ((glProgramUniform1ivEXT = (PFNGLPROGRAMUNIFORM1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ivEXT")) == NULL) || r; + r = ((glProgramUniform1uiEXT = (PFNGLPROGRAMUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiEXT")) == NULL) || r; + r = ((glProgramUniform1uivEXT = (PFNGLPROGRAMUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uivEXT")) == NULL) || r; + r = ((glProgramUniform2fEXT = (PFNGLPROGRAMUNIFORM2FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fEXT")) == NULL) || r; + r = ((glProgramUniform2fvEXT = (PFNGLPROGRAMUNIFORM2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fvEXT")) == NULL) || r; + r = ((glProgramUniform2iEXT = (PFNGLPROGRAMUNIFORM2IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iEXT")) == NULL) || r; + r = ((glProgramUniform2ivEXT = (PFNGLPROGRAMUNIFORM2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ivEXT")) == NULL) || r; + r = ((glProgramUniform2uiEXT = (PFNGLPROGRAMUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiEXT")) == NULL) || r; + r = ((glProgramUniform2uivEXT = (PFNGLPROGRAMUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uivEXT")) == NULL) || r; + r = ((glProgramUniform3fEXT = (PFNGLPROGRAMUNIFORM3FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fEXT")) == NULL) || r; + r = ((glProgramUniform3fvEXT = (PFNGLPROGRAMUNIFORM3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fvEXT")) == NULL) || r; + r = ((glProgramUniform3iEXT = (PFNGLPROGRAMUNIFORM3IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iEXT")) == NULL) || r; + r = ((glProgramUniform3ivEXT = (PFNGLPROGRAMUNIFORM3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ivEXT")) == NULL) || r; + r = ((glProgramUniform3uiEXT = (PFNGLPROGRAMUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiEXT")) == NULL) || r; + r = ((glProgramUniform3uivEXT = (PFNGLPROGRAMUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uivEXT")) == NULL) || r; + r = ((glProgramUniform4fEXT = (PFNGLPROGRAMUNIFORM4FEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fEXT")) == NULL) || r; + r = ((glProgramUniform4fvEXT = (PFNGLPROGRAMUNIFORM4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fvEXT")) == NULL) || r; + r = ((glProgramUniform4iEXT = (PFNGLPROGRAMUNIFORM4IEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iEXT")) == NULL) || r; + r = ((glProgramUniform4ivEXT = (PFNGLPROGRAMUNIFORM4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ivEXT")) == NULL) || r; + r = ((glProgramUniform4uiEXT = (PFNGLPROGRAMUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiEXT")) == NULL) || r; + r = ((glProgramUniform4uivEXT = (PFNGLPROGRAMUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uivEXT")) == NULL) || r; + r = ((glProgramUniformMatrix2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix2x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix2x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix3x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix3x4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix4fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix4x2fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fvEXT")) == NULL) || r; + r = ((glProgramUniformMatrix4x3fvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fvEXT")) == NULL) || r; + r = ((glPushClientAttribDefaultEXT = (PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC)glewGetProcAddress((const GLubyte*)"glPushClientAttribDefaultEXT")) == NULL) || r; + r = ((glTextureBufferEXT = (PFNGLTEXTUREBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureBufferEXT")) == NULL) || r; + r = ((glTextureImage1DEXT = (PFNGLTEXTUREIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage1DEXT")) == NULL) || r; + r = ((glTextureImage2DEXT = (PFNGLTEXTUREIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DEXT")) == NULL) || r; + r = ((glTextureImage3DEXT = (PFNGLTEXTUREIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DEXT")) == NULL) || r; + r = ((glTextureParameterIivEXT = (PFNGLTEXTUREPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIivEXT")) == NULL) || r; + r = ((glTextureParameterIuivEXT = (PFNGLTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterIuivEXT")) == NULL) || r; + r = ((glTextureParameterfEXT = (PFNGLTEXTUREPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfEXT")) == NULL) || r; + r = ((glTextureParameterfvEXT = (PFNGLTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterfvEXT")) == NULL) || r; + r = ((glTextureParameteriEXT = (PFNGLTEXTUREPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameteriEXT")) == NULL) || r; + r = ((glTextureParameterivEXT = (PFNGLTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureParameterivEXT")) == NULL) || r; + r = ((glTextureRenderbufferEXT = (PFNGLTEXTURERENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTextureRenderbufferEXT")) == NULL) || r; + r = ((glTextureSubImage1DEXT = (PFNGLTEXTURESUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage1DEXT")) == NULL) || r; + r = ((glTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2DEXT")) == NULL) || r; + r = ((glTextureSubImage3DEXT = (PFNGLTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3DEXT")) == NULL) || r; + r = ((glUnmapNamedBufferEXT = (PFNGLUNMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBufferEXT")) == NULL) || r; + r = ((glVertexArrayColorOffsetEXT = (PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayColorOffsetEXT")) == NULL) || r; + r = ((glVertexArrayEdgeFlagOffsetEXT = (PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayEdgeFlagOffsetEXT")) == NULL) || r; + r = ((glVertexArrayFogCoordOffsetEXT = (PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayFogCoordOffsetEXT")) == NULL) || r; + r = ((glVertexArrayIndexOffsetEXT = (PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayIndexOffsetEXT")) == NULL) || r; + r = ((glVertexArrayMultiTexCoordOffsetEXT = (PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayMultiTexCoordOffsetEXT")) == NULL) || r; + r = ((glVertexArrayNormalOffsetEXT = (PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayNormalOffsetEXT")) == NULL) || r; + r = ((glVertexArraySecondaryColorOffsetEXT = (PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArraySecondaryColorOffsetEXT")) == NULL) || r; + r = ((glVertexArrayTexCoordOffsetEXT = (PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayTexCoordOffsetEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribDivisorEXT = (PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribDivisorEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribIOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIOffsetEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribOffsetEXT")) == NULL) || r; + r = ((glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexOffsetEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_direct_state_access */ + +#ifdef GL_EXT_draw_buffers2 + +static GLboolean _glewInit_GL_EXT_draw_buffers2 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColorMaskIndexedEXT = (PFNGLCOLORMASKINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glColorMaskIndexedEXT")) == NULL) || r; + r = ((glDisableIndexedEXT = (PFNGLDISABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableIndexedEXT")) == NULL) || r; + r = ((glEnableIndexedEXT = (PFNGLENABLEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableIndexedEXT")) == NULL) || r; + r = ((glGetBooleanIndexedvEXT = (PFNGLGETBOOLEANINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetBooleanIndexedvEXT")) == NULL) || r; + r = ((glGetIntegerIndexedvEXT = (PFNGLGETINTEGERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerIndexedvEXT")) == NULL) || r; + r = ((glIsEnabledIndexedEXT = (PFNGLISENABLEDINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsEnabledIndexedEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_draw_buffers2 */ + +#ifdef GL_EXT_draw_instanced + +static GLboolean _glewInit_GL_EXT_draw_instanced (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawArraysInstancedEXT = (PFNGLDRAWARRAYSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstancedEXT")) == NULL) || r; + r = ((glDrawElementsInstancedEXT = (PFNGLDRAWELEMENTSINSTANCEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_draw_instanced */ + +#ifdef GL_EXT_draw_range_elements + +static GLboolean _glewInit_GL_EXT_draw_range_elements (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawRangeElementsEXT = (PFNGLDRAWRANGEELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_draw_range_elements */ + +#ifdef GL_EXT_fog_coord + +static GLboolean _glewInit_GL_EXT_fog_coord (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFogCoordPointerEXT = (PFNGLFOGCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerEXT")) == NULL) || r; + r = ((glFogCoorddEXT = (PFNGLFOGCOORDDEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddEXT")) == NULL) || r; + r = ((glFogCoorddvEXT = (PFNGLFOGCOORDDVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoorddvEXT")) == NULL) || r; + r = ((glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfEXT")) == NULL) || r; + r = ((glFogCoordfvEXT = (PFNGLFOGCOORDFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFogCoordfvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_fog_coord */ + +#ifdef GL_EXT_fragment_lighting + +static GLboolean _glewInit_GL_EXT_fragment_lighting (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFragmentColorMaterialEXT = (PFNGLFRAGMENTCOLORMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialEXT")) == NULL) || r; + r = ((glFragmentLightModelfEXT = (PFNGLFRAGMENTLIGHTMODELFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfEXT")) == NULL) || r; + r = ((glFragmentLightModelfvEXT = (PFNGLFRAGMENTLIGHTMODELFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvEXT")) == NULL) || r; + r = ((glFragmentLightModeliEXT = (PFNGLFRAGMENTLIGHTMODELIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliEXT")) == NULL) || r; + r = ((glFragmentLightModelivEXT = (PFNGLFRAGMENTLIGHTMODELIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivEXT")) == NULL) || r; + r = ((glFragmentLightfEXT = (PFNGLFRAGMENTLIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfEXT")) == NULL) || r; + r = ((glFragmentLightfvEXT = (PFNGLFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvEXT")) == NULL) || r; + r = ((glFragmentLightiEXT = (PFNGLFRAGMENTLIGHTIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiEXT")) == NULL) || r; + r = ((glFragmentLightivEXT = (PFNGLFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivEXT")) == NULL) || r; + r = ((glFragmentMaterialfEXT = (PFNGLFRAGMENTMATERIALFEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfEXT")) == NULL) || r; + r = ((glFragmentMaterialfvEXT = (PFNGLFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvEXT")) == NULL) || r; + r = ((glFragmentMaterialiEXT = (PFNGLFRAGMENTMATERIALIEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiEXT")) == NULL) || r; + r = ((glFragmentMaterialivEXT = (PFNGLFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivEXT")) == NULL) || r; + r = ((glGetFragmentLightfvEXT = (PFNGLGETFRAGMENTLIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvEXT")) == NULL) || r; + r = ((glGetFragmentLightivEXT = (PFNGLGETFRAGMENTLIGHTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivEXT")) == NULL) || r; + r = ((glGetFragmentMaterialfvEXT = (PFNGLGETFRAGMENTMATERIALFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvEXT")) == NULL) || r; + r = ((glGetFragmentMaterialivEXT = (PFNGLGETFRAGMENTMATERIALIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivEXT")) == NULL) || r; + r = ((glLightEnviEXT = (PFNGLLIGHTENVIEXTPROC)glewGetProcAddress((const GLubyte*)"glLightEnviEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_fragment_lighting */ + +#ifdef GL_EXT_framebuffer_blit + +static GLboolean _glewInit_GL_EXT_framebuffer_blit (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBlitFramebufferEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_framebuffer_blit */ + +#ifdef GL_EXT_framebuffer_multisample + +static GLboolean _glewInit_GL_EXT_framebuffer_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_framebuffer_multisample */ + +#ifdef GL_EXT_framebuffer_object + +static GLboolean _glewInit_GL_EXT_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindFramebufferEXT")) == NULL) || r; + r = ((glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindRenderbufferEXT")) == NULL) || r; + r = ((glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)glewGetProcAddress((const GLubyte*)"glCheckFramebufferStatusEXT")) == NULL) || r; + r = ((glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffersEXT")) == NULL) || r; + r = ((glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffersEXT")) == NULL) || r; + r = ((glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbufferEXT")) == NULL) || r; + r = ((glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1DEXT")) == NULL) || r; + r = ((glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2DEXT")) == NULL) || r; + r = ((glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3DEXT")) == NULL) || r; + r = ((glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffersEXT")) == NULL) || r; + r = ((glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffersEXT")) == NULL) || r; + r = ((glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmapEXT")) == NULL) || r; + r = ((glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferAttachmentParameterivEXT")) == NULL) || r; + r = ((glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetRenderbufferParameterivEXT")) == NULL) || r; + r = ((glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsFramebufferEXT")) == NULL) || r; + r = ((glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glIsRenderbufferEXT")) == NULL) || r; + r = ((glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_framebuffer_object */ + +#ifdef GL_EXT_geometry_shader4 + +static GLboolean _glewInit_GL_EXT_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferTextureEXT = (PFNGLFRAMEBUFFERTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureEXT")) == NULL) || r; + r = ((glFramebufferTextureFaceEXT = (PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureFaceEXT")) == NULL) || r; + r = ((glProgramParameteriEXT = (PFNGLPROGRAMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteriEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_geometry_shader4 */ + +#ifdef GL_EXT_gpu_program_parameters + +static GLboolean _glewInit_GL_EXT_gpu_program_parameters (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glProgramEnvParameters4fvEXT = (PFNGLPROGRAMENVPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameters4fvEXT")) == NULL) || r; + r = ((glProgramLocalParameters4fvEXT = (PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameters4fvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_gpu_program_parameters */ + +#ifdef GL_EXT_gpu_shader4 + +static GLboolean _glewInit_GL_EXT_gpu_shader4 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindFragDataLocationEXT = (PFNGLBINDFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationEXT")) == NULL) || r; + r = ((glGetFragDataLocationEXT = (PFNGLGETFRAGDATALOCATIONEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocationEXT")) == NULL) || r; + r = ((glGetUniformuivEXT = (PFNGLGETUNIFORMUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetUniformuivEXT")) == NULL) || r; + r = ((glGetVertexAttribIivEXT = (PFNGLGETVERTEXATTRIBIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIivEXT")) == NULL) || r; + r = ((glGetVertexAttribIuivEXT = (PFNGLGETVERTEXATTRIBIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribIuivEXT")) == NULL) || r; + r = ((glUniform1uiEXT = (PFNGLUNIFORM1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uiEXT")) == NULL) || r; + r = ((glUniform1uivEXT = (PFNGLUNIFORM1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform1uivEXT")) == NULL) || r; + r = ((glUniform2uiEXT = (PFNGLUNIFORM2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uiEXT")) == NULL) || r; + r = ((glUniform2uivEXT = (PFNGLUNIFORM2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform2uivEXT")) == NULL) || r; + r = ((glUniform3uiEXT = (PFNGLUNIFORM3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uiEXT")) == NULL) || r; + r = ((glUniform3uivEXT = (PFNGLUNIFORM3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform3uivEXT")) == NULL) || r; + r = ((glUniform4uiEXT = (PFNGLUNIFORM4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uiEXT")) == NULL) || r; + r = ((glUniform4uivEXT = (PFNGLUNIFORM4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glUniform4uivEXT")) == NULL) || r; + r = ((glVertexAttribI1iEXT = (PFNGLVERTEXATTRIBI1IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1iEXT")) == NULL) || r; + r = ((glVertexAttribI1ivEXT = (PFNGLVERTEXATTRIBI1IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1ivEXT")) == NULL) || r; + r = ((glVertexAttribI1uiEXT = (PFNGLVERTEXATTRIBI1UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uiEXT")) == NULL) || r; + r = ((glVertexAttribI1uivEXT = (PFNGLVERTEXATTRIBI1UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI1uivEXT")) == NULL) || r; + r = ((glVertexAttribI2iEXT = (PFNGLVERTEXATTRIBI2IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2iEXT")) == NULL) || r; + r = ((glVertexAttribI2ivEXT = (PFNGLVERTEXATTRIBI2IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2ivEXT")) == NULL) || r; + r = ((glVertexAttribI2uiEXT = (PFNGLVERTEXATTRIBI2UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uiEXT")) == NULL) || r; + r = ((glVertexAttribI2uivEXT = (PFNGLVERTEXATTRIBI2UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI2uivEXT")) == NULL) || r; + r = ((glVertexAttribI3iEXT = (PFNGLVERTEXATTRIBI3IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3iEXT")) == NULL) || r; + r = ((glVertexAttribI3ivEXT = (PFNGLVERTEXATTRIBI3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3ivEXT")) == NULL) || r; + r = ((glVertexAttribI3uiEXT = (PFNGLVERTEXATTRIBI3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uiEXT")) == NULL) || r; + r = ((glVertexAttribI3uivEXT = (PFNGLVERTEXATTRIBI3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI3uivEXT")) == NULL) || r; + r = ((glVertexAttribI4bvEXT = (PFNGLVERTEXATTRIBI4BVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4bvEXT")) == NULL) || r; + r = ((glVertexAttribI4iEXT = (PFNGLVERTEXATTRIBI4IEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4iEXT")) == NULL) || r; + r = ((glVertexAttribI4ivEXT = (PFNGLVERTEXATTRIBI4IVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ivEXT")) == NULL) || r; + r = ((glVertexAttribI4svEXT = (PFNGLVERTEXATTRIBI4SVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4svEXT")) == NULL) || r; + r = ((glVertexAttribI4ubvEXT = (PFNGLVERTEXATTRIBI4UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4ubvEXT")) == NULL) || r; + r = ((glVertexAttribI4uiEXT = (PFNGLVERTEXATTRIBI4UIEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uiEXT")) == NULL) || r; + r = ((glVertexAttribI4uivEXT = (PFNGLVERTEXATTRIBI4UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4uivEXT")) == NULL) || r; + r = ((glVertexAttribI4usvEXT = (PFNGLVERTEXATTRIBI4USVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribI4usvEXT")) == NULL) || r; + r = ((glVertexAttribIPointerEXT = (PFNGLVERTEXATTRIBIPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_gpu_shader4 */ + +#ifdef GL_EXT_histogram + +static GLboolean _glewInit_GL_EXT_histogram (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetHistogramEXT = (PFNGLGETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramEXT")) == NULL) || r; + r = ((glGetHistogramParameterfvEXT = (PFNGLGETHISTOGRAMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterfvEXT")) == NULL) || r; + r = ((glGetHistogramParameterivEXT = (PFNGLGETHISTOGRAMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetHistogramParameterivEXT")) == NULL) || r; + r = ((glGetMinmaxEXT = (PFNGLGETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxEXT")) == NULL) || r; + r = ((glGetMinmaxParameterfvEXT = (PFNGLGETMINMAXPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterfvEXT")) == NULL) || r; + r = ((glGetMinmaxParameterivEXT = (PFNGLGETMINMAXPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMinmaxParameterivEXT")) == NULL) || r; + r = ((glHistogramEXT = (PFNGLHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glHistogramEXT")) == NULL) || r; + r = ((glMinmaxEXT = (PFNGLMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glMinmaxEXT")) == NULL) || r; + r = ((glResetHistogramEXT = (PFNGLRESETHISTOGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glResetHistogramEXT")) == NULL) || r; + r = ((glResetMinmaxEXT = (PFNGLRESETMINMAXEXTPROC)glewGetProcAddress((const GLubyte*)"glResetMinmaxEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_histogram */ + +#ifdef GL_EXT_index_func + +static GLboolean _glewInit_GL_EXT_index_func (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glIndexFuncEXT = (PFNGLINDEXFUNCEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexFuncEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_index_func */ + +#ifdef GL_EXT_index_material + +static GLboolean _glewInit_GL_EXT_index_material (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glIndexMaterialEXT = (PFNGLINDEXMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glIndexMaterialEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_index_material */ + +#ifdef GL_EXT_light_texture + +static GLboolean _glewInit_GL_EXT_light_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glApplyTextureEXT = (PFNGLAPPLYTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glApplyTextureEXT")) == NULL) || r; + r = ((glTextureLightEXT = (PFNGLTEXTURELIGHTEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureLightEXT")) == NULL) || r; + r = ((glTextureMaterialEXT = (PFNGLTEXTUREMATERIALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureMaterialEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_light_texture */ + +#ifdef GL_EXT_multi_draw_arrays + +static GLboolean _glewInit_GL_EXT_multi_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysEXT")) == NULL) || r; + r = ((glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTSEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_multi_draw_arrays */ + +#ifdef GL_EXT_multisample + +static GLboolean _glewInit_GL_EXT_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glSampleMaskEXT = (PFNGLSAMPLEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskEXT")) == NULL) || r; + r = ((glSamplePatternEXT = (PFNGLSAMPLEPATTERNEXTPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_multisample */ + +#ifdef GL_EXT_paletted_texture + +static GLboolean _glewInit_GL_EXT_paletted_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColorTableEXT = (PFNGLCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glColorTableEXT")) == NULL) || r; + r = ((glGetColorTableEXT = (PFNGLGETCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableEXT")) == NULL) || r; + r = ((glGetColorTableParameterfvEXT = (PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvEXT")) == NULL) || r; + r = ((glGetColorTableParameterivEXT = (PFNGLGETCOLORTABLEPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_paletted_texture */ + +#ifdef GL_EXT_pixel_transform + +static GLboolean _glewInit_GL_EXT_pixel_transform (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetPixelTransformParameterfvEXT = (PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterfvEXT")) == NULL) || r; + r = ((glGetPixelTransformParameterivEXT = (PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPixelTransformParameterivEXT")) == NULL) || r; + r = ((glPixelTransformParameterfEXT = (PFNGLPIXELTRANSFORMPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfEXT")) == NULL) || r; + r = ((glPixelTransformParameterfvEXT = (PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterfvEXT")) == NULL) || r; + r = ((glPixelTransformParameteriEXT = (PFNGLPIXELTRANSFORMPARAMETERIEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameteriEXT")) == NULL) || r; + r = ((glPixelTransformParameterivEXT = (PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glPixelTransformParameterivEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_pixel_transform */ + +#ifdef GL_EXT_point_parameters + +static GLboolean _glewInit_GL_EXT_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPointParameterfEXT = (PFNGLPOINTPARAMETERFEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfEXT")) == NULL) || r; + r = ((glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glPointParameterfvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_point_parameters */ + +#ifdef GL_EXT_polygon_offset + +static GLboolean _glewInit_GL_EXT_polygon_offset (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPolygonOffsetEXT = (PFNGLPOLYGONOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_polygon_offset */ + +#ifdef GL_EXT_polygon_offset_clamp + +static GLboolean _glewInit_GL_EXT_polygon_offset_clamp (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPolygonOffsetClampEXT = (PFNGLPOLYGONOFFSETCLAMPEXTPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetClampEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_polygon_offset_clamp */ + +#ifdef GL_EXT_provoking_vertex + +static GLboolean _glewInit_GL_EXT_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertexEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_provoking_vertex */ + +#ifdef GL_EXT_raster_multisample + +static GLboolean _glewInit_GL_EXT_raster_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCoverageModulationNV = (PFNGLCOVERAGEMODULATIONNVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationNV")) == NULL) || r; + r = ((glCoverageModulationTableNV = (PFNGLCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glCoverageModulationTableNV")) == NULL) || r; + r = ((glGetCoverageModulationTableNV = (PFNGLGETCOVERAGEMODULATIONTABLENVPROC)glewGetProcAddress((const GLubyte*)"glGetCoverageModulationTableNV")) == NULL) || r; + r = ((glRasterSamplesEXT = (PFNGLRASTERSAMPLESEXTPROC)glewGetProcAddress((const GLubyte*)"glRasterSamplesEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_raster_multisample */ + +#ifdef GL_EXT_scene_marker + +static GLboolean _glewInit_GL_EXT_scene_marker (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginSceneEXT = (PFNGLBEGINSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginSceneEXT")) == NULL) || r; + r = ((glEndSceneEXT = (PFNGLENDSCENEEXTPROC)glewGetProcAddress((const GLubyte*)"glEndSceneEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_scene_marker */ + +#ifdef GL_EXT_secondary_color + +static GLboolean _glewInit_GL_EXT_secondary_color (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glSecondaryColor3bEXT = (PFNGLSECONDARYCOLOR3BEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bEXT")) == NULL) || r; + r = ((glSecondaryColor3bvEXT = (PFNGLSECONDARYCOLOR3BVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3bvEXT")) == NULL) || r; + r = ((glSecondaryColor3dEXT = (PFNGLSECONDARYCOLOR3DEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dEXT")) == NULL) || r; + r = ((glSecondaryColor3dvEXT = (PFNGLSECONDARYCOLOR3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3dvEXT")) == NULL) || r; + r = ((glSecondaryColor3fEXT = (PFNGLSECONDARYCOLOR3FEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fEXT")) == NULL) || r; + r = ((glSecondaryColor3fvEXT = (PFNGLSECONDARYCOLOR3FVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3fvEXT")) == NULL) || r; + r = ((glSecondaryColor3iEXT = (PFNGLSECONDARYCOLOR3IEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3iEXT")) == NULL) || r; + r = ((glSecondaryColor3ivEXT = (PFNGLSECONDARYCOLOR3IVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ivEXT")) == NULL) || r; + r = ((glSecondaryColor3sEXT = (PFNGLSECONDARYCOLOR3SEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3sEXT")) == NULL) || r; + r = ((glSecondaryColor3svEXT = (PFNGLSECONDARYCOLOR3SVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3svEXT")) == NULL) || r; + r = ((glSecondaryColor3ubEXT = (PFNGLSECONDARYCOLOR3UBEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubEXT")) == NULL) || r; + r = ((glSecondaryColor3ubvEXT = (PFNGLSECONDARYCOLOR3UBVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3ubvEXT")) == NULL) || r; + r = ((glSecondaryColor3uiEXT = (PFNGLSECONDARYCOLOR3UIEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uiEXT")) == NULL) || r; + r = ((glSecondaryColor3uivEXT = (PFNGLSECONDARYCOLOR3UIVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3uivEXT")) == NULL) || r; + r = ((glSecondaryColor3usEXT = (PFNGLSECONDARYCOLOR3USEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usEXT")) == NULL) || r; + r = ((glSecondaryColor3usvEXT = (PFNGLSECONDARYCOLOR3USVEXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3usvEXT")) == NULL) || r; + r = ((glSecondaryColorPointerEXT = (PFNGLSECONDARYCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_secondary_color */ + +#ifdef GL_EXT_separate_shader_objects + +static GLboolean _glewInit_GL_EXT_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glActiveProgramEXT = (PFNGLACTIVEPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveProgramEXT")) == NULL) || r; + r = ((glCreateShaderProgramEXT = (PFNGLCREATESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramEXT")) == NULL) || r; + r = ((glUseShaderProgramEXT = (PFNGLUSESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glUseShaderProgramEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_separate_shader_objects */ + +#ifdef GL_EXT_shader_image_load_store + +static GLboolean _glewInit_GL_EXT_shader_image_load_store (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindImageTextureEXT = (PFNGLBINDIMAGETEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextureEXT")) == NULL) || r; + r = ((glMemoryBarrierEXT = (PFNGLMEMORYBARRIEREXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_shader_image_load_store */ + +#ifdef GL_EXT_stencil_two_side + +static GLboolean _glewInit_GL_EXT_stencil_two_side (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glActiveStencilFaceEXT = (PFNGLACTIVESTENCILFACEEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveStencilFaceEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_stencil_two_side */ + +#ifdef GL_EXT_subtexture + +static GLboolean _glewInit_GL_EXT_subtexture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexSubImage1DEXT = (PFNGLTEXSUBIMAGE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage1DEXT")) == NULL) || r; + r = ((glTexSubImage2DEXT = (PFNGLTEXSUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage2DEXT")) == NULL) || r; + r = ((glTexSubImage3DEXT = (PFNGLTEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage3DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_subtexture */ + +#ifdef GL_EXT_texture3D + +static GLboolean _glewInit_GL_EXT_texture3D (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexImage3DEXT = (PFNGLTEXIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture3D */ + +#ifdef GL_EXT_texture_array + +static GLboolean _glewInit_GL_EXT_texture_array (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferTextureLayerEXT = (PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_array */ + +#ifdef GL_EXT_texture_buffer_object + +static GLboolean _glewInit_GL_EXT_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexBufferEXT = (PFNGLTEXBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexBufferEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_buffer_object */ + +#ifdef GL_EXT_texture_integer + +static GLboolean _glewInit_GL_EXT_texture_integer (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClearColorIiEXT = (PFNGLCLEARCOLORIIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIiEXT")) == NULL) || r; + r = ((glClearColorIuiEXT = (PFNGLCLEARCOLORIUIEXTPROC)glewGetProcAddress((const GLubyte*)"glClearColorIuiEXT")) == NULL) || r; + r = ((glGetTexParameterIivEXT = (PFNGLGETTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIivEXT")) == NULL) || r; + r = ((glGetTexParameterIuivEXT = (PFNGLGETTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuivEXT")) == NULL) || r; + r = ((glTexParameterIivEXT = (PFNGLTEXPARAMETERIIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIivEXT")) == NULL) || r; + r = ((glTexParameterIuivEXT = (PFNGLTEXPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glTexParameterIuivEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_integer */ + +#ifdef GL_EXT_texture_object + +static GLboolean _glewInit_GL_EXT_texture_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAreTexturesResidentEXT = (PFNGLARETEXTURESRESIDENTEXTPROC)glewGetProcAddress((const GLubyte*)"glAreTexturesResidentEXT")) == NULL) || r; + r = ((glBindTextureEXT = (PFNGLBINDTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureEXT")) == NULL) || r; + r = ((glDeleteTexturesEXT = (PFNGLDELETETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteTexturesEXT")) == NULL) || r; + r = ((glGenTexturesEXT = (PFNGLGENTEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glGenTexturesEXT")) == NULL) || r; + r = ((glIsTextureEXT = (PFNGLISTEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glIsTextureEXT")) == NULL) || r; + r = ((glPrioritizeTexturesEXT = (PFNGLPRIORITIZETEXTURESEXTPROC)glewGetProcAddress((const GLubyte*)"glPrioritizeTexturesEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_object */ + +#ifdef GL_EXT_texture_perturb_normal + +static GLboolean _glewInit_GL_EXT_texture_perturb_normal (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTextureNormalEXT = (PFNGLTEXTURENORMALEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureNormalEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_texture_perturb_normal */ + +#ifdef GL_EXT_timer_query + +static GLboolean _glewInit_GL_EXT_timer_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetQueryObjecti64vEXT = (PFNGLGETQUERYOBJECTI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64vEXT")) == NULL) || r; + r = ((glGetQueryObjectui64vEXT = (PFNGLGETQUERYOBJECTUI64VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64vEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_timer_query */ + +#ifdef GL_EXT_transform_feedback + +static GLboolean _glewInit_GL_EXT_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginTransformFeedbackEXT = (PFNGLBEGINTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackEXT")) == NULL) || r; + r = ((glBindBufferBaseEXT = (PFNGLBINDBUFFERBASEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseEXT")) == NULL) || r; + r = ((glBindBufferOffsetEXT = (PFNGLBINDBUFFEROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetEXT")) == NULL) || r; + r = ((glBindBufferRangeEXT = (PFNGLBINDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeEXT")) == NULL) || r; + r = ((glEndTransformFeedbackEXT = (PFNGLENDTRANSFORMFEEDBACKEXTPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackEXT")) == NULL) || r; + r = ((glGetTransformFeedbackVaryingEXT = (PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingEXT")) == NULL) || r; + r = ((glTransformFeedbackVaryingsEXT = (PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_transform_feedback */ + +#ifdef GL_EXT_vertex_array + +static GLboolean _glewInit_GL_EXT_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glArrayElementEXT = (PFNGLARRAYELEMENTEXTPROC)glewGetProcAddress((const GLubyte*)"glArrayElementEXT")) == NULL) || r; + r = ((glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glColorPointerEXT")) == NULL) || r; + r = ((glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysEXT")) == NULL) || r; + r = ((glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerEXT")) == NULL) || r; + r = ((glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerEXT")) == NULL) || r; + r = ((glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerEXT")) == NULL) || r; + r = ((glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerEXT")) == NULL) || r; + r = ((glVertexPointerEXT = (PFNGLVERTEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_vertex_array */ + +#ifdef GL_EXT_vertex_attrib_64bit + +static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetVertexAttribLdvEXT = (PFNGLGETVERTEXATTRIBLDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdvEXT")) == NULL) || r; + r = ((glVertexArrayVertexAttribLOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLOffsetEXT")) == NULL) || r; + r = ((glVertexAttribL1dEXT = (PFNGLVERTEXATTRIBL1DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dEXT")) == NULL) || r; + r = ((glVertexAttribL1dvEXT = (PFNGLVERTEXATTRIBL1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dvEXT")) == NULL) || r; + r = ((glVertexAttribL2dEXT = (PFNGLVERTEXATTRIBL2DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dEXT")) == NULL) || r; + r = ((glVertexAttribL2dvEXT = (PFNGLVERTEXATTRIBL2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dvEXT")) == NULL) || r; + r = ((glVertexAttribL3dEXT = (PFNGLVERTEXATTRIBL3DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dEXT")) == NULL) || r; + r = ((glVertexAttribL3dvEXT = (PFNGLVERTEXATTRIBL3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dvEXT")) == NULL) || r; + r = ((glVertexAttribL4dEXT = (PFNGLVERTEXATTRIBL4DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dEXT")) == NULL) || r; + r = ((glVertexAttribL4dvEXT = (PFNGLVERTEXATTRIBL4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dvEXT")) == NULL) || r; + r = ((glVertexAttribLPointerEXT = (PFNGLVERTEXATTRIBLPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointerEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_vertex_attrib_64bit */ + +#ifdef GL_EXT_vertex_shader + +static GLboolean _glewInit_GL_EXT_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginVertexShaderEXT = (PFNGLBEGINVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBeginVertexShaderEXT")) == NULL) || r; + r = ((glBindLightParameterEXT = (PFNGLBINDLIGHTPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindLightParameterEXT")) == NULL) || r; + r = ((glBindMaterialParameterEXT = (PFNGLBINDMATERIALPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindMaterialParameterEXT")) == NULL) || r; + r = ((glBindParameterEXT = (PFNGLBINDPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindParameterEXT")) == NULL) || r; + r = ((glBindTexGenParameterEXT = (PFNGLBINDTEXGENPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTexGenParameterEXT")) == NULL) || r; + r = ((glBindTextureUnitParameterEXT = (PFNGLBINDTEXTUREUNITPARAMETEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindTextureUnitParameterEXT")) == NULL) || r; + r = ((glBindVertexShaderEXT = (PFNGLBINDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glBindVertexShaderEXT")) == NULL) || r; + r = ((glDeleteVertexShaderEXT = (PFNGLDELETEVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glDeleteVertexShaderEXT")) == NULL) || r; + r = ((glDisableVariantClientStateEXT = (PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVariantClientStateEXT")) == NULL) || r; + r = ((glEnableVariantClientStateEXT = (PFNGLENABLEVARIANTCLIENTSTATEEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVariantClientStateEXT")) == NULL) || r; + r = ((glEndVertexShaderEXT = (PFNGLENDVERTEXSHADEREXTPROC)glewGetProcAddress((const GLubyte*)"glEndVertexShaderEXT")) == NULL) || r; + r = ((glExtractComponentEXT = (PFNGLEXTRACTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glExtractComponentEXT")) == NULL) || r; + r = ((glGenSymbolsEXT = (PFNGLGENSYMBOLSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenSymbolsEXT")) == NULL) || r; + r = ((glGenVertexShadersEXT = (PFNGLGENVERTEXSHADERSEXTPROC)glewGetProcAddress((const GLubyte*)"glGenVertexShadersEXT")) == NULL) || r; + r = ((glGetInvariantBooleanvEXT = (PFNGLGETINVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantBooleanvEXT")) == NULL) || r; + r = ((glGetInvariantFloatvEXT = (PFNGLGETINVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantFloatvEXT")) == NULL) || r; + r = ((glGetInvariantIntegervEXT = (PFNGLGETINVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetInvariantIntegervEXT")) == NULL) || r; + r = ((glGetLocalConstantBooleanvEXT = (PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantBooleanvEXT")) == NULL) || r; + r = ((glGetLocalConstantFloatvEXT = (PFNGLGETLOCALCONSTANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantFloatvEXT")) == NULL) || r; + r = ((glGetLocalConstantIntegervEXT = (PFNGLGETLOCALCONSTANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetLocalConstantIntegervEXT")) == NULL) || r; + r = ((glGetVariantBooleanvEXT = (PFNGLGETVARIANTBOOLEANVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantBooleanvEXT")) == NULL) || r; + r = ((glGetVariantFloatvEXT = (PFNGLGETVARIANTFLOATVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantFloatvEXT")) == NULL) || r; + r = ((glGetVariantIntegervEXT = (PFNGLGETVARIANTINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantIntegervEXT")) == NULL) || r; + r = ((glGetVariantPointervEXT = (PFNGLGETVARIANTPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVariantPointervEXT")) == NULL) || r; + r = ((glInsertComponentEXT = (PFNGLINSERTCOMPONENTEXTPROC)glewGetProcAddress((const GLubyte*)"glInsertComponentEXT")) == NULL) || r; + r = ((glIsVariantEnabledEXT = (PFNGLISVARIANTENABLEDEXTPROC)glewGetProcAddress((const GLubyte*)"glIsVariantEnabledEXT")) == NULL) || r; + r = ((glSetInvariantEXT = (PFNGLSETINVARIANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetInvariantEXT")) == NULL) || r; + r = ((glSetLocalConstantEXT = (PFNGLSETLOCALCONSTANTEXTPROC)glewGetProcAddress((const GLubyte*)"glSetLocalConstantEXT")) == NULL) || r; + r = ((glShaderOp1EXT = (PFNGLSHADEROP1EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp1EXT")) == NULL) || r; + r = ((glShaderOp2EXT = (PFNGLSHADEROP2EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp2EXT")) == NULL) || r; + r = ((glShaderOp3EXT = (PFNGLSHADEROP3EXTPROC)glewGetProcAddress((const GLubyte*)"glShaderOp3EXT")) == NULL) || r; + r = ((glSwizzleEXT = (PFNGLSWIZZLEEXTPROC)glewGetProcAddress((const GLubyte*)"glSwizzleEXT")) == NULL) || r; + r = ((glVariantPointerEXT = (PFNGLVARIANTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVariantPointerEXT")) == NULL) || r; + r = ((glVariantbvEXT = (PFNGLVARIANTBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantbvEXT")) == NULL) || r; + r = ((glVariantdvEXT = (PFNGLVARIANTDVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantdvEXT")) == NULL) || r; + r = ((glVariantfvEXT = (PFNGLVARIANTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantfvEXT")) == NULL) || r; + r = ((glVariantivEXT = (PFNGLVARIANTIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantivEXT")) == NULL) || r; + r = ((glVariantsvEXT = (PFNGLVARIANTSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantsvEXT")) == NULL) || r; + r = ((glVariantubvEXT = (PFNGLVARIANTUBVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantubvEXT")) == NULL) || r; + r = ((glVariantuivEXT = (PFNGLVARIANTUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantuivEXT")) == NULL) || r; + r = ((glVariantusvEXT = (PFNGLVARIANTUSVEXTPROC)glewGetProcAddress((const GLubyte*)"glVariantusvEXT")) == NULL) || r; + r = ((glWriteMaskEXT = (PFNGLWRITEMASKEXTPROC)glewGetProcAddress((const GLubyte*)"glWriteMaskEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_vertex_shader */ + +#ifdef GL_EXT_vertex_weighting + +static GLboolean _glewInit_GL_EXT_vertex_weighting (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glVertexWeightPointerEXT = (PFNGLVERTEXWEIGHTPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightPointerEXT")) == NULL) || r; + r = ((glVertexWeightfEXT = (PFNGLVERTEXWEIGHTFEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfEXT")) == NULL) || r; + r = ((glVertexWeightfvEXT = (PFNGLVERTEXWEIGHTFVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexWeightfvEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_vertex_weighting */ + +#ifdef GL_EXT_x11_sync_object + +static GLboolean _glewInit_GL_EXT_x11_sync_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glImportSyncEXT = (PFNGLIMPORTSYNCEXTPROC)glewGetProcAddress((const GLubyte*)"glImportSyncEXT")) == NULL) || r; + + return r; +} + +#endif /* GL_EXT_x11_sync_object */ + +#ifdef GL_GREMEDY_frame_terminator + +static GLboolean _glewInit_GL_GREMEDY_frame_terminator (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFrameTerminatorGREMEDY = (PFNGLFRAMETERMINATORGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glFrameTerminatorGREMEDY")) == NULL) || r; + + return r; +} + +#endif /* GL_GREMEDY_frame_terminator */ + +#ifdef GL_GREMEDY_string_marker + +static GLboolean _glewInit_GL_GREMEDY_string_marker (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glStringMarkerGREMEDY = (PFNGLSTRINGMARKERGREMEDYPROC)glewGetProcAddress((const GLubyte*)"glStringMarkerGREMEDY")) == NULL) || r; + + return r; +} + +#endif /* GL_GREMEDY_string_marker */ + +#ifdef GL_HP_image_transform + +static GLboolean _glewInit_GL_HP_image_transform (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetImageTransformParameterfvHP = (PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterfvHP")) == NULL) || r; + r = ((glGetImageTransformParameterivHP = (PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glGetImageTransformParameterivHP")) == NULL) || r; + r = ((glImageTransformParameterfHP = (PFNGLIMAGETRANSFORMPARAMETERFHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfHP")) == NULL) || r; + r = ((glImageTransformParameterfvHP = (PFNGLIMAGETRANSFORMPARAMETERFVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterfvHP")) == NULL) || r; + r = ((glImageTransformParameteriHP = (PFNGLIMAGETRANSFORMPARAMETERIHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameteriHP")) == NULL) || r; + r = ((glImageTransformParameterivHP = (PFNGLIMAGETRANSFORMPARAMETERIVHPPROC)glewGetProcAddress((const GLubyte*)"glImageTransformParameterivHP")) == NULL) || r; + + return r; +} + +#endif /* GL_HP_image_transform */ + +#ifdef GL_IBM_multimode_draw_arrays + +static GLboolean _glewInit_GL_IBM_multimode_draw_arrays (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMultiModeDrawArraysIBM = (PFNGLMULTIMODEDRAWARRAYSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawArraysIBM")) == NULL) || r; + r = ((glMultiModeDrawElementsIBM = (PFNGLMULTIMODEDRAWELEMENTSIBMPROC)glewGetProcAddress((const GLubyte*)"glMultiModeDrawElementsIBM")) == NULL) || r; + + return r; +} + +#endif /* GL_IBM_multimode_draw_arrays */ + +#ifdef GL_IBM_vertex_array_lists + +static GLboolean _glewInit_GL_IBM_vertex_array_lists (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColorPointerListIBM = (PFNGLCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glColorPointerListIBM")) == NULL) || r; + r = ((glEdgeFlagPointerListIBM = (PFNGLEDGEFLAGPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerListIBM")) == NULL) || r; + r = ((glFogCoordPointerListIBM = (PFNGLFOGCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glFogCoordPointerListIBM")) == NULL) || r; + r = ((glIndexPointerListIBM = (PFNGLINDEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerListIBM")) == NULL) || r; + r = ((glNormalPointerListIBM = (PFNGLNORMALPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerListIBM")) == NULL) || r; + r = ((glSecondaryColorPointerListIBM = (PFNGLSECONDARYCOLORPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorPointerListIBM")) == NULL) || r; + r = ((glTexCoordPointerListIBM = (PFNGLTEXCOORDPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerListIBM")) == NULL) || r; + r = ((glVertexPointerListIBM = (PFNGLVERTEXPOINTERLISTIBMPROC)glewGetProcAddress((const GLubyte*)"glVertexPointerListIBM")) == NULL) || r; + + return r; +} + +#endif /* GL_IBM_vertex_array_lists */ + +#ifdef GL_INTEL_map_texture + +static GLboolean _glewInit_GL_INTEL_map_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMapTexture2DINTEL = (PFNGLMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glMapTexture2DINTEL")) == NULL) || r; + r = ((glSyncTextureINTEL = (PFNGLSYNCTEXTUREINTELPROC)glewGetProcAddress((const GLubyte*)"glSyncTextureINTEL")) == NULL) || r; + r = ((glUnmapTexture2DINTEL = (PFNGLUNMAPTEXTURE2DINTELPROC)glewGetProcAddress((const GLubyte*)"glUnmapTexture2DINTEL")) == NULL) || r; + + return r; +} + +#endif /* GL_INTEL_map_texture */ + +#ifdef GL_INTEL_parallel_arrays + +static GLboolean _glewInit_GL_INTEL_parallel_arrays (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColorPointervINTEL = (PFNGLCOLORPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glColorPointervINTEL")) == NULL) || r; + r = ((glNormalPointervINTEL = (PFNGLNORMALPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glNormalPointervINTEL")) == NULL) || r; + r = ((glTexCoordPointervINTEL = (PFNGLTEXCOORDPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointervINTEL")) == NULL) || r; + r = ((glVertexPointervINTEL = (PFNGLVERTEXPOINTERVINTELPROC)glewGetProcAddress((const GLubyte*)"glVertexPointervINTEL")) == NULL) || r; + + return r; +} + +#endif /* GL_INTEL_parallel_arrays */ + +#ifdef GL_INTEL_performance_query + +static GLboolean _glewInit_GL_INTEL_performance_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginPerfQueryINTEL = (PFNGLBEGINPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfQueryINTEL")) == NULL) || r; + r = ((glCreatePerfQueryINTEL = (PFNGLCREATEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glCreatePerfQueryINTEL")) == NULL) || r; + r = ((glDeletePerfQueryINTEL = (PFNGLDELETEPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfQueryINTEL")) == NULL) || r; + r = ((glEndPerfQueryINTEL = (PFNGLENDPERFQUERYINTELPROC)glewGetProcAddress((const GLubyte*)"glEndPerfQueryINTEL")) == NULL) || r; + r = ((glGetFirstPerfQueryIdINTEL = (PFNGLGETFIRSTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetFirstPerfQueryIdINTEL")) == NULL) || r; + r = ((glGetNextPerfQueryIdINTEL = (PFNGLGETNEXTPERFQUERYIDINTELPROC)glewGetProcAddress((const GLubyte*)"glGetNextPerfQueryIdINTEL")) == NULL) || r; + r = ((glGetPerfCounterInfoINTEL = (PFNGLGETPERFCOUNTERINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfCounterInfoINTEL")) == NULL) || r; + r = ((glGetPerfQueryDataINTEL = (PFNGLGETPERFQUERYDATAINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryDataINTEL")) == NULL) || r; + r = ((glGetPerfQueryIdByNameINTEL = (PFNGLGETPERFQUERYIDBYNAMEINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryIdByNameINTEL")) == NULL) || r; + r = ((glGetPerfQueryInfoINTEL = (PFNGLGETPERFQUERYINFOINTELPROC)glewGetProcAddress((const GLubyte*)"glGetPerfQueryInfoINTEL")) == NULL) || r; + + return r; +} + +#endif /* GL_INTEL_performance_query */ + +#ifdef GL_INTEL_texture_scissor + +static GLboolean _glewInit_GL_INTEL_texture_scissor (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexScissorFuncINTEL = (PFNGLTEXSCISSORFUNCINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorFuncINTEL")) == NULL) || r; + r = ((glTexScissorINTEL = (PFNGLTEXSCISSORINTELPROC)glewGetProcAddress((const GLubyte*)"glTexScissorINTEL")) == NULL) || r; + + return r; +} + +#endif /* GL_INTEL_texture_scissor */ + +#ifdef GL_KHR_blend_equation_advanced + +static GLboolean _glewInit_GL_KHR_blend_equation_advanced (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendBarrierKHR = (PFNGLBLENDBARRIERKHRPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierKHR")) == NULL) || r; + + return r; +} + +#endif /* GL_KHR_blend_equation_advanced */ + +#ifdef GL_KHR_debug + +static GLboolean _glewInit_GL_KHR_debug (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallback")) == NULL) || r; + r = ((glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControl")) == NULL) || r; + r = ((glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsert")) == NULL) || r; + r = ((glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLog")) == NULL) || r; + r = ((glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectLabel")) == NULL) || r; + r = ((glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glGetObjectPtrLabel")) == NULL) || r; + r = ((glObjectLabel = (PFNGLOBJECTLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectLabel")) == NULL) || r; + r = ((glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)glewGetProcAddress((const GLubyte*)"glObjectPtrLabel")) == NULL) || r; + r = ((glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPopDebugGroup")) == NULL) || r; + r = ((glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)glewGetProcAddress((const GLubyte*)"glPushDebugGroup")) == NULL) || r; + + return r; +} + +#endif /* GL_KHR_debug */ + +#ifdef GL_KHR_robustness + +static GLboolean _glewInit_GL_KHR_robustness (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetnUniformfv = (PFNGLGETNUNIFORMFVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfv")) == NULL) || r; + r = ((glGetnUniformiv = (PFNGLGETNUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformiv")) == NULL) || r; + r = ((glGetnUniformuiv = (PFNGLGETNUNIFORMUIVPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuiv")) == NULL) || r; + r = ((glReadnPixels = (PFNGLREADNPIXELSPROC)glewGetProcAddress((const GLubyte*)"glReadnPixels")) == NULL) || r; + + return r; +} + +#endif /* GL_KHR_robustness */ + +#ifdef GL_KTX_buffer_region + +static GLboolean _glewInit_GL_KTX_buffer_region (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBufferRegionEnabled = (PFNGLBUFFERREGIONENABLEDPROC)glewGetProcAddress((const GLubyte*)"glBufferRegionEnabled")) == NULL) || r; + r = ((glDeleteBufferRegion = (PFNGLDELETEBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDeleteBufferRegion")) == NULL) || r; + r = ((glDrawBufferRegion = (PFNGLDRAWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glDrawBufferRegion")) == NULL) || r; + r = ((glNewBufferRegion = (PFNGLNEWBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glNewBufferRegion")) == NULL) || r; + r = ((glReadBufferRegion = (PFNGLREADBUFFERREGIONPROC)glewGetProcAddress((const GLubyte*)"glReadBufferRegion")) == NULL) || r; + + return r; +} + +#endif /* GL_KTX_buffer_region */ + +#ifdef GL_MESA_resize_buffers + +static GLboolean _glewInit_GL_MESA_resize_buffers (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glResizeBuffersMESA = (PFNGLRESIZEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glResizeBuffersMESA")) == NULL) || r; + + return r; +} + +#endif /* GL_MESA_resize_buffers */ + +#ifdef GL_MESA_window_pos + +static GLboolean _glewInit_GL_MESA_window_pos (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glWindowPos2dMESA = (PFNGLWINDOWPOS2DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dMESA")) == NULL) || r; + r = ((glWindowPos2dvMESA = (PFNGLWINDOWPOS2DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2dvMESA")) == NULL) || r; + r = ((glWindowPos2fMESA = (PFNGLWINDOWPOS2FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fMESA")) == NULL) || r; + r = ((glWindowPos2fvMESA = (PFNGLWINDOWPOS2FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2fvMESA")) == NULL) || r; + r = ((glWindowPos2iMESA = (PFNGLWINDOWPOS2IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2iMESA")) == NULL) || r; + r = ((glWindowPos2ivMESA = (PFNGLWINDOWPOS2IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2ivMESA")) == NULL) || r; + r = ((glWindowPos2sMESA = (PFNGLWINDOWPOS2SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2sMESA")) == NULL) || r; + r = ((glWindowPos2svMESA = (PFNGLWINDOWPOS2SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos2svMESA")) == NULL) || r; + r = ((glWindowPos3dMESA = (PFNGLWINDOWPOS3DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dMESA")) == NULL) || r; + r = ((glWindowPos3dvMESA = (PFNGLWINDOWPOS3DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3dvMESA")) == NULL) || r; + r = ((glWindowPos3fMESA = (PFNGLWINDOWPOS3FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fMESA")) == NULL) || r; + r = ((glWindowPos3fvMESA = (PFNGLWINDOWPOS3FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3fvMESA")) == NULL) || r; + r = ((glWindowPos3iMESA = (PFNGLWINDOWPOS3IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3iMESA")) == NULL) || r; + r = ((glWindowPos3ivMESA = (PFNGLWINDOWPOS3IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3ivMESA")) == NULL) || r; + r = ((glWindowPos3sMESA = (PFNGLWINDOWPOS3SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3sMESA")) == NULL) || r; + r = ((glWindowPos3svMESA = (PFNGLWINDOWPOS3SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos3svMESA")) == NULL) || r; + r = ((glWindowPos4dMESA = (PFNGLWINDOWPOS4DMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dMESA")) == NULL) || r; + r = ((glWindowPos4dvMESA = (PFNGLWINDOWPOS4DVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4dvMESA")) == NULL) || r; + r = ((glWindowPos4fMESA = (PFNGLWINDOWPOS4FMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fMESA")) == NULL) || r; + r = ((glWindowPos4fvMESA = (PFNGLWINDOWPOS4FVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4fvMESA")) == NULL) || r; + r = ((glWindowPos4iMESA = (PFNGLWINDOWPOS4IMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4iMESA")) == NULL) || r; + r = ((glWindowPos4ivMESA = (PFNGLWINDOWPOS4IVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4ivMESA")) == NULL) || r; + r = ((glWindowPos4sMESA = (PFNGLWINDOWPOS4SMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4sMESA")) == NULL) || r; + r = ((glWindowPos4svMESA = (PFNGLWINDOWPOS4SVMESAPROC)glewGetProcAddress((const GLubyte*)"glWindowPos4svMESA")) == NULL) || r; + + return r; +} + +#endif /* GL_MESA_window_pos */ + +#ifdef GL_NVX_conditional_render + +static GLboolean _glewInit_GL_NVX_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginConditionalRenderNVX = (PFNGLBEGINCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNVX")) == NULL) || r; + r = ((glEndConditionalRenderNVX = (PFNGLENDCONDITIONALRENDERNVXPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNVX")) == NULL) || r; + + return r; +} + +#endif /* GL_NVX_conditional_render */ + +#ifdef GL_NV_bindless_multi_draw_indirect + +static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectBindlessNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessNV")) == NULL) || r; + r = ((glMultiDrawElementsIndirectBindlessNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_bindless_multi_draw_indirect */ + +#ifdef GL_NV_bindless_multi_draw_indirect_count + +static GLboolean _glewInit_GL_NV_bindless_multi_draw_indirect_count (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glMultiDrawArraysIndirectBindlessCountNV = (PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawArraysIndirectBindlessCountNV")) == NULL) || r; + r = ((glMultiDrawElementsIndirectBindlessCountNV = (PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsIndirectBindlessCountNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_bindless_multi_draw_indirect_count */ + +#ifdef GL_NV_bindless_texture + +static GLboolean _glewInit_GL_NV_bindless_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetImageHandleNV = (PFNGLGETIMAGEHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetImageHandleNV")) == NULL) || r; + r = ((glGetTextureHandleNV = (PFNGLGETTEXTUREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureHandleNV")) == NULL) || r; + r = ((glGetTextureSamplerHandleNV = (PFNGLGETTEXTURESAMPLERHANDLENVPROC)glewGetProcAddress((const GLubyte*)"glGetTextureSamplerHandleNV")) == NULL) || r; + r = ((glIsImageHandleResidentNV = (PFNGLISIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsImageHandleResidentNV")) == NULL) || r; + r = ((glIsTextureHandleResidentNV = (PFNGLISTEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsTextureHandleResidentNV")) == NULL) || r; + r = ((glMakeImageHandleNonResidentNV = (PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleNonResidentNV")) == NULL) || r; + r = ((glMakeImageHandleResidentNV = (PFNGLMAKEIMAGEHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeImageHandleResidentNV")) == NULL) || r; + r = ((glMakeTextureHandleNonResidentNV = (PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleNonResidentNV")) == NULL) || r; + r = ((glMakeTextureHandleResidentNV = (PFNGLMAKETEXTUREHANDLERESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeTextureHandleResidentNV")) == NULL) || r; + r = ((glProgramUniformHandleui64NV = (PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64NV")) == NULL) || r; + r = ((glProgramUniformHandleui64vNV = (PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformHandleui64vNV")) == NULL) || r; + r = ((glUniformHandleui64NV = (PFNGLUNIFORMHANDLEUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64NV")) == NULL) || r; + r = ((glUniformHandleui64vNV = (PFNGLUNIFORMHANDLEUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformHandleui64vNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_bindless_texture */ + +#ifdef GL_NV_blend_equation_advanced + +static GLboolean _glewInit_GL_NV_blend_equation_advanced (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBlendBarrierNV = (PFNGLBLENDBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glBlendBarrierNV")) == NULL) || r; + r = ((glBlendParameteriNV = (PFNGLBLENDPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glBlendParameteriNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_blend_equation_advanced */ + +#ifdef GL_NV_conditional_render + +static GLboolean _glewInit_GL_NV_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginConditionalRenderNV = (PFNGLBEGINCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRenderNV")) == NULL) || r; + r = ((glEndConditionalRenderNV = (PFNGLENDCONDITIONALRENDERNVPROC)glewGetProcAddress((const GLubyte*)"glEndConditionalRenderNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_conditional_render */ + +#ifdef GL_NV_conservative_raster + +static GLboolean _glewInit_GL_NV_conservative_raster (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glSubpixelPrecisionBiasNV = (PFNGLSUBPIXELPRECISIONBIASNVPROC)glewGetProcAddress((const GLubyte*)"glSubpixelPrecisionBiasNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_conservative_raster */ + +#ifdef GL_NV_conservative_raster_dilate + +static GLboolean _glewInit_GL_NV_conservative_raster_dilate (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glConservativeRasterParameterfNV = (PFNGLCONSERVATIVERASTERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glConservativeRasterParameterfNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_conservative_raster_dilate */ + +#ifdef GL_NV_copy_image + +static GLboolean _glewInit_GL_NV_copy_image (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_copy_image */ + +#ifdef GL_NV_depth_buffer_float + +static GLboolean _glewInit_GL_NV_depth_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClearDepthdNV = (PFNGLCLEARDEPTHDNVPROC)glewGetProcAddress((const GLubyte*)"glClearDepthdNV")) == NULL) || r; + r = ((glDepthBoundsdNV = (PFNGLDEPTHBOUNDSDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthBoundsdNV")) == NULL) || r; + r = ((glDepthRangedNV = (PFNGLDEPTHRANGEDNVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangedNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_depth_buffer_float */ + +#ifdef GL_NV_draw_texture + +static GLboolean _glewInit_GL_NV_draw_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDrawTextureNV = (PFNGLDRAWTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glDrawTextureNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_draw_texture */ + +#ifdef GL_NV_evaluators + +static GLboolean _glewInit_GL_NV_evaluators (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glEvalMapsNV = (PFNGLEVALMAPSNVPROC)glewGetProcAddress((const GLubyte*)"glEvalMapsNV")) == NULL) || r; + r = ((glGetMapAttribParameterfvNV = (PFNGLGETMAPATTRIBPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterfvNV")) == NULL) || r; + r = ((glGetMapAttribParameterivNV = (PFNGLGETMAPATTRIBPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapAttribParameterivNV")) == NULL) || r; + r = ((glGetMapControlPointsNV = (PFNGLGETMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapControlPointsNV")) == NULL) || r; + r = ((glGetMapParameterfvNV = (PFNGLGETMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterfvNV")) == NULL) || r; + r = ((glGetMapParameterivNV = (PFNGLGETMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMapParameterivNV")) == NULL) || r; + r = ((glMapControlPointsNV = (PFNGLMAPCONTROLPOINTSNVPROC)glewGetProcAddress((const GLubyte*)"glMapControlPointsNV")) == NULL) || r; + r = ((glMapParameterfvNV = (PFNGLMAPPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterfvNV")) == NULL) || r; + r = ((glMapParameterivNV = (PFNGLMAPPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glMapParameterivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_evaluators */ + +#ifdef GL_NV_explicit_multisample + +static GLboolean _glewInit_GL_NV_explicit_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetMultisamplefvNV = (PFNGLGETMULTISAMPLEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefvNV")) == NULL) || r; + r = ((glSampleMaskIndexedNV = (PFNGLSAMPLEMASKINDEXEDNVPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskIndexedNV")) == NULL) || r; + r = ((glTexRenderbufferNV = (PFNGLTEXRENDERBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glTexRenderbufferNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_explicit_multisample */ + +#ifdef GL_NV_fence + +static GLboolean _glewInit_GL_NV_fence (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDeleteFencesNV = (PFNGLDELETEFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteFencesNV")) == NULL) || r; + r = ((glFinishFenceNV = (PFNGLFINISHFENCENVPROC)glewGetProcAddress((const GLubyte*)"glFinishFenceNV")) == NULL) || r; + r = ((glGenFencesNV = (PFNGLGENFENCESNVPROC)glewGetProcAddress((const GLubyte*)"glGenFencesNV")) == NULL) || r; + r = ((glGetFenceivNV = (PFNGLGETFENCEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFenceivNV")) == NULL) || r; + r = ((glIsFenceNV = (PFNGLISFENCENVPROC)glewGetProcAddress((const GLubyte*)"glIsFenceNV")) == NULL) || r; + r = ((glSetFenceNV = (PFNGLSETFENCENVPROC)glewGetProcAddress((const GLubyte*)"glSetFenceNV")) == NULL) || r; + r = ((glTestFenceNV = (PFNGLTESTFENCENVPROC)glewGetProcAddress((const GLubyte*)"glTestFenceNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_fence */ + +#ifdef GL_NV_fragment_coverage_to_color + +static GLboolean _glewInit_GL_NV_fragment_coverage_to_color (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFragmentCoverageColorNV = (PFNGLFRAGMENTCOVERAGECOLORNVPROC)glewGetProcAddress((const GLubyte*)"glFragmentCoverageColorNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_fragment_coverage_to_color */ + +#ifdef GL_NV_fragment_program + +static GLboolean _glewInit_GL_NV_fragment_program (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetProgramNamedParameterdvNV = (PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterdvNV")) == NULL) || r; + r = ((glGetProgramNamedParameterfvNV = (PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramNamedParameterfvNV")) == NULL) || r; + r = ((glProgramNamedParameter4dNV = (PFNGLPROGRAMNAMEDPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dNV")) == NULL) || r; + r = ((glProgramNamedParameter4dvNV = (PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4dvNV")) == NULL) || r; + r = ((glProgramNamedParameter4fNV = (PFNGLPROGRAMNAMEDPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fNV")) == NULL) || r; + r = ((glProgramNamedParameter4fvNV = (PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramNamedParameter4fvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_fragment_program */ + +#ifdef GL_NV_framebuffer_multisample_coverage + +static GLboolean _glewInit_GL_NV_framebuffer_multisample_coverage (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glRenderbufferStorageMultisampleCoverageNV = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glRenderbufferStorageMultisampleCoverageNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_framebuffer_multisample_coverage */ + +#ifdef GL_NV_geometry_program4 + +static GLboolean _glewInit_GL_NV_geometry_program4 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glProgramVertexLimitNV = (PFNGLPROGRAMVERTEXLIMITNVPROC)glewGetProcAddress((const GLubyte*)"glProgramVertexLimitNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_geometry_program4 */ + +#ifdef GL_NV_gpu_program4 + +static GLboolean _glewInit_GL_NV_gpu_program4 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glProgramEnvParameterI4iNV = (PFNGLPROGRAMENVPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4iNV")) == NULL) || r; + r = ((glProgramEnvParameterI4ivNV = (PFNGLPROGRAMENVPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4ivNV")) == NULL) || r; + r = ((glProgramEnvParameterI4uiNV = (PFNGLPROGRAMENVPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uiNV")) == NULL) || r; + r = ((glProgramEnvParameterI4uivNV = (PFNGLPROGRAMENVPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParameterI4uivNV")) == NULL) || r; + r = ((glProgramEnvParametersI4ivNV = (PFNGLPROGRAMENVPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4ivNV")) == NULL) || r; + r = ((glProgramEnvParametersI4uivNV = (PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramEnvParametersI4uivNV")) == NULL) || r; + r = ((glProgramLocalParameterI4iNV = (PFNGLPROGRAMLOCALPARAMETERI4INVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4iNV")) == NULL) || r; + r = ((glProgramLocalParameterI4ivNV = (PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4ivNV")) == NULL) || r; + r = ((glProgramLocalParameterI4uiNV = (PFNGLPROGRAMLOCALPARAMETERI4UINVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uiNV")) == NULL) || r; + r = ((glProgramLocalParameterI4uivNV = (PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParameterI4uivNV")) == NULL) || r; + r = ((glProgramLocalParametersI4ivNV = (PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4ivNV")) == NULL) || r; + r = ((glProgramLocalParametersI4uivNV = (PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramLocalParametersI4uivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_gpu_program4 */ + +#ifdef GL_NV_gpu_shader5 + +static GLboolean _glewInit_GL_NV_gpu_shader5 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetUniformi64vNV = (PFNGLGETUNIFORMI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vNV")) == NULL) || r; + r = ((glGetUniformui64vNV = (PFNGLGETUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vNV")) == NULL) || r; + r = ((glProgramUniform1i64NV = (PFNGLPROGRAMUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64NV")) == NULL) || r; + r = ((glProgramUniform1i64vNV = (PFNGLPROGRAMUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vNV")) == NULL) || r; + r = ((glProgramUniform1ui64NV = (PFNGLPROGRAMUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64NV")) == NULL) || r; + r = ((glProgramUniform1ui64vNV = (PFNGLPROGRAMUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vNV")) == NULL) || r; + r = ((glProgramUniform2i64NV = (PFNGLPROGRAMUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64NV")) == NULL) || r; + r = ((glProgramUniform2i64vNV = (PFNGLPROGRAMUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vNV")) == NULL) || r; + r = ((glProgramUniform2ui64NV = (PFNGLPROGRAMUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64NV")) == NULL) || r; + r = ((glProgramUniform2ui64vNV = (PFNGLPROGRAMUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vNV")) == NULL) || r; + r = ((glProgramUniform3i64NV = (PFNGLPROGRAMUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64NV")) == NULL) || r; + r = ((glProgramUniform3i64vNV = (PFNGLPROGRAMUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vNV")) == NULL) || r; + r = ((glProgramUniform3ui64NV = (PFNGLPROGRAMUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64NV")) == NULL) || r; + r = ((glProgramUniform3ui64vNV = (PFNGLPROGRAMUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vNV")) == NULL) || r; + r = ((glProgramUniform4i64NV = (PFNGLPROGRAMUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64NV")) == NULL) || r; + r = ((glProgramUniform4i64vNV = (PFNGLPROGRAMUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vNV")) == NULL) || r; + r = ((glProgramUniform4ui64NV = (PFNGLPROGRAMUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64NV")) == NULL) || r; + r = ((glProgramUniform4ui64vNV = (PFNGLPROGRAMUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vNV")) == NULL) || r; + r = ((glUniform1i64NV = (PFNGLUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64NV")) == NULL) || r; + r = ((glUniform1i64vNV = (PFNGLUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vNV")) == NULL) || r; + r = ((glUniform1ui64NV = (PFNGLUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64NV")) == NULL) || r; + r = ((glUniform1ui64vNV = (PFNGLUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vNV")) == NULL) || r; + r = ((glUniform2i64NV = (PFNGLUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64NV")) == NULL) || r; + r = ((glUniform2i64vNV = (PFNGLUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vNV")) == NULL) || r; + r = ((glUniform2ui64NV = (PFNGLUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64NV")) == NULL) || r; + r = ((glUniform2ui64vNV = (PFNGLUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vNV")) == NULL) || r; + r = ((glUniform3i64NV = (PFNGLUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64NV")) == NULL) || r; + r = ((glUniform3i64vNV = (PFNGLUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vNV")) == NULL) || r; + r = ((glUniform3ui64NV = (PFNGLUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64NV")) == NULL) || r; + r = ((glUniform3ui64vNV = (PFNGLUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vNV")) == NULL) || r; + r = ((glUniform4i64NV = (PFNGLUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64NV")) == NULL) || r; + r = ((glUniform4i64vNV = (PFNGLUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vNV")) == NULL) || r; + r = ((glUniform4ui64NV = (PFNGLUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64NV")) == NULL) || r; + r = ((glUniform4ui64vNV = (PFNGLUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_gpu_shader5 */ + +#ifdef GL_NV_half_float + +static GLboolean _glewInit_GL_NV_half_float (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColor3hNV = (PFNGLCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hNV")) == NULL) || r; + r = ((glColor3hvNV = (PFNGLCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor3hvNV")) == NULL) || r; + r = ((glColor4hNV = (PFNGLCOLOR4HNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hNV")) == NULL) || r; + r = ((glColor4hvNV = (PFNGLCOLOR4HVNVPROC)glewGetProcAddress((const GLubyte*)"glColor4hvNV")) == NULL) || r; + r = ((glFogCoordhNV = (PFNGLFOGCOORDHNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhNV")) == NULL) || r; + r = ((glFogCoordhvNV = (PFNGLFOGCOORDHVNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordhvNV")) == NULL) || r; + r = ((glMultiTexCoord1hNV = (PFNGLMULTITEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hNV")) == NULL) || r; + r = ((glMultiTexCoord1hvNV = (PFNGLMULTITEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord1hvNV")) == NULL) || r; + r = ((glMultiTexCoord2hNV = (PFNGLMULTITEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hNV")) == NULL) || r; + r = ((glMultiTexCoord2hvNV = (PFNGLMULTITEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord2hvNV")) == NULL) || r; + r = ((glMultiTexCoord3hNV = (PFNGLMULTITEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hNV")) == NULL) || r; + r = ((glMultiTexCoord3hvNV = (PFNGLMULTITEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord3hvNV")) == NULL) || r; + r = ((glMultiTexCoord4hNV = (PFNGLMULTITEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hNV")) == NULL) || r; + r = ((glMultiTexCoord4hvNV = (PFNGLMULTITEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4hvNV")) == NULL) || r; + r = ((glNormal3hNV = (PFNGLNORMAL3HNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hNV")) == NULL) || r; + r = ((glNormal3hvNV = (PFNGLNORMAL3HVNVPROC)glewGetProcAddress((const GLubyte*)"glNormal3hvNV")) == NULL) || r; + r = ((glSecondaryColor3hNV = (PFNGLSECONDARYCOLOR3HNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hNV")) == NULL) || r; + r = ((glSecondaryColor3hvNV = (PFNGLSECONDARYCOLOR3HVNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColor3hvNV")) == NULL) || r; + r = ((glTexCoord1hNV = (PFNGLTEXCOORD1HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hNV")) == NULL) || r; + r = ((glTexCoord1hvNV = (PFNGLTEXCOORD1HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord1hvNV")) == NULL) || r; + r = ((glTexCoord2hNV = (PFNGLTEXCOORD2HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hNV")) == NULL) || r; + r = ((glTexCoord2hvNV = (PFNGLTEXCOORD2HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2hvNV")) == NULL) || r; + r = ((glTexCoord3hNV = (PFNGLTEXCOORD3HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hNV")) == NULL) || r; + r = ((glTexCoord3hvNV = (PFNGLTEXCOORD3HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord3hvNV")) == NULL) || r; + r = ((glTexCoord4hNV = (PFNGLTEXCOORD4HNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hNV")) == NULL) || r; + r = ((glTexCoord4hvNV = (PFNGLTEXCOORD4HVNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4hvNV")) == NULL) || r; + r = ((glVertex2hNV = (PFNGLVERTEX2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hNV")) == NULL) || r; + r = ((glVertex2hvNV = (PFNGLVERTEX2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex2hvNV")) == NULL) || r; + r = ((glVertex3hNV = (PFNGLVERTEX3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hNV")) == NULL) || r; + r = ((glVertex3hvNV = (PFNGLVERTEX3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex3hvNV")) == NULL) || r; + r = ((glVertex4hNV = (PFNGLVERTEX4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hNV")) == NULL) || r; + r = ((glVertex4hvNV = (PFNGLVERTEX4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertex4hvNV")) == NULL) || r; + r = ((glVertexAttrib1hNV = (PFNGLVERTEXATTRIB1HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hNV")) == NULL) || r; + r = ((glVertexAttrib1hvNV = (PFNGLVERTEXATTRIB1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1hvNV")) == NULL) || r; + r = ((glVertexAttrib2hNV = (PFNGLVERTEXATTRIB2HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hNV")) == NULL) || r; + r = ((glVertexAttrib2hvNV = (PFNGLVERTEXATTRIB2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2hvNV")) == NULL) || r; + r = ((glVertexAttrib3hNV = (PFNGLVERTEXATTRIB3HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hNV")) == NULL) || r; + r = ((glVertexAttrib3hvNV = (PFNGLVERTEXATTRIB3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3hvNV")) == NULL) || r; + r = ((glVertexAttrib4hNV = (PFNGLVERTEXATTRIB4HNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hNV")) == NULL) || r; + r = ((glVertexAttrib4hvNV = (PFNGLVERTEXATTRIB4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4hvNV")) == NULL) || r; + r = ((glVertexAttribs1hvNV = (PFNGLVERTEXATTRIBS1HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1hvNV")) == NULL) || r; + r = ((glVertexAttribs2hvNV = (PFNGLVERTEXATTRIBS2HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2hvNV")) == NULL) || r; + r = ((glVertexAttribs3hvNV = (PFNGLVERTEXATTRIBS3HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3hvNV")) == NULL) || r; + r = ((glVertexAttribs4hvNV = (PFNGLVERTEXATTRIBS4HVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4hvNV")) == NULL) || r; + r = ((glVertexWeighthNV = (PFNGLVERTEXWEIGHTHNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthNV")) == NULL) || r; + r = ((glVertexWeighthvNV = (PFNGLVERTEXWEIGHTHVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexWeighthvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_half_float */ + +#ifdef GL_NV_internalformat_sample_query + +static GLboolean _glewInit_GL_NV_internalformat_sample_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetInternalformatSampleivNV = (PFNGLGETINTERNALFORMATSAMPLEIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetInternalformatSampleivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_internalformat_sample_query */ + +#ifdef GL_NV_occlusion_query + +static GLboolean _glewInit_GL_NV_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginOcclusionQueryNV = (PFNGLBEGINOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glBeginOcclusionQueryNV")) == NULL) || r; + r = ((glDeleteOcclusionQueriesNV = (PFNGLDELETEOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteOcclusionQueriesNV")) == NULL) || r; + r = ((glEndOcclusionQueryNV = (PFNGLENDOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glEndOcclusionQueryNV")) == NULL) || r; + r = ((glGenOcclusionQueriesNV = (PFNGLGENOCCLUSIONQUERIESNVPROC)glewGetProcAddress((const GLubyte*)"glGenOcclusionQueriesNV")) == NULL) || r; + r = ((glGetOcclusionQueryivNV = (PFNGLGETOCCLUSIONQUERYIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryivNV")) == NULL) || r; + r = ((glGetOcclusionQueryuivNV = (PFNGLGETOCCLUSIONQUERYUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetOcclusionQueryuivNV")) == NULL) || r; + r = ((glIsOcclusionQueryNV = (PFNGLISOCCLUSIONQUERYNVPROC)glewGetProcAddress((const GLubyte*)"glIsOcclusionQueryNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_occlusion_query */ + +#ifdef GL_NV_parameter_buffer_object + +static GLboolean _glewInit_GL_NV_parameter_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glProgramBufferParametersIivNV = (PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIivNV")) == NULL) || r; + r = ((glProgramBufferParametersIuivNV = (PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersIuivNV")) == NULL) || r; + r = ((glProgramBufferParametersfvNV = (PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramBufferParametersfvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_parameter_buffer_object */ + +#ifdef GL_NV_path_rendering + +static GLboolean _glewInit_GL_NV_path_rendering (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCopyPathNV = (PFNGLCOPYPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCopyPathNV")) == NULL) || r; + r = ((glCoverFillPathInstancedNV = (PFNGLCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathInstancedNV")) == NULL) || r; + r = ((glCoverFillPathNV = (PFNGLCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverFillPathNV")) == NULL) || r; + r = ((glCoverStrokePathInstancedNV = (PFNGLCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathInstancedNV")) == NULL) || r; + r = ((glCoverStrokePathNV = (PFNGLCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glCoverStrokePathNV")) == NULL) || r; + r = ((glDeletePathsNV = (PFNGLDELETEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glDeletePathsNV")) == NULL) || r; + r = ((glGenPathsNV = (PFNGLGENPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glGenPathsNV")) == NULL) || r; + r = ((glGetPathColorGenfvNV = (PFNGLGETPATHCOLORGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenfvNV")) == NULL) || r; + r = ((glGetPathColorGenivNV = (PFNGLGETPATHCOLORGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathColorGenivNV")) == NULL) || r; + r = ((glGetPathCommandsNV = (PFNGLGETPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCommandsNV")) == NULL) || r; + r = ((glGetPathCoordsNV = (PFNGLGETPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathCoordsNV")) == NULL) || r; + r = ((glGetPathDashArrayNV = (PFNGLGETPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathDashArrayNV")) == NULL) || r; + r = ((glGetPathLengthNV = (PFNGLGETPATHLENGTHNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathLengthNV")) == NULL) || r; + r = ((glGetPathMetricRangeNV = (PFNGLGETPATHMETRICRANGENVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricRangeNV")) == NULL) || r; + r = ((glGetPathMetricsNV = (PFNGLGETPATHMETRICSNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathMetricsNV")) == NULL) || r; + r = ((glGetPathParameterfvNV = (PFNGLGETPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterfvNV")) == NULL) || r; + r = ((glGetPathParameterivNV = (PFNGLGETPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathParameterivNV")) == NULL) || r; + r = ((glGetPathSpacingNV = (PFNGLGETPATHSPACINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathSpacingNV")) == NULL) || r; + r = ((glGetPathTexGenfvNV = (PFNGLGETPATHTEXGENFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenfvNV")) == NULL) || r; + r = ((glGetPathTexGenivNV = (PFNGLGETPATHTEXGENIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetPathTexGenivNV")) == NULL) || r; + r = ((glGetProgramResourcefvNV = (PFNGLGETPROGRAMRESOURCEFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramResourcefvNV")) == NULL) || r; + r = ((glInterpolatePathsNV = (PFNGLINTERPOLATEPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glInterpolatePathsNV")) == NULL) || r; + r = ((glIsPathNV = (PFNGLISPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPathNV")) == NULL) || r; + r = ((glIsPointInFillPathNV = (PFNGLISPOINTINFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInFillPathNV")) == NULL) || r; + r = ((glIsPointInStrokePathNV = (PFNGLISPOINTINSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glIsPointInStrokePathNV")) == NULL) || r; + r = ((glMatrixLoad3x2fNV = (PFNGLMATRIXLOAD3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x2fNV")) == NULL) || r; + r = ((glMatrixLoad3x3fNV = (PFNGLMATRIXLOAD3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoad3x3fNV")) == NULL) || r; + r = ((glMatrixLoadTranspose3x3fNV = (PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTranspose3x3fNV")) == NULL) || r; + r = ((glMatrixMult3x2fNV = (PFNGLMATRIXMULT3X2FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x2fNV")) == NULL) || r; + r = ((glMatrixMult3x3fNV = (PFNGLMATRIXMULT3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMult3x3fNV")) == NULL) || r; + r = ((glMatrixMultTranspose3x3fNV = (PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC)glewGetProcAddress((const GLubyte*)"glMatrixMultTranspose3x3fNV")) == NULL) || r; + r = ((glPathColorGenNV = (PFNGLPATHCOLORGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathColorGenNV")) == NULL) || r; + r = ((glPathCommandsNV = (PFNGLPATHCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCommandsNV")) == NULL) || r; + r = ((glPathCoordsNV = (PFNGLPATHCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoordsNV")) == NULL) || r; + r = ((glPathCoverDepthFuncNV = (PFNGLPATHCOVERDEPTHFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathCoverDepthFuncNV")) == NULL) || r; + r = ((glPathDashArrayNV = (PFNGLPATHDASHARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathDashArrayNV")) == NULL) || r; + r = ((glPathFogGenNV = (PFNGLPATHFOGGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathFogGenNV")) == NULL) || r; + r = ((glPathGlyphIndexArrayNV = (PFNGLPATHGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexArrayNV")) == NULL) || r; + r = ((glPathGlyphIndexRangeNV = (PFNGLPATHGLYPHINDEXRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphIndexRangeNV")) == NULL) || r; + r = ((glPathGlyphRangeNV = (PFNGLPATHGLYPHRANGENVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphRangeNV")) == NULL) || r; + r = ((glPathGlyphsNV = (PFNGLPATHGLYPHSNVPROC)glewGetProcAddress((const GLubyte*)"glPathGlyphsNV")) == NULL) || r; + r = ((glPathMemoryGlyphIndexArrayNV = (PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC)glewGetProcAddress((const GLubyte*)"glPathMemoryGlyphIndexArrayNV")) == NULL) || r; + r = ((glPathParameterfNV = (PFNGLPATHPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfNV")) == NULL) || r; + r = ((glPathParameterfvNV = (PFNGLPATHPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterfvNV")) == NULL) || r; + r = ((glPathParameteriNV = (PFNGLPATHPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPathParameteriNV")) == NULL) || r; + r = ((glPathParameterivNV = (PFNGLPATHPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPathParameterivNV")) == NULL) || r; + r = ((glPathStencilDepthOffsetNV = (PFNGLPATHSTENCILDEPTHOFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilDepthOffsetNV")) == NULL) || r; + r = ((glPathStencilFuncNV = (PFNGLPATHSTENCILFUNCNVPROC)glewGetProcAddress((const GLubyte*)"glPathStencilFuncNV")) == NULL) || r; + r = ((glPathStringNV = (PFNGLPATHSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glPathStringNV")) == NULL) || r; + r = ((glPathSubCommandsNV = (PFNGLPATHSUBCOMMANDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCommandsNV")) == NULL) || r; + r = ((glPathSubCoordsNV = (PFNGLPATHSUBCOORDSNVPROC)glewGetProcAddress((const GLubyte*)"glPathSubCoordsNV")) == NULL) || r; + r = ((glPathTexGenNV = (PFNGLPATHTEXGENNVPROC)glewGetProcAddress((const GLubyte*)"glPathTexGenNV")) == NULL) || r; + r = ((glPointAlongPathNV = (PFNGLPOINTALONGPATHNVPROC)glewGetProcAddress((const GLubyte*)"glPointAlongPathNV")) == NULL) || r; + r = ((glProgramPathFragmentInputGenNV = (PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC)glewGetProcAddress((const GLubyte*)"glProgramPathFragmentInputGenNV")) == NULL) || r; + r = ((glStencilFillPathInstancedNV = (PFNGLSTENCILFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathInstancedNV")) == NULL) || r; + r = ((glStencilFillPathNV = (PFNGLSTENCILFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilFillPathNV")) == NULL) || r; + r = ((glStencilStrokePathInstancedNV = (PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathInstancedNV")) == NULL) || r; + r = ((glStencilStrokePathNV = (PFNGLSTENCILSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilStrokePathNV")) == NULL) || r; + r = ((glStencilThenCoverFillPathInstancedNV = (PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathInstancedNV")) == NULL) || r; + r = ((glStencilThenCoverFillPathNV = (PFNGLSTENCILTHENCOVERFILLPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverFillPathNV")) == NULL) || r; + r = ((glStencilThenCoverStrokePathInstancedNV = (PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathInstancedNV")) == NULL) || r; + r = ((glStencilThenCoverStrokePathNV = (PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC)glewGetProcAddress((const GLubyte*)"glStencilThenCoverStrokePathNV")) == NULL) || r; + r = ((glTransformPathNV = (PFNGLTRANSFORMPATHNVPROC)glewGetProcAddress((const GLubyte*)"glTransformPathNV")) == NULL) || r; + r = ((glWeightPathsNV = (PFNGLWEIGHTPATHSNVPROC)glewGetProcAddress((const GLubyte*)"glWeightPathsNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_path_rendering */ + +#ifdef GL_NV_pixel_data_range + +static GLboolean _glewInit_GL_NV_pixel_data_range (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFlushPixelDataRangeNV = (PFNGLFLUSHPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushPixelDataRangeNV")) == NULL) || r; + r = ((glPixelDataRangeNV = (PFNGLPIXELDATARANGENVPROC)glewGetProcAddress((const GLubyte*)"glPixelDataRangeNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_pixel_data_range */ + +#ifdef GL_NV_point_sprite + +static GLboolean _glewInit_GL_NV_point_sprite (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPointParameteriNV = (PFNGLPOINTPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glPointParameteriNV")) == NULL) || r; + r = ((glPointParameterivNV = (PFNGLPOINTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_point_sprite */ + +#ifdef GL_NV_present_video + +static GLboolean _glewInit_GL_NV_present_video (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetVideoi64vNV = (PFNGLGETVIDEOI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoi64vNV")) == NULL) || r; + r = ((glGetVideoivNV = (PFNGLGETVIDEOIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoivNV")) == NULL) || r; + r = ((glGetVideoui64vNV = (PFNGLGETVIDEOUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoui64vNV")) == NULL) || r; + r = ((glGetVideouivNV = (PFNGLGETVIDEOUIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideouivNV")) == NULL) || r; + r = ((glPresentFrameDualFillNV = (PFNGLPRESENTFRAMEDUALFILLNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameDualFillNV")) == NULL) || r; + r = ((glPresentFrameKeyedNV = (PFNGLPRESENTFRAMEKEYEDNVPROC)glewGetProcAddress((const GLubyte*)"glPresentFrameKeyedNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_present_video */ + +#ifdef GL_NV_primitive_restart + +static GLboolean _glewInit_GL_NV_primitive_restart (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPrimitiveRestartIndexNV = (PFNGLPRIMITIVERESTARTINDEXNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndexNV")) == NULL) || r; + r = ((glPrimitiveRestartNV = (PFNGLPRIMITIVERESTARTNVPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_primitive_restart */ + +#ifdef GL_NV_register_combiners + +static GLboolean _glewInit_GL_NV_register_combiners (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCombinerInputNV = (PFNGLCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerInputNV")) == NULL) || r; + r = ((glCombinerOutputNV = (PFNGLCOMBINEROUTPUTNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerOutputNV")) == NULL) || r; + r = ((glCombinerParameterfNV = (PFNGLCOMBINERPARAMETERFNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfNV")) == NULL) || r; + r = ((glCombinerParameterfvNV = (PFNGLCOMBINERPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterfvNV")) == NULL) || r; + r = ((glCombinerParameteriNV = (PFNGLCOMBINERPARAMETERINVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameteriNV")) == NULL) || r; + r = ((glCombinerParameterivNV = (PFNGLCOMBINERPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerParameterivNV")) == NULL) || r; + r = ((glFinalCombinerInputNV = (PFNGLFINALCOMBINERINPUTNVPROC)glewGetProcAddress((const GLubyte*)"glFinalCombinerInputNV")) == NULL) || r; + r = ((glGetCombinerInputParameterfvNV = (PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterfvNV")) == NULL) || r; + r = ((glGetCombinerInputParameterivNV = (PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerInputParameterivNV")) == NULL) || r; + r = ((glGetCombinerOutputParameterfvNV = (PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterfvNV")) == NULL) || r; + r = ((glGetCombinerOutputParameterivNV = (PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerOutputParameterivNV")) == NULL) || r; + r = ((glGetFinalCombinerInputParameterfvNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterfvNV")) == NULL) || r; + r = ((glGetFinalCombinerInputParameterivNV = (PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetFinalCombinerInputParameterivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_register_combiners */ + +#ifdef GL_NV_register_combiners2 + +static GLboolean _glewInit_GL_NV_register_combiners2 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glCombinerStageParameterfvNV = (PFNGLCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glCombinerStageParameterfvNV")) == NULL) || r; + r = ((glGetCombinerStageParameterfvNV = (PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetCombinerStageParameterfvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_register_combiners2 */ + +#ifdef GL_NV_sample_locations + +static GLboolean _glewInit_GL_NV_sample_locations (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferSampleLocationsfvNV = (PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glFramebufferSampleLocationsfvNV")) == NULL) || r; + r = ((glNamedFramebufferSampleLocationsfvNV = (PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferSampleLocationsfvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_sample_locations */ + +#ifdef GL_NV_shader_buffer_load + +static GLboolean _glewInit_GL_NV_shader_buffer_load (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetBufferParameterui64vNV = (PFNGLGETBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterui64vNV")) == NULL) || r; + r = ((glGetIntegerui64vNV = (PFNGLGETINTEGERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64vNV")) == NULL) || r; + r = ((glGetNamedBufferParameterui64vNV = (PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterui64vNV")) == NULL) || r; + r = ((glIsBufferResidentNV = (PFNGLISBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsBufferResidentNV")) == NULL) || r; + r = ((glIsNamedBufferResidentNV = (PFNGLISNAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsNamedBufferResidentNV")) == NULL) || r; + r = ((glMakeBufferNonResidentNV = (PFNGLMAKEBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferNonResidentNV")) == NULL) || r; + r = ((glMakeBufferResidentNV = (PFNGLMAKEBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferResidentNV")) == NULL) || r; + r = ((glMakeNamedBufferNonResidentNV = (PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferNonResidentNV")) == NULL) || r; + r = ((glMakeNamedBufferResidentNV = (PFNGLMAKENAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferResidentNV")) == NULL) || r; + r = ((glProgramUniformui64NV = (PFNGLPROGRAMUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64NV")) == NULL) || r; + r = ((glProgramUniformui64vNV = (PFNGLPROGRAMUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64vNV")) == NULL) || r; + r = ((glUniformui64NV = (PFNGLUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64NV")) == NULL) || r; + r = ((glUniformui64vNV = (PFNGLUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64vNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_shader_buffer_load */ + +#ifdef GL_NV_texture_barrier + +static GLboolean _glewInit_GL_NV_texture_barrier (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTextureBarrierNV = (PFNGLTEXTUREBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrierNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_texture_barrier */ + +#ifdef GL_NV_texture_multisample + +static GLboolean _glewInit_GL_NV_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexImage2DMultisampleCoverageNV = (PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisampleCoverageNV")) == NULL) || r; + r = ((glTexImage3DMultisampleCoverageNV = (PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisampleCoverageNV")) == NULL) || r; + r = ((glTextureImage2DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleCoverageNV")) == NULL) || r; + r = ((glTextureImage2DMultisampleNV = (PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage2DMultisampleNV")) == NULL) || r; + r = ((glTextureImage3DMultisampleCoverageNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleCoverageNV")) == NULL) || r; + r = ((glTextureImage3DMultisampleNV = (PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC)glewGetProcAddress((const GLubyte*)"glTextureImage3DMultisampleNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_texture_multisample */ + +#ifdef GL_NV_transform_feedback + +static GLboolean _glewInit_GL_NV_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glActiveVaryingNV = (PFNGLACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glActiveVaryingNV")) == NULL) || r; + r = ((glBeginTransformFeedbackNV = (PFNGLBEGINTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedbackNV")) == NULL) || r; + r = ((glBindBufferBaseNV = (PFNGLBINDBUFFERBASENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBaseNV")) == NULL) || r; + r = ((glBindBufferOffsetNV = (PFNGLBINDBUFFEROFFSETNVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferOffsetNV")) == NULL) || r; + r = ((glBindBufferRangeNV = (PFNGLBINDBUFFERRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRangeNV")) == NULL) || r; + r = ((glEndTransformFeedbackNV = (PFNGLENDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedbackNV")) == NULL) || r; + r = ((glGetActiveVaryingNV = (PFNGLGETACTIVEVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveVaryingNV")) == NULL) || r; + r = ((glGetTransformFeedbackVaryingNV = (PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetTransformFeedbackVaryingNV")) == NULL) || r; + r = ((glGetVaryingLocationNV = (PFNGLGETVARYINGLOCATIONNVPROC)glewGetProcAddress((const GLubyte*)"glGetVaryingLocationNV")) == NULL) || r; + r = ((glTransformFeedbackAttribsNV = (PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackAttribsNV")) == NULL) || r; + r = ((glTransformFeedbackVaryingsNV = (PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC)glewGetProcAddress((const GLubyte*)"glTransformFeedbackVaryingsNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_transform_feedback */ + +#ifdef GL_NV_transform_feedback2 + +static GLboolean _glewInit_GL_NV_transform_feedback2 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBindTransformFeedbackNV = (PFNGLBINDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedbackNV")) == NULL) || r; + r = ((glDeleteTransformFeedbacksNV = (PFNGLDELETETRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacksNV")) == NULL) || r; + r = ((glDrawTransformFeedbackNV = (PFNGLDRAWTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackNV")) == NULL) || r; + r = ((glGenTransformFeedbacksNV = (PFNGLGENTRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacksNV")) == NULL) || r; + r = ((glIsTransformFeedbackNV = (PFNGLISTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedbackNV")) == NULL) || r; + r = ((glPauseTransformFeedbackNV = (PFNGLPAUSETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedbackNV")) == NULL) || r; + r = ((glResumeTransformFeedbackNV = (PFNGLRESUMETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedbackNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_transform_feedback2 */ + +#ifdef GL_NV_vdpau_interop + +static GLboolean _glewInit_GL_NV_vdpau_interop (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUFiniNV")) == NULL) || r; + r = ((glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUGetSurfaceivNV")) == NULL) || r; + r = ((glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUInitNV")) == NULL) || r; + r = ((glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUIsSurfaceNV")) == NULL) || r; + r = ((glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUMapSurfacesNV")) == NULL) || r; + r = ((glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterOutputSurfaceNV")) == NULL) || r; + r = ((glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterVideoSurfaceNV")) == NULL) || r; + r = ((glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUSurfaceAccessNV")) == NULL) || r; + r = ((glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnmapSurfacesNV")) == NULL) || r; + r = ((glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnregisterSurfaceNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_vdpau_interop */ + +#ifdef GL_NV_vertex_array_range + +static GLboolean _glewInit_GL_NV_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFlushVertexArrayRangeNV = (PFNGLFLUSHVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glFlushVertexArrayRangeNV")) == NULL) || r; + r = ((glVertexArrayRangeNV = (PFNGLVERTEXARRAYRANGENVPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayRangeNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_vertex_array_range */ + +#ifdef GL_NV_vertex_attrib_integer_64bit + +static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetVertexAttribLi64vNV = (PFNGLGETVERTEXATTRIBLI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLi64vNV")) == NULL) || r; + r = ((glGetVertexAttribLui64vNV = (PFNGLGETVERTEXATTRIBLUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vNV")) == NULL) || r; + r = ((glVertexAttribL1i64NV = (PFNGLVERTEXATTRIBL1I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64NV")) == NULL) || r; + r = ((glVertexAttribL1i64vNV = (PFNGLVERTEXATTRIBL1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64vNV")) == NULL) || r; + r = ((glVertexAttribL1ui64NV = (PFNGLVERTEXATTRIBL1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64NV")) == NULL) || r; + r = ((glVertexAttribL1ui64vNV = (PFNGLVERTEXATTRIBL1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vNV")) == NULL) || r; + r = ((glVertexAttribL2i64NV = (PFNGLVERTEXATTRIBL2I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64NV")) == NULL) || r; + r = ((glVertexAttribL2i64vNV = (PFNGLVERTEXATTRIBL2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64vNV")) == NULL) || r; + r = ((glVertexAttribL2ui64NV = (PFNGLVERTEXATTRIBL2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64NV")) == NULL) || r; + r = ((glVertexAttribL2ui64vNV = (PFNGLVERTEXATTRIBL2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64vNV")) == NULL) || r; + r = ((glVertexAttribL3i64NV = (PFNGLVERTEXATTRIBL3I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64NV")) == NULL) || r; + r = ((glVertexAttribL3i64vNV = (PFNGLVERTEXATTRIBL3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64vNV")) == NULL) || r; + r = ((glVertexAttribL3ui64NV = (PFNGLVERTEXATTRIBL3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64NV")) == NULL) || r; + r = ((glVertexAttribL3ui64vNV = (PFNGLVERTEXATTRIBL3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64vNV")) == NULL) || r; + r = ((glVertexAttribL4i64NV = (PFNGLVERTEXATTRIBL4I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64NV")) == NULL) || r; + r = ((glVertexAttribL4i64vNV = (PFNGLVERTEXATTRIBL4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64vNV")) == NULL) || r; + r = ((glVertexAttribL4ui64NV = (PFNGLVERTEXATTRIBL4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64NV")) == NULL) || r; + r = ((glVertexAttribL4ui64vNV = (PFNGLVERTEXATTRIBL4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64vNV")) == NULL) || r; + r = ((glVertexAttribLFormatNV = (PFNGLVERTEXATTRIBLFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormatNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_vertex_attrib_integer_64bit */ + +#ifdef GL_NV_vertex_buffer_unified_memory + +static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBufferAddressRangeNV = (PFNGLBUFFERADDRESSRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBufferAddressRangeNV")) == NULL) || r; + r = ((glColorFormatNV = (PFNGLCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glColorFormatNV")) == NULL) || r; + r = ((glEdgeFlagFormatNV = (PFNGLEDGEFLAGFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagFormatNV")) == NULL) || r; + r = ((glFogCoordFormatNV = (PFNGLFOGCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordFormatNV")) == NULL) || r; + r = ((glGetIntegerui64i_vNV = (PFNGLGETINTEGERUI64I_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64i_vNV")) == NULL) || r; + r = ((glIndexFormatNV = (PFNGLINDEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glIndexFormatNV")) == NULL) || r; + r = ((glNormalFormatNV = (PFNGLNORMALFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glNormalFormatNV")) == NULL) || r; + r = ((glSecondaryColorFormatNV = (PFNGLSECONDARYCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorFormatNV")) == NULL) || r; + r = ((glTexCoordFormatNV = (PFNGLTEXCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordFormatNV")) == NULL) || r; + r = ((glVertexAttribFormatNV = (PFNGLVERTEXATTRIBFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormatNV")) == NULL) || r; + r = ((glVertexAttribIFormatNV = (PFNGLVERTEXATTRIBIFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormatNV")) == NULL) || r; + r = ((glVertexFormatNV = (PFNGLVERTEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexFormatNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_vertex_buffer_unified_memory */ + +#ifdef GL_NV_vertex_program + +static GLboolean _glewInit_GL_NV_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAreProgramsResidentNV = (PFNGLAREPROGRAMSRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glAreProgramsResidentNV")) == NULL) || r; + r = ((glBindProgramNV = (PFNGLBINDPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glBindProgramNV")) == NULL) || r; + r = ((glDeleteProgramsNV = (PFNGLDELETEPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramsNV")) == NULL) || r; + r = ((glExecuteProgramNV = (PFNGLEXECUTEPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glExecuteProgramNV")) == NULL) || r; + r = ((glGenProgramsNV = (PFNGLGENPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glGenProgramsNV")) == NULL) || r; + r = ((glGetProgramParameterdvNV = (PFNGLGETPROGRAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterdvNV")) == NULL) || r; + r = ((glGetProgramParameterfvNV = (PFNGLGETPROGRAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramParameterfvNV")) == NULL) || r; + r = ((glGetProgramStringNV = (PFNGLGETPROGRAMSTRINGNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStringNV")) == NULL) || r; + r = ((glGetProgramivNV = (PFNGLGETPROGRAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramivNV")) == NULL) || r; + r = ((glGetTrackMatrixivNV = (PFNGLGETTRACKMATRIXIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetTrackMatrixivNV")) == NULL) || r; + r = ((glGetVertexAttribPointervNV = (PFNGLGETVERTEXATTRIBPOINTERVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribPointervNV")) == NULL) || r; + r = ((glGetVertexAttribdvNV = (PFNGLGETVERTEXATTRIBDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribdvNV")) == NULL) || r; + r = ((glGetVertexAttribfvNV = (PFNGLGETVERTEXATTRIBFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribfvNV")) == NULL) || r; + r = ((glGetVertexAttribivNV = (PFNGLGETVERTEXATTRIBIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribivNV")) == NULL) || r; + r = ((glIsProgramNV = (PFNGLISPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glIsProgramNV")) == NULL) || r; + r = ((glLoadProgramNV = (PFNGLLOADPROGRAMNVPROC)glewGetProcAddress((const GLubyte*)"glLoadProgramNV")) == NULL) || r; + r = ((glProgramParameter4dNV = (PFNGLPROGRAMPARAMETER4DNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dNV")) == NULL) || r; + r = ((glProgramParameter4dvNV = (PFNGLPROGRAMPARAMETER4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4dvNV")) == NULL) || r; + r = ((glProgramParameter4fNV = (PFNGLPROGRAMPARAMETER4FNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fNV")) == NULL) || r; + r = ((glProgramParameter4fvNV = (PFNGLPROGRAMPARAMETER4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameter4fvNV")) == NULL) || r; + r = ((glProgramParameters4dvNV = (PFNGLPROGRAMPARAMETERS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4dvNV")) == NULL) || r; + r = ((glProgramParameters4fvNV = (PFNGLPROGRAMPARAMETERS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glProgramParameters4fvNV")) == NULL) || r; + r = ((glRequestResidentProgramsNV = (PFNGLREQUESTRESIDENTPROGRAMSNVPROC)glewGetProcAddress((const GLubyte*)"glRequestResidentProgramsNV")) == NULL) || r; + r = ((glTrackMatrixNV = (PFNGLTRACKMATRIXNVPROC)glewGetProcAddress((const GLubyte*)"glTrackMatrixNV")) == NULL) || r; + r = ((glVertexAttrib1dNV = (PFNGLVERTEXATTRIB1DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dNV")) == NULL) || r; + r = ((glVertexAttrib1dvNV = (PFNGLVERTEXATTRIB1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1dvNV")) == NULL) || r; + r = ((glVertexAttrib1fNV = (PFNGLVERTEXATTRIB1FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fNV")) == NULL) || r; + r = ((glVertexAttrib1fvNV = (PFNGLVERTEXATTRIB1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1fvNV")) == NULL) || r; + r = ((glVertexAttrib1sNV = (PFNGLVERTEXATTRIB1SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1sNV")) == NULL) || r; + r = ((glVertexAttrib1svNV = (PFNGLVERTEXATTRIB1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib1svNV")) == NULL) || r; + r = ((glVertexAttrib2dNV = (PFNGLVERTEXATTRIB2DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dNV")) == NULL) || r; + r = ((glVertexAttrib2dvNV = (PFNGLVERTEXATTRIB2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2dvNV")) == NULL) || r; + r = ((glVertexAttrib2fNV = (PFNGLVERTEXATTRIB2FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fNV")) == NULL) || r; + r = ((glVertexAttrib2fvNV = (PFNGLVERTEXATTRIB2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2fvNV")) == NULL) || r; + r = ((glVertexAttrib2sNV = (PFNGLVERTEXATTRIB2SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2sNV")) == NULL) || r; + r = ((glVertexAttrib2svNV = (PFNGLVERTEXATTRIB2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib2svNV")) == NULL) || r; + r = ((glVertexAttrib3dNV = (PFNGLVERTEXATTRIB3DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dNV")) == NULL) || r; + r = ((glVertexAttrib3dvNV = (PFNGLVERTEXATTRIB3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3dvNV")) == NULL) || r; + r = ((glVertexAttrib3fNV = (PFNGLVERTEXATTRIB3FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fNV")) == NULL) || r; + r = ((glVertexAttrib3fvNV = (PFNGLVERTEXATTRIB3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3fvNV")) == NULL) || r; + r = ((glVertexAttrib3sNV = (PFNGLVERTEXATTRIB3SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3sNV")) == NULL) || r; + r = ((glVertexAttrib3svNV = (PFNGLVERTEXATTRIB3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib3svNV")) == NULL) || r; + r = ((glVertexAttrib4dNV = (PFNGLVERTEXATTRIB4DNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dNV")) == NULL) || r; + r = ((glVertexAttrib4dvNV = (PFNGLVERTEXATTRIB4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4dvNV")) == NULL) || r; + r = ((glVertexAttrib4fNV = (PFNGLVERTEXATTRIB4FNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fNV")) == NULL) || r; + r = ((glVertexAttrib4fvNV = (PFNGLVERTEXATTRIB4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4fvNV")) == NULL) || r; + r = ((glVertexAttrib4sNV = (PFNGLVERTEXATTRIB4SNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4sNV")) == NULL) || r; + r = ((glVertexAttrib4svNV = (PFNGLVERTEXATTRIB4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4svNV")) == NULL) || r; + r = ((glVertexAttrib4ubNV = (PFNGLVERTEXATTRIB4UBNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubNV")) == NULL) || r; + r = ((glVertexAttrib4ubvNV = (PFNGLVERTEXATTRIB4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttrib4ubvNV")) == NULL) || r; + r = ((glVertexAttribPointerNV = (PFNGLVERTEXATTRIBPOINTERNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribPointerNV")) == NULL) || r; + r = ((glVertexAttribs1dvNV = (PFNGLVERTEXATTRIBS1DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1dvNV")) == NULL) || r; + r = ((glVertexAttribs1fvNV = (PFNGLVERTEXATTRIBS1FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1fvNV")) == NULL) || r; + r = ((glVertexAttribs1svNV = (PFNGLVERTEXATTRIBS1SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs1svNV")) == NULL) || r; + r = ((glVertexAttribs2dvNV = (PFNGLVERTEXATTRIBS2DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2dvNV")) == NULL) || r; + r = ((glVertexAttribs2fvNV = (PFNGLVERTEXATTRIBS2FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2fvNV")) == NULL) || r; + r = ((glVertexAttribs2svNV = (PFNGLVERTEXATTRIBS2SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs2svNV")) == NULL) || r; + r = ((glVertexAttribs3dvNV = (PFNGLVERTEXATTRIBS3DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3dvNV")) == NULL) || r; + r = ((glVertexAttribs3fvNV = (PFNGLVERTEXATTRIBS3FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3fvNV")) == NULL) || r; + r = ((glVertexAttribs3svNV = (PFNGLVERTEXATTRIBS3SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs3svNV")) == NULL) || r; + r = ((glVertexAttribs4dvNV = (PFNGLVERTEXATTRIBS4DVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4dvNV")) == NULL) || r; + r = ((glVertexAttribs4fvNV = (PFNGLVERTEXATTRIBS4FVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4fvNV")) == NULL) || r; + r = ((glVertexAttribs4svNV = (PFNGLVERTEXATTRIBS4SVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4svNV")) == NULL) || r; + r = ((glVertexAttribs4ubvNV = (PFNGLVERTEXATTRIBS4UBVNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribs4ubvNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_vertex_program */ + +#ifdef GL_NV_video_capture + +static GLboolean _glewInit_GL_NV_video_capture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glBeginVideoCaptureNV = (PFNGLBEGINVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glBeginVideoCaptureNV")) == NULL) || r; + r = ((glBindVideoCaptureStreamBufferNV = (PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamBufferNV")) == NULL) || r; + r = ((glBindVideoCaptureStreamTextureNV = (PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC)glewGetProcAddress((const GLubyte*)"glBindVideoCaptureStreamTextureNV")) == NULL) || r; + r = ((glEndVideoCaptureNV = (PFNGLENDVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glEndVideoCaptureNV")) == NULL) || r; + r = ((glGetVideoCaptureStreamdvNV = (PFNGLGETVIDEOCAPTURESTREAMDVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamdvNV")) == NULL) || r; + r = ((glGetVideoCaptureStreamfvNV = (PFNGLGETVIDEOCAPTURESTREAMFVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamfvNV")) == NULL) || r; + r = ((glGetVideoCaptureStreamivNV = (PFNGLGETVIDEOCAPTURESTREAMIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureStreamivNV")) == NULL) || r; + r = ((glGetVideoCaptureivNV = (PFNGLGETVIDEOCAPTUREIVNVPROC)glewGetProcAddress((const GLubyte*)"glGetVideoCaptureivNV")) == NULL) || r; + r = ((glVideoCaptureNV = (PFNGLVIDEOCAPTURENVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureNV")) == NULL) || r; + r = ((glVideoCaptureStreamParameterdvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterdvNV")) == NULL) || r; + r = ((glVideoCaptureStreamParameterfvNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterfvNV")) == NULL) || r; + r = ((glVideoCaptureStreamParameterivNV = (PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC)glewGetProcAddress((const GLubyte*)"glVideoCaptureStreamParameterivNV")) == NULL) || r; + + return r; +} + +#endif /* GL_NV_video_capture */ + +#ifdef GL_OES_single_precision + +static GLboolean _glewInit_GL_OES_single_precision (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClearDepthfOES = (PFNGLCLEARDEPTHFOESPROC)glewGetProcAddress((const GLubyte*)"glClearDepthfOES")) == NULL) || r; + r = ((glClipPlanefOES = (PFNGLCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glClipPlanefOES")) == NULL) || r; + r = ((glDepthRangefOES = (PFNGLDEPTHRANGEFOESPROC)glewGetProcAddress((const GLubyte*)"glDepthRangefOES")) == NULL) || r; + r = ((glFrustumfOES = (PFNGLFRUSTUMFOESPROC)glewGetProcAddress((const GLubyte*)"glFrustumfOES")) == NULL) || r; + r = ((glGetClipPlanefOES = (PFNGLGETCLIPPLANEFOESPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanefOES")) == NULL) || r; + r = ((glOrthofOES = (PFNGLORTHOFOESPROC)glewGetProcAddress((const GLubyte*)"glOrthofOES")) == NULL) || r; + + return r; +} + +#endif /* GL_OES_single_precision */ + +#ifdef GL_OVR_multiview + +static GLboolean _glewInit_GL_OVR_multiview (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureMultiviewOVR")) == NULL) || r; + + return r; +} + +#endif /* GL_OVR_multiview */ + +#ifdef GL_REGAL_ES1_0_compatibility + +static GLboolean _glewInit_GL_REGAL_ES1_0_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAlphaFuncx = (PFNGLALPHAFUNCXPROC)glewGetProcAddress((const GLubyte*)"glAlphaFuncx")) == NULL) || r; + r = ((glClearColorx = (PFNGLCLEARCOLORXPROC)glewGetProcAddress((const GLubyte*)"glClearColorx")) == NULL) || r; + r = ((glClearDepthx = (PFNGLCLEARDEPTHXPROC)glewGetProcAddress((const GLubyte*)"glClearDepthx")) == NULL) || r; + r = ((glColor4x = (PFNGLCOLOR4XPROC)glewGetProcAddress((const GLubyte*)"glColor4x")) == NULL) || r; + r = ((glDepthRangex = (PFNGLDEPTHRANGEXPROC)glewGetProcAddress((const GLubyte*)"glDepthRangex")) == NULL) || r; + r = ((glFogx = (PFNGLFOGXPROC)glewGetProcAddress((const GLubyte*)"glFogx")) == NULL) || r; + r = ((glFogxv = (PFNGLFOGXVPROC)glewGetProcAddress((const GLubyte*)"glFogxv")) == NULL) || r; + r = ((glFrustumf = (PFNGLFRUSTUMFPROC)glewGetProcAddress((const GLubyte*)"glFrustumf")) == NULL) || r; + r = ((glFrustumx = (PFNGLFRUSTUMXPROC)glewGetProcAddress((const GLubyte*)"glFrustumx")) == NULL) || r; + r = ((glLightModelx = (PFNGLLIGHTMODELXPROC)glewGetProcAddress((const GLubyte*)"glLightModelx")) == NULL) || r; + r = ((glLightModelxv = (PFNGLLIGHTMODELXVPROC)glewGetProcAddress((const GLubyte*)"glLightModelxv")) == NULL) || r; + r = ((glLightx = (PFNGLLIGHTXPROC)glewGetProcAddress((const GLubyte*)"glLightx")) == NULL) || r; + r = ((glLightxv = (PFNGLLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glLightxv")) == NULL) || r; + r = ((glLineWidthx = (PFNGLLINEWIDTHXPROC)glewGetProcAddress((const GLubyte*)"glLineWidthx")) == NULL) || r; + r = ((glLoadMatrixx = (PFNGLLOADMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glLoadMatrixx")) == NULL) || r; + r = ((glMaterialx = (PFNGLMATERIALXPROC)glewGetProcAddress((const GLubyte*)"glMaterialx")) == NULL) || r; + r = ((glMaterialxv = (PFNGLMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glMaterialxv")) == NULL) || r; + r = ((glMultMatrixx = (PFNGLMULTMATRIXXPROC)glewGetProcAddress((const GLubyte*)"glMultMatrixx")) == NULL) || r; + r = ((glMultiTexCoord4x = (PFNGLMULTITEXCOORD4XPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoord4x")) == NULL) || r; + r = ((glNormal3x = (PFNGLNORMAL3XPROC)glewGetProcAddress((const GLubyte*)"glNormal3x")) == NULL) || r; + r = ((glOrthof = (PFNGLORTHOFPROC)glewGetProcAddress((const GLubyte*)"glOrthof")) == NULL) || r; + r = ((glOrthox = (PFNGLORTHOXPROC)glewGetProcAddress((const GLubyte*)"glOrthox")) == NULL) || r; + r = ((glPointSizex = (PFNGLPOINTSIZEXPROC)glewGetProcAddress((const GLubyte*)"glPointSizex")) == NULL) || r; + r = ((glPolygonOffsetx = (PFNGLPOLYGONOFFSETXPROC)glewGetProcAddress((const GLubyte*)"glPolygonOffsetx")) == NULL) || r; + r = ((glRotatex = (PFNGLROTATEXPROC)glewGetProcAddress((const GLubyte*)"glRotatex")) == NULL) || r; + r = ((glSampleCoveragex = (PFNGLSAMPLECOVERAGEXPROC)glewGetProcAddress((const GLubyte*)"glSampleCoveragex")) == NULL) || r; + r = ((glScalex = (PFNGLSCALEXPROC)glewGetProcAddress((const GLubyte*)"glScalex")) == NULL) || r; + r = ((glTexEnvx = (PFNGLTEXENVXPROC)glewGetProcAddress((const GLubyte*)"glTexEnvx")) == NULL) || r; + r = ((glTexEnvxv = (PFNGLTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glTexEnvxv")) == NULL) || r; + r = ((glTexParameterx = (PFNGLTEXPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glTexParameterx")) == NULL) || r; + r = ((glTranslatex = (PFNGLTRANSLATEXPROC)glewGetProcAddress((const GLubyte*)"glTranslatex")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_ES1_0_compatibility */ + +#ifdef GL_REGAL_ES1_1_compatibility + +static GLboolean _glewInit_GL_REGAL_ES1_1_compatibility (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glClipPlanef = (PFNGLCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glClipPlanef")) == NULL) || r; + r = ((glClipPlanex = (PFNGLCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glClipPlanex")) == NULL) || r; + r = ((glGetClipPlanef = (PFNGLGETCLIPPLANEFPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanef")) == NULL) || r; + r = ((glGetClipPlanex = (PFNGLGETCLIPPLANEXPROC)glewGetProcAddress((const GLubyte*)"glGetClipPlanex")) == NULL) || r; + r = ((glGetFixedv = (PFNGLGETFIXEDVPROC)glewGetProcAddress((const GLubyte*)"glGetFixedv")) == NULL) || r; + r = ((glGetLightxv = (PFNGLGETLIGHTXVPROC)glewGetProcAddress((const GLubyte*)"glGetLightxv")) == NULL) || r; + r = ((glGetMaterialxv = (PFNGLGETMATERIALXVPROC)glewGetProcAddress((const GLubyte*)"glGetMaterialxv")) == NULL) || r; + r = ((glGetTexEnvxv = (PFNGLGETTEXENVXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexEnvxv")) == NULL) || r; + r = ((glGetTexParameterxv = (PFNGLGETTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterxv")) == NULL) || r; + r = ((glPointParameterx = (PFNGLPOINTPARAMETERXPROC)glewGetProcAddress((const GLubyte*)"glPointParameterx")) == NULL) || r; + r = ((glPointParameterxv = (PFNGLPOINTPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glPointParameterxv")) == NULL) || r; + r = ((glPointSizePointerOES = (PFNGLPOINTSIZEPOINTEROESPROC)glewGetProcAddress((const GLubyte*)"glPointSizePointerOES")) == NULL) || r; + r = ((glTexParameterxv = (PFNGLTEXPARAMETERXVPROC)glewGetProcAddress((const GLubyte*)"glTexParameterxv")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_ES1_1_compatibility */ + +#ifdef GL_REGAL_error_string + +static GLboolean _glewInit_GL_REGAL_error_string (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glErrorStringREGAL = (PFNGLERRORSTRINGREGALPROC)glewGetProcAddress((const GLubyte*)"glErrorStringREGAL")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_error_string */ + +#ifdef GL_REGAL_extension_query + +static GLboolean _glewInit_GL_REGAL_extension_query (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetExtensionREGAL = (PFNGLGETEXTENSIONREGALPROC)glewGetProcAddress((const GLubyte*)"glGetExtensionREGAL")) == NULL) || r; + r = ((glIsSupportedREGAL = (PFNGLISSUPPORTEDREGALPROC)glewGetProcAddress((const GLubyte*)"glIsSupportedREGAL")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_extension_query */ + +#ifdef GL_REGAL_log + +static GLboolean _glewInit_GL_REGAL_log (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glLogMessageCallbackREGAL = (PFNGLLOGMESSAGECALLBACKREGALPROC)glewGetProcAddress((const GLubyte*)"glLogMessageCallbackREGAL")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_log */ + +#ifdef GL_REGAL_proc_address + +static GLboolean _glewInit_GL_REGAL_proc_address (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetProcAddressREGAL = (PFNGLGETPROCADDRESSREGALPROC)glewGetProcAddress((const GLubyte*)"glGetProcAddressREGAL")) == NULL) || r; + + return r; +} + +#endif /* GL_REGAL_proc_address */ + +#ifdef GL_SGIS_detail_texture + +static GLboolean _glewInit_GL_SGIS_detail_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glDetailTexFuncSGIS = (PFNGLDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glDetailTexFuncSGIS")) == NULL) || r; + r = ((glGetDetailTexFuncSGIS = (PFNGLGETDETAILTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetDetailTexFuncSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_detail_texture */ + +#ifdef GL_SGIS_fog_function + +static GLboolean _glewInit_GL_SGIS_fog_function (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFogFuncSGIS = (PFNGLFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glFogFuncSGIS")) == NULL) || r; + r = ((glGetFogFuncSGIS = (PFNGLGETFOGFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetFogFuncSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_fog_function */ + +#ifdef GL_SGIS_multisample + +static GLboolean _glewInit_GL_SGIS_multisample (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glSampleMaskSGIS = (PFNGLSAMPLEMASKSGISPROC)glewGetProcAddress((const GLubyte*)"glSampleMaskSGIS")) == NULL) || r; + r = ((glSamplePatternSGIS = (PFNGLSAMPLEPATTERNSGISPROC)glewGetProcAddress((const GLubyte*)"glSamplePatternSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_multisample */ + +#ifdef GL_SGIS_sharpen_texture + +static GLboolean _glewInit_GL_SGIS_sharpen_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetSharpenTexFuncSGIS = (PFNGLGETSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetSharpenTexFuncSGIS")) == NULL) || r; + r = ((glSharpenTexFuncSGIS = (PFNGLSHARPENTEXFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glSharpenTexFuncSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_sharpen_texture */ + +#ifdef GL_SGIS_texture4D + +static GLboolean _glewInit_GL_SGIS_texture4D (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTexImage4DSGIS = (PFNGLTEXIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexImage4DSGIS")) == NULL) || r; + r = ((glTexSubImage4DSGIS = (PFNGLTEXSUBIMAGE4DSGISPROC)glewGetProcAddress((const GLubyte*)"glTexSubImage4DSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_texture4D */ + +#ifdef GL_SGIS_texture_filter4 + +static GLboolean _glewInit_GL_SGIS_texture_filter4 (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGetTexFilterFuncSGIS = (PFNGLGETTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glGetTexFilterFuncSGIS")) == NULL) || r; + r = ((glTexFilterFuncSGIS = (PFNGLTEXFILTERFUNCSGISPROC)glewGetProcAddress((const GLubyte*)"glTexFilterFuncSGIS")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIS_texture_filter4 */ + +#ifdef GL_SGIX_async + +static GLboolean _glewInit_GL_SGIX_async (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAsyncMarkerSGIX = (PFNGLASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glAsyncMarkerSGIX")) == NULL) || r; + r = ((glDeleteAsyncMarkersSGIX = (PFNGLDELETEASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glDeleteAsyncMarkersSGIX")) == NULL) || r; + r = ((glFinishAsyncSGIX = (PFNGLFINISHASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glFinishAsyncSGIX")) == NULL) || r; + r = ((glGenAsyncMarkersSGIX = (PFNGLGENASYNCMARKERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glGenAsyncMarkersSGIX")) == NULL) || r; + r = ((glIsAsyncMarkerSGIX = (PFNGLISASYNCMARKERSGIXPROC)glewGetProcAddress((const GLubyte*)"glIsAsyncMarkerSGIX")) == NULL) || r; + r = ((glPollAsyncSGIX = (PFNGLPOLLASYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glPollAsyncSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_async */ + +#ifdef GL_SGIX_flush_raster + +static GLboolean _glewInit_GL_SGIX_flush_raster (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFlushRasterSGIX = (PFNGLFLUSHRASTERSGIXPROC)glewGetProcAddress((const GLubyte*)"glFlushRasterSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_flush_raster */ + +#ifdef GL_SGIX_fog_texture + +static GLboolean _glewInit_GL_SGIX_fog_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTextureFogSGIX = (PFNGLTEXTUREFOGSGIXPROC)glewGetProcAddress((const GLubyte*)"glTextureFogSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_fog_texture */ + +#ifdef GL_SGIX_fragment_specular_lighting + +static GLboolean _glewInit_GL_SGIX_fragment_specular_lighting (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFragmentColorMaterialSGIX = (PFNGLFRAGMENTCOLORMATERIALSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentColorMaterialSGIX")) == NULL) || r; + r = ((glFragmentLightModelfSGIX = (PFNGLFRAGMENTLIGHTMODELFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfSGIX")) == NULL) || r; + r = ((glFragmentLightModelfvSGIX = (PFNGLFRAGMENTLIGHTMODELFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelfvSGIX")) == NULL) || r; + r = ((glFragmentLightModeliSGIX = (PFNGLFRAGMENTLIGHTMODELISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModeliSGIX")) == NULL) || r; + r = ((glFragmentLightModelivSGIX = (PFNGLFRAGMENTLIGHTMODELIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightModelivSGIX")) == NULL) || r; + r = ((glFragmentLightfSGIX = (PFNGLFRAGMENTLIGHTFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfSGIX")) == NULL) || r; + r = ((glFragmentLightfvSGIX = (PFNGLFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightfvSGIX")) == NULL) || r; + r = ((glFragmentLightiSGIX = (PFNGLFRAGMENTLIGHTISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightiSGIX")) == NULL) || r; + r = ((glFragmentLightivSGIX = (PFNGLFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentLightivSGIX")) == NULL) || r; + r = ((glFragmentMaterialfSGIX = (PFNGLFRAGMENTMATERIALFSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfSGIX")) == NULL) || r; + r = ((glFragmentMaterialfvSGIX = (PFNGLFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialfvSGIX")) == NULL) || r; + r = ((glFragmentMaterialiSGIX = (PFNGLFRAGMENTMATERIALISGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialiSGIX")) == NULL) || r; + r = ((glFragmentMaterialivSGIX = (PFNGLFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glFragmentMaterialivSGIX")) == NULL) || r; + r = ((glGetFragmentLightfvSGIX = (PFNGLGETFRAGMENTLIGHTFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightfvSGIX")) == NULL) || r; + r = ((glGetFragmentLightivSGIX = (PFNGLGETFRAGMENTLIGHTIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentLightivSGIX")) == NULL) || r; + r = ((glGetFragmentMaterialfvSGIX = (PFNGLGETFRAGMENTMATERIALFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialfvSGIX")) == NULL) || r; + r = ((glGetFragmentMaterialivSGIX = (PFNGLGETFRAGMENTMATERIALIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glGetFragmentMaterialivSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_fragment_specular_lighting */ + +#ifdef GL_SGIX_framezoom + +static GLboolean _glewInit_GL_SGIX_framezoom (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFrameZoomSGIX = (PFNGLFRAMEZOOMSGIXPROC)glewGetProcAddress((const GLubyte*)"glFrameZoomSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_framezoom */ + +#ifdef GL_SGIX_pixel_texture + +static GLboolean _glewInit_GL_SGIX_pixel_texture (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glPixelTexGenSGIX = (PFNGLPIXELTEXGENSGIXPROC)glewGetProcAddress((const GLubyte*)"glPixelTexGenSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_pixel_texture */ + +#ifdef GL_SGIX_reference_plane + +static GLboolean _glewInit_GL_SGIX_reference_plane (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glReferencePlaneSGIX = (PFNGLREFERENCEPLANESGIXPROC)glewGetProcAddress((const GLubyte*)"glReferencePlaneSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_reference_plane */ + +#ifdef GL_SGIX_sprite + +static GLboolean _glewInit_GL_SGIX_sprite (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glSpriteParameterfSGIX = (PFNGLSPRITEPARAMETERFSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfSGIX")) == NULL) || r; + r = ((glSpriteParameterfvSGIX = (PFNGLSPRITEPARAMETERFVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterfvSGIX")) == NULL) || r; + r = ((glSpriteParameteriSGIX = (PFNGLSPRITEPARAMETERISGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameteriSGIX")) == NULL) || r; + r = ((glSpriteParameterivSGIX = (PFNGLSPRITEPARAMETERIVSGIXPROC)glewGetProcAddress((const GLubyte*)"glSpriteParameterivSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_sprite */ + +#ifdef GL_SGIX_tag_sample_buffer + +static GLboolean _glewInit_GL_SGIX_tag_sample_buffer (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glTagSampleBufferSGIX = (PFNGLTAGSAMPLEBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glTagSampleBufferSGIX")) == NULL) || r; + + return r; +} + +#endif /* GL_SGIX_tag_sample_buffer */ + +#ifdef GL_SGI_color_table + +static GLboolean _glewInit_GL_SGI_color_table (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColorTableParameterfvSGI = (PFNGLCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterfvSGI")) == NULL) || r; + r = ((glColorTableParameterivSGI = (PFNGLCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableParameterivSGI")) == NULL) || r; + r = ((glColorTableSGI = (PFNGLCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glColorTableSGI")) == NULL) || r; + r = ((glCopyColorTableSGI = (PFNGLCOPYCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glCopyColorTableSGI")) == NULL) || r; + r = ((glGetColorTableParameterfvSGI = (PFNGLGETCOLORTABLEPARAMETERFVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterfvSGI")) == NULL) || r; + r = ((glGetColorTableParameterivSGI = (PFNGLGETCOLORTABLEPARAMETERIVSGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableParameterivSGI")) == NULL) || r; + r = ((glGetColorTableSGI = (PFNGLGETCOLORTABLESGIPROC)glewGetProcAddress((const GLubyte*)"glGetColorTableSGI")) == NULL) || r; + + return r; +} + +#endif /* GL_SGI_color_table */ + +#ifdef GL_SUNX_constant_data + +static GLboolean _glewInit_GL_SUNX_constant_data (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glFinishTextureSUNX = (PFNGLFINISHTEXTURESUNXPROC)glewGetProcAddress((const GLubyte*)"glFinishTextureSUNX")) == NULL) || r; + + return r; +} + +#endif /* GL_SUNX_constant_data */ + +#ifdef GL_SUN_global_alpha + +static GLboolean _glewInit_GL_SUN_global_alpha (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glGlobalAlphaFactorbSUN = (PFNGLGLOBALALPHAFACTORBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorbSUN")) == NULL) || r; + r = ((glGlobalAlphaFactordSUN = (PFNGLGLOBALALPHAFACTORDSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactordSUN")) == NULL) || r; + r = ((glGlobalAlphaFactorfSUN = (PFNGLGLOBALALPHAFACTORFSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorfSUN")) == NULL) || r; + r = ((glGlobalAlphaFactoriSUN = (PFNGLGLOBALALPHAFACTORISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoriSUN")) == NULL) || r; + r = ((glGlobalAlphaFactorsSUN = (PFNGLGLOBALALPHAFACTORSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorsSUN")) == NULL) || r; + r = ((glGlobalAlphaFactorubSUN = (PFNGLGLOBALALPHAFACTORUBSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorubSUN")) == NULL) || r; + r = ((glGlobalAlphaFactoruiSUN = (PFNGLGLOBALALPHAFACTORUISUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactoruiSUN")) == NULL) || r; + r = ((glGlobalAlphaFactorusSUN = (PFNGLGLOBALALPHAFACTORUSSUNPROC)glewGetProcAddress((const GLubyte*)"glGlobalAlphaFactorusSUN")) == NULL) || r; + + return r; +} + +#endif /* GL_SUN_global_alpha */ + +#ifdef GL_SUN_read_video_pixels + +static GLboolean _glewInit_GL_SUN_read_video_pixels (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glReadVideoPixelsSUN = (PFNGLREADVIDEOPIXELSSUNPROC)glewGetProcAddress((const GLubyte*)"glReadVideoPixelsSUN")) == NULL) || r; + + return r; +} + +#endif /* GL_SUN_read_video_pixels */ + +#ifdef GL_SUN_triangle_list + +static GLboolean _glewInit_GL_SUN_triangle_list (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glReplacementCodePointerSUN = (PFNGLREPLACEMENTCODEPOINTERSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodePointerSUN")) == NULL) || r; + r = ((glReplacementCodeubSUN = (PFNGLREPLACEMENTCODEUBSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubSUN")) == NULL) || r; + r = ((glReplacementCodeubvSUN = (PFNGLREPLACEMENTCODEUBVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeubvSUN")) == NULL) || r; + r = ((glReplacementCodeuiSUN = (PFNGLREPLACEMENTCODEUISUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiSUN")) == NULL) || r; + r = ((glReplacementCodeuivSUN = (PFNGLREPLACEMENTCODEUIVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuivSUN")) == NULL) || r; + r = ((glReplacementCodeusSUN = (PFNGLREPLACEMENTCODEUSSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusSUN")) == NULL) || r; + r = ((glReplacementCodeusvSUN = (PFNGLREPLACEMENTCODEUSVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeusvSUN")) == NULL) || r; + + return r; +} + +#endif /* GL_SUN_triangle_list */ + +#ifdef GL_SUN_vertex + +static GLboolean _glewInit_GL_SUN_vertex (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glColor3fVertex3fSUN = (PFNGLCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fSUN")) == NULL) || r; + r = ((glColor3fVertex3fvSUN = (PFNGLCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor3fVertex3fvSUN")) == NULL) || r; + r = ((glColor4fNormal3fVertex3fSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glColor4fNormal3fVertex3fvSUN = (PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glColor4ubVertex2fSUN = (PFNGLCOLOR4UBVERTEX2FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fSUN")) == NULL) || r; + r = ((glColor4ubVertex2fvSUN = (PFNGLCOLOR4UBVERTEX2FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex2fvSUN")) == NULL) || r; + r = ((glColor4ubVertex3fSUN = (PFNGLCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fSUN")) == NULL) || r; + r = ((glColor4ubVertex3fvSUN = (PFNGLCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glColor4ubVertex3fvSUN")) == NULL) || r; + r = ((glNormal3fVertex3fSUN = (PFNGLNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fSUN")) == NULL) || r; + r = ((glNormal3fVertex3fvSUN = (PFNGLNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor4ubVertex3fSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiColor4ubVertex3fvSUN = (PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiColor4ubVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fVertex3fSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiTexCoord2fVertex3fvSUN = (PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiTexCoord2fVertex3fvSUN")) == NULL) || r; + r = ((glReplacementCodeuiVertex3fSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fSUN")) == NULL) || r; + r = ((glReplacementCodeuiVertex3fvSUN = (PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glReplacementCodeuiVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fColor3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fColor3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor3fVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fColor4fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fColor4fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fColor4ubVertex3fSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fColor4ubVertex3fvSUN = (PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fColor4ubVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fNormal3fVertex3fSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fNormal3fVertex3fvSUN = (PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fNormal3fVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord2fVertex3fSUN = (PFNGLTEXCOORD2FVERTEX3FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fSUN")) == NULL) || r; + r = ((glTexCoord2fVertex3fvSUN = (PFNGLTEXCOORD2FVERTEX3FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord2fVertex3fvSUN")) == NULL) || r; + r = ((glTexCoord4fColor4fNormal3fVertex4fSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fSUN")) == NULL) || r; + r = ((glTexCoord4fColor4fNormal3fVertex4fvSUN = (PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fColor4fNormal3fVertex4fvSUN")) == NULL) || r; + r = ((glTexCoord4fVertex4fSUN = (PFNGLTEXCOORD4FVERTEX4FSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fSUN")) == NULL) || r; + r = ((glTexCoord4fVertex4fvSUN = (PFNGLTEXCOORD4FVERTEX4FVSUNPROC)glewGetProcAddress((const GLubyte*)"glTexCoord4fVertex4fvSUN")) == NULL) || r; + + return r; +} + +#endif /* GL_SUN_vertex */ + +#ifdef GL_WIN_swap_hint + +static GLboolean _glewInit_GL_WIN_swap_hint (GLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glAddSwapHintRectWIN = (PFNGLADDSWAPHINTRECTWINPROC)glewGetProcAddress((const GLubyte*)"glAddSwapHintRectWIN")) == NULL) || r; + + return r; +} + +#endif /* GL_WIN_swap_hint */ + +/* ------------------------------------------------------------------------- */ + +GLboolean GLEWAPIENTRY glewGetExtension (const char* name) +{ + const GLubyte* start; + const GLubyte* end; + start = (const GLubyte*)glGetString(GL_EXTENSIONS); + if (start == 0) + return GL_FALSE; + end = start + _glewStrLen(start); + return _glewSearchExtension(name, start, end); +} + +/* ------------------------------------------------------------------------- */ + +#ifndef GLEW_MX +static +#endif +GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST) +{ + const GLubyte* s; + GLuint dot; + GLint major, minor; + const GLubyte* extStart; + const GLubyte* extEnd; + /* query opengl version */ + s = glGetString(GL_VERSION); + dot = _glewStrCLen(s, '.'); + if (dot == 0) + return GLEW_ERROR_NO_GL_VERSION; + + major = s[dot-1]-'0'; + minor = s[dot+1]-'0'; + + if (minor < 0 || minor > 9) + minor = 0; + if (major<0 || major>9) + return GLEW_ERROR_NO_GL_VERSION; + + + if (major == 1 && minor == 0) + { + return GLEW_ERROR_GL_VERSION_10_ONLY; + } + else + { + GLEW_VERSION_4_5 = ( major > 4 ) || ( major == 4 && minor >= 5 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_4_4 = GLEW_VERSION_4_5 == GL_TRUE || ( major == 4 && minor >= 4 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_4_3 = GLEW_VERSION_4_4 == GL_TRUE || ( major == 4 && minor >= 3 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_4_2 = GLEW_VERSION_4_3 == GL_TRUE || ( major == 4 && minor >= 2 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_4_1 = GLEW_VERSION_4_2 == GL_TRUE || ( major == 4 && minor >= 1 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_4_0 = GLEW_VERSION_4_1 == GL_TRUE || ( major == 4 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_3_3 = GLEW_VERSION_4_0 == GL_TRUE || ( major == 3 && minor >= 3 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_3_2 = GLEW_VERSION_3_3 == GL_TRUE || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_3_1 = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_3_0 = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_2_1 = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_2_0 = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_1_5 = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_1_4 = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_1_3 = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_1_2_1 = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE; + GLEW_VERSION_1_2 = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE; + GLEW_VERSION_1_1 = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE; + } + + /* query opengl extensions string */ + extStart = glGetString(GL_EXTENSIONS); + if (extStart == 0) + extStart = (const GLubyte*)""; + extEnd = extStart + _glewStrLen(extStart); + + /* initialize extensions */ +#ifdef GL_VERSION_1_2 + if (glewExperimental || GLEW_VERSION_1_2) GLEW_VERSION_1_2 = !_glewInit_GL_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_1_2 */ +#ifdef GL_VERSION_1_2_1 +#endif /* GL_VERSION_1_2_1 */ +#ifdef GL_VERSION_1_3 + if (glewExperimental || GLEW_VERSION_1_3) GLEW_VERSION_1_3 = !_glewInit_GL_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_1_3 */ +#ifdef GL_VERSION_1_4 + if (glewExperimental || GLEW_VERSION_1_4) GLEW_VERSION_1_4 = !_glewInit_GL_VERSION_1_4(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_1_4 */ +#ifdef GL_VERSION_1_5 + if (glewExperimental || GLEW_VERSION_1_5) GLEW_VERSION_1_5 = !_glewInit_GL_VERSION_1_5(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_1_5 */ +#ifdef GL_VERSION_2_0 + if (glewExperimental || GLEW_VERSION_2_0) GLEW_VERSION_2_0 = !_glewInit_GL_VERSION_2_0(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_2_0 */ +#ifdef GL_VERSION_2_1 + if (glewExperimental || GLEW_VERSION_2_1) GLEW_VERSION_2_1 = !_glewInit_GL_VERSION_2_1(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_2_1 */ +#ifdef GL_VERSION_3_0 + if (glewExperimental || GLEW_VERSION_3_0) GLEW_VERSION_3_0 = !_glewInit_GL_VERSION_3_0(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_3_0 */ +#ifdef GL_VERSION_3_1 + if (glewExperimental || GLEW_VERSION_3_1) GLEW_VERSION_3_1 = !_glewInit_GL_VERSION_3_1(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_3_1 */ +#ifdef GL_VERSION_3_2 + if (glewExperimental || GLEW_VERSION_3_2) GLEW_VERSION_3_2 = !_glewInit_GL_VERSION_3_2(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_3_2 */ +#ifdef GL_VERSION_3_3 + if (glewExperimental || GLEW_VERSION_3_3) GLEW_VERSION_3_3 = !_glewInit_GL_VERSION_3_3(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_3_3 */ +#ifdef GL_VERSION_4_0 + if (glewExperimental || GLEW_VERSION_4_0) GLEW_VERSION_4_0 = !_glewInit_GL_VERSION_4_0(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_4_0 */ +#ifdef GL_VERSION_4_1 +#endif /* GL_VERSION_4_1 */ +#ifdef GL_VERSION_4_2 +#endif /* GL_VERSION_4_2 */ +#ifdef GL_VERSION_4_3 +#endif /* GL_VERSION_4_3 */ +#ifdef GL_VERSION_4_4 +#endif /* GL_VERSION_4_4 */ +#ifdef GL_VERSION_4_5 + if (glewExperimental || GLEW_VERSION_4_5) GLEW_VERSION_4_5 = !_glewInit_GL_VERSION_4_5(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_VERSION_4_5 */ +#ifdef GL_3DFX_multisample + GLEW_3DFX_multisample = _glewSearchExtension("GL_3DFX_multisample", extStart, extEnd); +#endif /* GL_3DFX_multisample */ +#ifdef GL_3DFX_tbuffer + GLEW_3DFX_tbuffer = _glewSearchExtension("GL_3DFX_tbuffer", extStart, extEnd); + if (glewExperimental || GLEW_3DFX_tbuffer) GLEW_3DFX_tbuffer = !_glewInit_GL_3DFX_tbuffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_3DFX_tbuffer */ +#ifdef GL_3DFX_texture_compression_FXT1 + GLEW_3DFX_texture_compression_FXT1 = _glewSearchExtension("GL_3DFX_texture_compression_FXT1", extStart, extEnd); +#endif /* GL_3DFX_texture_compression_FXT1 */ +#ifdef GL_AMD_blend_minmax_factor + GLEW_AMD_blend_minmax_factor = _glewSearchExtension("GL_AMD_blend_minmax_factor", extStart, extEnd); +#endif /* GL_AMD_blend_minmax_factor */ +#ifdef GL_AMD_conservative_depth + GLEW_AMD_conservative_depth = _glewSearchExtension("GL_AMD_conservative_depth", extStart, extEnd); +#endif /* GL_AMD_conservative_depth */ +#ifdef GL_AMD_debug_output + GLEW_AMD_debug_output = _glewSearchExtension("GL_AMD_debug_output", extStart, extEnd); + if (glewExperimental || GLEW_AMD_debug_output) GLEW_AMD_debug_output = !_glewInit_GL_AMD_debug_output(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_debug_output */ +#ifdef GL_AMD_depth_clamp_separate + GLEW_AMD_depth_clamp_separate = _glewSearchExtension("GL_AMD_depth_clamp_separate", extStart, extEnd); +#endif /* GL_AMD_depth_clamp_separate */ +#ifdef GL_AMD_draw_buffers_blend + GLEW_AMD_draw_buffers_blend = _glewSearchExtension("GL_AMD_draw_buffers_blend", extStart, extEnd); + if (glewExperimental || GLEW_AMD_draw_buffers_blend) GLEW_AMD_draw_buffers_blend = !_glewInit_GL_AMD_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_draw_buffers_blend */ +#ifdef GL_AMD_gcn_shader + GLEW_AMD_gcn_shader = _glewSearchExtension("GL_AMD_gcn_shader", extStart, extEnd); +#endif /* GL_AMD_gcn_shader */ +#ifdef GL_AMD_gpu_shader_int64 + GLEW_AMD_gpu_shader_int64 = _glewSearchExtension("GL_AMD_gpu_shader_int64", extStart, extEnd); +#endif /* GL_AMD_gpu_shader_int64 */ +#ifdef GL_AMD_interleaved_elements + GLEW_AMD_interleaved_elements = _glewSearchExtension("GL_AMD_interleaved_elements", extStart, extEnd); + if (glewExperimental || GLEW_AMD_interleaved_elements) GLEW_AMD_interleaved_elements = !_glewInit_GL_AMD_interleaved_elements(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_interleaved_elements */ +#ifdef GL_AMD_multi_draw_indirect + GLEW_AMD_multi_draw_indirect = _glewSearchExtension("GL_AMD_multi_draw_indirect", extStart, extEnd); + if (glewExperimental || GLEW_AMD_multi_draw_indirect) GLEW_AMD_multi_draw_indirect = !_glewInit_GL_AMD_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_multi_draw_indirect */ +#ifdef GL_AMD_name_gen_delete + GLEW_AMD_name_gen_delete = _glewSearchExtension("GL_AMD_name_gen_delete", extStart, extEnd); + if (glewExperimental || GLEW_AMD_name_gen_delete) GLEW_AMD_name_gen_delete = !_glewInit_GL_AMD_name_gen_delete(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_name_gen_delete */ +#ifdef GL_AMD_occlusion_query_event + GLEW_AMD_occlusion_query_event = _glewSearchExtension("GL_AMD_occlusion_query_event", extStart, extEnd); + if (glewExperimental || GLEW_AMD_occlusion_query_event) GLEW_AMD_occlusion_query_event = !_glewInit_GL_AMD_occlusion_query_event(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_occlusion_query_event */ +#ifdef GL_AMD_performance_monitor + GLEW_AMD_performance_monitor = _glewSearchExtension("GL_AMD_performance_monitor", extStart, extEnd); + if (glewExperimental || GLEW_AMD_performance_monitor) GLEW_AMD_performance_monitor = !_glewInit_GL_AMD_performance_monitor(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_performance_monitor */ +#ifdef GL_AMD_pinned_memory + GLEW_AMD_pinned_memory = _glewSearchExtension("GL_AMD_pinned_memory", extStart, extEnd); +#endif /* GL_AMD_pinned_memory */ +#ifdef GL_AMD_query_buffer_object + GLEW_AMD_query_buffer_object = _glewSearchExtension("GL_AMD_query_buffer_object", extStart, extEnd); +#endif /* GL_AMD_query_buffer_object */ +#ifdef GL_AMD_sample_positions + GLEW_AMD_sample_positions = _glewSearchExtension("GL_AMD_sample_positions", extStart, extEnd); + if (glewExperimental || GLEW_AMD_sample_positions) GLEW_AMD_sample_positions = !_glewInit_GL_AMD_sample_positions(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_sample_positions */ +#ifdef GL_AMD_seamless_cubemap_per_texture + GLEW_AMD_seamless_cubemap_per_texture = _glewSearchExtension("GL_AMD_seamless_cubemap_per_texture", extStart, extEnd); +#endif /* GL_AMD_seamless_cubemap_per_texture */ +#ifdef GL_AMD_shader_atomic_counter_ops + GLEW_AMD_shader_atomic_counter_ops = _glewSearchExtension("GL_AMD_shader_atomic_counter_ops", extStart, extEnd); +#endif /* GL_AMD_shader_atomic_counter_ops */ +#ifdef GL_AMD_shader_stencil_export + GLEW_AMD_shader_stencil_export = _glewSearchExtension("GL_AMD_shader_stencil_export", extStart, extEnd); +#endif /* GL_AMD_shader_stencil_export */ +#ifdef GL_AMD_shader_stencil_value_export + GLEW_AMD_shader_stencil_value_export = _glewSearchExtension("GL_AMD_shader_stencil_value_export", extStart, extEnd); +#endif /* GL_AMD_shader_stencil_value_export */ +#ifdef GL_AMD_shader_trinary_minmax + GLEW_AMD_shader_trinary_minmax = _glewSearchExtension("GL_AMD_shader_trinary_minmax", extStart, extEnd); +#endif /* GL_AMD_shader_trinary_minmax */ +#ifdef GL_AMD_sparse_texture + GLEW_AMD_sparse_texture = _glewSearchExtension("GL_AMD_sparse_texture", extStart, extEnd); + if (glewExperimental || GLEW_AMD_sparse_texture) GLEW_AMD_sparse_texture = !_glewInit_GL_AMD_sparse_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_sparse_texture */ +#ifdef GL_AMD_stencil_operation_extended + GLEW_AMD_stencil_operation_extended = _glewSearchExtension("GL_AMD_stencil_operation_extended", extStart, extEnd); + if (glewExperimental || GLEW_AMD_stencil_operation_extended) GLEW_AMD_stencil_operation_extended = !_glewInit_GL_AMD_stencil_operation_extended(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_stencil_operation_extended */ +#ifdef GL_AMD_texture_texture4 + GLEW_AMD_texture_texture4 = _glewSearchExtension("GL_AMD_texture_texture4", extStart, extEnd); +#endif /* GL_AMD_texture_texture4 */ +#ifdef GL_AMD_transform_feedback3_lines_triangles + GLEW_AMD_transform_feedback3_lines_triangles = _glewSearchExtension("GL_AMD_transform_feedback3_lines_triangles", extStart, extEnd); +#endif /* GL_AMD_transform_feedback3_lines_triangles */ +#ifdef GL_AMD_transform_feedback4 + GLEW_AMD_transform_feedback4 = _glewSearchExtension("GL_AMD_transform_feedback4", extStart, extEnd); +#endif /* GL_AMD_transform_feedback4 */ +#ifdef GL_AMD_vertex_shader_layer + GLEW_AMD_vertex_shader_layer = _glewSearchExtension("GL_AMD_vertex_shader_layer", extStart, extEnd); +#endif /* GL_AMD_vertex_shader_layer */ +#ifdef GL_AMD_vertex_shader_tessellator + GLEW_AMD_vertex_shader_tessellator = _glewSearchExtension("GL_AMD_vertex_shader_tessellator", extStart, extEnd); + if (glewExperimental || GLEW_AMD_vertex_shader_tessellator) GLEW_AMD_vertex_shader_tessellator = !_glewInit_GL_AMD_vertex_shader_tessellator(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_AMD_vertex_shader_tessellator */ +#ifdef GL_AMD_vertex_shader_viewport_index + GLEW_AMD_vertex_shader_viewport_index = _glewSearchExtension("GL_AMD_vertex_shader_viewport_index", extStart, extEnd); +#endif /* GL_AMD_vertex_shader_viewport_index */ +#ifdef GL_ANGLE_depth_texture + GLEW_ANGLE_depth_texture = _glewSearchExtension("GL_ANGLE_depth_texture", extStart, extEnd); +#endif /* GL_ANGLE_depth_texture */ +#ifdef GL_ANGLE_framebuffer_blit + GLEW_ANGLE_framebuffer_blit = _glewSearchExtension("GL_ANGLE_framebuffer_blit", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_framebuffer_blit) GLEW_ANGLE_framebuffer_blit = !_glewInit_GL_ANGLE_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_framebuffer_blit */ +#ifdef GL_ANGLE_framebuffer_multisample + GLEW_ANGLE_framebuffer_multisample = _glewSearchExtension("GL_ANGLE_framebuffer_multisample", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_framebuffer_multisample) GLEW_ANGLE_framebuffer_multisample = !_glewInit_GL_ANGLE_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_framebuffer_multisample */ +#ifdef GL_ANGLE_instanced_arrays + GLEW_ANGLE_instanced_arrays = _glewSearchExtension("GL_ANGLE_instanced_arrays", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_instanced_arrays) GLEW_ANGLE_instanced_arrays = !_glewInit_GL_ANGLE_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_instanced_arrays */ +#ifdef GL_ANGLE_pack_reverse_row_order + GLEW_ANGLE_pack_reverse_row_order = _glewSearchExtension("GL_ANGLE_pack_reverse_row_order", extStart, extEnd); +#endif /* GL_ANGLE_pack_reverse_row_order */ +#ifdef GL_ANGLE_program_binary + GLEW_ANGLE_program_binary = _glewSearchExtension("GL_ANGLE_program_binary", extStart, extEnd); +#endif /* GL_ANGLE_program_binary */ +#ifdef GL_ANGLE_texture_compression_dxt1 + GLEW_ANGLE_texture_compression_dxt1 = _glewSearchExtension("GL_ANGLE_texture_compression_dxt1", extStart, extEnd); +#endif /* GL_ANGLE_texture_compression_dxt1 */ +#ifdef GL_ANGLE_texture_compression_dxt3 + GLEW_ANGLE_texture_compression_dxt3 = _glewSearchExtension("GL_ANGLE_texture_compression_dxt3", extStart, extEnd); +#endif /* GL_ANGLE_texture_compression_dxt3 */ +#ifdef GL_ANGLE_texture_compression_dxt5 + GLEW_ANGLE_texture_compression_dxt5 = _glewSearchExtension("GL_ANGLE_texture_compression_dxt5", extStart, extEnd); +#endif /* GL_ANGLE_texture_compression_dxt5 */ +#ifdef GL_ANGLE_texture_usage + GLEW_ANGLE_texture_usage = _glewSearchExtension("GL_ANGLE_texture_usage", extStart, extEnd); +#endif /* GL_ANGLE_texture_usage */ +#ifdef GL_ANGLE_timer_query + GLEW_ANGLE_timer_query = _glewSearchExtension("GL_ANGLE_timer_query", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_timer_query) GLEW_ANGLE_timer_query = !_glewInit_GL_ANGLE_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_timer_query */ +#ifdef GL_ANGLE_translated_shader_source + GLEW_ANGLE_translated_shader_source = _glewSearchExtension("GL_ANGLE_translated_shader_source", extStart, extEnd); + if (glewExperimental || GLEW_ANGLE_translated_shader_source) GLEW_ANGLE_translated_shader_source = !_glewInit_GL_ANGLE_translated_shader_source(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ANGLE_translated_shader_source */ +#ifdef GL_APPLE_aux_depth_stencil + GLEW_APPLE_aux_depth_stencil = _glewSearchExtension("GL_APPLE_aux_depth_stencil", extStart, extEnd); +#endif /* GL_APPLE_aux_depth_stencil */ +#ifdef GL_APPLE_client_storage + GLEW_APPLE_client_storage = _glewSearchExtension("GL_APPLE_client_storage", extStart, extEnd); +#endif /* GL_APPLE_client_storage */ +#ifdef GL_APPLE_element_array + GLEW_APPLE_element_array = _glewSearchExtension("GL_APPLE_element_array", extStart, extEnd); + if (glewExperimental || GLEW_APPLE_element_array) GLEW_APPLE_element_array = !_glewInit_GL_APPLE_element_array(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_element_array */ +#ifdef GL_APPLE_fence + GLEW_APPLE_fence = _glewSearchExtension("GL_APPLE_fence", extStart, extEnd); + if (glewExperimental || GLEW_APPLE_fence) GLEW_APPLE_fence = !_glewInit_GL_APPLE_fence(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_fence */ +#ifdef GL_APPLE_float_pixels + GLEW_APPLE_float_pixels = _glewSearchExtension("GL_APPLE_float_pixels", extStart, extEnd); +#endif /* GL_APPLE_float_pixels */ +#ifdef GL_APPLE_flush_buffer_range + GLEW_APPLE_flush_buffer_range = _glewSearchExtension("GL_APPLE_flush_buffer_range", extStart, extEnd); + if (glewExperimental || GLEW_APPLE_flush_buffer_range) GLEW_APPLE_flush_buffer_range = !_glewInit_GL_APPLE_flush_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_flush_buffer_range */ +#ifdef GL_APPLE_object_purgeable + GLEW_APPLE_object_purgeable = _glewSearchExtension("GL_APPLE_object_purgeable", extStart, extEnd); + if (glewExperimental || GLEW_APPLE_object_purgeable) GLEW_APPLE_object_purgeable = !_glewInit_GL_APPLE_object_purgeable(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_object_purgeable */ +#ifdef GL_APPLE_pixel_buffer + GLEW_APPLE_pixel_buffer = _glewSearchExtension("GL_APPLE_pixel_buffer", extStart, extEnd); +#endif /* GL_APPLE_pixel_buffer */ +#ifdef GL_APPLE_rgb_422 + GLEW_APPLE_rgb_422 = _glewSearchExtension("GL_APPLE_rgb_422", extStart, extEnd); +#endif /* GL_APPLE_rgb_422 */ +#ifdef GL_APPLE_row_bytes + GLEW_APPLE_row_bytes = _glewSearchExtension("GL_APPLE_row_bytes", extStart, extEnd); +#endif /* GL_APPLE_row_bytes */ +#ifdef GL_APPLE_specular_vector + GLEW_APPLE_specular_vector = _glewSearchExtension("GL_APPLE_specular_vector", extStart, extEnd); +#endif /* GL_APPLE_specular_vector */ +#ifdef GL_APPLE_texture_range + GLEW_APPLE_texture_range = _glewSearchExtension("GL_APPLE_texture_range", extStart, extEnd); + if (glewExperimental || GLEW_APPLE_texture_range) GLEW_APPLE_texture_range = !_glewInit_GL_APPLE_texture_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_texture_range */ +#ifdef GL_APPLE_transform_hint + GLEW_APPLE_transform_hint = _glewSearchExtension("GL_APPLE_transform_hint", extStart, extEnd); +#endif /* GL_APPLE_transform_hint */ +#ifdef GL_APPLE_vertex_array_object + GLEW_APPLE_vertex_array_object = _glewSearchExtension("GL_APPLE_vertex_array_object", extStart, extEnd); + if (glewExperimental || GLEW_APPLE_vertex_array_object) GLEW_APPLE_vertex_array_object = !_glewInit_GL_APPLE_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_vertex_array_object */ +#ifdef GL_APPLE_vertex_array_range + GLEW_APPLE_vertex_array_range = _glewSearchExtension("GL_APPLE_vertex_array_range", extStart, extEnd); + if (glewExperimental || GLEW_APPLE_vertex_array_range) GLEW_APPLE_vertex_array_range = !_glewInit_GL_APPLE_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_vertex_array_range */ +#ifdef GL_APPLE_vertex_program_evaluators + GLEW_APPLE_vertex_program_evaluators = _glewSearchExtension("GL_APPLE_vertex_program_evaluators", extStart, extEnd); + if (glewExperimental || GLEW_APPLE_vertex_program_evaluators) GLEW_APPLE_vertex_program_evaluators = !_glewInit_GL_APPLE_vertex_program_evaluators(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_APPLE_vertex_program_evaluators */ +#ifdef GL_APPLE_ycbcr_422 + GLEW_APPLE_ycbcr_422 = _glewSearchExtension("GL_APPLE_ycbcr_422", extStart, extEnd); +#endif /* GL_APPLE_ycbcr_422 */ +#ifdef GL_ARB_ES2_compatibility + GLEW_ARB_ES2_compatibility = _glewSearchExtension("GL_ARB_ES2_compatibility", extStart, extEnd); + if (glewExperimental || GLEW_ARB_ES2_compatibility) GLEW_ARB_ES2_compatibility = !_glewInit_GL_ARB_ES2_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_ES2_compatibility */ +#ifdef GL_ARB_ES3_1_compatibility + GLEW_ARB_ES3_1_compatibility = _glewSearchExtension("GL_ARB_ES3_1_compatibility", extStart, extEnd); + if (glewExperimental || GLEW_ARB_ES3_1_compatibility) GLEW_ARB_ES3_1_compatibility = !_glewInit_GL_ARB_ES3_1_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_ES3_1_compatibility */ +#ifdef GL_ARB_ES3_2_compatibility + GLEW_ARB_ES3_2_compatibility = _glewSearchExtension("GL_ARB_ES3_2_compatibility", extStart, extEnd); + if (glewExperimental || GLEW_ARB_ES3_2_compatibility) GLEW_ARB_ES3_2_compatibility = !_glewInit_GL_ARB_ES3_2_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_ES3_2_compatibility */ +#ifdef GL_ARB_ES3_compatibility + GLEW_ARB_ES3_compatibility = _glewSearchExtension("GL_ARB_ES3_compatibility", extStart, extEnd); +#endif /* GL_ARB_ES3_compatibility */ +#ifdef GL_ARB_arrays_of_arrays + GLEW_ARB_arrays_of_arrays = _glewSearchExtension("GL_ARB_arrays_of_arrays", extStart, extEnd); +#endif /* GL_ARB_arrays_of_arrays */ +#ifdef GL_ARB_base_instance + GLEW_ARB_base_instance = _glewSearchExtension("GL_ARB_base_instance", extStart, extEnd); + if (glewExperimental || GLEW_ARB_base_instance) GLEW_ARB_base_instance = !_glewInit_GL_ARB_base_instance(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_base_instance */ +#ifdef GL_ARB_bindless_texture + GLEW_ARB_bindless_texture = _glewSearchExtension("GL_ARB_bindless_texture", extStart, extEnd); + if (glewExperimental || GLEW_ARB_bindless_texture) GLEW_ARB_bindless_texture = !_glewInit_GL_ARB_bindless_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_bindless_texture */ +#ifdef GL_ARB_blend_func_extended + GLEW_ARB_blend_func_extended = _glewSearchExtension("GL_ARB_blend_func_extended", extStart, extEnd); + if (glewExperimental || GLEW_ARB_blend_func_extended) GLEW_ARB_blend_func_extended = !_glewInit_GL_ARB_blend_func_extended(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_blend_func_extended */ +#ifdef GL_ARB_buffer_storage + GLEW_ARB_buffer_storage = _glewSearchExtension("GL_ARB_buffer_storage", extStart, extEnd); + if (glewExperimental || GLEW_ARB_buffer_storage) GLEW_ARB_buffer_storage = !_glewInit_GL_ARB_buffer_storage(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_buffer_storage */ +#ifdef GL_ARB_cl_event + GLEW_ARB_cl_event = _glewSearchExtension("GL_ARB_cl_event", extStart, extEnd); + if (glewExperimental || GLEW_ARB_cl_event) GLEW_ARB_cl_event = !_glewInit_GL_ARB_cl_event(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_cl_event */ +#ifdef GL_ARB_clear_buffer_object + GLEW_ARB_clear_buffer_object = _glewSearchExtension("GL_ARB_clear_buffer_object", extStart, extEnd); + if (glewExperimental || GLEW_ARB_clear_buffer_object) GLEW_ARB_clear_buffer_object = !_glewInit_GL_ARB_clear_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_clear_buffer_object */ +#ifdef GL_ARB_clear_texture + GLEW_ARB_clear_texture = _glewSearchExtension("GL_ARB_clear_texture", extStart, extEnd); + if (glewExperimental || GLEW_ARB_clear_texture) GLEW_ARB_clear_texture = !_glewInit_GL_ARB_clear_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_clear_texture */ +#ifdef GL_ARB_clip_control + GLEW_ARB_clip_control = _glewSearchExtension("GL_ARB_clip_control", extStart, extEnd); + if (glewExperimental || GLEW_ARB_clip_control) GLEW_ARB_clip_control = !_glewInit_GL_ARB_clip_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_clip_control */ +#ifdef GL_ARB_color_buffer_float + GLEW_ARB_color_buffer_float = _glewSearchExtension("GL_ARB_color_buffer_float", extStart, extEnd); + if (glewExperimental || GLEW_ARB_color_buffer_float) GLEW_ARB_color_buffer_float = !_glewInit_GL_ARB_color_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_color_buffer_float */ +#ifdef GL_ARB_compatibility + GLEW_ARB_compatibility = _glewSearchExtension("GL_ARB_compatibility", extStart, extEnd); +#endif /* GL_ARB_compatibility */ +#ifdef GL_ARB_compressed_texture_pixel_storage + GLEW_ARB_compressed_texture_pixel_storage = _glewSearchExtension("GL_ARB_compressed_texture_pixel_storage", extStart, extEnd); +#endif /* GL_ARB_compressed_texture_pixel_storage */ +#ifdef GL_ARB_compute_shader + GLEW_ARB_compute_shader = _glewSearchExtension("GL_ARB_compute_shader", extStart, extEnd); + if (glewExperimental || GLEW_ARB_compute_shader) GLEW_ARB_compute_shader = !_glewInit_GL_ARB_compute_shader(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_compute_shader */ +#ifdef GL_ARB_compute_variable_group_size + GLEW_ARB_compute_variable_group_size = _glewSearchExtension("GL_ARB_compute_variable_group_size", extStart, extEnd); + if (glewExperimental || GLEW_ARB_compute_variable_group_size) GLEW_ARB_compute_variable_group_size = !_glewInit_GL_ARB_compute_variable_group_size(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_compute_variable_group_size */ +#ifdef GL_ARB_conditional_render_inverted + GLEW_ARB_conditional_render_inverted = _glewSearchExtension("GL_ARB_conditional_render_inverted", extStart, extEnd); +#endif /* GL_ARB_conditional_render_inverted */ +#ifdef GL_ARB_conservative_depth + GLEW_ARB_conservative_depth = _glewSearchExtension("GL_ARB_conservative_depth", extStart, extEnd); +#endif /* GL_ARB_conservative_depth */ +#ifdef GL_ARB_copy_buffer + GLEW_ARB_copy_buffer = _glewSearchExtension("GL_ARB_copy_buffer", extStart, extEnd); + if (glewExperimental || GLEW_ARB_copy_buffer) GLEW_ARB_copy_buffer = !_glewInit_GL_ARB_copy_buffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_copy_buffer */ +#ifdef GL_ARB_copy_image + GLEW_ARB_copy_image = _glewSearchExtension("GL_ARB_copy_image", extStart, extEnd); + if (glewExperimental || GLEW_ARB_copy_image) GLEW_ARB_copy_image = !_glewInit_GL_ARB_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_copy_image */ +#ifdef GL_ARB_cull_distance + GLEW_ARB_cull_distance = _glewSearchExtension("GL_ARB_cull_distance", extStart, extEnd); +#endif /* GL_ARB_cull_distance */ +#ifdef GL_ARB_debug_output + GLEW_ARB_debug_output = _glewSearchExtension("GL_ARB_debug_output", extStart, extEnd); + if (glewExperimental || GLEW_ARB_debug_output) GLEW_ARB_debug_output = !_glewInit_GL_ARB_debug_output(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_debug_output */ +#ifdef GL_ARB_depth_buffer_float + GLEW_ARB_depth_buffer_float = _glewSearchExtension("GL_ARB_depth_buffer_float", extStart, extEnd); +#endif /* GL_ARB_depth_buffer_float */ +#ifdef GL_ARB_depth_clamp + GLEW_ARB_depth_clamp = _glewSearchExtension("GL_ARB_depth_clamp", extStart, extEnd); +#endif /* GL_ARB_depth_clamp */ +#ifdef GL_ARB_depth_texture + GLEW_ARB_depth_texture = _glewSearchExtension("GL_ARB_depth_texture", extStart, extEnd); +#endif /* GL_ARB_depth_texture */ +#ifdef GL_ARB_derivative_control + GLEW_ARB_derivative_control = _glewSearchExtension("GL_ARB_derivative_control", extStart, extEnd); +#endif /* GL_ARB_derivative_control */ +#ifdef GL_ARB_direct_state_access + GLEW_ARB_direct_state_access = _glewSearchExtension("GL_ARB_direct_state_access", extStart, extEnd); + if (glewExperimental || GLEW_ARB_direct_state_access) GLEW_ARB_direct_state_access = !_glewInit_GL_ARB_direct_state_access(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_direct_state_access */ +#ifdef GL_ARB_draw_buffers + GLEW_ARB_draw_buffers = _glewSearchExtension("GL_ARB_draw_buffers", extStart, extEnd); + if (glewExperimental || GLEW_ARB_draw_buffers) GLEW_ARB_draw_buffers = !_glewInit_GL_ARB_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_draw_buffers */ +#ifdef GL_ARB_draw_buffers_blend + GLEW_ARB_draw_buffers_blend = _glewSearchExtension("GL_ARB_draw_buffers_blend", extStart, extEnd); + if (glewExperimental || GLEW_ARB_draw_buffers_blend) GLEW_ARB_draw_buffers_blend = !_glewInit_GL_ARB_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_draw_buffers_blend */ +#ifdef GL_ARB_draw_elements_base_vertex + GLEW_ARB_draw_elements_base_vertex = _glewSearchExtension("GL_ARB_draw_elements_base_vertex", extStart, extEnd); + if (glewExperimental || GLEW_ARB_draw_elements_base_vertex) GLEW_ARB_draw_elements_base_vertex = !_glewInit_GL_ARB_draw_elements_base_vertex(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_draw_elements_base_vertex */ +#ifdef GL_ARB_draw_indirect + GLEW_ARB_draw_indirect = _glewSearchExtension("GL_ARB_draw_indirect", extStart, extEnd); + if (glewExperimental || GLEW_ARB_draw_indirect) GLEW_ARB_draw_indirect = !_glewInit_GL_ARB_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_draw_indirect */ +#ifdef GL_ARB_draw_instanced + GLEW_ARB_draw_instanced = _glewSearchExtension("GL_ARB_draw_instanced", extStart, extEnd); +#endif /* GL_ARB_draw_instanced */ +#ifdef GL_ARB_enhanced_layouts + GLEW_ARB_enhanced_layouts = _glewSearchExtension("GL_ARB_enhanced_layouts", extStart, extEnd); +#endif /* GL_ARB_enhanced_layouts */ +#ifdef GL_ARB_explicit_attrib_location + GLEW_ARB_explicit_attrib_location = _glewSearchExtension("GL_ARB_explicit_attrib_location", extStart, extEnd); +#endif /* GL_ARB_explicit_attrib_location */ +#ifdef GL_ARB_explicit_uniform_location + GLEW_ARB_explicit_uniform_location = _glewSearchExtension("GL_ARB_explicit_uniform_location", extStart, extEnd); +#endif /* GL_ARB_explicit_uniform_location */ +#ifdef GL_ARB_fragment_coord_conventions + GLEW_ARB_fragment_coord_conventions = _glewSearchExtension("GL_ARB_fragment_coord_conventions", extStart, extEnd); +#endif /* GL_ARB_fragment_coord_conventions */ +#ifdef GL_ARB_fragment_layer_viewport + GLEW_ARB_fragment_layer_viewport = _glewSearchExtension("GL_ARB_fragment_layer_viewport", extStart, extEnd); +#endif /* GL_ARB_fragment_layer_viewport */ +#ifdef GL_ARB_fragment_program + GLEW_ARB_fragment_program = _glewSearchExtension("GL_ARB_fragment_program", extStart, extEnd); +#endif /* GL_ARB_fragment_program */ +#ifdef GL_ARB_fragment_program_shadow + GLEW_ARB_fragment_program_shadow = _glewSearchExtension("GL_ARB_fragment_program_shadow", extStart, extEnd); +#endif /* GL_ARB_fragment_program_shadow */ +#ifdef GL_ARB_fragment_shader + GLEW_ARB_fragment_shader = _glewSearchExtension("GL_ARB_fragment_shader", extStart, extEnd); +#endif /* GL_ARB_fragment_shader */ +#ifdef GL_ARB_fragment_shader_interlock + GLEW_ARB_fragment_shader_interlock = _glewSearchExtension("GL_ARB_fragment_shader_interlock", extStart, extEnd); +#endif /* GL_ARB_fragment_shader_interlock */ +#ifdef GL_ARB_framebuffer_no_attachments + GLEW_ARB_framebuffer_no_attachments = _glewSearchExtension("GL_ARB_framebuffer_no_attachments", extStart, extEnd); + if (glewExperimental || GLEW_ARB_framebuffer_no_attachments) GLEW_ARB_framebuffer_no_attachments = !_glewInit_GL_ARB_framebuffer_no_attachments(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_framebuffer_no_attachments */ +#ifdef GL_ARB_framebuffer_object + GLEW_ARB_framebuffer_object = _glewSearchExtension("GL_ARB_framebuffer_object", extStart, extEnd); + if (glewExperimental || GLEW_ARB_framebuffer_object) GLEW_ARB_framebuffer_object = !_glewInit_GL_ARB_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_framebuffer_object */ +#ifdef GL_ARB_framebuffer_sRGB + GLEW_ARB_framebuffer_sRGB = _glewSearchExtension("GL_ARB_framebuffer_sRGB", extStart, extEnd); +#endif /* GL_ARB_framebuffer_sRGB */ +#ifdef GL_ARB_geometry_shader4 + GLEW_ARB_geometry_shader4 = _glewSearchExtension("GL_ARB_geometry_shader4", extStart, extEnd); + if (glewExperimental || GLEW_ARB_geometry_shader4) GLEW_ARB_geometry_shader4 = !_glewInit_GL_ARB_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_geometry_shader4 */ +#ifdef GL_ARB_get_program_binary + GLEW_ARB_get_program_binary = _glewSearchExtension("GL_ARB_get_program_binary", extStart, extEnd); + if (glewExperimental || GLEW_ARB_get_program_binary) GLEW_ARB_get_program_binary = !_glewInit_GL_ARB_get_program_binary(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_get_program_binary */ +#ifdef GL_ARB_get_texture_sub_image + GLEW_ARB_get_texture_sub_image = _glewSearchExtension("GL_ARB_get_texture_sub_image", extStart, extEnd); + if (glewExperimental || GLEW_ARB_get_texture_sub_image) GLEW_ARB_get_texture_sub_image = !_glewInit_GL_ARB_get_texture_sub_image(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_get_texture_sub_image */ +#ifdef GL_ARB_gpu_shader5 + GLEW_ARB_gpu_shader5 = _glewSearchExtension("GL_ARB_gpu_shader5", extStart, extEnd); +#endif /* GL_ARB_gpu_shader5 */ +#ifdef GL_ARB_gpu_shader_fp64 + GLEW_ARB_gpu_shader_fp64 = _glewSearchExtension("GL_ARB_gpu_shader_fp64", extStart, extEnd); + if (glewExperimental || GLEW_ARB_gpu_shader_fp64) GLEW_ARB_gpu_shader_fp64 = !_glewInit_GL_ARB_gpu_shader_fp64(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_gpu_shader_fp64 */ +#ifdef GL_ARB_gpu_shader_int64 + GLEW_ARB_gpu_shader_int64 = _glewSearchExtension("GL_ARB_gpu_shader_int64", extStart, extEnd); + if (glewExperimental || GLEW_ARB_gpu_shader_int64) GLEW_ARB_gpu_shader_int64 = !_glewInit_GL_ARB_gpu_shader_int64(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_gpu_shader_int64 */ +#ifdef GL_ARB_half_float_pixel + GLEW_ARB_half_float_pixel = _glewSearchExtension("GL_ARB_half_float_pixel", extStart, extEnd); +#endif /* GL_ARB_half_float_pixel */ +#ifdef GL_ARB_half_float_vertex + GLEW_ARB_half_float_vertex = _glewSearchExtension("GL_ARB_half_float_vertex", extStart, extEnd); +#endif /* GL_ARB_half_float_vertex */ +#ifdef GL_ARB_imaging + GLEW_ARB_imaging = _glewSearchExtension("GL_ARB_imaging", extStart, extEnd); + if (glewExperimental || GLEW_ARB_imaging) GLEW_ARB_imaging = !_glewInit_GL_ARB_imaging(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_imaging */ +#ifdef GL_ARB_indirect_parameters + GLEW_ARB_indirect_parameters = _glewSearchExtension("GL_ARB_indirect_parameters", extStart, extEnd); + if (glewExperimental || GLEW_ARB_indirect_parameters) GLEW_ARB_indirect_parameters = !_glewInit_GL_ARB_indirect_parameters(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_indirect_parameters */ +#ifdef GL_ARB_instanced_arrays + GLEW_ARB_instanced_arrays = _glewSearchExtension("GL_ARB_instanced_arrays", extStart, extEnd); + if (glewExperimental || GLEW_ARB_instanced_arrays) GLEW_ARB_instanced_arrays = !_glewInit_GL_ARB_instanced_arrays(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_instanced_arrays */ +#ifdef GL_ARB_internalformat_query + GLEW_ARB_internalformat_query = _glewSearchExtension("GL_ARB_internalformat_query", extStart, extEnd); + if (glewExperimental || GLEW_ARB_internalformat_query) GLEW_ARB_internalformat_query = !_glewInit_GL_ARB_internalformat_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_internalformat_query */ +#ifdef GL_ARB_internalformat_query2 + GLEW_ARB_internalformat_query2 = _glewSearchExtension("GL_ARB_internalformat_query2", extStart, extEnd); + if (glewExperimental || GLEW_ARB_internalformat_query2) GLEW_ARB_internalformat_query2 = !_glewInit_GL_ARB_internalformat_query2(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_internalformat_query2 */ +#ifdef GL_ARB_invalidate_subdata + GLEW_ARB_invalidate_subdata = _glewSearchExtension("GL_ARB_invalidate_subdata", extStart, extEnd); + if (glewExperimental || GLEW_ARB_invalidate_subdata) GLEW_ARB_invalidate_subdata = !_glewInit_GL_ARB_invalidate_subdata(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_invalidate_subdata */ +#ifdef GL_ARB_map_buffer_alignment + GLEW_ARB_map_buffer_alignment = _glewSearchExtension("GL_ARB_map_buffer_alignment", extStart, extEnd); +#endif /* GL_ARB_map_buffer_alignment */ +#ifdef GL_ARB_map_buffer_range + GLEW_ARB_map_buffer_range = _glewSearchExtension("GL_ARB_map_buffer_range", extStart, extEnd); + if (glewExperimental || GLEW_ARB_map_buffer_range) GLEW_ARB_map_buffer_range = !_glewInit_GL_ARB_map_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_map_buffer_range */ +#ifdef GL_ARB_matrix_palette + GLEW_ARB_matrix_palette = _glewSearchExtension("GL_ARB_matrix_palette", extStart, extEnd); + if (glewExperimental || GLEW_ARB_matrix_palette) GLEW_ARB_matrix_palette = !_glewInit_GL_ARB_matrix_palette(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_matrix_palette */ +#ifdef GL_ARB_multi_bind + GLEW_ARB_multi_bind = _glewSearchExtension("GL_ARB_multi_bind", extStart, extEnd); + if (glewExperimental || GLEW_ARB_multi_bind) GLEW_ARB_multi_bind = !_glewInit_GL_ARB_multi_bind(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_multi_bind */ +#ifdef GL_ARB_multi_draw_indirect + GLEW_ARB_multi_draw_indirect = _glewSearchExtension("GL_ARB_multi_draw_indirect", extStart, extEnd); + if (glewExperimental || GLEW_ARB_multi_draw_indirect) GLEW_ARB_multi_draw_indirect = !_glewInit_GL_ARB_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_multi_draw_indirect */ +#ifdef GL_ARB_multisample + GLEW_ARB_multisample = _glewSearchExtension("GL_ARB_multisample", extStart, extEnd); + if (glewExperimental || GLEW_ARB_multisample) GLEW_ARB_multisample = !_glewInit_GL_ARB_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_multisample */ +#ifdef GL_ARB_multitexture + GLEW_ARB_multitexture = _glewSearchExtension("GL_ARB_multitexture", extStart, extEnd); + if (glewExperimental || GLEW_ARB_multitexture) GLEW_ARB_multitexture = !_glewInit_GL_ARB_multitexture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_multitexture */ +#ifdef GL_ARB_occlusion_query + GLEW_ARB_occlusion_query = _glewSearchExtension("GL_ARB_occlusion_query", extStart, extEnd); + if (glewExperimental || GLEW_ARB_occlusion_query) GLEW_ARB_occlusion_query = !_glewInit_GL_ARB_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_occlusion_query */ +#ifdef GL_ARB_occlusion_query2 + GLEW_ARB_occlusion_query2 = _glewSearchExtension("GL_ARB_occlusion_query2", extStart, extEnd); +#endif /* GL_ARB_occlusion_query2 */ +#ifdef GL_ARB_parallel_shader_compile + GLEW_ARB_parallel_shader_compile = _glewSearchExtension("GL_ARB_parallel_shader_compile", extStart, extEnd); + if (glewExperimental || GLEW_ARB_parallel_shader_compile) GLEW_ARB_parallel_shader_compile = !_glewInit_GL_ARB_parallel_shader_compile(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_parallel_shader_compile */ +#ifdef GL_ARB_pipeline_statistics_query + GLEW_ARB_pipeline_statistics_query = _glewSearchExtension("GL_ARB_pipeline_statistics_query", extStart, extEnd); +#endif /* GL_ARB_pipeline_statistics_query */ +#ifdef GL_ARB_pixel_buffer_object + GLEW_ARB_pixel_buffer_object = _glewSearchExtension("GL_ARB_pixel_buffer_object", extStart, extEnd); +#endif /* GL_ARB_pixel_buffer_object */ +#ifdef GL_ARB_point_parameters + GLEW_ARB_point_parameters = _glewSearchExtension("GL_ARB_point_parameters", extStart, extEnd); + if (glewExperimental || GLEW_ARB_point_parameters) GLEW_ARB_point_parameters = !_glewInit_GL_ARB_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_point_parameters */ +#ifdef GL_ARB_point_sprite + GLEW_ARB_point_sprite = _glewSearchExtension("GL_ARB_point_sprite", extStart, extEnd); +#endif /* GL_ARB_point_sprite */ +#ifdef GL_ARB_post_depth_coverage + GLEW_ARB_post_depth_coverage = _glewSearchExtension("GL_ARB_post_depth_coverage", extStart, extEnd); +#endif /* GL_ARB_post_depth_coverage */ +#ifdef GL_ARB_program_interface_query + GLEW_ARB_program_interface_query = _glewSearchExtension("GL_ARB_program_interface_query", extStart, extEnd); + if (glewExperimental || GLEW_ARB_program_interface_query) GLEW_ARB_program_interface_query = !_glewInit_GL_ARB_program_interface_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_program_interface_query */ +#ifdef GL_ARB_provoking_vertex + GLEW_ARB_provoking_vertex = _glewSearchExtension("GL_ARB_provoking_vertex", extStart, extEnd); + if (glewExperimental || GLEW_ARB_provoking_vertex) GLEW_ARB_provoking_vertex = !_glewInit_GL_ARB_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_provoking_vertex */ +#ifdef GL_ARB_query_buffer_object + GLEW_ARB_query_buffer_object = _glewSearchExtension("GL_ARB_query_buffer_object", extStart, extEnd); +#endif /* GL_ARB_query_buffer_object */ +#ifdef GL_ARB_robust_buffer_access_behavior + GLEW_ARB_robust_buffer_access_behavior = _glewSearchExtension("GL_ARB_robust_buffer_access_behavior", extStart, extEnd); +#endif /* GL_ARB_robust_buffer_access_behavior */ +#ifdef GL_ARB_robustness + GLEW_ARB_robustness = _glewSearchExtension("GL_ARB_robustness", extStart, extEnd); + if (glewExperimental || GLEW_ARB_robustness) GLEW_ARB_robustness = !_glewInit_GL_ARB_robustness(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_robustness */ +#ifdef GL_ARB_robustness_application_isolation + GLEW_ARB_robustness_application_isolation = _glewSearchExtension("GL_ARB_robustness_application_isolation", extStart, extEnd); +#endif /* GL_ARB_robustness_application_isolation */ +#ifdef GL_ARB_robustness_share_group_isolation + GLEW_ARB_robustness_share_group_isolation = _glewSearchExtension("GL_ARB_robustness_share_group_isolation", extStart, extEnd); +#endif /* GL_ARB_robustness_share_group_isolation */ +#ifdef GL_ARB_sample_locations + GLEW_ARB_sample_locations = _glewSearchExtension("GL_ARB_sample_locations", extStart, extEnd); + if (glewExperimental || GLEW_ARB_sample_locations) GLEW_ARB_sample_locations = !_glewInit_GL_ARB_sample_locations(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_sample_locations */ +#ifdef GL_ARB_sample_shading + GLEW_ARB_sample_shading = _glewSearchExtension("GL_ARB_sample_shading", extStart, extEnd); + if (glewExperimental || GLEW_ARB_sample_shading) GLEW_ARB_sample_shading = !_glewInit_GL_ARB_sample_shading(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_sample_shading */ +#ifdef GL_ARB_sampler_objects + GLEW_ARB_sampler_objects = _glewSearchExtension("GL_ARB_sampler_objects", extStart, extEnd); + if (glewExperimental || GLEW_ARB_sampler_objects) GLEW_ARB_sampler_objects = !_glewInit_GL_ARB_sampler_objects(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_sampler_objects */ +#ifdef GL_ARB_seamless_cube_map + GLEW_ARB_seamless_cube_map = _glewSearchExtension("GL_ARB_seamless_cube_map", extStart, extEnd); +#endif /* GL_ARB_seamless_cube_map */ +#ifdef GL_ARB_seamless_cubemap_per_texture + GLEW_ARB_seamless_cubemap_per_texture = _glewSearchExtension("GL_ARB_seamless_cubemap_per_texture", extStart, extEnd); +#endif /* GL_ARB_seamless_cubemap_per_texture */ +#ifdef GL_ARB_separate_shader_objects + GLEW_ARB_separate_shader_objects = _glewSearchExtension("GL_ARB_separate_shader_objects", extStart, extEnd); + if (glewExperimental || GLEW_ARB_separate_shader_objects) GLEW_ARB_separate_shader_objects = !_glewInit_GL_ARB_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_separate_shader_objects */ +#ifdef GL_ARB_shader_atomic_counter_ops + GLEW_ARB_shader_atomic_counter_ops = _glewSearchExtension("GL_ARB_shader_atomic_counter_ops", extStart, extEnd); +#endif /* GL_ARB_shader_atomic_counter_ops */ +#ifdef GL_ARB_shader_atomic_counters + GLEW_ARB_shader_atomic_counters = _glewSearchExtension("GL_ARB_shader_atomic_counters", extStart, extEnd); + if (glewExperimental || GLEW_ARB_shader_atomic_counters) GLEW_ARB_shader_atomic_counters = !_glewInit_GL_ARB_shader_atomic_counters(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_shader_atomic_counters */ +#ifdef GL_ARB_shader_ballot + GLEW_ARB_shader_ballot = _glewSearchExtension("GL_ARB_shader_ballot", extStart, extEnd); +#endif /* GL_ARB_shader_ballot */ +#ifdef GL_ARB_shader_bit_encoding + GLEW_ARB_shader_bit_encoding = _glewSearchExtension("GL_ARB_shader_bit_encoding", extStart, extEnd); +#endif /* GL_ARB_shader_bit_encoding */ +#ifdef GL_ARB_shader_clock + GLEW_ARB_shader_clock = _glewSearchExtension("GL_ARB_shader_clock", extStart, extEnd); +#endif /* GL_ARB_shader_clock */ +#ifdef GL_ARB_shader_draw_parameters + GLEW_ARB_shader_draw_parameters = _glewSearchExtension("GL_ARB_shader_draw_parameters", extStart, extEnd); +#endif /* GL_ARB_shader_draw_parameters */ +#ifdef GL_ARB_shader_group_vote + GLEW_ARB_shader_group_vote = _glewSearchExtension("GL_ARB_shader_group_vote", extStart, extEnd); +#endif /* GL_ARB_shader_group_vote */ +#ifdef GL_ARB_shader_image_load_store + GLEW_ARB_shader_image_load_store = _glewSearchExtension("GL_ARB_shader_image_load_store", extStart, extEnd); + if (glewExperimental || GLEW_ARB_shader_image_load_store) GLEW_ARB_shader_image_load_store = !_glewInit_GL_ARB_shader_image_load_store(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_shader_image_load_store */ +#ifdef GL_ARB_shader_image_size + GLEW_ARB_shader_image_size = _glewSearchExtension("GL_ARB_shader_image_size", extStart, extEnd); +#endif /* GL_ARB_shader_image_size */ +#ifdef GL_ARB_shader_objects + GLEW_ARB_shader_objects = _glewSearchExtension("GL_ARB_shader_objects", extStart, extEnd); + if (glewExperimental || GLEW_ARB_shader_objects) GLEW_ARB_shader_objects = !_glewInit_GL_ARB_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_shader_objects */ +#ifdef GL_ARB_shader_precision + GLEW_ARB_shader_precision = _glewSearchExtension("GL_ARB_shader_precision", extStart, extEnd); +#endif /* GL_ARB_shader_precision */ +#ifdef GL_ARB_shader_stencil_export + GLEW_ARB_shader_stencil_export = _glewSearchExtension("GL_ARB_shader_stencil_export", extStart, extEnd); +#endif /* GL_ARB_shader_stencil_export */ +#ifdef GL_ARB_shader_storage_buffer_object + GLEW_ARB_shader_storage_buffer_object = _glewSearchExtension("GL_ARB_shader_storage_buffer_object", extStart, extEnd); + if (glewExperimental || GLEW_ARB_shader_storage_buffer_object) GLEW_ARB_shader_storage_buffer_object = !_glewInit_GL_ARB_shader_storage_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_shader_storage_buffer_object */ +#ifdef GL_ARB_shader_subroutine + GLEW_ARB_shader_subroutine = _glewSearchExtension("GL_ARB_shader_subroutine", extStart, extEnd); + if (glewExperimental || GLEW_ARB_shader_subroutine) GLEW_ARB_shader_subroutine = !_glewInit_GL_ARB_shader_subroutine(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_shader_subroutine */ +#ifdef GL_ARB_shader_texture_image_samples + GLEW_ARB_shader_texture_image_samples = _glewSearchExtension("GL_ARB_shader_texture_image_samples", extStart, extEnd); +#endif /* GL_ARB_shader_texture_image_samples */ +#ifdef GL_ARB_shader_texture_lod + GLEW_ARB_shader_texture_lod = _glewSearchExtension("GL_ARB_shader_texture_lod", extStart, extEnd); +#endif /* GL_ARB_shader_texture_lod */ +#ifdef GL_ARB_shader_viewport_layer_array + GLEW_ARB_shader_viewport_layer_array = _glewSearchExtension("GL_ARB_shader_viewport_layer_array", extStart, extEnd); +#endif /* GL_ARB_shader_viewport_layer_array */ +#ifdef GL_ARB_shading_language_100 + GLEW_ARB_shading_language_100 = _glewSearchExtension("GL_ARB_shading_language_100", extStart, extEnd); +#endif /* GL_ARB_shading_language_100 */ +#ifdef GL_ARB_shading_language_420pack + GLEW_ARB_shading_language_420pack = _glewSearchExtension("GL_ARB_shading_language_420pack", extStart, extEnd); +#endif /* GL_ARB_shading_language_420pack */ +#ifdef GL_ARB_shading_language_include + GLEW_ARB_shading_language_include = _glewSearchExtension("GL_ARB_shading_language_include", extStart, extEnd); + if (glewExperimental || GLEW_ARB_shading_language_include) GLEW_ARB_shading_language_include = !_glewInit_GL_ARB_shading_language_include(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_shading_language_include */ +#ifdef GL_ARB_shading_language_packing + GLEW_ARB_shading_language_packing = _glewSearchExtension("GL_ARB_shading_language_packing", extStart, extEnd); +#endif /* GL_ARB_shading_language_packing */ +#ifdef GL_ARB_shadow + GLEW_ARB_shadow = _glewSearchExtension("GL_ARB_shadow", extStart, extEnd); +#endif /* GL_ARB_shadow */ +#ifdef GL_ARB_shadow_ambient + GLEW_ARB_shadow_ambient = _glewSearchExtension("GL_ARB_shadow_ambient", extStart, extEnd); +#endif /* GL_ARB_shadow_ambient */ +#ifdef GL_ARB_sparse_buffer + GLEW_ARB_sparse_buffer = _glewSearchExtension("GL_ARB_sparse_buffer", extStart, extEnd); + if (glewExperimental || GLEW_ARB_sparse_buffer) GLEW_ARB_sparse_buffer = !_glewInit_GL_ARB_sparse_buffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_sparse_buffer */ +#ifdef GL_ARB_sparse_texture + GLEW_ARB_sparse_texture = _glewSearchExtension("GL_ARB_sparse_texture", extStart, extEnd); + if (glewExperimental || GLEW_ARB_sparse_texture) GLEW_ARB_sparse_texture = !_glewInit_GL_ARB_sparse_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_sparse_texture */ +#ifdef GL_ARB_sparse_texture2 + GLEW_ARB_sparse_texture2 = _glewSearchExtension("GL_ARB_sparse_texture2", extStart, extEnd); +#endif /* GL_ARB_sparse_texture2 */ +#ifdef GL_ARB_sparse_texture_clamp + GLEW_ARB_sparse_texture_clamp = _glewSearchExtension("GL_ARB_sparse_texture_clamp", extStart, extEnd); +#endif /* GL_ARB_sparse_texture_clamp */ +#ifdef GL_ARB_stencil_texturing + GLEW_ARB_stencil_texturing = _glewSearchExtension("GL_ARB_stencil_texturing", extStart, extEnd); +#endif /* GL_ARB_stencil_texturing */ +#ifdef GL_ARB_sync + GLEW_ARB_sync = _glewSearchExtension("GL_ARB_sync", extStart, extEnd); + if (glewExperimental || GLEW_ARB_sync) GLEW_ARB_sync = !_glewInit_GL_ARB_sync(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_sync */ +#ifdef GL_ARB_tessellation_shader + GLEW_ARB_tessellation_shader = _glewSearchExtension("GL_ARB_tessellation_shader", extStart, extEnd); + if (glewExperimental || GLEW_ARB_tessellation_shader) GLEW_ARB_tessellation_shader = !_glewInit_GL_ARB_tessellation_shader(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_tessellation_shader */ +#ifdef GL_ARB_texture_barrier + GLEW_ARB_texture_barrier = _glewSearchExtension("GL_ARB_texture_barrier", extStart, extEnd); + if (glewExperimental || GLEW_ARB_texture_barrier) GLEW_ARB_texture_barrier = !_glewInit_GL_ARB_texture_barrier(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_texture_barrier */ +#ifdef GL_ARB_texture_border_clamp + GLEW_ARB_texture_border_clamp = _glewSearchExtension("GL_ARB_texture_border_clamp", extStart, extEnd); +#endif /* GL_ARB_texture_border_clamp */ +#ifdef GL_ARB_texture_buffer_object + GLEW_ARB_texture_buffer_object = _glewSearchExtension("GL_ARB_texture_buffer_object", extStart, extEnd); + if (glewExperimental || GLEW_ARB_texture_buffer_object) GLEW_ARB_texture_buffer_object = !_glewInit_GL_ARB_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_texture_buffer_object */ +#ifdef GL_ARB_texture_buffer_object_rgb32 + GLEW_ARB_texture_buffer_object_rgb32 = _glewSearchExtension("GL_ARB_texture_buffer_object_rgb32", extStart, extEnd); +#endif /* GL_ARB_texture_buffer_object_rgb32 */ +#ifdef GL_ARB_texture_buffer_range + GLEW_ARB_texture_buffer_range = _glewSearchExtension("GL_ARB_texture_buffer_range", extStart, extEnd); + if (glewExperimental || GLEW_ARB_texture_buffer_range) GLEW_ARB_texture_buffer_range = !_glewInit_GL_ARB_texture_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_texture_buffer_range */ +#ifdef GL_ARB_texture_compression + GLEW_ARB_texture_compression = _glewSearchExtension("GL_ARB_texture_compression", extStart, extEnd); + if (glewExperimental || GLEW_ARB_texture_compression) GLEW_ARB_texture_compression = !_glewInit_GL_ARB_texture_compression(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_texture_compression */ +#ifdef GL_ARB_texture_compression_bptc + GLEW_ARB_texture_compression_bptc = _glewSearchExtension("GL_ARB_texture_compression_bptc", extStart, extEnd); +#endif /* GL_ARB_texture_compression_bptc */ +#ifdef GL_ARB_texture_compression_rgtc + GLEW_ARB_texture_compression_rgtc = _glewSearchExtension("GL_ARB_texture_compression_rgtc", extStart, extEnd); +#endif /* GL_ARB_texture_compression_rgtc */ +#ifdef GL_ARB_texture_cube_map + GLEW_ARB_texture_cube_map = _glewSearchExtension("GL_ARB_texture_cube_map", extStart, extEnd); +#endif /* GL_ARB_texture_cube_map */ +#ifdef GL_ARB_texture_cube_map_array + GLEW_ARB_texture_cube_map_array = _glewSearchExtension("GL_ARB_texture_cube_map_array", extStart, extEnd); +#endif /* GL_ARB_texture_cube_map_array */ +#ifdef GL_ARB_texture_env_add + GLEW_ARB_texture_env_add = _glewSearchExtension("GL_ARB_texture_env_add", extStart, extEnd); +#endif /* GL_ARB_texture_env_add */ +#ifdef GL_ARB_texture_env_combine + GLEW_ARB_texture_env_combine = _glewSearchExtension("GL_ARB_texture_env_combine", extStart, extEnd); +#endif /* GL_ARB_texture_env_combine */ +#ifdef GL_ARB_texture_env_crossbar + GLEW_ARB_texture_env_crossbar = _glewSearchExtension("GL_ARB_texture_env_crossbar", extStart, extEnd); +#endif /* GL_ARB_texture_env_crossbar */ +#ifdef GL_ARB_texture_env_dot3 + GLEW_ARB_texture_env_dot3 = _glewSearchExtension("GL_ARB_texture_env_dot3", extStart, extEnd); +#endif /* GL_ARB_texture_env_dot3 */ +#ifdef GL_ARB_texture_filter_minmax + GLEW_ARB_texture_filter_minmax = _glewSearchExtension("GL_ARB_texture_filter_minmax", extStart, extEnd); +#endif /* GL_ARB_texture_filter_minmax */ +#ifdef GL_ARB_texture_float + GLEW_ARB_texture_float = _glewSearchExtension("GL_ARB_texture_float", extStart, extEnd); +#endif /* GL_ARB_texture_float */ +#ifdef GL_ARB_texture_gather + GLEW_ARB_texture_gather = _glewSearchExtension("GL_ARB_texture_gather", extStart, extEnd); +#endif /* GL_ARB_texture_gather */ +#ifdef GL_ARB_texture_mirror_clamp_to_edge + GLEW_ARB_texture_mirror_clamp_to_edge = _glewSearchExtension("GL_ARB_texture_mirror_clamp_to_edge", extStart, extEnd); +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ +#ifdef GL_ARB_texture_mirrored_repeat + GLEW_ARB_texture_mirrored_repeat = _glewSearchExtension("GL_ARB_texture_mirrored_repeat", extStart, extEnd); +#endif /* GL_ARB_texture_mirrored_repeat */ +#ifdef GL_ARB_texture_multisample + GLEW_ARB_texture_multisample = _glewSearchExtension("GL_ARB_texture_multisample", extStart, extEnd); + if (glewExperimental || GLEW_ARB_texture_multisample) GLEW_ARB_texture_multisample = !_glewInit_GL_ARB_texture_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_texture_multisample */ +#ifdef GL_ARB_texture_non_power_of_two + GLEW_ARB_texture_non_power_of_two = _glewSearchExtension("GL_ARB_texture_non_power_of_two", extStart, extEnd); +#endif /* GL_ARB_texture_non_power_of_two */ +#ifdef GL_ARB_texture_query_levels + GLEW_ARB_texture_query_levels = _glewSearchExtension("GL_ARB_texture_query_levels", extStart, extEnd); +#endif /* GL_ARB_texture_query_levels */ +#ifdef GL_ARB_texture_query_lod + GLEW_ARB_texture_query_lod = _glewSearchExtension("GL_ARB_texture_query_lod", extStart, extEnd); +#endif /* GL_ARB_texture_query_lod */ +#ifdef GL_ARB_texture_rectangle + GLEW_ARB_texture_rectangle = _glewSearchExtension("GL_ARB_texture_rectangle", extStart, extEnd); +#endif /* GL_ARB_texture_rectangle */ +#ifdef GL_ARB_texture_rg + GLEW_ARB_texture_rg = _glewSearchExtension("GL_ARB_texture_rg", extStart, extEnd); +#endif /* GL_ARB_texture_rg */ +#ifdef GL_ARB_texture_rgb10_a2ui + GLEW_ARB_texture_rgb10_a2ui = _glewSearchExtension("GL_ARB_texture_rgb10_a2ui", extStart, extEnd); +#endif /* GL_ARB_texture_rgb10_a2ui */ +#ifdef GL_ARB_texture_stencil8 + GLEW_ARB_texture_stencil8 = _glewSearchExtension("GL_ARB_texture_stencil8", extStart, extEnd); +#endif /* GL_ARB_texture_stencil8 */ +#ifdef GL_ARB_texture_storage + GLEW_ARB_texture_storage = _glewSearchExtension("GL_ARB_texture_storage", extStart, extEnd); + if (glewExperimental || GLEW_ARB_texture_storage) GLEW_ARB_texture_storage = !_glewInit_GL_ARB_texture_storage(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_texture_storage */ +#ifdef GL_ARB_texture_storage_multisample + GLEW_ARB_texture_storage_multisample = _glewSearchExtension("GL_ARB_texture_storage_multisample", extStart, extEnd); + if (glewExperimental || GLEW_ARB_texture_storage_multisample) GLEW_ARB_texture_storage_multisample = !_glewInit_GL_ARB_texture_storage_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_texture_storage_multisample */ +#ifdef GL_ARB_texture_swizzle + GLEW_ARB_texture_swizzle = _glewSearchExtension("GL_ARB_texture_swizzle", extStart, extEnd); +#endif /* GL_ARB_texture_swizzle */ +#ifdef GL_ARB_texture_view + GLEW_ARB_texture_view = _glewSearchExtension("GL_ARB_texture_view", extStart, extEnd); + if (glewExperimental || GLEW_ARB_texture_view) GLEW_ARB_texture_view = !_glewInit_GL_ARB_texture_view(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_texture_view */ +#ifdef GL_ARB_timer_query + GLEW_ARB_timer_query = _glewSearchExtension("GL_ARB_timer_query", extStart, extEnd); + if (glewExperimental || GLEW_ARB_timer_query) GLEW_ARB_timer_query = !_glewInit_GL_ARB_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_timer_query */ +#ifdef GL_ARB_transform_feedback2 + GLEW_ARB_transform_feedback2 = _glewSearchExtension("GL_ARB_transform_feedback2", extStart, extEnd); + if (glewExperimental || GLEW_ARB_transform_feedback2) GLEW_ARB_transform_feedback2 = !_glewInit_GL_ARB_transform_feedback2(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_transform_feedback2 */ +#ifdef GL_ARB_transform_feedback3 + GLEW_ARB_transform_feedback3 = _glewSearchExtension("GL_ARB_transform_feedback3", extStart, extEnd); + if (glewExperimental || GLEW_ARB_transform_feedback3) GLEW_ARB_transform_feedback3 = !_glewInit_GL_ARB_transform_feedback3(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_transform_feedback3 */ +#ifdef GL_ARB_transform_feedback_instanced + GLEW_ARB_transform_feedback_instanced = _glewSearchExtension("GL_ARB_transform_feedback_instanced", extStart, extEnd); + if (glewExperimental || GLEW_ARB_transform_feedback_instanced) GLEW_ARB_transform_feedback_instanced = !_glewInit_GL_ARB_transform_feedback_instanced(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_transform_feedback_instanced */ +#ifdef GL_ARB_transform_feedback_overflow_query + GLEW_ARB_transform_feedback_overflow_query = _glewSearchExtension("GL_ARB_transform_feedback_overflow_query", extStart, extEnd); +#endif /* GL_ARB_transform_feedback_overflow_query */ +#ifdef GL_ARB_transpose_matrix + GLEW_ARB_transpose_matrix = _glewSearchExtension("GL_ARB_transpose_matrix", extStart, extEnd); + if (glewExperimental || GLEW_ARB_transpose_matrix) GLEW_ARB_transpose_matrix = !_glewInit_GL_ARB_transpose_matrix(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_transpose_matrix */ +#ifdef GL_ARB_uniform_buffer_object + GLEW_ARB_uniform_buffer_object = _glewSearchExtension("GL_ARB_uniform_buffer_object", extStart, extEnd); + if (glewExperimental || GLEW_ARB_uniform_buffer_object) GLEW_ARB_uniform_buffer_object = !_glewInit_GL_ARB_uniform_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_uniform_buffer_object */ +#ifdef GL_ARB_vertex_array_bgra + GLEW_ARB_vertex_array_bgra = _glewSearchExtension("GL_ARB_vertex_array_bgra", extStart, extEnd); +#endif /* GL_ARB_vertex_array_bgra */ +#ifdef GL_ARB_vertex_array_object + GLEW_ARB_vertex_array_object = _glewSearchExtension("GL_ARB_vertex_array_object", extStart, extEnd); + if (glewExperimental || GLEW_ARB_vertex_array_object) GLEW_ARB_vertex_array_object = !_glewInit_GL_ARB_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_vertex_array_object */ +#ifdef GL_ARB_vertex_attrib_64bit + GLEW_ARB_vertex_attrib_64bit = _glewSearchExtension("GL_ARB_vertex_attrib_64bit", extStart, extEnd); + if (glewExperimental || GLEW_ARB_vertex_attrib_64bit) GLEW_ARB_vertex_attrib_64bit = !_glewInit_GL_ARB_vertex_attrib_64bit(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_vertex_attrib_64bit */ +#ifdef GL_ARB_vertex_attrib_binding + GLEW_ARB_vertex_attrib_binding = _glewSearchExtension("GL_ARB_vertex_attrib_binding", extStart, extEnd); + if (glewExperimental || GLEW_ARB_vertex_attrib_binding) GLEW_ARB_vertex_attrib_binding = !_glewInit_GL_ARB_vertex_attrib_binding(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_vertex_attrib_binding */ +#ifdef GL_ARB_vertex_blend + GLEW_ARB_vertex_blend = _glewSearchExtension("GL_ARB_vertex_blend", extStart, extEnd); + if (glewExperimental || GLEW_ARB_vertex_blend) GLEW_ARB_vertex_blend = !_glewInit_GL_ARB_vertex_blend(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_vertex_blend */ +#ifdef GL_ARB_vertex_buffer_object + GLEW_ARB_vertex_buffer_object = _glewSearchExtension("GL_ARB_vertex_buffer_object", extStart, extEnd); + if (glewExperimental || GLEW_ARB_vertex_buffer_object) GLEW_ARB_vertex_buffer_object = !_glewInit_GL_ARB_vertex_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_vertex_buffer_object */ +#ifdef GL_ARB_vertex_program + GLEW_ARB_vertex_program = _glewSearchExtension("GL_ARB_vertex_program", extStart, extEnd); + if (glewExperimental || GLEW_ARB_vertex_program) GLEW_ARB_vertex_program = !_glewInit_GL_ARB_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_vertex_program */ +#ifdef GL_ARB_vertex_shader + GLEW_ARB_vertex_shader = _glewSearchExtension("GL_ARB_vertex_shader", extStart, extEnd); + if (glewExperimental || GLEW_ARB_vertex_shader) { GLEW_ARB_vertex_shader = !_glewInit_GL_ARB_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); _glewInit_GL_ARB_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); } +#endif /* GL_ARB_vertex_shader */ +#ifdef GL_ARB_vertex_type_10f_11f_11f_rev + GLEW_ARB_vertex_type_10f_11f_11f_rev = _glewSearchExtension("GL_ARB_vertex_type_10f_11f_11f_rev", extStart, extEnd); +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ +#ifdef GL_ARB_vertex_type_2_10_10_10_rev + GLEW_ARB_vertex_type_2_10_10_10_rev = _glewSearchExtension("GL_ARB_vertex_type_2_10_10_10_rev", extStart, extEnd); + if (glewExperimental || GLEW_ARB_vertex_type_2_10_10_10_rev) GLEW_ARB_vertex_type_2_10_10_10_rev = !_glewInit_GL_ARB_vertex_type_2_10_10_10_rev(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ +#ifdef GL_ARB_viewport_array + GLEW_ARB_viewport_array = _glewSearchExtension("GL_ARB_viewport_array", extStart, extEnd); + if (glewExperimental || GLEW_ARB_viewport_array) GLEW_ARB_viewport_array = !_glewInit_GL_ARB_viewport_array(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_viewport_array */ +#ifdef GL_ARB_window_pos + GLEW_ARB_window_pos = _glewSearchExtension("GL_ARB_window_pos", extStart, extEnd); + if (glewExperimental || GLEW_ARB_window_pos) GLEW_ARB_window_pos = !_glewInit_GL_ARB_window_pos(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ARB_window_pos */ +#ifdef GL_ATIX_point_sprites + GLEW_ATIX_point_sprites = _glewSearchExtension("GL_ATIX_point_sprites", extStart, extEnd); +#endif /* GL_ATIX_point_sprites */ +#ifdef GL_ATIX_texture_env_combine3 + GLEW_ATIX_texture_env_combine3 = _glewSearchExtension("GL_ATIX_texture_env_combine3", extStart, extEnd); +#endif /* GL_ATIX_texture_env_combine3 */ +#ifdef GL_ATIX_texture_env_route + GLEW_ATIX_texture_env_route = _glewSearchExtension("GL_ATIX_texture_env_route", extStart, extEnd); +#endif /* GL_ATIX_texture_env_route */ +#ifdef GL_ATIX_vertex_shader_output_point_size + GLEW_ATIX_vertex_shader_output_point_size = _glewSearchExtension("GL_ATIX_vertex_shader_output_point_size", extStart, extEnd); +#endif /* GL_ATIX_vertex_shader_output_point_size */ +#ifdef GL_ATI_draw_buffers + GLEW_ATI_draw_buffers = _glewSearchExtension("GL_ATI_draw_buffers", extStart, extEnd); + if (glewExperimental || GLEW_ATI_draw_buffers) GLEW_ATI_draw_buffers = !_glewInit_GL_ATI_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_draw_buffers */ +#ifdef GL_ATI_element_array + GLEW_ATI_element_array = _glewSearchExtension("GL_ATI_element_array", extStart, extEnd); + if (glewExperimental || GLEW_ATI_element_array) GLEW_ATI_element_array = !_glewInit_GL_ATI_element_array(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_element_array */ +#ifdef GL_ATI_envmap_bumpmap + GLEW_ATI_envmap_bumpmap = _glewSearchExtension("GL_ATI_envmap_bumpmap", extStart, extEnd); + if (glewExperimental || GLEW_ATI_envmap_bumpmap) GLEW_ATI_envmap_bumpmap = !_glewInit_GL_ATI_envmap_bumpmap(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_envmap_bumpmap */ +#ifdef GL_ATI_fragment_shader + GLEW_ATI_fragment_shader = _glewSearchExtension("GL_ATI_fragment_shader", extStart, extEnd); + if (glewExperimental || GLEW_ATI_fragment_shader) GLEW_ATI_fragment_shader = !_glewInit_GL_ATI_fragment_shader(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_fragment_shader */ +#ifdef GL_ATI_map_object_buffer + GLEW_ATI_map_object_buffer = _glewSearchExtension("GL_ATI_map_object_buffer", extStart, extEnd); + if (glewExperimental || GLEW_ATI_map_object_buffer) GLEW_ATI_map_object_buffer = !_glewInit_GL_ATI_map_object_buffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_map_object_buffer */ +#ifdef GL_ATI_meminfo + GLEW_ATI_meminfo = _glewSearchExtension("GL_ATI_meminfo", extStart, extEnd); +#endif /* GL_ATI_meminfo */ +#ifdef GL_ATI_pn_triangles + GLEW_ATI_pn_triangles = _glewSearchExtension("GL_ATI_pn_triangles", extStart, extEnd); + if (glewExperimental || GLEW_ATI_pn_triangles) GLEW_ATI_pn_triangles = !_glewInit_GL_ATI_pn_triangles(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_pn_triangles */ +#ifdef GL_ATI_separate_stencil + GLEW_ATI_separate_stencil = _glewSearchExtension("GL_ATI_separate_stencil", extStart, extEnd); + if (glewExperimental || GLEW_ATI_separate_stencil) GLEW_ATI_separate_stencil = !_glewInit_GL_ATI_separate_stencil(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_separate_stencil */ +#ifdef GL_ATI_shader_texture_lod + GLEW_ATI_shader_texture_lod = _glewSearchExtension("GL_ATI_shader_texture_lod", extStart, extEnd); +#endif /* GL_ATI_shader_texture_lod */ +#ifdef GL_ATI_text_fragment_shader + GLEW_ATI_text_fragment_shader = _glewSearchExtension("GL_ATI_text_fragment_shader", extStart, extEnd); +#endif /* GL_ATI_text_fragment_shader */ +#ifdef GL_ATI_texture_compression_3dc + GLEW_ATI_texture_compression_3dc = _glewSearchExtension("GL_ATI_texture_compression_3dc", extStart, extEnd); +#endif /* GL_ATI_texture_compression_3dc */ +#ifdef GL_ATI_texture_env_combine3 + GLEW_ATI_texture_env_combine3 = _glewSearchExtension("GL_ATI_texture_env_combine3", extStart, extEnd); +#endif /* GL_ATI_texture_env_combine3 */ +#ifdef GL_ATI_texture_float + GLEW_ATI_texture_float = _glewSearchExtension("GL_ATI_texture_float", extStart, extEnd); +#endif /* GL_ATI_texture_float */ +#ifdef GL_ATI_texture_mirror_once + GLEW_ATI_texture_mirror_once = _glewSearchExtension("GL_ATI_texture_mirror_once", extStart, extEnd); +#endif /* GL_ATI_texture_mirror_once */ +#ifdef GL_ATI_vertex_array_object + GLEW_ATI_vertex_array_object = _glewSearchExtension("GL_ATI_vertex_array_object", extStart, extEnd); + if (glewExperimental || GLEW_ATI_vertex_array_object) GLEW_ATI_vertex_array_object = !_glewInit_GL_ATI_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_vertex_array_object */ +#ifdef GL_ATI_vertex_attrib_array_object + GLEW_ATI_vertex_attrib_array_object = _glewSearchExtension("GL_ATI_vertex_attrib_array_object", extStart, extEnd); + if (glewExperimental || GLEW_ATI_vertex_attrib_array_object) GLEW_ATI_vertex_attrib_array_object = !_glewInit_GL_ATI_vertex_attrib_array_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_vertex_attrib_array_object */ +#ifdef GL_ATI_vertex_streams + GLEW_ATI_vertex_streams = _glewSearchExtension("GL_ATI_vertex_streams", extStart, extEnd); + if (glewExperimental || GLEW_ATI_vertex_streams) GLEW_ATI_vertex_streams = !_glewInit_GL_ATI_vertex_streams(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_ATI_vertex_streams */ +#ifdef GL_EXT_422_pixels + GLEW_EXT_422_pixels = _glewSearchExtension("GL_EXT_422_pixels", extStart, extEnd); +#endif /* GL_EXT_422_pixels */ +#ifdef GL_EXT_Cg_shader + GLEW_EXT_Cg_shader = _glewSearchExtension("GL_EXT_Cg_shader", extStart, extEnd); +#endif /* GL_EXT_Cg_shader */ +#ifdef GL_EXT_abgr + GLEW_EXT_abgr = _glewSearchExtension("GL_EXT_abgr", extStart, extEnd); +#endif /* GL_EXT_abgr */ +#ifdef GL_EXT_bgra + GLEW_EXT_bgra = _glewSearchExtension("GL_EXT_bgra", extStart, extEnd); +#endif /* GL_EXT_bgra */ +#ifdef GL_EXT_bindable_uniform + GLEW_EXT_bindable_uniform = _glewSearchExtension("GL_EXT_bindable_uniform", extStart, extEnd); + if (glewExperimental || GLEW_EXT_bindable_uniform) GLEW_EXT_bindable_uniform = !_glewInit_GL_EXT_bindable_uniform(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_bindable_uniform */ +#ifdef GL_EXT_blend_color + GLEW_EXT_blend_color = _glewSearchExtension("GL_EXT_blend_color", extStart, extEnd); + if (glewExperimental || GLEW_EXT_blend_color) GLEW_EXT_blend_color = !_glewInit_GL_EXT_blend_color(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_blend_color */ +#ifdef GL_EXT_blend_equation_separate + GLEW_EXT_blend_equation_separate = _glewSearchExtension("GL_EXT_blend_equation_separate", extStart, extEnd); + if (glewExperimental || GLEW_EXT_blend_equation_separate) GLEW_EXT_blend_equation_separate = !_glewInit_GL_EXT_blend_equation_separate(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_blend_equation_separate */ +#ifdef GL_EXT_blend_func_separate + GLEW_EXT_blend_func_separate = _glewSearchExtension("GL_EXT_blend_func_separate", extStart, extEnd); + if (glewExperimental || GLEW_EXT_blend_func_separate) GLEW_EXT_blend_func_separate = !_glewInit_GL_EXT_blend_func_separate(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_blend_func_separate */ +#ifdef GL_EXT_blend_logic_op + GLEW_EXT_blend_logic_op = _glewSearchExtension("GL_EXT_blend_logic_op", extStart, extEnd); +#endif /* GL_EXT_blend_logic_op */ +#ifdef GL_EXT_blend_minmax + GLEW_EXT_blend_minmax = _glewSearchExtension("GL_EXT_blend_minmax", extStart, extEnd); + if (glewExperimental || GLEW_EXT_blend_minmax) GLEW_EXT_blend_minmax = !_glewInit_GL_EXT_blend_minmax(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_blend_minmax */ +#ifdef GL_EXT_blend_subtract + GLEW_EXT_blend_subtract = _glewSearchExtension("GL_EXT_blend_subtract", extStart, extEnd); +#endif /* GL_EXT_blend_subtract */ +#ifdef GL_EXT_clip_volume_hint + GLEW_EXT_clip_volume_hint = _glewSearchExtension("GL_EXT_clip_volume_hint", extStart, extEnd); +#endif /* GL_EXT_clip_volume_hint */ +#ifdef GL_EXT_cmyka + GLEW_EXT_cmyka = _glewSearchExtension("GL_EXT_cmyka", extStart, extEnd); +#endif /* GL_EXT_cmyka */ +#ifdef GL_EXT_color_subtable + GLEW_EXT_color_subtable = _glewSearchExtension("GL_EXT_color_subtable", extStart, extEnd); + if (glewExperimental || GLEW_EXT_color_subtable) GLEW_EXT_color_subtable = !_glewInit_GL_EXT_color_subtable(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_color_subtable */ +#ifdef GL_EXT_compiled_vertex_array + GLEW_EXT_compiled_vertex_array = _glewSearchExtension("GL_EXT_compiled_vertex_array", extStart, extEnd); + if (glewExperimental || GLEW_EXT_compiled_vertex_array) GLEW_EXT_compiled_vertex_array = !_glewInit_GL_EXT_compiled_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_compiled_vertex_array */ +#ifdef GL_EXT_convolution + GLEW_EXT_convolution = _glewSearchExtension("GL_EXT_convolution", extStart, extEnd); + if (glewExperimental || GLEW_EXT_convolution) GLEW_EXT_convolution = !_glewInit_GL_EXT_convolution(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_convolution */ +#ifdef GL_EXT_coordinate_frame + GLEW_EXT_coordinate_frame = _glewSearchExtension("GL_EXT_coordinate_frame", extStart, extEnd); + if (glewExperimental || GLEW_EXT_coordinate_frame) GLEW_EXT_coordinate_frame = !_glewInit_GL_EXT_coordinate_frame(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_coordinate_frame */ +#ifdef GL_EXT_copy_texture + GLEW_EXT_copy_texture = _glewSearchExtension("GL_EXT_copy_texture", extStart, extEnd); + if (glewExperimental || GLEW_EXT_copy_texture) GLEW_EXT_copy_texture = !_glewInit_GL_EXT_copy_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_copy_texture */ +#ifdef GL_EXT_cull_vertex + GLEW_EXT_cull_vertex = _glewSearchExtension("GL_EXT_cull_vertex", extStart, extEnd); + if (glewExperimental || GLEW_EXT_cull_vertex) GLEW_EXT_cull_vertex = !_glewInit_GL_EXT_cull_vertex(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_cull_vertex */ +#ifdef GL_EXT_debug_label + GLEW_EXT_debug_label = _glewSearchExtension("GL_EXT_debug_label", extStart, extEnd); + if (glewExperimental || GLEW_EXT_debug_label) GLEW_EXT_debug_label = !_glewInit_GL_EXT_debug_label(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_debug_label */ +#ifdef GL_EXT_debug_marker + GLEW_EXT_debug_marker = _glewSearchExtension("GL_EXT_debug_marker", extStart, extEnd); + if (glewExperimental || GLEW_EXT_debug_marker) GLEW_EXT_debug_marker = !_glewInit_GL_EXT_debug_marker(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_debug_marker */ +#ifdef GL_EXT_depth_bounds_test + GLEW_EXT_depth_bounds_test = _glewSearchExtension("GL_EXT_depth_bounds_test", extStart, extEnd); + if (glewExperimental || GLEW_EXT_depth_bounds_test) GLEW_EXT_depth_bounds_test = !_glewInit_GL_EXT_depth_bounds_test(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_depth_bounds_test */ +#ifdef GL_EXT_direct_state_access + GLEW_EXT_direct_state_access = _glewSearchExtension("GL_EXT_direct_state_access", extStart, extEnd); + if (glewExperimental || GLEW_EXT_direct_state_access) GLEW_EXT_direct_state_access = !_glewInit_GL_EXT_direct_state_access(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_direct_state_access */ +#ifdef GL_EXT_draw_buffers2 + GLEW_EXT_draw_buffers2 = _glewSearchExtension("GL_EXT_draw_buffers2", extStart, extEnd); + if (glewExperimental || GLEW_EXT_draw_buffers2) GLEW_EXT_draw_buffers2 = !_glewInit_GL_EXT_draw_buffers2(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_draw_buffers2 */ +#ifdef GL_EXT_draw_instanced + GLEW_EXT_draw_instanced = _glewSearchExtension("GL_EXT_draw_instanced", extStart, extEnd); + if (glewExperimental || GLEW_EXT_draw_instanced) GLEW_EXT_draw_instanced = !_glewInit_GL_EXT_draw_instanced(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_draw_instanced */ +#ifdef GL_EXT_draw_range_elements + GLEW_EXT_draw_range_elements = _glewSearchExtension("GL_EXT_draw_range_elements", extStart, extEnd); + if (glewExperimental || GLEW_EXT_draw_range_elements) GLEW_EXT_draw_range_elements = !_glewInit_GL_EXT_draw_range_elements(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_draw_range_elements */ +#ifdef GL_EXT_fog_coord + GLEW_EXT_fog_coord = _glewSearchExtension("GL_EXT_fog_coord", extStart, extEnd); + if (glewExperimental || GLEW_EXT_fog_coord) GLEW_EXT_fog_coord = !_glewInit_GL_EXT_fog_coord(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_fog_coord */ +#ifdef GL_EXT_fragment_lighting + GLEW_EXT_fragment_lighting = _glewSearchExtension("GL_EXT_fragment_lighting", extStart, extEnd); + if (glewExperimental || GLEW_EXT_fragment_lighting) GLEW_EXT_fragment_lighting = !_glewInit_GL_EXT_fragment_lighting(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_fragment_lighting */ +#ifdef GL_EXT_framebuffer_blit + GLEW_EXT_framebuffer_blit = _glewSearchExtension("GL_EXT_framebuffer_blit", extStart, extEnd); + if (glewExperimental || GLEW_EXT_framebuffer_blit) GLEW_EXT_framebuffer_blit = !_glewInit_GL_EXT_framebuffer_blit(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_framebuffer_blit */ +#ifdef GL_EXT_framebuffer_multisample + GLEW_EXT_framebuffer_multisample = _glewSearchExtension("GL_EXT_framebuffer_multisample", extStart, extEnd); + if (glewExperimental || GLEW_EXT_framebuffer_multisample) GLEW_EXT_framebuffer_multisample = !_glewInit_GL_EXT_framebuffer_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_framebuffer_multisample */ +#ifdef GL_EXT_framebuffer_multisample_blit_scaled + GLEW_EXT_framebuffer_multisample_blit_scaled = _glewSearchExtension("GL_EXT_framebuffer_multisample_blit_scaled", extStart, extEnd); +#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ +#ifdef GL_EXT_framebuffer_object + GLEW_EXT_framebuffer_object = _glewSearchExtension("GL_EXT_framebuffer_object", extStart, extEnd); + if (glewExperimental || GLEW_EXT_framebuffer_object) GLEW_EXT_framebuffer_object = !_glewInit_GL_EXT_framebuffer_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_framebuffer_object */ +#ifdef GL_EXT_framebuffer_sRGB + GLEW_EXT_framebuffer_sRGB = _glewSearchExtension("GL_EXT_framebuffer_sRGB", extStart, extEnd); +#endif /* GL_EXT_framebuffer_sRGB */ +#ifdef GL_EXT_geometry_shader4 + GLEW_EXT_geometry_shader4 = _glewSearchExtension("GL_EXT_geometry_shader4", extStart, extEnd); + if (glewExperimental || GLEW_EXT_geometry_shader4) GLEW_EXT_geometry_shader4 = !_glewInit_GL_EXT_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_geometry_shader4 */ +#ifdef GL_EXT_gpu_program_parameters + GLEW_EXT_gpu_program_parameters = _glewSearchExtension("GL_EXT_gpu_program_parameters", extStart, extEnd); + if (glewExperimental || GLEW_EXT_gpu_program_parameters) GLEW_EXT_gpu_program_parameters = !_glewInit_GL_EXT_gpu_program_parameters(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_gpu_program_parameters */ +#ifdef GL_EXT_gpu_shader4 + GLEW_EXT_gpu_shader4 = _glewSearchExtension("GL_EXT_gpu_shader4", extStart, extEnd); + if (glewExperimental || GLEW_EXT_gpu_shader4) GLEW_EXT_gpu_shader4 = !_glewInit_GL_EXT_gpu_shader4(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_gpu_shader4 */ +#ifdef GL_EXT_histogram + GLEW_EXT_histogram = _glewSearchExtension("GL_EXT_histogram", extStart, extEnd); + if (glewExperimental || GLEW_EXT_histogram) GLEW_EXT_histogram = !_glewInit_GL_EXT_histogram(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_histogram */ +#ifdef GL_EXT_index_array_formats + GLEW_EXT_index_array_formats = _glewSearchExtension("GL_EXT_index_array_formats", extStart, extEnd); +#endif /* GL_EXT_index_array_formats */ +#ifdef GL_EXT_index_func + GLEW_EXT_index_func = _glewSearchExtension("GL_EXT_index_func", extStart, extEnd); + if (glewExperimental || GLEW_EXT_index_func) GLEW_EXT_index_func = !_glewInit_GL_EXT_index_func(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_index_func */ +#ifdef GL_EXT_index_material + GLEW_EXT_index_material = _glewSearchExtension("GL_EXT_index_material", extStart, extEnd); + if (glewExperimental || GLEW_EXT_index_material) GLEW_EXT_index_material = !_glewInit_GL_EXT_index_material(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_index_material */ +#ifdef GL_EXT_index_texture + GLEW_EXT_index_texture = _glewSearchExtension("GL_EXT_index_texture", extStart, extEnd); +#endif /* GL_EXT_index_texture */ +#ifdef GL_EXT_light_texture + GLEW_EXT_light_texture = _glewSearchExtension("GL_EXT_light_texture", extStart, extEnd); + if (glewExperimental || GLEW_EXT_light_texture) GLEW_EXT_light_texture = !_glewInit_GL_EXT_light_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_light_texture */ +#ifdef GL_EXT_misc_attribute + GLEW_EXT_misc_attribute = _glewSearchExtension("GL_EXT_misc_attribute", extStart, extEnd); +#endif /* GL_EXT_misc_attribute */ +#ifdef GL_EXT_multi_draw_arrays + GLEW_EXT_multi_draw_arrays = _glewSearchExtension("GL_EXT_multi_draw_arrays", extStart, extEnd); + if (glewExperimental || GLEW_EXT_multi_draw_arrays) GLEW_EXT_multi_draw_arrays = !_glewInit_GL_EXT_multi_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_multi_draw_arrays */ +#ifdef GL_EXT_multisample + GLEW_EXT_multisample = _glewSearchExtension("GL_EXT_multisample", extStart, extEnd); + if (glewExperimental || GLEW_EXT_multisample) GLEW_EXT_multisample = !_glewInit_GL_EXT_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_multisample */ +#ifdef GL_EXT_packed_depth_stencil + GLEW_EXT_packed_depth_stencil = _glewSearchExtension("GL_EXT_packed_depth_stencil", extStart, extEnd); +#endif /* GL_EXT_packed_depth_stencil */ +#ifdef GL_EXT_packed_float + GLEW_EXT_packed_float = _glewSearchExtension("GL_EXT_packed_float", extStart, extEnd); +#endif /* GL_EXT_packed_float */ +#ifdef GL_EXT_packed_pixels + GLEW_EXT_packed_pixels = _glewSearchExtension("GL_EXT_packed_pixels", extStart, extEnd); +#endif /* GL_EXT_packed_pixels */ +#ifdef GL_EXT_paletted_texture + GLEW_EXT_paletted_texture = _glewSearchExtension("GL_EXT_paletted_texture", extStart, extEnd); + if (glewExperimental || GLEW_EXT_paletted_texture) GLEW_EXT_paletted_texture = !_glewInit_GL_EXT_paletted_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_paletted_texture */ +#ifdef GL_EXT_pixel_buffer_object + GLEW_EXT_pixel_buffer_object = _glewSearchExtension("GL_EXT_pixel_buffer_object", extStart, extEnd); +#endif /* GL_EXT_pixel_buffer_object */ +#ifdef GL_EXT_pixel_transform + GLEW_EXT_pixel_transform = _glewSearchExtension("GL_EXT_pixel_transform", extStart, extEnd); + if (glewExperimental || GLEW_EXT_pixel_transform) GLEW_EXT_pixel_transform = !_glewInit_GL_EXT_pixel_transform(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_pixel_transform */ +#ifdef GL_EXT_pixel_transform_color_table + GLEW_EXT_pixel_transform_color_table = _glewSearchExtension("GL_EXT_pixel_transform_color_table", extStart, extEnd); +#endif /* GL_EXT_pixel_transform_color_table */ +#ifdef GL_EXT_point_parameters + GLEW_EXT_point_parameters = _glewSearchExtension("GL_EXT_point_parameters", extStart, extEnd); + if (glewExperimental || GLEW_EXT_point_parameters) GLEW_EXT_point_parameters = !_glewInit_GL_EXT_point_parameters(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_point_parameters */ +#ifdef GL_EXT_polygon_offset + GLEW_EXT_polygon_offset = _glewSearchExtension("GL_EXT_polygon_offset", extStart, extEnd); + if (glewExperimental || GLEW_EXT_polygon_offset) GLEW_EXT_polygon_offset = !_glewInit_GL_EXT_polygon_offset(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_polygon_offset */ +#ifdef GL_EXT_polygon_offset_clamp + GLEW_EXT_polygon_offset_clamp = _glewSearchExtension("GL_EXT_polygon_offset_clamp", extStart, extEnd); + if (glewExperimental || GLEW_EXT_polygon_offset_clamp) GLEW_EXT_polygon_offset_clamp = !_glewInit_GL_EXT_polygon_offset_clamp(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_polygon_offset_clamp */ +#ifdef GL_EXT_post_depth_coverage + GLEW_EXT_post_depth_coverage = _glewSearchExtension("GL_EXT_post_depth_coverage", extStart, extEnd); +#endif /* GL_EXT_post_depth_coverage */ +#ifdef GL_EXT_provoking_vertex + GLEW_EXT_provoking_vertex = _glewSearchExtension("GL_EXT_provoking_vertex", extStart, extEnd); + if (glewExperimental || GLEW_EXT_provoking_vertex) GLEW_EXT_provoking_vertex = !_glewInit_GL_EXT_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_provoking_vertex */ +#ifdef GL_EXT_raster_multisample + GLEW_EXT_raster_multisample = _glewSearchExtension("GL_EXT_raster_multisample", extStart, extEnd); + if (glewExperimental || GLEW_EXT_raster_multisample) GLEW_EXT_raster_multisample = !_glewInit_GL_EXT_raster_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_raster_multisample */ +#ifdef GL_EXT_rescale_normal + GLEW_EXT_rescale_normal = _glewSearchExtension("GL_EXT_rescale_normal", extStart, extEnd); +#endif /* GL_EXT_rescale_normal */ +#ifdef GL_EXT_scene_marker + GLEW_EXT_scene_marker = _glewSearchExtension("GL_EXT_scene_marker", extStart, extEnd); + if (glewExperimental || GLEW_EXT_scene_marker) GLEW_EXT_scene_marker = !_glewInit_GL_EXT_scene_marker(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_scene_marker */ +#ifdef GL_EXT_secondary_color + GLEW_EXT_secondary_color = _glewSearchExtension("GL_EXT_secondary_color", extStart, extEnd); + if (glewExperimental || GLEW_EXT_secondary_color) GLEW_EXT_secondary_color = !_glewInit_GL_EXT_secondary_color(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_secondary_color */ +#ifdef GL_EXT_separate_shader_objects + GLEW_EXT_separate_shader_objects = _glewSearchExtension("GL_EXT_separate_shader_objects", extStart, extEnd); + if (glewExperimental || GLEW_EXT_separate_shader_objects) GLEW_EXT_separate_shader_objects = !_glewInit_GL_EXT_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_separate_shader_objects */ +#ifdef GL_EXT_separate_specular_color + GLEW_EXT_separate_specular_color = _glewSearchExtension("GL_EXT_separate_specular_color", extStart, extEnd); +#endif /* GL_EXT_separate_specular_color */ +#ifdef GL_EXT_shader_image_load_formatted + GLEW_EXT_shader_image_load_formatted = _glewSearchExtension("GL_EXT_shader_image_load_formatted", extStart, extEnd); +#endif /* GL_EXT_shader_image_load_formatted */ +#ifdef GL_EXT_shader_image_load_store + GLEW_EXT_shader_image_load_store = _glewSearchExtension("GL_EXT_shader_image_load_store", extStart, extEnd); + if (glewExperimental || GLEW_EXT_shader_image_load_store) GLEW_EXT_shader_image_load_store = !_glewInit_GL_EXT_shader_image_load_store(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_shader_image_load_store */ +#ifdef GL_EXT_shader_integer_mix + GLEW_EXT_shader_integer_mix = _glewSearchExtension("GL_EXT_shader_integer_mix", extStart, extEnd); +#endif /* GL_EXT_shader_integer_mix */ +#ifdef GL_EXT_shadow_funcs + GLEW_EXT_shadow_funcs = _glewSearchExtension("GL_EXT_shadow_funcs", extStart, extEnd); +#endif /* GL_EXT_shadow_funcs */ +#ifdef GL_EXT_shared_texture_palette + GLEW_EXT_shared_texture_palette = _glewSearchExtension("GL_EXT_shared_texture_palette", extStart, extEnd); +#endif /* GL_EXT_shared_texture_palette */ +#ifdef GL_EXT_sparse_texture2 + GLEW_EXT_sparse_texture2 = _glewSearchExtension("GL_EXT_sparse_texture2", extStart, extEnd); +#endif /* GL_EXT_sparse_texture2 */ +#ifdef GL_EXT_stencil_clear_tag + GLEW_EXT_stencil_clear_tag = _glewSearchExtension("GL_EXT_stencil_clear_tag", extStart, extEnd); +#endif /* GL_EXT_stencil_clear_tag */ +#ifdef GL_EXT_stencil_two_side + GLEW_EXT_stencil_two_side = _glewSearchExtension("GL_EXT_stencil_two_side", extStart, extEnd); + if (glewExperimental || GLEW_EXT_stencil_two_side) GLEW_EXT_stencil_two_side = !_glewInit_GL_EXT_stencil_two_side(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_stencil_two_side */ +#ifdef GL_EXT_stencil_wrap + GLEW_EXT_stencil_wrap = _glewSearchExtension("GL_EXT_stencil_wrap", extStart, extEnd); +#endif /* GL_EXT_stencil_wrap */ +#ifdef GL_EXT_subtexture + GLEW_EXT_subtexture = _glewSearchExtension("GL_EXT_subtexture", extStart, extEnd); + if (glewExperimental || GLEW_EXT_subtexture) GLEW_EXT_subtexture = !_glewInit_GL_EXT_subtexture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_subtexture */ +#ifdef GL_EXT_texture + GLEW_EXT_texture = _glewSearchExtension("GL_EXT_texture", extStart, extEnd); +#endif /* GL_EXT_texture */ +#ifdef GL_EXT_texture3D + GLEW_EXT_texture3D = _glewSearchExtension("GL_EXT_texture3D", extStart, extEnd); + if (glewExperimental || GLEW_EXT_texture3D) GLEW_EXT_texture3D = !_glewInit_GL_EXT_texture3D(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_texture3D */ +#ifdef GL_EXT_texture_array + GLEW_EXT_texture_array = _glewSearchExtension("GL_EXT_texture_array", extStart, extEnd); + if (glewExperimental || GLEW_EXT_texture_array) GLEW_EXT_texture_array = !_glewInit_GL_EXT_texture_array(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_texture_array */ +#ifdef GL_EXT_texture_buffer_object + GLEW_EXT_texture_buffer_object = _glewSearchExtension("GL_EXT_texture_buffer_object", extStart, extEnd); + if (glewExperimental || GLEW_EXT_texture_buffer_object) GLEW_EXT_texture_buffer_object = !_glewInit_GL_EXT_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_texture_buffer_object */ +#ifdef GL_EXT_texture_compression_dxt1 + GLEW_EXT_texture_compression_dxt1 = _glewSearchExtension("GL_EXT_texture_compression_dxt1", extStart, extEnd); +#endif /* GL_EXT_texture_compression_dxt1 */ +#ifdef GL_EXT_texture_compression_latc + GLEW_EXT_texture_compression_latc = _glewSearchExtension("GL_EXT_texture_compression_latc", extStart, extEnd); +#endif /* GL_EXT_texture_compression_latc */ +#ifdef GL_EXT_texture_compression_rgtc + GLEW_EXT_texture_compression_rgtc = _glewSearchExtension("GL_EXT_texture_compression_rgtc", extStart, extEnd); +#endif /* GL_EXT_texture_compression_rgtc */ +#ifdef GL_EXT_texture_compression_s3tc + GLEW_EXT_texture_compression_s3tc = _glewSearchExtension("GL_EXT_texture_compression_s3tc", extStart, extEnd); +#endif /* GL_EXT_texture_compression_s3tc */ +#ifdef GL_EXT_texture_cube_map + GLEW_EXT_texture_cube_map = _glewSearchExtension("GL_EXT_texture_cube_map", extStart, extEnd); +#endif /* GL_EXT_texture_cube_map */ +#ifdef GL_EXT_texture_edge_clamp + GLEW_EXT_texture_edge_clamp = _glewSearchExtension("GL_EXT_texture_edge_clamp", extStart, extEnd); +#endif /* GL_EXT_texture_edge_clamp */ +#ifdef GL_EXT_texture_env + GLEW_EXT_texture_env = _glewSearchExtension("GL_EXT_texture_env", extStart, extEnd); +#endif /* GL_EXT_texture_env */ +#ifdef GL_EXT_texture_env_add + GLEW_EXT_texture_env_add = _glewSearchExtension("GL_EXT_texture_env_add", extStart, extEnd); +#endif /* GL_EXT_texture_env_add */ +#ifdef GL_EXT_texture_env_combine + GLEW_EXT_texture_env_combine = _glewSearchExtension("GL_EXT_texture_env_combine", extStart, extEnd); +#endif /* GL_EXT_texture_env_combine */ +#ifdef GL_EXT_texture_env_dot3 + GLEW_EXT_texture_env_dot3 = _glewSearchExtension("GL_EXT_texture_env_dot3", extStart, extEnd); +#endif /* GL_EXT_texture_env_dot3 */ +#ifdef GL_EXT_texture_filter_anisotropic + GLEW_EXT_texture_filter_anisotropic = _glewSearchExtension("GL_EXT_texture_filter_anisotropic", extStart, extEnd); +#endif /* GL_EXT_texture_filter_anisotropic */ +#ifdef GL_EXT_texture_filter_minmax + GLEW_EXT_texture_filter_minmax = _glewSearchExtension("GL_EXT_texture_filter_minmax", extStart, extEnd); +#endif /* GL_EXT_texture_filter_minmax */ +#ifdef GL_EXT_texture_integer + GLEW_EXT_texture_integer = _glewSearchExtension("GL_EXT_texture_integer", extStart, extEnd); + if (glewExperimental || GLEW_EXT_texture_integer) GLEW_EXT_texture_integer = !_glewInit_GL_EXT_texture_integer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_texture_integer */ +#ifdef GL_EXT_texture_lod_bias + GLEW_EXT_texture_lod_bias = _glewSearchExtension("GL_EXT_texture_lod_bias", extStart, extEnd); +#endif /* GL_EXT_texture_lod_bias */ +#ifdef GL_EXT_texture_mirror_clamp + GLEW_EXT_texture_mirror_clamp = _glewSearchExtension("GL_EXT_texture_mirror_clamp", extStart, extEnd); +#endif /* GL_EXT_texture_mirror_clamp */ +#ifdef GL_EXT_texture_object + GLEW_EXT_texture_object = _glewSearchExtension("GL_EXT_texture_object", extStart, extEnd); + if (glewExperimental || GLEW_EXT_texture_object) GLEW_EXT_texture_object = !_glewInit_GL_EXT_texture_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_texture_object */ +#ifdef GL_EXT_texture_perturb_normal + GLEW_EXT_texture_perturb_normal = _glewSearchExtension("GL_EXT_texture_perturb_normal", extStart, extEnd); + if (glewExperimental || GLEW_EXT_texture_perturb_normal) GLEW_EXT_texture_perturb_normal = !_glewInit_GL_EXT_texture_perturb_normal(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_texture_perturb_normal */ +#ifdef GL_EXT_texture_rectangle + GLEW_EXT_texture_rectangle = _glewSearchExtension("GL_EXT_texture_rectangle", extStart, extEnd); +#endif /* GL_EXT_texture_rectangle */ +#ifdef GL_EXT_texture_sRGB + GLEW_EXT_texture_sRGB = _glewSearchExtension("GL_EXT_texture_sRGB", extStart, extEnd); +#endif /* GL_EXT_texture_sRGB */ +#ifdef GL_EXT_texture_sRGB_decode + GLEW_EXT_texture_sRGB_decode = _glewSearchExtension("GL_EXT_texture_sRGB_decode", extStart, extEnd); +#endif /* GL_EXT_texture_sRGB_decode */ +#ifdef GL_EXT_texture_shared_exponent + GLEW_EXT_texture_shared_exponent = _glewSearchExtension("GL_EXT_texture_shared_exponent", extStart, extEnd); +#endif /* GL_EXT_texture_shared_exponent */ +#ifdef GL_EXT_texture_snorm + GLEW_EXT_texture_snorm = _glewSearchExtension("GL_EXT_texture_snorm", extStart, extEnd); +#endif /* GL_EXT_texture_snorm */ +#ifdef GL_EXT_texture_swizzle + GLEW_EXT_texture_swizzle = _glewSearchExtension("GL_EXT_texture_swizzle", extStart, extEnd); +#endif /* GL_EXT_texture_swizzle */ +#ifdef GL_EXT_timer_query + GLEW_EXT_timer_query = _glewSearchExtension("GL_EXT_timer_query", extStart, extEnd); + if (glewExperimental || GLEW_EXT_timer_query) GLEW_EXT_timer_query = !_glewInit_GL_EXT_timer_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_timer_query */ +#ifdef GL_EXT_transform_feedback + GLEW_EXT_transform_feedback = _glewSearchExtension("GL_EXT_transform_feedback", extStart, extEnd); + if (glewExperimental || GLEW_EXT_transform_feedback) GLEW_EXT_transform_feedback = !_glewInit_GL_EXT_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_transform_feedback */ +#ifdef GL_EXT_vertex_array + GLEW_EXT_vertex_array = _glewSearchExtension("GL_EXT_vertex_array", extStart, extEnd); + if (glewExperimental || GLEW_EXT_vertex_array) GLEW_EXT_vertex_array = !_glewInit_GL_EXT_vertex_array(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_vertex_array */ +#ifdef GL_EXT_vertex_array_bgra + GLEW_EXT_vertex_array_bgra = _glewSearchExtension("GL_EXT_vertex_array_bgra", extStart, extEnd); +#endif /* GL_EXT_vertex_array_bgra */ +#ifdef GL_EXT_vertex_attrib_64bit + GLEW_EXT_vertex_attrib_64bit = _glewSearchExtension("GL_EXT_vertex_attrib_64bit", extStart, extEnd); + if (glewExperimental || GLEW_EXT_vertex_attrib_64bit) GLEW_EXT_vertex_attrib_64bit = !_glewInit_GL_EXT_vertex_attrib_64bit(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_vertex_attrib_64bit */ +#ifdef GL_EXT_vertex_shader + GLEW_EXT_vertex_shader = _glewSearchExtension("GL_EXT_vertex_shader", extStart, extEnd); + if (glewExperimental || GLEW_EXT_vertex_shader) GLEW_EXT_vertex_shader = !_glewInit_GL_EXT_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_vertex_shader */ +#ifdef GL_EXT_vertex_weighting + GLEW_EXT_vertex_weighting = _glewSearchExtension("GL_EXT_vertex_weighting", extStart, extEnd); + if (glewExperimental || GLEW_EXT_vertex_weighting) GLEW_EXT_vertex_weighting = !_glewInit_GL_EXT_vertex_weighting(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_vertex_weighting */ +#ifdef GL_EXT_x11_sync_object + GLEW_EXT_x11_sync_object = _glewSearchExtension("GL_EXT_x11_sync_object", extStart, extEnd); + if (glewExperimental || GLEW_EXT_x11_sync_object) GLEW_EXT_x11_sync_object = !_glewInit_GL_EXT_x11_sync_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_EXT_x11_sync_object */ +#ifdef GL_GREMEDY_frame_terminator + GLEW_GREMEDY_frame_terminator = _glewSearchExtension("GL_GREMEDY_frame_terminator", extStart, extEnd); + if (glewExperimental || GLEW_GREMEDY_frame_terminator) GLEW_GREMEDY_frame_terminator = !_glewInit_GL_GREMEDY_frame_terminator(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_GREMEDY_frame_terminator */ +#ifdef GL_GREMEDY_string_marker + GLEW_GREMEDY_string_marker = _glewSearchExtension("GL_GREMEDY_string_marker", extStart, extEnd); + if (glewExperimental || GLEW_GREMEDY_string_marker) GLEW_GREMEDY_string_marker = !_glewInit_GL_GREMEDY_string_marker(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_GREMEDY_string_marker */ +#ifdef GL_HP_convolution_border_modes + GLEW_HP_convolution_border_modes = _glewSearchExtension("GL_HP_convolution_border_modes", extStart, extEnd); +#endif /* GL_HP_convolution_border_modes */ +#ifdef GL_HP_image_transform + GLEW_HP_image_transform = _glewSearchExtension("GL_HP_image_transform", extStart, extEnd); + if (glewExperimental || GLEW_HP_image_transform) GLEW_HP_image_transform = !_glewInit_GL_HP_image_transform(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_HP_image_transform */ +#ifdef GL_HP_occlusion_test + GLEW_HP_occlusion_test = _glewSearchExtension("GL_HP_occlusion_test", extStart, extEnd); +#endif /* GL_HP_occlusion_test */ +#ifdef GL_HP_texture_lighting + GLEW_HP_texture_lighting = _glewSearchExtension("GL_HP_texture_lighting", extStart, extEnd); +#endif /* GL_HP_texture_lighting */ +#ifdef GL_IBM_cull_vertex + GLEW_IBM_cull_vertex = _glewSearchExtension("GL_IBM_cull_vertex", extStart, extEnd); +#endif /* GL_IBM_cull_vertex */ +#ifdef GL_IBM_multimode_draw_arrays + GLEW_IBM_multimode_draw_arrays = _glewSearchExtension("GL_IBM_multimode_draw_arrays", extStart, extEnd); + if (glewExperimental || GLEW_IBM_multimode_draw_arrays) GLEW_IBM_multimode_draw_arrays = !_glewInit_GL_IBM_multimode_draw_arrays(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_IBM_multimode_draw_arrays */ +#ifdef GL_IBM_rasterpos_clip + GLEW_IBM_rasterpos_clip = _glewSearchExtension("GL_IBM_rasterpos_clip", extStart, extEnd); +#endif /* GL_IBM_rasterpos_clip */ +#ifdef GL_IBM_static_data + GLEW_IBM_static_data = _glewSearchExtension("GL_IBM_static_data", extStart, extEnd); +#endif /* GL_IBM_static_data */ +#ifdef GL_IBM_texture_mirrored_repeat + GLEW_IBM_texture_mirrored_repeat = _glewSearchExtension("GL_IBM_texture_mirrored_repeat", extStart, extEnd); +#endif /* GL_IBM_texture_mirrored_repeat */ +#ifdef GL_IBM_vertex_array_lists + GLEW_IBM_vertex_array_lists = _glewSearchExtension("GL_IBM_vertex_array_lists", extStart, extEnd); + if (glewExperimental || GLEW_IBM_vertex_array_lists) GLEW_IBM_vertex_array_lists = !_glewInit_GL_IBM_vertex_array_lists(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_IBM_vertex_array_lists */ +#ifdef GL_INGR_color_clamp + GLEW_INGR_color_clamp = _glewSearchExtension("GL_INGR_color_clamp", extStart, extEnd); +#endif /* GL_INGR_color_clamp */ +#ifdef GL_INGR_interlace_read + GLEW_INGR_interlace_read = _glewSearchExtension("GL_INGR_interlace_read", extStart, extEnd); +#endif /* GL_INGR_interlace_read */ +#ifdef GL_INTEL_fragment_shader_ordering + GLEW_INTEL_fragment_shader_ordering = _glewSearchExtension("GL_INTEL_fragment_shader_ordering", extStart, extEnd); +#endif /* GL_INTEL_fragment_shader_ordering */ +#ifdef GL_INTEL_framebuffer_CMAA + GLEW_INTEL_framebuffer_CMAA = _glewSearchExtension("GL_INTEL_framebuffer_CMAA", extStart, extEnd); +#endif /* GL_INTEL_framebuffer_CMAA */ +#ifdef GL_INTEL_map_texture + GLEW_INTEL_map_texture = _glewSearchExtension("GL_INTEL_map_texture", extStart, extEnd); + if (glewExperimental || GLEW_INTEL_map_texture) GLEW_INTEL_map_texture = !_glewInit_GL_INTEL_map_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_INTEL_map_texture */ +#ifdef GL_INTEL_parallel_arrays + GLEW_INTEL_parallel_arrays = _glewSearchExtension("GL_INTEL_parallel_arrays", extStart, extEnd); + if (glewExperimental || GLEW_INTEL_parallel_arrays) GLEW_INTEL_parallel_arrays = !_glewInit_GL_INTEL_parallel_arrays(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_INTEL_parallel_arrays */ +#ifdef GL_INTEL_performance_query + GLEW_INTEL_performance_query = _glewSearchExtension("GL_INTEL_performance_query", extStart, extEnd); + if (glewExperimental || GLEW_INTEL_performance_query) GLEW_INTEL_performance_query = !_glewInit_GL_INTEL_performance_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_INTEL_performance_query */ +#ifdef GL_INTEL_texture_scissor + GLEW_INTEL_texture_scissor = _glewSearchExtension("GL_INTEL_texture_scissor", extStart, extEnd); + if (glewExperimental || GLEW_INTEL_texture_scissor) GLEW_INTEL_texture_scissor = !_glewInit_GL_INTEL_texture_scissor(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_INTEL_texture_scissor */ +#ifdef GL_KHR_blend_equation_advanced + GLEW_KHR_blend_equation_advanced = _glewSearchExtension("GL_KHR_blend_equation_advanced", extStart, extEnd); + if (glewExperimental || GLEW_KHR_blend_equation_advanced) GLEW_KHR_blend_equation_advanced = !_glewInit_GL_KHR_blend_equation_advanced(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_KHR_blend_equation_advanced */ +#ifdef GL_KHR_blend_equation_advanced_coherent + GLEW_KHR_blend_equation_advanced_coherent = _glewSearchExtension("GL_KHR_blend_equation_advanced_coherent", extStart, extEnd); +#endif /* GL_KHR_blend_equation_advanced_coherent */ +#ifdef GL_KHR_context_flush_control + GLEW_KHR_context_flush_control = _glewSearchExtension("GL_KHR_context_flush_control", extStart, extEnd); +#endif /* GL_KHR_context_flush_control */ +#ifdef GL_KHR_debug + GLEW_KHR_debug = _glewSearchExtension("GL_KHR_debug", extStart, extEnd); + if (glewExperimental || GLEW_KHR_debug) GLEW_KHR_debug = !_glewInit_GL_KHR_debug(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_KHR_debug */ +#ifdef GL_KHR_no_error + GLEW_KHR_no_error = _glewSearchExtension("GL_KHR_no_error", extStart, extEnd); +#endif /* GL_KHR_no_error */ +#ifdef GL_KHR_robust_buffer_access_behavior + GLEW_KHR_robust_buffer_access_behavior = _glewSearchExtension("GL_KHR_robust_buffer_access_behavior", extStart, extEnd); +#endif /* GL_KHR_robust_buffer_access_behavior */ +#ifdef GL_KHR_robustness + GLEW_KHR_robustness = _glewSearchExtension("GL_KHR_robustness", extStart, extEnd); + if (glewExperimental || GLEW_KHR_robustness) GLEW_KHR_robustness = !_glewInit_GL_KHR_robustness(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_KHR_robustness */ +#ifdef GL_KHR_texture_compression_astc_hdr + GLEW_KHR_texture_compression_astc_hdr = _glewSearchExtension("GL_KHR_texture_compression_astc_hdr", extStart, extEnd); +#endif /* GL_KHR_texture_compression_astc_hdr */ +#ifdef GL_KHR_texture_compression_astc_ldr + GLEW_KHR_texture_compression_astc_ldr = _glewSearchExtension("GL_KHR_texture_compression_astc_ldr", extStart, extEnd); +#endif /* GL_KHR_texture_compression_astc_ldr */ +#ifdef GL_KTX_buffer_region + GLEW_KTX_buffer_region = _glewSearchExtension("GL_KTX_buffer_region", extStart, extEnd); + if (glewExperimental || GLEW_KTX_buffer_region) GLEW_KTX_buffer_region = !_glewInit_GL_KTX_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_KTX_buffer_region */ +#ifdef GL_MESAX_texture_stack + GLEW_MESAX_texture_stack = _glewSearchExtension("GL_MESAX_texture_stack", extStart, extEnd); +#endif /* GL_MESAX_texture_stack */ +#ifdef GL_MESA_pack_invert + GLEW_MESA_pack_invert = _glewSearchExtension("GL_MESA_pack_invert", extStart, extEnd); +#endif /* GL_MESA_pack_invert */ +#ifdef GL_MESA_resize_buffers + GLEW_MESA_resize_buffers = _glewSearchExtension("GL_MESA_resize_buffers", extStart, extEnd); + if (glewExperimental || GLEW_MESA_resize_buffers) GLEW_MESA_resize_buffers = !_glewInit_GL_MESA_resize_buffers(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_MESA_resize_buffers */ +#ifdef GL_MESA_window_pos + GLEW_MESA_window_pos = _glewSearchExtension("GL_MESA_window_pos", extStart, extEnd); + if (glewExperimental || GLEW_MESA_window_pos) GLEW_MESA_window_pos = !_glewInit_GL_MESA_window_pos(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_MESA_window_pos */ +#ifdef GL_MESA_ycbcr_texture + GLEW_MESA_ycbcr_texture = _glewSearchExtension("GL_MESA_ycbcr_texture", extStart, extEnd); +#endif /* GL_MESA_ycbcr_texture */ +#ifdef GL_NVX_conditional_render + GLEW_NVX_conditional_render = _glewSearchExtension("GL_NVX_conditional_render", extStart, extEnd); + if (glewExperimental || GLEW_NVX_conditional_render) GLEW_NVX_conditional_render = !_glewInit_GL_NVX_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NVX_conditional_render */ +#ifdef GL_NVX_gpu_memory_info + GLEW_NVX_gpu_memory_info = _glewSearchExtension("GL_NVX_gpu_memory_info", extStart, extEnd); +#endif /* GL_NVX_gpu_memory_info */ +#ifdef GL_NV_bindless_multi_draw_indirect + GLEW_NV_bindless_multi_draw_indirect = _glewSearchExtension("GL_NV_bindless_multi_draw_indirect", extStart, extEnd); + if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect) GLEW_NV_bindless_multi_draw_indirect = !_glewInit_GL_NV_bindless_multi_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_bindless_multi_draw_indirect */ +#ifdef GL_NV_bindless_multi_draw_indirect_count + GLEW_NV_bindless_multi_draw_indirect_count = _glewSearchExtension("GL_NV_bindless_multi_draw_indirect_count", extStart, extEnd); + if (glewExperimental || GLEW_NV_bindless_multi_draw_indirect_count) GLEW_NV_bindless_multi_draw_indirect_count = !_glewInit_GL_NV_bindless_multi_draw_indirect_count(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_bindless_multi_draw_indirect_count */ +#ifdef GL_NV_bindless_texture + GLEW_NV_bindless_texture = _glewSearchExtension("GL_NV_bindless_texture", extStart, extEnd); + if (glewExperimental || GLEW_NV_bindless_texture) GLEW_NV_bindless_texture = !_glewInit_GL_NV_bindless_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_bindless_texture */ +#ifdef GL_NV_blend_equation_advanced + GLEW_NV_blend_equation_advanced = _glewSearchExtension("GL_NV_blend_equation_advanced", extStart, extEnd); + if (glewExperimental || GLEW_NV_blend_equation_advanced) GLEW_NV_blend_equation_advanced = !_glewInit_GL_NV_blend_equation_advanced(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_blend_equation_advanced */ +#ifdef GL_NV_blend_equation_advanced_coherent + GLEW_NV_blend_equation_advanced_coherent = _glewSearchExtension("GL_NV_blend_equation_advanced_coherent", extStart, extEnd); +#endif /* GL_NV_blend_equation_advanced_coherent */ +#ifdef GL_NV_blend_square + GLEW_NV_blend_square = _glewSearchExtension("GL_NV_blend_square", extStart, extEnd); +#endif /* GL_NV_blend_square */ +#ifdef GL_NV_compute_program5 + GLEW_NV_compute_program5 = _glewSearchExtension("GL_NV_compute_program5", extStart, extEnd); +#endif /* GL_NV_compute_program5 */ +#ifdef GL_NV_conditional_render + GLEW_NV_conditional_render = _glewSearchExtension("GL_NV_conditional_render", extStart, extEnd); + if (glewExperimental || GLEW_NV_conditional_render) GLEW_NV_conditional_render = !_glewInit_GL_NV_conditional_render(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_conditional_render */ +#ifdef GL_NV_conservative_raster + GLEW_NV_conservative_raster = _glewSearchExtension("GL_NV_conservative_raster", extStart, extEnd); + if (glewExperimental || GLEW_NV_conservative_raster) GLEW_NV_conservative_raster = !_glewInit_GL_NV_conservative_raster(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_conservative_raster */ +#ifdef GL_NV_conservative_raster_dilate + GLEW_NV_conservative_raster_dilate = _glewSearchExtension("GL_NV_conservative_raster_dilate", extStart, extEnd); + if (glewExperimental || GLEW_NV_conservative_raster_dilate) GLEW_NV_conservative_raster_dilate = !_glewInit_GL_NV_conservative_raster_dilate(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_conservative_raster_dilate */ +#ifdef GL_NV_copy_depth_to_color + GLEW_NV_copy_depth_to_color = _glewSearchExtension("GL_NV_copy_depth_to_color", extStart, extEnd); +#endif /* GL_NV_copy_depth_to_color */ +#ifdef GL_NV_copy_image + GLEW_NV_copy_image = _glewSearchExtension("GL_NV_copy_image", extStart, extEnd); + if (glewExperimental || GLEW_NV_copy_image) GLEW_NV_copy_image = !_glewInit_GL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_copy_image */ +#ifdef GL_NV_deep_texture3D + GLEW_NV_deep_texture3D = _glewSearchExtension("GL_NV_deep_texture3D", extStart, extEnd); +#endif /* GL_NV_deep_texture3D */ +#ifdef GL_NV_depth_buffer_float + GLEW_NV_depth_buffer_float = _glewSearchExtension("GL_NV_depth_buffer_float", extStart, extEnd); + if (glewExperimental || GLEW_NV_depth_buffer_float) GLEW_NV_depth_buffer_float = !_glewInit_GL_NV_depth_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_depth_buffer_float */ +#ifdef GL_NV_depth_clamp + GLEW_NV_depth_clamp = _glewSearchExtension("GL_NV_depth_clamp", extStart, extEnd); +#endif /* GL_NV_depth_clamp */ +#ifdef GL_NV_depth_range_unclamped + GLEW_NV_depth_range_unclamped = _glewSearchExtension("GL_NV_depth_range_unclamped", extStart, extEnd); +#endif /* GL_NV_depth_range_unclamped */ +#ifdef GL_NV_draw_texture + GLEW_NV_draw_texture = _glewSearchExtension("GL_NV_draw_texture", extStart, extEnd); + if (glewExperimental || GLEW_NV_draw_texture) GLEW_NV_draw_texture = !_glewInit_GL_NV_draw_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_draw_texture */ +#ifdef GL_NV_evaluators + GLEW_NV_evaluators = _glewSearchExtension("GL_NV_evaluators", extStart, extEnd); + if (glewExperimental || GLEW_NV_evaluators) GLEW_NV_evaluators = !_glewInit_GL_NV_evaluators(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_evaluators */ +#ifdef GL_NV_explicit_multisample + GLEW_NV_explicit_multisample = _glewSearchExtension("GL_NV_explicit_multisample", extStart, extEnd); + if (glewExperimental || GLEW_NV_explicit_multisample) GLEW_NV_explicit_multisample = !_glewInit_GL_NV_explicit_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_explicit_multisample */ +#ifdef GL_NV_fence + GLEW_NV_fence = _glewSearchExtension("GL_NV_fence", extStart, extEnd); + if (glewExperimental || GLEW_NV_fence) GLEW_NV_fence = !_glewInit_GL_NV_fence(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_fence */ +#ifdef GL_NV_fill_rectangle + GLEW_NV_fill_rectangle = _glewSearchExtension("GL_NV_fill_rectangle", extStart, extEnd); +#endif /* GL_NV_fill_rectangle */ +#ifdef GL_NV_float_buffer + GLEW_NV_float_buffer = _glewSearchExtension("GL_NV_float_buffer", extStart, extEnd); +#endif /* GL_NV_float_buffer */ +#ifdef GL_NV_fog_distance + GLEW_NV_fog_distance = _glewSearchExtension("GL_NV_fog_distance", extStart, extEnd); +#endif /* GL_NV_fog_distance */ +#ifdef GL_NV_fragment_coverage_to_color + GLEW_NV_fragment_coverage_to_color = _glewSearchExtension("GL_NV_fragment_coverage_to_color", extStart, extEnd); + if (glewExperimental || GLEW_NV_fragment_coverage_to_color) GLEW_NV_fragment_coverage_to_color = !_glewInit_GL_NV_fragment_coverage_to_color(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_fragment_coverage_to_color */ +#ifdef GL_NV_fragment_program + GLEW_NV_fragment_program = _glewSearchExtension("GL_NV_fragment_program", extStart, extEnd); + if (glewExperimental || GLEW_NV_fragment_program) GLEW_NV_fragment_program = !_glewInit_GL_NV_fragment_program(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_fragment_program */ +#ifdef GL_NV_fragment_program2 + GLEW_NV_fragment_program2 = _glewSearchExtension("GL_NV_fragment_program2", extStart, extEnd); +#endif /* GL_NV_fragment_program2 */ +#ifdef GL_NV_fragment_program4 + GLEW_NV_fragment_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); +#endif /* GL_NV_fragment_program4 */ +#ifdef GL_NV_fragment_program_option + GLEW_NV_fragment_program_option = _glewSearchExtension("GL_NV_fragment_program_option", extStart, extEnd); +#endif /* GL_NV_fragment_program_option */ +#ifdef GL_NV_fragment_shader_interlock + GLEW_NV_fragment_shader_interlock = _glewSearchExtension("GL_NV_fragment_shader_interlock", extStart, extEnd); +#endif /* GL_NV_fragment_shader_interlock */ +#ifdef GL_NV_framebuffer_mixed_samples + GLEW_NV_framebuffer_mixed_samples = _glewSearchExtension("GL_NV_framebuffer_mixed_samples", extStart, extEnd); +#endif /* GL_NV_framebuffer_mixed_samples */ +#ifdef GL_NV_framebuffer_multisample_coverage + GLEW_NV_framebuffer_multisample_coverage = _glewSearchExtension("GL_NV_framebuffer_multisample_coverage", extStart, extEnd); + if (glewExperimental || GLEW_NV_framebuffer_multisample_coverage) GLEW_NV_framebuffer_multisample_coverage = !_glewInit_GL_NV_framebuffer_multisample_coverage(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_framebuffer_multisample_coverage */ +#ifdef GL_NV_geometry_program4 + GLEW_NV_geometry_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); + if (glewExperimental || GLEW_NV_geometry_program4) GLEW_NV_geometry_program4 = !_glewInit_GL_NV_geometry_program4(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_geometry_program4 */ +#ifdef GL_NV_geometry_shader4 + GLEW_NV_geometry_shader4 = _glewSearchExtension("GL_NV_geometry_shader4", extStart, extEnd); +#endif /* GL_NV_geometry_shader4 */ +#ifdef GL_NV_geometry_shader_passthrough + GLEW_NV_geometry_shader_passthrough = _glewSearchExtension("GL_NV_geometry_shader_passthrough", extStart, extEnd); +#endif /* GL_NV_geometry_shader_passthrough */ +#ifdef GL_NV_gpu_program4 + GLEW_NV_gpu_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); + if (glewExperimental || GLEW_NV_gpu_program4) GLEW_NV_gpu_program4 = !_glewInit_GL_NV_gpu_program4(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_gpu_program4 */ +#ifdef GL_NV_gpu_program5 + GLEW_NV_gpu_program5 = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd); +#endif /* GL_NV_gpu_program5 */ +#ifdef GL_NV_gpu_program5_mem_extended + GLEW_NV_gpu_program5_mem_extended = _glewSearchExtension("GL_NV_gpu_program5_mem_extended", extStart, extEnd); +#endif /* GL_NV_gpu_program5_mem_extended */ +#ifdef GL_NV_gpu_program_fp64 + GLEW_NV_gpu_program_fp64 = _glewSearchExtension("GL_NV_gpu_program_fp64", extStart, extEnd); +#endif /* GL_NV_gpu_program_fp64 */ +#ifdef GL_NV_gpu_shader5 + GLEW_NV_gpu_shader5 = _glewSearchExtension("GL_NV_gpu_shader5", extStart, extEnd); + if (glewExperimental || GLEW_NV_gpu_shader5) GLEW_NV_gpu_shader5 = !_glewInit_GL_NV_gpu_shader5(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_gpu_shader5 */ +#ifdef GL_NV_half_float + GLEW_NV_half_float = _glewSearchExtension("GL_NV_half_float", extStart, extEnd); + if (glewExperimental || GLEW_NV_half_float) GLEW_NV_half_float = !_glewInit_GL_NV_half_float(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_half_float */ +#ifdef GL_NV_internalformat_sample_query + GLEW_NV_internalformat_sample_query = _glewSearchExtension("GL_NV_internalformat_sample_query", extStart, extEnd); + if (glewExperimental || GLEW_NV_internalformat_sample_query) GLEW_NV_internalformat_sample_query = !_glewInit_GL_NV_internalformat_sample_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_internalformat_sample_query */ +#ifdef GL_NV_light_max_exponent + GLEW_NV_light_max_exponent = _glewSearchExtension("GL_NV_light_max_exponent", extStart, extEnd); +#endif /* GL_NV_light_max_exponent */ +#ifdef GL_NV_multisample_coverage + GLEW_NV_multisample_coverage = _glewSearchExtension("GL_NV_multisample_coverage", extStart, extEnd); +#endif /* GL_NV_multisample_coverage */ +#ifdef GL_NV_multisample_filter_hint + GLEW_NV_multisample_filter_hint = _glewSearchExtension("GL_NV_multisample_filter_hint", extStart, extEnd); +#endif /* GL_NV_multisample_filter_hint */ +#ifdef GL_NV_occlusion_query + GLEW_NV_occlusion_query = _glewSearchExtension("GL_NV_occlusion_query", extStart, extEnd); + if (glewExperimental || GLEW_NV_occlusion_query) GLEW_NV_occlusion_query = !_glewInit_GL_NV_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_occlusion_query */ +#ifdef GL_NV_packed_depth_stencil + GLEW_NV_packed_depth_stencil = _glewSearchExtension("GL_NV_packed_depth_stencil", extStart, extEnd); +#endif /* GL_NV_packed_depth_stencil */ +#ifdef GL_NV_parameter_buffer_object + GLEW_NV_parameter_buffer_object = _glewSearchExtension("GL_NV_parameter_buffer_object", extStart, extEnd); + if (glewExperimental || GLEW_NV_parameter_buffer_object) GLEW_NV_parameter_buffer_object = !_glewInit_GL_NV_parameter_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_parameter_buffer_object */ +#ifdef GL_NV_parameter_buffer_object2 + GLEW_NV_parameter_buffer_object2 = _glewSearchExtension("GL_NV_parameter_buffer_object2", extStart, extEnd); +#endif /* GL_NV_parameter_buffer_object2 */ +#ifdef GL_NV_path_rendering + GLEW_NV_path_rendering = _glewSearchExtension("GL_NV_path_rendering", extStart, extEnd); + if (glewExperimental || GLEW_NV_path_rendering) GLEW_NV_path_rendering = !_glewInit_GL_NV_path_rendering(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_path_rendering */ +#ifdef GL_NV_path_rendering_shared_edge + GLEW_NV_path_rendering_shared_edge = _glewSearchExtension("GL_NV_path_rendering_shared_edge", extStart, extEnd); +#endif /* GL_NV_path_rendering_shared_edge */ +#ifdef GL_NV_pixel_data_range + GLEW_NV_pixel_data_range = _glewSearchExtension("GL_NV_pixel_data_range", extStart, extEnd); + if (glewExperimental || GLEW_NV_pixel_data_range) GLEW_NV_pixel_data_range = !_glewInit_GL_NV_pixel_data_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_pixel_data_range */ +#ifdef GL_NV_point_sprite + GLEW_NV_point_sprite = _glewSearchExtension("GL_NV_point_sprite", extStart, extEnd); + if (glewExperimental || GLEW_NV_point_sprite) GLEW_NV_point_sprite = !_glewInit_GL_NV_point_sprite(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_point_sprite */ +#ifdef GL_NV_present_video + GLEW_NV_present_video = _glewSearchExtension("GL_NV_present_video", extStart, extEnd); + if (glewExperimental || GLEW_NV_present_video) GLEW_NV_present_video = !_glewInit_GL_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_present_video */ +#ifdef GL_NV_primitive_restart + GLEW_NV_primitive_restart = _glewSearchExtension("GL_NV_primitive_restart", extStart, extEnd); + if (glewExperimental || GLEW_NV_primitive_restart) GLEW_NV_primitive_restart = !_glewInit_GL_NV_primitive_restart(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_primitive_restart */ +#ifdef GL_NV_register_combiners + GLEW_NV_register_combiners = _glewSearchExtension("GL_NV_register_combiners", extStart, extEnd); + if (glewExperimental || GLEW_NV_register_combiners) GLEW_NV_register_combiners = !_glewInit_GL_NV_register_combiners(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_register_combiners */ +#ifdef GL_NV_register_combiners2 + GLEW_NV_register_combiners2 = _glewSearchExtension("GL_NV_register_combiners2", extStart, extEnd); + if (glewExperimental || GLEW_NV_register_combiners2) GLEW_NV_register_combiners2 = !_glewInit_GL_NV_register_combiners2(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_register_combiners2 */ +#ifdef GL_NV_sample_locations + GLEW_NV_sample_locations = _glewSearchExtension("GL_NV_sample_locations", extStart, extEnd); + if (glewExperimental || GLEW_NV_sample_locations) GLEW_NV_sample_locations = !_glewInit_GL_NV_sample_locations(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_sample_locations */ +#ifdef GL_NV_sample_mask_override_coverage + GLEW_NV_sample_mask_override_coverage = _glewSearchExtension("GL_NV_sample_mask_override_coverage", extStart, extEnd); +#endif /* GL_NV_sample_mask_override_coverage */ +#ifdef GL_NV_shader_atomic_counters + GLEW_NV_shader_atomic_counters = _glewSearchExtension("GL_NV_shader_atomic_counters", extStart, extEnd); +#endif /* GL_NV_shader_atomic_counters */ +#ifdef GL_NV_shader_atomic_float + GLEW_NV_shader_atomic_float = _glewSearchExtension("GL_NV_shader_atomic_float", extStart, extEnd); +#endif /* GL_NV_shader_atomic_float */ +#ifdef GL_NV_shader_atomic_fp16_vector + GLEW_NV_shader_atomic_fp16_vector = _glewSearchExtension("GL_NV_shader_atomic_fp16_vector", extStart, extEnd); +#endif /* GL_NV_shader_atomic_fp16_vector */ +#ifdef GL_NV_shader_atomic_int64 + GLEW_NV_shader_atomic_int64 = _glewSearchExtension("GL_NV_shader_atomic_int64", extStart, extEnd); +#endif /* GL_NV_shader_atomic_int64 */ +#ifdef GL_NV_shader_buffer_load + GLEW_NV_shader_buffer_load = _glewSearchExtension("GL_NV_shader_buffer_load", extStart, extEnd); + if (glewExperimental || GLEW_NV_shader_buffer_load) GLEW_NV_shader_buffer_load = !_glewInit_GL_NV_shader_buffer_load(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_shader_buffer_load */ +#ifdef GL_NV_shader_storage_buffer_object + GLEW_NV_shader_storage_buffer_object = _glewSearchExtension("GL_NV_shader_storage_buffer_object", extStart, extEnd); +#endif /* GL_NV_shader_storage_buffer_object */ +#ifdef GL_NV_shader_thread_group + GLEW_NV_shader_thread_group = _glewSearchExtension("GL_NV_shader_thread_group", extStart, extEnd); +#endif /* GL_NV_shader_thread_group */ +#ifdef GL_NV_shader_thread_shuffle + GLEW_NV_shader_thread_shuffle = _glewSearchExtension("GL_NV_shader_thread_shuffle", extStart, extEnd); +#endif /* GL_NV_shader_thread_shuffle */ +#ifdef GL_NV_tessellation_program5 + GLEW_NV_tessellation_program5 = _glewSearchExtension("GL_NV_gpu_program5", extStart, extEnd); +#endif /* GL_NV_tessellation_program5 */ +#ifdef GL_NV_texgen_emboss + GLEW_NV_texgen_emboss = _glewSearchExtension("GL_NV_texgen_emboss", extStart, extEnd); +#endif /* GL_NV_texgen_emboss */ +#ifdef GL_NV_texgen_reflection + GLEW_NV_texgen_reflection = _glewSearchExtension("GL_NV_texgen_reflection", extStart, extEnd); +#endif /* GL_NV_texgen_reflection */ +#ifdef GL_NV_texture_barrier + GLEW_NV_texture_barrier = _glewSearchExtension("GL_NV_texture_barrier", extStart, extEnd); + if (glewExperimental || GLEW_NV_texture_barrier) GLEW_NV_texture_barrier = !_glewInit_GL_NV_texture_barrier(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_texture_barrier */ +#ifdef GL_NV_texture_compression_vtc + GLEW_NV_texture_compression_vtc = _glewSearchExtension("GL_NV_texture_compression_vtc", extStart, extEnd); +#endif /* GL_NV_texture_compression_vtc */ +#ifdef GL_NV_texture_env_combine4 + GLEW_NV_texture_env_combine4 = _glewSearchExtension("GL_NV_texture_env_combine4", extStart, extEnd); +#endif /* GL_NV_texture_env_combine4 */ +#ifdef GL_NV_texture_expand_normal + GLEW_NV_texture_expand_normal = _glewSearchExtension("GL_NV_texture_expand_normal", extStart, extEnd); +#endif /* GL_NV_texture_expand_normal */ +#ifdef GL_NV_texture_multisample + GLEW_NV_texture_multisample = _glewSearchExtension("GL_NV_texture_multisample", extStart, extEnd); + if (glewExperimental || GLEW_NV_texture_multisample) GLEW_NV_texture_multisample = !_glewInit_GL_NV_texture_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_texture_multisample */ +#ifdef GL_NV_texture_rectangle + GLEW_NV_texture_rectangle = _glewSearchExtension("GL_NV_texture_rectangle", extStart, extEnd); +#endif /* GL_NV_texture_rectangle */ +#ifdef GL_NV_texture_shader + GLEW_NV_texture_shader = _glewSearchExtension("GL_NV_texture_shader", extStart, extEnd); +#endif /* GL_NV_texture_shader */ +#ifdef GL_NV_texture_shader2 + GLEW_NV_texture_shader2 = _glewSearchExtension("GL_NV_texture_shader2", extStart, extEnd); +#endif /* GL_NV_texture_shader2 */ +#ifdef GL_NV_texture_shader3 + GLEW_NV_texture_shader3 = _glewSearchExtension("GL_NV_texture_shader3", extStart, extEnd); +#endif /* GL_NV_texture_shader3 */ +#ifdef GL_NV_transform_feedback + GLEW_NV_transform_feedback = _glewSearchExtension("GL_NV_transform_feedback", extStart, extEnd); + if (glewExperimental || GLEW_NV_transform_feedback) GLEW_NV_transform_feedback = !_glewInit_GL_NV_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_transform_feedback */ +#ifdef GL_NV_transform_feedback2 + GLEW_NV_transform_feedback2 = _glewSearchExtension("GL_NV_transform_feedback2", extStart, extEnd); + if (glewExperimental || GLEW_NV_transform_feedback2) GLEW_NV_transform_feedback2 = !_glewInit_GL_NV_transform_feedback2(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_transform_feedback2 */ +#ifdef GL_NV_uniform_buffer_unified_memory + GLEW_NV_uniform_buffer_unified_memory = _glewSearchExtension("GL_NV_uniform_buffer_unified_memory", extStart, extEnd); +#endif /* GL_NV_uniform_buffer_unified_memory */ +#ifdef GL_NV_vdpau_interop + GLEW_NV_vdpau_interop = _glewSearchExtension("GL_NV_vdpau_interop", extStart, extEnd); + if (glewExperimental || GLEW_NV_vdpau_interop) GLEW_NV_vdpau_interop = !_glewInit_GL_NV_vdpau_interop(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_vdpau_interop */ +#ifdef GL_NV_vertex_array_range + GLEW_NV_vertex_array_range = _glewSearchExtension("GL_NV_vertex_array_range", extStart, extEnd); + if (glewExperimental || GLEW_NV_vertex_array_range) GLEW_NV_vertex_array_range = !_glewInit_GL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_vertex_array_range */ +#ifdef GL_NV_vertex_array_range2 + GLEW_NV_vertex_array_range2 = _glewSearchExtension("GL_NV_vertex_array_range2", extStart, extEnd); +#endif /* GL_NV_vertex_array_range2 */ +#ifdef GL_NV_vertex_attrib_integer_64bit + GLEW_NV_vertex_attrib_integer_64bit = _glewSearchExtension("GL_NV_vertex_attrib_integer_64bit", extStart, extEnd); + if (glewExperimental || GLEW_NV_vertex_attrib_integer_64bit) GLEW_NV_vertex_attrib_integer_64bit = !_glewInit_GL_NV_vertex_attrib_integer_64bit(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_vertex_attrib_integer_64bit */ +#ifdef GL_NV_vertex_buffer_unified_memory + GLEW_NV_vertex_buffer_unified_memory = _glewSearchExtension("GL_NV_vertex_buffer_unified_memory", extStart, extEnd); + if (glewExperimental || GLEW_NV_vertex_buffer_unified_memory) GLEW_NV_vertex_buffer_unified_memory = !_glewInit_GL_NV_vertex_buffer_unified_memory(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_vertex_buffer_unified_memory */ +#ifdef GL_NV_vertex_program + GLEW_NV_vertex_program = _glewSearchExtension("GL_NV_vertex_program", extStart, extEnd); + if (glewExperimental || GLEW_NV_vertex_program) GLEW_NV_vertex_program = !_glewInit_GL_NV_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_vertex_program */ +#ifdef GL_NV_vertex_program1_1 + GLEW_NV_vertex_program1_1 = _glewSearchExtension("GL_NV_vertex_program1_1", extStart, extEnd); +#endif /* GL_NV_vertex_program1_1 */ +#ifdef GL_NV_vertex_program2 + GLEW_NV_vertex_program2 = _glewSearchExtension("GL_NV_vertex_program2", extStart, extEnd); +#endif /* GL_NV_vertex_program2 */ +#ifdef GL_NV_vertex_program2_option + GLEW_NV_vertex_program2_option = _glewSearchExtension("GL_NV_vertex_program2_option", extStart, extEnd); +#endif /* GL_NV_vertex_program2_option */ +#ifdef GL_NV_vertex_program3 + GLEW_NV_vertex_program3 = _glewSearchExtension("GL_NV_vertex_program3", extStart, extEnd); +#endif /* GL_NV_vertex_program3 */ +#ifdef GL_NV_vertex_program4 + GLEW_NV_vertex_program4 = _glewSearchExtension("GL_NV_gpu_program4", extStart, extEnd); +#endif /* GL_NV_vertex_program4 */ +#ifdef GL_NV_video_capture + GLEW_NV_video_capture = _glewSearchExtension("GL_NV_video_capture", extStart, extEnd); + if (glewExperimental || GLEW_NV_video_capture) GLEW_NV_video_capture = !_glewInit_GL_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_NV_video_capture */ +#ifdef GL_NV_viewport_array2 + GLEW_NV_viewport_array2 = _glewSearchExtension("GL_NV_viewport_array2", extStart, extEnd); +#endif /* GL_NV_viewport_array2 */ +#ifdef GL_OES_byte_coordinates + GLEW_OES_byte_coordinates = _glewSearchExtension("GL_OES_byte_coordinates", extStart, extEnd); +#endif /* GL_OES_byte_coordinates */ +#ifdef GL_OES_compressed_paletted_texture + GLEW_OES_compressed_paletted_texture = _glewSearchExtension("GL_OES_compressed_paletted_texture", extStart, extEnd); +#endif /* GL_OES_compressed_paletted_texture */ +#ifdef GL_OES_read_format + GLEW_OES_read_format = _glewSearchExtension("GL_OES_read_format", extStart, extEnd); +#endif /* GL_OES_read_format */ +#ifdef GL_OES_single_precision + GLEW_OES_single_precision = _glewSearchExtension("GL_OES_single_precision", extStart, extEnd); + if (glewExperimental || GLEW_OES_single_precision) GLEW_OES_single_precision = !_glewInit_GL_OES_single_precision(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_OES_single_precision */ +#ifdef GL_OML_interlace + GLEW_OML_interlace = _glewSearchExtension("GL_OML_interlace", extStart, extEnd); +#endif /* GL_OML_interlace */ +#ifdef GL_OML_resample + GLEW_OML_resample = _glewSearchExtension("GL_OML_resample", extStart, extEnd); +#endif /* GL_OML_resample */ +#ifdef GL_OML_subsample + GLEW_OML_subsample = _glewSearchExtension("GL_OML_subsample", extStart, extEnd); +#endif /* GL_OML_subsample */ +#ifdef GL_OVR_multiview + GLEW_OVR_multiview = _glewSearchExtension("GL_OVR_multiview", extStart, extEnd); + if (glewExperimental || GLEW_OVR_multiview) GLEW_OVR_multiview = !_glewInit_GL_OVR_multiview(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_OVR_multiview */ +#ifdef GL_OVR_multiview2 + GLEW_OVR_multiview2 = _glewSearchExtension("GL_OVR_multiview2", extStart, extEnd); +#endif /* GL_OVR_multiview2 */ +#ifdef GL_PGI_misc_hints + GLEW_PGI_misc_hints = _glewSearchExtension("GL_PGI_misc_hints", extStart, extEnd); +#endif /* GL_PGI_misc_hints */ +#ifdef GL_PGI_vertex_hints + GLEW_PGI_vertex_hints = _glewSearchExtension("GL_PGI_vertex_hints", extStart, extEnd); +#endif /* GL_PGI_vertex_hints */ +#ifdef GL_REGAL_ES1_0_compatibility + GLEW_REGAL_ES1_0_compatibility = _glewSearchExtension("GL_REGAL_ES1_0_compatibility", extStart, extEnd); + if (glewExperimental || GLEW_REGAL_ES1_0_compatibility) GLEW_REGAL_ES1_0_compatibility = !_glewInit_GL_REGAL_ES1_0_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_REGAL_ES1_0_compatibility */ +#ifdef GL_REGAL_ES1_1_compatibility + GLEW_REGAL_ES1_1_compatibility = _glewSearchExtension("GL_REGAL_ES1_1_compatibility", extStart, extEnd); + if (glewExperimental || GLEW_REGAL_ES1_1_compatibility) GLEW_REGAL_ES1_1_compatibility = !_glewInit_GL_REGAL_ES1_1_compatibility(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_REGAL_ES1_1_compatibility */ +#ifdef GL_REGAL_enable + GLEW_REGAL_enable = _glewSearchExtension("GL_REGAL_enable", extStart, extEnd); +#endif /* GL_REGAL_enable */ +#ifdef GL_REGAL_error_string + GLEW_REGAL_error_string = _glewSearchExtension("GL_REGAL_error_string", extStart, extEnd); + if (glewExperimental || GLEW_REGAL_error_string) GLEW_REGAL_error_string = !_glewInit_GL_REGAL_error_string(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_REGAL_error_string */ +#ifdef GL_REGAL_extension_query + GLEW_REGAL_extension_query = _glewSearchExtension("GL_REGAL_extension_query", extStart, extEnd); + if (glewExperimental || GLEW_REGAL_extension_query) GLEW_REGAL_extension_query = !_glewInit_GL_REGAL_extension_query(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_REGAL_extension_query */ +#ifdef GL_REGAL_log + GLEW_REGAL_log = _glewSearchExtension("GL_REGAL_log", extStart, extEnd); + if (glewExperimental || GLEW_REGAL_log) GLEW_REGAL_log = !_glewInit_GL_REGAL_log(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_REGAL_log */ +#ifdef GL_REGAL_proc_address + GLEW_REGAL_proc_address = _glewSearchExtension("GL_REGAL_proc_address", extStart, extEnd); + if (glewExperimental || GLEW_REGAL_proc_address) GLEW_REGAL_proc_address = !_glewInit_GL_REGAL_proc_address(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_REGAL_proc_address */ +#ifdef GL_REND_screen_coordinates + GLEW_REND_screen_coordinates = _glewSearchExtension("GL_REND_screen_coordinates", extStart, extEnd); +#endif /* GL_REND_screen_coordinates */ +#ifdef GL_S3_s3tc + GLEW_S3_s3tc = _glewSearchExtension("GL_S3_s3tc", extStart, extEnd); +#endif /* GL_S3_s3tc */ +#ifdef GL_SGIS_color_range + GLEW_SGIS_color_range = _glewSearchExtension("GL_SGIS_color_range", extStart, extEnd); +#endif /* GL_SGIS_color_range */ +#ifdef GL_SGIS_detail_texture + GLEW_SGIS_detail_texture = _glewSearchExtension("GL_SGIS_detail_texture", extStart, extEnd); + if (glewExperimental || GLEW_SGIS_detail_texture) GLEW_SGIS_detail_texture = !_glewInit_GL_SGIS_detail_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIS_detail_texture */ +#ifdef GL_SGIS_fog_function + GLEW_SGIS_fog_function = _glewSearchExtension("GL_SGIS_fog_function", extStart, extEnd); + if (glewExperimental || GLEW_SGIS_fog_function) GLEW_SGIS_fog_function = !_glewInit_GL_SGIS_fog_function(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIS_fog_function */ +#ifdef GL_SGIS_generate_mipmap + GLEW_SGIS_generate_mipmap = _glewSearchExtension("GL_SGIS_generate_mipmap", extStart, extEnd); +#endif /* GL_SGIS_generate_mipmap */ +#ifdef GL_SGIS_multisample + GLEW_SGIS_multisample = _glewSearchExtension("GL_SGIS_multisample", extStart, extEnd); + if (glewExperimental || GLEW_SGIS_multisample) GLEW_SGIS_multisample = !_glewInit_GL_SGIS_multisample(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIS_multisample */ +#ifdef GL_SGIS_pixel_texture + GLEW_SGIS_pixel_texture = _glewSearchExtension("GL_SGIS_pixel_texture", extStart, extEnd); +#endif /* GL_SGIS_pixel_texture */ +#ifdef GL_SGIS_point_line_texgen + GLEW_SGIS_point_line_texgen = _glewSearchExtension("GL_SGIS_point_line_texgen", extStart, extEnd); +#endif /* GL_SGIS_point_line_texgen */ +#ifdef GL_SGIS_sharpen_texture + GLEW_SGIS_sharpen_texture = _glewSearchExtension("GL_SGIS_sharpen_texture", extStart, extEnd); + if (glewExperimental || GLEW_SGIS_sharpen_texture) GLEW_SGIS_sharpen_texture = !_glewInit_GL_SGIS_sharpen_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIS_sharpen_texture */ +#ifdef GL_SGIS_texture4D + GLEW_SGIS_texture4D = _glewSearchExtension("GL_SGIS_texture4D", extStart, extEnd); + if (glewExperimental || GLEW_SGIS_texture4D) GLEW_SGIS_texture4D = !_glewInit_GL_SGIS_texture4D(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIS_texture4D */ +#ifdef GL_SGIS_texture_border_clamp + GLEW_SGIS_texture_border_clamp = _glewSearchExtension("GL_SGIS_texture_border_clamp", extStart, extEnd); +#endif /* GL_SGIS_texture_border_clamp */ +#ifdef GL_SGIS_texture_edge_clamp + GLEW_SGIS_texture_edge_clamp = _glewSearchExtension("GL_SGIS_texture_edge_clamp", extStart, extEnd); +#endif /* GL_SGIS_texture_edge_clamp */ +#ifdef GL_SGIS_texture_filter4 + GLEW_SGIS_texture_filter4 = _glewSearchExtension("GL_SGIS_texture_filter4", extStart, extEnd); + if (glewExperimental || GLEW_SGIS_texture_filter4) GLEW_SGIS_texture_filter4 = !_glewInit_GL_SGIS_texture_filter4(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIS_texture_filter4 */ +#ifdef GL_SGIS_texture_lod + GLEW_SGIS_texture_lod = _glewSearchExtension("GL_SGIS_texture_lod", extStart, extEnd); +#endif /* GL_SGIS_texture_lod */ +#ifdef GL_SGIS_texture_select + GLEW_SGIS_texture_select = _glewSearchExtension("GL_SGIS_texture_select", extStart, extEnd); +#endif /* GL_SGIS_texture_select */ +#ifdef GL_SGIX_async + GLEW_SGIX_async = _glewSearchExtension("GL_SGIX_async", extStart, extEnd); + if (glewExperimental || GLEW_SGIX_async) GLEW_SGIX_async = !_glewInit_GL_SGIX_async(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_async */ +#ifdef GL_SGIX_async_histogram + GLEW_SGIX_async_histogram = _glewSearchExtension("GL_SGIX_async_histogram", extStart, extEnd); +#endif /* GL_SGIX_async_histogram */ +#ifdef GL_SGIX_async_pixel + GLEW_SGIX_async_pixel = _glewSearchExtension("GL_SGIX_async_pixel", extStart, extEnd); +#endif /* GL_SGIX_async_pixel */ +#ifdef GL_SGIX_blend_alpha_minmax + GLEW_SGIX_blend_alpha_minmax = _glewSearchExtension("GL_SGIX_blend_alpha_minmax", extStart, extEnd); +#endif /* GL_SGIX_blend_alpha_minmax */ +#ifdef GL_SGIX_clipmap + GLEW_SGIX_clipmap = _glewSearchExtension("GL_SGIX_clipmap", extStart, extEnd); +#endif /* GL_SGIX_clipmap */ +#ifdef GL_SGIX_convolution_accuracy + GLEW_SGIX_convolution_accuracy = _glewSearchExtension("GL_SGIX_convolution_accuracy", extStart, extEnd); +#endif /* GL_SGIX_convolution_accuracy */ +#ifdef GL_SGIX_depth_texture + GLEW_SGIX_depth_texture = _glewSearchExtension("GL_SGIX_depth_texture", extStart, extEnd); +#endif /* GL_SGIX_depth_texture */ +#ifdef GL_SGIX_flush_raster + GLEW_SGIX_flush_raster = _glewSearchExtension("GL_SGIX_flush_raster", extStart, extEnd); + if (glewExperimental || GLEW_SGIX_flush_raster) GLEW_SGIX_flush_raster = !_glewInit_GL_SGIX_flush_raster(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_flush_raster */ +#ifdef GL_SGIX_fog_offset + GLEW_SGIX_fog_offset = _glewSearchExtension("GL_SGIX_fog_offset", extStart, extEnd); +#endif /* GL_SGIX_fog_offset */ +#ifdef GL_SGIX_fog_texture + GLEW_SGIX_fog_texture = _glewSearchExtension("GL_SGIX_fog_texture", extStart, extEnd); + if (glewExperimental || GLEW_SGIX_fog_texture) GLEW_SGIX_fog_texture = !_glewInit_GL_SGIX_fog_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_fog_texture */ +#ifdef GL_SGIX_fragment_specular_lighting + GLEW_SGIX_fragment_specular_lighting = _glewSearchExtension("GL_SGIX_fragment_specular_lighting", extStart, extEnd); + if (glewExperimental || GLEW_SGIX_fragment_specular_lighting) GLEW_SGIX_fragment_specular_lighting = !_glewInit_GL_SGIX_fragment_specular_lighting(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_fragment_specular_lighting */ +#ifdef GL_SGIX_framezoom + GLEW_SGIX_framezoom = _glewSearchExtension("GL_SGIX_framezoom", extStart, extEnd); + if (glewExperimental || GLEW_SGIX_framezoom) GLEW_SGIX_framezoom = !_glewInit_GL_SGIX_framezoom(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_framezoom */ +#ifdef GL_SGIX_interlace + GLEW_SGIX_interlace = _glewSearchExtension("GL_SGIX_interlace", extStart, extEnd); +#endif /* GL_SGIX_interlace */ +#ifdef GL_SGIX_ir_instrument1 + GLEW_SGIX_ir_instrument1 = _glewSearchExtension("GL_SGIX_ir_instrument1", extStart, extEnd); +#endif /* GL_SGIX_ir_instrument1 */ +#ifdef GL_SGIX_list_priority + GLEW_SGIX_list_priority = _glewSearchExtension("GL_SGIX_list_priority", extStart, extEnd); +#endif /* GL_SGIX_list_priority */ +#ifdef GL_SGIX_pixel_texture + GLEW_SGIX_pixel_texture = _glewSearchExtension("GL_SGIX_pixel_texture", extStart, extEnd); + if (glewExperimental || GLEW_SGIX_pixel_texture) GLEW_SGIX_pixel_texture = !_glewInit_GL_SGIX_pixel_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_pixel_texture */ +#ifdef GL_SGIX_pixel_texture_bits + GLEW_SGIX_pixel_texture_bits = _glewSearchExtension("GL_SGIX_pixel_texture_bits", extStart, extEnd); +#endif /* GL_SGIX_pixel_texture_bits */ +#ifdef GL_SGIX_reference_plane + GLEW_SGIX_reference_plane = _glewSearchExtension("GL_SGIX_reference_plane", extStart, extEnd); + if (glewExperimental || GLEW_SGIX_reference_plane) GLEW_SGIX_reference_plane = !_glewInit_GL_SGIX_reference_plane(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_reference_plane */ +#ifdef GL_SGIX_resample + GLEW_SGIX_resample = _glewSearchExtension("GL_SGIX_resample", extStart, extEnd); +#endif /* GL_SGIX_resample */ +#ifdef GL_SGIX_shadow + GLEW_SGIX_shadow = _glewSearchExtension("GL_SGIX_shadow", extStart, extEnd); +#endif /* GL_SGIX_shadow */ +#ifdef GL_SGIX_shadow_ambient + GLEW_SGIX_shadow_ambient = _glewSearchExtension("GL_SGIX_shadow_ambient", extStart, extEnd); +#endif /* GL_SGIX_shadow_ambient */ +#ifdef GL_SGIX_sprite + GLEW_SGIX_sprite = _glewSearchExtension("GL_SGIX_sprite", extStart, extEnd); + if (glewExperimental || GLEW_SGIX_sprite) GLEW_SGIX_sprite = !_glewInit_GL_SGIX_sprite(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_sprite */ +#ifdef GL_SGIX_tag_sample_buffer + GLEW_SGIX_tag_sample_buffer = _glewSearchExtension("GL_SGIX_tag_sample_buffer", extStart, extEnd); + if (glewExperimental || GLEW_SGIX_tag_sample_buffer) GLEW_SGIX_tag_sample_buffer = !_glewInit_GL_SGIX_tag_sample_buffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGIX_tag_sample_buffer */ +#ifdef GL_SGIX_texture_add_env + GLEW_SGIX_texture_add_env = _glewSearchExtension("GL_SGIX_texture_add_env", extStart, extEnd); +#endif /* GL_SGIX_texture_add_env */ +#ifdef GL_SGIX_texture_coordinate_clamp + GLEW_SGIX_texture_coordinate_clamp = _glewSearchExtension("GL_SGIX_texture_coordinate_clamp", extStart, extEnd); +#endif /* GL_SGIX_texture_coordinate_clamp */ +#ifdef GL_SGIX_texture_lod_bias + GLEW_SGIX_texture_lod_bias = _glewSearchExtension("GL_SGIX_texture_lod_bias", extStart, extEnd); +#endif /* GL_SGIX_texture_lod_bias */ +#ifdef GL_SGIX_texture_multi_buffer + GLEW_SGIX_texture_multi_buffer = _glewSearchExtension("GL_SGIX_texture_multi_buffer", extStart, extEnd); +#endif /* GL_SGIX_texture_multi_buffer */ +#ifdef GL_SGIX_texture_range + GLEW_SGIX_texture_range = _glewSearchExtension("GL_SGIX_texture_range", extStart, extEnd); +#endif /* GL_SGIX_texture_range */ +#ifdef GL_SGIX_texture_scale_bias + GLEW_SGIX_texture_scale_bias = _glewSearchExtension("GL_SGIX_texture_scale_bias", extStart, extEnd); +#endif /* GL_SGIX_texture_scale_bias */ +#ifdef GL_SGIX_vertex_preclip + GLEW_SGIX_vertex_preclip = _glewSearchExtension("GL_SGIX_vertex_preclip", extStart, extEnd); +#endif /* GL_SGIX_vertex_preclip */ +#ifdef GL_SGIX_vertex_preclip_hint + GLEW_SGIX_vertex_preclip_hint = _glewSearchExtension("GL_SGIX_vertex_preclip_hint", extStart, extEnd); +#endif /* GL_SGIX_vertex_preclip_hint */ +#ifdef GL_SGIX_ycrcb + GLEW_SGIX_ycrcb = _glewSearchExtension("GL_SGIX_ycrcb", extStart, extEnd); +#endif /* GL_SGIX_ycrcb */ +#ifdef GL_SGI_color_matrix + GLEW_SGI_color_matrix = _glewSearchExtension("GL_SGI_color_matrix", extStart, extEnd); +#endif /* GL_SGI_color_matrix */ +#ifdef GL_SGI_color_table + GLEW_SGI_color_table = _glewSearchExtension("GL_SGI_color_table", extStart, extEnd); + if (glewExperimental || GLEW_SGI_color_table) GLEW_SGI_color_table = !_glewInit_GL_SGI_color_table(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SGI_color_table */ +#ifdef GL_SGI_texture_color_table + GLEW_SGI_texture_color_table = _glewSearchExtension("GL_SGI_texture_color_table", extStart, extEnd); +#endif /* GL_SGI_texture_color_table */ +#ifdef GL_SUNX_constant_data + GLEW_SUNX_constant_data = _glewSearchExtension("GL_SUNX_constant_data", extStart, extEnd); + if (glewExperimental || GLEW_SUNX_constant_data) GLEW_SUNX_constant_data = !_glewInit_GL_SUNX_constant_data(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SUNX_constant_data */ +#ifdef GL_SUN_convolution_border_modes + GLEW_SUN_convolution_border_modes = _glewSearchExtension("GL_SUN_convolution_border_modes", extStart, extEnd); +#endif /* GL_SUN_convolution_border_modes */ +#ifdef GL_SUN_global_alpha + GLEW_SUN_global_alpha = _glewSearchExtension("GL_SUN_global_alpha", extStart, extEnd); + if (glewExperimental || GLEW_SUN_global_alpha) GLEW_SUN_global_alpha = !_glewInit_GL_SUN_global_alpha(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SUN_global_alpha */ +#ifdef GL_SUN_mesh_array + GLEW_SUN_mesh_array = _glewSearchExtension("GL_SUN_mesh_array", extStart, extEnd); +#endif /* GL_SUN_mesh_array */ +#ifdef GL_SUN_read_video_pixels + GLEW_SUN_read_video_pixels = _glewSearchExtension("GL_SUN_read_video_pixels", extStart, extEnd); + if (glewExperimental || GLEW_SUN_read_video_pixels) GLEW_SUN_read_video_pixels = !_glewInit_GL_SUN_read_video_pixels(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SUN_read_video_pixels */ +#ifdef GL_SUN_slice_accum + GLEW_SUN_slice_accum = _glewSearchExtension("GL_SUN_slice_accum", extStart, extEnd); +#endif /* GL_SUN_slice_accum */ +#ifdef GL_SUN_triangle_list + GLEW_SUN_triangle_list = _glewSearchExtension("GL_SUN_triangle_list", extStart, extEnd); + if (glewExperimental || GLEW_SUN_triangle_list) GLEW_SUN_triangle_list = !_glewInit_GL_SUN_triangle_list(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SUN_triangle_list */ +#ifdef GL_SUN_vertex + GLEW_SUN_vertex = _glewSearchExtension("GL_SUN_vertex", extStart, extEnd); + if (glewExperimental || GLEW_SUN_vertex) GLEW_SUN_vertex = !_glewInit_GL_SUN_vertex(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_SUN_vertex */ +#ifdef GL_WIN_phong_shading + GLEW_WIN_phong_shading = _glewSearchExtension("GL_WIN_phong_shading", extStart, extEnd); +#endif /* GL_WIN_phong_shading */ +#ifdef GL_WIN_specular_fog + GLEW_WIN_specular_fog = _glewSearchExtension("GL_WIN_specular_fog", extStart, extEnd); +#endif /* GL_WIN_specular_fog */ +#ifdef GL_WIN_swap_hint + GLEW_WIN_swap_hint = _glewSearchExtension("GL_WIN_swap_hint", extStart, extEnd); + if (glewExperimental || GLEW_WIN_swap_hint) GLEW_WIN_swap_hint = !_glewInit_GL_WIN_swap_hint(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GL_WIN_swap_hint */ + + return GLEW_OK; +} + + +#if defined(_WIN32) + +#if !defined(GLEW_MX) + +PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL; + +PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD = NULL; +PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD = NULL; +PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD = NULL; +PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD = NULL; +PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD = NULL; +PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD = NULL; +PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD = NULL; +PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD = NULL; +PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD = NULL; + +PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB = NULL; +PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB = NULL; +PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB = NULL; +PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB = NULL; + +PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB = NULL; + +PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB = NULL; + +PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB = NULL; +PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB = NULL; + +PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB = NULL; +PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB = NULL; +PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB = NULL; +PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB = NULL; +PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB = NULL; + +PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB = NULL; +PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB = NULL; +PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB = NULL; + +PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB = NULL; +PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB = NULL; +PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB = NULL; + +PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT = NULL; +PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT = NULL; +PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT = NULL; +PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT = NULL; + +PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT = NULL; + +PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT = NULL; +PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT = NULL; + +PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT = NULL; +PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT = NULL; +PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT = NULL; +PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT = NULL; +PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT = NULL; + +PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT = NULL; +PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT = NULL; +PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT = NULL; + +PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT = NULL; +PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT = NULL; + +PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D = NULL; +PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D = NULL; + +PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D = NULL; +PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D = NULL; +PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D = NULL; +PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D = NULL; + +PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D = NULL; +PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D = NULL; +PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D = NULL; +PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D = NULL; +PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D = NULL; +PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D = NULL; +PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D = NULL; +PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D = NULL; +PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D = NULL; +PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D = NULL; +PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D = NULL; +PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D = NULL; + +PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D = NULL; +PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D = NULL; +PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D = NULL; +PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D = NULL; + +PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D = NULL; +PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D = NULL; +PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D = NULL; +PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D = NULL; + +PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D = NULL; +PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D = NULL; +PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D = NULL; +PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D = NULL; + +PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV = NULL; +PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV = NULL; +PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV = NULL; +PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV = NULL; +PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV = NULL; +PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV = NULL; +PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV = NULL; +PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV = NULL; + +PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV = NULL; + +PFNWGLDELAYBEFORESWAPNVPROC __wglewDelayBeforeSwapNV = NULL; + +PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV = NULL; +PFNWGLDELETEDCNVPROC __wglewDeleteDCNV = NULL; +PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV = NULL; +PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV = NULL; +PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV = NULL; + +PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV = NULL; +PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV = NULL; +PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV = NULL; + +PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV = NULL; +PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV = NULL; +PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV = NULL; +PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV = NULL; +PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV = NULL; +PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV = NULL; + +PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV = NULL; +PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV = NULL; + +PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV = NULL; +PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV = NULL; +PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV = NULL; +PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV = NULL; +PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV = NULL; + +PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV = NULL; +PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV = NULL; +PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV = NULL; +PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV = NULL; +PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV = NULL; +PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV = NULL; + +PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML = NULL; +PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML = NULL; +PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML = NULL; +PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML = NULL; +PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML = NULL; +PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML = NULL; +GLboolean __WGLEW_3DFX_multisample = GL_FALSE; +GLboolean __WGLEW_3DL_stereo_control = GL_FALSE; +GLboolean __WGLEW_AMD_gpu_association = GL_FALSE; +GLboolean __WGLEW_ARB_buffer_region = GL_FALSE; +GLboolean __WGLEW_ARB_context_flush_control = GL_FALSE; +GLboolean __WGLEW_ARB_create_context = GL_FALSE; +GLboolean __WGLEW_ARB_create_context_profile = GL_FALSE; +GLboolean __WGLEW_ARB_create_context_robustness = GL_FALSE; +GLboolean __WGLEW_ARB_extensions_string = GL_FALSE; +GLboolean __WGLEW_ARB_framebuffer_sRGB = GL_FALSE; +GLboolean __WGLEW_ARB_make_current_read = GL_FALSE; +GLboolean __WGLEW_ARB_multisample = GL_FALSE; +GLboolean __WGLEW_ARB_pbuffer = GL_FALSE; +GLboolean __WGLEW_ARB_pixel_format = GL_FALSE; +GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE; +GLboolean __WGLEW_ARB_render_texture = GL_FALSE; +GLboolean __WGLEW_ARB_robustness_application_isolation = GL_FALSE; +GLboolean __WGLEW_ARB_robustness_share_group_isolation = GL_FALSE; +GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE; +GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE; +GLboolean __WGLEW_EXT_create_context_es2_profile = GL_FALSE; +GLboolean __WGLEW_EXT_create_context_es_profile = GL_FALSE; +GLboolean __WGLEW_EXT_depth_float = GL_FALSE; +GLboolean __WGLEW_EXT_display_color_table = GL_FALSE; +GLboolean __WGLEW_EXT_extensions_string = GL_FALSE; +GLboolean __WGLEW_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean __WGLEW_EXT_make_current_read = GL_FALSE; +GLboolean __WGLEW_EXT_multisample = GL_FALSE; +GLboolean __WGLEW_EXT_pbuffer = GL_FALSE; +GLboolean __WGLEW_EXT_pixel_format = GL_FALSE; +GLboolean __WGLEW_EXT_pixel_format_packed_float = GL_FALSE; +GLboolean __WGLEW_EXT_swap_control = GL_FALSE; +GLboolean __WGLEW_EXT_swap_control_tear = GL_FALSE; +GLboolean __WGLEW_I3D_digital_video_control = GL_FALSE; +GLboolean __WGLEW_I3D_gamma = GL_FALSE; +GLboolean __WGLEW_I3D_genlock = GL_FALSE; +GLboolean __WGLEW_I3D_image_buffer = GL_FALSE; +GLboolean __WGLEW_I3D_swap_frame_lock = GL_FALSE; +GLboolean __WGLEW_I3D_swap_frame_usage = GL_FALSE; +GLboolean __WGLEW_NV_DX_interop = GL_FALSE; +GLboolean __WGLEW_NV_DX_interop2 = GL_FALSE; +GLboolean __WGLEW_NV_copy_image = GL_FALSE; +GLboolean __WGLEW_NV_delay_before_swap = GL_FALSE; +GLboolean __WGLEW_NV_float_buffer = GL_FALSE; +GLboolean __WGLEW_NV_gpu_affinity = GL_FALSE; +GLboolean __WGLEW_NV_multisample_coverage = GL_FALSE; +GLboolean __WGLEW_NV_present_video = GL_FALSE; +GLboolean __WGLEW_NV_render_depth_texture = GL_FALSE; +GLboolean __WGLEW_NV_render_texture_rectangle = GL_FALSE; +GLboolean __WGLEW_NV_swap_group = GL_FALSE; +GLboolean __WGLEW_NV_vertex_array_range = GL_FALSE; +GLboolean __WGLEW_NV_video_capture = GL_FALSE; +GLboolean __WGLEW_NV_video_output = GL_FALSE; +GLboolean __WGLEW_OML_sync_control = GL_FALSE; + +#endif /* !GLEW_MX */ + +#ifdef WGL_3DL_stereo_control + +static GLboolean _glewInit_WGL_3DL_stereo_control (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglSetStereoEmitterState3DL = (PFNWGLSETSTEREOEMITTERSTATE3DLPROC)glewGetProcAddress((const GLubyte*)"wglSetStereoEmitterState3DL")) == NULL) || r; + + return r; +} + +#endif /* WGL_3DL_stereo_control */ + +#ifdef WGL_AMD_gpu_association + +static GLboolean _glewInit_WGL_AMD_gpu_association (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglBlitContextFramebufferAMD = (PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"wglBlitContextFramebufferAMD")) == NULL) || r; + r = ((wglCreateAssociatedContextAMD = (PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAMD")) == NULL) || r; + r = ((wglCreateAssociatedContextAttribsAMD = (PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAttribsAMD")) == NULL) || r; + r = ((wglDeleteAssociatedContextAMD = (PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglDeleteAssociatedContextAMD")) == NULL) || r; + r = ((wglGetContextGPUIDAMD = (PFNWGLGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetContextGPUIDAMD")) == NULL) || r; + r = ((wglGetCurrentAssociatedContextAMD = (PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentAssociatedContextAMD")) == NULL) || r; + r = ((wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUIDsAMD")) == NULL) || r; + r = ((wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUInfoAMD")) == NULL) || r; + r = ((wglMakeAssociatedContextCurrentAMD = (PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"wglMakeAssociatedContextCurrentAMD")) == NULL) || r; + + return r; +} + +#endif /* WGL_AMD_gpu_association */ + +#ifdef WGL_ARB_buffer_region + +static GLboolean _glewInit_WGL_ARB_buffer_region (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateBufferRegionARB")) == NULL) || r; + r = ((wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglDeleteBufferRegionARB")) == NULL) || r; + r = ((wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglRestoreBufferRegionARB")) == NULL) || r; + r = ((wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)glewGetProcAddress((const GLubyte*)"wglSaveBufferRegionARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_buffer_region */ + +#ifdef WGL_ARB_create_context + +static GLboolean _glewInit_WGL_ARB_create_context (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"wglCreateContextAttribsARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_create_context */ + +#ifdef WGL_ARB_extensions_string + +static GLboolean _glewInit_WGL_ARB_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_extensions_string */ + +#ifdef WGL_ARB_make_current_read + +static GLboolean _glewInit_WGL_ARB_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetCurrentReadDCARB = (PFNWGLGETCURRENTREADDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCARB")) == NULL) || r; + r = ((wglMakeContextCurrentARB = (PFNWGLMAKECONTEXTCURRENTARBPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_make_current_read */ + +#ifdef WGL_ARB_pbuffer + +static GLboolean _glewInit_WGL_ARB_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferARB")) == NULL) || r; + r = ((wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferARB")) == NULL) || r; + r = ((wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCARB")) == NULL) || r; + r = ((wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferARB")) == NULL) || r; + r = ((wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_pbuffer */ + +#ifdef WGL_ARB_pixel_format + +static GLboolean _glewInit_WGL_ARB_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatARB")) == NULL) || r; + r = ((wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvARB")) == NULL) || r; + r = ((wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_pixel_format */ + +#ifdef WGL_ARB_render_texture + +static GLboolean _glewInit_WGL_ARB_render_texture (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglBindTexImageARB")) == NULL) || r; + r = ((wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"wglReleaseTexImageARB")) == NULL) || r; + r = ((wglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC)glewGetProcAddress((const GLubyte*)"wglSetPbufferAttribARB")) == NULL) || r; + + return r; +} + +#endif /* WGL_ARB_render_texture */ + +#ifdef WGL_EXT_display_color_table + +static GLboolean _glewInit_WGL_EXT_display_color_table (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglBindDisplayColorTableEXT = (PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglBindDisplayColorTableEXT")) == NULL) || r; + r = ((wglCreateDisplayColorTableEXT = (PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglCreateDisplayColorTableEXT")) == NULL) || r; + r = ((wglDestroyDisplayColorTableEXT = (PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyDisplayColorTableEXT")) == NULL) || r; + r = ((wglLoadDisplayColorTableEXT = (PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)glewGetProcAddress((const GLubyte*)"wglLoadDisplayColorTableEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_display_color_table */ + +#ifdef WGL_EXT_extensions_string + +static GLboolean _glewInit_WGL_EXT_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_extensions_string */ + +#ifdef WGL_EXT_make_current_read + +static GLboolean _glewInit_WGL_EXT_make_current_read (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetCurrentReadDCEXT = (PFNWGLGETCURRENTREADDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentReadDCEXT")) == NULL) || r; + r = ((wglMakeContextCurrentEXT = (PFNWGLMAKECONTEXTCURRENTEXTPROC)glewGetProcAddress((const GLubyte*)"wglMakeContextCurrentEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_make_current_read */ + +#ifdef WGL_EXT_pbuffer + +static GLboolean _glewInit_WGL_EXT_pbuffer (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglCreatePbufferEXT = (PFNWGLCREATEPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglCreatePbufferEXT")) == NULL) || r; + r = ((wglDestroyPbufferEXT = (PFNWGLDESTROYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglDestroyPbufferEXT")) == NULL) || r; + r = ((wglGetPbufferDCEXT = (PFNWGLGETPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPbufferDCEXT")) == NULL) || r; + r = ((wglQueryPbufferEXT = (PFNWGLQUERYPBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"wglQueryPbufferEXT")) == NULL) || r; + r = ((wglReleasePbufferDCEXT = (PFNWGLRELEASEPBUFFERDCEXTPROC)glewGetProcAddress((const GLubyte*)"wglReleasePbufferDCEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_pbuffer */ + +#ifdef WGL_EXT_pixel_format + +static GLboolean _glewInit_WGL_EXT_pixel_format (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC)glewGetProcAddress((const GLubyte*)"wglChoosePixelFormatEXT")) == NULL) || r; + r = ((wglGetPixelFormatAttribfvEXT = (PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribfvEXT")) == NULL) || r; + r = ((wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetPixelFormatAttribivEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_pixel_format */ + +#ifdef WGL_EXT_swap_control + +static GLboolean _glewInit_WGL_EXT_swap_control (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetSwapIntervalEXT")) == NULL) || r; + r = ((wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"wglSwapIntervalEXT")) == NULL) || r; + + return r; +} + +#endif /* WGL_EXT_swap_control */ + +#ifdef WGL_I3D_digital_video_control + +static GLboolean _glewInit_WGL_I3D_digital_video_control (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetDigitalVideoParametersI3D = (PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetDigitalVideoParametersI3D")) == NULL) || r; + r = ((wglSetDigitalVideoParametersI3D = (PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetDigitalVideoParametersI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_digital_video_control */ + +#ifdef WGL_I3D_gamma + +static GLboolean _glewInit_WGL_I3D_gamma (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetGammaTableI3D = (PFNWGLGETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableI3D")) == NULL) || r; + r = ((wglGetGammaTableParametersI3D = (PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGammaTableParametersI3D")) == NULL) || r; + r = ((wglSetGammaTableI3D = (PFNWGLSETGAMMATABLEI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableI3D")) == NULL) || r; + r = ((wglSetGammaTableParametersI3D = (PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)glewGetProcAddress((const GLubyte*)"wglSetGammaTableParametersI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_gamma */ + +#ifdef WGL_I3D_genlock + +static GLboolean _glewInit_WGL_I3D_genlock (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglDisableGenlockI3D = (PFNWGLDISABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableGenlockI3D")) == NULL) || r; + r = ((wglEnableGenlockI3D = (PFNWGLENABLEGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableGenlockI3D")) == NULL) || r; + r = ((wglGenlockSampleRateI3D = (PFNWGLGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSampleRateI3D")) == NULL) || r; + r = ((wglGenlockSourceDelayI3D = (PFNWGLGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceDelayI3D")) == NULL) || r; + r = ((wglGenlockSourceEdgeI3D = (PFNWGLGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceEdgeI3D")) == NULL) || r; + r = ((wglGenlockSourceI3D = (PFNWGLGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGenlockSourceI3D")) == NULL) || r; + r = ((wglGetGenlockSampleRateI3D = (PFNWGLGETGENLOCKSAMPLERATEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSampleRateI3D")) == NULL) || r; + r = ((wglGetGenlockSourceDelayI3D = (PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceDelayI3D")) == NULL) || r; + r = ((wglGetGenlockSourceEdgeI3D = (PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceEdgeI3D")) == NULL) || r; + r = ((wglGetGenlockSourceI3D = (PFNWGLGETGENLOCKSOURCEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetGenlockSourceI3D")) == NULL) || r; + r = ((wglIsEnabledGenlockI3D = (PFNWGLISENABLEDGENLOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledGenlockI3D")) == NULL) || r; + r = ((wglQueryGenlockMaxSourceDelayI3D = (PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryGenlockMaxSourceDelayI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_genlock */ + +#ifdef WGL_I3D_image_buffer + +static GLboolean _glewInit_WGL_I3D_image_buffer (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglAssociateImageBufferEventsI3D = (PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglAssociateImageBufferEventsI3D")) == NULL) || r; + r = ((wglCreateImageBufferI3D = (PFNWGLCREATEIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglCreateImageBufferI3D")) == NULL) || r; + r = ((wglDestroyImageBufferI3D = (PFNWGLDESTROYIMAGEBUFFERI3DPROC)glewGetProcAddress((const GLubyte*)"wglDestroyImageBufferI3D")) == NULL) || r; + r = ((wglReleaseImageBufferEventsI3D = (PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)glewGetProcAddress((const GLubyte*)"wglReleaseImageBufferEventsI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_image_buffer */ + +#ifdef WGL_I3D_swap_frame_lock + +static GLboolean _glewInit_WGL_I3D_swap_frame_lock (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglDisableFrameLockI3D = (PFNWGLDISABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglDisableFrameLockI3D")) == NULL) || r; + r = ((wglEnableFrameLockI3D = (PFNWGLENABLEFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglEnableFrameLockI3D")) == NULL) || r; + r = ((wglIsEnabledFrameLockI3D = (PFNWGLISENABLEDFRAMELOCKI3DPROC)glewGetProcAddress((const GLubyte*)"wglIsEnabledFrameLockI3D")) == NULL) || r; + r = ((wglQueryFrameLockMasterI3D = (PFNWGLQUERYFRAMELOCKMASTERI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameLockMasterI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_swap_frame_lock */ + +#ifdef WGL_I3D_swap_frame_usage + +static GLboolean _glewInit_WGL_I3D_swap_frame_usage (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglBeginFrameTrackingI3D = (PFNWGLBEGINFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglBeginFrameTrackingI3D")) == NULL) || r; + r = ((wglEndFrameTrackingI3D = (PFNWGLENDFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglEndFrameTrackingI3D")) == NULL) || r; + r = ((wglGetFrameUsageI3D = (PFNWGLGETFRAMEUSAGEI3DPROC)glewGetProcAddress((const GLubyte*)"wglGetFrameUsageI3D")) == NULL) || r; + r = ((wglQueryFrameTrackingI3D = (PFNWGLQUERYFRAMETRACKINGI3DPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameTrackingI3D")) == NULL) || r; + + return r; +} + +#endif /* WGL_I3D_swap_frame_usage */ + +#ifdef WGL_NV_DX_interop + +static GLboolean _glewInit_WGL_NV_DX_interop (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglDXCloseDeviceNV = (PFNWGLDXCLOSEDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXCloseDeviceNV")) == NULL) || r; + r = ((wglDXLockObjectsNV = (PFNWGLDXLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXLockObjectsNV")) == NULL) || r; + r = ((wglDXObjectAccessNV = (PFNWGLDXOBJECTACCESSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXObjectAccessNV")) == NULL) || r; + r = ((wglDXOpenDeviceNV = (PFNWGLDXOPENDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglDXOpenDeviceNV")) == NULL) || r; + r = ((wglDXRegisterObjectNV = (PFNWGLDXREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXRegisterObjectNV")) == NULL) || r; + r = ((wglDXSetResourceShareHandleNV = (PFNWGLDXSETRESOURCESHAREHANDLENVPROC)glewGetProcAddress((const GLubyte*)"wglDXSetResourceShareHandleNV")) == NULL) || r; + r = ((wglDXUnlockObjectsNV = (PFNWGLDXUNLOCKOBJECTSNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnlockObjectsNV")) == NULL) || r; + r = ((wglDXUnregisterObjectNV = (PFNWGLDXUNREGISTEROBJECTNVPROC)glewGetProcAddress((const GLubyte*)"wglDXUnregisterObjectNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_DX_interop */ + +#ifdef WGL_NV_copy_image + +static GLboolean _glewInit_WGL_NV_copy_image (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglCopyImageSubDataNV = (PFNWGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"wglCopyImageSubDataNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_copy_image */ + +#ifdef WGL_NV_delay_before_swap + +static GLboolean _glewInit_WGL_NV_delay_before_swap (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglDelayBeforeSwapNV = (PFNWGLDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"wglDelayBeforeSwapNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_delay_before_swap */ + +#ifdef WGL_NV_gpu_affinity + +static GLboolean _glewInit_WGL_NV_gpu_affinity (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglCreateAffinityDCNV = (PFNWGLCREATEAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglCreateAffinityDCNV")) == NULL) || r; + r = ((wglDeleteDCNV = (PFNWGLDELETEDCNVPROC)glewGetProcAddress((const GLubyte*)"wglDeleteDCNV")) == NULL) || r; + r = ((wglEnumGpuDevicesNV = (PFNWGLENUMGPUDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpuDevicesNV")) == NULL) || r; + r = ((wglEnumGpusFromAffinityDCNV = (PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusFromAffinityDCNV")) == NULL) || r; + r = ((wglEnumGpusNV = (PFNWGLENUMGPUSNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumGpusNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_gpu_affinity */ + +#ifdef WGL_NV_present_video + +static GLboolean _glewInit_WGL_NV_present_video (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglBindVideoDeviceNV = (PFNWGLBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoDeviceNV")) == NULL) || r; + r = ((wglEnumerateVideoDevicesNV = (PFNWGLENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoDevicesNV")) == NULL) || r; + r = ((wglQueryCurrentContextNV = (PFNWGLQUERYCURRENTCONTEXTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryCurrentContextNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_present_video */ + +#ifdef WGL_NV_swap_group + +static GLboolean _glewInit_WGL_NV_swap_group (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglBindSwapBarrierNV = (PFNWGLBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"wglBindSwapBarrierNV")) == NULL) || r; + r = ((wglJoinSwapGroupNV = (PFNWGLJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglJoinSwapGroupNV")) == NULL) || r; + r = ((wglQueryFrameCountNV = (PFNWGLQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryFrameCountNV")) == NULL) || r; + r = ((wglQueryMaxSwapGroupsNV = (PFNWGLQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"wglQueryMaxSwapGroupsNV")) == NULL) || r; + r = ((wglQuerySwapGroupNV = (PFNWGLQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"wglQuerySwapGroupNV")) == NULL) || r; + r = ((wglResetFrameCountNV = (PFNWGLRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"wglResetFrameCountNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_swap_group */ + +#ifdef WGL_NV_vertex_array_range + +static GLboolean _glewInit_WGL_NV_vertex_array_range (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglAllocateMemoryNV = (PFNWGLALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglAllocateMemoryNV")) == NULL) || r; + r = ((wglFreeMemoryNV = (PFNWGLFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"wglFreeMemoryNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_vertex_array_range */ + +#ifdef WGL_NV_video_capture + +static GLboolean _glewInit_WGL_NV_video_capture (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglBindVideoCaptureDeviceNV = (PFNWGLBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoCaptureDeviceNV")) == NULL) || r; + r = ((wglEnumerateVideoCaptureDevicesNV = (PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"wglEnumerateVideoCaptureDevicesNV")) == NULL) || r; + r = ((wglLockVideoCaptureDeviceNV = (PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglLockVideoCaptureDeviceNV")) == NULL) || r; + r = ((wglQueryVideoCaptureDeviceNV = (PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglQueryVideoCaptureDeviceNV")) == NULL) || r; + r = ((wglReleaseVideoCaptureDeviceNV = (PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoCaptureDeviceNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_video_capture */ + +#ifdef WGL_NV_video_output + +static GLboolean _glewInit_WGL_NV_video_output (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglBindVideoImageNV = (PFNWGLBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglBindVideoImageNV")) == NULL) || r; + r = ((wglGetVideoDeviceNV = (PFNWGLGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoDeviceNV")) == NULL) || r; + r = ((wglGetVideoInfoNV = (PFNWGLGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"wglGetVideoInfoNV")) == NULL) || r; + r = ((wglReleaseVideoDeviceNV = (PFNWGLRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoDeviceNV")) == NULL) || r; + r = ((wglReleaseVideoImageNV = (PFNWGLRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"wglReleaseVideoImageNV")) == NULL) || r; + r = ((wglSendPbufferToVideoNV = (PFNWGLSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"wglSendPbufferToVideoNV")) == NULL) || r; + + return r; +} + +#endif /* WGL_NV_video_output */ + +#ifdef WGL_OML_sync_control + +static GLboolean _glewInit_WGL_OML_sync_control (WGLEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((wglGetMscRateOML = (PFNWGLGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetMscRateOML")) == NULL) || r; + r = ((wglGetSyncValuesOML = (PFNWGLGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"wglGetSyncValuesOML")) == NULL) || r; + r = ((wglSwapBuffersMscOML = (PFNWGLSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapBuffersMscOML")) == NULL) || r; + r = ((wglSwapLayerBuffersMscOML = (PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglSwapLayerBuffersMscOML")) == NULL) || r; + r = ((wglWaitForMscOML = (PFNWGLWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForMscOML")) == NULL) || r; + r = ((wglWaitForSbcOML = (PFNWGLWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"wglWaitForSbcOML")) == NULL) || r; + + return r; +} + +#endif /* WGL_OML_sync_control */ + +/* ------------------------------------------------------------------------- */ + +static PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL; +static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL; + +GLboolean GLEWAPIENTRY wglewGetExtension (const char* name) +{ + const GLubyte* start; + const GLubyte* end; + if (_wglewGetExtensionsStringARB == NULL) + if (_wglewGetExtensionsStringEXT == NULL) + return GL_FALSE; + else + start = (const GLubyte*)_wglewGetExtensionsStringEXT(); + else + start = (const GLubyte*)_wglewGetExtensionsStringARB(wglGetCurrentDC()); + if (start == 0) + return GL_FALSE; + end = start + _glewStrLen(start); + return _glewSearchExtension(name, start, end); +} + +#ifdef GLEW_MX +GLenum GLEWAPIENTRY wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST) +#else +GLenum GLEWAPIENTRY wglewInit (WGLEW_CONTEXT_ARG_DEF_LIST) +#endif +{ + GLboolean crippled; + const GLubyte* extStart; + const GLubyte* extEnd; + /* find wgl extension string query functions */ + _wglewGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringARB"); + _wglewGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)glewGetProcAddress((const GLubyte*)"wglGetExtensionsStringEXT"); + /* query wgl extension string */ + if (_wglewGetExtensionsStringARB == NULL) + if (_wglewGetExtensionsStringEXT == NULL) + extStart = (const GLubyte*)""; + else + extStart = (const GLubyte*)_wglewGetExtensionsStringEXT(); + else { + HDC dc = wglGetCurrentDC(); + extStart = (const GLubyte*)_wglewGetExtensionsStringARB(dc); + } + extEnd = extStart + _glewStrLen(extStart); + /* initialize extensions */ + crippled = _wglewGetExtensionsStringARB == NULL && _wglewGetExtensionsStringEXT == NULL; +#ifdef WGL_3DFX_multisample + WGLEW_3DFX_multisample = _glewSearchExtension("WGL_3DFX_multisample", extStart, extEnd); +#endif /* WGL_3DFX_multisample */ +#ifdef WGL_3DL_stereo_control + WGLEW_3DL_stereo_control = _glewSearchExtension("WGL_3DL_stereo_control", extStart, extEnd); + if (glewExperimental || WGLEW_3DL_stereo_control|| crippled) WGLEW_3DL_stereo_control= !_glewInit_WGL_3DL_stereo_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_3DL_stereo_control */ +#ifdef WGL_AMD_gpu_association + WGLEW_AMD_gpu_association = _glewSearchExtension("WGL_AMD_gpu_association", extStart, extEnd); + if (glewExperimental || WGLEW_AMD_gpu_association|| crippled) WGLEW_AMD_gpu_association= !_glewInit_WGL_AMD_gpu_association(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_AMD_gpu_association */ +#ifdef WGL_ARB_buffer_region + WGLEW_ARB_buffer_region = _glewSearchExtension("WGL_ARB_buffer_region", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_buffer_region|| crippled) WGLEW_ARB_buffer_region= !_glewInit_WGL_ARB_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_ARB_buffer_region */ +#ifdef WGL_ARB_context_flush_control + WGLEW_ARB_context_flush_control = _glewSearchExtension("WGL_ARB_context_flush_control", extStart, extEnd); +#endif /* WGL_ARB_context_flush_control */ +#ifdef WGL_ARB_create_context + WGLEW_ARB_create_context = _glewSearchExtension("WGL_ARB_create_context", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_create_context|| crippled) WGLEW_ARB_create_context= !_glewInit_WGL_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_ARB_create_context */ +#ifdef WGL_ARB_create_context_profile + WGLEW_ARB_create_context_profile = _glewSearchExtension("WGL_ARB_create_context_profile", extStart, extEnd); +#endif /* WGL_ARB_create_context_profile */ +#ifdef WGL_ARB_create_context_robustness + WGLEW_ARB_create_context_robustness = _glewSearchExtension("WGL_ARB_create_context_robustness", extStart, extEnd); +#endif /* WGL_ARB_create_context_robustness */ +#ifdef WGL_ARB_extensions_string + WGLEW_ARB_extensions_string = _glewSearchExtension("WGL_ARB_extensions_string", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_extensions_string|| crippled) WGLEW_ARB_extensions_string= !_glewInit_WGL_ARB_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_ARB_extensions_string */ +#ifdef WGL_ARB_framebuffer_sRGB + WGLEW_ARB_framebuffer_sRGB = _glewSearchExtension("WGL_ARB_framebuffer_sRGB", extStart, extEnd); +#endif /* WGL_ARB_framebuffer_sRGB */ +#ifdef WGL_ARB_make_current_read + WGLEW_ARB_make_current_read = _glewSearchExtension("WGL_ARB_make_current_read", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_make_current_read|| crippled) WGLEW_ARB_make_current_read= !_glewInit_WGL_ARB_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_ARB_make_current_read */ +#ifdef WGL_ARB_multisample + WGLEW_ARB_multisample = _glewSearchExtension("WGL_ARB_multisample", extStart, extEnd); +#endif /* WGL_ARB_multisample */ +#ifdef WGL_ARB_pbuffer + WGLEW_ARB_pbuffer = _glewSearchExtension("WGL_ARB_pbuffer", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_pbuffer|| crippled) WGLEW_ARB_pbuffer= !_glewInit_WGL_ARB_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_ARB_pbuffer */ +#ifdef WGL_ARB_pixel_format + WGLEW_ARB_pixel_format = _glewSearchExtension("WGL_ARB_pixel_format", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_pixel_format|| crippled) WGLEW_ARB_pixel_format= !_glewInit_WGL_ARB_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_ARB_pixel_format */ +#ifdef WGL_ARB_pixel_format_float + WGLEW_ARB_pixel_format_float = _glewSearchExtension("WGL_ARB_pixel_format_float", extStart, extEnd); +#endif /* WGL_ARB_pixel_format_float */ +#ifdef WGL_ARB_render_texture + WGLEW_ARB_render_texture = _glewSearchExtension("WGL_ARB_render_texture", extStart, extEnd); + if (glewExperimental || WGLEW_ARB_render_texture|| crippled) WGLEW_ARB_render_texture= !_glewInit_WGL_ARB_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_ARB_render_texture */ +#ifdef WGL_ARB_robustness_application_isolation + WGLEW_ARB_robustness_application_isolation = _glewSearchExtension("WGL_ARB_robustness_application_isolation", extStart, extEnd); +#endif /* WGL_ARB_robustness_application_isolation */ +#ifdef WGL_ARB_robustness_share_group_isolation + WGLEW_ARB_robustness_share_group_isolation = _glewSearchExtension("WGL_ARB_robustness_share_group_isolation", extStart, extEnd); +#endif /* WGL_ARB_robustness_share_group_isolation */ +#ifdef WGL_ATI_pixel_format_float + WGLEW_ATI_pixel_format_float = _glewSearchExtension("WGL_ATI_pixel_format_float", extStart, extEnd); +#endif /* WGL_ATI_pixel_format_float */ +#ifdef WGL_ATI_render_texture_rectangle + WGLEW_ATI_render_texture_rectangle = _glewSearchExtension("WGL_ATI_render_texture_rectangle", extStart, extEnd); +#endif /* WGL_ATI_render_texture_rectangle */ +#ifdef WGL_EXT_create_context_es2_profile + WGLEW_EXT_create_context_es2_profile = _glewSearchExtension("WGL_EXT_create_context_es2_profile", extStart, extEnd); +#endif /* WGL_EXT_create_context_es2_profile */ +#ifdef WGL_EXT_create_context_es_profile + WGLEW_EXT_create_context_es_profile = _glewSearchExtension("WGL_EXT_create_context_es_profile", extStart, extEnd); +#endif /* WGL_EXT_create_context_es_profile */ +#ifdef WGL_EXT_depth_float + WGLEW_EXT_depth_float = _glewSearchExtension("WGL_EXT_depth_float", extStart, extEnd); +#endif /* WGL_EXT_depth_float */ +#ifdef WGL_EXT_display_color_table + WGLEW_EXT_display_color_table = _glewSearchExtension("WGL_EXT_display_color_table", extStart, extEnd); + if (glewExperimental || WGLEW_EXT_display_color_table|| crippled) WGLEW_EXT_display_color_table= !_glewInit_WGL_EXT_display_color_table(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_EXT_display_color_table */ +#ifdef WGL_EXT_extensions_string + WGLEW_EXT_extensions_string = _glewSearchExtension("WGL_EXT_extensions_string", extStart, extEnd); + if (glewExperimental || WGLEW_EXT_extensions_string|| crippled) WGLEW_EXT_extensions_string= !_glewInit_WGL_EXT_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_EXT_extensions_string */ +#ifdef WGL_EXT_framebuffer_sRGB + WGLEW_EXT_framebuffer_sRGB = _glewSearchExtension("WGL_EXT_framebuffer_sRGB", extStart, extEnd); +#endif /* WGL_EXT_framebuffer_sRGB */ +#ifdef WGL_EXT_make_current_read + WGLEW_EXT_make_current_read = _glewSearchExtension("WGL_EXT_make_current_read", extStart, extEnd); + if (glewExperimental || WGLEW_EXT_make_current_read|| crippled) WGLEW_EXT_make_current_read= !_glewInit_WGL_EXT_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_EXT_make_current_read */ +#ifdef WGL_EXT_multisample + WGLEW_EXT_multisample = _glewSearchExtension("WGL_EXT_multisample", extStart, extEnd); +#endif /* WGL_EXT_multisample */ +#ifdef WGL_EXT_pbuffer + WGLEW_EXT_pbuffer = _glewSearchExtension("WGL_EXT_pbuffer", extStart, extEnd); + if (glewExperimental || WGLEW_EXT_pbuffer|| crippled) WGLEW_EXT_pbuffer= !_glewInit_WGL_EXT_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_EXT_pbuffer */ +#ifdef WGL_EXT_pixel_format + WGLEW_EXT_pixel_format = _glewSearchExtension("WGL_EXT_pixel_format", extStart, extEnd); + if (glewExperimental || WGLEW_EXT_pixel_format|| crippled) WGLEW_EXT_pixel_format= !_glewInit_WGL_EXT_pixel_format(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_EXT_pixel_format */ +#ifdef WGL_EXT_pixel_format_packed_float + WGLEW_EXT_pixel_format_packed_float = _glewSearchExtension("WGL_EXT_pixel_format_packed_float", extStart, extEnd); +#endif /* WGL_EXT_pixel_format_packed_float */ +#ifdef WGL_EXT_swap_control + WGLEW_EXT_swap_control = _glewSearchExtension("WGL_EXT_swap_control", extStart, extEnd); + if (glewExperimental || WGLEW_EXT_swap_control|| crippled) WGLEW_EXT_swap_control= !_glewInit_WGL_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_EXT_swap_control */ +#ifdef WGL_EXT_swap_control_tear + WGLEW_EXT_swap_control_tear = _glewSearchExtension("WGL_EXT_swap_control_tear", extStart, extEnd); +#endif /* WGL_EXT_swap_control_tear */ +#ifdef WGL_I3D_digital_video_control + WGLEW_I3D_digital_video_control = _glewSearchExtension("WGL_I3D_digital_video_control", extStart, extEnd); + if (glewExperimental || WGLEW_I3D_digital_video_control|| crippled) WGLEW_I3D_digital_video_control= !_glewInit_WGL_I3D_digital_video_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_I3D_digital_video_control */ +#ifdef WGL_I3D_gamma + WGLEW_I3D_gamma = _glewSearchExtension("WGL_I3D_gamma", extStart, extEnd); + if (glewExperimental || WGLEW_I3D_gamma|| crippled) WGLEW_I3D_gamma= !_glewInit_WGL_I3D_gamma(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_I3D_gamma */ +#ifdef WGL_I3D_genlock + WGLEW_I3D_genlock = _glewSearchExtension("WGL_I3D_genlock", extStart, extEnd); + if (glewExperimental || WGLEW_I3D_genlock|| crippled) WGLEW_I3D_genlock= !_glewInit_WGL_I3D_genlock(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_I3D_genlock */ +#ifdef WGL_I3D_image_buffer + WGLEW_I3D_image_buffer = _glewSearchExtension("WGL_I3D_image_buffer", extStart, extEnd); + if (glewExperimental || WGLEW_I3D_image_buffer|| crippled) WGLEW_I3D_image_buffer= !_glewInit_WGL_I3D_image_buffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_I3D_image_buffer */ +#ifdef WGL_I3D_swap_frame_lock + WGLEW_I3D_swap_frame_lock = _glewSearchExtension("WGL_I3D_swap_frame_lock", extStart, extEnd); + if (glewExperimental || WGLEW_I3D_swap_frame_lock|| crippled) WGLEW_I3D_swap_frame_lock= !_glewInit_WGL_I3D_swap_frame_lock(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_I3D_swap_frame_lock */ +#ifdef WGL_I3D_swap_frame_usage + WGLEW_I3D_swap_frame_usage = _glewSearchExtension("WGL_I3D_swap_frame_usage", extStart, extEnd); + if (glewExperimental || WGLEW_I3D_swap_frame_usage|| crippled) WGLEW_I3D_swap_frame_usage= !_glewInit_WGL_I3D_swap_frame_usage(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_I3D_swap_frame_usage */ +#ifdef WGL_NV_DX_interop + WGLEW_NV_DX_interop = _glewSearchExtension("WGL_NV_DX_interop", extStart, extEnd); + if (glewExperimental || WGLEW_NV_DX_interop|| crippled) WGLEW_NV_DX_interop= !_glewInit_WGL_NV_DX_interop(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_NV_DX_interop */ +#ifdef WGL_NV_DX_interop2 + WGLEW_NV_DX_interop2 = _glewSearchExtension("WGL_NV_DX_interop2", extStart, extEnd); +#endif /* WGL_NV_DX_interop2 */ +#ifdef WGL_NV_copy_image + WGLEW_NV_copy_image = _glewSearchExtension("WGL_NV_copy_image", extStart, extEnd); + if (glewExperimental || WGLEW_NV_copy_image|| crippled) WGLEW_NV_copy_image= !_glewInit_WGL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_NV_copy_image */ +#ifdef WGL_NV_delay_before_swap + WGLEW_NV_delay_before_swap = _glewSearchExtension("WGL_NV_delay_before_swap", extStart, extEnd); + if (glewExperimental || WGLEW_NV_delay_before_swap|| crippled) WGLEW_NV_delay_before_swap= !_glewInit_WGL_NV_delay_before_swap(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_NV_delay_before_swap */ +#ifdef WGL_NV_float_buffer + WGLEW_NV_float_buffer = _glewSearchExtension("WGL_NV_float_buffer", extStart, extEnd); +#endif /* WGL_NV_float_buffer */ +#ifdef WGL_NV_gpu_affinity + WGLEW_NV_gpu_affinity = _glewSearchExtension("WGL_NV_gpu_affinity", extStart, extEnd); + if (glewExperimental || WGLEW_NV_gpu_affinity|| crippled) WGLEW_NV_gpu_affinity= !_glewInit_WGL_NV_gpu_affinity(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_NV_gpu_affinity */ +#ifdef WGL_NV_multisample_coverage + WGLEW_NV_multisample_coverage = _glewSearchExtension("WGL_NV_multisample_coverage", extStart, extEnd); +#endif /* WGL_NV_multisample_coverage */ +#ifdef WGL_NV_present_video + WGLEW_NV_present_video = _glewSearchExtension("WGL_NV_present_video", extStart, extEnd); + if (glewExperimental || WGLEW_NV_present_video|| crippled) WGLEW_NV_present_video= !_glewInit_WGL_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_NV_present_video */ +#ifdef WGL_NV_render_depth_texture + WGLEW_NV_render_depth_texture = _glewSearchExtension("WGL_NV_render_depth_texture", extStart, extEnd); +#endif /* WGL_NV_render_depth_texture */ +#ifdef WGL_NV_render_texture_rectangle + WGLEW_NV_render_texture_rectangle = _glewSearchExtension("WGL_NV_render_texture_rectangle", extStart, extEnd); +#endif /* WGL_NV_render_texture_rectangle */ +#ifdef WGL_NV_swap_group + WGLEW_NV_swap_group = _glewSearchExtension("WGL_NV_swap_group", extStart, extEnd); + if (glewExperimental || WGLEW_NV_swap_group|| crippled) WGLEW_NV_swap_group= !_glewInit_WGL_NV_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_NV_swap_group */ +#ifdef WGL_NV_vertex_array_range + WGLEW_NV_vertex_array_range = _glewSearchExtension("WGL_NV_vertex_array_range", extStart, extEnd); + if (glewExperimental || WGLEW_NV_vertex_array_range|| crippled) WGLEW_NV_vertex_array_range= !_glewInit_WGL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_NV_vertex_array_range */ +#ifdef WGL_NV_video_capture + WGLEW_NV_video_capture = _glewSearchExtension("WGL_NV_video_capture", extStart, extEnd); + if (glewExperimental || WGLEW_NV_video_capture|| crippled) WGLEW_NV_video_capture= !_glewInit_WGL_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_NV_video_capture */ +#ifdef WGL_NV_video_output + WGLEW_NV_video_output = _glewSearchExtension("WGL_NV_video_output", extStart, extEnd); + if (glewExperimental || WGLEW_NV_video_output|| crippled) WGLEW_NV_video_output= !_glewInit_WGL_NV_video_output(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_NV_video_output */ +#ifdef WGL_OML_sync_control + WGLEW_OML_sync_control = _glewSearchExtension("WGL_OML_sync_control", extStart, extEnd); + if (glewExperimental || WGLEW_OML_sync_control|| crippled) WGLEW_OML_sync_control= !_glewInit_WGL_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* WGL_OML_sync_control */ + + return GLEW_OK; +} + +#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) + +PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL; + +PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig = NULL; +PFNGLXCREATENEWCONTEXTPROC __glewXCreateNewContext = NULL; +PFNGLXCREATEPBUFFERPROC __glewXCreatePbuffer = NULL; +PFNGLXCREATEPIXMAPPROC __glewXCreatePixmap = NULL; +PFNGLXCREATEWINDOWPROC __glewXCreateWindow = NULL; +PFNGLXDESTROYPBUFFERPROC __glewXDestroyPbuffer = NULL; +PFNGLXDESTROYPIXMAPPROC __glewXDestroyPixmap = NULL; +PFNGLXDESTROYWINDOWPROC __glewXDestroyWindow = NULL; +PFNGLXGETCURRENTREADDRAWABLEPROC __glewXGetCurrentReadDrawable = NULL; +PFNGLXGETFBCONFIGATTRIBPROC __glewXGetFBConfigAttrib = NULL; +PFNGLXGETFBCONFIGSPROC __glewXGetFBConfigs = NULL; +PFNGLXGETSELECTEDEVENTPROC __glewXGetSelectedEvent = NULL; +PFNGLXGETVISUALFROMFBCONFIGPROC __glewXGetVisualFromFBConfig = NULL; +PFNGLXMAKECONTEXTCURRENTPROC __glewXMakeContextCurrent = NULL; +PFNGLXQUERYCONTEXTPROC __glewXQueryContext = NULL; +PFNGLXQUERYDRAWABLEPROC __glewXQueryDrawable = NULL; +PFNGLXSELECTEVENTPROC __glewXSelectEvent = NULL; + +PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC __glewXBlitContextFramebufferAMD = NULL; +PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC __glewXCreateAssociatedContextAMD = NULL; +PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __glewXCreateAssociatedContextAttribsAMD = NULL; +PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC __glewXDeleteAssociatedContextAMD = NULL; +PFNGLXGETCONTEXTGPUIDAMDPROC __glewXGetContextGPUIDAMD = NULL; +PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC __glewXGetCurrentAssociatedContextAMD = NULL; +PFNGLXGETGPUIDSAMDPROC __glewXGetGPUIDsAMD = NULL; +PFNGLXGETGPUINFOAMDPROC __glewXGetGPUInfoAMD = NULL; +PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __glewXMakeAssociatedContextCurrentAMD = NULL; + +PFNGLXCREATECONTEXTATTRIBSARBPROC __glewXCreateContextAttribsARB = NULL; + +PFNGLXBINDTEXIMAGEATIPROC __glewXBindTexImageATI = NULL; +PFNGLXDRAWABLEATTRIBATIPROC __glewXDrawableAttribATI = NULL; +PFNGLXRELEASETEXIMAGEATIPROC __glewXReleaseTexImageATI = NULL; + +PFNGLXFREECONTEXTEXTPROC __glewXFreeContextEXT = NULL; +PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT = NULL; +PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT = NULL; +PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT = NULL; + +PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT = NULL; + +PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT = NULL; +PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT = NULL; + +PFNGLXGETAGPOFFSETMESAPROC __glewXGetAGPOffsetMESA = NULL; + +PFNGLXCOPYSUBBUFFERMESAPROC __glewXCopySubBufferMESA = NULL; + +PFNGLXCREATEGLXPIXMAPMESAPROC __glewXCreateGLXPixmapMESA = NULL; + +PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC __glewXQueryCurrentRendererIntegerMESA = NULL; +PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC __glewXQueryCurrentRendererStringMESA = NULL; +PFNGLXQUERYRENDERERINTEGERMESAPROC __glewXQueryRendererIntegerMESA = NULL; +PFNGLXQUERYRENDERERSTRINGMESAPROC __glewXQueryRendererStringMESA = NULL; + +PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA = NULL; + +PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA = NULL; + +PFNGLXGETSWAPINTERVALMESAPROC __glewXGetSwapIntervalMESA = NULL; +PFNGLXSWAPINTERVALMESAPROC __glewXSwapIntervalMESA = NULL; + +PFNGLXCOPYBUFFERSUBDATANVPROC __glewXCopyBufferSubDataNV = NULL; +PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC __glewXNamedCopyBufferSubDataNV = NULL; + +PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV = NULL; + +PFNGLXDELAYBEFORESWAPNVPROC __glewXDelayBeforeSwapNV = NULL; + +PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV = NULL; +PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV = NULL; + +PFNGLXBINDSWAPBARRIERNVPROC __glewXBindSwapBarrierNV = NULL; +PFNGLXJOINSWAPGROUPNVPROC __glewXJoinSwapGroupNV = NULL; +PFNGLXQUERYFRAMECOUNTNVPROC __glewXQueryFrameCountNV = NULL; +PFNGLXQUERYMAXSWAPGROUPSNVPROC __glewXQueryMaxSwapGroupsNV = NULL; +PFNGLXQUERYSWAPGROUPNVPROC __glewXQuerySwapGroupNV = NULL; +PFNGLXRESETFRAMECOUNTNVPROC __glewXResetFrameCountNV = NULL; + +PFNGLXALLOCATEMEMORYNVPROC __glewXAllocateMemoryNV = NULL; +PFNGLXFREEMEMORYNVPROC __glewXFreeMemoryNV = NULL; + +PFNGLXBINDVIDEOCAPTUREDEVICENVPROC __glewXBindVideoCaptureDeviceNV = NULL; +PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC __glewXEnumerateVideoCaptureDevicesNV = NULL; +PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC __glewXLockVideoCaptureDeviceNV = NULL; +PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC __glewXQueryVideoCaptureDeviceNV = NULL; +PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC __glewXReleaseVideoCaptureDeviceNV = NULL; + +PFNGLXBINDVIDEOIMAGENVPROC __glewXBindVideoImageNV = NULL; +PFNGLXGETVIDEODEVICENVPROC __glewXGetVideoDeviceNV = NULL; +PFNGLXGETVIDEOINFONVPROC __glewXGetVideoInfoNV = NULL; +PFNGLXRELEASEVIDEODEVICENVPROC __glewXReleaseVideoDeviceNV = NULL; +PFNGLXRELEASEVIDEOIMAGENVPROC __glewXReleaseVideoImageNV = NULL; +PFNGLXSENDPBUFFERTOVIDEONVPROC __glewXSendPbufferToVideoNV = NULL; + +PFNGLXGETMSCRATEOMLPROC __glewXGetMscRateOML = NULL; +PFNGLXGETSYNCVALUESOMLPROC __glewXGetSyncValuesOML = NULL; +PFNGLXSWAPBUFFERSMSCOMLPROC __glewXSwapBuffersMscOML = NULL; +PFNGLXWAITFORMSCOMLPROC __glewXWaitForMscOML = NULL; +PFNGLXWAITFORSBCOMLPROC __glewXWaitForSbcOML = NULL; + +PFNGLXCHOOSEFBCONFIGSGIXPROC __glewXChooseFBConfigSGIX = NULL; +PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC __glewXCreateContextWithConfigSGIX = NULL; +PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC __glewXCreateGLXPixmapWithConfigSGIX = NULL; +PFNGLXGETFBCONFIGATTRIBSGIXPROC __glewXGetFBConfigAttribSGIX = NULL; +PFNGLXGETFBCONFIGFROMVISUALSGIXPROC __glewXGetFBConfigFromVisualSGIX = NULL; +PFNGLXGETVISUALFROMFBCONFIGSGIXPROC __glewXGetVisualFromFBConfigSGIX = NULL; + +PFNGLXBINDHYPERPIPESGIXPROC __glewXBindHyperpipeSGIX = NULL; +PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC __glewXDestroyHyperpipeConfigSGIX = NULL; +PFNGLXHYPERPIPEATTRIBSGIXPROC __glewXHyperpipeAttribSGIX = NULL; +PFNGLXHYPERPIPECONFIGSGIXPROC __glewXHyperpipeConfigSGIX = NULL; +PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC __glewXQueryHyperpipeAttribSGIX = NULL; +PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC __glewXQueryHyperpipeBestAttribSGIX = NULL; +PFNGLXQUERYHYPERPIPECONFIGSGIXPROC __glewXQueryHyperpipeConfigSGIX = NULL; +PFNGLXQUERYHYPERPIPENETWORKSGIXPROC __glewXQueryHyperpipeNetworkSGIX = NULL; + +PFNGLXCREATEGLXPBUFFERSGIXPROC __glewXCreateGLXPbufferSGIX = NULL; +PFNGLXDESTROYGLXPBUFFERSGIXPROC __glewXDestroyGLXPbufferSGIX = NULL; +PFNGLXGETSELECTEDEVENTSGIXPROC __glewXGetSelectedEventSGIX = NULL; +PFNGLXQUERYGLXPBUFFERSGIXPROC __glewXQueryGLXPbufferSGIX = NULL; +PFNGLXSELECTEVENTSGIXPROC __glewXSelectEventSGIX = NULL; + +PFNGLXBINDSWAPBARRIERSGIXPROC __glewXBindSwapBarrierSGIX = NULL; +PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC __glewXQueryMaxSwapBarriersSGIX = NULL; + +PFNGLXJOINSWAPGROUPSGIXPROC __glewXJoinSwapGroupSGIX = NULL; + +PFNGLXBINDCHANNELTOWINDOWSGIXPROC __glewXBindChannelToWindowSGIX = NULL; +PFNGLXCHANNELRECTSGIXPROC __glewXChannelRectSGIX = NULL; +PFNGLXCHANNELRECTSYNCSGIXPROC __glewXChannelRectSyncSGIX = NULL; +PFNGLXQUERYCHANNELDELTASSGIXPROC __glewXQueryChannelDeltasSGIX = NULL; +PFNGLXQUERYCHANNELRECTSGIXPROC __glewXQueryChannelRectSGIX = NULL; + +PFNGLXCUSHIONSGIPROC __glewXCushionSGI = NULL; + +PFNGLXGETCURRENTREADDRAWABLESGIPROC __glewXGetCurrentReadDrawableSGI = NULL; +PFNGLXMAKECURRENTREADSGIPROC __glewXMakeCurrentReadSGI = NULL; + +PFNGLXSWAPINTERVALSGIPROC __glewXSwapIntervalSGI = NULL; + +PFNGLXGETVIDEOSYNCSGIPROC __glewXGetVideoSyncSGI = NULL; +PFNGLXWAITVIDEOSYNCSGIPROC __glewXWaitVideoSyncSGI = NULL; + +PFNGLXGETTRANSPARENTINDEXSUNPROC __glewXGetTransparentIndexSUN = NULL; + +PFNGLXGETVIDEORESIZESUNPROC __glewXGetVideoResizeSUN = NULL; +PFNGLXVIDEORESIZESUNPROC __glewXVideoResizeSUN = NULL; + +#if !defined(GLEW_MX) + +GLboolean __GLXEW_VERSION_1_0 = GL_FALSE; +GLboolean __GLXEW_VERSION_1_1 = GL_FALSE; +GLboolean __GLXEW_VERSION_1_2 = GL_FALSE; +GLboolean __GLXEW_VERSION_1_3 = GL_FALSE; +GLboolean __GLXEW_VERSION_1_4 = GL_FALSE; +GLboolean __GLXEW_3DFX_multisample = GL_FALSE; +GLboolean __GLXEW_AMD_gpu_association = GL_FALSE; +GLboolean __GLXEW_ARB_context_flush_control = GL_FALSE; +GLboolean __GLXEW_ARB_create_context = GL_FALSE; +GLboolean __GLXEW_ARB_create_context_profile = GL_FALSE; +GLboolean __GLXEW_ARB_create_context_robustness = GL_FALSE; +GLboolean __GLXEW_ARB_fbconfig_float = GL_FALSE; +GLboolean __GLXEW_ARB_framebuffer_sRGB = GL_FALSE; +GLboolean __GLXEW_ARB_get_proc_address = GL_FALSE; +GLboolean __GLXEW_ARB_multisample = GL_FALSE; +GLboolean __GLXEW_ARB_robustness_application_isolation = GL_FALSE; +GLboolean __GLXEW_ARB_robustness_share_group_isolation = GL_FALSE; +GLboolean __GLXEW_ARB_vertex_buffer_object = GL_FALSE; +GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE; +GLboolean __GLXEW_ATI_render_texture = GL_FALSE; +GLboolean __GLXEW_EXT_buffer_age = GL_FALSE; +GLboolean __GLXEW_EXT_create_context_es2_profile = GL_FALSE; +GLboolean __GLXEW_EXT_create_context_es_profile = GL_FALSE; +GLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE; +GLboolean __GLXEW_EXT_framebuffer_sRGB = GL_FALSE; +GLboolean __GLXEW_EXT_import_context = GL_FALSE; +GLboolean __GLXEW_EXT_scene_marker = GL_FALSE; +GLboolean __GLXEW_EXT_stereo_tree = GL_FALSE; +GLboolean __GLXEW_EXT_swap_control = GL_FALSE; +GLboolean __GLXEW_EXT_swap_control_tear = GL_FALSE; +GLboolean __GLXEW_EXT_texture_from_pixmap = GL_FALSE; +GLboolean __GLXEW_EXT_visual_info = GL_FALSE; +GLboolean __GLXEW_EXT_visual_rating = GL_FALSE; +GLboolean __GLXEW_INTEL_swap_event = GL_FALSE; +GLboolean __GLXEW_MESA_agp_offset = GL_FALSE; +GLboolean __GLXEW_MESA_copy_sub_buffer = GL_FALSE; +GLboolean __GLXEW_MESA_pixmap_colormap = GL_FALSE; +GLboolean __GLXEW_MESA_query_renderer = GL_FALSE; +GLboolean __GLXEW_MESA_release_buffers = GL_FALSE; +GLboolean __GLXEW_MESA_set_3dfx_mode = GL_FALSE; +GLboolean __GLXEW_MESA_swap_control = GL_FALSE; +GLboolean __GLXEW_NV_copy_buffer = GL_FALSE; +GLboolean __GLXEW_NV_copy_image = GL_FALSE; +GLboolean __GLXEW_NV_delay_before_swap = GL_FALSE; +GLboolean __GLXEW_NV_float_buffer = GL_FALSE; +GLboolean __GLXEW_NV_multisample_coverage = GL_FALSE; +GLboolean __GLXEW_NV_present_video = GL_FALSE; +GLboolean __GLXEW_NV_swap_group = GL_FALSE; +GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE; +GLboolean __GLXEW_NV_video_capture = GL_FALSE; +GLboolean __GLXEW_NV_video_out = GL_FALSE; +GLboolean __GLXEW_OML_swap_method = GL_FALSE; +GLboolean __GLXEW_OML_sync_control = GL_FALSE; +GLboolean __GLXEW_SGIS_blended_overlay = GL_FALSE; +GLboolean __GLXEW_SGIS_color_range = GL_FALSE; +GLboolean __GLXEW_SGIS_multisample = GL_FALSE; +GLboolean __GLXEW_SGIS_shared_multisample = GL_FALSE; +GLboolean __GLXEW_SGIX_fbconfig = GL_FALSE; +GLboolean __GLXEW_SGIX_hyperpipe = GL_FALSE; +GLboolean __GLXEW_SGIX_pbuffer = GL_FALSE; +GLboolean __GLXEW_SGIX_swap_barrier = GL_FALSE; +GLboolean __GLXEW_SGIX_swap_group = GL_FALSE; +GLboolean __GLXEW_SGIX_video_resize = GL_FALSE; +GLboolean __GLXEW_SGIX_visual_select_group = GL_FALSE; +GLboolean __GLXEW_SGI_cushion = GL_FALSE; +GLboolean __GLXEW_SGI_make_current_read = GL_FALSE; +GLboolean __GLXEW_SGI_swap_control = GL_FALSE; +GLboolean __GLXEW_SGI_video_sync = GL_FALSE; +GLboolean __GLXEW_SUN_get_transparent_index = GL_FALSE; +GLboolean __GLXEW_SUN_video_resize = GL_FALSE; + +#endif /* !GLEW_MX */ + +#ifdef GLX_VERSION_1_2 + +static GLboolean _glewInit_GLX_VERSION_1_2 (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentDisplay")) == NULL) || r; + + return r; +} + +#endif /* GLX_VERSION_1_2 */ + +#ifdef GLX_VERSION_1_3 + +static GLboolean _glewInit_GLX_VERSION_1_3 (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfig")) == NULL) || r; + r = ((glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXCreateNewContext")) == NULL) || r; + r = ((glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXCreatePbuffer")) == NULL) || r; + r = ((glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXCreatePixmap")) == NULL) || r; + r = ((glXCreateWindow = (PFNGLXCREATEWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXCreateWindow")) == NULL) || r; + r = ((glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPbuffer")) == NULL) || r; + r = ((glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)glewGetProcAddress((const GLubyte*)"glXDestroyPixmap")) == NULL) || r; + r = ((glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)glewGetProcAddress((const GLubyte*)"glXDestroyWindow")) == NULL) || r; + r = ((glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawable")) == NULL) || r; + r = ((glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttrib")) == NULL) || r; + r = ((glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigs")) == NULL) || r; + r = ((glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEvent")) == NULL) || r; + r = ((glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfig")) == NULL) || r; + r = ((glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)glewGetProcAddress((const GLubyte*)"glXMakeContextCurrent")) == NULL) || r; + r = ((glXQueryContext = (PFNGLXQUERYCONTEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContext")) == NULL) || r; + r = ((glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)glewGetProcAddress((const GLubyte*)"glXQueryDrawable")) == NULL) || r; + r = ((glXSelectEvent = (PFNGLXSELECTEVENTPROC)glewGetProcAddress((const GLubyte*)"glXSelectEvent")) == NULL) || r; + + return r; +} + +#endif /* GLX_VERSION_1_3 */ + +#ifdef GLX_AMD_gpu_association + +static GLboolean _glewInit_GLX_AMD_gpu_association (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBlitContextFramebufferAMD = (PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"glXBlitContextFramebufferAMD")) == NULL) || r; + r = ((glXCreateAssociatedContextAMD = (PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAMD")) == NULL) || r; + r = ((glXCreateAssociatedContextAttribsAMD = (PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"glXCreateAssociatedContextAttribsAMD")) == NULL) || r; + r = ((glXDeleteAssociatedContextAMD = (PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXDeleteAssociatedContextAMD")) == NULL) || r; + r = ((glXGetContextGPUIDAMD = (PFNGLXGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetContextGPUIDAMD")) == NULL) || r; + r = ((glXGetCurrentAssociatedContextAMD = (PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentAssociatedContextAMD")) == NULL) || r; + r = ((glXGetGPUIDsAMD = (PFNGLXGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUIDsAMD")) == NULL) || r; + r = ((glXGetGPUInfoAMD = (PFNGLXGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glXGetGPUInfoAMD")) == NULL) || r; + r = ((glXMakeAssociatedContextCurrentAMD = (PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"glXMakeAssociatedContextCurrentAMD")) == NULL) || r; + + return r; +} + +#endif /* GLX_AMD_gpu_association */ + +#ifdef GLX_ARB_create_context + +static GLboolean _glewInit_GLX_ARB_create_context (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB")) == NULL) || r; + + return r; +} + +#endif /* GLX_ARB_create_context */ + +#ifdef GLX_ATI_render_texture + +static GLboolean _glewInit_GLX_ATI_render_texture (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindTexImageATI = (PFNGLXBINDTEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageATI")) == NULL) || r; + r = ((glXDrawableAttribATI = (PFNGLXDRAWABLEATTRIBATIPROC)glewGetProcAddress((const GLubyte*)"glXDrawableAttribATI")) == NULL) || r; + r = ((glXReleaseTexImageATI = (PFNGLXRELEASETEXIMAGEATIPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageATI")) == NULL) || r; + + return r; +} + +#endif /* GLX_ATI_render_texture */ + +#ifdef GLX_EXT_import_context + +static GLboolean _glewInit_GLX_EXT_import_context (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXFreeContextEXT")) == NULL) || r; + r = ((glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)glewGetProcAddress((const GLubyte*)"glXGetContextIDEXT")) == NULL) || r; + r = ((glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)glewGetProcAddress((const GLubyte*)"glXImportContextEXT")) == NULL) || r; + r = ((glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)glewGetProcAddress((const GLubyte*)"glXQueryContextInfoEXT")) == NULL) || r; + + return r; +} + +#endif /* GLX_EXT_import_context */ + +#ifdef GLX_EXT_swap_control + +static GLboolean _glewInit_GLX_EXT_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalEXT")) == NULL) || r; + + return r; +} + +#endif /* GLX_EXT_swap_control */ + +#ifdef GLX_EXT_texture_from_pixmap + +static GLboolean _glewInit_GLX_EXT_texture_from_pixmap (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXBindTexImageEXT")) == NULL) || r; + r = ((glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glXReleaseTexImageEXT")) == NULL) || r; + + return r; +} + +#endif /* GLX_EXT_texture_from_pixmap */ + +#ifdef GLX_MESA_agp_offset + +static GLboolean _glewInit_GLX_MESA_agp_offset (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetAGPOffsetMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_agp_offset */ + +#ifdef GLX_MESA_copy_sub_buffer + +static GLboolean _glewInit_GLX_MESA_copy_sub_buffer (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)glewGetProcAddress((const GLubyte*)"glXCopySubBufferMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_copy_sub_buffer */ + +#ifdef GLX_MESA_pixmap_colormap + +static GLboolean _glewInit_GLX_MESA_pixmap_colormap (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_pixmap_colormap */ + +#ifdef GLX_MESA_query_renderer + +static GLboolean _glewInit_GLX_MESA_query_renderer (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXQueryCurrentRendererIntegerMESA = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererIntegerMESA")) == NULL) || r; + r = ((glXQueryCurrentRendererStringMESA = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryCurrentRendererStringMESA")) == NULL) || r; + r = ((glXQueryRendererIntegerMESA = (PFNGLXQUERYRENDERERINTEGERMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererIntegerMESA")) == NULL) || r; + r = ((glXQueryRendererStringMESA = (PFNGLXQUERYRENDERERSTRINGMESAPROC)glewGetProcAddress((const GLubyte*)"glXQueryRendererStringMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_query_renderer */ + +#ifdef GLX_MESA_release_buffers + +static GLboolean _glewInit_GLX_MESA_release_buffers (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)glewGetProcAddress((const GLubyte*)"glXReleaseBuffersMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_release_buffers */ + +#ifdef GLX_MESA_set_3dfx_mode + +static GLboolean _glewInit_GLX_MESA_set_3dfx_mode (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)glewGetProcAddress((const GLubyte*)"glXSet3DfxModeMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_set_3dfx_mode */ + +#ifdef GLX_MESA_swap_control + +static GLboolean _glewInit_GLX_MESA_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXGetSwapIntervalMESA")) == NULL) || r; + r = ((glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalMESA")) == NULL) || r; + + return r; +} + +#endif /* GLX_MESA_swap_control */ + +#ifdef GLX_NV_copy_buffer + +static GLboolean _glewInit_GLX_NV_copy_buffer (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXCopyBufferSubDataNV = (PFNGLXCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyBufferSubDataNV")) == NULL) || r; + r = ((glXNamedCopyBufferSubDataNV = (PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXNamedCopyBufferSubDataNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_copy_buffer */ + +#ifdef GLX_NV_copy_image + +static GLboolean _glewInit_GLX_NV_copy_image (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyImageSubDataNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_copy_image */ + +#ifdef GLX_NV_delay_before_swap + +static GLboolean _glewInit_GLX_NV_delay_before_swap (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXDelayBeforeSwapNV = (PFNGLXDELAYBEFORESWAPNVPROC)glewGetProcAddress((const GLubyte*)"glXDelayBeforeSwapNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_delay_before_swap */ + +#ifdef GLX_NV_present_video + +static GLboolean _glewInit_GLX_NV_present_video (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindVideoDeviceNV = (PFNGLXBINDVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoDeviceNV")) == NULL) || r; + r = ((glXEnumerateVideoDevicesNV = (PFNGLXENUMERATEVIDEODEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoDevicesNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_present_video */ + +#ifdef GLX_NV_swap_group + +static GLboolean _glewInit_GLX_NV_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindSwapBarrierNV = (PFNGLXBINDSWAPBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierNV")) == NULL) || r; + r = ((glXJoinSwapGroupNV = (PFNGLXJOINSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupNV")) == NULL) || r; + r = ((glXQueryFrameCountNV = (PFNGLXQUERYFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryFrameCountNV")) == NULL) || r; + r = ((glXQueryMaxSwapGroupsNV = (PFNGLXQUERYMAXSWAPGROUPSNVPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapGroupsNV")) == NULL) || r; + r = ((glXQuerySwapGroupNV = (PFNGLXQUERYSWAPGROUPNVPROC)glewGetProcAddress((const GLubyte*)"glXQuerySwapGroupNV")) == NULL) || r; + r = ((glXResetFrameCountNV = (PFNGLXRESETFRAMECOUNTNVPROC)glewGetProcAddress((const GLubyte*)"glXResetFrameCountNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_swap_group */ + +#ifdef GLX_NV_vertex_array_range + +static GLboolean _glewInit_GLX_NV_vertex_array_range (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXAllocateMemoryNV = (PFNGLXALLOCATEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXAllocateMemoryNV")) == NULL) || r; + r = ((glXFreeMemoryNV = (PFNGLXFREEMEMORYNVPROC)glewGetProcAddress((const GLubyte*)"glXFreeMemoryNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_vertex_array_range */ + +#ifdef GLX_NV_video_capture + +static GLboolean _glewInit_GLX_NV_video_capture (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindVideoCaptureDeviceNV = (PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoCaptureDeviceNV")) == NULL) || r; + r = ((glXEnumerateVideoCaptureDevicesNV = (PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)glewGetProcAddress((const GLubyte*)"glXEnumerateVideoCaptureDevicesNV")) == NULL) || r; + r = ((glXLockVideoCaptureDeviceNV = (PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXLockVideoCaptureDeviceNV")) == NULL) || r; + r = ((glXQueryVideoCaptureDeviceNV = (PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXQueryVideoCaptureDeviceNV")) == NULL) || r; + r = ((glXReleaseVideoCaptureDeviceNV = (PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoCaptureDeviceNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_video_capture */ + +#ifdef GLX_NV_video_out + +static GLboolean _glewInit_GLX_NV_video_out (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindVideoImageNV = (PFNGLXBINDVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXBindVideoImageNV")) == NULL) || r; + r = ((glXGetVideoDeviceNV = (PFNGLXGETVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoDeviceNV")) == NULL) || r; + r = ((glXGetVideoInfoNV = (PFNGLXGETVIDEOINFONVPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoInfoNV")) == NULL) || r; + r = ((glXReleaseVideoDeviceNV = (PFNGLXRELEASEVIDEODEVICENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoDeviceNV")) == NULL) || r; + r = ((glXReleaseVideoImageNV = (PFNGLXRELEASEVIDEOIMAGENVPROC)glewGetProcAddress((const GLubyte*)"glXReleaseVideoImageNV")) == NULL) || r; + r = ((glXSendPbufferToVideoNV = (PFNGLXSENDPBUFFERTOVIDEONVPROC)glewGetProcAddress((const GLubyte*)"glXSendPbufferToVideoNV")) == NULL) || r; + + return r; +} + +#endif /* GLX_NV_video_out */ + +#ifdef GLX_OML_sync_control + +static GLboolean _glewInit_GLX_OML_sync_control (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetMscRateOML")) == NULL) || r; + r = ((glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)glewGetProcAddress((const GLubyte*)"glXGetSyncValuesOML")) == NULL) || r; + r = ((glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXSwapBuffersMscOML")) == NULL) || r; + r = ((glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForMscOML")) == NULL) || r; + r = ((glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)glewGetProcAddress((const GLubyte*)"glXWaitForSbcOML")) == NULL) || r; + + return r; +} + +#endif /* GLX_OML_sync_control */ + +#ifdef GLX_SGIX_fbconfig + +static GLboolean _glewInit_GLX_SGIX_fbconfig (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChooseFBConfigSGIX")) == NULL) || r; + r = ((glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateContextWithConfigSGIX")) == NULL) || r; + r = ((glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPixmapWithConfigSGIX")) == NULL) || r; + r = ((glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigAttribSGIX")) == NULL) || r; + r = ((glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetFBConfigFromVisualSGIX")) == NULL) || r; + r = ((glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetVisualFromFBConfigSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_fbconfig */ + +#ifdef GLX_SGIX_hyperpipe + +static GLboolean _glewInit_GLX_SGIX_hyperpipe (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindHyperpipeSGIX")) == NULL) || r; + r = ((glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyHyperpipeConfigSGIX")) == NULL) || r; + r = ((glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeAttribSGIX")) == NULL) || r; + r = ((glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXHyperpipeConfigSGIX")) == NULL) || r; + r = ((glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeAttribSGIX")) == NULL) || r; + r = ((glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeBestAttribSGIX")) == NULL) || r; + r = ((glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeConfigSGIX")) == NULL) || r; + r = ((glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryHyperpipeNetworkSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_hyperpipe */ + +#ifdef GLX_SGIX_pbuffer + +static GLboolean _glewInit_GLX_SGIX_pbuffer (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXCreateGLXPbufferSGIX")) == NULL) || r; + r = ((glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXDestroyGLXPbufferSGIX")) == NULL) || r; + r = ((glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXGetSelectedEventSGIX")) == NULL) || r; + r = ((glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryGLXPbufferSGIX")) == NULL) || r; + r = ((glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXSelectEventSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_pbuffer */ + +#ifdef GLX_SGIX_swap_barrier + +static GLboolean _glewInit_GLX_SGIX_swap_barrier (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindSwapBarrierSGIX")) == NULL) || r; + r = ((glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryMaxSwapBarriersSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_swap_barrier */ + +#ifdef GLX_SGIX_swap_group + +static GLboolean _glewInit_GLX_SGIX_swap_group (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)glewGetProcAddress((const GLubyte*)"glXJoinSwapGroupSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_swap_group */ + +#ifdef GLX_SGIX_video_resize + +static GLboolean _glewInit_GLX_SGIX_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)glewGetProcAddress((const GLubyte*)"glXBindChannelToWindowSGIX")) == NULL) || r; + r = ((glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSGIX")) == NULL) || r; + r = ((glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)glewGetProcAddress((const GLubyte*)"glXChannelRectSyncSGIX")) == NULL) || r; + r = ((glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelDeltasSGIX")) == NULL) || r; + r = ((glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)glewGetProcAddress((const GLubyte*)"glXQueryChannelRectSGIX")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGIX_video_resize */ + +#ifdef GLX_SGI_cushion + +static GLboolean _glewInit_GLX_SGI_cushion (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXCushionSGI = (PFNGLXCUSHIONSGIPROC)glewGetProcAddress((const GLubyte*)"glXCushionSGI")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGI_cushion */ + +#ifdef GLX_SGI_make_current_read + +static GLboolean _glewInit_GLX_SGI_make_current_read (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)glewGetProcAddress((const GLubyte*)"glXGetCurrentReadDrawableSGI")) == NULL) || r; + r = ((glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)glewGetProcAddress((const GLubyte*)"glXMakeCurrentReadSGI")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGI_make_current_read */ + +#ifdef GLX_SGI_swap_control + +static GLboolean _glewInit_GLX_SGI_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalSGI")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGI_swap_control */ + +#ifdef GLX_SGI_video_sync + +static GLboolean _glewInit_GLX_SGI_video_sync (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoSyncSGI")) == NULL) || r; + r = ((glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)glewGetProcAddress((const GLubyte*)"glXWaitVideoSyncSGI")) == NULL) || r; + + return r; +} + +#endif /* GLX_SGI_video_sync */ + +#ifdef GLX_SUN_get_transparent_index + +static GLboolean _glewInit_GLX_SUN_get_transparent_index (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)glewGetProcAddress((const GLubyte*)"glXGetTransparentIndexSUN")) == NULL) || r; + + return r; +} + +#endif /* GLX_SUN_get_transparent_index */ + +#ifdef GLX_SUN_video_resize + +static GLboolean _glewInit_GLX_SUN_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT) +{ + GLboolean r = GL_FALSE; + + r = ((glXGetVideoResizeSUN = (PFNGLXGETVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXGetVideoResizeSUN")) == NULL) || r; + r = ((glXVideoResizeSUN = (PFNGLXVIDEORESIZESUNPROC)glewGetProcAddress((const GLubyte*)"glXVideoResizeSUN")) == NULL) || r; + + return r; +} + +#endif /* GLX_SUN_video_resize */ + +/* ------------------------------------------------------------------------ */ + +GLboolean glxewGetExtension (const char* name) +{ + const GLubyte* start; + const GLubyte* end; + + if (glXGetCurrentDisplay == NULL) return GL_FALSE; + start = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); + if (0 == start) return GL_FALSE; + end = start + _glewStrLen(start); + return _glewSearchExtension(name, start, end); +} + +#ifdef GLEW_MX +GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST) +#else +GLenum glxewInit (GLXEW_CONTEXT_ARG_DEF_LIST) +#endif +{ + int major, minor; + const GLubyte* extStart; + const GLubyte* extEnd; + /* initialize core GLX 1.2 */ + if (_glewInit_GLX_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT)) return GLEW_ERROR_GLX_VERSION_11_ONLY; + /* initialize flags */ + GLXEW_VERSION_1_0 = GL_TRUE; + GLXEW_VERSION_1_1 = GL_TRUE; + GLXEW_VERSION_1_2 = GL_TRUE; + GLXEW_VERSION_1_3 = GL_TRUE; + GLXEW_VERSION_1_4 = GL_TRUE; + /* query GLX version */ + glXQueryVersion(glXGetCurrentDisplay(), &major, &minor); + if (major == 1 && minor <= 3) + { + switch (minor) + { + case 3: + GLXEW_VERSION_1_4 = GL_FALSE; + break; + case 2: + GLXEW_VERSION_1_4 = GL_FALSE; + GLXEW_VERSION_1_3 = GL_FALSE; + break; + default: + return GLEW_ERROR_GLX_VERSION_11_ONLY; + break; + } + } + /* query GLX extension string */ + extStart = 0; + if (glXGetCurrentDisplay != NULL) + extStart = (const GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS); + if (extStart == 0) + extStart = (const GLubyte *)""; + extEnd = extStart + _glewStrLen(extStart); + /* initialize extensions */ +#ifdef GLX_VERSION_1_3 + if (glewExperimental || GLXEW_VERSION_1_3) GLXEW_VERSION_1_3 = !_glewInit_GLX_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_VERSION_1_3 */ +#ifdef GLX_3DFX_multisample + GLXEW_3DFX_multisample = _glewSearchExtension("GLX_3DFX_multisample", extStart, extEnd); +#endif /* GLX_3DFX_multisample */ +#ifdef GLX_AMD_gpu_association + GLXEW_AMD_gpu_association = _glewSearchExtension("GLX_AMD_gpu_association", extStart, extEnd); + if (glewExperimental || GLXEW_AMD_gpu_association) GLXEW_AMD_gpu_association = !_glewInit_GLX_AMD_gpu_association(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_AMD_gpu_association */ +#ifdef GLX_ARB_context_flush_control + GLXEW_ARB_context_flush_control = _glewSearchExtension("GLX_ARB_context_flush_control", extStart, extEnd); +#endif /* GLX_ARB_context_flush_control */ +#ifdef GLX_ARB_create_context + GLXEW_ARB_create_context = _glewSearchExtension("GLX_ARB_create_context", extStart, extEnd); + if (glewExperimental || GLXEW_ARB_create_context) GLXEW_ARB_create_context = !_glewInit_GLX_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_ARB_create_context */ +#ifdef GLX_ARB_create_context_profile + GLXEW_ARB_create_context_profile = _glewSearchExtension("GLX_ARB_create_context_profile", extStart, extEnd); +#endif /* GLX_ARB_create_context_profile */ +#ifdef GLX_ARB_create_context_robustness + GLXEW_ARB_create_context_robustness = _glewSearchExtension("GLX_ARB_create_context_robustness", extStart, extEnd); +#endif /* GLX_ARB_create_context_robustness */ +#ifdef GLX_ARB_fbconfig_float + GLXEW_ARB_fbconfig_float = _glewSearchExtension("GLX_ARB_fbconfig_float", extStart, extEnd); +#endif /* GLX_ARB_fbconfig_float */ +#ifdef GLX_ARB_framebuffer_sRGB + GLXEW_ARB_framebuffer_sRGB = _glewSearchExtension("GLX_ARB_framebuffer_sRGB", extStart, extEnd); +#endif /* GLX_ARB_framebuffer_sRGB */ +#ifdef GLX_ARB_get_proc_address + GLXEW_ARB_get_proc_address = _glewSearchExtension("GLX_ARB_get_proc_address", extStart, extEnd); +#endif /* GLX_ARB_get_proc_address */ +#ifdef GLX_ARB_multisample + GLXEW_ARB_multisample = _glewSearchExtension("GLX_ARB_multisample", extStart, extEnd); +#endif /* GLX_ARB_multisample */ +#ifdef GLX_ARB_robustness_application_isolation + GLXEW_ARB_robustness_application_isolation = _glewSearchExtension("GLX_ARB_robustness_application_isolation", extStart, extEnd); +#endif /* GLX_ARB_robustness_application_isolation */ +#ifdef GLX_ARB_robustness_share_group_isolation + GLXEW_ARB_robustness_share_group_isolation = _glewSearchExtension("GLX_ARB_robustness_share_group_isolation", extStart, extEnd); +#endif /* GLX_ARB_robustness_share_group_isolation */ +#ifdef GLX_ARB_vertex_buffer_object + GLXEW_ARB_vertex_buffer_object = _glewSearchExtension("GLX_ARB_vertex_buffer_object", extStart, extEnd); +#endif /* GLX_ARB_vertex_buffer_object */ +#ifdef GLX_ATI_pixel_format_float + GLXEW_ATI_pixel_format_float = _glewSearchExtension("GLX_ATI_pixel_format_float", extStart, extEnd); +#endif /* GLX_ATI_pixel_format_float */ +#ifdef GLX_ATI_render_texture + GLXEW_ATI_render_texture = _glewSearchExtension("GLX_ATI_render_texture", extStart, extEnd); + if (glewExperimental || GLXEW_ATI_render_texture) GLXEW_ATI_render_texture = !_glewInit_GLX_ATI_render_texture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_ATI_render_texture */ +#ifdef GLX_EXT_buffer_age + GLXEW_EXT_buffer_age = _glewSearchExtension("GLX_EXT_buffer_age", extStart, extEnd); +#endif /* GLX_EXT_buffer_age */ +#ifdef GLX_EXT_create_context_es2_profile + GLXEW_EXT_create_context_es2_profile = _glewSearchExtension("GLX_EXT_create_context_es2_profile", extStart, extEnd); +#endif /* GLX_EXT_create_context_es2_profile */ +#ifdef GLX_EXT_create_context_es_profile + GLXEW_EXT_create_context_es_profile = _glewSearchExtension("GLX_EXT_create_context_es_profile", extStart, extEnd); +#endif /* GLX_EXT_create_context_es_profile */ +#ifdef GLX_EXT_fbconfig_packed_float + GLXEW_EXT_fbconfig_packed_float = _glewSearchExtension("GLX_EXT_fbconfig_packed_float", extStart, extEnd); +#endif /* GLX_EXT_fbconfig_packed_float */ +#ifdef GLX_EXT_framebuffer_sRGB + GLXEW_EXT_framebuffer_sRGB = _glewSearchExtension("GLX_EXT_framebuffer_sRGB", extStart, extEnd); +#endif /* GLX_EXT_framebuffer_sRGB */ +#ifdef GLX_EXT_import_context + GLXEW_EXT_import_context = _glewSearchExtension("GLX_EXT_import_context", extStart, extEnd); + if (glewExperimental || GLXEW_EXT_import_context) GLXEW_EXT_import_context = !_glewInit_GLX_EXT_import_context(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_EXT_import_context */ +#ifdef GLX_EXT_scene_marker + GLXEW_EXT_scene_marker = _glewSearchExtension("GLX_EXT_scene_marker", extStart, extEnd); +#endif /* GLX_EXT_scene_marker */ +#ifdef GLX_EXT_stereo_tree + GLXEW_EXT_stereo_tree = _glewSearchExtension("GLX_EXT_stereo_tree", extStart, extEnd); +#endif /* GLX_EXT_stereo_tree */ +#ifdef GLX_EXT_swap_control + GLXEW_EXT_swap_control = _glewSearchExtension("GLX_EXT_swap_control", extStart, extEnd); + if (glewExperimental || GLXEW_EXT_swap_control) GLXEW_EXT_swap_control = !_glewInit_GLX_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_EXT_swap_control */ +#ifdef GLX_EXT_swap_control_tear + GLXEW_EXT_swap_control_tear = _glewSearchExtension("GLX_EXT_swap_control_tear", extStart, extEnd); +#endif /* GLX_EXT_swap_control_tear */ +#ifdef GLX_EXT_texture_from_pixmap + GLXEW_EXT_texture_from_pixmap = _glewSearchExtension("GLX_EXT_texture_from_pixmap", extStart, extEnd); + if (glewExperimental || GLXEW_EXT_texture_from_pixmap) GLXEW_EXT_texture_from_pixmap = !_glewInit_GLX_EXT_texture_from_pixmap(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_EXT_texture_from_pixmap */ +#ifdef GLX_EXT_visual_info + GLXEW_EXT_visual_info = _glewSearchExtension("GLX_EXT_visual_info", extStart, extEnd); +#endif /* GLX_EXT_visual_info */ +#ifdef GLX_EXT_visual_rating + GLXEW_EXT_visual_rating = _glewSearchExtension("GLX_EXT_visual_rating", extStart, extEnd); +#endif /* GLX_EXT_visual_rating */ +#ifdef GLX_INTEL_swap_event + GLXEW_INTEL_swap_event = _glewSearchExtension("GLX_INTEL_swap_event", extStart, extEnd); +#endif /* GLX_INTEL_swap_event */ +#ifdef GLX_MESA_agp_offset + GLXEW_MESA_agp_offset = _glewSearchExtension("GLX_MESA_agp_offset", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_agp_offset) GLXEW_MESA_agp_offset = !_glewInit_GLX_MESA_agp_offset(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_MESA_agp_offset */ +#ifdef GLX_MESA_copy_sub_buffer + GLXEW_MESA_copy_sub_buffer = _glewSearchExtension("GLX_MESA_copy_sub_buffer", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_copy_sub_buffer) GLXEW_MESA_copy_sub_buffer = !_glewInit_GLX_MESA_copy_sub_buffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_MESA_copy_sub_buffer */ +#ifdef GLX_MESA_pixmap_colormap + GLXEW_MESA_pixmap_colormap = _glewSearchExtension("GLX_MESA_pixmap_colormap", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_pixmap_colormap) GLXEW_MESA_pixmap_colormap = !_glewInit_GLX_MESA_pixmap_colormap(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_MESA_pixmap_colormap */ +#ifdef GLX_MESA_query_renderer + GLXEW_MESA_query_renderer = _glewSearchExtension("GLX_MESA_query_renderer", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_query_renderer) GLXEW_MESA_query_renderer = !_glewInit_GLX_MESA_query_renderer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_MESA_query_renderer */ +#ifdef GLX_MESA_release_buffers + GLXEW_MESA_release_buffers = _glewSearchExtension("GLX_MESA_release_buffers", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_release_buffers) GLXEW_MESA_release_buffers = !_glewInit_GLX_MESA_release_buffers(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_MESA_release_buffers */ +#ifdef GLX_MESA_set_3dfx_mode + GLXEW_MESA_set_3dfx_mode = _glewSearchExtension("GLX_MESA_set_3dfx_mode", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_set_3dfx_mode) GLXEW_MESA_set_3dfx_mode = !_glewInit_GLX_MESA_set_3dfx_mode(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_MESA_set_3dfx_mode */ +#ifdef GLX_MESA_swap_control + GLXEW_MESA_swap_control = _glewSearchExtension("GLX_MESA_swap_control", extStart, extEnd); + if (glewExperimental || GLXEW_MESA_swap_control) GLXEW_MESA_swap_control = !_glewInit_GLX_MESA_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_MESA_swap_control */ +#ifdef GLX_NV_copy_buffer + GLXEW_NV_copy_buffer = _glewSearchExtension("GLX_NV_copy_buffer", extStart, extEnd); + if (glewExperimental || GLXEW_NV_copy_buffer) GLXEW_NV_copy_buffer = !_glewInit_GLX_NV_copy_buffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_NV_copy_buffer */ +#ifdef GLX_NV_copy_image + GLXEW_NV_copy_image = _glewSearchExtension("GLX_NV_copy_image", extStart, extEnd); + if (glewExperimental || GLXEW_NV_copy_image) GLXEW_NV_copy_image = !_glewInit_GLX_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_NV_copy_image */ +#ifdef GLX_NV_delay_before_swap + GLXEW_NV_delay_before_swap = _glewSearchExtension("GLX_NV_delay_before_swap", extStart, extEnd); + if (glewExperimental || GLXEW_NV_delay_before_swap) GLXEW_NV_delay_before_swap = !_glewInit_GLX_NV_delay_before_swap(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_NV_delay_before_swap */ +#ifdef GLX_NV_float_buffer + GLXEW_NV_float_buffer = _glewSearchExtension("GLX_NV_float_buffer", extStart, extEnd); +#endif /* GLX_NV_float_buffer */ +#ifdef GLX_NV_multisample_coverage + GLXEW_NV_multisample_coverage = _glewSearchExtension("GLX_NV_multisample_coverage", extStart, extEnd); +#endif /* GLX_NV_multisample_coverage */ +#ifdef GLX_NV_present_video + GLXEW_NV_present_video = _glewSearchExtension("GLX_NV_present_video", extStart, extEnd); + if (glewExperimental || GLXEW_NV_present_video) GLXEW_NV_present_video = !_glewInit_GLX_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_NV_present_video */ +#ifdef GLX_NV_swap_group + GLXEW_NV_swap_group = _glewSearchExtension("GLX_NV_swap_group", extStart, extEnd); + if (glewExperimental || GLXEW_NV_swap_group) GLXEW_NV_swap_group = !_glewInit_GLX_NV_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_NV_swap_group */ +#ifdef GLX_NV_vertex_array_range + GLXEW_NV_vertex_array_range = _glewSearchExtension("GLX_NV_vertex_array_range", extStart, extEnd); + if (glewExperimental || GLXEW_NV_vertex_array_range) GLXEW_NV_vertex_array_range = !_glewInit_GLX_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_NV_vertex_array_range */ +#ifdef GLX_NV_video_capture + GLXEW_NV_video_capture = _glewSearchExtension("GLX_NV_video_capture", extStart, extEnd); + if (glewExperimental || GLXEW_NV_video_capture) GLXEW_NV_video_capture = !_glewInit_GLX_NV_video_capture(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_NV_video_capture */ +#ifdef GLX_NV_video_out + GLXEW_NV_video_out = _glewSearchExtension("GLX_NV_video_out", extStart, extEnd); + if (glewExperimental || GLXEW_NV_video_out) GLXEW_NV_video_out = !_glewInit_GLX_NV_video_out(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_NV_video_out */ +#ifdef GLX_OML_swap_method + GLXEW_OML_swap_method = _glewSearchExtension("GLX_OML_swap_method", extStart, extEnd); +#endif /* GLX_OML_swap_method */ +#ifdef GLX_OML_sync_control + GLXEW_OML_sync_control = _glewSearchExtension("GLX_OML_sync_control", extStart, extEnd); + if (glewExperimental || GLXEW_OML_sync_control) GLXEW_OML_sync_control = !_glewInit_GLX_OML_sync_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_OML_sync_control */ +#ifdef GLX_SGIS_blended_overlay + GLXEW_SGIS_blended_overlay = _glewSearchExtension("GLX_SGIS_blended_overlay", extStart, extEnd); +#endif /* GLX_SGIS_blended_overlay */ +#ifdef GLX_SGIS_color_range + GLXEW_SGIS_color_range = _glewSearchExtension("GLX_SGIS_color_range", extStart, extEnd); +#endif /* GLX_SGIS_color_range */ +#ifdef GLX_SGIS_multisample + GLXEW_SGIS_multisample = _glewSearchExtension("GLX_SGIS_multisample", extStart, extEnd); +#endif /* GLX_SGIS_multisample */ +#ifdef GLX_SGIS_shared_multisample + GLXEW_SGIS_shared_multisample = _glewSearchExtension("GLX_SGIS_shared_multisample", extStart, extEnd); +#endif /* GLX_SGIS_shared_multisample */ +#ifdef GLX_SGIX_fbconfig + GLXEW_SGIX_fbconfig = _glewSearchExtension("GLX_SGIX_fbconfig", extStart, extEnd); + if (glewExperimental || GLXEW_SGIX_fbconfig) GLXEW_SGIX_fbconfig = !_glewInit_GLX_SGIX_fbconfig(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGIX_fbconfig */ +#ifdef GLX_SGIX_hyperpipe + GLXEW_SGIX_hyperpipe = _glewSearchExtension("GLX_SGIX_hyperpipe", extStart, extEnd); + if (glewExperimental || GLXEW_SGIX_hyperpipe) GLXEW_SGIX_hyperpipe = !_glewInit_GLX_SGIX_hyperpipe(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGIX_hyperpipe */ +#ifdef GLX_SGIX_pbuffer + GLXEW_SGIX_pbuffer = _glewSearchExtension("GLX_SGIX_pbuffer", extStart, extEnd); + if (glewExperimental || GLXEW_SGIX_pbuffer) GLXEW_SGIX_pbuffer = !_glewInit_GLX_SGIX_pbuffer(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGIX_pbuffer */ +#ifdef GLX_SGIX_swap_barrier + GLXEW_SGIX_swap_barrier = _glewSearchExtension("GLX_SGIX_swap_barrier", extStart, extEnd); + if (glewExperimental || GLXEW_SGIX_swap_barrier) GLXEW_SGIX_swap_barrier = !_glewInit_GLX_SGIX_swap_barrier(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGIX_swap_barrier */ +#ifdef GLX_SGIX_swap_group + GLXEW_SGIX_swap_group = _glewSearchExtension("GLX_SGIX_swap_group", extStart, extEnd); + if (glewExperimental || GLXEW_SGIX_swap_group) GLXEW_SGIX_swap_group = !_glewInit_GLX_SGIX_swap_group(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGIX_swap_group */ +#ifdef GLX_SGIX_video_resize + GLXEW_SGIX_video_resize = _glewSearchExtension("GLX_SGIX_video_resize", extStart, extEnd); + if (glewExperimental || GLXEW_SGIX_video_resize) GLXEW_SGIX_video_resize = !_glewInit_GLX_SGIX_video_resize(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGIX_video_resize */ +#ifdef GLX_SGIX_visual_select_group + GLXEW_SGIX_visual_select_group = _glewSearchExtension("GLX_SGIX_visual_select_group", extStart, extEnd); +#endif /* GLX_SGIX_visual_select_group */ +#ifdef GLX_SGI_cushion + GLXEW_SGI_cushion = _glewSearchExtension("GLX_SGI_cushion", extStart, extEnd); + if (glewExperimental || GLXEW_SGI_cushion) GLXEW_SGI_cushion = !_glewInit_GLX_SGI_cushion(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGI_cushion */ +#ifdef GLX_SGI_make_current_read + GLXEW_SGI_make_current_read = _glewSearchExtension("GLX_SGI_make_current_read", extStart, extEnd); + if (glewExperimental || GLXEW_SGI_make_current_read) GLXEW_SGI_make_current_read = !_glewInit_GLX_SGI_make_current_read(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGI_make_current_read */ +#ifdef GLX_SGI_swap_control + GLXEW_SGI_swap_control = _glewSearchExtension("GLX_SGI_swap_control", extStart, extEnd); + if (glewExperimental || GLXEW_SGI_swap_control) GLXEW_SGI_swap_control = !_glewInit_GLX_SGI_swap_control(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGI_swap_control */ +#ifdef GLX_SGI_video_sync + GLXEW_SGI_video_sync = _glewSearchExtension("GLX_SGI_video_sync", extStart, extEnd); + if (glewExperimental || GLXEW_SGI_video_sync) GLXEW_SGI_video_sync = !_glewInit_GLX_SGI_video_sync(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SGI_video_sync */ +#ifdef GLX_SUN_get_transparent_index + GLXEW_SUN_get_transparent_index = _glewSearchExtension("GLX_SUN_get_transparent_index", extStart, extEnd); + if (glewExperimental || GLXEW_SUN_get_transparent_index) GLXEW_SUN_get_transparent_index = !_glewInit_GLX_SUN_get_transparent_index(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SUN_get_transparent_index */ +#ifdef GLX_SUN_video_resize + GLXEW_SUN_video_resize = _glewSearchExtension("GLX_SUN_video_resize", extStart, extEnd); + if (glewExperimental || GLXEW_SUN_video_resize) GLXEW_SUN_video_resize = !_glewInit_GLX_SUN_video_resize(GLEW_CONTEXT_ARG_VAR_INIT); +#endif /* GLX_SUN_video_resize */ + + return GLEW_OK; +} + +#endif /* !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) */ + +/* ------------------------------------------------------------------------ */ + +const GLubyte * GLEWAPIENTRY glewGetErrorString (GLenum error) +{ + static const GLubyte* _glewErrorString[] = + { + (const GLubyte*)"No error", + (const GLubyte*)"Missing GL version", + (const GLubyte*)"GL 1.1 and up are not supported", + (const GLubyte*)"GLX 1.2 and up are not supported", + (const GLubyte*)"Unknown error" + }; + const size_t max_error = sizeof(_glewErrorString)/sizeof(*_glewErrorString) - 1; + return _glewErrorString[(size_t)error > max_error ? max_error : (size_t)error]; +} + +const GLubyte * GLEWAPIENTRY glewGetString (GLenum name) +{ + static const GLubyte* _glewString[] = + { + (const GLubyte*)NULL, + (const GLubyte*)"1.13.0", + (const GLubyte*)"1", + (const GLubyte*)"13", + (const GLubyte*)"0" + }; + const size_t max_string = sizeof(_glewString)/sizeof(*_glewString) - 1; + return _glewString[(size_t)name > max_string ? 0 : (size_t)name]; +} + +/* ------------------------------------------------------------------------ */ + +GLboolean glewExperimental = GL_FALSE; + +#if !defined(GLEW_MX) + +GLenum GLEWAPIENTRY glewInit (void) +{ + GLenum r; + r = glewContextInit(); + if ( r != 0 ) return r; +#if defined(_WIN32) + return wglewInit(); +#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) /* _UNIX */ + return glxewInit(); +#else + return r; +#endif /* _WIN32 */ +} + +#endif /* !GLEW_MX */ +#ifdef GLEW_MX +GLboolean GLEWAPIENTRY glewContextIsSupported (const GLEWContext* ctx, const char* name) +#else +GLboolean GLEWAPIENTRY glewIsSupported (const char* name) +#endif +{ + const GLubyte* pos = (const GLubyte*)name; + GLuint len = _glewStrLen(pos); + GLboolean ret = GL_TRUE; + while (ret && len > 0) + { + if (_glewStrSame1(&pos, &len, (const GLubyte*)"GL_", 3)) + { + if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) + { +#ifdef GL_VERSION_1_2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) + { + ret = GLEW_VERSION_1_2; + continue; + } +#endif +#ifdef GL_VERSION_1_2_1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2_1", 5)) + { + ret = GLEW_VERSION_1_2_1; + continue; + } +#endif +#ifdef GL_VERSION_1_3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) + { + ret = GLEW_VERSION_1_3; + continue; + } +#endif +#ifdef GL_VERSION_1_4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) + { + ret = GLEW_VERSION_1_4; + continue; + } +#endif +#ifdef GL_VERSION_1_5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_5", 3)) + { + ret = GLEW_VERSION_1_5; + continue; + } +#endif +#ifdef GL_VERSION_2_0 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_0", 3)) + { + ret = GLEW_VERSION_2_0; + continue; + } +#endif +#ifdef GL_VERSION_2_1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"2_1", 3)) + { + ret = GLEW_VERSION_2_1; + continue; + } +#endif +#ifdef GL_VERSION_3_0 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_0", 3)) + { + ret = GLEW_VERSION_3_0; + continue; + } +#endif +#ifdef GL_VERSION_3_1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_1", 3)) + { + ret = GLEW_VERSION_3_1; + continue; + } +#endif +#ifdef GL_VERSION_3_2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_2", 3)) + { + ret = GLEW_VERSION_3_2; + continue; + } +#endif +#ifdef GL_VERSION_3_3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_3", 3)) + { + ret = GLEW_VERSION_3_3; + continue; + } +#endif +#ifdef GL_VERSION_4_0 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_0", 3)) + { + ret = GLEW_VERSION_4_0; + continue; + } +#endif +#ifdef GL_VERSION_4_1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_1", 3)) + { + ret = GLEW_VERSION_4_1; + continue; + } +#endif +#ifdef GL_VERSION_4_2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_2", 3)) + { + ret = GLEW_VERSION_4_2; + continue; + } +#endif +#ifdef GL_VERSION_4_3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_3", 3)) + { + ret = GLEW_VERSION_4_3; + continue; + } +#endif +#ifdef GL_VERSION_4_4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_4", 3)) + { + ret = GLEW_VERSION_4_4; + continue; + } +#endif +#ifdef GL_VERSION_4_5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_5", 3)) + { + ret = GLEW_VERSION_4_5; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) + { +#ifdef GL_3DFX_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLEW_3DFX_multisample; + continue; + } +#endif +#ifdef GL_3DFX_tbuffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"tbuffer", 7)) + { + ret = GLEW_3DFX_tbuffer; + continue; + } +#endif +#ifdef GL_3DFX_texture_compression_FXT1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_FXT1", 24)) + { + ret = GLEW_3DFX_texture_compression_FXT1; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) + { +#ifdef GL_AMD_blend_minmax_factor + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax_factor", 19)) + { + ret = GLEW_AMD_blend_minmax_factor; + continue; + } +#endif +#ifdef GL_AMD_conservative_depth + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) + { + ret = GLEW_AMD_conservative_depth; + continue; + } +#endif +#ifdef GL_AMD_debug_output + if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) + { + ret = GLEW_AMD_debug_output; + continue; + } +#endif +#ifdef GL_AMD_depth_clamp_separate + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp_separate", 20)) + { + ret = GLEW_AMD_depth_clamp_separate; + continue; + } +#endif +#ifdef GL_AMD_draw_buffers_blend + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) + { + ret = GLEW_AMD_draw_buffers_blend; + continue; + } +#endif +#ifdef GL_AMD_gcn_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gcn_shader", 10)) + { + ret = GLEW_AMD_gcn_shader; + continue; + } +#endif +#ifdef GL_AMD_gpu_shader_int64 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) + { + ret = GLEW_AMD_gpu_shader_int64; + continue; + } +#endif +#ifdef GL_AMD_interleaved_elements + if (_glewStrSame3(&pos, &len, (const GLubyte*)"interleaved_elements", 20)) + { + ret = GLEW_AMD_interleaved_elements; + continue; + } +#endif +#ifdef GL_AMD_multi_draw_indirect + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) + { + ret = GLEW_AMD_multi_draw_indirect; + continue; + } +#endif +#ifdef GL_AMD_name_gen_delete + if (_glewStrSame3(&pos, &len, (const GLubyte*)"name_gen_delete", 15)) + { + ret = GLEW_AMD_name_gen_delete; + continue; + } +#endif +#ifdef GL_AMD_occlusion_query_event + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query_event", 21)) + { + ret = GLEW_AMD_occlusion_query_event; + continue; + } +#endif +#ifdef GL_AMD_performance_monitor + if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_monitor", 19)) + { + ret = GLEW_AMD_performance_monitor; + continue; + } +#endif +#ifdef GL_AMD_pinned_memory + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pinned_memory", 13)) + { + ret = GLEW_AMD_pinned_memory; + continue; + } +#endif +#ifdef GL_AMD_query_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) + { + ret = GLEW_AMD_query_buffer_object; + continue; + } +#endif +#ifdef GL_AMD_sample_positions + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_positions", 16)) + { + ret = GLEW_AMD_sample_positions; + continue; + } +#endif +#ifdef GL_AMD_seamless_cubemap_per_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) + { + ret = GLEW_AMD_seamless_cubemap_per_texture; + continue; + } +#endif +#ifdef GL_AMD_shader_atomic_counter_ops + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) + { + ret = GLEW_AMD_shader_atomic_counter_ops; + continue; + } +#endif +#ifdef GL_AMD_shader_stencil_export + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) + { + ret = GLEW_AMD_shader_stencil_export; + continue; + } +#endif +#ifdef GL_AMD_shader_stencil_value_export + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_value_export", 27)) + { + ret = GLEW_AMD_shader_stencil_value_export; + continue; + } +#endif +#ifdef GL_AMD_shader_trinary_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_trinary_minmax", 21)) + { + ret = GLEW_AMD_shader_trinary_minmax; + continue; + } +#endif +#ifdef GL_AMD_sparse_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) + { + ret = GLEW_AMD_sparse_texture; + continue; + } +#endif +#ifdef GL_AMD_stencil_operation_extended + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_operation_extended", 26)) + { + ret = GLEW_AMD_stencil_operation_extended; + continue; + } +#endif +#ifdef GL_AMD_texture_texture4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_texture4", 16)) + { + ret = GLEW_AMD_texture_texture4; + continue; + } +#endif +#ifdef GL_AMD_transform_feedback3_lines_triangles + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3_lines_triangles", 35)) + { + ret = GLEW_AMD_transform_feedback3_lines_triangles; + continue; + } +#endif +#ifdef GL_AMD_transform_feedback4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback4", 19)) + { + ret = GLEW_AMD_transform_feedback4; + continue; + } +#endif +#ifdef GL_AMD_vertex_shader_layer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_layer", 19)) + { + ret = GLEW_AMD_vertex_shader_layer; + continue; + } +#endif +#ifdef GL_AMD_vertex_shader_tessellator + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_tessellator", 25)) + { + ret = GLEW_AMD_vertex_shader_tessellator; + continue; + } +#endif +#ifdef GL_AMD_vertex_shader_viewport_index + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_viewport_index", 28)) + { + ret = GLEW_AMD_vertex_shader_viewport_index; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ANGLE_", 6)) + { +#ifdef GL_ANGLE_depth_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) + { + ret = GLEW_ANGLE_depth_texture; + continue; + } +#endif +#ifdef GL_ANGLE_framebuffer_blit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) + { + ret = GLEW_ANGLE_framebuffer_blit; + continue; + } +#endif +#ifdef GL_ANGLE_framebuffer_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) + { + ret = GLEW_ANGLE_framebuffer_multisample; + continue; + } +#endif +#ifdef GL_ANGLE_instanced_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) + { + ret = GLEW_ANGLE_instanced_arrays; + continue; + } +#endif +#ifdef GL_ANGLE_pack_reverse_row_order + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_reverse_row_order", 22)) + { + ret = GLEW_ANGLE_pack_reverse_row_order; + continue; + } +#endif +#ifdef GL_ANGLE_program_binary + if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_binary", 14)) + { + ret = GLEW_ANGLE_program_binary; + continue; + } +#endif +#ifdef GL_ANGLE_texture_compression_dxt1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) + { + ret = GLEW_ANGLE_texture_compression_dxt1; + continue; + } +#endif +#ifdef GL_ANGLE_texture_compression_dxt3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt3", 24)) + { + ret = GLEW_ANGLE_texture_compression_dxt3; + continue; + } +#endif +#ifdef GL_ANGLE_texture_compression_dxt5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt5", 24)) + { + ret = GLEW_ANGLE_texture_compression_dxt5; + continue; + } +#endif +#ifdef GL_ANGLE_texture_usage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_usage", 13)) + { + ret = GLEW_ANGLE_texture_usage; + continue; + } +#endif +#ifdef GL_ANGLE_timer_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) + { + ret = GLEW_ANGLE_timer_query; + continue; + } +#endif +#ifdef GL_ANGLE_translated_shader_source + if (_glewStrSame3(&pos, &len, (const GLubyte*)"translated_shader_source", 24)) + { + ret = GLEW_ANGLE_translated_shader_source; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6)) + { +#ifdef GL_APPLE_aux_depth_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"aux_depth_stencil", 17)) + { + ret = GLEW_APPLE_aux_depth_stencil; + continue; + } +#endif +#ifdef GL_APPLE_client_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_storage", 14)) + { + ret = GLEW_APPLE_client_storage; + continue; + } +#endif +#ifdef GL_APPLE_element_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) + { + ret = GLEW_APPLE_element_array; + continue; + } +#endif +#ifdef GL_APPLE_fence + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) + { + ret = GLEW_APPLE_fence; + continue; + } +#endif +#ifdef GL_APPLE_float_pixels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_pixels", 12)) + { + ret = GLEW_APPLE_float_pixels; + continue; + } +#endif +#ifdef GL_APPLE_flush_buffer_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_buffer_range", 18)) + { + ret = GLEW_APPLE_flush_buffer_range; + continue; + } +#endif +#ifdef GL_APPLE_object_purgeable + if (_glewStrSame3(&pos, &len, (const GLubyte*)"object_purgeable", 16)) + { + ret = GLEW_APPLE_object_purgeable; + continue; + } +#endif +#ifdef GL_APPLE_pixel_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer", 12)) + { + ret = GLEW_APPLE_pixel_buffer; + continue; + } +#endif +#ifdef GL_APPLE_rgb_422 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgb_422", 7)) + { + ret = GLEW_APPLE_rgb_422; + continue; + } +#endif +#ifdef GL_APPLE_row_bytes + if (_glewStrSame3(&pos, &len, (const GLubyte*)"row_bytes", 9)) + { + ret = GLEW_APPLE_row_bytes; + continue; + } +#endif +#ifdef GL_APPLE_specular_vector + if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_vector", 15)) + { + ret = GLEW_APPLE_specular_vector; + continue; + } +#endif +#ifdef GL_APPLE_texture_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) + { + ret = GLEW_APPLE_texture_range; + continue; + } +#endif +#ifdef GL_APPLE_transform_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_hint", 14)) + { + ret = GLEW_APPLE_transform_hint; + continue; + } +#endif +#ifdef GL_APPLE_vertex_array_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) + { + ret = GLEW_APPLE_vertex_array_object; + continue; + } +#endif +#ifdef GL_APPLE_vertex_array_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) + { + ret = GLEW_APPLE_vertex_array_range; + continue; + } +#endif +#ifdef GL_APPLE_vertex_program_evaluators + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program_evaluators", 25)) + { + ret = GLEW_APPLE_vertex_program_evaluators; + continue; + } +#endif +#ifdef GL_APPLE_ycbcr_422 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_422", 9)) + { + ret = GLEW_APPLE_ycbcr_422; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) + { +#ifdef GL_ARB_ES2_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES2_compatibility", 17)) + { + ret = GLEW_ARB_ES2_compatibility; + continue; + } +#endif +#ifdef GL_ARB_ES3_1_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_1_compatibility", 19)) + { + ret = GLEW_ARB_ES3_1_compatibility; + continue; + } +#endif +#ifdef GL_ARB_ES3_2_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_2_compatibility", 19)) + { + ret = GLEW_ARB_ES3_2_compatibility; + continue; + } +#endif +#ifdef GL_ARB_ES3_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES3_compatibility", 17)) + { + ret = GLEW_ARB_ES3_compatibility; + continue; + } +#endif +#ifdef GL_ARB_arrays_of_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"arrays_of_arrays", 16)) + { + ret = GLEW_ARB_arrays_of_arrays; + continue; + } +#endif +#ifdef GL_ARB_base_instance + if (_glewStrSame3(&pos, &len, (const GLubyte*)"base_instance", 13)) + { + ret = GLEW_ARB_base_instance; + continue; + } +#endif +#ifdef GL_ARB_bindless_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) + { + ret = GLEW_ARB_bindless_texture; + continue; + } +#endif +#ifdef GL_ARB_blend_func_extended + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19)) + { + ret = GLEW_ARB_blend_func_extended; + continue; + } +#endif +#ifdef GL_ARB_buffer_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_storage", 14)) + { + ret = GLEW_ARB_buffer_storage; + continue; + } +#endif +#ifdef GL_ARB_cl_event + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8)) + { + ret = GLEW_ARB_cl_event; + continue; + } +#endif +#ifdef GL_ARB_clear_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_buffer_object", 19)) + { + ret = GLEW_ARB_clear_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_clear_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clear_texture", 13)) + { + ret = GLEW_ARB_clear_texture; + continue; + } +#endif +#ifdef GL_ARB_clip_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_control", 12)) + { + ret = GLEW_ARB_clip_control; + continue; + } +#endif +#ifdef GL_ARB_color_buffer_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18)) + { + ret = GLEW_ARB_color_buffer_float; + continue; + } +#endif +#ifdef GL_ARB_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compatibility", 13)) + { + ret = GLEW_ARB_compatibility; + continue; + } +#endif +#ifdef GL_ARB_compressed_texture_pixel_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_texture_pixel_storage", 32)) + { + ret = GLEW_ARB_compressed_texture_pixel_storage; + continue; + } +#endif +#ifdef GL_ARB_compute_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_shader", 14)) + { + ret = GLEW_ARB_compute_shader; + continue; + } +#endif +#ifdef GL_ARB_compute_variable_group_size + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_variable_group_size", 27)) + { + ret = GLEW_ARB_compute_variable_group_size; + continue; + } +#endif +#ifdef GL_ARB_conditional_render_inverted + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render_inverted", 27)) + { + ret = GLEW_ARB_conditional_render_inverted; + continue; + } +#endif +#ifdef GL_ARB_conservative_depth + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18)) + { + ret = GLEW_ARB_conservative_depth; + continue; + } +#endif +#ifdef GL_ARB_copy_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) + { + ret = GLEW_ARB_copy_buffer; + continue; + } +#endif +#ifdef GL_ARB_copy_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) + { + ret = GLEW_ARB_copy_image; + continue; + } +#endif +#ifdef GL_ARB_cull_distance + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_distance", 13)) + { + ret = GLEW_ARB_cull_distance; + continue; + } +#endif +#ifdef GL_ARB_debug_output + if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12)) + { + ret = GLEW_ARB_debug_output; + continue; + } +#endif +#ifdef GL_ARB_depth_buffer_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) + { + ret = GLEW_ARB_depth_buffer_float; + continue; + } +#endif +#ifdef GL_ARB_depth_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) + { + ret = GLEW_ARB_depth_clamp; + continue; + } +#endif +#ifdef GL_ARB_depth_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) + { + ret = GLEW_ARB_depth_texture; + continue; + } +#endif +#ifdef GL_ARB_derivative_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"derivative_control", 18)) + { + ret = GLEW_ARB_derivative_control; + continue; + } +#endif +#ifdef GL_ARB_direct_state_access + if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) + { + ret = GLEW_ARB_direct_state_access; + continue; + } +#endif +#ifdef GL_ARB_draw_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) + { + ret = GLEW_ARB_draw_buffers; + continue; + } +#endif +#ifdef GL_ARB_draw_buffers_blend + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18)) + { + ret = GLEW_ARB_draw_buffers_blend; + continue; + } +#endif +#ifdef GL_ARB_draw_elements_base_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25)) + { + ret = GLEW_ARB_draw_elements_base_vertex; + continue; + } +#endif +#ifdef GL_ARB_draw_indirect + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_indirect", 13)) + { + ret = GLEW_ARB_draw_indirect; + continue; + } +#endif +#ifdef GL_ARB_draw_instanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) + { + ret = GLEW_ARB_draw_instanced; + continue; + } +#endif +#ifdef GL_ARB_enhanced_layouts + if (_glewStrSame3(&pos, &len, (const GLubyte*)"enhanced_layouts", 16)) + { + ret = GLEW_ARB_enhanced_layouts; + continue; + } +#endif +#ifdef GL_ARB_explicit_attrib_location + if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24)) + { + ret = GLEW_ARB_explicit_attrib_location; + continue; + } +#endif +#ifdef GL_ARB_explicit_uniform_location + if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_uniform_location", 25)) + { + ret = GLEW_ARB_explicit_uniform_location; + continue; + } +#endif +#ifdef GL_ARB_fragment_coord_conventions + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coord_conventions", 26)) + { + ret = GLEW_ARB_fragment_coord_conventions; + continue; + } +#endif +#ifdef GL_ARB_fragment_layer_viewport + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_layer_viewport", 23)) + { + ret = GLEW_ARB_fragment_layer_viewport; + continue; + } +#endif +#ifdef GL_ARB_fragment_program + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) + { + ret = GLEW_ARB_fragment_program; + continue; + } +#endif +#ifdef GL_ARB_fragment_program_shadow + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_shadow", 23)) + { + ret = GLEW_ARB_fragment_program_shadow; + continue; + } +#endif +#ifdef GL_ARB_fragment_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) + { + ret = GLEW_ARB_fragment_shader; + continue; + } +#endif +#ifdef GL_ARB_fragment_shader_interlock + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) + { + ret = GLEW_ARB_fragment_shader_interlock; + continue; + } +#endif +#ifdef GL_ARB_framebuffer_no_attachments + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_no_attachments", 26)) + { + ret = GLEW_ARB_framebuffer_no_attachments; + continue; + } +#endif +#ifdef GL_ARB_framebuffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) + { + ret = GLEW_ARB_framebuffer_object; + continue; + } +#endif +#ifdef GL_ARB_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = GLEW_ARB_framebuffer_sRGB; + continue; + } +#endif +#ifdef GL_ARB_geometry_shader4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) + { + ret = GLEW_ARB_geometry_shader4; + continue; + } +#endif +#ifdef GL_ARB_get_program_binary + if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_program_binary", 18)) + { + ret = GLEW_ARB_get_program_binary; + continue; + } +#endif +#ifdef GL_ARB_get_texture_sub_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_texture_sub_image", 21)) + { + ret = GLEW_ARB_get_texture_sub_image; + continue; + } +#endif +#ifdef GL_ARB_gpu_shader5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) + { + ret = GLEW_ARB_gpu_shader5; + continue; + } +#endif +#ifdef GL_ARB_gpu_shader_fp64 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_fp64", 15)) + { + ret = GLEW_ARB_gpu_shader_fp64; + continue; + } +#endif +#ifdef GL_ARB_gpu_shader_int64 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_int64", 16)) + { + ret = GLEW_ARB_gpu_shader_int64; + continue; + } +#endif +#ifdef GL_ARB_half_float_pixel + if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_pixel", 16)) + { + ret = GLEW_ARB_half_float_pixel; + continue; + } +#endif +#ifdef GL_ARB_half_float_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_vertex", 17)) + { + ret = GLEW_ARB_half_float_vertex; + continue; + } +#endif +#ifdef GL_ARB_imaging + if (_glewStrSame3(&pos, &len, (const GLubyte*)"imaging", 7)) + { + ret = GLEW_ARB_imaging; + continue; + } +#endif +#ifdef GL_ARB_indirect_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"indirect_parameters", 19)) + { + ret = GLEW_ARB_indirect_parameters; + continue; + } +#endif +#ifdef GL_ARB_instanced_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"instanced_arrays", 16)) + { + ret = GLEW_ARB_instanced_arrays; + continue; + } +#endif +#ifdef GL_ARB_internalformat_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query", 20)) + { + ret = GLEW_ARB_internalformat_query; + continue; + } +#endif +#ifdef GL_ARB_internalformat_query2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_query2", 21)) + { + ret = GLEW_ARB_internalformat_query2; + continue; + } +#endif +#ifdef GL_ARB_invalidate_subdata + if (_glewStrSame3(&pos, &len, (const GLubyte*)"invalidate_subdata", 18)) + { + ret = GLEW_ARB_invalidate_subdata; + continue; + } +#endif +#ifdef GL_ARB_map_buffer_alignment + if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_alignment", 20)) + { + ret = GLEW_ARB_map_buffer_alignment; + continue; + } +#endif +#ifdef GL_ARB_map_buffer_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_buffer_range", 16)) + { + ret = GLEW_ARB_map_buffer_range; + continue; + } +#endif +#ifdef GL_ARB_matrix_palette + if (_glewStrSame3(&pos, &len, (const GLubyte*)"matrix_palette", 14)) + { + ret = GLEW_ARB_matrix_palette; + continue; + } +#endif +#ifdef GL_ARB_multi_bind + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_bind", 10)) + { + ret = GLEW_ARB_multi_bind; + continue; + } +#endif +#ifdef GL_ARB_multi_draw_indirect + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_indirect", 19)) + { + ret = GLEW_ARB_multi_draw_indirect; + continue; + } +#endif +#ifdef GL_ARB_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLEW_ARB_multisample; + continue; + } +#endif +#ifdef GL_ARB_multitexture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multitexture", 12)) + { + ret = GLEW_ARB_multitexture; + continue; + } +#endif +#ifdef GL_ARB_occlusion_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) + { + ret = GLEW_ARB_occlusion_query; + continue; + } +#endif +#ifdef GL_ARB_occlusion_query2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query2", 16)) + { + ret = GLEW_ARB_occlusion_query2; + continue; + } +#endif +#ifdef GL_ARB_parallel_shader_compile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_shader_compile", 23)) + { + ret = GLEW_ARB_parallel_shader_compile; + continue; + } +#endif +#ifdef GL_ARB_pipeline_statistics_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pipeline_statistics_query", 25)) + { + ret = GLEW_ARB_pipeline_statistics_query; + continue; + } +#endif +#ifdef GL_ARB_pixel_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) + { + ret = GLEW_ARB_pixel_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_point_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) + { + ret = GLEW_ARB_point_parameters; + continue; + } +#endif +#ifdef GL_ARB_point_sprite + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) + { + ret = GLEW_ARB_point_sprite; + continue; + } +#endif +#ifdef GL_ARB_post_depth_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) + { + ret = GLEW_ARB_post_depth_coverage; + continue; + } +#endif +#ifdef GL_ARB_program_interface_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"program_interface_query", 23)) + { + ret = GLEW_ARB_program_interface_query; + continue; + } +#endif +#ifdef GL_ARB_provoking_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) + { + ret = GLEW_ARB_provoking_vertex; + continue; + } +#endif +#ifdef GL_ARB_query_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_buffer_object", 19)) + { + ret = GLEW_ARB_query_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_robust_buffer_access_behavior + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) + { + ret = GLEW_ARB_robust_buffer_access_behavior; + continue; + } +#endif +#ifdef GL_ARB_robustness + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) + { + ret = GLEW_ARB_robustness; + continue; + } +#endif +#ifdef GL_ARB_robustness_application_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) + { + ret = GLEW_ARB_robustness_application_isolation; + continue; + } +#endif +#ifdef GL_ARB_robustness_share_group_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) + { + ret = GLEW_ARB_robustness_share_group_isolation; + continue; + } +#endif +#ifdef GL_ARB_sample_locations + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) + { + ret = GLEW_ARB_sample_locations; + continue; + } +#endif +#ifdef GL_ARB_sample_shading + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_shading", 14)) + { + ret = GLEW_ARB_sample_shading; + continue; + } +#endif +#ifdef GL_ARB_sampler_objects + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sampler_objects", 15)) + { + ret = GLEW_ARB_sampler_objects; + continue; + } +#endif +#ifdef GL_ARB_seamless_cube_map + if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cube_map", 17)) + { + ret = GLEW_ARB_seamless_cube_map; + continue; + } +#endif +#ifdef GL_ARB_seamless_cubemap_per_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28)) + { + ret = GLEW_ARB_seamless_cubemap_per_texture; + continue; + } +#endif +#ifdef GL_ARB_separate_shader_objects + if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) + { + ret = GLEW_ARB_separate_shader_objects; + continue; + } +#endif +#ifdef GL_ARB_shader_atomic_counter_ops + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counter_ops", 25)) + { + ret = GLEW_ARB_shader_atomic_counter_ops; + continue; + } +#endif +#ifdef GL_ARB_shader_atomic_counters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) + { + ret = GLEW_ARB_shader_atomic_counters; + continue; + } +#endif +#ifdef GL_ARB_shader_ballot + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_ballot", 13)) + { + ret = GLEW_ARB_shader_ballot; + continue; + } +#endif +#ifdef GL_ARB_shader_bit_encoding + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_bit_encoding", 19)) + { + ret = GLEW_ARB_shader_bit_encoding; + continue; + } +#endif +#ifdef GL_ARB_shader_clock + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_clock", 12)) + { + ret = GLEW_ARB_shader_clock; + continue; + } +#endif +#ifdef GL_ARB_shader_draw_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_draw_parameters", 22)) + { + ret = GLEW_ARB_shader_draw_parameters; + continue; + } +#endif +#ifdef GL_ARB_shader_group_vote + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_group_vote", 17)) + { + ret = GLEW_ARB_shader_group_vote; + continue; + } +#endif +#ifdef GL_ARB_shader_image_load_store + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) + { + ret = GLEW_ARB_shader_image_load_store; + continue; + } +#endif +#ifdef GL_ARB_shader_image_size + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_size", 17)) + { + ret = GLEW_ARB_shader_image_size; + continue; + } +#endif +#ifdef GL_ARB_shader_objects + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_objects", 14)) + { + ret = GLEW_ARB_shader_objects; + continue; + } +#endif +#ifdef GL_ARB_shader_precision + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_precision", 16)) + { + ret = GLEW_ARB_shader_precision; + continue; + } +#endif +#ifdef GL_ARB_shader_stencil_export + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21)) + { + ret = GLEW_ARB_shader_stencil_export; + continue; + } +#endif +#ifdef GL_ARB_shader_storage_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) + { + ret = GLEW_ARB_shader_storage_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_shader_subroutine + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_subroutine", 17)) + { + ret = GLEW_ARB_shader_subroutine; + continue; + } +#endif +#ifdef GL_ARB_shader_texture_image_samples + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_image_samples", 28)) + { + ret = GLEW_ARB_shader_texture_image_samples; + continue; + } +#endif +#ifdef GL_ARB_shader_texture_lod + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) + { + ret = GLEW_ARB_shader_texture_lod; + continue; + } +#endif +#ifdef GL_ARB_shader_viewport_layer_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_viewport_layer_array", 27)) + { + ret = GLEW_ARB_shader_viewport_layer_array; + continue; + } +#endif +#ifdef GL_ARB_shading_language_100 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_100", 20)) + { + ret = GLEW_ARB_shading_language_100; + continue; + } +#endif +#ifdef GL_ARB_shading_language_420pack + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_420pack", 24)) + { + ret = GLEW_ARB_shading_language_420pack; + continue; + } +#endif +#ifdef GL_ARB_shading_language_include + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_include", 24)) + { + ret = GLEW_ARB_shading_language_include; + continue; + } +#endif +#ifdef GL_ARB_shading_language_packing + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_packing", 24)) + { + ret = GLEW_ARB_shading_language_packing; + continue; + } +#endif +#ifdef GL_ARB_shadow + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) + { + ret = GLEW_ARB_shadow; + continue; + } +#endif +#ifdef GL_ARB_shadow_ambient + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) + { + ret = GLEW_ARB_shadow_ambient; + continue; + } +#endif +#ifdef GL_ARB_sparse_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_buffer", 13)) + { + ret = GLEW_ARB_sparse_buffer; + continue; + } +#endif +#ifdef GL_ARB_sparse_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture", 14)) + { + ret = GLEW_ARB_sparse_texture; + continue; + } +#endif +#ifdef GL_ARB_sparse_texture2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) + { + ret = GLEW_ARB_sparse_texture2; + continue; + } +#endif +#ifdef GL_ARB_sparse_texture_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture_clamp", 20)) + { + ret = GLEW_ARB_sparse_texture_clamp; + continue; + } +#endif +#ifdef GL_ARB_stencil_texturing + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_texturing", 17)) + { + ret = GLEW_ARB_stencil_texturing; + continue; + } +#endif +#ifdef GL_ARB_sync + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4)) + { + ret = GLEW_ARB_sync; + continue; + } +#endif +#ifdef GL_ARB_tessellation_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_shader", 19)) + { + ret = GLEW_ARB_tessellation_shader; + continue; + } +#endif +#ifdef GL_ARB_texture_barrier + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) + { + ret = GLEW_ARB_texture_barrier; + continue; + } +#endif +#ifdef GL_ARB_texture_border_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) + { + ret = GLEW_ARB_texture_border_clamp; + continue; + } +#endif +#ifdef GL_ARB_texture_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) + { + ret = GLEW_ARB_texture_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_texture_buffer_object_rgb32 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object_rgb32", 27)) + { + ret = GLEW_ARB_texture_buffer_object_rgb32; + continue; + } +#endif +#ifdef GL_ARB_texture_buffer_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_range", 20)) + { + ret = GLEW_ARB_texture_buffer_range; + continue; + } +#endif +#ifdef GL_ARB_texture_compression + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression", 19)) + { + ret = GLEW_ARB_texture_compression; + continue; + } +#endif +#ifdef GL_ARB_texture_compression_bptc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24)) + { + ret = GLEW_ARB_texture_compression_bptc; + continue; + } +#endif +#ifdef GL_ARB_texture_compression_rgtc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) + { + ret = GLEW_ARB_texture_compression_rgtc; + continue; + } +#endif +#ifdef GL_ARB_texture_cube_map + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) + { + ret = GLEW_ARB_texture_cube_map; + continue; + } +#endif +#ifdef GL_ARB_texture_cube_map_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22)) + { + ret = GLEW_ARB_texture_cube_map_array; + continue; + } +#endif +#ifdef GL_ARB_texture_env_add + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) + { + ret = GLEW_ARB_texture_env_add; + continue; + } +#endif +#ifdef GL_ARB_texture_env_combine + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) + { + ret = GLEW_ARB_texture_env_combine; + continue; + } +#endif +#ifdef GL_ARB_texture_env_crossbar + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_crossbar", 20)) + { + ret = GLEW_ARB_texture_env_crossbar; + continue; + } +#endif +#ifdef GL_ARB_texture_env_dot3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) + { + ret = GLEW_ARB_texture_env_dot3; + continue; + } +#endif +#ifdef GL_ARB_texture_filter_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) + { + ret = GLEW_ARB_texture_filter_minmax; + continue; + } +#endif +#ifdef GL_ARB_texture_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) + { + ret = GLEW_ARB_texture_float; + continue; + } +#endif +#ifdef GL_ARB_texture_gather + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather", 14)) + { + ret = GLEW_ARB_texture_gather; + continue; + } +#endif +#ifdef GL_ARB_texture_mirror_clamp_to_edge + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp_to_edge", 28)) + { + ret = GLEW_ARB_texture_mirror_clamp_to_edge; + continue; + } +#endif +#ifdef GL_ARB_texture_mirrored_repeat + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) + { + ret = GLEW_ARB_texture_mirrored_repeat; + continue; + } +#endif +#ifdef GL_ARB_texture_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) + { + ret = GLEW_ARB_texture_multisample; + continue; + } +#endif +#ifdef GL_ARB_texture_non_power_of_two + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_non_power_of_two", 24)) + { + ret = GLEW_ARB_texture_non_power_of_two; + continue; + } +#endif +#ifdef GL_ARB_texture_query_levels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_levels", 20)) + { + ret = GLEW_ARB_texture_query_levels; + continue; + } +#endif +#ifdef GL_ARB_texture_query_lod + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_lod", 17)) + { + ret = GLEW_ARB_texture_query_lod; + continue; + } +#endif +#ifdef GL_ARB_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) + { + ret = GLEW_ARB_texture_rectangle; + continue; + } +#endif +#ifdef GL_ARB_texture_rg + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rg", 10)) + { + ret = GLEW_ARB_texture_rg; + continue; + } +#endif +#ifdef GL_ARB_texture_rgb10_a2ui + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rgb10_a2ui", 18)) + { + ret = GLEW_ARB_texture_rgb10_a2ui; + continue; + } +#endif +#ifdef GL_ARB_texture_stencil8 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stencil8", 16)) + { + ret = GLEW_ARB_texture_stencil8; + continue; + } +#endif +#ifdef GL_ARB_texture_storage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage", 15)) + { + ret = GLEW_ARB_texture_storage; + continue; + } +#endif +#ifdef GL_ARB_texture_storage_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_storage_multisample", 27)) + { + ret = GLEW_ARB_texture_storage_multisample; + continue; + } +#endif +#ifdef GL_ARB_texture_swizzle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) + { + ret = GLEW_ARB_texture_swizzle; + continue; + } +#endif +#ifdef GL_ARB_texture_view + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_view", 12)) + { + ret = GLEW_ARB_texture_view; + continue; + } +#endif +#ifdef GL_ARB_timer_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) + { + ret = GLEW_ARB_timer_query; + continue; + } +#endif +#ifdef GL_ARB_transform_feedback2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) + { + ret = GLEW_ARB_transform_feedback2; + continue; + } +#endif +#ifdef GL_ARB_transform_feedback3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3", 19)) + { + ret = GLEW_ARB_transform_feedback3; + continue; + } +#endif +#ifdef GL_ARB_transform_feedback_instanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_instanced", 28)) + { + ret = GLEW_ARB_transform_feedback_instanced; + continue; + } +#endif +#ifdef GL_ARB_transform_feedback_overflow_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback_overflow_query", 33)) + { + ret = GLEW_ARB_transform_feedback_overflow_query; + continue; + } +#endif +#ifdef GL_ARB_transpose_matrix + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transpose_matrix", 16)) + { + ret = GLEW_ARB_transpose_matrix; + continue; + } +#endif +#ifdef GL_ARB_uniform_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_object", 21)) + { + ret = GLEW_ARB_uniform_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_vertex_array_bgra + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) + { + ret = GLEW_ARB_vertex_array_bgra; + continue; + } +#endif +#ifdef GL_ARB_vertex_array_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) + { + ret = GLEW_ARB_vertex_array_object; + continue; + } +#endif +#ifdef GL_ARB_vertex_attrib_64bit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) + { + ret = GLEW_ARB_vertex_attrib_64bit; + continue; + } +#endif +#ifdef GL_ARB_vertex_attrib_binding + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_binding", 21)) + { + ret = GLEW_ARB_vertex_attrib_binding; + continue; + } +#endif +#ifdef GL_ARB_vertex_blend + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_blend", 12)) + { + ret = GLEW_ARB_vertex_blend; + continue; + } +#endif +#ifdef GL_ARB_vertex_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) + { + ret = GLEW_ARB_vertex_buffer_object; + continue; + } +#endif +#ifdef GL_ARB_vertex_program + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) + { + ret = GLEW_ARB_vertex_program; + continue; + } +#endif +#ifdef GL_ARB_vertex_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) + { + ret = GLEW_ARB_vertex_shader; + continue; + } +#endif +#ifdef GL_ARB_vertex_type_10f_11f_11f_rev + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_10f_11f_11f_rev", 27)) + { + ret = GLEW_ARB_vertex_type_10f_11f_11f_rev; + continue; + } +#endif +#ifdef GL_ARB_vertex_type_2_10_10_10_rev + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_2_10_10_10_rev", 26)) + { + ret = GLEW_ARB_vertex_type_2_10_10_10_rev; + continue; + } +#endif +#ifdef GL_ARB_viewport_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14)) + { + ret = GLEW_ARB_viewport_array; + continue; + } +#endif +#ifdef GL_ARB_window_pos + if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) + { + ret = GLEW_ARB_window_pos; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATIX_", 5)) + { +#ifdef GL_ATIX_point_sprites + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprites", 13)) + { + ret = GLEW_ATIX_point_sprites; + continue; + } +#endif +#ifdef GL_ATIX_texture_env_combine3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) + { + ret = GLEW_ATIX_texture_env_combine3; + continue; + } +#endif +#ifdef GL_ATIX_texture_env_route + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_route", 17)) + { + ret = GLEW_ATIX_texture_env_route; + continue; + } +#endif +#ifdef GL_ATIX_vertex_shader_output_point_size + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_output_point_size", 31)) + { + ret = GLEW_ATIX_vertex_shader_output_point_size; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) + { +#ifdef GL_ATI_draw_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers", 12)) + { + ret = GLEW_ATI_draw_buffers; + continue; + } +#endif +#ifdef GL_ATI_element_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"element_array", 13)) + { + ret = GLEW_ATI_element_array; + continue; + } +#endif +#ifdef GL_ATI_envmap_bumpmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"envmap_bumpmap", 14)) + { + ret = GLEW_ATI_envmap_bumpmap; + continue; + } +#endif +#ifdef GL_ATI_fragment_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader", 15)) + { + ret = GLEW_ATI_fragment_shader; + continue; + } +#endif +#ifdef GL_ATI_map_object_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_object_buffer", 17)) + { + ret = GLEW_ATI_map_object_buffer; + continue; + } +#endif +#ifdef GL_ATI_meminfo + if (_glewStrSame3(&pos, &len, (const GLubyte*)"meminfo", 7)) + { + ret = GLEW_ATI_meminfo; + continue; + } +#endif +#ifdef GL_ATI_pn_triangles + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pn_triangles", 12)) + { + ret = GLEW_ATI_pn_triangles; + continue; + } +#endif +#ifdef GL_ATI_separate_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_stencil", 16)) + { + ret = GLEW_ATI_separate_stencil; + continue; + } +#endif +#ifdef GL_ATI_shader_texture_lod + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18)) + { + ret = GLEW_ATI_shader_texture_lod; + continue; + } +#endif +#ifdef GL_ATI_text_fragment_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"text_fragment_shader", 20)) + { + ret = GLEW_ATI_text_fragment_shader; + continue; + } +#endif +#ifdef GL_ATI_texture_compression_3dc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_3dc", 23)) + { + ret = GLEW_ATI_texture_compression_3dc; + continue; + } +#endif +#ifdef GL_ATI_texture_env_combine3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine3", 20)) + { + ret = GLEW_ATI_texture_env_combine3; + continue; + } +#endif +#ifdef GL_ATI_texture_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_float", 13)) + { + ret = GLEW_ATI_texture_float; + continue; + } +#endif +#ifdef GL_ATI_texture_mirror_once + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_once", 19)) + { + ret = GLEW_ATI_texture_mirror_once; + continue; + } +#endif +#ifdef GL_ATI_vertex_array_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19)) + { + ret = GLEW_ATI_vertex_array_object; + continue; + } +#endif +#ifdef GL_ATI_vertex_attrib_array_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_array_object", 26)) + { + ret = GLEW_ATI_vertex_attrib_array_object; + continue; + } +#endif +#ifdef GL_ATI_vertex_streams + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_streams", 14)) + { + ret = GLEW_ATI_vertex_streams; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) + { +#ifdef GL_EXT_422_pixels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"422_pixels", 10)) + { + ret = GLEW_EXT_422_pixels; + continue; + } +#endif +#ifdef GL_EXT_Cg_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"Cg_shader", 9)) + { + ret = GLEW_EXT_Cg_shader; + continue; + } +#endif +#ifdef GL_EXT_abgr + if (_glewStrSame3(&pos, &len, (const GLubyte*)"abgr", 4)) + { + ret = GLEW_EXT_abgr; + continue; + } +#endif +#ifdef GL_EXT_bgra + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bgra", 4)) + { + ret = GLEW_EXT_bgra; + continue; + } +#endif +#ifdef GL_EXT_bindable_uniform + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindable_uniform", 16)) + { + ret = GLEW_EXT_bindable_uniform; + continue; + } +#endif +#ifdef GL_EXT_blend_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_color", 11)) + { + ret = GLEW_EXT_blend_color; + continue; + } +#endif +#ifdef GL_EXT_blend_equation_separate + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_separate", 23)) + { + ret = GLEW_EXT_blend_equation_separate; + continue; + } +#endif +#ifdef GL_EXT_blend_func_separate + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_separate", 19)) + { + ret = GLEW_EXT_blend_func_separate; + continue; + } +#endif +#ifdef GL_EXT_blend_logic_op + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_logic_op", 14)) + { + ret = GLEW_EXT_blend_logic_op; + continue; + } +#endif +#ifdef GL_EXT_blend_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_minmax", 12)) + { + ret = GLEW_EXT_blend_minmax; + continue; + } +#endif +#ifdef GL_EXT_blend_subtract + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_subtract", 14)) + { + ret = GLEW_EXT_blend_subtract; + continue; + } +#endif +#ifdef GL_EXT_clip_volume_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clip_volume_hint", 16)) + { + ret = GLEW_EXT_clip_volume_hint; + continue; + } +#endif +#ifdef GL_EXT_cmyka + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cmyka", 5)) + { + ret = GLEW_EXT_cmyka; + continue; + } +#endif +#ifdef GL_EXT_color_subtable + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_subtable", 14)) + { + ret = GLEW_EXT_color_subtable; + continue; + } +#endif +#ifdef GL_EXT_compiled_vertex_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compiled_vertex_array", 21)) + { + ret = GLEW_EXT_compiled_vertex_array; + continue; + } +#endif +#ifdef GL_EXT_convolution + if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution", 11)) + { + ret = GLEW_EXT_convolution; + continue; + } +#endif +#ifdef GL_EXT_coordinate_frame + if (_glewStrSame3(&pos, &len, (const GLubyte*)"coordinate_frame", 16)) + { + ret = GLEW_EXT_coordinate_frame; + continue; + } +#endif +#ifdef GL_EXT_copy_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_texture", 12)) + { + ret = GLEW_EXT_copy_texture; + continue; + } +#endif +#ifdef GL_EXT_cull_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) + { + ret = GLEW_EXT_cull_vertex; + continue; + } +#endif +#ifdef GL_EXT_debug_label + if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_label", 11)) + { + ret = GLEW_EXT_debug_label; + continue; + } +#endif +#ifdef GL_EXT_debug_marker + if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_marker", 12)) + { + ret = GLEW_EXT_debug_marker; + continue; + } +#endif +#ifdef GL_EXT_depth_bounds_test + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_bounds_test", 17)) + { + ret = GLEW_EXT_depth_bounds_test; + continue; + } +#endif +#ifdef GL_EXT_direct_state_access + if (_glewStrSame3(&pos, &len, (const GLubyte*)"direct_state_access", 19)) + { + ret = GLEW_EXT_direct_state_access; + continue; + } +#endif +#ifdef GL_EXT_draw_buffers2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers2", 13)) + { + ret = GLEW_EXT_draw_buffers2; + continue; + } +#endif +#ifdef GL_EXT_draw_instanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14)) + { + ret = GLEW_EXT_draw_instanced; + continue; + } +#endif +#ifdef GL_EXT_draw_range_elements + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_range_elements", 19)) + { + ret = GLEW_EXT_draw_range_elements; + continue; + } +#endif +#ifdef GL_EXT_fog_coord + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_coord", 9)) + { + ret = GLEW_EXT_fog_coord; + continue; + } +#endif +#ifdef GL_EXT_fragment_lighting + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_lighting", 17)) + { + ret = GLEW_EXT_fragment_lighting; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_blit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_blit", 16)) + { + ret = GLEW_EXT_framebuffer_blit; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample", 23)) + { + ret = GLEW_EXT_framebuffer_multisample; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_multisample_blit_scaled + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_blit_scaled", 35)) + { + ret = GLEW_EXT_framebuffer_multisample_blit_scaled; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_object", 18)) + { + ret = GLEW_EXT_framebuffer_object; + continue; + } +#endif +#ifdef GL_EXT_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = GLEW_EXT_framebuffer_sRGB; + continue; + } +#endif +#ifdef GL_EXT_geometry_shader4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) + { + ret = GLEW_EXT_geometry_shader4; + continue; + } +#endif +#ifdef GL_EXT_gpu_program_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_parameters", 22)) + { + ret = GLEW_EXT_gpu_program_parameters; + continue; + } +#endif +#ifdef GL_EXT_gpu_shader4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader4", 11)) + { + ret = GLEW_EXT_gpu_shader4; + continue; + } +#endif +#ifdef GL_EXT_histogram + if (_glewStrSame3(&pos, &len, (const GLubyte*)"histogram", 9)) + { + ret = GLEW_EXT_histogram; + continue; + } +#endif +#ifdef GL_EXT_index_array_formats + if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_array_formats", 19)) + { + ret = GLEW_EXT_index_array_formats; + continue; + } +#endif +#ifdef GL_EXT_index_func + if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_func", 10)) + { + ret = GLEW_EXT_index_func; + continue; + } +#endif +#ifdef GL_EXT_index_material + if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_material", 14)) + { + ret = GLEW_EXT_index_material; + continue; + } +#endif +#ifdef GL_EXT_index_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"index_texture", 13)) + { + ret = GLEW_EXT_index_texture; + continue; + } +#endif +#ifdef GL_EXT_light_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_texture", 13)) + { + ret = GLEW_EXT_light_texture; + continue; + } +#endif +#ifdef GL_EXT_misc_attribute + if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_attribute", 14)) + { + ret = GLEW_EXT_misc_attribute; + continue; + } +#endif +#ifdef GL_EXT_multi_draw_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multi_draw_arrays", 17)) + { + ret = GLEW_EXT_multi_draw_arrays; + continue; + } +#endif +#ifdef GL_EXT_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLEW_EXT_multisample; + continue; + } +#endif +#ifdef GL_EXT_packed_depth_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) + { + ret = GLEW_EXT_packed_depth_stencil; + continue; + } +#endif +#ifdef GL_EXT_packed_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_float", 12)) + { + ret = GLEW_EXT_packed_float; + continue; + } +#endif +#ifdef GL_EXT_packed_pixels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_pixels", 13)) + { + ret = GLEW_EXT_packed_pixels; + continue; + } +#endif +#ifdef GL_EXT_paletted_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"paletted_texture", 16)) + { + ret = GLEW_EXT_paletted_texture; + continue; + } +#endif +#ifdef GL_EXT_pixel_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19)) + { + ret = GLEW_EXT_pixel_buffer_object; + continue; + } +#endif +#ifdef GL_EXT_pixel_transform + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform", 15)) + { + ret = GLEW_EXT_pixel_transform; + continue; + } +#endif +#ifdef GL_EXT_pixel_transform_color_table + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_transform_color_table", 27)) + { + ret = GLEW_EXT_pixel_transform_color_table; + continue; + } +#endif +#ifdef GL_EXT_point_parameters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_parameters", 16)) + { + ret = GLEW_EXT_point_parameters; + continue; + } +#endif +#ifdef GL_EXT_polygon_offset + if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset", 14)) + { + ret = GLEW_EXT_polygon_offset; + continue; + } +#endif +#ifdef GL_EXT_polygon_offset_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"polygon_offset_clamp", 20)) + { + ret = GLEW_EXT_polygon_offset_clamp; + continue; + } +#endif +#ifdef GL_EXT_post_depth_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"post_depth_coverage", 19)) + { + ret = GLEW_EXT_post_depth_coverage; + continue; + } +#endif +#ifdef GL_EXT_provoking_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16)) + { + ret = GLEW_EXT_provoking_vertex; + continue; + } +#endif +#ifdef GL_EXT_raster_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"raster_multisample", 18)) + { + ret = GLEW_EXT_raster_multisample; + continue; + } +#endif +#ifdef GL_EXT_rescale_normal + if (_glewStrSame3(&pos, &len, (const GLubyte*)"rescale_normal", 14)) + { + ret = GLEW_EXT_rescale_normal; + continue; + } +#endif +#ifdef GL_EXT_scene_marker + if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) + { + ret = GLEW_EXT_scene_marker; + continue; + } +#endif +#ifdef GL_EXT_secondary_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"secondary_color", 15)) + { + ret = GLEW_EXT_secondary_color; + continue; + } +#endif +#ifdef GL_EXT_separate_shader_objects + if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23)) + { + ret = GLEW_EXT_separate_shader_objects; + continue; + } +#endif +#ifdef GL_EXT_separate_specular_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_specular_color", 23)) + { + ret = GLEW_EXT_separate_specular_color; + continue; + } +#endif +#ifdef GL_EXT_shader_image_load_formatted + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_formatted", 27)) + { + ret = GLEW_EXT_shader_image_load_formatted; + continue; + } +#endif +#ifdef GL_EXT_shader_image_load_store + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23)) + { + ret = GLEW_EXT_shader_image_load_store; + continue; + } +#endif +#ifdef GL_EXT_shader_integer_mix + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_integer_mix", 18)) + { + ret = GLEW_EXT_shader_integer_mix; + continue; + } +#endif +#ifdef GL_EXT_shadow_funcs + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_funcs", 12)) + { + ret = GLEW_EXT_shadow_funcs; + continue; + } +#endif +#ifdef GL_EXT_shared_texture_palette + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_texture_palette", 22)) + { + ret = GLEW_EXT_shared_texture_palette; + continue; + } +#endif +#ifdef GL_EXT_sparse_texture2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sparse_texture2", 15)) + { + ret = GLEW_EXT_sparse_texture2; + continue; + } +#endif +#ifdef GL_EXT_stencil_clear_tag + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_clear_tag", 17)) + { + ret = GLEW_EXT_stencil_clear_tag; + continue; + } +#endif +#ifdef GL_EXT_stencil_two_side + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_two_side", 16)) + { + ret = GLEW_EXT_stencil_two_side; + continue; + } +#endif +#ifdef GL_EXT_stencil_wrap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stencil_wrap", 12)) + { + ret = GLEW_EXT_stencil_wrap; + continue; + } +#endif +#ifdef GL_EXT_subtexture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"subtexture", 10)) + { + ret = GLEW_EXT_subtexture; + continue; + } +#endif +#ifdef GL_EXT_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture", 7)) + { + ret = GLEW_EXT_texture; + continue; + } +#endif +#ifdef GL_EXT_texture3D + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture3D", 9)) + { + ret = GLEW_EXT_texture3D; + continue; + } +#endif +#ifdef GL_EXT_texture_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_array", 13)) + { + ret = GLEW_EXT_texture_array; + continue; + } +#endif +#ifdef GL_EXT_texture_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object", 21)) + { + ret = GLEW_EXT_texture_buffer_object; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_dxt1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_dxt1", 24)) + { + ret = GLEW_EXT_texture_compression_dxt1; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_latc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_latc", 24)) + { + ret = GLEW_EXT_texture_compression_latc; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_rgtc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24)) + { + ret = GLEW_EXT_texture_compression_rgtc; + continue; + } +#endif +#ifdef GL_EXT_texture_compression_s3tc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_s3tc", 24)) + { + ret = GLEW_EXT_texture_compression_s3tc; + continue; + } +#endif +#ifdef GL_EXT_texture_cube_map + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map", 16)) + { + ret = GLEW_EXT_texture_cube_map; + continue; + } +#endif +#ifdef GL_EXT_texture_edge_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) + { + ret = GLEW_EXT_texture_edge_clamp; + continue; + } +#endif +#ifdef GL_EXT_texture_env + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env", 11)) + { + ret = GLEW_EXT_texture_env; + continue; + } +#endif +#ifdef GL_EXT_texture_env_add + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15)) + { + ret = GLEW_EXT_texture_env_add; + continue; + } +#endif +#ifdef GL_EXT_texture_env_combine + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine", 19)) + { + ret = GLEW_EXT_texture_env_combine; + continue; + } +#endif +#ifdef GL_EXT_texture_env_dot3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_dot3", 16)) + { + ret = GLEW_EXT_texture_env_dot3; + continue; + } +#endif +#ifdef GL_EXT_texture_filter_anisotropic + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_anisotropic", 26)) + { + ret = GLEW_EXT_texture_filter_anisotropic; + continue; + } +#endif +#ifdef GL_EXT_texture_filter_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter_minmax", 21)) + { + ret = GLEW_EXT_texture_filter_minmax; + continue; + } +#endif +#ifdef GL_EXT_texture_integer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_integer", 15)) + { + ret = GLEW_EXT_texture_integer; + continue; + } +#endif +#ifdef GL_EXT_texture_lod_bias + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) + { + ret = GLEW_EXT_texture_lod_bias; + continue; + } +#endif +#ifdef GL_EXT_texture_mirror_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirror_clamp", 20)) + { + ret = GLEW_EXT_texture_mirror_clamp; + continue; + } +#endif +#ifdef GL_EXT_texture_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_object", 14)) + { + ret = GLEW_EXT_texture_object; + continue; + } +#endif +#ifdef GL_EXT_texture_perturb_normal + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_perturb_normal", 22)) + { + ret = GLEW_EXT_texture_perturb_normal; + continue; + } +#endif +#ifdef GL_EXT_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) + { + ret = GLEW_EXT_texture_rectangle; + continue; + } +#endif +#ifdef GL_EXT_texture_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB", 12)) + { + ret = GLEW_EXT_texture_sRGB; + continue; + } +#endif +#ifdef GL_EXT_texture_sRGB_decode + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_decode", 19)) + { + ret = GLEW_EXT_texture_sRGB_decode; + continue; + } +#endif +#ifdef GL_EXT_texture_shared_exponent + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shared_exponent", 23)) + { + ret = GLEW_EXT_texture_shared_exponent; + continue; + } +#endif +#ifdef GL_EXT_texture_snorm + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_snorm", 13)) + { + ret = GLEW_EXT_texture_snorm; + continue; + } +#endif +#ifdef GL_EXT_texture_swizzle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15)) + { + ret = GLEW_EXT_texture_swizzle; + continue; + } +#endif +#ifdef GL_EXT_timer_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11)) + { + ret = GLEW_EXT_timer_query; + continue; + } +#endif +#ifdef GL_EXT_transform_feedback + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) + { + ret = GLEW_EXT_transform_feedback; + continue; + } +#endif +#ifdef GL_EXT_vertex_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array", 12)) + { + ret = GLEW_EXT_vertex_array; + continue; + } +#endif +#ifdef GL_EXT_vertex_array_bgra + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17)) + { + ret = GLEW_EXT_vertex_array_bgra; + continue; + } +#endif +#ifdef GL_EXT_vertex_attrib_64bit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19)) + { + ret = GLEW_EXT_vertex_attrib_64bit; + continue; + } +#endif +#ifdef GL_EXT_vertex_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13)) + { + ret = GLEW_EXT_vertex_shader; + continue; + } +#endif +#ifdef GL_EXT_vertex_weighting + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_weighting", 16)) + { + ret = GLEW_EXT_vertex_weighting; + continue; + } +#endif +#ifdef GL_EXT_x11_sync_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"x11_sync_object", 15)) + { + ret = GLEW_EXT_x11_sync_object; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"GREMEDY_", 8)) + { +#ifdef GL_GREMEDY_frame_terminator + if (_glewStrSame3(&pos, &len, (const GLubyte*)"frame_terminator", 16)) + { + ret = GLEW_GREMEDY_frame_terminator; + continue; + } +#endif +#ifdef GL_GREMEDY_string_marker + if (_glewStrSame3(&pos, &len, (const GLubyte*)"string_marker", 13)) + { + ret = GLEW_GREMEDY_string_marker; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"HP_", 3)) + { +#ifdef GL_HP_convolution_border_modes + if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) + { + ret = GLEW_HP_convolution_border_modes; + continue; + } +#endif +#ifdef GL_HP_image_transform + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_transform", 15)) + { + ret = GLEW_HP_image_transform; + continue; + } +#endif +#ifdef GL_HP_occlusion_test + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_test", 14)) + { + ret = GLEW_HP_occlusion_test; + continue; + } +#endif +#ifdef GL_HP_texture_lighting + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lighting", 16)) + { + ret = GLEW_HP_texture_lighting; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"IBM_", 4)) + { +#ifdef GL_IBM_cull_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cull_vertex", 11)) + { + ret = GLEW_IBM_cull_vertex; + continue; + } +#endif +#ifdef GL_IBM_multimode_draw_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multimode_draw_arrays", 21)) + { + ret = GLEW_IBM_multimode_draw_arrays; + continue; + } +#endif +#ifdef GL_IBM_rasterpos_clip + if (_glewStrSame3(&pos, &len, (const GLubyte*)"rasterpos_clip", 14)) + { + ret = GLEW_IBM_rasterpos_clip; + continue; + } +#endif +#ifdef GL_IBM_static_data + if (_glewStrSame3(&pos, &len, (const GLubyte*)"static_data", 11)) + { + ret = GLEW_IBM_static_data; + continue; + } +#endif +#ifdef GL_IBM_texture_mirrored_repeat + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23)) + { + ret = GLEW_IBM_texture_mirrored_repeat; + continue; + } +#endif +#ifdef GL_IBM_vertex_array_lists + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_lists", 18)) + { + ret = GLEW_IBM_vertex_array_lists; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"INGR_", 5)) + { +#ifdef GL_INGR_color_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_clamp", 11)) + { + ret = GLEW_INGR_color_clamp; + continue; + } +#endif +#ifdef GL_INGR_interlace_read + if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace_read", 14)) + { + ret = GLEW_INGR_interlace_read; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) + { +#ifdef GL_INTEL_fragment_shader_ordering + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_ordering", 24)) + { + ret = GLEW_INTEL_fragment_shader_ordering; + continue; + } +#endif +#ifdef GL_INTEL_framebuffer_CMAA + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_CMAA", 16)) + { + ret = GLEW_INTEL_framebuffer_CMAA; + continue; + } +#endif +#ifdef GL_INTEL_map_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"map_texture", 11)) + { + ret = GLEW_INTEL_map_texture; + continue; + } +#endif +#ifdef GL_INTEL_parallel_arrays + if (_glewStrSame3(&pos, &len, (const GLubyte*)"parallel_arrays", 15)) + { + ret = GLEW_INTEL_parallel_arrays; + continue; + } +#endif +#ifdef GL_INTEL_performance_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_query", 17)) + { + ret = GLEW_INTEL_performance_query; + continue; + } +#endif +#ifdef GL_INTEL_texture_scissor + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scissor", 15)) + { + ret = GLEW_INTEL_texture_scissor; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"KHR_", 4)) + { +#ifdef GL_KHR_blend_equation_advanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) + { + ret = GLEW_KHR_blend_equation_advanced; + continue; + } +#endif +#ifdef GL_KHR_blend_equation_advanced_coherent + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) + { + ret = GLEW_KHR_blend_equation_advanced_coherent; + continue; + } +#endif +#ifdef GL_KHR_context_flush_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) + { + ret = GLEW_KHR_context_flush_control; + continue; + } +#endif +#ifdef GL_KHR_debug + if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug", 5)) + { + ret = GLEW_KHR_debug; + continue; + } +#endif +#ifdef GL_KHR_no_error + if (_glewStrSame3(&pos, &len, (const GLubyte*)"no_error", 8)) + { + ret = GLEW_KHR_no_error; + continue; + } +#endif +#ifdef GL_KHR_robust_buffer_access_behavior + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robust_buffer_access_behavior", 29)) + { + ret = GLEW_KHR_robust_buffer_access_behavior; + continue; + } +#endif +#ifdef GL_KHR_robustness + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10)) + { + ret = GLEW_KHR_robustness; + continue; + } +#endif +#ifdef GL_KHR_texture_compression_astc_hdr + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_hdr", 28)) + { + ret = GLEW_KHR_texture_compression_astc_hdr; + continue; + } +#endif +#ifdef GL_KHR_texture_compression_astc_ldr + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_astc_ldr", 28)) + { + ret = GLEW_KHR_texture_compression_astc_ldr; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"KTX_", 4)) + { +#ifdef GL_KTX_buffer_region + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) + { + ret = GLEW_KTX_buffer_region; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESAX_", 6)) + { +#ifdef GL_MESAX_texture_stack + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_stack", 13)) + { + ret = GLEW_MESAX_texture_stack; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) + { +#ifdef GL_MESA_pack_invert + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pack_invert", 11)) + { + ret = GLEW_MESA_pack_invert; + continue; + } +#endif +#ifdef GL_MESA_resize_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"resize_buffers", 14)) + { + ret = GLEW_MESA_resize_buffers; + continue; + } +#endif +#ifdef GL_MESA_window_pos + if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10)) + { + ret = GLEW_MESA_window_pos; + continue; + } +#endif +#ifdef GL_MESA_ycbcr_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_texture", 13)) + { + ret = GLEW_MESA_ycbcr_texture; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"NVX_", 4)) + { +#ifdef GL_NVX_conditional_render + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) + { + ret = GLEW_NVX_conditional_render; + continue; + } +#endif +#ifdef GL_NVX_gpu_memory_info + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_memory_info", 15)) + { + ret = GLEW_NVX_gpu_memory_info; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) + { +#ifdef GL_NV_bindless_multi_draw_indirect + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect", 28)) + { + ret = GLEW_NV_bindless_multi_draw_indirect; + continue; + } +#endif +#ifdef GL_NV_bindless_multi_draw_indirect_count + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_multi_draw_indirect_count", 34)) + { + ret = GLEW_NV_bindless_multi_draw_indirect_count; + continue; + } +#endif +#ifdef GL_NV_bindless_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"bindless_texture", 16)) + { + ret = GLEW_NV_bindless_texture; + continue; + } +#endif +#ifdef GL_NV_blend_equation_advanced + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced", 23)) + { + ret = GLEW_NV_blend_equation_advanced; + continue; + } +#endif +#ifdef GL_NV_blend_equation_advanced_coherent + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_equation_advanced_coherent", 32)) + { + ret = GLEW_NV_blend_equation_advanced_coherent; + continue; + } +#endif +#ifdef GL_NV_blend_square + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_square", 12)) + { + ret = GLEW_NV_blend_square; + continue; + } +#endif +#ifdef GL_NV_compute_program5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compute_program5", 16)) + { + ret = GLEW_NV_compute_program5; + continue; + } +#endif +#ifdef GL_NV_conditional_render + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conditional_render", 18)) + { + ret = GLEW_NV_conditional_render; + continue; + } +#endif +#ifdef GL_NV_conservative_raster + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster", 19)) + { + ret = GLEW_NV_conservative_raster; + continue; + } +#endif +#ifdef GL_NV_conservative_raster_dilate + if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_raster_dilate", 26)) + { + ret = GLEW_NV_conservative_raster_dilate; + continue; + } +#endif +#ifdef GL_NV_copy_depth_to_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_depth_to_color", 19)) + { + ret = GLEW_NV_copy_depth_to_color; + continue; + } +#endif +#ifdef GL_NV_copy_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) + { + ret = GLEW_NV_copy_image; + continue; + } +#endif +#ifdef GL_NV_deep_texture3D + if (_glewStrSame3(&pos, &len, (const GLubyte*)"deep_texture3D", 14)) + { + ret = GLEW_NV_deep_texture3D; + continue; + } +#endif +#ifdef GL_NV_depth_buffer_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18)) + { + ret = GLEW_NV_depth_buffer_float; + continue; + } +#endif +#ifdef GL_NV_depth_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11)) + { + ret = GLEW_NV_depth_clamp; + continue; + } +#endif +#ifdef GL_NV_depth_range_unclamped + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_range_unclamped", 21)) + { + ret = GLEW_NV_depth_range_unclamped; + continue; + } +#endif +#ifdef GL_NV_draw_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_texture", 12)) + { + ret = GLEW_NV_draw_texture; + continue; + } +#endif +#ifdef GL_NV_evaluators + if (_glewStrSame3(&pos, &len, (const GLubyte*)"evaluators", 10)) + { + ret = GLEW_NV_evaluators; + continue; + } +#endif +#ifdef GL_NV_explicit_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_multisample", 20)) + { + ret = GLEW_NV_explicit_multisample; + continue; + } +#endif +#ifdef GL_NV_fence + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fence", 5)) + { + ret = GLEW_NV_fence; + continue; + } +#endif +#ifdef GL_NV_fill_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fill_rectangle", 14)) + { + ret = GLEW_NV_fill_rectangle; + continue; + } +#endif +#ifdef GL_NV_float_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) + { + ret = GLEW_NV_float_buffer; + continue; + } +#endif +#ifdef GL_NV_fog_distance + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_distance", 12)) + { + ret = GLEW_NV_fog_distance; + continue; + } +#endif +#ifdef GL_NV_fragment_coverage_to_color + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coverage_to_color", 26)) + { + ret = GLEW_NV_fragment_coverage_to_color; + continue; + } +#endif +#ifdef GL_NV_fragment_program + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16)) + { + ret = GLEW_NV_fragment_program; + continue; + } +#endif +#ifdef GL_NV_fragment_program2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program2", 17)) + { + ret = GLEW_NV_fragment_program2; + continue; + } +#endif +#ifdef GL_NV_fragment_program4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program4", 17)) + { + ret = GLEW_NV_fragment_program4; + continue; + } +#endif +#ifdef GL_NV_fragment_program_option + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program_option", 23)) + { + ret = GLEW_NV_fragment_program_option; + continue; + } +#endif +#ifdef GL_NV_fragment_shader_interlock + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_shader_interlock", 25)) + { + ret = GLEW_NV_fragment_shader_interlock; + continue; + } +#endif +#ifdef GL_NV_framebuffer_mixed_samples + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_mixed_samples", 25)) + { + ret = GLEW_NV_framebuffer_mixed_samples; + continue; + } +#endif +#ifdef GL_NV_framebuffer_multisample_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_multisample_coverage", 32)) + { + ret = GLEW_NV_framebuffer_multisample_coverage; + continue; + } +#endif +#ifdef GL_NV_geometry_program4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_program4", 17)) + { + ret = GLEW_NV_geometry_program4; + continue; + } +#endif +#ifdef GL_NV_geometry_shader4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader4", 16)) + { + ret = GLEW_NV_geometry_shader4; + continue; + } +#endif +#ifdef GL_NV_geometry_shader_passthrough + if (_glewStrSame3(&pos, &len, (const GLubyte*)"geometry_shader_passthrough", 27)) + { + ret = GLEW_NV_geometry_shader_passthrough; + continue; + } +#endif +#ifdef GL_NV_gpu_program4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program4", 12)) + { + ret = GLEW_NV_gpu_program4; + continue; + } +#endif +#ifdef GL_NV_gpu_program5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5", 12)) + { + ret = GLEW_NV_gpu_program5; + continue; + } +#endif +#ifdef GL_NV_gpu_program5_mem_extended + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5_mem_extended", 25)) + { + ret = GLEW_NV_gpu_program5_mem_extended; + continue; + } +#endif +#ifdef GL_NV_gpu_program_fp64 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_fp64", 16)) + { + ret = GLEW_NV_gpu_program_fp64; + continue; + } +#endif +#ifdef GL_NV_gpu_shader5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11)) + { + ret = GLEW_NV_gpu_shader5; + continue; + } +#endif +#ifdef GL_NV_half_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float", 10)) + { + ret = GLEW_NV_half_float; + continue; + } +#endif +#ifdef GL_NV_internalformat_sample_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"internalformat_sample_query", 27)) + { + ret = GLEW_NV_internalformat_sample_query; + continue; + } +#endif +#ifdef GL_NV_light_max_exponent + if (_glewStrSame3(&pos, &len, (const GLubyte*)"light_max_exponent", 18)) + { + ret = GLEW_NV_light_max_exponent; + continue; + } +#endif +#ifdef GL_NV_multisample_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) + { + ret = GLEW_NV_multisample_coverage; + continue; + } +#endif +#ifdef GL_NV_multisample_filter_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_filter_hint", 23)) + { + ret = GLEW_NV_multisample_filter_hint; + continue; + } +#endif +#ifdef GL_NV_occlusion_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query", 15)) + { + ret = GLEW_NV_occlusion_query; + continue; + } +#endif +#ifdef GL_NV_packed_depth_stencil + if (_glewStrSame3(&pos, &len, (const GLubyte*)"packed_depth_stencil", 20)) + { + ret = GLEW_NV_packed_depth_stencil; + continue; + } +#endif +#ifdef GL_NV_parameter_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object", 23)) + { + ret = GLEW_NV_parameter_buffer_object; + continue; + } +#endif +#ifdef GL_NV_parameter_buffer_object2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object2", 24)) + { + ret = GLEW_NV_parameter_buffer_object2; + continue; + } +#endif +#ifdef GL_NV_path_rendering + if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering", 14)) + { + ret = GLEW_NV_path_rendering; + continue; + } +#endif +#ifdef GL_NV_path_rendering_shared_edge + if (_glewStrSame3(&pos, &len, (const GLubyte*)"path_rendering_shared_edge", 26)) + { + ret = GLEW_NV_path_rendering_shared_edge; + continue; + } +#endif +#ifdef GL_NV_pixel_data_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_data_range", 16)) + { + ret = GLEW_NV_pixel_data_range; + continue; + } +#endif +#ifdef GL_NV_point_sprite + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_sprite", 12)) + { + ret = GLEW_NV_point_sprite; + continue; + } +#endif +#ifdef GL_NV_present_video + if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) + { + ret = GLEW_NV_present_video; + continue; + } +#endif +#ifdef GL_NV_primitive_restart + if (_glewStrSame3(&pos, &len, (const GLubyte*)"primitive_restart", 17)) + { + ret = GLEW_NV_primitive_restart; + continue; + } +#endif +#ifdef GL_NV_register_combiners + if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners", 18)) + { + ret = GLEW_NV_register_combiners; + continue; + } +#endif +#ifdef GL_NV_register_combiners2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"register_combiners2", 19)) + { + ret = GLEW_NV_register_combiners2; + continue; + } +#endif +#ifdef GL_NV_sample_locations + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_locations", 16)) + { + ret = GLEW_NV_sample_locations; + continue; + } +#endif +#ifdef GL_NV_sample_mask_override_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_mask_override_coverage", 29)) + { + ret = GLEW_NV_sample_mask_override_coverage; + continue; + } +#endif +#ifdef GL_NV_shader_atomic_counters + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_counters", 22)) + { + ret = GLEW_NV_shader_atomic_counters; + continue; + } +#endif +#ifdef GL_NV_shader_atomic_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_float", 19)) + { + ret = GLEW_NV_shader_atomic_float; + continue; + } +#endif +#ifdef GL_NV_shader_atomic_fp16_vector + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_fp16_vector", 25)) + { + ret = GLEW_NV_shader_atomic_fp16_vector; + continue; + } +#endif +#ifdef GL_NV_shader_atomic_int64 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_atomic_int64", 19)) + { + ret = GLEW_NV_shader_atomic_int64; + continue; + } +#endif +#ifdef GL_NV_shader_buffer_load + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_buffer_load", 18)) + { + ret = GLEW_NV_shader_buffer_load; + continue; + } +#endif +#ifdef GL_NV_shader_storage_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_storage_buffer_object", 28)) + { + ret = GLEW_NV_shader_storage_buffer_object; + continue; + } +#endif +#ifdef GL_NV_shader_thread_group + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_group", 19)) + { + ret = GLEW_NV_shader_thread_group; + continue; + } +#endif +#ifdef GL_NV_shader_thread_shuffle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_thread_shuffle", 21)) + { + ret = GLEW_NV_shader_thread_shuffle; + continue; + } +#endif +#ifdef GL_NV_tessellation_program5 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_program5", 21)) + { + ret = GLEW_NV_tessellation_program5; + continue; + } +#endif +#ifdef GL_NV_texgen_emboss + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_emboss", 13)) + { + ret = GLEW_NV_texgen_emboss; + continue; + } +#endif +#ifdef GL_NV_texgen_reflection + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_reflection", 17)) + { + ret = GLEW_NV_texgen_reflection; + continue; + } +#endif +#ifdef GL_NV_texture_barrier + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15)) + { + ret = GLEW_NV_texture_barrier; + continue; + } +#endif +#ifdef GL_NV_texture_compression_vtc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_vtc", 23)) + { + ret = GLEW_NV_texture_compression_vtc; + continue; + } +#endif +#ifdef GL_NV_texture_env_combine4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_combine4", 20)) + { + ret = GLEW_NV_texture_env_combine4; + continue; + } +#endif +#ifdef GL_NV_texture_expand_normal + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_expand_normal", 21)) + { + ret = GLEW_NV_texture_expand_normal; + continue; + } +#endif +#ifdef GL_NV_texture_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19)) + { + ret = GLEW_NV_texture_multisample; + continue; + } +#endif +#ifdef GL_NV_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17)) + { + ret = GLEW_NV_texture_rectangle; + continue; + } +#endif +#ifdef GL_NV_texture_shader + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader", 14)) + { + ret = GLEW_NV_texture_shader; + continue; + } +#endif +#ifdef GL_NV_texture_shader2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader2", 15)) + { + ret = GLEW_NV_texture_shader2; + continue; + } +#endif +#ifdef GL_NV_texture_shader3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shader3", 15)) + { + ret = GLEW_NV_texture_shader3; + continue; + } +#endif +#ifdef GL_NV_transform_feedback + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback", 18)) + { + ret = GLEW_NV_transform_feedback; + continue; + } +#endif +#ifdef GL_NV_transform_feedback2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19)) + { + ret = GLEW_NV_transform_feedback2; + continue; + } +#endif +#ifdef GL_NV_uniform_buffer_unified_memory + if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_unified_memory", 29)) + { + ret = GLEW_NV_uniform_buffer_unified_memory; + continue; + } +#endif +#ifdef GL_NV_vdpau_interop + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vdpau_interop", 13)) + { + ret = GLEW_NV_vdpau_interop; + continue; + } +#endif +#ifdef GL_NV_vertex_array_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) + { + ret = GLEW_NV_vertex_array_range; + continue; + } +#endif +#ifdef GL_NV_vertex_array_range2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range2", 19)) + { + ret = GLEW_NV_vertex_array_range2; + continue; + } +#endif +#ifdef GL_NV_vertex_attrib_integer_64bit + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_integer_64bit", 27)) + { + ret = GLEW_NV_vertex_attrib_integer_64bit; + continue; + } +#endif +#ifdef GL_NV_vertex_buffer_unified_memory + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_unified_memory", 28)) + { + ret = GLEW_NV_vertex_buffer_unified_memory; + continue; + } +#endif +#ifdef GL_NV_vertex_program + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14)) + { + ret = GLEW_NV_vertex_program; + continue; + } +#endif +#ifdef GL_NV_vertex_program1_1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program1_1", 17)) + { + ret = GLEW_NV_vertex_program1_1; + continue; + } +#endif +#ifdef GL_NV_vertex_program2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2", 15)) + { + ret = GLEW_NV_vertex_program2; + continue; + } +#endif +#ifdef GL_NV_vertex_program2_option + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program2_option", 22)) + { + ret = GLEW_NV_vertex_program2_option; + continue; + } +#endif +#ifdef GL_NV_vertex_program3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program3", 15)) + { + ret = GLEW_NV_vertex_program3; + continue; + } +#endif +#ifdef GL_NV_vertex_program4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program4", 15)) + { + ret = GLEW_NV_vertex_program4; + continue; + } +#endif +#ifdef GL_NV_video_capture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) + { + ret = GLEW_NV_video_capture; + continue; + } +#endif +#ifdef GL_NV_viewport_array2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array2", 15)) + { + ret = GLEW_NV_viewport_array2; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OES_", 4)) + { +#ifdef GL_OES_byte_coordinates + if (_glewStrSame3(&pos, &len, (const GLubyte*)"byte_coordinates", 16)) + { + ret = GLEW_OES_byte_coordinates; + continue; + } +#endif +#ifdef GL_OES_compressed_paletted_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"compressed_paletted_texture", 27)) + { + ret = GLEW_OES_compressed_paletted_texture; + continue; + } +#endif +#ifdef GL_OES_read_format + if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_format", 11)) + { + ret = GLEW_OES_read_format; + continue; + } +#endif +#ifdef GL_OES_single_precision + if (_glewStrSame3(&pos, &len, (const GLubyte*)"single_precision", 16)) + { + ret = GLEW_OES_single_precision; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) + { +#ifdef GL_OML_interlace + if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) + { + ret = GLEW_OML_interlace; + continue; + } +#endif +#ifdef GL_OML_resample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) + { + ret = GLEW_OML_resample; + continue; + } +#endif +#ifdef GL_OML_subsample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"subsample", 9)) + { + ret = GLEW_OML_subsample; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OVR_", 4)) + { +#ifdef GL_OVR_multiview + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview", 9)) + { + ret = GLEW_OVR_multiview; + continue; + } +#endif +#ifdef GL_OVR_multiview2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multiview2", 10)) + { + ret = GLEW_OVR_multiview2; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"PGI_", 4)) + { +#ifdef GL_PGI_misc_hints + if (_glewStrSame3(&pos, &len, (const GLubyte*)"misc_hints", 10)) + { + ret = GLEW_PGI_misc_hints; + continue; + } +#endif +#ifdef GL_PGI_vertex_hints + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_hints", 12)) + { + ret = GLEW_PGI_vertex_hints; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"REGAL_", 6)) + { +#ifdef GL_REGAL_ES1_0_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_0_compatibility", 19)) + { + ret = GLEW_REGAL_ES1_0_compatibility; + continue; + } +#endif +#ifdef GL_REGAL_ES1_1_compatibility + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES1_1_compatibility", 19)) + { + ret = GLEW_REGAL_ES1_1_compatibility; + continue; + } +#endif +#ifdef GL_REGAL_enable + if (_glewStrSame3(&pos, &len, (const GLubyte*)"enable", 6)) + { + ret = GLEW_REGAL_enable; + continue; + } +#endif +#ifdef GL_REGAL_error_string + if (_glewStrSame3(&pos, &len, (const GLubyte*)"error_string", 12)) + { + ret = GLEW_REGAL_error_string; + continue; + } +#endif +#ifdef GL_REGAL_extension_query + if (_glewStrSame3(&pos, &len, (const GLubyte*)"extension_query", 15)) + { + ret = GLEW_REGAL_extension_query; + continue; + } +#endif +#ifdef GL_REGAL_log + if (_glewStrSame3(&pos, &len, (const GLubyte*)"log", 3)) + { + ret = GLEW_REGAL_log; + continue; + } +#endif +#ifdef GL_REGAL_proc_address + if (_glewStrSame3(&pos, &len, (const GLubyte*)"proc_address", 12)) + { + ret = GLEW_REGAL_proc_address; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"REND_", 5)) + { +#ifdef GL_REND_screen_coordinates + if (_glewStrSame3(&pos, &len, (const GLubyte*)"screen_coordinates", 18)) + { + ret = GLEW_REND_screen_coordinates; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"S3_", 3)) + { +#ifdef GL_S3_s3tc + if (_glewStrSame3(&pos, &len, (const GLubyte*)"s3tc", 4)) + { + ret = GLEW_S3_s3tc; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) + { +#ifdef GL_SGIS_color_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) + { + ret = GLEW_SGIS_color_range; + continue; + } +#endif +#ifdef GL_SGIS_detail_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"detail_texture", 14)) + { + ret = GLEW_SGIS_detail_texture; + continue; + } +#endif +#ifdef GL_SGIS_fog_function + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_function", 12)) + { + ret = GLEW_SGIS_fog_function; + continue; + } +#endif +#ifdef GL_SGIS_generate_mipmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"generate_mipmap", 15)) + { + ret = GLEW_SGIS_generate_mipmap; + continue; + } +#endif +#ifdef GL_SGIS_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLEW_SGIS_multisample; + continue; + } +#endif +#ifdef GL_SGIS_pixel_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) + { + ret = GLEW_SGIS_pixel_texture; + continue; + } +#endif +#ifdef GL_SGIS_point_line_texgen + if (_glewStrSame3(&pos, &len, (const GLubyte*)"point_line_texgen", 17)) + { + ret = GLEW_SGIS_point_line_texgen; + continue; + } +#endif +#ifdef GL_SGIS_sharpen_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sharpen_texture", 15)) + { + ret = GLEW_SGIS_sharpen_texture; + continue; + } +#endif +#ifdef GL_SGIS_texture4D + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture4D", 9)) + { + ret = GLEW_SGIS_texture4D; + continue; + } +#endif +#ifdef GL_SGIS_texture_border_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20)) + { + ret = GLEW_SGIS_texture_border_clamp; + continue; + } +#endif +#ifdef GL_SGIS_texture_edge_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_edge_clamp", 18)) + { + ret = GLEW_SGIS_texture_edge_clamp; + continue; + } +#endif +#ifdef GL_SGIS_texture_filter4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_filter4", 15)) + { + ret = GLEW_SGIS_texture_filter4; + continue; + } +#endif +#ifdef GL_SGIS_texture_lod + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod", 11)) + { + ret = GLEW_SGIS_texture_lod; + continue; + } +#endif +#ifdef GL_SGIS_texture_select + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_select", 14)) + { + ret = GLEW_SGIS_texture_select; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) + { +#ifdef GL_SGIX_async + if (_glewStrSame3(&pos, &len, (const GLubyte*)"async", 5)) + { + ret = GLEW_SGIX_async; + continue; + } +#endif +#ifdef GL_SGIX_async_histogram + if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_histogram", 15)) + { + ret = GLEW_SGIX_async_histogram; + continue; + } +#endif +#ifdef GL_SGIX_async_pixel + if (_glewStrSame3(&pos, &len, (const GLubyte*)"async_pixel", 11)) + { + ret = GLEW_SGIX_async_pixel; + continue; + } +#endif +#ifdef GL_SGIX_blend_alpha_minmax + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_alpha_minmax", 18)) + { + ret = GLEW_SGIX_blend_alpha_minmax; + continue; + } +#endif +#ifdef GL_SGIX_clipmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"clipmap", 7)) + { + ret = GLEW_SGIX_clipmap; + continue; + } +#endif +#ifdef GL_SGIX_convolution_accuracy + if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_accuracy", 20)) + { + ret = GLEW_SGIX_convolution_accuracy; + continue; + } +#endif +#ifdef GL_SGIX_depth_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13)) + { + ret = GLEW_SGIX_depth_texture; + continue; + } +#endif +#ifdef GL_SGIX_flush_raster + if (_glewStrSame3(&pos, &len, (const GLubyte*)"flush_raster", 12)) + { + ret = GLEW_SGIX_flush_raster; + continue; + } +#endif +#ifdef GL_SGIX_fog_offset + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_offset", 10)) + { + ret = GLEW_SGIX_fog_offset; + continue; + } +#endif +#ifdef GL_SGIX_fog_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fog_texture", 11)) + { + ret = GLEW_SGIX_fog_texture; + continue; + } +#endif +#ifdef GL_SGIX_fragment_specular_lighting + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_specular_lighting", 26)) + { + ret = GLEW_SGIX_fragment_specular_lighting; + continue; + } +#endif +#ifdef GL_SGIX_framezoom + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framezoom", 9)) + { + ret = GLEW_SGIX_framezoom; + continue; + } +#endif +#ifdef GL_SGIX_interlace + if (_glewStrSame3(&pos, &len, (const GLubyte*)"interlace", 9)) + { + ret = GLEW_SGIX_interlace; + continue; + } +#endif +#ifdef GL_SGIX_ir_instrument1 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ir_instrument1", 14)) + { + ret = GLEW_SGIX_ir_instrument1; + continue; + } +#endif +#ifdef GL_SGIX_list_priority + if (_glewStrSame3(&pos, &len, (const GLubyte*)"list_priority", 13)) + { + ret = GLEW_SGIX_list_priority; + continue; + } +#endif +#ifdef GL_SGIX_pixel_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture", 13)) + { + ret = GLEW_SGIX_pixel_texture; + continue; + } +#endif +#ifdef GL_SGIX_pixel_texture_bits + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_texture_bits", 18)) + { + ret = GLEW_SGIX_pixel_texture_bits; + continue; + } +#endif +#ifdef GL_SGIX_reference_plane + if (_glewStrSame3(&pos, &len, (const GLubyte*)"reference_plane", 15)) + { + ret = GLEW_SGIX_reference_plane; + continue; + } +#endif +#ifdef GL_SGIX_resample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"resample", 8)) + { + ret = GLEW_SGIX_resample; + continue; + } +#endif +#ifdef GL_SGIX_shadow + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6)) + { + ret = GLEW_SGIX_shadow; + continue; + } +#endif +#ifdef GL_SGIX_shadow_ambient + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_ambient", 14)) + { + ret = GLEW_SGIX_shadow_ambient; + continue; + } +#endif +#ifdef GL_SGIX_sprite + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sprite", 6)) + { + ret = GLEW_SGIX_sprite; + continue; + } +#endif +#ifdef GL_SGIX_tag_sample_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"tag_sample_buffer", 17)) + { + ret = GLEW_SGIX_tag_sample_buffer; + continue; + } +#endif +#ifdef GL_SGIX_texture_add_env + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_add_env", 15)) + { + ret = GLEW_SGIX_texture_add_env; + continue; + } +#endif +#ifdef GL_SGIX_texture_coordinate_clamp + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_coordinate_clamp", 24)) + { + ret = GLEW_SGIX_texture_coordinate_clamp; + continue; + } +#endif +#ifdef GL_SGIX_texture_lod_bias + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_lod_bias", 16)) + { + ret = GLEW_SGIX_texture_lod_bias; + continue; + } +#endif +#ifdef GL_SGIX_texture_multi_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multi_buffer", 20)) + { + ret = GLEW_SGIX_texture_multi_buffer; + continue; + } +#endif +#ifdef GL_SGIX_texture_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_range", 13)) + { + ret = GLEW_SGIX_texture_range; + continue; + } +#endif +#ifdef GL_SGIX_texture_scale_bias + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_scale_bias", 18)) + { + ret = GLEW_SGIX_texture_scale_bias; + continue; + } +#endif +#ifdef GL_SGIX_vertex_preclip + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip", 14)) + { + ret = GLEW_SGIX_vertex_preclip; + continue; + } +#endif +#ifdef GL_SGIX_vertex_preclip_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_preclip_hint", 19)) + { + ret = GLEW_SGIX_vertex_preclip_hint; + continue; + } +#endif +#ifdef GL_SGIX_ycrcb + if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycrcb", 5)) + { + ret = GLEW_SGIX_ycrcb; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) + { +#ifdef GL_SGI_color_matrix + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_matrix", 12)) + { + ret = GLEW_SGI_color_matrix; + continue; + } +#endif +#ifdef GL_SGI_color_table + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_table", 11)) + { + ret = GLEW_SGI_color_table; + continue; + } +#endif +#ifdef GL_SGI_texture_color_table + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_color_table", 19)) + { + ret = GLEW_SGI_texture_color_table; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUNX_", 5)) + { +#ifdef GL_SUNX_constant_data + if (_glewStrSame3(&pos, &len, (const GLubyte*)"constant_data", 13)) + { + ret = GLEW_SUNX_constant_data; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) + { +#ifdef GL_SUN_convolution_border_modes + if (_glewStrSame3(&pos, &len, (const GLubyte*)"convolution_border_modes", 24)) + { + ret = GLEW_SUN_convolution_border_modes; + continue; + } +#endif +#ifdef GL_SUN_global_alpha + if (_glewStrSame3(&pos, &len, (const GLubyte*)"global_alpha", 12)) + { + ret = GLEW_SUN_global_alpha; + continue; + } +#endif +#ifdef GL_SUN_mesh_array + if (_glewStrSame3(&pos, &len, (const GLubyte*)"mesh_array", 10)) + { + ret = GLEW_SUN_mesh_array; + continue; + } +#endif +#ifdef GL_SUN_read_video_pixels + if (_glewStrSame3(&pos, &len, (const GLubyte*)"read_video_pixels", 17)) + { + ret = GLEW_SUN_read_video_pixels; + continue; + } +#endif +#ifdef GL_SUN_slice_accum + if (_glewStrSame3(&pos, &len, (const GLubyte*)"slice_accum", 11)) + { + ret = GLEW_SUN_slice_accum; + continue; + } +#endif +#ifdef GL_SUN_triangle_list + if (_glewStrSame3(&pos, &len, (const GLubyte*)"triangle_list", 13)) + { + ret = GLEW_SUN_triangle_list; + continue; + } +#endif +#ifdef GL_SUN_vertex + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex", 6)) + { + ret = GLEW_SUN_vertex; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"WIN_", 4)) + { +#ifdef GL_WIN_phong_shading + if (_glewStrSame3(&pos, &len, (const GLubyte*)"phong_shading", 13)) + { + ret = GLEW_WIN_phong_shading; + continue; + } +#endif +#ifdef GL_WIN_specular_fog + if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_fog", 12)) + { + ret = GLEW_WIN_specular_fog; + continue; + } +#endif +#ifdef GL_WIN_swap_hint + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_hint", 9)) + { + ret = GLEW_WIN_swap_hint; + continue; + } +#endif + } + } + ret = (len == 0); + } + return ret; +} + +#if defined(_WIN32) + +#if defined(GLEW_MX) +GLboolean GLEWAPIENTRY wglewContextIsSupported (const WGLEWContext* ctx, const char* name) +#else +GLboolean GLEWAPIENTRY wglewIsSupported (const char* name) +#endif +{ + const GLubyte* pos = (const GLubyte*)name; + GLuint len = _glewStrLen(pos); + GLboolean ret = GL_TRUE; + while (ret && len > 0) + { + if (_glewStrSame1(&pos, &len, (const GLubyte*)"WGL_", 4)) + { + if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) + { +#ifdef WGL_3DFX_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = WGLEW_3DFX_multisample; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DL_", 4)) + { +#ifdef WGL_3DL_stereo_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_control", 14)) + { + ret = WGLEW_3DL_stereo_control; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) + { +#ifdef WGL_AMD_gpu_association + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) + { + ret = WGLEW_AMD_gpu_association; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) + { +#ifdef WGL_ARB_buffer_region + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_region", 13)) + { + ret = WGLEW_ARB_buffer_region; + continue; + } +#endif +#ifdef WGL_ARB_context_flush_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) + { + ret = WGLEW_ARB_context_flush_control; + continue; + } +#endif +#ifdef WGL_ARB_create_context + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) + { + ret = WGLEW_ARB_create_context; + continue; + } +#endif +#ifdef WGL_ARB_create_context_profile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) + { + ret = WGLEW_ARB_create_context_profile; + continue; + } +#endif +#ifdef WGL_ARB_create_context_robustness + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) + { + ret = WGLEW_ARB_create_context_robustness; + continue; + } +#endif +#ifdef WGL_ARB_extensions_string + if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) + { + ret = WGLEW_ARB_extensions_string; + continue; + } +#endif +#ifdef WGL_ARB_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = WGLEW_ARB_framebuffer_sRGB; + continue; + } +#endif +#ifdef WGL_ARB_make_current_read + if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) + { + ret = WGLEW_ARB_make_current_read; + continue; + } +#endif +#ifdef WGL_ARB_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = WGLEW_ARB_multisample; + continue; + } +#endif +#ifdef WGL_ARB_pbuffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) + { + ret = WGLEW_ARB_pbuffer; + continue; + } +#endif +#ifdef WGL_ARB_pixel_format + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) + { + ret = WGLEW_ARB_pixel_format; + continue; + } +#endif +#ifdef WGL_ARB_pixel_format_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) + { + ret = WGLEW_ARB_pixel_format_float; + continue; + } +#endif +#ifdef WGL_ARB_render_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) + { + ret = WGLEW_ARB_render_texture; + continue; + } +#endif +#ifdef WGL_ARB_robustness_application_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) + { + ret = WGLEW_ARB_robustness_application_isolation; + continue; + } +#endif +#ifdef WGL_ARB_robustness_share_group_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) + { + ret = WGLEW_ARB_robustness_share_group_isolation; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) + { +#ifdef WGL_ATI_pixel_format_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) + { + ret = WGLEW_ATI_pixel_format_float; + continue; + } +#endif +#ifdef WGL_ATI_render_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) + { + ret = WGLEW_ATI_render_texture_rectangle; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) + { +#ifdef WGL_EXT_create_context_es2_profile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) + { + ret = WGLEW_EXT_create_context_es2_profile; + continue; + } +#endif +#ifdef WGL_EXT_create_context_es_profile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) + { + ret = WGLEW_EXT_create_context_es_profile; + continue; + } +#endif +#ifdef WGL_EXT_depth_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_float", 11)) + { + ret = WGLEW_EXT_depth_float; + continue; + } +#endif +#ifdef WGL_EXT_display_color_table + if (_glewStrSame3(&pos, &len, (const GLubyte*)"display_color_table", 19)) + { + ret = WGLEW_EXT_display_color_table; + continue; + } +#endif +#ifdef WGL_EXT_extensions_string + if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17)) + { + ret = WGLEW_EXT_extensions_string; + continue; + } +#endif +#ifdef WGL_EXT_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = WGLEW_EXT_framebuffer_sRGB; + continue; + } +#endif +#ifdef WGL_EXT_make_current_read + if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) + { + ret = WGLEW_EXT_make_current_read; + continue; + } +#endif +#ifdef WGL_EXT_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = WGLEW_EXT_multisample; + continue; + } +#endif +#ifdef WGL_EXT_pbuffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) + { + ret = WGLEW_EXT_pbuffer; + continue; + } +#endif +#ifdef WGL_EXT_pixel_format + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format", 12)) + { + ret = WGLEW_EXT_pixel_format; + continue; + } +#endif +#ifdef WGL_EXT_pixel_format_packed_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_packed_float", 25)) + { + ret = WGLEW_EXT_pixel_format_packed_float; + continue; + } +#endif +#ifdef WGL_EXT_swap_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) + { + ret = WGLEW_EXT_swap_control; + continue; + } +#endif +#ifdef WGL_EXT_swap_control_tear + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) + { + ret = WGLEW_EXT_swap_control_tear; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"I3D_", 4)) + { +#ifdef WGL_I3D_digital_video_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"digital_video_control", 21)) + { + ret = WGLEW_I3D_digital_video_control; + continue; + } +#endif +#ifdef WGL_I3D_gamma + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gamma", 5)) + { + ret = WGLEW_I3D_gamma; + continue; + } +#endif +#ifdef WGL_I3D_genlock + if (_glewStrSame3(&pos, &len, (const GLubyte*)"genlock", 7)) + { + ret = WGLEW_I3D_genlock; + continue; + } +#endif +#ifdef WGL_I3D_image_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"image_buffer", 12)) + { + ret = WGLEW_I3D_image_buffer; + continue; + } +#endif +#ifdef WGL_I3D_swap_frame_lock + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_lock", 15)) + { + ret = WGLEW_I3D_swap_frame_lock; + continue; + } +#endif +#ifdef WGL_I3D_swap_frame_usage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_frame_usage", 16)) + { + ret = WGLEW_I3D_swap_frame_usage; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) + { +#ifdef WGL_NV_DX_interop + if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop", 10)) + { + ret = WGLEW_NV_DX_interop; + continue; + } +#endif +#ifdef WGL_NV_DX_interop2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"DX_interop2", 11)) + { + ret = WGLEW_NV_DX_interop2; + continue; + } +#endif +#ifdef WGL_NV_copy_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) + { + ret = WGLEW_NV_copy_image; + continue; + } +#endif +#ifdef WGL_NV_delay_before_swap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) + { + ret = WGLEW_NV_delay_before_swap; + continue; + } +#endif +#ifdef WGL_NV_float_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) + { + ret = WGLEW_NV_float_buffer; + continue; + } +#endif +#ifdef WGL_NV_gpu_affinity + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_affinity", 12)) + { + ret = WGLEW_NV_gpu_affinity; + continue; + } +#endif +#ifdef WGL_NV_multisample_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) + { + ret = WGLEW_NV_multisample_coverage; + continue; + } +#endif +#ifdef WGL_NV_present_video + if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) + { + ret = WGLEW_NV_present_video; + continue; + } +#endif +#ifdef WGL_NV_render_depth_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_depth_texture", 20)) + { + ret = WGLEW_NV_render_depth_texture; + continue; + } +#endif +#ifdef WGL_NV_render_texture_rectangle + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture_rectangle", 24)) + { + ret = WGLEW_NV_render_texture_rectangle; + continue; + } +#endif +#ifdef WGL_NV_swap_group + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) + { + ret = WGLEW_NV_swap_group; + continue; + } +#endif +#ifdef WGL_NV_vertex_array_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) + { + ret = WGLEW_NV_vertex_array_range; + continue; + } +#endif +#ifdef WGL_NV_video_capture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) + { + ret = WGLEW_NV_video_capture; + continue; + } +#endif +#ifdef WGL_NV_video_output + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_output", 12)) + { + ret = WGLEW_NV_video_output; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) + { +#ifdef WGL_OML_sync_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) + { + ret = WGLEW_OML_sync_control; + continue; + } +#endif + } + } + ret = (len == 0); + } + return ret; +} + +#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && !defined(__APPLE__) || defined(GLEW_APPLE_GLX) + +#if defined(GLEW_MX) +GLboolean glxewContextIsSupported (const GLXEWContext* ctx, const char* name) +#else +GLboolean glxewIsSupported (const char* name) +#endif +{ + const GLubyte* pos = (const GLubyte*)name; + GLuint len = _glewStrLen(pos); + GLboolean ret = GL_TRUE; + while (ret && len > 0) + { + if(_glewStrSame1(&pos, &len, (const GLubyte*)"GLX_", 4)) + { + if (_glewStrSame2(&pos, &len, (const GLubyte*)"VERSION_", 8)) + { +#ifdef GLX_VERSION_1_2 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2", 3)) + { + ret = GLXEW_VERSION_1_2; + continue; + } +#endif +#ifdef GLX_VERSION_1_3 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3)) + { + ret = GLXEW_VERSION_1_3; + continue; + } +#endif +#ifdef GLX_VERSION_1_4 + if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_4", 3)) + { + ret = GLXEW_VERSION_1_4; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5)) + { +#ifdef GLX_3DFX_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLXEW_3DFX_multisample; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4)) + { +#ifdef GLX_AMD_gpu_association + if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15)) + { + ret = GLXEW_AMD_gpu_association; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4)) + { +#ifdef GLX_ARB_context_flush_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"context_flush_control", 21)) + { + ret = GLXEW_ARB_context_flush_control; + continue; + } +#endif +#ifdef GLX_ARB_create_context + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context", 14)) + { + ret = GLXEW_ARB_create_context; + continue; + } +#endif +#ifdef GLX_ARB_create_context_profile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22)) + { + ret = GLXEW_ARB_create_context_profile; + continue; + } +#endif +#ifdef GLX_ARB_create_context_robustness + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25)) + { + ret = GLXEW_ARB_create_context_robustness; + continue; + } +#endif +#ifdef GLX_ARB_fbconfig_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_float", 14)) + { + ret = GLXEW_ARB_fbconfig_float; + continue; + } +#endif +#ifdef GLX_ARB_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = GLXEW_ARB_framebuffer_sRGB; + continue; + } +#endif +#ifdef GLX_ARB_get_proc_address + if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_proc_address", 16)) + { + ret = GLXEW_ARB_get_proc_address; + continue; + } +#endif +#ifdef GLX_ARB_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLXEW_ARB_multisample; + continue; + } +#endif +#ifdef GLX_ARB_robustness_application_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_application_isolation", 32)) + { + ret = GLXEW_ARB_robustness_application_isolation; + continue; + } +#endif +#ifdef GLX_ARB_robustness_share_group_isolation + if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness_share_group_isolation", 32)) + { + ret = GLXEW_ARB_robustness_share_group_isolation; + continue; + } +#endif +#ifdef GLX_ARB_vertex_buffer_object + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20)) + { + ret = GLXEW_ARB_vertex_buffer_object; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4)) + { +#ifdef GLX_ATI_pixel_format_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_format_float", 18)) + { + ret = GLXEW_ATI_pixel_format_float; + continue; + } +#endif +#ifdef GLX_ATI_render_texture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"render_texture", 14)) + { + ret = GLXEW_ATI_render_texture; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4)) + { +#ifdef GLX_EXT_buffer_age + if (_glewStrSame3(&pos, &len, (const GLubyte*)"buffer_age", 10)) + { + ret = GLXEW_EXT_buffer_age; + continue; + } +#endif +#ifdef GLX_EXT_create_context_es2_profile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26)) + { + ret = GLXEW_EXT_create_context_es2_profile; + continue; + } +#endif +#ifdef GLX_EXT_create_context_es_profile + if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es_profile", 25)) + { + ret = GLXEW_EXT_create_context_es_profile; + continue; + } +#endif +#ifdef GLX_EXT_fbconfig_packed_float + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_packed_float", 21)) + { + ret = GLXEW_EXT_fbconfig_packed_float; + continue; + } +#endif +#ifdef GLX_EXT_framebuffer_sRGB + if (_glewStrSame3(&pos, &len, (const GLubyte*)"framebuffer_sRGB", 16)) + { + ret = GLXEW_EXT_framebuffer_sRGB; + continue; + } +#endif +#ifdef GLX_EXT_import_context + if (_glewStrSame3(&pos, &len, (const GLubyte*)"import_context", 14)) + { + ret = GLXEW_EXT_import_context; + continue; + } +#endif +#ifdef GLX_EXT_scene_marker + if (_glewStrSame3(&pos, &len, (const GLubyte*)"scene_marker", 12)) + { + ret = GLXEW_EXT_scene_marker; + continue; + } +#endif +#ifdef GLX_EXT_stereo_tree + if (_glewStrSame3(&pos, &len, (const GLubyte*)"stereo_tree", 11)) + { + ret = GLXEW_EXT_stereo_tree; + continue; + } +#endif +#ifdef GLX_EXT_swap_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) + { + ret = GLXEW_EXT_swap_control; + continue; + } +#endif +#ifdef GLX_EXT_swap_control_tear + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control_tear", 17)) + { + ret = GLXEW_EXT_swap_control_tear; + continue; + } +#endif +#ifdef GLX_EXT_texture_from_pixmap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19)) + { + ret = GLXEW_EXT_texture_from_pixmap; + continue; + } +#endif +#ifdef GLX_EXT_visual_info + if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_info", 11)) + { + ret = GLXEW_EXT_visual_info; + continue; + } +#endif +#ifdef GLX_EXT_visual_rating + if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_rating", 13)) + { + ret = GLXEW_EXT_visual_rating; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6)) + { +#ifdef GLX_INTEL_swap_event + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_event", 10)) + { + ret = GLXEW_INTEL_swap_event; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5)) + { +#ifdef GLX_MESA_agp_offset + if (_glewStrSame3(&pos, &len, (const GLubyte*)"agp_offset", 10)) + { + ret = GLXEW_MESA_agp_offset; + continue; + } +#endif +#ifdef GLX_MESA_copy_sub_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_sub_buffer", 15)) + { + ret = GLXEW_MESA_copy_sub_buffer; + continue; + } +#endif +#ifdef GLX_MESA_pixmap_colormap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixmap_colormap", 15)) + { + ret = GLXEW_MESA_pixmap_colormap; + continue; + } +#endif +#ifdef GLX_MESA_query_renderer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"query_renderer", 14)) + { + ret = GLXEW_MESA_query_renderer; + continue; + } +#endif +#ifdef GLX_MESA_release_buffers + if (_glewStrSame3(&pos, &len, (const GLubyte*)"release_buffers", 15)) + { + ret = GLXEW_MESA_release_buffers; + continue; + } +#endif +#ifdef GLX_MESA_set_3dfx_mode + if (_glewStrSame3(&pos, &len, (const GLubyte*)"set_3dfx_mode", 13)) + { + ret = GLXEW_MESA_set_3dfx_mode; + continue; + } +#endif +#ifdef GLX_MESA_swap_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) + { + ret = GLXEW_MESA_swap_control; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3)) + { +#ifdef GLX_NV_copy_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11)) + { + ret = GLXEW_NV_copy_buffer; + continue; + } +#endif +#ifdef GLX_NV_copy_image + if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10)) + { + ret = GLXEW_NV_copy_image; + continue; + } +#endif +#ifdef GLX_NV_delay_before_swap + if (_glewStrSame3(&pos, &len, (const GLubyte*)"delay_before_swap", 17)) + { + ret = GLXEW_NV_delay_before_swap; + continue; + } +#endif +#ifdef GLX_NV_float_buffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12)) + { + ret = GLXEW_NV_float_buffer; + continue; + } +#endif +#ifdef GLX_NV_multisample_coverage + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20)) + { + ret = GLXEW_NV_multisample_coverage; + continue; + } +#endif +#ifdef GLX_NV_present_video + if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13)) + { + ret = GLXEW_NV_present_video; + continue; + } +#endif +#ifdef GLX_NV_swap_group + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) + { + ret = GLXEW_NV_swap_group; + continue; + } +#endif +#ifdef GLX_NV_vertex_array_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18)) + { + ret = GLXEW_NV_vertex_array_range; + continue; + } +#endif +#ifdef GLX_NV_video_capture + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_capture", 13)) + { + ret = GLXEW_NV_video_capture; + continue; + } +#endif +#ifdef GLX_NV_video_out + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_out", 9)) + { + ret = GLXEW_NV_video_out; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"OML_", 4)) + { +#ifdef GLX_OML_swap_method + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_method", 11)) + { + ret = GLXEW_OML_swap_method; + continue; + } +#endif +#ifdef GLX_OML_sync_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync_control", 12)) + { + ret = GLXEW_OML_sync_control; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIS_", 5)) + { +#ifdef GLX_SGIS_blended_overlay + if (_glewStrSame3(&pos, &len, (const GLubyte*)"blended_overlay", 15)) + { + ret = GLXEW_SGIS_blended_overlay; + continue; + } +#endif +#ifdef GLX_SGIS_color_range + if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_range", 11)) + { + ret = GLXEW_SGIS_color_range; + continue; + } +#endif +#ifdef GLX_SGIS_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample", 11)) + { + ret = GLXEW_SGIS_multisample; + continue; + } +#endif +#ifdef GLX_SGIS_shared_multisample + if (_glewStrSame3(&pos, &len, (const GLubyte*)"shared_multisample", 18)) + { + ret = GLXEW_SGIS_shared_multisample; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGIX_", 5)) + { +#ifdef GLX_SGIX_fbconfig + if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig", 8)) + { + ret = GLXEW_SGIX_fbconfig; + continue; + } +#endif +#ifdef GLX_SGIX_hyperpipe + if (_glewStrSame3(&pos, &len, (const GLubyte*)"hyperpipe", 9)) + { + ret = GLXEW_SGIX_hyperpipe; + continue; + } +#endif +#ifdef GLX_SGIX_pbuffer + if (_glewStrSame3(&pos, &len, (const GLubyte*)"pbuffer", 7)) + { + ret = GLXEW_SGIX_pbuffer; + continue; + } +#endif +#ifdef GLX_SGIX_swap_barrier + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_barrier", 12)) + { + ret = GLXEW_SGIX_swap_barrier; + continue; + } +#endif +#ifdef GLX_SGIX_swap_group + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_group", 10)) + { + ret = GLXEW_SGIX_swap_group; + continue; + } +#endif +#ifdef GLX_SGIX_video_resize + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) + { + ret = GLXEW_SGIX_video_resize; + continue; + } +#endif +#ifdef GLX_SGIX_visual_select_group + if (_glewStrSame3(&pos, &len, (const GLubyte*)"visual_select_group", 19)) + { + ret = GLXEW_SGIX_visual_select_group; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SGI_", 4)) + { +#ifdef GLX_SGI_cushion + if (_glewStrSame3(&pos, &len, (const GLubyte*)"cushion", 7)) + { + ret = GLXEW_SGI_cushion; + continue; + } +#endif +#ifdef GLX_SGI_make_current_read + if (_glewStrSame3(&pos, &len, (const GLubyte*)"make_current_read", 17)) + { + ret = GLXEW_SGI_make_current_read; + continue; + } +#endif +#ifdef GLX_SGI_swap_control + if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12)) + { + ret = GLXEW_SGI_swap_control; + continue; + } +#endif +#ifdef GLX_SGI_video_sync + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_sync", 10)) + { + ret = GLXEW_SGI_video_sync; + continue; + } +#endif + } + if (_glewStrSame2(&pos, &len, (const GLubyte*)"SUN_", 4)) + { +#ifdef GLX_SUN_get_transparent_index + if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_transparent_index", 21)) + { + ret = GLXEW_SUN_get_transparent_index; + continue; + } +#endif +#ifdef GLX_SUN_video_resize + if (_glewStrSame3(&pos, &len, (const GLubyte*)"video_resize", 12)) + { + ret = GLXEW_SUN_video_resize; + continue; + } +#endif + } + } + ret = (len == 0); + } + return ret; +} + +#endif /* _WIN32 */ + +#endif /* SLIC3R_GUI */ diff --git a/deps/GMP/GMP.cmake b/deps/GMP/GMP.cmake new file mode 100644 index 0000000000..08b2868911 --- /dev/null +++ b/deps/GMP/GMP.cmake @@ -0,0 +1,44 @@ + +set(_srcdir ${CMAKE_CURRENT_LIST_DIR}/gmp) +set(_dstdir ${DESTDIR}/usr/local) + +if (MSVC) + set(_output ${_dstdir}/include/gmp.h + ${_dstdir}/lib/libgmp-10.lib + ${_dstdir}/bin/libgmp-10.dll) + + add_custom_command( + OUTPUT ${_output} + COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/include/gmp.h ${_dstdir}/include/ + COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/lib/win${DEPS_BITS}/libgmp-10.lib ${_dstdir}/lib/ + COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/lib/win${DEPS_BITS}/libgmp-10.dll ${_dstdir}/bin/ + ) + + add_custom_target(dep_GMP SOURCES ${_output}) + +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) + 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") + set(_gmp_build_tgt "--build=${_gmp_build_tgt}-pc-linux-gnu") + else () + set(_gmp_build_tgt "") # let it guess + endif() + + 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 + 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 + INSTALL_COMMAND make install + ) +endif () \ No newline at end of file diff --git a/deps/GMP/gmp/gmp.COPYING b/deps/GMP/gmp/gmp.COPYING new file mode 100644 index 0000000000..94a9ed024d --- /dev/null +++ b/deps/GMP/gmp/gmp.COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is 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. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + 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. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + 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 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. Use with the GNU Affero General Public License. + + 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 Affero 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 special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 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 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 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. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + 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 GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/deps/GMP/gmp/gmp.README b/deps/GMP/gmp/gmp.README new file mode 100644 index 0000000000..03ffb7ff30 --- /dev/null +++ b/deps/GMP/gmp/gmp.README @@ -0,0 +1,105 @@ +Copyright 1991, 1996, 1999, 2000, 2007 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The GNU MP Library 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 Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. + + + + + + + THE GNU MP LIBRARY + + +GNU MP is a library for arbitrary precision arithmetic, operating on signed +integers, rational numbers, and floating point numbers. It has a rich set of +functions, and the functions have a regular interface. + +GNU MP is designed to be as fast as possible, both for small operands and huge +operands. The speed is achieved by using fullwords as the basic arithmetic +type, by using fast algorithms, with carefully optimized assembly code for the +most common inner loops for lots of CPUs, and by a general emphasis on speed +(instead of simplicity or elegance). + +GNU MP is believed to be faster than any other similar library. Its advantage +increases with operand sizes for certain operations, since GNU MP in many +cases has asymptotically faster algorithms. + +GNU MP is free software and may be freely copied on the terms contained in the +files COPYING.LIB and COPYING (most of GNU MP is under the former, some under +the latter). + + + + OVERVIEW OF GNU MP + +There are five classes of functions in GNU MP. + + 1. Signed integer arithmetic functions (mpz). These functions are intended + to be easy to use, with their regular interface. The associated type is + `mpz_t'. + + 2. Rational arithmetic functions (mpq). For now, just a small set of + functions necessary for basic rational arithmetics. The associated type + is `mpq_t'. + + 3. Floating-point arithmetic functions (mpf). If the C type `double' + doesn't give enough precision for your application, declare your + variables as `mpf_t' instead, set the precision to any number desired, + and call the functions in the mpf class for the arithmetic operations. + + 4. Positive-integer, hard-to-use, very low overhead functions are in the + mpn class. No memory management is performed. The caller must ensure + enough space is available for the results. The set of functions is not + regular, nor is the calling interface. These functions accept input + arguments in the form of pairs consisting of a pointer to the least + significant word, and an integral size telling how many limbs (= words) + the pointer points to. + + Almost all calculations, in the entire package, are made by calling these + low-level functions. + + 5. Berkeley MP compatible functions. + + To use these functions, include the file "mp.h". You can test if you are + using the GNU version by testing if the symbol __GNU_MP__ is defined. + +For more information on how to use GNU MP, please refer to the documentation. +It is composed from the file doc/gmp.texi, and can be displayed on the screen +or printed. How to do that, as well how to build the library, is described in +the INSTALL file in this directory. + + + + REPORTING BUGS + +If you find a bug in the library, please make sure to tell us about it! + +You should first check the GNU MP web pages at http://gmplib.org/, under +"Status of the current release". There will be patches for all known serious +bugs there. + +Report bugs to gmp-bugs@gmplib.org. What information is needed in a useful bug +report is described in the manual. The same address can be used for suggesting +modifications and enhancements. + + + + +---------------- +Local variables: +mode: text +fill-column: 78 +End: diff --git a/deps/GMP/gmp/include/gmp.h b/deps/GMP/gmp/include/gmp.h new file mode 100644 index 0000000000..4209aa8b3a --- /dev/null +++ b/deps/GMP/gmp/include/gmp.h @@ -0,0 +1,2280 @@ +/* Definitions for GNU multiple precision functions. -*- mode: c -*- + +Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, +2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The GNU MP Library 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 Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ + +#ifndef __GMP_H__ + +#if defined (__cplusplus) +#include /* for std::istream, std::ostream, std::string */ +#include +#endif + + +/* Instantiated by configure. */ +#if ! defined (__GMP_WITHIN_CONFIGURE) +#define __GMP_HAVE_HOST_CPU_FAMILY_power 0 +#define __GMP_HAVE_HOST_CPU_FAMILY_powerpc 0 +#define GMP_LIMB_BITS 64 +#define GMP_NAIL_BITS 0 +#endif +#define GMP_NUMB_BITS (GMP_LIMB_BITS - GMP_NAIL_BITS) +#define GMP_NUMB_MASK ((~ __GMP_CAST (mp_limb_t, 0)) >> GMP_NAIL_BITS) +#define GMP_NUMB_MAX GMP_NUMB_MASK +#define GMP_NAIL_MASK (~ GMP_NUMB_MASK) + + +/* The following (everything under ifndef __GNU_MP__) must be identical in + gmp.h and mp.h to allow both to be included in an application or during + the library build. */ +#ifndef __GNU_MP__ +#define __GNU_MP__ 5 + +#define __need_size_t /* tell gcc stddef.h we only want size_t */ +#if defined (__cplusplus) +#include /* for size_t */ +#else +#include /* for size_t */ +#endif +#undef __need_size_t + +/* Instantiated by configure. */ +#if ! defined (__GMP_WITHIN_CONFIGURE) +#define _LONG_LONG_LIMB 1 +#define __GMP_LIBGMP_DLL 1 +#endif + + +/* __STDC__ - some ANSI compilers define this only to 0, hence the use of + "defined" and not "__STDC__-0". In particular Sun workshop C 5.0 + sets __STDC__ to 0, but requires "##" for token pasting. + + _AIX - gnu ansidecl.h asserts that all known AIX compilers are ANSI but + don't always define __STDC__. + + __DECC - current versions of DEC C (5.9 for instance) for alpha are ANSI, + but don't define __STDC__ in their default mode. Don't know if old + versions might have been K&R, but let's not worry about that unless + someone is still using one. + + _mips - gnu ansidecl.h says the RISC/OS MIPS compiler is ANSI in SVR4 + mode, but doesn't define __STDC__. + + _MSC_VER - Microsoft C is ANSI, but __STDC__ is undefined unless the /Za + option is given (in which case it's 1). + + _WIN32 - tested for by gnu ansidecl.h, no doubt on the assumption that + all w32 compilers are ansi. + + Note: This same set of tests is used by gen-psqr.c and + demos/expr/expr-impl.h, so if anything needs adding, then be sure to + update those too. */ + +#if defined (__STDC__) \ + || defined (__cplusplus) \ + || defined (_AIX) \ + || defined (__DECC) \ + || (defined (__mips) && defined (_SYSTYPE_SVR4)) \ + || defined (_MSC_VER) \ + || defined (_WIN32) +#define __GMP_HAVE_CONST 1 +#define __GMP_HAVE_PROTOTYPES 1 +#define __GMP_HAVE_TOKEN_PASTE 1 +#else +#define __GMP_HAVE_CONST 0 +#define __GMP_HAVE_PROTOTYPES 0 +#define __GMP_HAVE_TOKEN_PASTE 0 +#endif + + +#if __GMP_HAVE_CONST +#define __gmp_const const +#define __gmp_signed signed +#else +#define __gmp_const +#define __gmp_signed +#endif + + +/* __GMP_DECLSPEC supports Windows DLL versions of libgmp, and is empty in + all other circumstances. + + When compiling objects for libgmp, __GMP_DECLSPEC is an export directive, + or when compiling for an application it's an import directive. The two + cases are differentiated by __GMP_WITHIN_GMP defined by the GMP Makefiles + (and not defined from an application). + + __GMP_DECLSPEC_XX is similarly used for libgmpxx. __GMP_WITHIN_GMPXX + indicates when building libgmpxx, and in that case libgmpxx functions are + exports, but libgmp functions which might get called are imports. + + libmp.la uses __GMP_DECLSPEC, just as if it were libgmp.la. libgmp and + libmp don't call each other, so there's no conflict or confusion. + + Libtool DLL_EXPORT define is not used. + + There's no attempt to support GMP built both static and DLL. Doing so + would mean applications would have to tell us which of the two is going + to be used when linking, and that seems very tedious and error prone if + using GMP by hand, and equally tedious from a package since autoconf and + automake don't give much help. + + __GMP_DECLSPEC is required on all documented global functions and + variables, the various internals in gmp-impl.h etc can be left unadorned. + But internals used by the test programs or speed measuring programs + should have __GMP_DECLSPEC, and certainly constants or variables must + have it or the wrong address will be resolved. + + In gcc __declspec can go at either the start or end of a prototype. + + In Microsoft C __declspec must go at the start, or after the type like + void __declspec(...) *foo()". There's no __dllexport or anything to + guard against someone foolish #defining dllexport. _export used to be + available, but no longer. + + In Borland C _export still exists, but needs to go after the type, like + "void _export foo();". Would have to change the __GMP_DECLSPEC syntax to + make use of that. Probably more trouble than it's worth. */ + +#if defined (__GNUC__) +#define __GMP_DECLSPEC_EXPORT __declspec(__dllexport__) +#define __GMP_DECLSPEC_IMPORT __declspec(__dllimport__) +#endif +#if defined (_MSC_VER) || defined (__BORLANDC__) +#define __GMP_DECLSPEC_EXPORT __declspec(dllexport) +#define __GMP_DECLSPEC_IMPORT __declspec(dllimport) +#endif +#ifdef __WATCOMC__ +#define __GMP_DECLSPEC_EXPORT __export +#define __GMP_DECLSPEC_IMPORT __import +#endif +#ifdef __IBMC__ +#define __GMP_DECLSPEC_EXPORT _Export +#define __GMP_DECLSPEC_IMPORT _Import +#endif + +#if __GMP_LIBGMP_DLL +#if __GMP_WITHIN_GMP +/* compiling to go into a DLL libgmp */ +#define __GMP_DECLSPEC __GMP_DECLSPEC_EXPORT +#else +/* compiling to go into an application which will link to a DLL libgmp */ +#define __GMP_DECLSPEC __GMP_DECLSPEC_IMPORT +#endif +#else +/* all other cases */ +#define __GMP_DECLSPEC +#endif + + +#ifdef __GMP_SHORT_LIMB +typedef unsigned int mp_limb_t; +typedef int mp_limb_signed_t; +#else +#ifdef _LONG_LONG_LIMB +typedef unsigned long long int mp_limb_t; +typedef long long int mp_limb_signed_t; +#else +typedef unsigned long int mp_limb_t; +typedef long int mp_limb_signed_t; +#endif +#endif +typedef unsigned long int mp_bitcnt_t; + +/* For reference, note that the name __mpz_struct gets into C++ mangled + function names, which means although the "__" suggests an internal, we + must leave this name for binary compatibility. */ +typedef struct +{ + int _mp_alloc; /* Number of *limbs* allocated and pointed + to by the _mp_d field. */ + int _mp_size; /* abs(_mp_size) is the number of limbs the + last field points to. If _mp_size is + negative this is a negative number. */ + mp_limb_t *_mp_d; /* Pointer to the limbs. */ +} __mpz_struct; + +#endif /* __GNU_MP__ */ + + +typedef __mpz_struct MP_INT; /* gmp 1 source compatibility */ +typedef __mpz_struct mpz_t[1]; + +typedef mp_limb_t * mp_ptr; +typedef __gmp_const mp_limb_t * mp_srcptr; +#if defined (_CRAY) && ! defined (_CRAYMPP) +/* plain `int' is much faster (48 bits) */ +#define __GMP_MP_SIZE_T_INT 1 +typedef int mp_size_t; +typedef int mp_exp_t; +#else +#define __GMP_MP_SIZE_T_INT 0 +typedef long int mp_size_t; +typedef long int mp_exp_t; +#endif + +typedef struct +{ + __mpz_struct _mp_num; + __mpz_struct _mp_den; +} __mpq_struct; + +typedef __mpq_struct MP_RAT; /* gmp 1 source compatibility */ +typedef __mpq_struct mpq_t[1]; + +typedef struct +{ + int _mp_prec; /* Max precision, in number of `mp_limb_t's. + Set by mpf_init and modified by + mpf_set_prec. The area pointed to by the + _mp_d field contains `prec' + 1 limbs. */ + int _mp_size; /* abs(_mp_size) is the number of limbs the + last field points to. If _mp_size is + negative this is a negative number. */ + mp_exp_t _mp_exp; /* Exponent, in the base of `mp_limb_t'. */ + mp_limb_t *_mp_d; /* Pointer to the limbs. */ +} __mpf_struct; + +/* typedef __mpf_struct MP_FLOAT; */ +typedef __mpf_struct mpf_t[1]; + +/* Available random number generation algorithms. */ +typedef enum +{ + GMP_RAND_ALG_DEFAULT = 0, + GMP_RAND_ALG_LC = GMP_RAND_ALG_DEFAULT /* Linear congruential. */ +} gmp_randalg_t; + +/* Random state struct. */ +typedef struct +{ + mpz_t _mp_seed; /* _mp_d member points to state of the generator. */ + gmp_randalg_t _mp_alg; /* Currently unused. */ + union { + void *_mp_lc; /* Pointer to function pointers structure. */ + } _mp_algdata; +} __gmp_randstate_struct; +typedef __gmp_randstate_struct gmp_randstate_t[1]; + +/* Types for function declarations in gmp files. */ +/* ??? Should not pollute user name space with these ??? */ +typedef __gmp_const __mpz_struct *mpz_srcptr; +typedef __mpz_struct *mpz_ptr; +typedef __gmp_const __mpf_struct *mpf_srcptr; +typedef __mpf_struct *mpf_ptr; +typedef __gmp_const __mpq_struct *mpq_srcptr; +typedef __mpq_struct *mpq_ptr; + + +/* This is not wanted in mp.h, so put it outside the __GNU_MP__ common + section. */ +#if __GMP_LIBGMP_DLL +#if __GMP_WITHIN_GMPXX +/* compiling to go into a DLL libgmpxx */ +#define __GMP_DECLSPEC_XX __GMP_DECLSPEC_EXPORT +#else +/* compiling to go into a application which will link to a DLL libgmpxx */ +#define __GMP_DECLSPEC_XX __GMP_DECLSPEC_IMPORT +#endif +#else +/* all other cases */ +#define __GMP_DECLSPEC_XX +#endif + + +#if __GMP_HAVE_PROTOTYPES +#define __GMP_PROTO(x) x +#else +#define __GMP_PROTO(x) () +#endif + +#ifndef __MPN +#if __GMP_HAVE_TOKEN_PASTE +#define __MPN(x) __gmpn_##x +#else +#define __MPN(x) __gmpn_/**/x +#endif +#endif + +/* For reference, "defined(EOF)" cannot be used here. In g++ 2.95.4, + defines EOF but not FILE. */ +#if defined (FILE) \ + || defined (H_STDIO) \ + || defined (_H_STDIO) /* AIX */ \ + || defined (_STDIO_H) /* glibc, Sun, SCO */ \ + || defined (_STDIO_H_) /* BSD, OSF */ \ + || defined (__STDIO_H) /* Borland */ \ + || defined (__STDIO_H__) /* IRIX */ \ + || defined (_STDIO_INCLUDED) /* HPUX */ \ + || defined (__dj_include_stdio_h_) /* DJGPP */ \ + || defined (_FILE_DEFINED) /* Microsoft */ \ + || defined (__STDIO__) /* Apple MPW MrC */ \ + || defined (_MSL_STDIO_H) /* Metrowerks */ \ + || defined (_STDIO_H_INCLUDED) /* QNX4 */ \ + || defined (_ISO_STDIO_ISO_H) /* Sun C++ */ +#define _GMP_H_HAVE_FILE 1 +#endif + +/* In ISO C, if a prototype involving "struct obstack *" is given without + that structure defined, then the struct is scoped down to just the + prototype, causing a conflict if it's subsequently defined for real. So + only give prototypes if we've got obstack.h. */ +#if defined (_OBSTACK_H) /* glibc */ +#define _GMP_H_HAVE_OBSTACK 1 +#endif + +/* The prototypes for gmp_vprintf etc are provided only if va_list is + available, via an application having included or . + Usually va_list is a typedef so can't be tested directly, but C99 + specifies that va_start is a macro (and it was normally a macro on past + systems too), so look for that. + + will define some sort of va_list for vprintf and vfprintf, but + let's not bother trying to use that since it's not standard and since + application uses for gmp_vprintf etc will almost certainly require the + whole or anyway. */ + +#ifdef va_start +#define _GMP_H_HAVE_VA_LIST 1 +#endif + +/* Test for gcc >= maj.min, as per __GNUC_PREREQ in glibc */ +#if defined (__GNUC__) && defined (__GNUC_MINOR__) +#define __GMP_GNUC_PREREQ(maj, min) \ + ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) +#else +#define __GMP_GNUC_PREREQ(maj, min) 0 +#endif + +/* "pure" is in gcc 2.96 and up, see "(gcc)Function Attributes". Basically + it means a function does nothing but examine its arguments and memory + (global or via arguments) to generate a return value, but changes nothing + and has no side-effects. __GMP_NO_ATTRIBUTE_CONST_PURE lets + tune/common.c etc turn this off when trying to write timing loops. */ +#if __GMP_GNUC_PREREQ (2,96) && ! defined (__GMP_NO_ATTRIBUTE_CONST_PURE) +#define __GMP_ATTRIBUTE_PURE __attribute__ ((__pure__)) +#else +#define __GMP_ATTRIBUTE_PURE +#endif + + +/* __GMP_CAST allows us to use static_cast in C++, so our macros are clean + to "g++ -Wold-style-cast". + + Casts in "extern inline" code within an extern "C" block don't induce + these warnings, so __GMP_CAST only needs to be used on documented + macros. */ + +#ifdef __cplusplus +#define __GMP_CAST(type, expr) (static_cast (expr)) +#else +#define __GMP_CAST(type, expr) ((type) (expr)) +#endif + + +/* An empty "throw ()" means the function doesn't throw any C++ exceptions, + this can save some stack frame info in applications. + + Currently it's given only on functions which never divide-by-zero etc, + don't allocate memory, and are expected to never need to allocate memory. + This leaves open the possibility of a C++ throw from a future GMP + exceptions scheme. + + mpz_set_ui etc are omitted to leave open the lazy allocation scheme + described in doc/tasks.html. mpz_get_d etc are omitted to leave open + exceptions for float overflows. + + Note that __GMP_NOTHROW must be given on any inlines the same as on their + prototypes (for g++ at least, where they're used together). Note also + that g++ 3.0 demands that __GMP_NOTHROW is before other attributes like + __GMP_ATTRIBUTE_PURE. */ + +#if defined (__cplusplus) +#define __GMP_NOTHROW throw () +#else +#define __GMP_NOTHROW +#endif + + +/* PORTME: What other compilers have a useful "extern inline"? "static + inline" would be an acceptable substitute if the compiler (or linker) + discards unused statics. */ + + /* gcc has __inline__ in all modes, including strict ansi. Give a prototype + for an inline too, so as to correctly specify "dllimport" on windows, in + case the function is called rather than inlined. + GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99 + inline semantics, unless -fgnu89-inline is used. */ +#ifdef __GNUC__ +#if (defined __GNUC_STDC_INLINE__) || (__GNUC__ == 4 && __GNUC_MINOR__ == 2) +#define __GMP_EXTERN_INLINE extern __inline__ __attribute__ ((__gnu_inline__)) +#else +#define __GMP_EXTERN_INLINE extern __inline__ +#endif +#define __GMP_INLINE_PROTOTYPES 1 +#endif + +/* DEC C (eg. version 5.9) supports "static __inline foo()", even in -std1 + strict ANSI mode. Inlining is done even when not optimizing (ie. -O0 + mode, which is the default), but an unnecessary local copy of foo is + emitted unless -O is used. "extern __inline" is accepted, but the + "extern" appears to be ignored, ie. it becomes a plain global function + but which is inlined within its file. Don't know if all old versions of + DEC C supported __inline, but as a start let's do the right thing for + current versions. */ +#ifdef __DECC +#define __GMP_EXTERN_INLINE static __inline +#endif + +/* SCO OpenUNIX 8 cc supports "static inline foo()" but not in -Xc strict + ANSI mode (__STDC__ is 1 in that mode). Inlining only actually takes + place under -O. Without -O "foo" seems to be emitted whether it's used + or not, which is wasteful. "extern inline foo()" isn't useful, the + "extern" is apparently ignored, so foo is inlined if possible but also + emitted as a global, which causes multiple definition errors when + building a shared libgmp. */ +#ifdef __SCO_VERSION__ +#if __SCO_VERSION__ > 400000000 && __STDC__ != 1 \ + && ! defined (__GMP_EXTERN_INLINE) +#define __GMP_EXTERN_INLINE static inline +#endif +#endif + +/* Microsoft's C compiler accepts __inline */ +#ifdef _MSC_VER +#define __GMP_EXTERN_INLINE __inline +#endif + +/* Recent enough Sun C compilers want "inline" */ +#if defined (__SUNPRO_C) && __SUNPRO_C >= 0x560 \ + && ! defined (__GMP_EXTERN_INLINE) +#define __GMP_EXTERN_INLINE inline +#endif + +/* Somewhat older Sun C compilers want "static inline" */ +#if defined (__SUNPRO_C) && __SUNPRO_C >= 0x540 \ + && ! defined (__GMP_EXTERN_INLINE) +#define __GMP_EXTERN_INLINE static inline +#endif + + +/* C++ always has "inline" and since it's a normal feature the linker should + discard duplicate non-inlined copies, or if it doesn't then that's a + problem for everyone, not just GMP. */ +#if defined (__cplusplus) && ! defined (__GMP_EXTERN_INLINE) +#define __GMP_EXTERN_INLINE inline +#endif + +/* Don't do any inlining within a configure run, since if the compiler ends + up emitting copies of the code into the object file it can end up + demanding the various support routines (like mpn_popcount) for linking, + making the "alloca" test and perhaps others fail. And on hppa ia64 a + pre-release gcc 3.2 was seen not respecting the "extern" in "extern + __inline__", triggering this problem too. */ +#if defined (__GMP_WITHIN_CONFIGURE) && ! __GMP_WITHIN_CONFIGURE_INLINE +#undef __GMP_EXTERN_INLINE +#endif + +/* By default, don't give a prototype when there's going to be an inline + version. Note in particular that Cray C++ objects to the combination of + prototype and inline. */ +#ifdef __GMP_EXTERN_INLINE +#ifndef __GMP_INLINE_PROTOTYPES +#define __GMP_INLINE_PROTOTYPES 0 +#endif +#else +#define __GMP_INLINE_PROTOTYPES 1 +#endif + + +#define __GMP_ABS(x) ((x) >= 0 ? (x) : -(x)) +#define __GMP_MAX(h,i) ((h) > (i) ? (h) : (i)) + +/* __GMP_USHRT_MAX is not "~ (unsigned short) 0" because short is promoted + to int by "~". */ +#define __GMP_UINT_MAX (~ (unsigned) 0) +#define __GMP_ULONG_MAX (~ (unsigned long) 0) +#define __GMP_USHRT_MAX ((unsigned short) ~0) + + +/* __builtin_expect is in gcc 3.0, and not in 2.95. */ +#if __GMP_GNUC_PREREQ (3,0) +#define __GMP_LIKELY(cond) __builtin_expect ((cond) != 0, 1) +#define __GMP_UNLIKELY(cond) __builtin_expect ((cond) != 0, 0) +#else +#define __GMP_LIKELY(cond) (cond) +#define __GMP_UNLIKELY(cond) (cond) +#endif + +#ifdef _CRAY +#define __GMP_CRAY_Pragma(str) _Pragma (str) +#else +#define __GMP_CRAY_Pragma(str) +#endif + + +/* Allow direct user access to numerator and denominator of a mpq_t object. */ +#define mpq_numref(Q) (&((Q)->_mp_num)) +#define mpq_denref(Q) (&((Q)->_mp_den)) + + +#if defined (__cplusplus) +extern "C" { +using std::FILE; +#endif + +#define mp_set_memory_functions __gmp_set_memory_functions +__GMP_DECLSPEC void mp_set_memory_functions __GMP_PROTO ((void *(*) (size_t), + void *(*) (void *, size_t, size_t), + void (*) (void *, size_t))) __GMP_NOTHROW; + +#define mp_get_memory_functions __gmp_get_memory_functions +__GMP_DECLSPEC void mp_get_memory_functions __GMP_PROTO ((void *(**) (size_t), + void *(**) (void *, size_t, size_t), + void (**) (void *, size_t))) __GMP_NOTHROW; + +#define mp_bits_per_limb __gmp_bits_per_limb +__GMP_DECLSPEC extern __gmp_const int mp_bits_per_limb; + +#define gmp_errno __gmp_errno +__GMP_DECLSPEC extern int gmp_errno; + +#define gmp_version __gmp_version +__GMP_DECLSPEC extern __gmp_const char * __gmp_const gmp_version; + + +/**************** Random number routines. ****************/ + +/* obsolete */ +#define gmp_randinit __gmp_randinit +__GMP_DECLSPEC void gmp_randinit __GMP_PROTO ((gmp_randstate_t, gmp_randalg_t, ...)); + +#define gmp_randinit_default __gmp_randinit_default +__GMP_DECLSPEC void gmp_randinit_default __GMP_PROTO ((gmp_randstate_t)); + +#define gmp_randinit_lc_2exp __gmp_randinit_lc_2exp +__GMP_DECLSPEC void gmp_randinit_lc_2exp __GMP_PROTO ((gmp_randstate_t, + mpz_srcptr, unsigned long int, + mp_bitcnt_t)); + +#define gmp_randinit_lc_2exp_size __gmp_randinit_lc_2exp_size +__GMP_DECLSPEC int gmp_randinit_lc_2exp_size __GMP_PROTO ((gmp_randstate_t, mp_bitcnt_t)); + +#define gmp_randinit_mt __gmp_randinit_mt +__GMP_DECLSPEC void gmp_randinit_mt __GMP_PROTO ((gmp_randstate_t)); + +#define gmp_randinit_set __gmp_randinit_set +__GMP_DECLSPEC void gmp_randinit_set __GMP_PROTO ((gmp_randstate_t, __gmp_const __gmp_randstate_struct *)); + +#define gmp_randseed __gmp_randseed +__GMP_DECLSPEC void gmp_randseed __GMP_PROTO ((gmp_randstate_t, mpz_srcptr)); + +#define gmp_randseed_ui __gmp_randseed_ui +__GMP_DECLSPEC void gmp_randseed_ui __GMP_PROTO ((gmp_randstate_t, unsigned long int)); + +#define gmp_randclear __gmp_randclear +__GMP_DECLSPEC void gmp_randclear __GMP_PROTO ((gmp_randstate_t)); + +#define gmp_urandomb_ui __gmp_urandomb_ui +__GMP_DECLSPEC unsigned long gmp_urandomb_ui __GMP_PROTO ((gmp_randstate_t, unsigned long)); + +#define gmp_urandomm_ui __gmp_urandomm_ui +__GMP_DECLSPEC unsigned long gmp_urandomm_ui __GMP_PROTO ((gmp_randstate_t, unsigned long)); + + +/**************** Formatted output routines. ****************/ + +#define gmp_asprintf __gmp_asprintf +__GMP_DECLSPEC int gmp_asprintf __GMP_PROTO ((char **, __gmp_const char *, ...)); + +#define gmp_fprintf __gmp_fprintf +#ifdef _GMP_H_HAVE_FILE +__GMP_DECLSPEC int gmp_fprintf __GMP_PROTO ((FILE *, __gmp_const char *, ...)); +#endif + +#define gmp_obstack_printf __gmp_obstack_printf +#if defined (_GMP_H_HAVE_OBSTACK) +__GMP_DECLSPEC int gmp_obstack_printf __GMP_PROTO ((struct obstack *, __gmp_const char *, ...)); +#endif + +#define gmp_obstack_vprintf __gmp_obstack_vprintf +#if defined (_GMP_H_HAVE_OBSTACK) && defined (_GMP_H_HAVE_VA_LIST) +__GMP_DECLSPEC int gmp_obstack_vprintf __GMP_PROTO ((struct obstack *, __gmp_const char *, va_list)); +#endif + +#define gmp_printf __gmp_printf +__GMP_DECLSPEC int gmp_printf __GMP_PROTO ((__gmp_const char *, ...)); + +#define gmp_snprintf __gmp_snprintf +__GMP_DECLSPEC int gmp_snprintf __GMP_PROTO ((char *, size_t, __gmp_const char *, ...)); + +#define gmp_sprintf __gmp_sprintf +__GMP_DECLSPEC int gmp_sprintf __GMP_PROTO ((char *, __gmp_const char *, ...)); + +#define gmp_vasprintf __gmp_vasprintf +#if defined (_GMP_H_HAVE_VA_LIST) +__GMP_DECLSPEC int gmp_vasprintf __GMP_PROTO ((char **, __gmp_const char *, va_list)); +#endif + +#define gmp_vfprintf __gmp_vfprintf +#if defined (_GMP_H_HAVE_FILE) && defined (_GMP_H_HAVE_VA_LIST) +__GMP_DECLSPEC int gmp_vfprintf __GMP_PROTO ((FILE *, __gmp_const char *, va_list)); +#endif + +#define gmp_vprintf __gmp_vprintf +#if defined (_GMP_H_HAVE_VA_LIST) +__GMP_DECLSPEC int gmp_vprintf __GMP_PROTO ((__gmp_const char *, va_list)); +#endif + +#define gmp_vsnprintf __gmp_vsnprintf +#if defined (_GMP_H_HAVE_VA_LIST) +__GMP_DECLSPEC int gmp_vsnprintf __GMP_PROTO ((char *, size_t, __gmp_const char *, va_list)); +#endif + +#define gmp_vsprintf __gmp_vsprintf +#if defined (_GMP_H_HAVE_VA_LIST) +__GMP_DECLSPEC int gmp_vsprintf __GMP_PROTO ((char *, __gmp_const char *, va_list)); +#endif + + +/**************** Formatted input routines. ****************/ + +#define gmp_fscanf __gmp_fscanf +#ifdef _GMP_H_HAVE_FILE +__GMP_DECLSPEC int gmp_fscanf __GMP_PROTO ((FILE *, __gmp_const char *, ...)); +#endif + +#define gmp_scanf __gmp_scanf +__GMP_DECLSPEC int gmp_scanf __GMP_PROTO ((__gmp_const char *, ...)); + +#define gmp_sscanf __gmp_sscanf +__GMP_DECLSPEC int gmp_sscanf __GMP_PROTO ((__gmp_const char *, __gmp_const char *, ...)); + +#define gmp_vfscanf __gmp_vfscanf +#if defined (_GMP_H_HAVE_FILE) && defined (_GMP_H_HAVE_VA_LIST) +__GMP_DECLSPEC int gmp_vfscanf __GMP_PROTO ((FILE *, __gmp_const char *, va_list)); +#endif + +#define gmp_vscanf __gmp_vscanf +#if defined (_GMP_H_HAVE_VA_LIST) +__GMP_DECLSPEC int gmp_vscanf __GMP_PROTO ((__gmp_const char *, va_list)); +#endif + +#define gmp_vsscanf __gmp_vsscanf +#if defined (_GMP_H_HAVE_VA_LIST) +__GMP_DECLSPEC int gmp_vsscanf __GMP_PROTO ((__gmp_const char *, __gmp_const char *, va_list)); +#endif + + +/**************** Integer (i.e. Z) routines. ****************/ + +#define _mpz_realloc __gmpz_realloc +#define mpz_realloc __gmpz_realloc +__GMP_DECLSPEC void *_mpz_realloc __GMP_PROTO ((mpz_ptr, mp_size_t)); + +#define mpz_abs __gmpz_abs +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_abs) +__GMP_DECLSPEC void mpz_abs __GMP_PROTO ((mpz_ptr, mpz_srcptr)); +#endif + +#define mpz_add __gmpz_add +__GMP_DECLSPEC void mpz_add __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_add_ui __gmpz_add_ui +__GMP_DECLSPEC void mpz_add_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_addmul __gmpz_addmul +__GMP_DECLSPEC void mpz_addmul __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_addmul_ui __gmpz_addmul_ui +__GMP_DECLSPEC void mpz_addmul_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_and __gmpz_and +__GMP_DECLSPEC void mpz_and __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_array_init __gmpz_array_init +__GMP_DECLSPEC void mpz_array_init __GMP_PROTO ((mpz_ptr, mp_size_t, mp_size_t)); + +#define mpz_bin_ui __gmpz_bin_ui +__GMP_DECLSPEC void mpz_bin_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_bin_uiui __gmpz_bin_uiui +__GMP_DECLSPEC void mpz_bin_uiui __GMP_PROTO ((mpz_ptr, unsigned long int, unsigned long int)); + +#define mpz_cdiv_q __gmpz_cdiv_q +__GMP_DECLSPEC void mpz_cdiv_q __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_cdiv_q_2exp __gmpz_cdiv_q_2exp +__GMP_DECLSPEC void mpz_cdiv_q_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long)); + +#define mpz_cdiv_q_ui __gmpz_cdiv_q_ui +__GMP_DECLSPEC unsigned long int mpz_cdiv_q_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_cdiv_qr __gmpz_cdiv_qr +__GMP_DECLSPEC void mpz_cdiv_qr __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_cdiv_qr_ui __gmpz_cdiv_qr_ui +__GMP_DECLSPEC unsigned long int mpz_cdiv_qr_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_cdiv_r __gmpz_cdiv_r +__GMP_DECLSPEC void mpz_cdiv_r __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_cdiv_r_2exp __gmpz_cdiv_r_2exp +__GMP_DECLSPEC void mpz_cdiv_r_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); + +#define mpz_cdiv_r_ui __gmpz_cdiv_r_ui +__GMP_DECLSPEC unsigned long int mpz_cdiv_r_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_cdiv_ui __gmpz_cdiv_ui +__GMP_DECLSPEC unsigned long int mpz_cdiv_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_ATTRIBUTE_PURE; + +#define mpz_clear __gmpz_clear +__GMP_DECLSPEC void mpz_clear __GMP_PROTO ((mpz_ptr)); + +#define mpz_clears __gmpz_clears +__GMP_DECLSPEC void mpz_clears __GMP_PROTO ((mpz_ptr, ...)); + +#define mpz_clrbit __gmpz_clrbit +__GMP_DECLSPEC void mpz_clrbit __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); + +#define mpz_cmp __gmpz_cmp +__GMP_DECLSPEC int mpz_cmp __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_cmp_d __gmpz_cmp_d +__GMP_DECLSPEC int mpz_cmp_d __GMP_PROTO ((mpz_srcptr, double)) __GMP_ATTRIBUTE_PURE; + +#define _mpz_cmp_si __gmpz_cmp_si +__GMP_DECLSPEC int _mpz_cmp_si __GMP_PROTO ((mpz_srcptr, signed long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define _mpz_cmp_ui __gmpz_cmp_ui +__GMP_DECLSPEC int _mpz_cmp_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_cmpabs __gmpz_cmpabs +__GMP_DECLSPEC int mpz_cmpabs __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_cmpabs_d __gmpz_cmpabs_d +__GMP_DECLSPEC int mpz_cmpabs_d __GMP_PROTO ((mpz_srcptr, double)) __GMP_ATTRIBUTE_PURE; + +#define mpz_cmpabs_ui __gmpz_cmpabs_ui +__GMP_DECLSPEC int mpz_cmpabs_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_com __gmpz_com +__GMP_DECLSPEC void mpz_com __GMP_PROTO ((mpz_ptr, mpz_srcptr)); + +#define mpz_combit __gmpz_combit +__GMP_DECLSPEC void mpz_combit __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); + +#define mpz_congruent_p __gmpz_congruent_p +__GMP_DECLSPEC int mpz_congruent_p __GMP_PROTO ((mpz_srcptr, mpz_srcptr, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; + +#define mpz_congruent_2exp_p __gmpz_congruent_2exp_p +__GMP_DECLSPEC int mpz_congruent_2exp_p __GMP_PROTO ((mpz_srcptr, mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_congruent_ui_p __gmpz_congruent_ui_p +__GMP_DECLSPEC int mpz_congruent_ui_p __GMP_PROTO ((mpz_srcptr, unsigned long, unsigned long)) __GMP_ATTRIBUTE_PURE; + +#define mpz_divexact __gmpz_divexact +__GMP_DECLSPEC void mpz_divexact __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_divexact_ui __gmpz_divexact_ui +__GMP_DECLSPEC void mpz_divexact_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long)); + +#define mpz_divisible_p __gmpz_divisible_p +__GMP_DECLSPEC int mpz_divisible_p __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; + +#define mpz_divisible_ui_p __gmpz_divisible_ui_p +__GMP_DECLSPEC int mpz_divisible_ui_p __GMP_PROTO ((mpz_srcptr, unsigned long)) __GMP_ATTRIBUTE_PURE; + +#define mpz_divisible_2exp_p __gmpz_divisible_2exp_p +__GMP_DECLSPEC int mpz_divisible_2exp_p __GMP_PROTO ((mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_dump __gmpz_dump +__GMP_DECLSPEC void mpz_dump __GMP_PROTO ((mpz_srcptr)); + +#define mpz_export __gmpz_export +__GMP_DECLSPEC void *mpz_export __GMP_PROTO ((void *, size_t *, int, size_t, int, size_t, mpz_srcptr)); + +#define mpz_fac_ui __gmpz_fac_ui +__GMP_DECLSPEC void mpz_fac_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); + +#define mpz_fdiv_q __gmpz_fdiv_q +__GMP_DECLSPEC void mpz_fdiv_q __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_fdiv_q_2exp __gmpz_fdiv_q_2exp +__GMP_DECLSPEC void mpz_fdiv_q_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); + +#define mpz_fdiv_q_ui __gmpz_fdiv_q_ui +__GMP_DECLSPEC unsigned long int mpz_fdiv_q_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_fdiv_qr __gmpz_fdiv_qr +__GMP_DECLSPEC void mpz_fdiv_qr __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_fdiv_qr_ui __gmpz_fdiv_qr_ui +__GMP_DECLSPEC unsigned long int mpz_fdiv_qr_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_fdiv_r __gmpz_fdiv_r +__GMP_DECLSPEC void mpz_fdiv_r __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_fdiv_r_2exp __gmpz_fdiv_r_2exp +__GMP_DECLSPEC void mpz_fdiv_r_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); + +#define mpz_fdiv_r_ui __gmpz_fdiv_r_ui +__GMP_DECLSPEC unsigned long int mpz_fdiv_r_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_fdiv_ui __gmpz_fdiv_ui +__GMP_DECLSPEC unsigned long int mpz_fdiv_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_ATTRIBUTE_PURE; + +#define mpz_fib_ui __gmpz_fib_ui +__GMP_DECLSPEC void mpz_fib_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); + +#define mpz_fib2_ui __gmpz_fib2_ui +__GMP_DECLSPEC void mpz_fib2_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, unsigned long int)); + +#define mpz_fits_sint_p __gmpz_fits_sint_p +__GMP_DECLSPEC int mpz_fits_sint_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_fits_slong_p __gmpz_fits_slong_p +__GMP_DECLSPEC int mpz_fits_slong_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_fits_sshort_p __gmpz_fits_sshort_p +__GMP_DECLSPEC int mpz_fits_sshort_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_fits_uint_p __gmpz_fits_uint_p +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_uint_p) +__GMP_DECLSPEC int mpz_fits_uint_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; +#endif + +#define mpz_fits_ulong_p __gmpz_fits_ulong_p +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_ulong_p) +__GMP_DECLSPEC int mpz_fits_ulong_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; +#endif + +#define mpz_fits_ushort_p __gmpz_fits_ushort_p +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_fits_ushort_p) +__GMP_DECLSPEC int mpz_fits_ushort_p __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; +#endif + +#define mpz_gcd __gmpz_gcd +__GMP_DECLSPEC void mpz_gcd __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_gcd_ui __gmpz_gcd_ui +__GMP_DECLSPEC unsigned long int mpz_gcd_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_gcdext __gmpz_gcdext +__GMP_DECLSPEC void mpz_gcdext __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_get_d __gmpz_get_d +__GMP_DECLSPEC double mpz_get_d __GMP_PROTO ((mpz_srcptr)) __GMP_ATTRIBUTE_PURE; + +#define mpz_get_d_2exp __gmpz_get_d_2exp +__GMP_DECLSPEC double mpz_get_d_2exp __GMP_PROTO ((signed long int *, mpz_srcptr)); + +#define mpz_get_si __gmpz_get_si +__GMP_DECLSPEC /* signed */ long int mpz_get_si __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_get_str __gmpz_get_str +__GMP_DECLSPEC char *mpz_get_str __GMP_PROTO ((char *, int, mpz_srcptr)); + +#define mpz_get_ui __gmpz_get_ui +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_get_ui) +__GMP_DECLSPEC unsigned long int mpz_get_ui __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; +#endif + +#define mpz_getlimbn __gmpz_getlimbn +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_getlimbn) +__GMP_DECLSPEC mp_limb_t mpz_getlimbn __GMP_PROTO ((mpz_srcptr, mp_size_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; +#endif + +#define mpz_hamdist __gmpz_hamdist +__GMP_DECLSPEC mp_bitcnt_t mpz_hamdist __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_import __gmpz_import +__GMP_DECLSPEC void mpz_import __GMP_PROTO ((mpz_ptr, size_t, int, size_t, int, size_t, __gmp_const void *)); + +#define mpz_init __gmpz_init +__GMP_DECLSPEC void mpz_init __GMP_PROTO ((mpz_ptr)); + +#define mpz_init2 __gmpz_init2 +__GMP_DECLSPEC void mpz_init2 __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); + +#define mpz_inits __gmpz_inits +__GMP_DECLSPEC void mpz_inits __GMP_PROTO ((mpz_ptr, ...)); + +#define mpz_init_set __gmpz_init_set +__GMP_DECLSPEC void mpz_init_set __GMP_PROTO ((mpz_ptr, mpz_srcptr)); + +#define mpz_init_set_d __gmpz_init_set_d +__GMP_DECLSPEC void mpz_init_set_d __GMP_PROTO ((mpz_ptr, double)); + +#define mpz_init_set_si __gmpz_init_set_si +__GMP_DECLSPEC void mpz_init_set_si __GMP_PROTO ((mpz_ptr, signed long int)); + +#define mpz_init_set_str __gmpz_init_set_str +__GMP_DECLSPEC int mpz_init_set_str __GMP_PROTO ((mpz_ptr, __gmp_const char *, int)); + +#define mpz_init_set_ui __gmpz_init_set_ui +__GMP_DECLSPEC void mpz_init_set_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); + +#define mpz_inp_raw __gmpz_inp_raw +#ifdef _GMP_H_HAVE_FILE +__GMP_DECLSPEC size_t mpz_inp_raw __GMP_PROTO ((mpz_ptr, FILE *)); +#endif + +#define mpz_inp_str __gmpz_inp_str +#ifdef _GMP_H_HAVE_FILE +__GMP_DECLSPEC size_t mpz_inp_str __GMP_PROTO ((mpz_ptr, FILE *, int)); +#endif + +#define mpz_invert __gmpz_invert +__GMP_DECLSPEC int mpz_invert __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_ior __gmpz_ior +__GMP_DECLSPEC void mpz_ior __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_jacobi __gmpz_jacobi +__GMP_DECLSPEC int mpz_jacobi __GMP_PROTO ((mpz_srcptr, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; + +#define mpz_kronecker mpz_jacobi /* alias */ + +#define mpz_kronecker_si __gmpz_kronecker_si +__GMP_DECLSPEC int mpz_kronecker_si __GMP_PROTO ((mpz_srcptr, long)) __GMP_ATTRIBUTE_PURE; + +#define mpz_kronecker_ui __gmpz_kronecker_ui +__GMP_DECLSPEC int mpz_kronecker_ui __GMP_PROTO ((mpz_srcptr, unsigned long)) __GMP_ATTRIBUTE_PURE; + +#define mpz_si_kronecker __gmpz_si_kronecker +__GMP_DECLSPEC int mpz_si_kronecker __GMP_PROTO ((long, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; + +#define mpz_ui_kronecker __gmpz_ui_kronecker +__GMP_DECLSPEC int mpz_ui_kronecker __GMP_PROTO ((unsigned long, mpz_srcptr)) __GMP_ATTRIBUTE_PURE; + +#define mpz_lcm __gmpz_lcm +__GMP_DECLSPEC void mpz_lcm __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_lcm_ui __gmpz_lcm_ui +__GMP_DECLSPEC void mpz_lcm_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long)); + +#define mpz_legendre mpz_jacobi /* alias */ + +#define mpz_lucnum_ui __gmpz_lucnum_ui +__GMP_DECLSPEC void mpz_lucnum_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); + +#define mpz_lucnum2_ui __gmpz_lucnum2_ui +__GMP_DECLSPEC void mpz_lucnum2_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, unsigned long int)); + +#define mpz_millerrabin __gmpz_millerrabin +__GMP_DECLSPEC int mpz_millerrabin __GMP_PROTO ((mpz_srcptr, int)) __GMP_ATTRIBUTE_PURE; + +#define mpz_mod __gmpz_mod +__GMP_DECLSPEC void mpz_mod __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_mod_ui mpz_fdiv_r_ui /* same as fdiv_r because divisor unsigned */ + +#define mpz_mul __gmpz_mul +__GMP_DECLSPEC void mpz_mul __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_mul_2exp __gmpz_mul_2exp +__GMP_DECLSPEC void mpz_mul_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); + +#define mpz_mul_si __gmpz_mul_si +__GMP_DECLSPEC void mpz_mul_si __GMP_PROTO ((mpz_ptr, mpz_srcptr, long int)); + +#define mpz_mul_ui __gmpz_mul_ui +__GMP_DECLSPEC void mpz_mul_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_neg __gmpz_neg +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_neg) +__GMP_DECLSPEC void mpz_neg __GMP_PROTO ((mpz_ptr, mpz_srcptr)); +#endif + +#define mpz_nextprime __gmpz_nextprime +__GMP_DECLSPEC void mpz_nextprime __GMP_PROTO ((mpz_ptr, mpz_srcptr)); + +#define mpz_out_raw __gmpz_out_raw +#ifdef _GMP_H_HAVE_FILE +__GMP_DECLSPEC size_t mpz_out_raw __GMP_PROTO ((FILE *, mpz_srcptr)); +#endif + +#define mpz_out_str __gmpz_out_str +#ifdef _GMP_H_HAVE_FILE +__GMP_DECLSPEC size_t mpz_out_str __GMP_PROTO ((FILE *, int, mpz_srcptr)); +#endif + +#define mpz_perfect_power_p __gmpz_perfect_power_p +__GMP_DECLSPEC int mpz_perfect_power_p __GMP_PROTO ((mpz_srcptr)) __GMP_ATTRIBUTE_PURE; + +#define mpz_perfect_square_p __gmpz_perfect_square_p +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_perfect_square_p) +__GMP_DECLSPEC int mpz_perfect_square_p __GMP_PROTO ((mpz_srcptr)) __GMP_ATTRIBUTE_PURE; +#endif + +#define mpz_popcount __gmpz_popcount +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_popcount) +__GMP_DECLSPEC mp_bitcnt_t mpz_popcount __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; +#endif + +#define mpz_pow_ui __gmpz_pow_ui +__GMP_DECLSPEC void mpz_pow_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_powm __gmpz_powm +__GMP_DECLSPEC void mpz_powm __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_powm_sec __gmpz_powm_sec +__GMP_DECLSPEC void mpz_powm_sec __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_powm_ui __gmpz_powm_ui +__GMP_DECLSPEC void mpz_powm_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int, mpz_srcptr)); + +#define mpz_probab_prime_p __gmpz_probab_prime_p +__GMP_DECLSPEC int mpz_probab_prime_p __GMP_PROTO ((mpz_srcptr, int)) __GMP_ATTRIBUTE_PURE; + +#define mpz_random __gmpz_random +__GMP_DECLSPEC void mpz_random __GMP_PROTO ((mpz_ptr, mp_size_t)); + +#define mpz_random2 __gmpz_random2 +__GMP_DECLSPEC void mpz_random2 __GMP_PROTO ((mpz_ptr, mp_size_t)); + +#define mpz_realloc2 __gmpz_realloc2 +__GMP_DECLSPEC void mpz_realloc2 __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); + +#define mpz_remove __gmpz_remove +__GMP_DECLSPEC unsigned long int mpz_remove __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_root __gmpz_root +__GMP_DECLSPEC int mpz_root __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_rootrem __gmpz_rootrem +__GMP_DECLSPEC void mpz_rootrem __GMP_PROTO ((mpz_ptr,mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_rrandomb __gmpz_rrandomb +__GMP_DECLSPEC void mpz_rrandomb __GMP_PROTO ((mpz_ptr, gmp_randstate_t, mp_bitcnt_t)); + +#define mpz_scan0 __gmpz_scan0 +__GMP_DECLSPEC mp_bitcnt_t mpz_scan0 __GMP_PROTO ((mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_scan1 __gmpz_scan1 +__GMP_DECLSPEC mp_bitcnt_t mpz_scan1 __GMP_PROTO ((mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_set __gmpz_set +__GMP_DECLSPEC void mpz_set __GMP_PROTO ((mpz_ptr, mpz_srcptr)); + +#define mpz_set_d __gmpz_set_d +__GMP_DECLSPEC void mpz_set_d __GMP_PROTO ((mpz_ptr, double)); + +#define mpz_set_f __gmpz_set_f +__GMP_DECLSPEC void mpz_set_f __GMP_PROTO ((mpz_ptr, mpf_srcptr)); + +#define mpz_set_q __gmpz_set_q +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_set_q) +__GMP_DECLSPEC void mpz_set_q __GMP_PROTO ((mpz_ptr, mpq_srcptr)); +#endif + +#define mpz_set_si __gmpz_set_si +__GMP_DECLSPEC void mpz_set_si __GMP_PROTO ((mpz_ptr, signed long int)); + +#define mpz_set_str __gmpz_set_str +__GMP_DECLSPEC int mpz_set_str __GMP_PROTO ((mpz_ptr, __gmp_const char *, int)); + +#define mpz_set_ui __gmpz_set_ui +__GMP_DECLSPEC void mpz_set_ui __GMP_PROTO ((mpz_ptr, unsigned long int)); + +#define mpz_setbit __gmpz_setbit +__GMP_DECLSPEC void mpz_setbit __GMP_PROTO ((mpz_ptr, mp_bitcnt_t)); + +#define mpz_size __gmpz_size +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpz_size) +__GMP_DECLSPEC size_t mpz_size __GMP_PROTO ((mpz_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; +#endif + +#define mpz_sizeinbase __gmpz_sizeinbase +__GMP_DECLSPEC size_t mpz_sizeinbase __GMP_PROTO ((mpz_srcptr, int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_sqrt __gmpz_sqrt +__GMP_DECLSPEC void mpz_sqrt __GMP_PROTO ((mpz_ptr, mpz_srcptr)); + +#define mpz_sqrtrem __gmpz_sqrtrem +__GMP_DECLSPEC void mpz_sqrtrem __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr)); + +#define mpz_sub __gmpz_sub +__GMP_DECLSPEC void mpz_sub __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_sub_ui __gmpz_sub_ui +__GMP_DECLSPEC void mpz_sub_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_ui_sub __gmpz_ui_sub +__GMP_DECLSPEC void mpz_ui_sub __GMP_PROTO ((mpz_ptr, unsigned long int, mpz_srcptr)); + +#define mpz_submul __gmpz_submul +__GMP_DECLSPEC void mpz_submul __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_submul_ui __gmpz_submul_ui +__GMP_DECLSPEC void mpz_submul_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_swap __gmpz_swap +__GMP_DECLSPEC void mpz_swap __GMP_PROTO ((mpz_ptr, mpz_ptr)) __GMP_NOTHROW; + +#define mpz_tdiv_ui __gmpz_tdiv_ui +__GMP_DECLSPEC unsigned long int mpz_tdiv_ui __GMP_PROTO ((mpz_srcptr, unsigned long int)) __GMP_ATTRIBUTE_PURE; + +#define mpz_tdiv_q __gmpz_tdiv_q +__GMP_DECLSPEC void mpz_tdiv_q __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_tdiv_q_2exp __gmpz_tdiv_q_2exp +__GMP_DECLSPEC void mpz_tdiv_q_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); + +#define mpz_tdiv_q_ui __gmpz_tdiv_q_ui +__GMP_DECLSPEC unsigned long int mpz_tdiv_q_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_tdiv_qr __gmpz_tdiv_qr +__GMP_DECLSPEC void mpz_tdiv_qr __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_tdiv_qr_ui __gmpz_tdiv_qr_ui +__GMP_DECLSPEC unsigned long int mpz_tdiv_qr_ui __GMP_PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_tdiv_r __gmpz_tdiv_r +__GMP_DECLSPEC void mpz_tdiv_r __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + +#define mpz_tdiv_r_2exp __gmpz_tdiv_r_2exp +__GMP_DECLSPEC void mpz_tdiv_r_2exp __GMP_PROTO ((mpz_ptr, mpz_srcptr, mp_bitcnt_t)); + +#define mpz_tdiv_r_ui __gmpz_tdiv_r_ui +__GMP_DECLSPEC unsigned long int mpz_tdiv_r_ui __GMP_PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); + +#define mpz_tstbit __gmpz_tstbit +__GMP_DECLSPEC int mpz_tstbit __GMP_PROTO ((mpz_srcptr, mp_bitcnt_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpz_ui_pow_ui __gmpz_ui_pow_ui +__GMP_DECLSPEC void mpz_ui_pow_ui __GMP_PROTO ((mpz_ptr, unsigned long int, unsigned long int)); + +#define mpz_urandomb __gmpz_urandomb +__GMP_DECLSPEC void mpz_urandomb __GMP_PROTO ((mpz_ptr, gmp_randstate_t, mp_bitcnt_t)); + +#define mpz_urandomm __gmpz_urandomm +__GMP_DECLSPEC void mpz_urandomm __GMP_PROTO ((mpz_ptr, gmp_randstate_t, mpz_srcptr)); + +#define mpz_xor __gmpz_xor +#define mpz_eor __gmpz_xor +__GMP_DECLSPEC void mpz_xor __GMP_PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); + + +/**************** Rational (i.e. Q) routines. ****************/ + +#define mpq_abs __gmpq_abs +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpq_abs) +__GMP_DECLSPEC void mpq_abs __GMP_PROTO ((mpq_ptr, mpq_srcptr)); +#endif + +#define mpq_add __gmpq_add +__GMP_DECLSPEC void mpq_add __GMP_PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); + +#define mpq_canonicalize __gmpq_canonicalize +__GMP_DECLSPEC void mpq_canonicalize __GMP_PROTO ((mpq_ptr)); + +#define mpq_clear __gmpq_clear +__GMP_DECLSPEC void mpq_clear __GMP_PROTO ((mpq_ptr)); + +#define mpq_clears __gmpq_clears +__GMP_DECLSPEC void mpq_clears __GMP_PROTO ((mpq_ptr, ...)); + +#define mpq_cmp __gmpq_cmp +__GMP_DECLSPEC int mpq_cmp __GMP_PROTO ((mpq_srcptr, mpq_srcptr)) __GMP_ATTRIBUTE_PURE; + +#define _mpq_cmp_si __gmpq_cmp_si +__GMP_DECLSPEC int _mpq_cmp_si __GMP_PROTO ((mpq_srcptr, long, unsigned long)) __GMP_ATTRIBUTE_PURE; + +#define _mpq_cmp_ui __gmpq_cmp_ui +__GMP_DECLSPEC int _mpq_cmp_ui __GMP_PROTO ((mpq_srcptr, unsigned long int, unsigned long int)) __GMP_ATTRIBUTE_PURE; + +#define mpq_div __gmpq_div +__GMP_DECLSPEC void mpq_div __GMP_PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); + +#define mpq_div_2exp __gmpq_div_2exp +__GMP_DECLSPEC void mpq_div_2exp __GMP_PROTO ((mpq_ptr, mpq_srcptr, mp_bitcnt_t)); + +#define mpq_equal __gmpq_equal +__GMP_DECLSPEC int mpq_equal __GMP_PROTO ((mpq_srcptr, mpq_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpq_get_num __gmpq_get_num +__GMP_DECLSPEC void mpq_get_num __GMP_PROTO ((mpz_ptr, mpq_srcptr)); + +#define mpq_get_den __gmpq_get_den +__GMP_DECLSPEC void mpq_get_den __GMP_PROTO ((mpz_ptr, mpq_srcptr)); + +#define mpq_get_d __gmpq_get_d +__GMP_DECLSPEC double mpq_get_d __GMP_PROTO ((mpq_srcptr)) __GMP_ATTRIBUTE_PURE; + +#define mpq_get_str __gmpq_get_str +__GMP_DECLSPEC char *mpq_get_str __GMP_PROTO ((char *, int, mpq_srcptr)); + +#define mpq_init __gmpq_init +__GMP_DECLSPEC void mpq_init __GMP_PROTO ((mpq_ptr)); + +#define mpq_inits __gmpq_inits +__GMP_DECLSPEC void mpq_inits __GMP_PROTO ((mpq_ptr, ...)); + +#define mpq_inp_str __gmpq_inp_str +#ifdef _GMP_H_HAVE_FILE +__GMP_DECLSPEC size_t mpq_inp_str __GMP_PROTO ((mpq_ptr, FILE *, int)); +#endif + +#define mpq_inv __gmpq_inv +__GMP_DECLSPEC void mpq_inv __GMP_PROTO ((mpq_ptr, mpq_srcptr)); + +#define mpq_mul __gmpq_mul +__GMP_DECLSPEC void mpq_mul __GMP_PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); + +#define mpq_mul_2exp __gmpq_mul_2exp +__GMP_DECLSPEC void mpq_mul_2exp __GMP_PROTO ((mpq_ptr, mpq_srcptr, mp_bitcnt_t)); + +#define mpq_neg __gmpq_neg +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpq_neg) +__GMP_DECLSPEC void mpq_neg __GMP_PROTO ((mpq_ptr, mpq_srcptr)); +#endif + +#define mpq_out_str __gmpq_out_str +#ifdef _GMP_H_HAVE_FILE +__GMP_DECLSPEC size_t mpq_out_str __GMP_PROTO ((FILE *, int, mpq_srcptr)); +#endif + +#define mpq_set __gmpq_set +__GMP_DECLSPEC void mpq_set __GMP_PROTO ((mpq_ptr, mpq_srcptr)); + +#define mpq_set_d __gmpq_set_d +__GMP_DECLSPEC void mpq_set_d __GMP_PROTO ((mpq_ptr, double)); + +#define mpq_set_den __gmpq_set_den +__GMP_DECLSPEC void mpq_set_den __GMP_PROTO ((mpq_ptr, mpz_srcptr)); + +#define mpq_set_f __gmpq_set_f +__GMP_DECLSPEC void mpq_set_f __GMP_PROTO ((mpq_ptr, mpf_srcptr)); + +#define mpq_set_num __gmpq_set_num +__GMP_DECLSPEC void mpq_set_num __GMP_PROTO ((mpq_ptr, mpz_srcptr)); + +#define mpq_set_si __gmpq_set_si +__GMP_DECLSPEC void mpq_set_si __GMP_PROTO ((mpq_ptr, signed long int, unsigned long int)); + +#define mpq_set_str __gmpq_set_str +__GMP_DECLSPEC int mpq_set_str __GMP_PROTO ((mpq_ptr, __gmp_const char *, int)); + +#define mpq_set_ui __gmpq_set_ui +__GMP_DECLSPEC void mpq_set_ui __GMP_PROTO ((mpq_ptr, unsigned long int, unsigned long int)); + +#define mpq_set_z __gmpq_set_z +__GMP_DECLSPEC void mpq_set_z __GMP_PROTO ((mpq_ptr, mpz_srcptr)); + +#define mpq_sub __gmpq_sub +__GMP_DECLSPEC void mpq_sub __GMP_PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); + +#define mpq_swap __gmpq_swap +__GMP_DECLSPEC void mpq_swap __GMP_PROTO ((mpq_ptr, mpq_ptr)) __GMP_NOTHROW; + + +/**************** Float (i.e. F) routines. ****************/ + +#define mpf_abs __gmpf_abs +__GMP_DECLSPEC void mpf_abs __GMP_PROTO ((mpf_ptr, mpf_srcptr)); + +#define mpf_add __gmpf_add +__GMP_DECLSPEC void mpf_add __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); + +#define mpf_add_ui __gmpf_add_ui +__GMP_DECLSPEC void mpf_add_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); +#define mpf_ceil __gmpf_ceil +__GMP_DECLSPEC void mpf_ceil __GMP_PROTO ((mpf_ptr, mpf_srcptr)); + +#define mpf_clear __gmpf_clear +__GMP_DECLSPEC void mpf_clear __GMP_PROTO ((mpf_ptr)); + +#define mpf_clears __gmpf_clears +__GMP_DECLSPEC void mpf_clears __GMP_PROTO ((mpf_ptr, ...)); + +#define mpf_cmp __gmpf_cmp +__GMP_DECLSPEC int mpf_cmp __GMP_PROTO ((mpf_srcptr, mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_cmp_d __gmpf_cmp_d +__GMP_DECLSPEC int mpf_cmp_d __GMP_PROTO ((mpf_srcptr, double)) __GMP_ATTRIBUTE_PURE; + +#define mpf_cmp_si __gmpf_cmp_si +__GMP_DECLSPEC int mpf_cmp_si __GMP_PROTO ((mpf_srcptr, signed long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_cmp_ui __gmpf_cmp_ui +__GMP_DECLSPEC int mpf_cmp_ui __GMP_PROTO ((mpf_srcptr, unsigned long int)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_div __gmpf_div +__GMP_DECLSPEC void mpf_div __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); + +#define mpf_div_2exp __gmpf_div_2exp +__GMP_DECLSPEC void mpf_div_2exp __GMP_PROTO ((mpf_ptr, mpf_srcptr, mp_bitcnt_t)); + +#define mpf_div_ui __gmpf_div_ui +__GMP_DECLSPEC void mpf_div_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); + +#define mpf_dump __gmpf_dump +__GMP_DECLSPEC void mpf_dump __GMP_PROTO ((mpf_srcptr)); + +#define mpf_eq __gmpf_eq +__GMP_DECLSPEC int mpf_eq __GMP_PROTO ((mpf_srcptr, mpf_srcptr, unsigned long int)) __GMP_ATTRIBUTE_PURE; + +#define mpf_fits_sint_p __gmpf_fits_sint_p +__GMP_DECLSPEC int mpf_fits_sint_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_fits_slong_p __gmpf_fits_slong_p +__GMP_DECLSPEC int mpf_fits_slong_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_fits_sshort_p __gmpf_fits_sshort_p +__GMP_DECLSPEC int mpf_fits_sshort_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_fits_uint_p __gmpf_fits_uint_p +__GMP_DECLSPEC int mpf_fits_uint_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_fits_ulong_p __gmpf_fits_ulong_p +__GMP_DECLSPEC int mpf_fits_ulong_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_fits_ushort_p __gmpf_fits_ushort_p +__GMP_DECLSPEC int mpf_fits_ushort_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_floor __gmpf_floor +__GMP_DECLSPEC void mpf_floor __GMP_PROTO ((mpf_ptr, mpf_srcptr)); + +#define mpf_get_d __gmpf_get_d +__GMP_DECLSPEC double mpf_get_d __GMP_PROTO ((mpf_srcptr)) __GMP_ATTRIBUTE_PURE; + +#define mpf_get_d_2exp __gmpf_get_d_2exp +__GMP_DECLSPEC double mpf_get_d_2exp __GMP_PROTO ((signed long int *, mpf_srcptr)); + +#define mpf_get_default_prec __gmpf_get_default_prec +__GMP_DECLSPEC mp_bitcnt_t mpf_get_default_prec __GMP_PROTO ((void)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_get_prec __gmpf_get_prec +__GMP_DECLSPEC mp_bitcnt_t mpf_get_prec __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_get_si __gmpf_get_si +__GMP_DECLSPEC long mpf_get_si __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_get_str __gmpf_get_str +__GMP_DECLSPEC char *mpf_get_str __GMP_PROTO ((char *, mp_exp_t *, int, size_t, mpf_srcptr)); + +#define mpf_get_ui __gmpf_get_ui +__GMP_DECLSPEC unsigned long mpf_get_ui __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_init __gmpf_init +__GMP_DECLSPEC void mpf_init __GMP_PROTO ((mpf_ptr)); + +#define mpf_init2 __gmpf_init2 +__GMP_DECLSPEC void mpf_init2 __GMP_PROTO ((mpf_ptr, mp_bitcnt_t)); + +#define mpf_inits __gmpf_inits +__GMP_DECLSPEC void mpf_inits __GMP_PROTO ((mpf_ptr, ...)); + +#define mpf_init_set __gmpf_init_set +__GMP_DECLSPEC void mpf_init_set __GMP_PROTO ((mpf_ptr, mpf_srcptr)); + +#define mpf_init_set_d __gmpf_init_set_d +__GMP_DECLSPEC void mpf_init_set_d __GMP_PROTO ((mpf_ptr, double)); + +#define mpf_init_set_si __gmpf_init_set_si +__GMP_DECLSPEC void mpf_init_set_si __GMP_PROTO ((mpf_ptr, signed long int)); + +#define mpf_init_set_str __gmpf_init_set_str +__GMP_DECLSPEC int mpf_init_set_str __GMP_PROTO ((mpf_ptr, __gmp_const char *, int)); + +#define mpf_init_set_ui __gmpf_init_set_ui +__GMP_DECLSPEC void mpf_init_set_ui __GMP_PROTO ((mpf_ptr, unsigned long int)); + +#define mpf_inp_str __gmpf_inp_str +#ifdef _GMP_H_HAVE_FILE +__GMP_DECLSPEC size_t mpf_inp_str __GMP_PROTO ((mpf_ptr, FILE *, int)); +#endif + +#define mpf_integer_p __gmpf_integer_p +__GMP_DECLSPEC int mpf_integer_p __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_mul __gmpf_mul +__GMP_DECLSPEC void mpf_mul __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); + +#define mpf_mul_2exp __gmpf_mul_2exp +__GMP_DECLSPEC void mpf_mul_2exp __GMP_PROTO ((mpf_ptr, mpf_srcptr, mp_bitcnt_t)); + +#define mpf_mul_ui __gmpf_mul_ui +__GMP_DECLSPEC void mpf_mul_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); + +#define mpf_neg __gmpf_neg +__GMP_DECLSPEC void mpf_neg __GMP_PROTO ((mpf_ptr, mpf_srcptr)); + +#define mpf_out_str __gmpf_out_str +#ifdef _GMP_H_HAVE_FILE +__GMP_DECLSPEC size_t mpf_out_str __GMP_PROTO ((FILE *, int, size_t, mpf_srcptr)); +#endif + +#define mpf_pow_ui __gmpf_pow_ui +__GMP_DECLSPEC void mpf_pow_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); + +#define mpf_random2 __gmpf_random2 +__GMP_DECLSPEC void mpf_random2 __GMP_PROTO ((mpf_ptr, mp_size_t, mp_exp_t)); + +#define mpf_reldiff __gmpf_reldiff +__GMP_DECLSPEC void mpf_reldiff __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); + +#define mpf_set __gmpf_set +__GMP_DECLSPEC void mpf_set __GMP_PROTO ((mpf_ptr, mpf_srcptr)); + +#define mpf_set_d __gmpf_set_d +__GMP_DECLSPEC void mpf_set_d __GMP_PROTO ((mpf_ptr, double)); + +#define mpf_set_default_prec __gmpf_set_default_prec +__GMP_DECLSPEC void mpf_set_default_prec __GMP_PROTO ((mp_bitcnt_t)) __GMP_NOTHROW; + +#define mpf_set_prec __gmpf_set_prec +__GMP_DECLSPEC void mpf_set_prec __GMP_PROTO ((mpf_ptr, mp_bitcnt_t)); + +#define mpf_set_prec_raw __gmpf_set_prec_raw +__GMP_DECLSPEC void mpf_set_prec_raw __GMP_PROTO ((mpf_ptr, mp_bitcnt_t)) __GMP_NOTHROW; + +#define mpf_set_q __gmpf_set_q +__GMP_DECLSPEC void mpf_set_q __GMP_PROTO ((mpf_ptr, mpq_srcptr)); + +#define mpf_set_si __gmpf_set_si +__GMP_DECLSPEC void mpf_set_si __GMP_PROTO ((mpf_ptr, signed long int)); + +#define mpf_set_str __gmpf_set_str +__GMP_DECLSPEC int mpf_set_str __GMP_PROTO ((mpf_ptr, __gmp_const char *, int)); + +#define mpf_set_ui __gmpf_set_ui +__GMP_DECLSPEC void mpf_set_ui __GMP_PROTO ((mpf_ptr, unsigned long int)); + +#define mpf_set_z __gmpf_set_z +__GMP_DECLSPEC void mpf_set_z __GMP_PROTO ((mpf_ptr, mpz_srcptr)); + +#define mpf_size __gmpf_size +__GMP_DECLSPEC size_t mpf_size __GMP_PROTO ((mpf_srcptr)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpf_sqrt __gmpf_sqrt +__GMP_DECLSPEC void mpf_sqrt __GMP_PROTO ((mpf_ptr, mpf_srcptr)); + +#define mpf_sqrt_ui __gmpf_sqrt_ui +__GMP_DECLSPEC void mpf_sqrt_ui __GMP_PROTO ((mpf_ptr, unsigned long int)); + +#define mpf_sub __gmpf_sub +__GMP_DECLSPEC void mpf_sub __GMP_PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); + +#define mpf_sub_ui __gmpf_sub_ui +__GMP_DECLSPEC void mpf_sub_ui __GMP_PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); + +#define mpf_swap __gmpf_swap +__GMP_DECLSPEC void mpf_swap __GMP_PROTO ((mpf_ptr, mpf_ptr)) __GMP_NOTHROW; + +#define mpf_trunc __gmpf_trunc +__GMP_DECLSPEC void mpf_trunc __GMP_PROTO ((mpf_ptr, mpf_srcptr)); + +#define mpf_ui_div __gmpf_ui_div +__GMP_DECLSPEC void mpf_ui_div __GMP_PROTO ((mpf_ptr, unsigned long int, mpf_srcptr)); + +#define mpf_ui_sub __gmpf_ui_sub +__GMP_DECLSPEC void mpf_ui_sub __GMP_PROTO ((mpf_ptr, unsigned long int, mpf_srcptr)); + +#define mpf_urandomb __gmpf_urandomb +__GMP_DECLSPEC void mpf_urandomb __GMP_PROTO ((mpf_t, gmp_randstate_t, mp_bitcnt_t)); + + +/************ Low level positive-integer (i.e. N) routines. ************/ + +/* This is ugly, but we need to make user calls reach the prefixed function. */ + +#define mpn_add __MPN(add) +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_add) +__GMP_DECLSPEC mp_limb_t mpn_add __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t)); +#endif + +#define mpn_add_1 __MPN(add_1) +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_add_1) +__GMP_DECLSPEC mp_limb_t mpn_add_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)) __GMP_NOTHROW; +#endif + +#define mpn_add_n __MPN(add_n) +__GMP_DECLSPEC mp_limb_t mpn_add_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); + +#define mpn_addmul_1 __MPN(addmul_1) +__GMP_DECLSPEC mp_limb_t mpn_addmul_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); + +#define mpn_cmp __MPN(cmp) +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_cmp) +__GMP_DECLSPEC int mpn_cmp __GMP_PROTO ((mp_srcptr, mp_srcptr, mp_size_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; +#endif + +#define mpn_divexact_by3(dst,src,size) \ + mpn_divexact_by3c (dst, src, size, __GMP_CAST (mp_limb_t, 0)) + +#define mpn_divexact_by3c __MPN(divexact_by3c) +__GMP_DECLSPEC mp_limb_t mpn_divexact_by3c __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); + +#define mpn_divmod_1(qp,np,nsize,dlimb) \ + mpn_divrem_1 (qp, __GMP_CAST (mp_size_t, 0), np, nsize, dlimb) + +#define mpn_divrem __MPN(divrem) +__GMP_DECLSPEC mp_limb_t mpn_divrem __GMP_PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t)); + +#define mpn_divrem_1 __MPN(divrem_1) +__GMP_DECLSPEC mp_limb_t mpn_divrem_1 __GMP_PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t)); + +#define mpn_divrem_2 __MPN(divrem_2) +__GMP_DECLSPEC mp_limb_t mpn_divrem_2 __GMP_PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr)); + +#define mpn_gcd __MPN(gcd) +__GMP_DECLSPEC mp_size_t mpn_gcd __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t)); + +#define mpn_gcd_1 __MPN(gcd_1) +__GMP_DECLSPEC mp_limb_t mpn_gcd_1 __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t)) __GMP_ATTRIBUTE_PURE; + +#define mpn_gcdext_1 __MPN(gcdext_1) +__GMP_DECLSPEC mp_limb_t mpn_gcdext_1 __GMP_PROTO ((mp_limb_signed_t *, mp_limb_signed_t *, mp_limb_t, mp_limb_t)); + +#define mpn_gcdext __MPN(gcdext) +__GMP_DECLSPEC mp_size_t mpn_gcdext __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t *, mp_ptr, mp_size_t, mp_ptr, mp_size_t)); + +#define mpn_get_str __MPN(get_str) +__GMP_DECLSPEC size_t mpn_get_str __GMP_PROTO ((unsigned char *, int, mp_ptr, mp_size_t)); + +#define mpn_hamdist __MPN(hamdist) +__GMP_DECLSPEC mp_bitcnt_t mpn_hamdist __GMP_PROTO ((mp_srcptr, mp_srcptr, mp_size_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpn_lshift __MPN(lshift) +__GMP_DECLSPEC mp_limb_t mpn_lshift __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int)); + +#define mpn_mod_1 __MPN(mod_1) +__GMP_DECLSPEC mp_limb_t mpn_mod_1 __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t)) __GMP_ATTRIBUTE_PURE; + +#define mpn_mul __MPN(mul) +__GMP_DECLSPEC mp_limb_t mpn_mul __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)); + +#define mpn_mul_1 __MPN(mul_1) +__GMP_DECLSPEC mp_limb_t mpn_mul_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); + +#define mpn_mul_n __MPN(mul_n) +__GMP_DECLSPEC void mpn_mul_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); + +#define mpn_sqr __MPN(sqr) +__GMP_DECLSPEC void mpn_sqr __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); + +#define mpn_neg __MPN(neg) +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_neg) +__GMP_DECLSPEC mp_limb_t mpn_neg __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); +#endif + +#define mpn_com __MPN(com) +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_com) +__GMP_DECLSPEC void mpn_com __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); +#endif + +#define mpn_perfect_square_p __MPN(perfect_square_p) +__GMP_DECLSPEC int mpn_perfect_square_p __GMP_PROTO ((mp_srcptr, mp_size_t)) __GMP_ATTRIBUTE_PURE; + +#define mpn_perfect_power_p __MPN(perfect_power_p) +__GMP_DECLSPEC int mpn_perfect_power_p __GMP_PROTO ((mp_srcptr, mp_size_t)) __GMP_ATTRIBUTE_PURE; + +#define mpn_popcount __MPN(popcount) +__GMP_DECLSPEC mp_bitcnt_t mpn_popcount __GMP_PROTO ((mp_srcptr, mp_size_t)) __GMP_NOTHROW __GMP_ATTRIBUTE_PURE; + +#define mpn_pow_1 __MPN(pow_1) +__GMP_DECLSPEC mp_size_t mpn_pow_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t, mp_ptr)); + +/* undocumented now, but retained here for upward compatibility */ +#define mpn_preinv_mod_1 __MPN(preinv_mod_1) +__GMP_DECLSPEC mp_limb_t mpn_preinv_mod_1 __GMP_PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t)) __GMP_ATTRIBUTE_PURE; + +#define mpn_random __MPN(random) +__GMP_DECLSPEC void mpn_random __GMP_PROTO ((mp_ptr, mp_size_t)); + +#define mpn_random2 __MPN(random2) +__GMP_DECLSPEC void mpn_random2 __GMP_PROTO ((mp_ptr, mp_size_t)); + +#define mpn_rshift __MPN(rshift) +__GMP_DECLSPEC mp_limb_t mpn_rshift __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int)); + +#define mpn_scan0 __MPN(scan0) +__GMP_DECLSPEC mp_bitcnt_t mpn_scan0 __GMP_PROTO ((mp_srcptr, mp_bitcnt_t)) __GMP_ATTRIBUTE_PURE; + +#define mpn_scan1 __MPN(scan1) +__GMP_DECLSPEC mp_bitcnt_t mpn_scan1 __GMP_PROTO ((mp_srcptr, mp_bitcnt_t)) __GMP_ATTRIBUTE_PURE; + +#define mpn_set_str __MPN(set_str) +__GMP_DECLSPEC mp_size_t mpn_set_str __GMP_PROTO ((mp_ptr, __gmp_const unsigned char *, size_t, int)); + +#define mpn_sqrtrem __MPN(sqrtrem) +__GMP_DECLSPEC mp_size_t mpn_sqrtrem __GMP_PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t)); + +#define mpn_sub __MPN(sub) +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_sub) +__GMP_DECLSPEC mp_limb_t mpn_sub __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t)); +#endif + +#define mpn_sub_1 __MPN(sub_1) +#if __GMP_INLINE_PROTOTYPES || defined (__GMP_FORCE_mpn_sub_1) +__GMP_DECLSPEC mp_limb_t mpn_sub_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)) __GMP_NOTHROW; +#endif + +#define mpn_sub_n __MPN(sub_n) +__GMP_DECLSPEC mp_limb_t mpn_sub_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); + +#define mpn_submul_1 __MPN(submul_1) +__GMP_DECLSPEC mp_limb_t mpn_submul_1 __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); + +#define mpn_tdiv_qr __MPN(tdiv_qr) +__GMP_DECLSPEC void mpn_tdiv_qr __GMP_PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)); + +#define mpn_and_n __MPN(and_n) +__GMP_DECLSPEC void mpn_and_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); +#define mpn_andn_n __MPN(andn_n) +__GMP_DECLSPEC void mpn_andn_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); +#define mpn_nand_n __MPN(nand_n) +__GMP_DECLSPEC void mpn_nand_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); +#define mpn_ior_n __MPN(ior_n) +__GMP_DECLSPEC void mpn_ior_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); +#define mpn_iorn_n __MPN(iorn_n) +__GMP_DECLSPEC void mpn_iorn_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); +#define mpn_nior_n __MPN(nior_n) +__GMP_DECLSPEC void mpn_nior_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); +#define mpn_xor_n __MPN(xor_n) +__GMP_DECLSPEC void mpn_xor_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); +#define mpn_xnor_n __MPN(xnor_n) +__GMP_DECLSPEC void mpn_xnor_n __GMP_PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); + +#define mpn_copyi __MPN(copyi) +__GMP_DECLSPEC void mpn_copyi __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); +#define mpn_copyd __MPN(copyd) +__GMP_DECLSPEC void mpn_copyd __GMP_PROTO ((mp_ptr, mp_srcptr, mp_size_t)); +#define mpn_zero __MPN(zero) +__GMP_DECLSPEC void mpn_zero __GMP_PROTO ((mp_ptr, mp_size_t)); + +/**************** mpz inlines ****************/ + +/* The following are provided as inlines where possible, but always exist as + library functions too, for binary compatibility. + + Within gmp itself this inlining generally isn't relied on, since it + doesn't get done for all compilers, whereas if something is worth + inlining then it's worth arranging always. + + There are two styles of inlining here. When the same bit of code is + wanted for the inline as for the library version, then __GMP_FORCE_foo + arranges for that code to be emitted and the __GMP_EXTERN_INLINE + directive suppressed, eg. mpz_fits_uint_p. When a different bit of code + is wanted for the inline than for the library version, then + __GMP_FORCE_foo arranges the inline to be suppressed, eg. mpz_abs. */ + +#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpz_abs) +__GMP_EXTERN_INLINE void +mpz_abs (mpz_ptr __gmp_w, mpz_srcptr __gmp_u) +{ + if (__gmp_w != __gmp_u) + mpz_set (__gmp_w, __gmp_u); + __gmp_w->_mp_size = __GMP_ABS (__gmp_w->_mp_size); +} +#endif + +#if GMP_NAIL_BITS == 0 +#define __GMPZ_FITS_UTYPE_P(z,maxval) \ + mp_size_t __gmp_n = z->_mp_size; \ + mp_ptr __gmp_p = z->_mp_d; \ + return (__gmp_n == 0 || (__gmp_n == 1 && __gmp_p[0] <= maxval)); +#else +#define __GMPZ_FITS_UTYPE_P(z,maxval) \ + mp_size_t __gmp_n = z->_mp_size; \ + mp_ptr __gmp_p = z->_mp_d; \ + return (__gmp_n == 0 || (__gmp_n == 1 && __gmp_p[0] <= maxval) \ + || (__gmp_n == 2 && __gmp_p[1] <= ((mp_limb_t) maxval >> GMP_NUMB_BITS))); +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_uint_p) +#if ! defined (__GMP_FORCE_mpz_fits_uint_p) +__GMP_EXTERN_INLINE +#endif +int +mpz_fits_uint_p (mpz_srcptr __gmp_z) __GMP_NOTHROW +{ + __GMPZ_FITS_UTYPE_P (__gmp_z, __GMP_UINT_MAX); +} +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_ulong_p) +#if ! defined (__GMP_FORCE_mpz_fits_ulong_p) +__GMP_EXTERN_INLINE +#endif +int +mpz_fits_ulong_p (mpz_srcptr __gmp_z) __GMP_NOTHROW +{ + __GMPZ_FITS_UTYPE_P (__gmp_z, __GMP_ULONG_MAX); +} +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_fits_ushort_p) +#if ! defined (__GMP_FORCE_mpz_fits_ushort_p) +__GMP_EXTERN_INLINE +#endif +int +mpz_fits_ushort_p (mpz_srcptr __gmp_z) __GMP_NOTHROW +{ + __GMPZ_FITS_UTYPE_P (__gmp_z, __GMP_USHRT_MAX); +} +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_get_ui) +#if ! defined (__GMP_FORCE_mpz_get_ui) +__GMP_EXTERN_INLINE +#endif +unsigned long +mpz_get_ui (mpz_srcptr __gmp_z) __GMP_NOTHROW +{ + mp_ptr __gmp_p = __gmp_z->_mp_d; + mp_size_t __gmp_n = __gmp_z->_mp_size; + mp_limb_t __gmp_l = __gmp_p[0]; + /* This is a "#if" rather than a plain "if" so as to avoid gcc warnings + about "<< GMP_NUMB_BITS" exceeding the type size, and to avoid Borland + C++ 6.0 warnings about condition always true for something like + "__GMP_ULONG_MAX < GMP_NUMB_MASK". */ +#if GMP_NAIL_BITS == 0 || defined (_LONG_LONG_LIMB) + /* limb==long and no nails, or limb==longlong, one limb is enough */ + return (__gmp_n != 0 ? __gmp_l : 0); +#else + /* limb==long and nails, need two limbs when available */ + __gmp_n = __GMP_ABS (__gmp_n); + if (__gmp_n <= 1) + return (__gmp_n != 0 ? __gmp_l : 0); + else + return __gmp_l + (__gmp_p[1] << GMP_NUMB_BITS); +#endif +} +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_getlimbn) +#if ! defined (__GMP_FORCE_mpz_getlimbn) +__GMP_EXTERN_INLINE +#endif +mp_limb_t +mpz_getlimbn (mpz_srcptr __gmp_z, mp_size_t __gmp_n) __GMP_NOTHROW +{ + mp_limb_t __gmp_result = 0; + if (__GMP_LIKELY (__gmp_n >= 0 && __gmp_n < __GMP_ABS (__gmp_z->_mp_size))) + __gmp_result = __gmp_z->_mp_d[__gmp_n]; + return __gmp_result; +} +#endif + +#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpz_neg) +__GMP_EXTERN_INLINE void +mpz_neg (mpz_ptr __gmp_w, mpz_srcptr __gmp_u) +{ + if (__gmp_w != __gmp_u) + mpz_set (__gmp_w, __gmp_u); + __gmp_w->_mp_size = - __gmp_w->_mp_size; +} +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_perfect_square_p) +#if ! defined (__GMP_FORCE_mpz_perfect_square_p) +__GMP_EXTERN_INLINE +#endif +int +mpz_perfect_square_p (mpz_srcptr __gmp_a) +{ + mp_size_t __gmp_asize; + int __gmp_result; + + __gmp_asize = __gmp_a->_mp_size; + __gmp_result = (__gmp_asize >= 0); /* zero is a square, negatives are not */ + if (__GMP_LIKELY (__gmp_asize > 0)) + __gmp_result = mpn_perfect_square_p (__gmp_a->_mp_d, __gmp_asize); + return __gmp_result; +} +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_popcount) +#if ! defined (__GMP_FORCE_mpz_popcount) +__GMP_EXTERN_INLINE +#endif +mp_bitcnt_t +mpz_popcount (mpz_srcptr __gmp_u) __GMP_NOTHROW +{ + mp_size_t __gmp_usize; + mp_bitcnt_t __gmp_result; + + __gmp_usize = __gmp_u->_mp_size; + __gmp_result = (__gmp_usize < 0 ? __GMP_ULONG_MAX : 0); + if (__GMP_LIKELY (__gmp_usize > 0)) + __gmp_result = mpn_popcount (__gmp_u->_mp_d, __gmp_usize); + return __gmp_result; +} +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_set_q) +#if ! defined (__GMP_FORCE_mpz_set_q) +__GMP_EXTERN_INLINE +#endif +void +mpz_set_q (mpz_ptr __gmp_w, mpq_srcptr __gmp_u) +{ + mpz_tdiv_q (__gmp_w, mpq_numref (__gmp_u), mpq_denref (__gmp_u)); +} +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpz_size) +#if ! defined (__GMP_FORCE_mpz_size) +__GMP_EXTERN_INLINE +#endif +size_t +mpz_size (mpz_srcptr __gmp_z) __GMP_NOTHROW +{ + return __GMP_ABS (__gmp_z->_mp_size); +} +#endif + + +/**************** mpq inlines ****************/ + +#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpq_abs) +__GMP_EXTERN_INLINE void +mpq_abs (mpq_ptr __gmp_w, mpq_srcptr __gmp_u) +{ + if (__gmp_w != __gmp_u) + mpq_set (__gmp_w, __gmp_u); + __gmp_w->_mp_num._mp_size = __GMP_ABS (__gmp_w->_mp_num._mp_size); +} +#endif + +#if defined (__GMP_EXTERN_INLINE) && ! defined (__GMP_FORCE_mpq_neg) +__GMP_EXTERN_INLINE void +mpq_neg (mpq_ptr __gmp_w, mpq_srcptr __gmp_u) +{ + if (__gmp_w != __gmp_u) + mpq_set (__gmp_w, __gmp_u); + __gmp_w->_mp_num._mp_size = - __gmp_w->_mp_num._mp_size; +} +#endif + + +/**************** mpn inlines ****************/ + +/* The comments with __GMPN_ADD_1 below apply here too. + + The test for FUNCTION returning 0 should predict well. If it's assumed + {yp,ysize} will usually have a random number of bits then the high limb + won't be full and a carry out will occur a good deal less than 50% of the + time. + + ysize==0 isn't a documented feature, but is used internally in a few + places. + + Producing cout last stops it using up a register during the main part of + the calculation, though gcc (as of 3.0) on an "if (mpn_add (...))" + doesn't seem able to move the true and false legs of the conditional up + to the two places cout is generated. */ + +#define __GMPN_AORS(cout, wp, xp, xsize, yp, ysize, FUNCTION, TEST) \ + do { \ + mp_size_t __gmp_i; \ + mp_limb_t __gmp_x; \ + \ + /* ASSERT ((ysize) >= 0); */ \ + /* ASSERT ((xsize) >= (ysize)); */ \ + /* ASSERT (MPN_SAME_OR_SEPARATE2_P (wp, xsize, xp, xsize)); */ \ + /* ASSERT (MPN_SAME_OR_SEPARATE2_P (wp, xsize, yp, ysize)); */ \ + \ + __gmp_i = (ysize); \ + if (__gmp_i != 0) \ + { \ + if (FUNCTION (wp, xp, yp, __gmp_i)) \ + { \ + do \ + { \ + if (__gmp_i >= (xsize)) \ + { \ + (cout) = 1; \ + goto __gmp_done; \ + } \ + __gmp_x = (xp)[__gmp_i]; \ + } \ + while (TEST); \ + } \ + } \ + if ((wp) != (xp)) \ + __GMPN_COPY_REST (wp, xp, xsize, __gmp_i); \ + (cout) = 0; \ + __gmp_done: \ + ; \ + } while (0) + +#define __GMPN_ADD(cout, wp, xp, xsize, yp, ysize) \ + __GMPN_AORS (cout, wp, xp, xsize, yp, ysize, mpn_add_n, \ + (((wp)[__gmp_i++] = (__gmp_x + 1) & GMP_NUMB_MASK) == 0)) +#define __GMPN_SUB(cout, wp, xp, xsize, yp, ysize) \ + __GMPN_AORS (cout, wp, xp, xsize, yp, ysize, mpn_sub_n, \ + (((wp)[__gmp_i++] = (__gmp_x - 1) & GMP_NUMB_MASK), __gmp_x == 0)) + + +/* The use of __gmp_i indexing is designed to ensure a compile time src==dst + remains nice and clear to the compiler, so that __GMPN_COPY_REST can + disappear, and the load/add/store gets a chance to become a + read-modify-write on CISC CPUs. + + Alternatives: + + Using a pair of pointers instead of indexing would be possible, but gcc + isn't able to recognise compile-time src==dst in that case, even when the + pointers are incremented more or less together. Other compilers would + very likely have similar difficulty. + + gcc could use "if (__builtin_constant_p(src==dst) && src==dst)" or + similar to detect a compile-time src==dst. This works nicely on gcc + 2.95.x, it's not good on gcc 3.0 where __builtin_constant_p(p==p) seems + to be always false, for a pointer p. But the current code form seems + good enough for src==dst anyway. + + gcc on x86 as usual doesn't give particularly good flags handling for the + carry/borrow detection. It's tempting to want some multi instruction asm + blocks to help it, and this was tried, but in truth there's only a few + instructions to save and any gain is all too easily lost by register + juggling setting up for the asm. */ + +#if GMP_NAIL_BITS == 0 +#define __GMPN_AORS_1(cout, dst, src, n, v, OP, CB) \ + do { \ + mp_size_t __gmp_i; \ + mp_limb_t __gmp_x, __gmp_r; \ + \ + /* ASSERT ((n) >= 1); */ \ + /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, n)); */ \ + \ + __gmp_x = (src)[0]; \ + __gmp_r = __gmp_x OP (v); \ + (dst)[0] = __gmp_r; \ + if (CB (__gmp_r, __gmp_x, (v))) \ + { \ + (cout) = 1; \ + for (__gmp_i = 1; __gmp_i < (n);) \ + { \ + __gmp_x = (src)[__gmp_i]; \ + __gmp_r = __gmp_x OP 1; \ + (dst)[__gmp_i] = __gmp_r; \ + ++__gmp_i; \ + if (!CB (__gmp_r, __gmp_x, 1)) \ + { \ + if ((src) != (dst)) \ + __GMPN_COPY_REST (dst, src, n, __gmp_i); \ + (cout) = 0; \ + break; \ + } \ + } \ + } \ + else \ + { \ + if ((src) != (dst)) \ + __GMPN_COPY_REST (dst, src, n, 1); \ + (cout) = 0; \ + } \ + } while (0) +#endif + +#if GMP_NAIL_BITS >= 1 +#define __GMPN_AORS_1(cout, dst, src, n, v, OP, CB) \ + do { \ + mp_size_t __gmp_i; \ + mp_limb_t __gmp_x, __gmp_r; \ + \ + /* ASSERT ((n) >= 1); */ \ + /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, n)); */ \ + \ + __gmp_x = (src)[0]; \ + __gmp_r = __gmp_x OP (v); \ + (dst)[0] = __gmp_r & GMP_NUMB_MASK; \ + if (__gmp_r >> GMP_NUMB_BITS != 0) \ + { \ + (cout) = 1; \ + for (__gmp_i = 1; __gmp_i < (n);) \ + { \ + __gmp_x = (src)[__gmp_i]; \ + __gmp_r = __gmp_x OP 1; \ + (dst)[__gmp_i] = __gmp_r & GMP_NUMB_MASK; \ + ++__gmp_i; \ + if (__gmp_r >> GMP_NUMB_BITS == 0) \ + { \ + if ((src) != (dst)) \ + __GMPN_COPY_REST (dst, src, n, __gmp_i); \ + (cout) = 0; \ + break; \ + } \ + } \ + } \ + else \ + { \ + if ((src) != (dst)) \ + __GMPN_COPY_REST (dst, src, n, 1); \ + (cout) = 0; \ + } \ + } while (0) +#endif + +#define __GMPN_ADDCB(r,x,y) ((r) < (y)) +#define __GMPN_SUBCB(r,x,y) ((x) < (y)) + +#define __GMPN_ADD_1(cout, dst, src, n, v) \ + __GMPN_AORS_1(cout, dst, src, n, v, +, __GMPN_ADDCB) +#define __GMPN_SUB_1(cout, dst, src, n, v) \ + __GMPN_AORS_1(cout, dst, src, n, v, -, __GMPN_SUBCB) + + +/* Compare {xp,size} and {yp,size}, setting "result" to positive, zero or + negative. size==0 is allowed. On random data usually only one limb will + need to be examined to get a result, so it's worth having it inline. */ +#define __GMPN_CMP(result, xp, yp, size) \ + do { \ + mp_size_t __gmp_i; \ + mp_limb_t __gmp_x, __gmp_y; \ + \ + /* ASSERT ((size) >= 0); */ \ + \ + (result) = 0; \ + __gmp_i = (size); \ + while (--__gmp_i >= 0) \ + { \ + __gmp_x = (xp)[__gmp_i]; \ + __gmp_y = (yp)[__gmp_i]; \ + if (__gmp_x != __gmp_y) \ + { \ + /* Cannot use __gmp_x - __gmp_y, may overflow an "int" */ \ + (result) = (__gmp_x > __gmp_y ? 1 : -1); \ + break; \ + } \ + } \ + } while (0) + + +#if defined (__GMPN_COPY) && ! defined (__GMPN_COPY_REST) +#define __GMPN_COPY_REST(dst, src, size, start) \ + do { \ + /* ASSERT ((start) >= 0); */ \ + /* ASSERT ((start) <= (size)); */ \ + __GMPN_COPY ((dst)+(start), (src)+(start), (size)-(start)); \ + } while (0) +#endif + +/* Copy {src,size} to {dst,size}, starting at "start". This is designed to + keep the indexing dst[j] and src[j] nice and simple for __GMPN_ADD_1, + __GMPN_ADD, etc. */ +#if ! defined (__GMPN_COPY_REST) +#define __GMPN_COPY_REST(dst, src, size, start) \ + do { \ + mp_size_t __gmp_j; \ + /* ASSERT ((size) >= 0); */ \ + /* ASSERT ((start) >= 0); */ \ + /* ASSERT ((start) <= (size)); */ \ + /* ASSERT (MPN_SAME_OR_SEPARATE_P (dst, src, size)); */ \ + __GMP_CRAY_Pragma ("_CRI ivdep"); \ + for (__gmp_j = (start); __gmp_j < (size); __gmp_j++) \ + (dst)[__gmp_j] = (src)[__gmp_j]; \ + } while (0) +#endif + +/* Enhancement: Use some of the smarter code from gmp-impl.h. Maybe use + mpn_copyi if there's a native version, and if we don't mind demanding + binary compatibility for it (on targets which use it). */ + +#if ! defined (__GMPN_COPY) +#define __GMPN_COPY(dst, src, size) __GMPN_COPY_REST (dst, src, size, 0) +#endif + + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_add) +#if ! defined (__GMP_FORCE_mpn_add) +__GMP_EXTERN_INLINE +#endif +mp_limb_t +mpn_add (mp_ptr __gmp_wp, mp_srcptr __gmp_xp, mp_size_t __gmp_xsize, mp_srcptr __gmp_yp, mp_size_t __gmp_ysize) +{ + mp_limb_t __gmp_c; + __GMPN_ADD (__gmp_c, __gmp_wp, __gmp_xp, __gmp_xsize, __gmp_yp, __gmp_ysize); + return __gmp_c; +} +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_add_1) +#if ! defined (__GMP_FORCE_mpn_add_1) +__GMP_EXTERN_INLINE +#endif +mp_limb_t +mpn_add_1 (mp_ptr __gmp_dst, mp_srcptr __gmp_src, mp_size_t __gmp_size, mp_limb_t __gmp_n) __GMP_NOTHROW +{ + mp_limb_t __gmp_c; + __GMPN_ADD_1 (__gmp_c, __gmp_dst, __gmp_src, __gmp_size, __gmp_n); + return __gmp_c; +} +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_cmp) +#if ! defined (__GMP_FORCE_mpn_cmp) +__GMP_EXTERN_INLINE +#endif +int +mpn_cmp (mp_srcptr __gmp_xp, mp_srcptr __gmp_yp, mp_size_t __gmp_size) __GMP_NOTHROW +{ + int __gmp_result; + __GMPN_CMP (__gmp_result, __gmp_xp, __gmp_yp, __gmp_size); + return __gmp_result; +} +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_sub) +#if ! defined (__GMP_FORCE_mpn_sub) +__GMP_EXTERN_INLINE +#endif +mp_limb_t +mpn_sub (mp_ptr __gmp_wp, mp_srcptr __gmp_xp, mp_size_t __gmp_xsize, mp_srcptr __gmp_yp, mp_size_t __gmp_ysize) +{ + mp_limb_t __gmp_c; + __GMPN_SUB (__gmp_c, __gmp_wp, __gmp_xp, __gmp_xsize, __gmp_yp, __gmp_ysize); + return __gmp_c; +} +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_sub_1) +#if ! defined (__GMP_FORCE_mpn_sub_1) +__GMP_EXTERN_INLINE +#endif +mp_limb_t +mpn_sub_1 (mp_ptr __gmp_dst, mp_srcptr __gmp_src, mp_size_t __gmp_size, mp_limb_t __gmp_n) __GMP_NOTHROW +{ + mp_limb_t __gmp_c; + __GMPN_SUB_1 (__gmp_c, __gmp_dst, __gmp_src, __gmp_size, __gmp_n); + return __gmp_c; +} +#endif + +#if defined (__GMP_EXTERN_INLINE) || defined (__GMP_FORCE_mpn_neg) +#if ! defined (__GMP_FORCE_mpn_neg) +__GMP_EXTERN_INLINE +#endif +mp_limb_t +mpn_neg (mp_ptr __gmp_rp, mp_srcptr __gmp_up, mp_size_t __gmp_n) +{ + mp_limb_t __gmp_ul, __gmp_cy; + __gmp_cy = 0; + do { + __gmp_ul = *__gmp_up++; + *__gmp_rp++ = -__gmp_ul - __gmp_cy; + __gmp_cy |= __gmp_ul != 0; + } while (--__gmp_n != 0); + return __gmp_cy; +} +#endif + +#if defined (__cplusplus) +} +#endif + + +/* Allow faster testing for negative, zero, and positive. */ +#define mpz_sgn(Z) ((Z)->_mp_size < 0 ? -1 : (Z)->_mp_size > 0) +#define mpf_sgn(F) ((F)->_mp_size < 0 ? -1 : (F)->_mp_size > 0) +#define mpq_sgn(Q) ((Q)->_mp_num._mp_size < 0 ? -1 : (Q)->_mp_num._mp_size > 0) + +/* When using GCC, optimize certain common comparisons. */ +#if defined (__GNUC__) && __GNUC__ >= 2 +#define mpz_cmp_ui(Z,UI) \ + (__builtin_constant_p (UI) && (UI) == 0 \ + ? mpz_sgn (Z) : _mpz_cmp_ui (Z,UI)) +#define mpz_cmp_si(Z,SI) \ + (__builtin_constant_p (SI) && (SI) == 0 ? mpz_sgn (Z) \ + : __builtin_constant_p (SI) && (SI) > 0 \ + ? _mpz_cmp_ui (Z, __GMP_CAST (unsigned long int, SI)) \ + : _mpz_cmp_si (Z,SI)) +#define mpq_cmp_ui(Q,NUI,DUI) \ + (__builtin_constant_p (NUI) && (NUI) == 0 \ + ? mpq_sgn (Q) : _mpq_cmp_ui (Q,NUI,DUI)) +#define mpq_cmp_si(q,n,d) \ + (__builtin_constant_p ((n) >= 0) && (n) >= 0 \ + ? mpq_cmp_ui (q, __GMP_CAST (unsigned long, n), d) \ + : _mpq_cmp_si (q, n, d)) +#else +#define mpz_cmp_ui(Z,UI) _mpz_cmp_ui (Z,UI) +#define mpz_cmp_si(Z,UI) _mpz_cmp_si (Z,UI) +#define mpq_cmp_ui(Q,NUI,DUI) _mpq_cmp_ui (Q,NUI,DUI) +#define mpq_cmp_si(q,n,d) _mpq_cmp_si(q,n,d) +#endif + + +/* Using "&" rather than "&&" means these can come out branch-free. Every + mpz_t has at least one limb allocated, so fetching the low limb is always + allowed. */ +#define mpz_odd_p(z) (((z)->_mp_size != 0) & __GMP_CAST (int, (z)->_mp_d[0])) +#define mpz_even_p(z) (! mpz_odd_p (z)) + + +/**************** C++ routines ****************/ + +#ifdef __cplusplus +__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpz_srcptr); +__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpq_srcptr); +__GMP_DECLSPEC_XX std::ostream& operator<< (std::ostream &, mpf_srcptr); +__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpz_ptr); +__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpq_ptr); +__GMP_DECLSPEC_XX std::istream& operator>> (std::istream &, mpf_ptr); +#endif + + +/* Source-level compatibility with GMP 2 and earlier. */ +#define mpn_divmod(qp,np,nsize,dp,dsize) \ + mpn_divrem (qp, __GMP_CAST (mp_size_t, 0), np, nsize, dp, dsize) + +/* Source-level compatibility with GMP 1. */ +#define mpz_mdiv mpz_fdiv_q +#define mpz_mdivmod mpz_fdiv_qr +#define mpz_mmod mpz_fdiv_r +#define mpz_mdiv_ui mpz_fdiv_q_ui +#define mpz_mdivmod_ui(q,r,n,d) \ + (((r) == 0) ? mpz_fdiv_q_ui (q,n,d) : mpz_fdiv_qr_ui (q,r,n,d)) +#define mpz_mmod_ui(r,n,d) \ + (((r) == 0) ? mpz_fdiv_ui (n,d) : mpz_fdiv_r_ui (r,n,d)) + +/* Useful synonyms, but not quite compatible with GMP 1. */ +#define mpz_div mpz_fdiv_q +#define mpz_divmod mpz_fdiv_qr +#define mpz_div_ui mpz_fdiv_q_ui +#define mpz_divmod_ui mpz_fdiv_qr_ui +#define mpz_div_2exp mpz_fdiv_q_2exp +#define mpz_mod_2exp mpz_fdiv_r_2exp + +enum +{ + GMP_ERROR_NONE = 0, + GMP_ERROR_UNSUPPORTED_ARGUMENT = 1, + GMP_ERROR_DIVISION_BY_ZERO = 2, + GMP_ERROR_SQRT_OF_NEGATIVE = 4, + GMP_ERROR_INVALID_ARGUMENT = 8 +}; + +/* Define CC and CFLAGS which were used to build this version of GMP */ +#define __GMP_CC "gcc" +#define __GMP_CFLAGS "-O2 -pedantic -m64 -std=gnu99 -mtune=k8 -march=k8" + +/* Major version number is the value of __GNU_MP__ too, above and in mp.h. */ +#define __GNU_MP_VERSION 5 +#define __GNU_MP_VERSION_MINOR 0 +#define __GNU_MP_VERSION_PATCHLEVEL 1 +#define __GMP_MP_RELEASE (__GNU_MP_VERSION * 10000 + __GNU_MP_VERSION_MINOR * 100 + __GNU_MP_VERSION_PATCHLEVEL) + +#define __GMP_H__ +#endif /* __GMP_H__ */ diff --git a/deps/GMP/gmp/lib/win32/libgmp-10.dll b/deps/GMP/gmp/lib/win32/libgmp-10.dll new file mode 100644 index 0000000000..387656ca84 Binary files /dev/null and b/deps/GMP/gmp/lib/win32/libgmp-10.dll differ diff --git a/deps/GMP/gmp/lib/win32/libgmp-10.lib b/deps/GMP/gmp/lib/win32/libgmp-10.lib new file mode 100644 index 0000000000..53bb34cc96 Binary files /dev/null and b/deps/GMP/gmp/lib/win32/libgmp-10.lib differ diff --git a/deps/GMP/gmp/lib/win64/libgmp-10.dll b/deps/GMP/gmp/lib/win64/libgmp-10.dll new file mode 100644 index 0000000000..f92b289213 Binary files /dev/null and b/deps/GMP/gmp/lib/win64/libgmp-10.dll differ diff --git a/deps/GMP/gmp/lib/win64/libgmp-10.lib b/deps/GMP/gmp/lib/win64/libgmp-10.lib new file mode 100644 index 0000000000..ed35472388 Binary files /dev/null and b/deps/GMP/gmp/lib/win64/libgmp-10.lib differ diff --git a/deps/MPFR/MPFR.cmake b/deps/MPFR/MPFR.cmake new file mode 100644 index 0000000000..ddbb178d8d --- /dev/null +++ b/deps/MPFR/MPFR.cmake @@ -0,0 +1,29 @@ +set(_srcdir ${CMAKE_CURRENT_LIST_DIR}/mpfr) +set(_dstdir ${DESTDIR}/usr/local) + +if (MSVC) + set(_output ${_dstdir}/include/mpfr.h + ${_dstdir}/include/mpf2mpfr.h + ${_dstdir}/lib/libmpfr-4.lib + ${_dstdir}/bin/libmpfr-4.dll) + + add_custom_command( + OUTPUT ${_output} + COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/include/mpfr.h ${_dstdir}/include/ + COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/include/mpf2mpfr.h ${_dstdir}/include/ + COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/lib/win${DEPS_BITS}/libmpfr-4.lib ${_dstdir}/lib/ + COMMAND ${CMAKE_COMMAND} -E copy ${_srcdir}/lib/win${DEPS_BITS}/libmpfr-4.dll ${_dstdir}/bin/ + ) + + add_custom_target(dep_MPFR SOURCES ${_output}) + +else () + ExternalProject_Add(dep_MPFR + URL http://ftp.vim.org/ftp/gnu/mpfr/mpfr-3.1.6.tar.bz2 https://www.mpfr.org/mpfr-3.1.6/mpfr-3.1.6.tar.bz2 # mirrors are allowed + BUILD_IN_SOURCE ON + CONFIGURE_COMMAND env "CFLAGS=${_gmp_ccflags}" "CXXFLAGS=${_gmp_ccflags}" ./configure --prefix=${DESTDIR}/usr/local --enable-shared=no --enable-static=yes --with-gmp=${DESTDIR}/usr/local ${_gmp_build_tgt} + BUILD_COMMAND make -j + INSTALL_COMMAND make install + DEPENDS dep_GMP + ) +endif () diff --git a/deps/MPFR/mpfr/include/mpf2mpfr.h b/deps/MPFR/mpfr/include/mpf2mpfr.h new file mode 100644 index 0000000000..0d1a4ee1ed --- /dev/null +++ b/deps/MPFR/mpfr/include/mpf2mpfr.h @@ -0,0 +1,175 @@ +/* mpf2mpfr.h -- Compatibility include file with mpf. + +Copyright 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +Contributed by the Arenaire and Cacao projects, INRIA. + +This file is part of the GNU MPFR Library. + +The GNU MPFR Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The GNU MPFR Library 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 Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see +http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., +51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef __MPFR_FROM_MPF__ +#define __MPFR_FROM_MPF__ + +/* types */ +#define mpf_t mpfr_t +#define mpf_srcptr mpfr_srcptr +#define mpf_ptr mpfr_ptr + +/* Get current Rounding Mode */ +#ifndef MPFR_DEFAULT_RND +# define MPFR_DEFAULT_RND mpfr_get_default_rounding_mode () +#endif + +/* mpf_init initalizes at 0 */ +#undef mpf_init +#define mpf_init(x) mpfr_init_set_ui ((x), 0, MPFR_DEFAULT_RND) +#undef mpf_init2 +#define mpf_init2(x,p) (mpfr_init2((x),(p)), mpfr_set_ui ((x), 0, MPFR_DEFAULT_RND)) + +/* functions which don't take as argument the rounding mode */ +#undef mpf_ceil +#define mpf_ceil mpfr_ceil +#undef mpf_clear +#define mpf_clear mpfr_clear +#undef mpf_cmp +#define mpf_cmp mpfr_cmp +#undef mpf_cmp_si +#define mpf_cmp_si mpfr_cmp_si +#undef mpf_cmp_ui +#define mpf_cmp_ui mpfr_cmp_ui +#undef mpf_cmp_d +#define mpf_cmp_d mpfr_cmp_d +#undef mpf_eq +#define mpf_eq mpfr_eq +#undef mpf_floor +#define mpf_floor mpfr_floor +#undef mpf_get_prec +#define mpf_get_prec mpfr_get_prec +#undef mpf_integer_p +#define mpf_integer_p mpfr_integer_p +#undef mpf_random2 +#define mpf_random2 mpfr_random2 +#undef mpf_set_default_prec +#define mpf_set_default_prec mpfr_set_default_prec +#undef mpf_get_default_prec +#define mpf_get_default_prec mpfr_get_default_prec +#undef mpf_set_prec +#define mpf_set_prec mpfr_set_prec +#undef mpf_set_prec_raw +#define mpf_set_prec_raw(x,p) mpfr_prec_round(x,p,MPFR_DEFAULT_RND) +#undef mpf_trunc +#define mpf_trunc mpfr_trunc +#undef mpf_sgn +#define mpf_sgn mpfr_sgn +#undef mpf_swap +#define mpf_swap mpfr_swap +#undef mpf_dump +#define mpf_dump mpfr_dump + +/* functions which take as argument the rounding mode */ +#undef mpf_abs +#define mpf_abs(x,y) mpfr_abs(x,y,MPFR_DEFAULT_RND) +#undef mpf_add +#define mpf_add(x,y,z) mpfr_add(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_add_ui +#define mpf_add_ui(x,y,z) mpfr_add_ui(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_div +#define mpf_div(x,y,z) mpfr_div(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_div_ui +#define mpf_div_ui(x,y,z) mpfr_div_ui(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_div_2exp +#define mpf_div_2exp(x,y,z) mpfr_div_2exp(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_fits_slong_p +#define mpf_fits_slong_p(x) mpfr_fits_ulong_p(x,MPFR_DEFAULT_RND) +#undef mpf_fits_ulong_p +#define mpf_fits_ulong_p(x) mpfr_fits_ulong_p(x,MPFR_DEFAULT_RND) +#undef mpf_fits_sint_p +#define mpf_fits_sint_p(x) mpfr_fits_uint_p(x,MPFR_DEFAULT_RND) +#undef mpf_fits_uint_p +#define mpf_fits_uint_p(x) mpfr_fits_uint_p(x,MPFR_DEFAULT_RND) +#undef mpf_fits_sshort_p +#define mpf_fits_sshort_p(x) mpfr_fits_ushort_p(x,MPFR_DEFAULT_RND) +#undef mpf_fits_ushort_p +#define mpf_fits_ushort_p(x) mpfr_fits_ushort_p(x,MPFR_DEFAULT_RND) +#undef mpf_get_str +#define mpf_get_str(x,y,z,t,u) mpfr_get_str(x,y,z,t,u,MPFR_DEFAULT_RND) +#undef mpf_get_d +#define mpf_get_d(x) mpfr_get_d(x,MPFR_DEFAULT_RND) +#undef mpf_get_d_2exp +#define mpf_get_d_2exp(e,x) mpfr_get_d_2exp(e,x,MPFR_DEFAULT_RND) +#undef mpf_get_ui +#define mpf_get_ui(x) mpfr_get_ui(x,MPFR_DEFAULT_RND) +#undef mpf_get_si +#define mpf_get_si(x) mpfr_get_ui(x,MPFR_DEFAULT_RND) +#undef mpf_inp_str +#define mpf_inp_str(x,y,z) mpfr_inp_str(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_set_str +#define mpf_set_str(x,y,z) mpfr_set_str(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_init_set +#define mpf_init_set(x,y) mpfr_init_set(x,y,MPFR_DEFAULT_RND) +#undef mpf_init_set_d +#define mpf_init_set_d(x,y) mpfr_init_set_d(x,y,MPFR_DEFAULT_RND) +#undef mpf_init_set_si +#define mpf_init_set_si(x,y) mpfr_init_set_si(x,y,MPFR_DEFAULT_RND) +#undef mpf_init_set_str +#define mpf_init_set_str(x,y,z) mpfr_init_set_str(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_init_set_ui +#define mpf_init_set_ui(x,y) mpfr_init_set_ui(x,y,MPFR_DEFAULT_RND) +#undef mpf_mul +#define mpf_mul(x,y,z) mpfr_mul(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_mul_2exp +#define mpf_mul_2exp(x,y,z) mpfr_mul_2exp(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_mul_ui +#define mpf_mul_ui(x,y,z) mpfr_mul_ui(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_neg +#define mpf_neg(x,y) mpfr_neg(x,y,MPFR_DEFAULT_RND) +#undef mpf_out_str +#define mpf_out_str(x,y,z,t) mpfr_out_str(x,y,z,t,MPFR_DEFAULT_RND) +#undef mpf_pow_ui +#define mpf_pow_ui(x,y,z) mpfr_pow_ui(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_reldiff +#define mpf_reldiff(x,y,z) mpfr_reldiff(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_set +#define mpf_set(x,y) mpfr_set(x,y,MPFR_DEFAULT_RND) +#undef mpf_set_d +#define mpf_set_d(x,y) mpfr_set_d(x,y,MPFR_DEFAULT_RND) +#undef mpf_set_q +#define mpf_set_q(x,y) mpfr_set_q(x,y,MPFR_DEFAULT_RND) +#undef mpf_set_si +#define mpf_set_si(x,y) mpfr_set_si(x,y,MPFR_DEFAULT_RND) +#undef mpf_set_ui +#define mpf_set_ui(x,y) mpfr_set_ui(x,y,MPFR_DEFAULT_RND) +#undef mpf_set_z +#define mpf_set_z(x,y) mpfr_set_z(x,y,MPFR_DEFAULT_RND) +#undef mpf_sqrt +#define mpf_sqrt(x,y) mpfr_sqrt(x,y,MPFR_DEFAULT_RND) +#undef mpf_sqrt_ui +#define mpf_sqrt_ui(x,y) mpfr_sqrt_ui(x,y,MPFR_DEFAULT_RND) +#undef mpf_sub +#define mpf_sub(x,y,z) mpfr_sub(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_sub_ui +#define mpf_sub_ui(x,y,z) mpfr_sub_ui(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_ui_div +#define mpf_ui_div(x,y,z) mpfr_ui_div(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_ui_sub +#define mpf_ui_sub(x,y,z) mpfr_ui_sub(x,y,z,MPFR_DEFAULT_RND) +#undef mpf_urandomb +#define mpf_urandomb(x,y,n) mpfr_urandomb(x,y) + +#undef mpz_set_f +#define mpz_set_f(z,f) mpfr_get_z(z,f,MPFR_DEFAULT_RND) + +#endif /* __MPFR_FROM_MPF__ */ diff --git a/deps/MPFR/mpfr/include/mpfr.h b/deps/MPFR/mpfr/include/mpfr.h new file mode 100644 index 0000000000..d330e33f7d --- /dev/null +++ b/deps/MPFR/mpfr/include/mpfr.h @@ -0,0 +1,910 @@ +/* mpfr.h -- Include file for mpfr. + +Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +Contributed by the Arenaire and Cacao projects, INRIA. + +This file is part of the GNU MPFR Library. + +The GNU MPFR Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The GNU MPFR Library 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 Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see +http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., +51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#ifndef __MPFR_H +#define __MPFR_H + +/* Define MPFR version number */ +#define MPFR_VERSION_MAJOR 3 +#define MPFR_VERSION_MINOR 0 +#define MPFR_VERSION_PATCHLEVEL 0 +#define MPFR_VERSION_STRING "3.0.0" + +/* Macros dealing with MPFR VERSION */ +#define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) +#define MPFR_VERSION \ +MPFR_VERSION_NUM(MPFR_VERSION_MAJOR,MPFR_VERSION_MINOR,MPFR_VERSION_PATCHLEVEL) + +/* Check if GMP is included, and try to include it (Works with local GMP) */ +#ifndef __GMP_H__ +# include +#endif + +/* Check if stdio.h is included or if the user wants FILE */ +#if defined (_GMP_H_HAVE_FILE) || defined (MPFR_USE_FILE) +# define _MPFR_H_HAVE_FILE 1 +#endif + +#if defined (_GMP_H_HAVE_VA_LIST) +# define _MPFR_H_HAVE_VA_LIST 1 +#endif + +/* Check if / is included or if the user + explicitly wants intmax_t. Automatical detection is done by + checking: + - INTMAX_C and UINTMAX_C, but not if the compiler is a C++ one + (as suggested by Patrick Pelissier) because the test does not + work well in this case. See: + http://websympa.loria.fr/wwsympa/arc/mpfr/2010-02/msg00025.html + We do not check INTMAX_MAX and UINTMAX_MAX because under Solaris, + these macros are always defined by (i.e. even when + and are not included). + - _STDINT_H (defined by the glibc) and _STDINT_H_ (defined under + Mac OS X), but this test may not work with all implementations. + Portable software should not rely on these tests. +*/ +#if (defined (INTMAX_C) && defined (UINTMAX_C) && !defined(__cplusplus)) || \ + defined (MPFR_USE_INTMAX_T) || defined (_STDINT_H) || defined (_STDINT_H_) +# define _MPFR_H_HAVE_INTMAX_T 1 +#endif + +/* Definition of rounding modes (DON'T USE MPFR_RNDNA!). + Warning! Changing the contents of this enum should be seen as an + interface change since the old and the new types are not compatible + (the integer type compatible with the enumerated type can even change, + see ISO C99, 6.7.2.2#4), and in Makefile.am, AGE should be set to 0. + + MPFR_RNDU must appear just before MPFR_RNDD (see + MPFR_IS_RNDUTEST_OR_RNDDNOTTEST in mpfr-impl.h). + + MPFR_RNDF has been added, though not implemented yet, in order to avoid + to break the ABI once faithful rounding gets implemented. + + If you change the order of the rounding modes, please update the routines + in texceptions.c which assume 0=RNDN, 1=RNDZ, 2=RNDU, 3=RNDD, 4=RNDA. +*/ +typedef enum { + MPFR_RNDN=0, /* round to nearest, with ties to even */ + MPFR_RNDZ, /* round toward zero */ + MPFR_RNDU, /* round toward +Inf */ + MPFR_RNDD, /* round toward -Inf */ + MPFR_RNDA, /* round away from zero */ + MPFR_RNDF, /* faithful rounding (not implemented yet) */ + MPFR_RNDNA=-1 /* round to nearest, with ties away from zero (mpfr_round) */ +} mpfr_rnd_t; + +/* kept for compatibility with MPFR 2.4.x and before */ +#define GMP_RNDN MPFR_RNDN +#define GMP_RNDZ MPFR_RNDZ +#define GMP_RNDU MPFR_RNDU +#define GMP_RNDD MPFR_RNDD + +/* Define precision : 1 (short), 2 (int) or 3 (long) (DON'T USE IT!)*/ +#ifndef _MPFR_PREC_FORMAT +# if __GMP_MP_SIZE_T_INT == 1 +# define _MPFR_PREC_FORMAT 2 +# else +# define _MPFR_PREC_FORMAT 3 +# endif +#endif + +/* Let's make mpfr_prec_t signed in order to avoid problems due to the + usual arithmetic conversions when mixing mpfr_prec_t and mpfr_exp_t + in an expression (for error analysis) if casts are forgotten. */ +#if _MPFR_PREC_FORMAT == 1 +typedef short mpfr_prec_t; +typedef unsigned short mpfr_uprec_t; +#elif _MPFR_PREC_FORMAT == 2 +typedef int mpfr_prec_t; +typedef unsigned int mpfr_uprec_t; +#elif _MPFR_PREC_FORMAT == 3 +typedef long mpfr_prec_t; +typedef unsigned long mpfr_uprec_t; +#else +# error "Invalid MPFR Prec format" +#endif + +/* Definition of precision limits without needing */ +/* Note: the casts allows the expression to yield the wanted behavior + for _MPFR_PREC_FORMAT == 1 (due to integer promotion rules). */ +#define MPFR_PREC_MIN 2 +#define MPFR_PREC_MAX ((mpfr_prec_t)((mpfr_uprec_t)(~(mpfr_uprec_t)0)>>1)) + +/* Definition of sign */ +typedef int mpfr_sign_t; + +/* Definition of the exponent: same as in GMP. */ +typedef mp_exp_t mpfr_exp_t; + +/* Definition of the standard exponent limits */ +#define MPFR_EMAX_DEFAULT ((mpfr_exp_t) (((unsigned long) 1 << 30) - 1)) +#define MPFR_EMIN_DEFAULT (-(MPFR_EMAX_DEFAULT)) + +/* Definition of the main structure */ +typedef struct { + mpfr_prec_t _mpfr_prec; + mpfr_sign_t _mpfr_sign; + mpfr_exp_t _mpfr_exp; + mp_limb_t *_mpfr_d; +} __mpfr_struct; + +/* Compatibility with previous types of MPFR */ +#ifndef mp_rnd_t +# define mp_rnd_t mpfr_rnd_t +#endif +#ifndef mp_prec_t +# define mp_prec_t mpfr_prec_t +#endif + +/* + The represented number is + _sign*(_d[k-1]/B+_d[k-2]/B^2+...+_d[0]/B^k)*2^_exp + where k=ceil(_mp_prec/GMP_NUMB_BITS) and B=2^GMP_NUMB_BITS. + + For the msb (most significant bit) normalized representation, we must have + _d[k-1]>=B/2, unless the number is singular. + + We must also have the last k*GMP_NUMB_BITS-_prec bits set to zero. +*/ + +typedef __mpfr_struct mpfr_t[1]; +typedef __mpfr_struct *mpfr_ptr; +typedef __gmp_const __mpfr_struct *mpfr_srcptr; + +/* For those who need a direct and fast access to the sign field. + However it is not in the API, thus use it at your own risk: it might + not be supported, or change name, in further versions! + Unfortunately, it must be defined here (instead of MPFR's internal + header file mpfr-impl.h) because it is used by some macros below. +*/ +#define MPFR_SIGN(x) ((x)->_mpfr_sign) + +/* Stack interface */ +typedef enum { + MPFR_NAN_KIND = 0, + MPFR_INF_KIND = 1, MPFR_ZERO_KIND = 2, MPFR_REGULAR_KIND = 3 +} mpfr_kind_t; + +/* GMP defines: + + size_t: Standard size_t + + __GMP_ATTRIBUTE_PURE Attribute for math functions. + + __GMP_NOTHROW For C++: can't throw . + + __GMP_EXTERN_INLINE Attribute for inline function. + * __gmp_const const (Supports for K&R compiler only for mpfr.h). + + __GMP_DECLSPEC_EXPORT compiling to go into a DLL + + __GMP_DECLSPEC_IMPORT compiling to go into a application +*/ +/* Extra MPFR defines */ +#define __MPFR_SENTINEL_ATTR +#if defined (__GNUC__) +# if __GNUC__ >= 4 +# undef __MPFR_SENTINEL_ATTR +# define __MPFR_SENTINEL_ATTR __attribute__ ((sentinel)) +# endif +#endif + +/* Prototypes: Support of K&R compiler */ +#if defined (__GMP_PROTO) +# define _MPFR_PROTO __GMP_PROTO +#elif defined (__STDC__) || defined (__cplusplus) +# define _MPFR_PROTO(x) x +#else +# define _MPFR_PROTO(x) () +#endif +/* Support for WINDOWS Dll: + Check if we are inside a MPFR build, and if so export the functions. + Otherwise does the same thing as GMP */ +#if defined(__MPFR_WITHIN_MPFR) && __GMP_LIBGMP_DLL +# define __MPFR_DECLSPEC __GMP_DECLSPEC_EXPORT +#else +# define __MPFR_DECLSPEC __GMP_DECLSPEC +#endif + +/* Note: In order to be declared, some functions need a specific + system header to be included *before* "mpfr.h". If the user + forgets to include the header, the MPFR function prototype in + the user object file is not correct. To avoid wrong results, + we raise a linker error in that case by changing their internal + name in the library (prefixed by __gmpfr instead of mpfr). See + the lines of the form "#define mpfr_xxx __gmpfr_xxx" below. */ + +#if defined (__cplusplus) +extern "C" { +#endif + +__MPFR_DECLSPEC __gmp_const char * mpfr_get_version _MPFR_PROTO ((void)); +__MPFR_DECLSPEC __gmp_const char * mpfr_get_patches _MPFR_PROTO ((void)); +__MPFR_DECLSPEC int mpfr_buildopt_tls_p _MPFR_PROTO ((void)); +__MPFR_DECLSPEC int mpfr_buildopt_decimal_p _MPFR_PROTO ((void)); + +__MPFR_DECLSPEC mpfr_exp_t mpfr_get_emin _MPFR_PROTO ((void)); +__MPFR_DECLSPEC int mpfr_set_emin _MPFR_PROTO ((mpfr_exp_t)); +__MPFR_DECLSPEC mpfr_exp_t mpfr_get_emin_min _MPFR_PROTO ((void)); +__MPFR_DECLSPEC mpfr_exp_t mpfr_get_emin_max _MPFR_PROTO ((void)); +__MPFR_DECLSPEC mpfr_exp_t mpfr_get_emax _MPFR_PROTO ((void)); +__MPFR_DECLSPEC int mpfr_set_emax _MPFR_PROTO ((mpfr_exp_t)); +__MPFR_DECLSPEC mpfr_exp_t mpfr_get_emax_min _MPFR_PROTO ((void)); +__MPFR_DECLSPEC mpfr_exp_t mpfr_get_emax_max _MPFR_PROTO ((void)); + +__MPFR_DECLSPEC void mpfr_set_default_rounding_mode _MPFR_PROTO((mpfr_rnd_t)); +__MPFR_DECLSPEC mpfr_rnd_t mpfr_get_default_rounding_mode _MPFR_PROTO((void)); +__MPFR_DECLSPEC __gmp_const char * + mpfr_print_rnd_mode _MPFR_PROTO((mpfr_rnd_t)); + +__MPFR_DECLSPEC void mpfr_clear_flags _MPFR_PROTO ((void)); +__MPFR_DECLSPEC void mpfr_clear_underflow _MPFR_PROTO ((void)); +__MPFR_DECLSPEC void mpfr_clear_overflow _MPFR_PROTO ((void)); +__MPFR_DECLSPEC void mpfr_clear_nanflag _MPFR_PROTO ((void)); +__MPFR_DECLSPEC void mpfr_clear_inexflag _MPFR_PROTO ((void)); +__MPFR_DECLSPEC void mpfr_clear_erangeflag _MPFR_PROTO ((void)); + +__MPFR_DECLSPEC void mpfr_set_underflow _MPFR_PROTO ((void)); +__MPFR_DECLSPEC void mpfr_set_overflow _MPFR_PROTO ((void)); +__MPFR_DECLSPEC void mpfr_set_nanflag _MPFR_PROTO ((void)); +__MPFR_DECLSPEC void mpfr_set_inexflag _MPFR_PROTO ((void)); +__MPFR_DECLSPEC void mpfr_set_erangeflag _MPFR_PROTO ((void)); + +__MPFR_DECLSPEC int mpfr_underflow_p _MPFR_PROTO ((void)); +__MPFR_DECLSPEC int mpfr_overflow_p _MPFR_PROTO ((void)); +__MPFR_DECLSPEC int mpfr_nanflag_p _MPFR_PROTO ((void)); +__MPFR_DECLSPEC int mpfr_inexflag_p _MPFR_PROTO ((void)); +__MPFR_DECLSPEC int mpfr_erangeflag_p _MPFR_PROTO ((void)); + +__MPFR_DECLSPEC int + mpfr_check_range _MPFR_PROTO ((mpfr_ptr, int, mpfr_rnd_t)); + +__MPFR_DECLSPEC void mpfr_init2 _MPFR_PROTO ((mpfr_ptr, mpfr_prec_t)); +__MPFR_DECLSPEC void mpfr_init _MPFR_PROTO ((mpfr_ptr)); +__MPFR_DECLSPEC void mpfr_clear _MPFR_PROTO ((mpfr_ptr)); + +__MPFR_DECLSPEC void + mpfr_inits2 _MPFR_PROTO ((mpfr_prec_t, mpfr_ptr, ...)) __MPFR_SENTINEL_ATTR; +__MPFR_DECLSPEC void + mpfr_inits _MPFR_PROTO ((mpfr_ptr, ...)) __MPFR_SENTINEL_ATTR; +__MPFR_DECLSPEC void + mpfr_clears _MPFR_PROTO ((mpfr_ptr, ...)) __MPFR_SENTINEL_ATTR; + +__MPFR_DECLSPEC int + mpfr_prec_round _MPFR_PROTO ((mpfr_ptr, mpfr_prec_t, mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_can_round _MPFR_PROTO ((mpfr_srcptr, mpfr_exp_t, mpfr_rnd_t, mpfr_rnd_t, + mpfr_prec_t)); +__MPFR_DECLSPEC mpfr_prec_t mpfr_min_prec _MPFR_PROTO ((mpfr_srcptr)); + +__MPFR_DECLSPEC mpfr_exp_t mpfr_get_exp _MPFR_PROTO ((mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_set_exp _MPFR_PROTO ((mpfr_ptr, mpfr_exp_t)); +__MPFR_DECLSPEC mpfr_prec_t mpfr_get_prec _MPFR_PROTO((mpfr_srcptr)); +__MPFR_DECLSPEC void mpfr_set_prec _MPFR_PROTO((mpfr_ptr, mpfr_prec_t)); +__MPFR_DECLSPEC void mpfr_set_prec_raw _MPFR_PROTO((mpfr_ptr, mpfr_prec_t)); +__MPFR_DECLSPEC void mpfr_set_default_prec _MPFR_PROTO((mpfr_prec_t)); +__MPFR_DECLSPEC mpfr_prec_t mpfr_get_default_prec _MPFR_PROTO((void)); + +__MPFR_DECLSPEC int mpfr_set_d _MPFR_PROTO ((mpfr_ptr, double, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_set_flt _MPFR_PROTO ((mpfr_ptr, float, mpfr_rnd_t)); +#ifdef MPFR_WANT_DECIMAL_FLOATS +__MPFR_DECLSPEC int mpfr_set_decimal64 _MPFR_PROTO ((mpfr_ptr, _Decimal64, + mpfr_rnd_t)); +#endif +__MPFR_DECLSPEC int + mpfr_set_ld _MPFR_PROTO ((mpfr_ptr, long double, mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_set_z _MPFR_PROTO ((mpfr_ptr, mpz_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_set_z_2exp _MPFR_PROTO ((mpfr_ptr, mpz_srcptr, mpfr_exp_t, mpfr_rnd_t)); +__MPFR_DECLSPEC void mpfr_set_nan _MPFR_PROTO ((mpfr_ptr)); +__MPFR_DECLSPEC void mpfr_set_inf _MPFR_PROTO ((mpfr_ptr, int)); +__MPFR_DECLSPEC void mpfr_set_zero _MPFR_PROTO ((mpfr_ptr, int)); +__MPFR_DECLSPEC int + mpfr_set_f _MPFR_PROTO ((mpfr_ptr, mpf_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_get_f _MPFR_PROTO ((mpf_ptr, mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_set_si _MPFR_PROTO ((mpfr_ptr, long, mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_set_ui _MPFR_PROTO ((mpfr_ptr, unsigned long, mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_set_si_2exp _MPFR_PROTO ((mpfr_ptr, long, mpfr_exp_t, mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_set_ui_2exp _MPFR_PROTO ((mpfr_ptr,unsigned long,mpfr_exp_t,mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_set_q _MPFR_PROTO ((mpfr_ptr, mpq_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_set_str _MPFR_PROTO ((mpfr_ptr, __gmp_const char *, int, mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_init_set_str _MPFR_PROTO ((mpfr_ptr, __gmp_const char *, int, + mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_set4 _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_rnd_t, int)); +__MPFR_DECLSPEC int + mpfr_abs _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_set _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_neg _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_signbit _MPFR_PROTO ((mpfr_srcptr)); +__MPFR_DECLSPEC int + mpfr_setsign _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, int, mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_copysign _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mpfr_rnd_t)); + +#ifdef _MPFR_H_HAVE_INTMAX_T +#define mpfr_set_sj __gmpfr_set_sj +#define mpfr_set_sj_2exp __gmpfr_set_sj_2exp +#define mpfr_set_uj __gmpfr_set_uj +#define mpfr_set_uj_2exp __gmpfr_set_uj_2exp +#define mpfr_get_sj __gmpfr_mpfr_get_sj +#define mpfr_get_uj __gmpfr_mpfr_get_uj +__MPFR_DECLSPEC int mpfr_set_sj _MPFR_PROTO ((mpfr_t, intmax_t, mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_set_sj_2exp _MPFR_PROTO ((mpfr_t, intmax_t, intmax_t, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_set_uj _MPFR_PROTO ((mpfr_t, uintmax_t, mpfr_rnd_t)); +__MPFR_DECLSPEC int + mpfr_set_uj_2exp _MPFR_PROTO ((mpfr_t, uintmax_t, intmax_t, mpfr_rnd_t)); +__MPFR_DECLSPEC intmax_t mpfr_get_sj _MPFR_PROTO ((mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC uintmax_t mpfr_get_uj _MPFR_PROTO ((mpfr_srcptr, mpfr_rnd_t)); +#endif + +__MPFR_DECLSPEC mpfr_exp_t mpfr_get_z_2exp _MPFR_PROTO ((mpz_ptr, mpfr_srcptr)); +__MPFR_DECLSPEC float mpfr_get_flt _MPFR_PROTO ((mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC double mpfr_get_d _MPFR_PROTO ((mpfr_srcptr, mpfr_rnd_t)); +#ifdef MPFR_WANT_DECIMAL_FLOATS +__MPFR_DECLSPEC _Decimal64 mpfr_get_decimal64 _MPFR_PROTO ((mpfr_srcptr, + mpfr_rnd_t)); +#endif +__MPFR_DECLSPEC long double mpfr_get_ld _MPFR_PROTO ((mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC double mpfr_get_d1 _MPFR_PROTO ((mpfr_srcptr)); +__MPFR_DECLSPEC double mpfr_get_d_2exp _MPFR_PROTO ((long*, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC long double mpfr_get_ld_2exp _MPFR_PROTO ((long*, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC long mpfr_get_si _MPFR_PROTO ((mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC unsigned long mpfr_get_ui _MPFR_PROTO ((mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC char*mpfr_get_str _MPFR_PROTO ((char*, mpfr_exp_t*, int, size_t, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_get_z _MPFR_PROTO ((mpz_ptr z, mpfr_srcptr f, + mpfr_rnd_t)); + +__MPFR_DECLSPEC void mpfr_free_str _MPFR_PROTO ((char *)); + +__MPFR_DECLSPEC int mpfr_urandom _MPFR_PROTO ((mpfr_ptr, gmp_randstate_t, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_urandomb _MPFR_PROTO ((mpfr_ptr, gmp_randstate_t)); + +__MPFR_DECLSPEC void mpfr_nextabove _MPFR_PROTO ((mpfr_ptr)); +__MPFR_DECLSPEC void mpfr_nextbelow _MPFR_PROTO ((mpfr_ptr)); +__MPFR_DECLSPEC void mpfr_nexttoward _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr)); + +#ifdef _MPFR_H_HAVE_FILE +#define mpfr_inp_str __gmpfr_inp_str +#define mpfr_out_str __gmpfr_out_str +__MPFR_DECLSPEC size_t mpfr_inp_str _MPFR_PROTO ((mpfr_ptr, FILE*, int, + mpfr_rnd_t)); +__MPFR_DECLSPEC size_t mpfr_out_str _MPFR_PROTO ((FILE*, int, size_t, + mpfr_srcptr, mpfr_rnd_t)); +#define mpfr_fprintf __gmpfr_fprintf +__MPFR_DECLSPEC int mpfr_fprintf _MPFR_PROTO ((FILE*, __gmp_const char*, + ...)); +#endif +__MPFR_DECLSPEC int mpfr_printf _MPFR_PROTO ((__gmp_const char*, ...)); +__MPFR_DECLSPEC int mpfr_asprintf _MPFR_PROTO ((char**, __gmp_const char*, + ...)); +__MPFR_DECLSPEC int mpfr_sprintf _MPFR_PROTO ((char*, __gmp_const char*, + ...)); +__MPFR_DECLSPEC int mpfr_snprintf _MPFR_PROTO ((char*, size_t, + __gmp_const char*, ...)); + +#ifdef _MPFR_H_HAVE_VA_LIST +#ifdef _MPFR_H_HAVE_FILE +#define mpfr_vfprintf __gmpfr_vfprintf +__MPFR_DECLSPEC int mpfr_vfprintf _MPFR_PROTO ((FILE*, __gmp_const char*, + va_list)); +#endif /* _MPFR_H_HAVE_FILE */ +#define mpfr_vprintf __gmpfr_vprintf +#define mpfr_vasprintf __gmpfr_vasprintf +#define mpfr_vsprintf __gmpfr_vsprintf +#define mpfr_vsnprintf __gmpfr_vsnprintf +__MPFR_DECLSPEC int mpfr_vprintf _MPFR_PROTO ((__gmp_const char*, va_list)); +__MPFR_DECLSPEC int mpfr_vasprintf _MPFR_PROTO ((char**, __gmp_const char*, + va_list)); +__MPFR_DECLSPEC int mpfr_vsprintf _MPFR_PROTO ((char*, __gmp_const char*, + va_list)); +__MPFR_DECLSPEC int mpfr_vsnprintf _MPFR_PROTO ((char*, size_t, + __gmp_const char*, va_list)); +#endif /* _MPFR_H_HAVE_VA_LIST */ + +__MPFR_DECLSPEC int mpfr_pow _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_pow_si _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + long int, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_pow_ui _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + unsigned long int, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_ui_pow_ui _MPFR_PROTO ((mpfr_ptr, unsigned long int, + unsigned long int, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_ui_pow _MPFR_PROTO ((mpfr_ptr, unsigned long int, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_pow_z _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpz_srcptr, mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_sqrt _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_sqrt_ui _MPFR_PROTO ((mpfr_ptr, unsigned long, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_rec_sqrt _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_add _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_sub _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_mul _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_div _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_srcptr, mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_add_ui _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + unsigned long, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_sub_ui _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + unsigned long, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_ui_sub _MPFR_PROTO ((mpfr_ptr, unsigned long, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_mul_ui _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + unsigned long, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_div_ui _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + unsigned long, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_ui_div _MPFR_PROTO ((mpfr_ptr, unsigned long, + mpfr_srcptr, mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_add_si _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + long int, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_sub_si _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + long int, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_si_sub _MPFR_PROTO ((mpfr_ptr, long int, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_mul_si _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + long int, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_div_si _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + long int, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_si_div _MPFR_PROTO ((mpfr_ptr, long int, + mpfr_srcptr, mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_add_d _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + double, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_sub_d _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + double, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_d_sub _MPFR_PROTO ((mpfr_ptr, double, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_mul_d _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + double, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_div_d _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + double, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_d_div _MPFR_PROTO ((mpfr_ptr, double, + mpfr_srcptr, mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_sqr _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_const_pi _MPFR_PROTO ((mpfr_ptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_const_log2 _MPFR_PROTO ((mpfr_ptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_const_euler _MPFR_PROTO ((mpfr_ptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_const_catalan _MPFR_PROTO ((mpfr_ptr, mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_agm _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_srcptr, + mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_log _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_log2 _MPFR_PROTO ((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_log10 _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_log1p _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_exp _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_exp2 _MPFR_PROTO ((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_exp10 _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_expm1 _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_eint _MPFR_PROTO ((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_li2 _MPFR_PROTO ((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_cmp _MPFR_PROTO ((mpfr_srcptr, mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_cmp3 _MPFR_PROTO ((mpfr_srcptr, mpfr_srcptr, int)); +__MPFR_DECLSPEC int mpfr_cmp_d _MPFR_PROTO ((mpfr_srcptr, double)); +__MPFR_DECLSPEC int mpfr_cmp_ld _MPFR_PROTO ((mpfr_srcptr, long double)); +__MPFR_DECLSPEC int mpfr_cmpabs _MPFR_PROTO ((mpfr_srcptr, mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_cmp_ui _MPFR_PROTO ((mpfr_srcptr, unsigned long)); +__MPFR_DECLSPEC int mpfr_cmp_si _MPFR_PROTO ((mpfr_srcptr, long)); +__MPFR_DECLSPEC int mpfr_cmp_ui_2exp _MPFR_PROTO ((mpfr_srcptr, unsigned long, + mpfr_exp_t)); +__MPFR_DECLSPEC int mpfr_cmp_si_2exp _MPFR_PROTO ((mpfr_srcptr, long, + mpfr_exp_t)); +__MPFR_DECLSPEC void mpfr_reldiff _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_eq _MPFR_PROTO((mpfr_srcptr, mpfr_srcptr, + unsigned long)); +__MPFR_DECLSPEC int mpfr_sgn _MPFR_PROTO ((mpfr_srcptr)); + +__MPFR_DECLSPEC int mpfr_mul_2exp _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + unsigned long, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_div_2exp _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + unsigned long, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_mul_2ui _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + unsigned long, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_div_2ui _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + unsigned long, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_mul_2si _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + long, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_div_2si _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + long, mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_rint _MPFR_PROTO((mpfr_ptr,mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_round _MPFR_PROTO((mpfr_ptr, mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_trunc _MPFR_PROTO((mpfr_ptr, mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_ceil _MPFR_PROTO((mpfr_ptr, mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_floor _MPFR_PROTO((mpfr_ptr, mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_rint_round _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_rint_trunc _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_rint_ceil _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_rint_floor _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_frac _MPFR_PROTO ((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_modf _MPFR_PROTO ((mpfr_ptr, mpfr_ptr, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_remquo _MPFR_PROTO ((mpfr_ptr, long*, mpfr_srcptr, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_remainder _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_fmod _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_srcptr, mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_fits_ulong_p _MPFR_PROTO((mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_fits_slong_p _MPFR_PROTO((mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_fits_uint_p _MPFR_PROTO((mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_fits_sint_p _MPFR_PROTO((mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_fits_ushort_p _MPFR_PROTO((mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_fits_sshort_p _MPFR_PROTO((mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_fits_uintmax_p _MPFR_PROTO((mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_fits_intmax_p _MPFR_PROTO((mpfr_srcptr, mpfr_rnd_t)); + +__MPFR_DECLSPEC void mpfr_extract _MPFR_PROTO ((mpz_ptr, mpfr_srcptr, + unsigned int)); +__MPFR_DECLSPEC void mpfr_swap _MPFR_PROTO ((mpfr_ptr, mpfr_ptr)); +__MPFR_DECLSPEC void mpfr_dump _MPFR_PROTO ((mpfr_srcptr)); + +__MPFR_DECLSPEC int mpfr_nan_p _MPFR_PROTO((mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_inf_p _MPFR_PROTO((mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_number_p _MPFR_PROTO((mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_integer_p _MPFR_PROTO ((mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_zero_p _MPFR_PROTO ((mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_regular_p _MPFR_PROTO ((mpfr_srcptr)); + +__MPFR_DECLSPEC int mpfr_greater_p _MPFR_PROTO ((mpfr_srcptr, mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_greaterequal_p _MPFR_PROTO ((mpfr_srcptr, + mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_less_p _MPFR_PROTO ((mpfr_srcptr, mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_lessequal_p _MPFR_PROTO ((mpfr_srcptr, mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_lessgreater_p _MPFR_PROTO((mpfr_srcptr,mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_equal_p _MPFR_PROTO ((mpfr_srcptr, mpfr_srcptr)); +__MPFR_DECLSPEC int mpfr_unordered_p _MPFR_PROTO ((mpfr_srcptr, mpfr_srcptr)); + +__MPFR_DECLSPEC int mpfr_atanh _MPFR_PROTO((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_acosh _MPFR_PROTO((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_asinh _MPFR_PROTO((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_cosh _MPFR_PROTO((mpfr_ptr,mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_sinh _MPFR_PROTO((mpfr_ptr,mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_tanh _MPFR_PROTO((mpfr_ptr,mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_sinh_cosh _MPFR_PROTO ((mpfr_ptr, mpfr_ptr, + mpfr_srcptr, mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_sech _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_csch _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_coth _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_acos _MPFR_PROTO ((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_asin _MPFR_PROTO ((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_atan _MPFR_PROTO ((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_sin _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_sin_cos _MPFR_PROTO ((mpfr_ptr, mpfr_ptr, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_cos _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_tan _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_atan2 _MPFR_PROTO ((mpfr_ptr,mpfr_srcptr,mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_sec _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_csc _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_cot _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_hypot _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_erf _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_erfc _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_cbrt _MPFR_PROTO ((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_root _MPFR_PROTO ((mpfr_ptr,mpfr_srcptr,unsigned long,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_gamma _MPFR_PROTO((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_lngamma _MPFR_PROTO((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_lgamma _MPFR_PROTO((mpfr_ptr,int*,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_digamma _MPFR_PROTO((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_zeta _MPFR_PROTO ((mpfr_ptr,mpfr_srcptr,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_zeta_ui _MPFR_PROTO ((mpfr_ptr,unsigned long,mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_fac_ui _MPFR_PROTO ((mpfr_ptr, unsigned long int, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_j0 _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_j1 _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_jn _MPFR_PROTO ((mpfr_ptr, long, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_y0 _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_y1 _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_yn _MPFR_PROTO ((mpfr_ptr, long, mpfr_srcptr, + mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_ai _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_min _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_max _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_srcptr, + mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_dim _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_srcptr, + mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_mul_z _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpz_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_div_z _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpz_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_add_z _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpz_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_sub_z _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpz_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_cmp_z _MPFR_PROTO ((mpfr_srcptr, mpz_srcptr)); + +__MPFR_DECLSPEC int mpfr_mul_q _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpq_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_div_q _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpq_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_add_q _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpq_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_sub_q _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, + mpq_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_cmp_q _MPFR_PROTO ((mpfr_srcptr, mpq_srcptr)); + +__MPFR_DECLSPEC int mpfr_cmp_f _MPFR_PROTO ((mpfr_srcptr, mpf_srcptr)); + +__MPFR_DECLSPEC int mpfr_fma _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_srcptr, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_fms _MPFR_PROTO ((mpfr_ptr, mpfr_srcptr, mpfr_srcptr, + mpfr_srcptr, mpfr_rnd_t)); +__MPFR_DECLSPEC int mpfr_sum _MPFR_PROTO ((mpfr_ptr, mpfr_ptr *__gmp_const, + unsigned long, mpfr_rnd_t)); + +__MPFR_DECLSPEC void mpfr_free_cache _MPFR_PROTO ((void)); + +__MPFR_DECLSPEC int mpfr_subnormalize _MPFR_PROTO ((mpfr_ptr, int, + mpfr_rnd_t)); + +__MPFR_DECLSPEC int mpfr_strtofr _MPFR_PROTO ((mpfr_ptr, __gmp_const char *, + char **, int, mpfr_rnd_t)); + +__MPFR_DECLSPEC size_t mpfr_custom_get_size _MPFR_PROTO ((mpfr_prec_t)); +__MPFR_DECLSPEC void mpfr_custom_init _MPFR_PROTO ((void *, mpfr_prec_t)); +__MPFR_DECLSPEC void * mpfr_custom_get_significand _MPFR_PROTO ((mpfr_srcptr)); +__MPFR_DECLSPEC mpfr_exp_t mpfr_custom_get_exp _MPFR_PROTO ((mpfr_srcptr)); +__MPFR_DECLSPEC void mpfr_custom_move _MPFR_PROTO ((mpfr_ptr, void *)); +__MPFR_DECLSPEC void mpfr_custom_init_set _MPFR_PROTO ((mpfr_ptr, int, + mpfr_exp_t, mpfr_prec_t, void *)); +__MPFR_DECLSPEC int mpfr_custom_get_kind _MPFR_PROTO ((mpfr_srcptr)); + +#if defined (__cplusplus) +} +#endif + +/* DON'T USE THIS! (For MPFR-public macros only, see below.) + The mpfr_sgn macro uses the fact that __MPFR_EXP_NAN and __MPFR_EXP_ZERO + are the smallest values. + FIXME: In the following macros, the cast of an unsigned type with MSB set + to the signed type mpfr_exp_t yields an integer overflow, which can give + unexpected results with future compilers and aggressive optimisations. + Why not working only with signed types, using INT_MIN and LONG_MIN? */ +#if __GMP_MP_SIZE_T_INT +#define __MPFR_EXP_NAN ((mpfr_exp_t)((~((~(unsigned int)0)>>1))+2)) +#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(unsigned int)0)>>1))+1)) +#define __MPFR_EXP_INF ((mpfr_exp_t)((~((~(unsigned int)0)>>1))+3)) +#else +#define __MPFR_EXP_NAN ((mpfr_exp_t)((~((~(unsigned long)0)>>1))+2)) +#define __MPFR_EXP_ZERO ((mpfr_exp_t)((~((~(unsigned long)0)>>1))+1)) +#define __MPFR_EXP_INF ((mpfr_exp_t)((~((~(unsigned long)0)>>1))+3)) +#endif + +/* Define MPFR_USE_EXTENSION to avoid "gcc -pedantic" warnings. */ +#ifndef MPFR_EXTENSION +# if defined(MPFR_USE_EXTENSION) +# define MPFR_EXTENSION __extension__ +# else +# define MPFR_EXTENSION +# endif +#endif + +/* Warning! This macro doesn't work with K&R C (e.g., compare the "gcc -E" + output with and without -traditional) and shouldn't be used internally. + For public use only, but see the MPFR manual. */ +#define MPFR_DECL_INIT(_x, _p) \ + MPFR_EXTENSION mp_limb_t __gmpfr_local_tab_##_x[((_p)-1)/GMP_NUMB_BITS+1]; \ + MPFR_EXTENSION mpfr_t _x = {{(_p),1,__MPFR_EXP_NAN,__gmpfr_local_tab_##_x}} + +/* Fast access macros to replace function interface. + If the USER don't want to use the macro interface, let him make happy + even if it produces faster and smaller code. */ +#ifndef MPFR_USE_NO_MACRO + +/* Inlining theses functions is both faster and smaller */ +#define mpfr_nan_p(_x) ((_x)->_mpfr_exp == __MPFR_EXP_NAN) +#define mpfr_inf_p(_x) ((_x)->_mpfr_exp == __MPFR_EXP_INF) +#define mpfr_zero_p(_x) ((_x)->_mpfr_exp == __MPFR_EXP_ZERO) +#define mpfr_regular_p(_x) ((_x)->_mpfr_exp > __MPFR_EXP_INF) +#define mpfr_sgn(_x) \ + ((_x)->_mpfr_exp < __MPFR_EXP_INF ? \ + (mpfr_nan_p (_x) ? mpfr_set_erangeflag () : (void) 0), 0 : \ + MPFR_SIGN (_x)) + +/* Prevent them from using as lvalues */ +#define MPFR_VALUE_OF(x) (0 ? (x) : (x)) +#define mpfr_get_prec(_x) MPFR_VALUE_OF((_x)->_mpfr_prec) +#define mpfr_get_exp(_x) MPFR_VALUE_OF((_x)->_mpfr_exp) +/* Note: if need be, the MPFR_VALUE_OF can be used for other expressions + (of any type). Thanks to Wojtek Lerch and Tim Rentsch for the idea. */ + +#define mpfr_round(a,b) mpfr_rint((a), (b), MPFR_RNDNA) +#define mpfr_trunc(a,b) mpfr_rint((a), (b), MPFR_RNDZ) +#define mpfr_ceil(a,b) mpfr_rint((a), (b), MPFR_RNDU) +#define mpfr_floor(a,b) mpfr_rint((a), (b), MPFR_RNDD) + +#define mpfr_cmp_ui(b,i) mpfr_cmp_ui_2exp((b),(i),0) +#define mpfr_cmp_si(b,i) mpfr_cmp_si_2exp((b),(i),0) +#define mpfr_set(a,b,r) mpfr_set4(a,b,r,MPFR_SIGN(b)) +#define mpfr_abs(a,b,r) mpfr_set4(a,b,r,1) +#define mpfr_copysign(a,b,c,r) mpfr_set4(a,b,r,MPFR_SIGN(c)) +#define mpfr_setsign(a,b,s,r) mpfr_set4(a,b,r,(s) ? -1 : 1) +#define mpfr_signbit(x) (MPFR_SIGN(x) < 0) +#define mpfr_cmp(b, c) mpfr_cmp3(b, c, 1) +#define mpfr_mul_2exp(y,x,n,r) mpfr_mul_2ui((y),(x),(n),(r)) +#define mpfr_div_2exp(y,x,n,r) mpfr_div_2ui((y),(x),(n),(r)) + + +/* When using GCC, optimize certain common comparisons and affectations. + + Remove ICC since it defines __GNUC__ but produces a + huge number of warnings if you use this code. + VL: I couldn't reproduce a single warning when enabling these macros + with icc 10.1 20080212 on Itanium. But with this version, __ICC isn't + defined (__INTEL_COMPILER is, though), so that these macros are enabled + anyway. Checking with other ICC versions is needed. Possibly detect + whether warnings are produced or not with a configure test. + + Remove C++ too, since it complains too much. */ +#if defined (__GNUC__) && !defined(__ICC) && !defined(__cplusplus) +#if (__GNUC__ >= 2) +#undef mpfr_cmp_ui +/* We use the fact that mpfr_sgn on NaN sets the erange flag and returns 0. */ +#define mpfr_cmp_ui(_f,_u) \ + (__builtin_constant_p (_u) && (_u) == 0 ? \ + mpfr_sgn (_f) : \ + mpfr_cmp_ui_2exp ((_f),(_u),0)) +#undef mpfr_cmp_si +#define mpfr_cmp_si(_f,_s) \ + (__builtin_constant_p (_s) && (_s) >= 0 ? \ + mpfr_cmp_ui ((_f), (_s)) : \ + mpfr_cmp_si_2exp ((_f), (_s), 0)) +#if __GNUC__ > 2 || __GNUC_MINOR__ >= 95 +#undef mpfr_set_ui +#define mpfr_set_ui(_f,_u,_r) \ + (__builtin_constant_p (_u) && (_u) == 0 ? \ + __extension__ ({ \ + mpfr_ptr _p = (_f); \ + _p->_mpfr_sign = 1; \ + _p->_mpfr_exp = __MPFR_EXP_ZERO; \ + (void) (_r); 0; }) : \ + mpfr_set_ui_2exp ((_f), (_u), 0, (_r))) +#endif +#undef mpfr_set_si +#define mpfr_set_si(_f,_s,_r) \ + (__builtin_constant_p (_s) && (_s) >= 0 ? \ + mpfr_set_ui ((_f), (_s), (_r)) : \ + mpfr_set_si_2exp ((_f), (_s), 0, (_r))) +#endif +#endif + +/* Macro version of mpfr_stack interface for fast access */ +#define mpfr_custom_get_size(p) ((size_t) \ + (((p)+GMP_NUMB_BITS-1)/GMP_NUMB_BITS*sizeof (mp_limb_t))) +#define mpfr_custom_init(m,p) do {} while (0) +#define mpfr_custom_get_significand(x) ((void*)((x)->_mpfr_d)) +#define mpfr_custom_get_exp(x) ((x)->_mpfr_exp) +#define mpfr_custom_move(x,m) do { ((x)->_mpfr_d = (mp_limb_t*)(m)); } while (0) +#define mpfr_custom_init_set(x,k,e,p,m) do { \ + mpfr_ptr _x = (x); \ + mpfr_exp_t _e; \ + mpfr_kind_t _t; \ + int _s, _k; \ + _k = (k); \ + if (_k >= 0) { \ + _t = (mpfr_kind_t) _k; \ + _s = 1; \ + } else { \ + _t = (mpfr_kind_t) -k; \ + _s = -1; \ + } \ + _e = _t == MPFR_REGULAR_KIND ? (e) : \ + _t == MPFR_NAN_KIND ? __MPFR_EXP_NAN : \ + _t == MPFR_INF_KIND ? __MPFR_EXP_INF : __MPFR_EXP_ZERO; \ + _x->_mpfr_prec = (p); \ + _x->_mpfr_sign = _s; \ + _x->_mpfr_exp = _e; \ + _x->_mpfr_d = (mp_limb_t*) (m); \ + } while (0) +#define mpfr_custom_get_kind(x) \ + ( (x)->_mpfr_exp > __MPFR_EXP_INF ? (int)MPFR_REGULAR_KIND*MPFR_SIGN (x) \ + : (x)->_mpfr_exp == __MPFR_EXP_INF ? (int)MPFR_INF_KIND*MPFR_SIGN (x) \ + : (x)->_mpfr_exp == __MPFR_EXP_NAN ? (int)MPFR_NAN_KIND \ + : (int) MPFR_ZERO_KIND * MPFR_SIGN (x) ) + + +#endif /* MPFR_USE_NO_MACRO */ + +/* Theses are defined to be macros */ +#define mpfr_init_set_si(x, i, rnd) \ + ( mpfr_init(x), mpfr_set_si((x), (i), (rnd)) ) +#define mpfr_init_set_ui(x, i, rnd) \ + ( mpfr_init(x), mpfr_set_ui((x), (i), (rnd)) ) +#define mpfr_init_set_d(x, d, rnd) \ + ( mpfr_init(x), mpfr_set_d((x), (d), (rnd)) ) +#define mpfr_init_set_ld(x, d, rnd) \ + ( mpfr_init(x), mpfr_set_ld((x), (d), (rnd)) ) +#define mpfr_init_set_z(x, i, rnd) \ + ( mpfr_init(x), mpfr_set_z((x), (i), (rnd)) ) +#define mpfr_init_set_q(x, i, rnd) \ + ( mpfr_init(x), mpfr_set_q((x), (i), (rnd)) ) +#define mpfr_init_set(x, y, rnd) \ + ( mpfr_init(x), mpfr_set((x), (y), (rnd)) ) +#define mpfr_init_set_f(x, y, rnd) \ + ( mpfr_init(x), mpfr_set_f((x), (y), (rnd)) ) + +/* Compatibility layer -- obsolete functions and macros */ +#define mpfr_cmp_abs mpfr_cmpabs +#define mpfr_round_prec(x,r,p) mpfr_prec_round(x,p,r) +#define __gmp_default_rounding_mode (mpfr_get_default_rounding_mode()) +#define __mpfr_emin (mpfr_get_emin()) +#define __mpfr_emax (mpfr_get_emax()) +#define __mpfr_default_fp_bit_precision (mpfr_get_default_fp_bit_precision()) +#define MPFR_EMIN_MIN mpfr_get_emin_min() +#define MPFR_EMIN_MAX mpfr_get_emin_max() +#define MPFR_EMAX_MIN mpfr_get_emax_min() +#define MPFR_EMAX_MAX mpfr_get_emax_max() +#define mpfr_version (mpfr_get_version()) +#ifndef mpz_set_fr +# define mpz_set_fr mpfr_get_z +#endif +#define mpfr_add_one_ulp(x,r) \ + (mpfr_sgn (x) > 0 ? mpfr_nextabove (x) : mpfr_nextbelow (x)) +#define mpfr_sub_one_ulp(x,r) \ + (mpfr_sgn (x) > 0 ? mpfr_nextbelow (x) : mpfr_nextabove (x)) +#define mpfr_get_z_exp mpfr_get_z_2exp +#define mpfr_custom_get_mantissa mpfr_custom_get_significand + +#endif /* __MPFR_H*/ diff --git a/deps/MPFR/mpfr/lib/win32/libmpfr-4.dll b/deps/MPFR/mpfr/lib/win32/libmpfr-4.dll new file mode 100644 index 0000000000..73a0c801d6 Binary files /dev/null and b/deps/MPFR/mpfr/lib/win32/libmpfr-4.dll differ diff --git a/deps/MPFR/mpfr/lib/win32/libmpfr-4.lib b/deps/MPFR/mpfr/lib/win32/libmpfr-4.lib new file mode 100644 index 0000000000..7b0ad8d2bd Binary files /dev/null and b/deps/MPFR/mpfr/lib/win32/libmpfr-4.lib differ diff --git a/deps/MPFR/mpfr/lib/win64/libmpfr-4.dll b/deps/MPFR/mpfr/lib/win64/libmpfr-4.dll new file mode 100644 index 0000000000..fea68a1c2e Binary files /dev/null and b/deps/MPFR/mpfr/lib/win64/libmpfr-4.dll differ diff --git a/deps/MPFR/mpfr/lib/win64/libmpfr-4.lib b/deps/MPFR/mpfr/lib/win64/libmpfr-4.lib new file mode 100644 index 0000000000..8a1263c509 Binary files /dev/null and b/deps/MPFR/mpfr/lib/win64/libmpfr-4.lib differ diff --git a/deps/MPFR/mpfr/mpfr.COPYING b/deps/MPFR/mpfr/mpfr.COPYING new file mode 100644 index 0000000000..94a9ed024d --- /dev/null +++ b/deps/MPFR/mpfr/mpfr.COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is 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. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + 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. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + 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 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. Use with the GNU Affero General Public License. + + 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 Affero 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 special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 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 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 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. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + 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 GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/deps/MPFR/mpfr/mpfr.COPYING.LESSER b/deps/MPFR/mpfr/mpfr.COPYING.LESSER new file mode 100644 index 0000000000..fc8a5de7ed --- /dev/null +++ b/deps/MPFR/mpfr/mpfr.COPYING.LESSER @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + 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. diff --git a/deps/MPFR/mpfr/mpfr.README b/deps/MPFR/mpfr/mpfr.README new file mode 100644 index 0000000000..45a575f392 --- /dev/null +++ b/deps/MPFR/mpfr/mpfr.README @@ -0,0 +1,91 @@ +Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +Contributed by the Arenaire and Cacao projects, INRIA. + +This file is part of the GNU MPFR Library. + +The GNU MPFR Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +The GNU MPFR Library 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 Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see +http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., +51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. + +############################################################################## + +The GNU MPFR distribution contains the following files: +(This does not apply to code retrieved by Subversion.) + +AUTHORS - the authors of the library +BUGS - bugs in MPFR - please read this file! +COPYING - the GNU General Public License, version 3 +COPYING.LESSER - the GNU Lesser General Public License, version 3 +ChangeLog - the log of changes +FAQ.html - frequently asked questions about MPFR +INSTALL - how to install MPFR (see also mpfr.texi) +Makefile* - files for building the library +NEWS - new features with respect to previous versions +PATCHES - empty file (until patches are applied) +README - this file +TODO - what remains to do (any help is welcome!) +VERSION - version of MPFR (next release version if taken by Subversion) +ac*.m4 - automatic configuration files +ansi2knr.* - convert ANSI C to Kernighan & Ritchie C (source and man page) +*.c - source files +*.h - header files +compile - auxiliary installation file +config.* - auxiliary installation files +configure* - configuration files +depcomp - auxiliary installation file +examples/ - directory containing examples +fdl.texi - the GNU Free Documentation License +get_patches.sh - rebuild get_patches.c when patches have been applied +install-sh - installation file +ltmain.sh - auxiliary installation file +m4/ - directory containing additional configuration files +missing - auxiliary installation file +mparam_h.in - header file template +mpfr.info - info file for MPFR +mpfr.texi - texinfo documentation for MPFR (source) +tests/ - test directory +texinfo.tex - TeX macros to handle mpfr.texi + +According to the special exception to the GNU General Public License, +the autotools files compile, config.sub, config.guess, ltmain.sh, +m4/libtool.m4 and missing are distributed under the same licence of +GNU MPFR. + + +You can get the latest source code by Subversion at InriaGforge: + + svn checkout svn://scm.gforge.inria.fr/svn/mpfr/trunk mpfr + +or + + svn checkout https://scm.gforge.inria.fr/svn/mpfr/trunk mpfr + +(the last argument can be any directory name). You can use + + svn ls svn://scm.gforge.inria.fr/svn/mpfr/branches + svn ls svn://scm.gforge.inria.fr/svn/mpfr/tags + +to get the list of branches or tags (releases), then checkout a +particular branch or tag instead of the trunk. Alternatively, you +can now use the "https:" scheme (a.k.a. DAV) instead of "svn:". +For more information about Subversion, please see: + + * http://svnbook.red-bean.com/ (the official Subversion book); + * http://gcc.gnu.org/wiki/SvnHelp (written for GCC developers, + but interesting general information can be found there); + * http://subversion.tigris.org/faq.html (the Subversion FAQ). + +Subversion users should read the file "README.dev". + +Note: the old CVS repository at cvs-sop.inria.fr is now closed. diff --git a/deps/OpenCSG/CMakeLists.txt.in b/deps/OpenCSG/CMakeLists.txt.in new file mode 100644 index 0000000000..37da0f789b --- /dev/null +++ b/deps/OpenCSG/CMakeLists.txt.in @@ -0,0 +1,101 @@ +cmake_minimum_required(VERSION 3.0) + +project(OpenCSG) + +if (NOT BUILD_SHARED_LIBS) + set(GLEW_USE_STATIC_LIBS ON) +elseif (MSVC) + set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +endif() + +find_package(OpenGL REQUIRED) + +set(GLEW_VERBOSE ON) +find_package(GLEW 1.13.0 REQUIRED) + +set(_srcfiles + src/area.cpp + src/batch.cpp + src/context.cpp + src/channelManager.cpp + src/frameBufferObject.cpp + src/frameBufferObjectExt.cpp + src/occlusionQuery.cpp + src/opencsgRender.cpp + src/openglHelper.cpp + src/pBufferTexture.cpp + src/primitive.cpp + src/primitiveHelper.cpp + src/renderGoldfeather.cpp + src/renderSCS.cpp + src/scissorMemo.cpp + src/settings.cpp + src/stencilManager.cpp + RenderTexture/RenderTexture.cpp + include/opencsg.h + src/opencsgConfig.h + src/area.h + src/batch.h + src/context.h + src/channelManager.h + src/frameBufferObject.h + src/frameBufferObjectExt.h + src/occlusionQuery.h + src/offscreenBuffer.h + src/opencsgRender.h + src/openglHelper.h + src/pBufferTexture.h + src/primitiveHelper.h + src/scissorMemo.h + src/settings.h + src/stencilManager.h +) + +add_library(opencsg ${_srcfiles}) +target_include_directories(opencsg PUBLIC $) +target_include_directories(opencsg PUBLIC $) +target_link_libraries(opencsg PRIVATE GLEW::GLEW OpenGL::GL) + +include(CMakePackageConfigHelpers) + +include(GNUInstallDirs) + +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + VERSION 1.4.2 + COMPATIBILITY AnyNewerVersion +) + +install(TARGETS opencsg + 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}Config.cmake" + NAMESPACE ${PROJECT_NAME}:: ) + +set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) + +install(EXPORT ${PROJECT_NAME}Targets + FILE + "${PROJECT_NAME}Config.cmake" + NAMESPACE + ${PROJECT_NAME}:: + DESTINATION + ${ConfigPackageLocation} +) +install( + FILES + ${PROJECT_SOURCE_DIR}/include/opencsg.h + DESTINATION + ${CMAKE_INSTALL_INCLUDEDIR}/opencsg +) +install( + FILES + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + DESTINATION + ${ConfigPackageLocation} +) diff --git a/deps/OpenCSG/OpenCSG.cmake b/deps/OpenCSG/OpenCSG.cmake new file mode 100644 index 0000000000..fda74cd45e --- /dev/null +++ b/deps/OpenCSG/OpenCSG.cmake @@ -0,0 +1,15 @@ + +prusaslicer_add_cmake_project(OpenCSG + GIT_REPOSITORY https://github.com/floriankirsch/OpenCSG.git + GIT_TAG 83e274457b46c9ad11a4ee599203250b1618f3b9 #v1.4.2 + PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt.in ./CMakeLists.txt + DEPENDS dep_GLEW +) + +if (TARGET ${ZLIB_PKG}) + add_dependencies(dep_OpenCSG ${ZLIB_PKG}) +endif() + +if (MSVC) + add_debug_dep(dep_OpenCSG) +endif () \ No newline at end of file diff --git a/deps/PNG/PNG.cmake b/deps/PNG/PNG.cmake new file mode 100644 index 0000000000..3e55991fba --- /dev/null +++ b/deps/PNG/PNG.cmake @@ -0,0 +1,15 @@ + +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 +) + +if (MSVC) + add_debug_dep(dep_PNG) +endif () diff --git a/deps/ZLIB/0001-Respect-BUILD_SHARED_LIBS.patch b/deps/ZLIB/0001-Respect-BUILD_SHARED_LIBS.patch new file mode 100644 index 0000000000..e65ec0e656 --- /dev/null +++ b/deps/ZLIB/0001-Respect-BUILD_SHARED_LIBS.patch @@ -0,0 +1,51 @@ +From 0c64e33bc2e4e7c011f5a64f5d9c7571a434cc86 Mon Sep 17 00:00:00 2001 +From: tamasmeszaros +Date: Sat, 16 Nov 2019 13:43:17 +0100 +Subject: [PATCH] Respect BUILD_SHARED_LIBS + +--- + CMakeLists.txt | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 0fe939d..01dfea1 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -183,10 +183,12 @@ if(MINGW) + set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj) + endif(MINGW) + +-add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) +-add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) +-set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL) +-set_target_properties(zlib PROPERTIES SOVERSION 1) ++add_library(zlib ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) ++if (BUILD_SHARED_LIBS) ++ target_sources(zlib PRIVATE ${ZLIB_DLL_SRCS}) ++ set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL) ++ set_target_properties(zlib PROPERTIES SOVERSION 1) ++endif() + + if(NOT CYGWIN) + # This property causes shared libraries on Linux to have the full version +@@ -201,7 +203,7 @@ endif() + + if(UNIX) + # On unix-like platforms the library is almost always called libz +- set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z) ++ set_target_properties(zlib PROPERTIES OUTPUT_NAME z) + if(NOT APPLE) + set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"") + endif() +@@ -211,7 +213,7 @@ elseif(BUILD_SHARED_LIBS AND WIN32) + endif() + + if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL ) +- install(TARGETS zlib zlibstatic ++ install(TARGETS zlib + RUNTIME DESTINATION "${INSTALL_BIN_DIR}" + ARCHIVE DESTINATION "${INSTALL_LIB_DIR}" + LIBRARY DESTINATION "${INSTALL_LIB_DIR}" ) +-- +2.16.2.windows.1 + diff --git a/deps/ZLIB/ZLIB.cmake b/deps/ZLIB/ZLIB.cmake new file mode 100644 index 0000000000..574f5b134a --- /dev/null +++ b/deps/ZLIB/ZLIB.cmake @@ -0,0 +1,10 @@ +prusaslicer_add_cmake_project(ZLIB + GIT_REPOSITORY https://github.com/madler/zlib.git + GIT_TAG v1.2.11 + PATCH_COMMAND ${GIT_EXECUTABLE} checkout -f -- . && git clean -df && + ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/0001-Respect-BUILD_SHARED_LIBS.patch + CMAKE_ARGS + -DSKIP_INSTALL_FILES=ON # Prevent installation of man pages et al. + -DCMAKE_POSITION_INDEPENDENT_CODE=ON +) + diff --git a/deps/deps-linux.cmake b/deps/deps-linux.cmake index f5571d4704..ae972327f8 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" @@ -26,11 +34,12 @@ ExternalProject_Add(dep_boost ExternalProject_Add(dep_libopenssl EXCLUDE_FROM_ALL 1 - URL "https://github.com/openssl/openssl/archive/OpenSSL_1_1_0g.tar.gz" - URL_HASH SHA256=8e9516b8635bb9113c51a7b5b27f9027692a56b104e75b709e588c3ffd6a0422 + URL "https://github.com/openssl/openssl/archive/OpenSSL_1_1_0l.tar.gz" + URL_HASH SHA256=e2acf0cf58d9bff2b42f2dc0aee79340c8ffe2c5e45d3ca4533dd5d4f5775b1d BUILD_IN_SOURCE 1 CONFIGURE_COMMAND ./config "--prefix=${DESTDIR}/usr/local" + "--libdir=lib" no-shared no-ssl3-method no-dynamic-engine @@ -54,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 @@ -87,41 +101,4 @@ ExternalProject_Add(dep_libcurl INSTALL_COMMAND make install "DESTDIR=${DESTDIR}" ) -if (DEP_WX_STABLE) - set(DEP_WX_URL "https://github.com/wxWidgets/wxWidgets/releases/download/v3.0.4/wxWidgets-3.0.4.tar.bz2") - set(DEP_WX_HASH "SHA256=96157f988d261b7368e5340afa1a0cad943768f35929c22841f62c25b17bf7f0") -else () - set(DEP_WX_URL "https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.1/wxWidgets-3.1.1.tar.bz2") - set(DEP_WX_HASH "SHA256=c925dfe17e8f8b09eb7ea9bfdcfcc13696a3e14e92750effd839f5e10726159e") -endif() - -ExternalProject_Add(dep_wxwidgets - EXCLUDE_FROM_ALL 1 - URL "${DEP_WX_URL}" - URL_HASH "${DEP_WX_HASH}" - 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) \ No newline at end of file +add_dependencies(dep_openvdb dep_boost) diff --git a/deps/deps-macos.cmake b/deps/deps-macos.cmake index 9e51735fd5..a71a0ebfc0 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") @@ -86,30 +88,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.1-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 bfe5f9fe43..89b7e2b437 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 7491aafe1f..46c9f8864e 100644 --- a/deps/deps-unix-common.cmake +++ b/deps/deps-unix-common.cmake @@ -7,7 +7,16 @@ else () set(TBB_MINGW_WORKAROUND "") endif () -find_package(ZLIB REQUIRED) +find_package(ZLIB QUIET) +if (NOT ZLIB_FOUND) + 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 @@ -51,7 +60,6 @@ ExternalProject_Add(dep_nlopt -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local ${DEP_CMAKE_OPTS} ) -find_package(Git REQUIRED) ExternalProject_Add(dep_qhull EXCLUDE_FROM_ALL 1 @@ -115,6 +123,7 @@ ExternalProject_Add(dep_openvdb -DOPENVDB_CORE_STATIC=ON -DTBB_STATIC=ON -DOPENVDB_BUILD_VDB_PRINT=ON + -DDISABLE_DEPENDENCY_VERSION_CHECKS=ON PATCH_COMMAND PATCH_COMMAND ${GIT_EXECUTABLE} checkout -f -- . && git clean -df && ${GIT_EXECUTABLE} apply --whitespace=fix ${CMAKE_CURRENT_SOURCE_DIR}/openvdb-mods.patch -) \ No newline at end of file +) diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake index 603f249317..ac93b49320 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,37 +147,6 @@ ExternalProject_Add(dep_nlopt add_debug_dep(dep_nlopt) -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 () @@ -214,8 +181,6 @@ if (${DEP_DEBUG}) ) endif () -find_package(Git REQUIRED) - ExternalProject_Add(dep_qhull EXCLUDE_FROM_ALL 1 #URL "https://github.com/qhull/qhull/archive/v7.3.2.tar.gz" @@ -244,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 @@ -299,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 diff --git a/deps/openvdb-mods.patch b/deps/openvdb-mods.patch index 023cb53087..d80d0ffde1 100644 --- a/deps/openvdb-mods.patch +++ b/deps/openvdb-mods.patch @@ -1,24 +1,25 @@ -From dbe038fce8a15ddc9a5c83ec5156d7bc9e178015 Mon Sep 17 00:00:00 2001 +From d359098d9989ac7dbd149611d6ac941529fb4157 Mon Sep 17 00:00:00 2001 From: tamasmeszaros -Date: Wed, 16 Oct 2019 17:42:50 +0200 -Subject: [PATCH] Build fixes for PrusaSlicer integration +Date: Thu, 23 Jan 2020 17:17:36 +0100 +Subject: [PATCH] openvdb-mods -Signed-off-by: tamasmeszaros --- CMakeLists.txt | 3 - - cmake/FindBlosc.cmake | 218 --------------- + cmake/CheckAtomic.cmake | 106 ++++++ + cmake/FindBlosc.cmake | 218 ------------ cmake/FindCppUnit.cmake | 4 +- - cmake/FindIlmBase.cmake | 337 ---------------------- - cmake/FindOpenEXR.cmake | 329 ---------------------- + cmake/FindIlmBase.cmake | 337 ------------------ + cmake/FindOpenEXR.cmake | 329 ------------------ cmake/FindOpenVDB.cmake | 19 +- - cmake/FindTBB.cmake | 605 ++++++++++++++++++++-------------------- - openvdb/CMakeLists.txt | 13 +- + cmake/FindTBB.cmake | 599 ++++++++++++++++---------------- + openvdb/CMakeLists.txt | 16 +- openvdb/Grid.cc | 3 + openvdb/PlatformConfig.h | 9 +- openvdb/cmd/CMakeLists.txt | 4 +- openvdb/unittest/CMakeLists.txt | 3 +- openvdb/unittest/TestFile.cc | 2 +- - 13 files changed, 336 insertions(+), 1213 deletions(-) + 14 files changed, 442 insertions(+), 1210 deletions(-) + create mode 100644 cmake/CheckAtomic.cmake delete mode 100644 cmake/FindBlosc.cmake delete mode 100644 cmake/FindIlmBase.cmake delete mode 100644 cmake/FindOpenEXR.cmake @@ -40,6 +41,119 @@ index 580b353..6d364c1 100644 cmake/FindOpenVDB.cmake cmake/FindTBB.cmake cmake/OpenVDBGLFW3Setup.cmake +diff --git a/cmake/CheckAtomic.cmake b/cmake/CheckAtomic.cmake +new file mode 100644 +index 0000000..c045e30 +--- /dev/null ++++ b/cmake/CheckAtomic.cmake +@@ -0,0 +1,106 @@ ++# atomic builtins are required for threading support. ++ ++INCLUDE(CheckCXXSourceCompiles) ++INCLUDE(CheckLibraryExists) ++ ++# Sometimes linking against libatomic is required for atomic ops, if ++# the platform doesn't support lock-free atomics. ++ ++function(check_working_cxx_atomics varname) ++ set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) ++ set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11") ++ CHECK_CXX_SOURCE_COMPILES(" ++#include ++std::atomic x; ++int main() { ++ return x; ++} ++" ${varname}) ++ set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) ++endfunction(check_working_cxx_atomics) ++ ++function(check_working_cxx_atomics64 varname) ++ set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) ++ set(CMAKE_REQUIRED_FLAGS "-std=c++11 ${CMAKE_REQUIRED_FLAGS}") ++ CHECK_CXX_SOURCE_COMPILES(" ++#include ++#include ++std::atomic x (0); ++int main() { ++ uint64_t i = x.load(std::memory_order_relaxed); ++ return 0; ++} ++" ${varname}) ++ set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) ++endfunction(check_working_cxx_atomics64) ++ ++ ++# This isn't necessary on MSVC, so avoid command-line switch annoyance ++# by only running on GCC-like hosts. ++if (LLVM_COMPILER_IS_GCC_COMPATIBLE) ++ # First check if atomics work without the library. ++ check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB) ++ # If not, check if the library exists, and atomics work with it. ++ if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB) ++ check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC) ++ if( HAVE_LIBATOMIC ) ++ list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") ++ check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB) ++ if (NOT HAVE_CXX_ATOMICS_WITH_LIB) ++ message(FATAL_ERROR "Host compiler must support std::atomic!") ++ endif() ++ else() ++ message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.") ++ endif() ++ endif() ++endif() ++ ++# Check for 64 bit atomic operations. ++if(MSVC) ++ set(HAVE_CXX_ATOMICS64_WITHOUT_LIB True) ++else() ++ check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB) ++endif() ++ ++# If not, check if the library exists, and atomics work with it. ++if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB) ++ check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64) ++ if(HAVE_CXX_LIBATOMICS64) ++ list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") ++ check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB) ++ if (NOT HAVE_CXX_ATOMICS64_WITH_LIB) ++ message(FATAL_ERROR "Host compiler must support 64-bit std::atomic!") ++ endif() ++ else() ++ message(FATAL_ERROR "Host compiler appears to require libatomic for 64-bit operations, but cannot find it.") ++ endif() ++endif() ++ ++## TODO: This define is only used for the legacy atomic operations in ++## llvm's Atomic.h, which should be replaced. Other code simply ++## assumes C++11 works. ++CHECK_CXX_SOURCE_COMPILES(" ++#ifdef _MSC_VER ++#include ++#endif ++int main() { ++#ifdef _MSC_VER ++ volatile LONG val = 1; ++ MemoryBarrier(); ++ InterlockedCompareExchange(&val, 0, 1); ++ InterlockedIncrement(&val); ++ InterlockedDecrement(&val); ++#else ++ volatile unsigned long val = 1; ++ __sync_synchronize(); ++ __sync_val_compare_and_swap(&val, 1, 0); ++ __sync_add_and_fetch(&val, 1); ++ __sync_sub_and_fetch(&val, 1); ++#endif ++ return 0; ++ } ++" LLVM_HAS_ATOMICS) ++ ++if( NOT LLVM_HAS_ATOMICS ) ++ message(STATUS "Warning: LLVM will be built thread-unsafe because atomic builtins are missing") ++endif() +\ No newline at end of file diff --git a/cmake/FindBlosc.cmake b/cmake/FindBlosc.cmake deleted file mode 100644 index 5aacfdd..0000000 @@ -965,7 +1079,7 @@ index 339c1a2..0000000 - message(FATAL_ERROR "Unable to find OpenEXR") -endif() diff --git a/cmake/FindOpenVDB.cmake b/cmake/FindOpenVDB.cmake -index 63a2eda..6211071 100644 +index 63a2eda..d9f6d07 100644 --- a/cmake/FindOpenVDB.cmake +++ b/cmake/FindOpenVDB.cmake @@ -244,7 +244,7 @@ set(OpenVDB_LIB_COMPONENTS "") @@ -1004,7 +1118,7 @@ index 63a2eda..6211071 100644 ) + + if (OPENVDB_USE_STATIC_LIBS) -+ set_target_properties(OpenVDB::${COMPONENT} PROPERTIES ++ set_target_properties(OpenVDB::${COMPONENT} PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "OPENVDB_STATICLIB;OPENVDB_OPENEXR_STATICLIB" + ) + endif() @@ -1012,7 +1126,7 @@ index 63a2eda..6211071 100644 endforeach() diff --git a/cmake/FindTBB.cmake b/cmake/FindTBB.cmake -index bdf9c81..c6bdec9 100644 +index bdf9c81..06093a4 100644 --- a/cmake/FindTBB.cmake +++ b/cmake/FindTBB.cmake @@ -1,333 +1,332 @@ @@ -1022,35 +1136,21 @@ index bdf9c81..c6bdec9 100644 -# All rights reserved. This software is distributed under the -# Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ ) +# Copyright (c) 2015 Justus Calvin -+# + # +-# Redistributions of source code must retain the above copyright +-# and license notice and the following restrictions and disclaimer. +# 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. -+ - # --# Redistributions of source code must retain the above copyright --# and license notice and the following restrictions and disclaimer. -+# FindTBB -+# ------- # -# * Neither the name of DreamWorks Animation nor the names of -# its contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -+# Find TBB include directories and libraries. ++# The above copyright notice and this permission notice shall be included in all ++# copies or substantial portions of the Software. # -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT @@ -1065,7 +1165,14 @@ index bdf9c81..c6bdec9 100644 -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE -# LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00. -+# Usage: ++# 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. ++ # -#[=======================================================================[.rst: - @@ -1142,19 +1249,26 @@ index bdf9c81..c6bdec9 100644 -if(POLICY CMP0057) - cmake_policy(SET CMP0057 NEW) -endif() ++# FindTBB ++# ------- ++# ++# Find TBB include directories and libraries. ++# ++# Usage: ++# +# find_package(TBB [major[.minor]] [EXACT] +# [QUIET] [REQUIRED] +# [[COMPONENTS] [components...]] -+# [OPTIONAL_COMPONENTS components...]) ++# [OPTIONAL_COMPONENTS components...]) +# -+# where the allowed components are tbbmalloc and tbb_preview. Users may modify ++# where the allowed components are tbbmalloc and tbb_preview. Users may modify +# the behavior of this module with the following variables: +# +# * TBB_ROOT_DIR - The base directory the of TBB installation. +# * TBB_INCLUDE_DIR - The directory that contains the TBB headers files. +# * TBB_LIBRARY - The directory that contains the TBB library files. -+# * TBB__LIBRARY - The path of the TBB the corresponding TBB library. -+# These libraries, if specified, override the ++# * TBB__LIBRARY - The path of the TBB the corresponding TBB library. ++# These libraries, if specified, override the +# corresponding library search results, where +# may be tbb, tbb_debug, tbbmalloc, tbbmalloc_debug, +# tbb_preview, or tbb_preview_debug. @@ -1167,7 +1281,7 @@ index bdf9c81..c6bdec9 100644 +# Users may modify the behavior of this module with the following environment +# variables: +# -+# * TBB_INSTALL_DIR ++# * TBB_INSTALL_DIR +# * TBBROOT +# * LIBRARY_PATH +# @@ -1180,15 +1294,15 @@ index bdf9c81..c6bdec9 100644 +# * TBB_VERSION - The full version string +# * TBB_VERSION_MAJOR - The major version +# * TBB_VERSION_MINOR - The minor version -+# * TBB_INTERFACE_VERSION - The interface version number defined in ++# * TBB_INTERFACE_VERSION - The interface version number defined in +# tbb/tbb_stddef.h. -+# * TBB__LIBRARY_RELEASE - The path of the TBB release version of ++# * TBB__LIBRARY_RELEASE - The path of the TBB release version of +# , where may be tbb, tbb_debug, -+# tbbmalloc, tbbmalloc_debug, tbb_preview, or ++# tbbmalloc, tbbmalloc_debug, tbb_preview, or +# tbb_preview_debug. -+# * TBB__LIBRARY_DEGUG - The path of the TBB release version of ++# * TBB__LIBRARY_DEGUG - The path of the TBB release version of +# , where may be tbb, tbb_debug, -+# tbbmalloc, tbbmalloc_debug, tbb_preview, or ++# tbbmalloc, tbbmalloc_debug, tbb_preview, or +# tbb_preview_debug. +# +# The following varibles should be used to build and link with TBB: @@ -1244,12 +1358,10 @@ index bdf9c81..c6bdec9 100644 - set(TBB_FIND_COMPONENTS ${_TBB_COMPONENT_LIST}) -endif() +include(FindPackageHandleStandardArgs) -+ -+find_package(Threads QUIET REQUIRED) -# Append TBB_ROOT or $ENV{TBB_ROOT} if set (prioritize the direct cmake var) -set(_TBB_ROOT_SEARCH_DIR "") -+if(NOT TBB_FOUND) ++find_package(Threads QUIET REQUIRED) -if(TBB_ROOT) - list(APPEND _TBB_ROOT_SEARCH_DIR ${TBB_ROOT}) @@ -1257,41 +1369,9 @@ index bdf9c81..c6bdec9 100644 - set(_ENV_TBB_ROOT $ENV{TBB_ROOT}) - if(_ENV_TBB_ROOT) - list(APPEND _TBB_ROOT_SEARCH_DIR ${_ENV_TBB_ROOT}) -+ ################################## -+ # Check the build type -+ ################################## -+ -+ if(NOT DEFINED TBB_USE_DEBUG_BUILD) -+ if(CMAKE_BUILD_TYPE MATCHES "(Debug|DEBUG|debug)") -+ set(TBB_BUILD_TYPE DEBUG) -+ else() -+ set(TBB_BUILD_TYPE RELEASE) -+ endif() -+ elseif(TBB_USE_DEBUG_BUILD) -+ set(TBB_BUILD_TYPE DEBUG) -+ else() -+ set(TBB_BUILD_TYPE RELEASE) - endif() +- endif() -endif() -+ -+ ################################## -+ # Set the TBB search directories -+ ################################## -+ -+ # Define search paths based on user input and environment variables -+ set(TBB_SEARCH_DIR ${TBB_ROOT_DIR} $ENV{TBB_INSTALL_DIR} $ENV{TBBROOT}) -+ -+ # Define the search directories based on the current platform -+ if(CMAKE_SYSTEM_NAME STREQUAL "Windows") -+ set(TBB_DEFAULT_SEARCH_DIR "C:/Program Files/Intel/TBB" -+ "C:/Program Files (x86)/Intel/TBB") -+ -+ # Set the target architecture -+ if(CMAKE_SIZEOF_VOID_P EQUAL 8) -+ set(TBB_ARCHITECTURE "intel64") -+ else() -+ set(TBB_ARCHITECTURE "ia32") -+ endif() ++if(NOT TBB_FOUND) -# Additionally try and use pkconfig to find Tbb - @@ -1339,6 +1419,57 @@ index bdf9c81..c6bdec9 100644 - - set(Tbb_VERSION ${Tbb_VERSION_MAJOR}.${Tbb_VERSION_MINOR}) -endif() ++ ################################## ++ # Check the build type ++ ################################## ++ ++ if(NOT DEFINED TBB_USE_DEBUG_BUILD) ++ if(CMAKE_BUILD_TYPE MATCHES "(Debug|DEBUG|debug)") ++ set(TBB_BUILD_TYPE DEBUG) ++ else() ++ set(TBB_BUILD_TYPE RELEASE) ++ endif() ++ elseif(TBB_USE_DEBUG_BUILD) ++ set(TBB_BUILD_TYPE DEBUG) ++ else() ++ set(TBB_BUILD_TYPE RELEASE) ++ endif() + +-# ------------------------------------------------------------------------ +-# Search for TBB lib DIR +-# ------------------------------------------------------------------------ ++ ################################## ++ # Set the TBB search directories ++ ################################## + +-set(_TBB_LIBRARYDIR_SEARCH_DIRS "") ++ # Define search paths based on user input and environment variables ++ set(TBB_SEARCH_DIR ${TBB_ROOT_DIR} $ENV{TBB_INSTALL_DIR} $ENV{TBBROOT}) + +-# Append to _TBB_LIBRARYDIR_SEARCH_DIRS in priority order ++ # Define the search directories based on the current platform ++ if(CMAKE_SYSTEM_NAME STREQUAL "Windows") ++ set(TBB_DEFAULT_SEARCH_DIR "C:/Program Files/Intel/TBB" ++ "C:/Program Files (x86)/Intel/TBB") + +-set(_TBB_LIBRARYDIR_SEARCH_DIRS "") +-list(APPEND _TBB_LIBRARYDIR_SEARCH_DIRS +- ${TBB_LIBRARYDIR} +- ${_TBB_ROOT_SEARCH_DIR} +- ${PC_Tbb_LIBRARY_DIRS} +- ${SYSTEM_LIBRARY_PATHS} +-) ++ # Set the target architecture ++ if(CMAKE_SIZEOF_VOID_P EQUAL 8) ++ set(TBB_ARCHITECTURE "intel64") ++ else() ++ set(TBB_ARCHITECTURE "ia32") ++ endif() + +-set(TBB_PATH_SUFFIXES +- lib64 +- lib +-) + # Set the TBB search library path search suffix based on the version of VC + if(WINDOWS_STORE) + set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc11_ui") @@ -1352,104 +1483,16 @@ index bdf9c81..c6bdec9 100644 + set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc10") + endif() --# ------------------------------------------------------------------------ --# Search for TBB lib DIR --# ------------------------------------------------------------------------ +-# platform branching + # Add the library path search suffix for the VC independent version of TBB + list(APPEND TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc_mt") -+ -+ elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") -+ # OS X -+ set(TBB_DEFAULT_SEARCH_DIR "/opt/intel/tbb") -+ -+ # TODO: Check to see which C++ library is being used by the compiler. -+ if(NOT ${CMAKE_SYSTEM_VERSION} VERSION_LESS 13.0) -+ # The default C++ library on OS X 10.9 and later is libc++ -+ set(TBB_LIB_PATH_SUFFIX "lib/libc++" "lib") -+ else() -+ set(TBB_LIB_PATH_SUFFIX "lib") -+ endif() -+ elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") -+ # Linux -+ set(TBB_DEFAULT_SEARCH_DIR "/opt/intel/tbb") -+ -+ # TODO: Check compiler version to see the suffix should be /gcc4.1 or -+ # /gcc4.1. For now, assume that the compiler is more recent than -+ # gcc 4.4.x or later. -+ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") -+ set(TBB_LIB_PATH_SUFFIX "lib/intel64/gcc4.4") -+ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$") -+ set(TBB_LIB_PATH_SUFFIX "lib/ia32/gcc4.4") -+ endif() -+ endif() -+ -+ ################################## -+ # Find the TBB include dir -+ ################################## -+ -+ find_path(TBB_INCLUDE_DIRS tbb/tbb.h -+ HINTS ${TBB_INCLUDE_DIR} ${TBB_SEARCH_DIR} -+ PATHS ${TBB_DEFAULT_SEARCH_DIR} -+ PATH_SUFFIXES include) -+ -+ ################################## -+ # Set version strings -+ ################################## -+ -+ if(TBB_INCLUDE_DIRS) -+ file(READ "${TBB_INCLUDE_DIRS}/tbb/tbb_stddef.h" _tbb_version_file) -+ string(REGEX REPLACE ".*#define TBB_VERSION_MAJOR ([0-9]+).*" "\\1" -+ TBB_VERSION_MAJOR "${_tbb_version_file}") -+ string(REGEX REPLACE ".*#define TBB_VERSION_MINOR ([0-9]+).*" "\\1" -+ TBB_VERSION_MINOR "${_tbb_version_file}") -+ string(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1" -+ TBB_INTERFACE_VERSION "${_tbb_version_file}") -+ set(TBB_VERSION "${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR}") -+ endif() - --set(_TBB_LIBRARYDIR_SEARCH_DIRS "") -+ ################################## -+ # Find TBB components -+ ################################## - --# Append to _TBB_LIBRARYDIR_SEARCH_DIRS in priority order -+ if(TBB_VERSION VERSION_LESS 4.3) -+ set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc tbb) -+ else() -+ set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc_proxy tbbmalloc tbb) -+ endif() - --set(_TBB_LIBRARYDIR_SEARCH_DIRS "") --list(APPEND _TBB_LIBRARYDIR_SEARCH_DIRS -- ${TBB_LIBRARYDIR} -- ${_TBB_ROOT_SEARCH_DIR} -- ${PC_Tbb_LIBRARY_DIRS} -- ${SYSTEM_LIBRARY_PATHS} --) -+ if(TBB_STATIC) -+ set(TBB_STATIC_SUFFIX "_static") -+ endif() - --set(TBB_PATH_SUFFIXES -- lib64 -- lib --) -+ # Find each component -+ foreach(_comp ${TBB_SEARCH_COMPOMPONENTS}) -+ if(";${TBB_FIND_COMPONENTS};tbb;" MATCHES ";${_comp};") - --# platform branching -+ unset(TBB_${_comp}_LIBRARY_DEBUG CACHE) -+ unset(TBB_${_comp}_LIBRARY_RELEASE CACHE) -if(UNIX) - list(INSERT TBB_PATH_SUFFIXES 0 lib/x86_64-linux-gnu) -endif() -+ # Search for the libraries -+ find_library(TBB_${_comp}_LIBRARY_RELEASE ${_comp}${TBB_STATIC_SUFFIX} -+ HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR} -+ PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH -+ PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX}) ++ elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") ++ # OS X ++ set(TBB_DEFAULT_SEARCH_DIR "/opt/intel/tbb") -if(APPLE) - if(TBB_FOR_CLANG) @@ -1471,29 +1514,33 @@ index bdf9c81..c6bdec9 100644 - list(GET GCC_VERSION_COMPONENTS 0 GCC_MAJOR) - list(GET GCC_VERSION_COMPONENTS 1 GCC_MINOR) - list(INSERT TBB_PATH_SUFFIXES 0 lib/intel64/gcc${GCC_MAJOR}.${GCC_MINOR}) -- else() ++ # TODO: Check to see which C++ library is being used by the compiler. ++ if(NOT ${CMAKE_SYSTEM_VERSION} VERSION_LESS 13.0) ++ # The default C++ library on OS X 10.9 and later is libc++ ++ set(TBB_LIB_PATH_SUFFIX "lib/libc++" "lib") + else() - list(INSERT TBB_PATH_SUFFIXES 0 lib/intel64/gcc4.4) -- endif() -- endif() ++ set(TBB_LIB_PATH_SUFFIX "lib") ++ endif() ++ elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") ++ # Linux ++ set(TBB_DEFAULT_SEARCH_DIR "/opt/intel/tbb") ++ ++ # TODO: Check compiler version to see the suffix should be /gcc4.1 or ++ # /gcc4.1. For now, assume that the compiler is more recent than ++ # gcc 4.4.x or later. ++ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") ++ set(TBB_LIB_PATH_SUFFIX "lib/intel64/gcc4.4") ++ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$") ++ set(TBB_LIB_PATH_SUFFIX "lib/ia32/gcc4.4") + endif() + endif() -endif() -+ find_library(TBB_${_comp}_LIBRARY_DEBUG ${_comp}${TBB_STATIC_SUFFIX}_debug -+ HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR} -+ PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH -+ PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX}) - +- -if(UNIX AND TBB_USE_STATIC_LIBS) - set(_TBB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) - set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") -endif() -+ if(TBB_${_comp}_LIBRARY_DEBUG) -+ list(APPEND TBB_LIBRARIES_DEBUG "${TBB_${_comp}_LIBRARY_DEBUG}") -+ endif() -+ if(TBB_${_comp}_LIBRARY_RELEASE) -+ list(APPEND TBB_LIBRARIES_RELEASE "${TBB_${_comp}_LIBRARY_RELEASE}") -+ endif() -+ if(TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE} AND NOT TBB_${_comp}_LIBRARY) -+ set(TBB_${_comp}_LIBRARY "${TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE}}") -+ endif() -set(Tbb_LIB_COMPONENTS "") - @@ -1516,39 +1563,44 @@ index bdf9c81..c6bdec9 100644 - # Extract the directory and apply the matched text (in brackets) - get_filename_component(Tbb_${COMPONENT}_DIR "${Tbb_${COMPONENT}_LIBRARY}" DIRECTORY) - set(Tbb_${COMPONENT}_LIBRARY "${Tbb_${COMPONENT}_DIR}/${CMAKE_MATCH_1}") -+ if(TBB_${_comp}_LIBRARY AND EXISTS "${TBB_${_comp}_LIBRARY}") -+ set(TBB_${_comp}_FOUND TRUE) -+ else() -+ set(TBB_${_comp}_FOUND FALSE) - endif() +- endif() +- endif() ++ ################################## ++ # Find the TBB include dir ++ ################################## + -+ # Mark internal variables as advanced -+ mark_as_advanced(TBB_${_comp}_LIBRARY_RELEASE) -+ mark_as_advanced(TBB_${_comp}_LIBRARY_DEBUG) -+ mark_as_advanced(TBB_${_comp}_LIBRARY) ++ find_path(TBB_INCLUDE_DIRS tbb/tbb.h ++ HINTS ${TBB_INCLUDE_DIR} ${TBB_SEARCH_DIR} ++ PATHS ${TBB_DEFAULT_SEARCH_DIR} ++ PATH_SUFFIXES include) + - endif() -- endif() -+ endforeach() ++ ################################## ++ # Set version strings ++ ################################## ++ ++ if(TBB_INCLUDE_DIRS) ++ file(READ "${TBB_INCLUDE_DIRS}/tbb/tbb_stddef.h" _tbb_version_file) ++ string(REGEX REPLACE ".*#define TBB_VERSION_MAJOR ([0-9]+).*" "\\1" ++ TBB_VERSION_MAJOR "${_tbb_version_file}") ++ string(REGEX REPLACE ".*#define TBB_VERSION_MINOR ([0-9]+).*" "\\1" ++ TBB_VERSION_MINOR "${_tbb_version_file}") ++ string(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1" ++ TBB_INTERFACE_VERSION "${_tbb_version_file}") ++ set(TBB_VERSION "${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR}") + endif() - list(APPEND Tbb_LIB_COMPONENTS ${Tbb_${COMPONENT}_LIBRARY}) + ################################## -+ # Set compile flags and libraries ++ # Find TBB components + ################################## - if(Tbb_${COMPONENT}_LIBRARY) - set(TBB_${COMPONENT}_FOUND TRUE) -- else() ++ if(TBB_VERSION VERSION_LESS 4.3) ++ set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc tbb) + else() - set(TBB_${COMPONENT}_FOUND FALSE) -+ set(TBB_DEFINITIONS_RELEASE "") -+ set(TBB_DEFINITIONS_DEBUG "TBB_USE_DEBUG=1") -+ -+ if(TBB_LIBRARIES_${TBB_BUILD_TYPE}) -+ set(TBB_LIBRARIES "${TBB_LIBRARIES_${TBB_BUILD_TYPE}}") -+ endif() -+ -+ if(NOT MSVC AND NOT TBB_LIBRARIES) -+ set(TBB_LIBRARIES ${TBB_LIBRARIES_RELEASE}) ++ set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc_proxy tbbmalloc tbb) endif() -endforeach() @@ -1556,61 +1608,51 @@ index bdf9c81..c6bdec9 100644 - set(CMAKE_FIND_LIBRARY_SUFFIXES ${_TBB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) - unset(_TBB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES) -endif() -+ set(TBB_DEFINITIONS "") -+ if (MSVC AND TBB_STATIC) -+ set(TBB_DEFINITIONS __TBB_NO_IMPLICIT_LINKAGE) -+ endif () -+ -+ unset (TBB_STATIC_SUFFIX) -+ -+ find_package_handle_standard_args(TBB -+ REQUIRED_VARS TBB_INCLUDE_DIRS TBB_LIBRARIES -+ FAIL_MESSAGE "TBB library cannot be found. Consider set TBBROOT environment variable." -+ HANDLE_COMPONENTS -+ VERSION_VAR TBB_VERSION) -+ -+ ################################## -+ # Create targets -+ ################################## -+ -+ if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND) -+ add_library(TBB::tbb UNKNOWN IMPORTED) -+ set_target_properties(TBB::tbb PROPERTIES -+ INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS}" -+ INTERFACE_LINK_LIBRARIES "Threads::Threads;${CMAKE_DL_LIBS}" -+ INTERFACE_INCLUDE_DIRECTORIES ${TBB_INCLUDE_DIRS} -+ IMPORTED_LOCATION ${TBB_LIBRARIES}) -+ if(TBB_LIBRARIES_RELEASE AND TBB_LIBRARIES_DEBUG) -+ set_target_properties(TBB::tbb PROPERTIES -+ INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS};$<$,$>:${TBB_DEFINITIONS_DEBUG}>;$<$:${TBB_DEFINITIONS_RELEASE}>" -+ IMPORTED_LOCATION_DEBUG ${TBB_LIBRARIES_DEBUG} -+ IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_LIBRARIES_RELEASE} -+ IMPORTED_LOCATION_RELEASE ${TBB_LIBRARIES_RELEASE} -+ IMPORTED_LOCATION_MINSIZEREL ${TBB_LIBRARIES_RELEASE} -+ ) -+ endif() ++ if(TBB_STATIC) ++ set(TBB_STATIC_SUFFIX "_static") + endif() -# ------------------------------------------------------------------------ -# Cache and set TBB_FOUND -# ------------------------------------------------------------------------ -+ mark_as_advanced(TBB_INCLUDE_DIRS TBB_LIBRARIES) ++ # Find each component ++ foreach(_comp ${TBB_SEARCH_COMPOMPONENTS}) ++ if(";${TBB_FIND_COMPONENTS};tbb;" MATCHES ";${_comp};") + -+ unset(TBB_ARCHITECTURE) -+ unset(TBB_BUILD_TYPE) -+ unset(TBB_LIB_PATH_SUFFIX) -+ unset(TBB_DEFAULT_SEARCH_DIR) ++ unset(TBB_${_comp}_LIBRARY_DEBUG CACHE) ++ unset(TBB_${_comp}_LIBRARY_RELEASE CACHE) + -+ if(TBB_DEBUG) -+ message(STATUS " TBB_FOUND = ${TBB_FOUND}") -+ message(STATUS " TBB_INCLUDE_DIRS = ${TBB_INCLUDE_DIRS}") -+ message(STATUS " TBB_DEFINITIONS = ${TBB_DEFINITIONS}") -+ message(STATUS " TBB_LIBRARIES = ${TBB_LIBRARIES}") -+ message(STATUS " TBB_DEFINITIONS_DEBUG = ${TBB_DEFINITIONS_DEBUG}") -+ message(STATUS " TBB_LIBRARIES_DEBUG = ${TBB_LIBRARIES_DEBUG}") -+ message(STATUS " TBB_DEFINITIONS_RELEASE = ${TBB_DEFINITIONS_RELEASE}") -+ message(STATUS " TBB_LIBRARIES_RELEASE = ${TBB_LIBRARIES_RELEASE}") -+ endif() ++ # Search for the libraries ++ find_library(TBB_${_comp}_LIBRARY_RELEASE ${_comp}${TBB_STATIC_SUFFIX} ++ HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR} ++ PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH ++ PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX}) ++ ++ find_library(TBB_${_comp}_LIBRARY_DEBUG ${_comp}${TBB_STATIC_SUFFIX}_debug ++ HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR} ++ PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH ++ PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX}) ++ ++ if(TBB_${_comp}_LIBRARY_DEBUG) ++ list(APPEND TBB_LIBRARIES_DEBUG "${TBB_${_comp}_LIBRARY_DEBUG}") ++ endif() ++ if(TBB_${_comp}_LIBRARY_RELEASE) ++ list(APPEND TBB_LIBRARIES_RELEASE "${TBB_${_comp}_LIBRARY_RELEASE}") ++ endif() ++ if(TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE} AND NOT TBB_${_comp}_LIBRARY) ++ set(TBB_${_comp}_LIBRARY "${TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE}}") ++ endif() ++ ++ if(TBB_${_comp}_LIBRARY AND EXISTS "${TBB_${_comp}_LIBRARY}") ++ set(TBB_${_comp}_FOUND TRUE) ++ else() ++ set(TBB_${_comp}_FOUND FALSE) ++ endif() ++ ++ # Mark internal variables as advanced ++ mark_as_advanced(TBB_${_comp}_LIBRARY_RELEASE) ++ mark_as_advanced(TBB_${_comp}_LIBRARY_DEBUG) ++ mark_as_advanced(TBB_${_comp}_LIBRARY) -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(TBB @@ -1646,13 +1688,82 @@ index bdf9c81..c6bdec9 100644 - INTERFACE_COMPILE_OPTIONS "${Tbb_DEFINITIONS}" - INTERFACE_INCLUDE_DIRECTORIES "${Tbb_INCLUDE_DIR}" - ) -- endif() -- endforeach() + endif() + endforeach() -elseif(TBB_FIND_REQUIRED) - message(FATAL_ERROR "Unable to find TBB") ++ ++ ################################## ++ # Set compile flags and libraries ++ ################################## ++ ++ set(TBB_DEFINITIONS_RELEASE "") ++ set(TBB_DEFINITIONS_DEBUG "TBB_USE_DEBUG=1") ++ ++ if(TBB_LIBRARIES_${TBB_BUILD_TYPE}) ++ set(TBB_LIBRARIES "${TBB_LIBRARIES_${TBB_BUILD_TYPE}}") ++ endif() ++ ++ if(NOT MSVC AND NOT TBB_LIBRARIES) ++ set(TBB_LIBRARIES ${TBB_LIBRARIES_RELEASE}) ++ endif() ++ ++ set(TBB_DEFINITIONS "") ++ if (MSVC AND TBB_STATIC) ++ set(TBB_DEFINITIONS __TBB_NO_IMPLICIT_LINKAGE) ++ endif () ++ ++ unset (TBB_STATIC_SUFFIX) ++ ++ find_package_handle_standard_args(TBB ++ REQUIRED_VARS TBB_INCLUDE_DIRS TBB_LIBRARIES ++ FAIL_MESSAGE "TBB library cannot be found. Consider set TBBROOT environment variable." ++ HANDLE_COMPONENTS ++ VERSION_VAR TBB_VERSION) ++ ++ ################################## ++ # Create targets ++ ################################## ++ ++ if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND) ++ add_library(TBB::tbb UNKNOWN IMPORTED) ++ set_target_properties(TBB::tbb PROPERTIES ++ INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS}" ++ INTERFACE_LINK_LIBRARIES "Threads::Threads;${CMAKE_DL_LIBS}" ++ INTERFACE_INCLUDE_DIRECTORIES ${TBB_INCLUDE_DIRS} ++ IMPORTED_LOCATION ${TBB_LIBRARIES}) ++ if(TBB_LIBRARIES_RELEASE AND TBB_LIBRARIES_DEBUG) ++ set_target_properties(TBB::tbb PROPERTIES ++ INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS};$<$,$>:${TBB_DEFINITIONS_DEBUG}>;$<$:${TBB_DEFINITIONS_RELEASE}>" ++ IMPORTED_LOCATION_DEBUG ${TBB_LIBRARIES_DEBUG} ++ IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_LIBRARIES_RELEASE} ++ IMPORTED_LOCATION_RELEASE ${TBB_LIBRARIES_RELEASE} ++ IMPORTED_LOCATION_MINSIZEREL ${TBB_LIBRARIES_RELEASE} ++ ) ++ endif() ++ endif() ++ ++ mark_as_advanced(TBB_INCLUDE_DIRS TBB_LIBRARIES) ++ ++ unset(TBB_ARCHITECTURE) ++ unset(TBB_BUILD_TYPE) ++ unset(TBB_LIB_PATH_SUFFIX) ++ unset(TBB_DEFAULT_SEARCH_DIR) ++ ++ if(TBB_DEBUG) ++ message(STATUS " TBB_FOUND = ${TBB_FOUND}") ++ message(STATUS " TBB_INCLUDE_DIRS = ${TBB_INCLUDE_DIRS}") ++ message(STATUS " TBB_DEFINITIONS = ${TBB_DEFINITIONS}") ++ message(STATUS " TBB_LIBRARIES = ${TBB_LIBRARIES}") ++ message(STATUS " TBB_DEFINITIONS_DEBUG = ${TBB_DEFINITIONS_DEBUG}") ++ message(STATUS " TBB_LIBRARIES_DEBUG = ${TBB_LIBRARIES_DEBUG}") ++ message(STATUS " TBB_DEFINITIONS_RELEASE = ${TBB_DEFINITIONS_RELEASE}") ++ message(STATUS " TBB_LIBRARIES_RELEASE = ${TBB_LIBRARIES_RELEASE}") ++ endif() ++ endif() diff --git a/openvdb/CMakeLists.txt b/openvdb/CMakeLists.txt -index 89301bd..df27aae 100644 +index 89301bd..6a3c90c 100644 --- a/openvdb/CMakeLists.txt +++ b/openvdb/CMakeLists.txt @@ -78,7 +78,7 @@ else() @@ -1664,7 +1775,21 @@ index 89301bd..df27aae 100644 message(DEPRECATION "Support for TBB versions < ${FUTURE_MINIMUM_TBB_VERSION} " "is deprecated and will be removed.") endif() -@@ -185,11 +185,6 @@ if(WIN32) +@@ -129,10 +129,13 @@ endif() + # include paths from shared installs (including houdini) may pull in the wrong + # headers + ++include (CheckAtomic) ++ + set(OPENVDB_CORE_DEPENDENT_LIBS + Boost::iostreams + Boost::system + IlmBase::Half ++ ${CMAKE_REQUIRED_LIBRARIES} + ) + + if(USE_EXR) +@@ -185,11 +188,6 @@ if(WIN32) endif() endif() @@ -1676,7 +1801,7 @@ index 89301bd..df27aae 100644 ##### Core library configuration set(OPENVDB_LIBRARY_SOURCE_FILES -@@ -374,10 +369,16 @@ set(OPENVDB_LIBRARY_UTIL_INCLUDE_FILES +@@ -374,10 +372,16 @@ set(OPENVDB_LIBRARY_UTIL_INCLUDE_FILES if(OPENVDB_CORE_SHARED) add_library(openvdb_shared SHARED ${OPENVDB_LIBRARY_SOURCE_FILES}) @@ -1779,5 +1904,5 @@ index df51830..0ab0c12 100644 /// @todo This changes the compressor setting globally. if (blosc_set_compressor(compname) < 0) continue; -- -2.16.2.windows.1 +2.17.1 diff --git a/deps/wxWidgets/wxWidgets.cmake b/deps/wxWidgets/wxWidgets.cmake new file mode 100644 index 0000000000..ee8a22c4f3 --- /dev/null +++ b/deps/wxWidgets/wxWidgets.cmake @@ -0,0 +1,37 @@ +set(_wx_git_tag v3.1.3-patched) + +# 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 9206ae1ed2..a8f2441be5 100644 --- a/doc/How to build - Linux et al.md +++ b/doc/How to build - Linux et al.md @@ -56,6 +56,10 @@ This is done by passing this option to CMake: Note that PrusaSlicer is tested with wxWidgets 3.0 somewhat sporadically and so there may be bugs in bleeding edge releases. +When building on ubuntu 20.04 focal fossa, the package libwxgtk3.0-gtk3-dev needs to be installed instead of libwxgtk3.0-dev and you should use: + + -DSLIC3R_WX_STABLE=1 -DSLIC3R_GTK=3 + ### Build variant By default PrusaSlicer builds the release variant. diff --git a/doc/How to build - Mac OS.md b/doc/How to build - Mac OS.md index 082c560b7a..bab40ea265 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 b8829047bf..cd5227dafc 100644 --- a/doc/How to build - Windows.md +++ b/doc/How to build - Windows.md @@ -120,3 +120,49 @@ Refer to the CMake scripts inside the `deps` directory to see which dependencies \*) Specifically, the problem arises when building boost. Boost build tool appends all build options into paths of intermediate files, which are not handled correctly by either `b2.exe` or possibly `ninja` (?). + + +# Noob guide (step by step) + +Install Visual Studio Community 2019 from +[visualstudio.microsoft.com/vs/](https://visualstudio.microsoft.com/vs/) +Select all workload options for C++ + +Install git for Windows from +[gitforwindows.org](https://gitforwindows.org/) +download and run the exe accepting all defaults + +download PrusaSlicer-master.zip from github +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. + +Go to the Windows Start Menu and Click on "Visual Studio 2019" folder, then select the ->"x64 Native Tools Command Prompt" to open a command window + +cd c:\PrusaSlicer\PrusaSlicer-master\deps + +mkdir build + +cd build + +cmake .. -G "Visual Studio 16 2019" -DDESTDIR="c:\PrusaSlicer\PrusaSlicer-master" + +msbuild /m ALL_BUILD.vcxproj // This took 13.5 minutes on 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 diff --git a/resources/data/flatpak/com.prusa3d.PrusaSlicer.desktop b/resources/data/flatpak/com.prusa3d.PrusaSlicer.desktop new file mode 100755 index 0000000000..8987222984 --- /dev/null +++ b/resources/data/flatpak/com.prusa3d.PrusaSlicer.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=PrusaSlicer +GenericName=3D Printing Software +Icon=com.prusa3d.PrusaSlicer +Exec=prusa-slicer %F +Terminal=false +Type=Application +MimeType=model/stl;model/x-wavefront-obj;model/3mf;model/x-geomview-off;application/x-amf; +Categories=Graphics;3DGraphics;Engineering; +Keywords=3D;Printing;Slicer;slice;3D;printer;convert;gcode;stl;obj;amf;SLA +StartupNotify=false +StartupWMClass=prusa-slicer \ No newline at end of file diff --git a/resources/data/flatpak/com.prusa3d.PrusaSlicer.metainfo.xml b/resources/data/flatpak/com.prusa3d.PrusaSlicer.metainfo.xml new file mode 100755 index 0000000000..b62a57e480 --- /dev/null +++ b/resources/data/flatpak/com.prusa3d.PrusaSlicer.metainfo.xml @@ -0,0 +1,62 @@ + + + com.prusa3d.PrusaSlicer + com.prusa3d.PrusaSlicer.desktop + + prusa-slicer.desktop + + PrusaSlicer + Powerful 3D printing slicer optimized for Prusa printers + 0BSD + AGPL-3.0-only + +

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

+

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

+

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

+
    +
  • multi-platform (Linux/Mac/Win) and packaged as standalone-app with no dependencies required
  • +
  • complete command-line interface to use it with no GUI
  • +
  • multi-material (multiple extruders) object printing
  • +
  • multiple G-code flavors supported (RepRap, Makerbot, Mach3, Machinekit etc.)
  • +
  • ability to plate multiple objects having distinct print settings
  • +
  • multithread processing
  • +
  • STL auto-repair (tolerance for broken models)
  • +
  • wide automated unit testing
  • +
+
+ https://www.prusa3d.com/prusaslicer/ + https://help.prusa3d.com + https://github.com/prusa3d/PrusaSlicer/issues + + + https://user-images.githubusercontent.com/590307/78981854-24d07580-7b21-11ea-9441-77923534a659.png + + + https://user-images.githubusercontent.com/590307/78981860-2863fc80-7b21-11ea-8c2d-8ff79ced2578.png + + + https://user-images.githubusercontent.com/590307/78981862-28fc9300-7b21-11ea-9b0d-d03e16b709d3.png + + + + + + +

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

+
+
+
+
diff --git a/resources/icons/Pmetal_001.png b/resources/icons/Pmetal_001.png new file mode 100644 index 0000000000..c848f839c5 Binary files /dev/null and b/resources/icons/Pmetal_001.png differ diff --git a/resources/icons/PrusaSlicer-gcodeviewer.ico b/resources/icons/PrusaSlicer-gcodeviewer.ico new file mode 100644 index 0000000000..1cd867e29b Binary files /dev/null and b/resources/icons/PrusaSlicer-gcodeviewer.ico differ diff --git a/resources/icons/PrusaSlicer-gcodeviewer_128px.png b/resources/icons/PrusaSlicer-gcodeviewer_128px.png new file mode 100644 index 0000000000..475ddb68ed Binary files /dev/null and b/resources/icons/PrusaSlicer-gcodeviewer_128px.png differ diff --git a/resources/icons/PrusaSlicer-gcodeviewer_192px.png b/resources/icons/PrusaSlicer-gcodeviewer_192px.png new file mode 100644 index 0000000000..2f3b03683e Binary files /dev/null and b/resources/icons/PrusaSlicer-gcodeviewer_192px.png differ diff --git a/resources/icons/PrusaSlicer-gcodeviewer_32px.png b/resources/icons/PrusaSlicer-gcodeviewer_32px.png new file mode 100644 index 0000000000..eaba5e21d7 Binary files /dev/null and b/resources/icons/PrusaSlicer-gcodeviewer_32px.png differ diff --git a/resources/icons/add.svg b/resources/icons/add.svg index 8a9b253de7..37050d7481 100644 --- a/resources/icons/add.svg +++ b/resources/icons/add.svg @@ -1,17 +1,22 @@ - + - - + + + + + + + diff --git a/resources/icons/add_gcode.svg b/resources/icons/add_gcode.svg new file mode 100644 index 0000000000..e2aa21adfb --- /dev/null +++ b/resources/icons/add_gcode.svg @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/resources/icons/arrange.svg b/resources/icons/arrange.svg index 4f30e979e3..62cf939e9f 100644 --- a/resources/icons/arrange.svg +++ b/resources/icons/arrange.svg @@ -1,24 +1,23 @@ - + - - + - + - + - + - + diff --git a/resources/icons/attention.svg b/resources/icons/attention.svg new file mode 100644 index 0000000000..934bd3b41c --- /dev/null +++ b/resources/icons/attention.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/resources/icons/cancel.svg b/resources/icons/cancel.svg new file mode 100644 index 0000000000..da44606a08 --- /dev/null +++ b/resources/icons/cancel.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/resources/icons/change_extruder.svg b/resources/icons/change_extruder.svg new file mode 100644 index 0000000000..61cd4cfd83 --- /dev/null +++ b/resources/icons/change_extruder.svg @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/resources/icons/cog_.svg b/resources/icons/cog_.svg new file mode 100644 index 0000000000..94cab0a8eb --- /dev/null +++ b/resources/icons/cog_.svg @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/resources/icons/collapse.svg b/resources/icons/collapse.svg new file mode 100644 index 0000000000..c0d6f43d5f --- /dev/null +++ b/resources/icons/collapse.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/colorchange_add.svg b/resources/icons/colorchange_add.svg new file mode 100644 index 0000000000..b72fddb0e6 --- /dev/null +++ b/resources/icons/colorchange_add.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/colorchange_add_f.svg b/resources/icons/colorchange_add_f.svg new file mode 100644 index 0000000000..a96a624433 --- /dev/null +++ b/resources/icons/colorchange_add_f.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/colorchange_add_m.svg b/resources/icons/colorchange_add_m.svg new file mode 100644 index 0000000000..82cd1e5f40 --- /dev/null +++ b/resources/icons/colorchange_add_m.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + diff --git a/resources/icons/colorchange_del.svg b/resources/icons/colorchange_del.svg new file mode 100644 index 0000000000..0bd9e06679 --- /dev/null +++ b/resources/icons/colorchange_del.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/colorchange_del_f.svg b/resources/icons/colorchange_del_f.svg new file mode 100644 index 0000000000..a54452e1fb --- /dev/null +++ b/resources/icons/colorchange_del_f.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/copy.svg b/resources/icons/copy.svg index 9b8430dd79..345c2590be 100644 --- a/resources/icons/copy.svg +++ b/resources/icons/copy.svg @@ -1,37 +1,29 @@ - + - - - - - + + - - - - - + + diff --git a/resources/icons/cross_focus_large.svg b/resources/icons/cross_focus_large.svg new file mode 100644 index 0000000000..c246f2bd9e --- /dev/null +++ b/resources/icons/cross_focus_large.svg @@ -0,0 +1,81 @@ + +image/svg+xml + + + + + + + + + + + diff --git a/resources/icons/delete_all.svg b/resources/icons/delete_all.svg index 80e2e503cb..dfa9438129 100644 --- a/resources/icons/delete_all.svg +++ b/resources/icons/delete_all.svg @@ -1,31 +1,17 @@ - + - - + - + - - - - - - - - - - + diff --git a/resources/icons/dot_small.svg b/resources/icons/dot_small.svg new file mode 100644 index 0000000000..474142a57f --- /dev/null +++ b/resources/icons/dot_small.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/resources/icons/edit_gcode.svg b/resources/icons/edit_gcode.svg new file mode 100644 index 0000000000..694e106cc2 --- /dev/null +++ b/resources/icons/edit_gcode.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/resources/icons/edit_gcode_f.svg b/resources/icons/edit_gcode_f.svg new file mode 100644 index 0000000000..980060d9bb --- /dev/null +++ b/resources/icons/edit_gcode_f.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/resources/icons/edit_uni.svg b/resources/icons/edit_uni.svg new file mode 100644 index 0000000000..f7b1673a63 --- /dev/null +++ b/resources/icons/edit_uni.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/resources/icons/eject_sd.svg b/resources/icons/eject_sd.svg new file mode 100644 index 0000000000..0efe87badf --- /dev/null +++ b/resources/icons/eject_sd.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/resources/icons/empty.svg b/resources/icons/empty.svg new file mode 100644 index 0000000000..b8ba0a6513 --- /dev/null +++ b/resources/icons/empty.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/resources/icons/error_tick.svg b/resources/icons/error_tick.svg new file mode 100644 index 0000000000..6467d29fb0 --- /dev/null +++ b/resources/icons/error_tick.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/resources/icons/error_tick_f.svg b/resources/icons/error_tick_f.svg new file mode 100644 index 0000000000..adf876e3c6 --- /dev/null +++ b/resources/icons/error_tick_f.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/resources/icons/exit.svg b/resources/icons/exit.svg new file mode 100644 index 0000000000..30091b381e --- /dev/null +++ b/resources/icons/exit.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/resources/icons/export_to_sd.svg b/resources/icons/export_to_sd.svg new file mode 100644 index 0000000000..bd28c6a0a9 --- /dev/null +++ b/resources/icons/export_to_sd.svg @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/resources/icons/fdm_supports.svg b/resources/icons/fdm_supports.svg new file mode 100644 index 0000000000..a64314f807 --- /dev/null +++ b/resources/icons/fdm_supports.svg @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/resources/icons/hollow.svg b/resources/icons/hollow.svg new file mode 100644 index 0000000000..13e96ada96 --- /dev/null +++ b/resources/icons/hollow.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/hollowing.svg b/resources/icons/hollowing.svg new file mode 100644 index 0000000000..bfd40adb73 --- /dev/null +++ b/resources/icons/hollowing.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/instance_add.svg b/resources/icons/instance_add.svg index 5ef492cfae..a466c51dbf 100644 --- a/resources/icons/instance_add.svg +++ b/resources/icons/instance_add.svg @@ -1,50 +1,46 @@ - + - + - + - + + + + diff --git a/resources/icons/instance_remove.svg b/resources/icons/instance_remove.svg index 466752ea89..7f9b4f7e1c 100644 --- a/resources/icons/instance_remove.svg +++ b/resources/icons/instance_remove.svg @@ -1,49 +1,42 @@ - + - + - + - + diff --git a/resources/icons/ironing.svg b/resources/icons/ironing.svg new file mode 100644 index 0000000000..94917d6bfe --- /dev/null +++ b/resources/icons/ironing.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/lock_open_sys.svg b/resources/icons/lock_open_sys.svg new file mode 100644 index 0000000000..e0aef4ad2a --- /dev/null +++ b/resources/icons/lock_open_sys.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/resources/icons/mode_advanced.svg b/resources/icons/mode_advanced.svg new file mode 100644 index 0000000000..79f68f5b9d --- /dev/null +++ b/resources/icons/mode_advanced.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/resources/icons/mode_expert.svg b/resources/icons/mode_expert.svg new file mode 100644 index 0000000000..aaa6d0e4da --- /dev/null +++ b/resources/icons/mode_expert.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/resources/icons/mode_simple.svg b/resources/icons/mode_simple.svg new file mode 100644 index 0000000000..b94b7112cd --- /dev/null +++ b/resources/icons/mode_simple.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/resources/icons/notification_close.svg b/resources/icons/notification_close.svg new file mode 100644 index 0000000000..708d8bfef1 --- /dev/null +++ b/resources/icons/notification_close.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + diff --git a/resources/icons/notification_close_hover.svg b/resources/icons/notification_close_hover.svg new file mode 100644 index 0000000000..a04dce21ad --- /dev/null +++ b/resources/icons/notification_close_hover.svg @@ -0,0 +1,66 @@ + +image/svg+xml + + + + + + + + + + diff --git a/resources/icons/notification_eject_sd.svg b/resources/icons/notification_eject_sd.svg new file mode 100644 index 0000000000..bea6c09772 --- /dev/null +++ b/resources/icons/notification_eject_sd.svg @@ -0,0 +1,75 @@ + +image/svg+xml + + + + + + + diff --git a/resources/icons/notification_eject_sd_hover.svg b/resources/icons/notification_eject_sd_hover.svg new file mode 100644 index 0000000000..23d2480c62 --- /dev/null +++ b/resources/icons/notification_eject_sd_hover.svg @@ -0,0 +1,76 @@ + +image/svg+xml + + + + + + + diff --git a/resources/icons/notification_error.svg b/resources/icons/notification_error.svg new file mode 100644 index 0000000000..5356e7af6e --- /dev/null +++ b/resources/icons/notification_error.svg @@ -0,0 +1,71 @@ + +image/svg+xml + + + + + + + + + + diff --git a/resources/icons/notification_minimalize.svg b/resources/icons/notification_minimalize.svg new file mode 100644 index 0000000000..bb3ae9b7a1 --- /dev/null +++ b/resources/icons/notification_minimalize.svg @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/resources/icons/notification_minimalize_hover.svg b/resources/icons/notification_minimalize_hover.svg new file mode 100644 index 0000000000..bc5bc6cca1 --- /dev/null +++ b/resources/icons/notification_minimalize_hover.svg @@ -0,0 +1,58 @@ + +image/svg+xml + + + + + + + diff --git a/resources/icons/notification_warning.svg b/resources/icons/notification_warning.svg new file mode 100644 index 0000000000..6ba7a046d8 --- /dev/null +++ b/resources/icons/notification_warning.svg @@ -0,0 +1,70 @@ + +image/svg+xml + + + + + + + + + + diff --git a/resources/icons/paste.svg b/resources/icons/paste.svg index 028ffb8ea0..bcfe567de3 100644 --- a/resources/icons/paste.svg +++ b/resources/icons/paste.svg @@ -1,27 +1,22 @@ - + - + - - - - - + + diff --git a/resources/icons/pause_add.png b/resources/icons/pause_add.png new file mode 100644 index 0000000000..afe881de8b Binary files /dev/null and b/resources/icons/pause_add.png differ diff --git a/resources/icons/pause_print.svg b/resources/icons/pause_print.svg new file mode 100644 index 0000000000..a905b1ea12 --- /dev/null +++ b/resources/icons/pause_print.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/pause_print_f.svg b/resources/icons/pause_print_f.svg new file mode 100644 index 0000000000..ee1c734708 --- /dev/null +++ b/resources/icons/pause_print_f.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/printer_placeholder.png b/resources/icons/printer_placeholder.png new file mode 100644 index 0000000000..8274019d83 Binary files /dev/null and b/resources/icons/printer_placeholder.png differ diff --git a/resources/icons/printers/Creality_Ender3.png b/resources/icons/printers/Creality_Ender3.png deleted file mode 100644 index 52861197c7..0000000000 Binary files a/resources/icons/printers/Creality_Ender3.png and /dev/null differ diff --git a/resources/icons/prusa_slicer_logo.svg b/resources/icons/prusa_slicer_logo.svg new file mode 100644 index 0000000000..927c3e70ba --- /dev/null +++ b/resources/icons/prusa_slicer_logo.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/resources/icons/redo_toolbar.svg b/resources/icons/redo_toolbar.svg index d005f83736..d2aca2cc7d 100644 --- a/resources/icons/redo_toolbar.svg +++ b/resources/icons/redo_toolbar.svg @@ -1,13 +1,17 @@ - + - + viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve"> + + + + + + + + diff --git a/resources/icons/remove.svg b/resources/icons/remove.svg index acd21256cd..1bb830d91c 100644 --- a/resources/icons/remove.svg +++ b/resources/icons/remove.svg @@ -1,44 +1,60 @@ - + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/revert_all_.svg b/resources/icons/revert_all_.svg new file mode 100644 index 0000000000..fe8de635db --- /dev/null +++ b/resources/icons/revert_all_.svg @@ -0,0 +1,9 @@ + + + + + Svg Vector Icons : http://www.onlinewebfonts.com/icon + + + + \ No newline at end of file diff --git a/resources/icons/seam.svg b/resources/icons/seam.svg new file mode 100644 index 0000000000..a7e7980cc0 --- /dev/null +++ b/resources/icons/seam.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/search.svg b/resources/icons/search.svg new file mode 100644 index 0000000000..6421c7e055 --- /dev/null +++ b/resources/icons/search.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/resources/icons/search_.svg b/resources/icons/search_.svg new file mode 100644 index 0000000000..2985ceb561 --- /dev/null +++ b/resources/icons/search_.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/search_blink.svg b/resources/icons/search_blink.svg new file mode 100644 index 0000000000..d005f83736 --- /dev/null +++ b/resources/icons/search_blink.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/resources/icons/search_gray.svg b/resources/icons/search_gray.svg new file mode 100644 index 0000000000..043c2e3b2e --- /dev/null +++ b/resources/icons/search_gray.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/resources/icons/settings.svg b/resources/icons/settings.svg new file mode 100644 index 0000000000..db5bf458d7 --- /dev/null +++ b/resources/icons/settings.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/sla_printer.svg b/resources/icons/sla_printer.svg new file mode 100644 index 0000000000..ab63083e30 --- /dev/null +++ b/resources/icons/sla_printer.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/resources/icons/splashscreen-gcodepreview.jpg b/resources/icons/splashscreen-gcodepreview.jpg new file mode 100644 index 0000000000..3bae384935 Binary files /dev/null and b/resources/icons/splashscreen-gcodepreview.jpg differ diff --git a/resources/icons/splashscreen.jpg b/resources/icons/splashscreen.jpg new file mode 100644 index 0000000000..754e245880 Binary files /dev/null and b/resources/icons/splashscreen.jpg differ diff --git a/resources/icons/split_objects.svg b/resources/icons/split_objects.svg index a7ccc5df86..e822fd35aa 100644 --- a/resources/icons/split_objects.svg +++ b/resources/icons/split_objects.svg @@ -1,19 +1,20 @@ - + - + - + - - + + + + diff --git a/resources/icons/split_parts.svg b/resources/icons/split_parts.svg index 82a2927706..5cfef0f330 100644 --- a/resources/icons/split_parts.svg +++ b/resources/icons/split_parts.svg @@ -1,18 +1,20 @@ - + - + - + - - + + + + diff --git a/resources/icons/switch_presets.svg b/resources/icons/switch_presets.svg new file mode 100644 index 0000000000..a5f3fbefbb --- /dev/null +++ b/resources/icons/switch_presets.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/thumb_down.svg b/resources/icons/thumb_down.svg new file mode 100644 index 0000000000..f789b73174 --- /dev/null +++ b/resources/icons/thumb_down.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/resources/icons/thumb_left.svg b/resources/icons/thumb_left.svg new file mode 100644 index 0000000000..ef78bd1410 --- /dev/null +++ b/resources/icons/thumb_left.svg @@ -0,0 +1,54 @@ + +image/svg+xml + + + + + + diff --git a/resources/icons/thumb_right.svg b/resources/icons/thumb_right.svg new file mode 100644 index 0000000000..f3748525d2 --- /dev/null +++ b/resources/icons/thumb_right.svg @@ -0,0 +1,54 @@ + +image/svg+xml + + + + + + diff --git a/resources/icons/thumb_up.svg b/resources/icons/thumb_up.svg new file mode 100644 index 0000000000..1a0c6f1b7f --- /dev/null +++ b/resources/icons/thumb_up.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/resources/icons/tick_mark.svg b/resources/icons/tick_mark.svg new file mode 100644 index 0000000000..4ccab2192d --- /dev/null +++ b/resources/icons/tick_mark.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/icons/timer_dot.svg b/resources/icons/timer_dot.svg new file mode 100644 index 0000000000..3a77962b60 --- /dev/null +++ b/resources/icons/timer_dot.svg @@ -0,0 +1,72 @@ + +image/svg+xml + + + + diff --git a/resources/icons/timer_dot_empty.svg b/resources/icons/timer_dot_empty.svg new file mode 100644 index 0000000000..a8e776b49e --- /dev/null +++ b/resources/icons/timer_dot_empty.svg @@ -0,0 +1,73 @@ + + + +image/svg+xml + + + + \ No newline at end of file diff --git a/resources/icons/undo_toolbar.svg b/resources/icons/undo_toolbar.svg index 15778a7baf..2fc25bf737 100644 --- a/resources/icons/undo_toolbar.svg +++ b/resources/icons/undo_toolbar.svg @@ -1,13 +1,17 @@ - + - + viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve"> + + + + + + + + diff --git a/resources/icons/white/dot.svg b/resources/icons/white/dot.svg new file mode 100644 index 0000000000..90fbaf7fb1 --- /dev/null +++ b/resources/icons/white/dot.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/resources/icons/white/dot_small.svg b/resources/icons/white/dot_small.svg new file mode 100644 index 0000000000..74df442086 --- /dev/null +++ b/resources/icons/white/dot_small.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/resources/icons/white/drop_to_bed.svg b/resources/icons/white/drop_to_bed.svg new file mode 100644 index 0000000000..76243f8976 --- /dev/null +++ b/resources/icons/white/drop_to_bed.svg @@ -0,0 +1,15 @@ + + + + + + + + + + diff --git a/resources/icons/white/edit_layers_all.svg b/resources/icons/white/edit_layers_all.svg new file mode 100644 index 0000000000..efb7d609f1 --- /dev/null +++ b/resources/icons/white/edit_layers_all.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + diff --git a/resources/icons/white/edit_layers_some.svg b/resources/icons/white/edit_layers_some.svg new file mode 100644 index 0000000000..585a8df2f1 --- /dev/null +++ b/resources/icons/white/edit_layers_some.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/resources/icons/white/edit_uni.svg b/resources/icons/white/edit_uni.svg new file mode 100644 index 0000000000..661924763c --- /dev/null +++ b/resources/icons/white/edit_uni.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/resources/icons/white/exit.svg b/resources/icons/white/exit.svg new file mode 100644 index 0000000000..e5aebcfc22 --- /dev/null +++ b/resources/icons/white/exit.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/resources/icons/white/export_to_sd.svg b/resources/icons/white/export_to_sd.svg new file mode 100644 index 0000000000..ebeacb9054 --- /dev/null +++ b/resources/icons/white/export_to_sd.svg @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/resources/icons/white/eye_closed.svg b/resources/icons/white/eye_closed.svg new file mode 100644 index 0000000000..0cdd16ae00 --- /dev/null +++ b/resources/icons/white/eye_closed.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/resources/icons/white/eye_open.svg b/resources/icons/white/eye_open.svg new file mode 100644 index 0000000000..1b320da079 --- /dev/null +++ b/resources/icons/white/eye_open.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/resources/icons/white/funnel.svg b/resources/icons/white/funnel.svg new file mode 100644 index 0000000000..b8a3408a78 --- /dev/null +++ b/resources/icons/white/funnel.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/resources/icons/white/hollowing.svg b/resources/icons/white/hollowing.svg new file mode 100644 index 0000000000..77f50b6b83 --- /dev/null +++ b/resources/icons/white/hollowing.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/white/lock_closed_f.svg b/resources/icons/white/lock_closed_f.svg new file mode 100644 index 0000000000..412c93c164 --- /dev/null +++ b/resources/icons/white/lock_closed_f.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/resources/icons/white/lock_open_sys.svg b/resources/icons/white/lock_open_sys.svg new file mode 100644 index 0000000000..c1aa64aec2 --- /dev/null +++ b/resources/icons/white/lock_open_sys.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/resources/icons/white/mirroring_off.svg b/resources/icons/white/mirroring_off.svg new file mode 100644 index 0000000000..2011d8f1b8 --- /dev/null +++ b/resources/icons/white/mirroring_off.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/white/mirroring_on.svg b/resources/icons/white/mirroring_on.svg new file mode 100644 index 0000000000..1773b78add --- /dev/null +++ b/resources/icons/white/mirroring_on.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/white/note.svg b/resources/icons/white/note.svg new file mode 100644 index 0000000000..07c2a14cf9 --- /dev/null +++ b/resources/icons/white/note.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icons/white/redo_menu.svg b/resources/icons/white/redo_menu.svg new file mode 100644 index 0000000000..749f49a421 --- /dev/null +++ b/resources/icons/white/redo_menu.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/resources/icons/white/search.svg b/resources/icons/white/search.svg new file mode 100644 index 0000000000..679bb30f71 --- /dev/null +++ b/resources/icons/white/search.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/resources/icons/white/sla_printer.svg b/resources/icons/white/sla_printer.svg new file mode 100644 index 0000000000..3d47e7da62 --- /dev/null +++ b/resources/icons/white/sla_printer.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/resources/icons/white/switch_presets.svg b/resources/icons/white/switch_presets.svg new file mode 100644 index 0000000000..efcc3670cc --- /dev/null +++ b/resources/icons/white/switch_presets.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + diff --git a/resources/icons/white/undo_menu.svg b/resources/icons/white/undo_menu.svg new file mode 100644 index 0000000000..4e2b69a601 --- /dev/null +++ b/resources/icons/white/undo_menu.svg @@ -0,0 +1,13 @@ + + + + + diff --git a/resources/localization/PrusaSlicer.pot b/resources/localization/PrusaSlicer.pot index 9a01d213de..6b4ec495e4 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: 2019-09-09 16:39+0200\n" +"POT-Creation-Date: 2020-11-18 12:28+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,77 +18,54 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291 +#: src/slic3r/GUI/AboutDialog.cpp:42 src/slic3r/GUI/AboutDialog.cpp:297 msgid "Portions copyright" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256 +#: 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:129 +#: 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:199 +#: src/slic3r/GUI/AboutDialog.cpp:204 #, possible-c-format msgid "About %s" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:62 +#: src/slic3r/GUI/AboutDialog.cpp:236 src/slic3r/GUI/GUI_App.cpp:231 +#: src/slic3r/GUI/MainFrame.cpp:164 msgid "Version" msgstr "" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:258 +#: src/slic3r/GUI/AboutDialog.cpp:263 src/slic3r/GUI/GUI_App.cpp:236 msgid "is licensed under the" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:259 +#: src/slic3r/GUI/AboutDialog.cpp:264 src/slic3r/GUI/GUI_App.cpp:236 msgid "GNU Affero General Public License, version 3" msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:260 +#: src/slic3r/GUI/AboutDialog.cpp:265 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." msgstr "" -#: src/slic3r/GUI/AboutDialog.cpp:261 +#: 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 "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:92 -msgid "" -"Copying of the temporary G-code to the output G-code failed. Maybe the SD " -"card is write locked?" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:93 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:415 -msgid "Running post-processing scripts" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:95 -msgid "G-code file exported to %1%" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:99 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:117 -msgid "Slicing complete" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:113 -msgid "Masked SLA file exported to %1%" -msgstr "" - -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:155 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:77 #, possible-c-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -96,152 +73,224 @@ msgid "" "and we would be glad if you reported it." msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:417 +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:528 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:426 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:551 msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:65 -msgid "Shape" -msgstr "" - -#: src/slic3r/GUI/BedShapeDialog.cpp:72 -msgid "Rectangular" -msgstr "" - -#: src/slic3r/GUI/BedShapeDialog.cpp:76 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:393 src/slic3r/GUI/Plater.cpp:145 -#: src/slic3r/GUI/Tab.cpp:2524 +#: src/slic3r/GUI/BedShapeDialog.cpp:93 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:161 +#: src/slic3r/GUI/Tab.cpp:2504 msgid "Size" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:77 -msgid "Size in X and Y of the rectangular plate." -msgstr "" - -#: src/slic3r/GUI/BedShapeDialog.cpp:83 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 msgid "Origin" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:84 +#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:752 +msgid "Diameter" +msgstr "" + +#: src/slic3r/GUI/BedShapeDialog.cpp:110 +msgid "Size in X and Y of the rectangular plate." +msgstr "" + +#: src/slic3r/GUI/BedShapeDialog.cpp:121 msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:88 -msgid "Circular" -msgstr "" - -#: src/slic3r/GUI/BedShapeDialog.cpp:91 src/slic3r/GUI/ConfigWizard.cpp:123 -#: src/slic3r/GUI/ConfigWizard.cpp:576 src/slic3r/GUI/ConfigWizard.cpp:590 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:135 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:390 -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 src/slic3r/GUI/wxExtensions.cpp:509 -#: src/libslic3r/PrintConfig.cpp:70 src/libslic3r/PrintConfig.cpp:77 -#: src/libslic3r/PrintConfig.cpp:86 src/libslic3r/PrintConfig.cpp:220 -#: src/libslic3r/PrintConfig.cpp:295 src/libslic3r/PrintConfig.cpp:303 -#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:363 -#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:499 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:695 -#: src/libslic3r/PrintConfig.cpp:1215 src/libslic3r/PrintConfig.cpp:1276 -#: src/libslic3r/PrintConfig.cpp:1294 src/libslic3r/PrintConfig.cpp:1312 -#: src/libslic3r/PrintConfig.cpp:1364 src/libslic3r/PrintConfig.cpp:1374 -#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 -#: src/libslic3r/PrintConfig.cpp:1544 src/libslic3r/PrintConfig.cpp:1552 -#: src/libslic3r/PrintConfig.cpp:1562 src/libslic3r/PrintConfig.cpp:1570 -#: src/libslic3r/PrintConfig.cpp:1578 src/libslic3r/PrintConfig.cpp:1661 -#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:1948 -#: src/libslic3r/PrintConfig.cpp:1982 src/libslic3r/PrintConfig.cpp:2176 -#: src/libslic3r/PrintConfig.cpp:2183 src/libslic3r/PrintConfig.cpp:2190 -#: src/libslic3r/PrintConfig.cpp:2220 src/libslic3r/PrintConfig.cpp:2230 -#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2403 -#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2519 -#: src/libslic3r/PrintConfig.cpp:2528 src/libslic3r/PrintConfig.cpp:2538 -#: src/libslic3r/PrintConfig.cpp:2582 src/libslic3r/PrintConfig.cpp:2592 -#: src/libslic3r/PrintConfig.cpp:2604 src/libslic3r/PrintConfig.cpp:2624 -#: src/libslic3r/PrintConfig.cpp:2634 src/libslic3r/PrintConfig.cpp:2644 -#: src/libslic3r/PrintConfig.cpp:2662 src/libslic3r/PrintConfig.cpp:2677 -#: src/libslic3r/PrintConfig.cpp:2691 src/libslic3r/PrintConfig.cpp:2704 -#: src/libslic3r/PrintConfig.cpp:2742 src/libslic3r/PrintConfig.cpp:2752 -#: src/libslic3r/PrintConfig.cpp:2761 src/libslic3r/PrintConfig.cpp:2771 +#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:240 +#: src/slic3r/GUI/ConfigWizard.cpp:1346 src/slic3r/GUI/ConfigWizard.cpp:1360 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87 +#: src/slic3r/GUI/GCodeViewer.cpp:2275 src/slic3r/GUI/GCodeViewer.cpp:2281 +#: src/slic3r/GUI/GCodeViewer.cpp:2289 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:548 src/libslic3r/PrintConfig.cpp:559 +#: src/libslic3r/PrintConfig.cpp:577 src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:1167 src/libslic3r/PrintConfig.cpp:1348 +#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1427 +#: src/libslic3r/PrintConfig.cpp:1445 src/libslic3r/PrintConfig.cpp:1503 +#: src/libslic3r/PrintConfig.cpp:1513 src/libslic3r/PrintConfig.cpp:1635 +#: src/libslic3r/PrintConfig.cpp:1643 src/libslic3r/PrintConfig.cpp:1684 +#: src/libslic3r/PrintConfig.cpp:1692 src/libslic3r/PrintConfig.cpp:1702 +#: src/libslic3r/PrintConfig.cpp:1710 src/libslic3r/PrintConfig.cpp:1718 +#: src/libslic3r/PrintConfig.cpp:1781 src/libslic3r/PrintConfig.cpp:2047 +#: src/libslic3r/PrintConfig.cpp:2118 src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2281 src/libslic3r/PrintConfig.cpp:2360 +#: src/libslic3r/PrintConfig.cpp:2367 src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2404 src/libslic3r/PrintConfig.cpp:2414 +#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2584 +#: src/libslic3r/PrintConfig.cpp:2618 src/libslic3r/PrintConfig.cpp:2757 +#: src/libslic3r/PrintConfig.cpp:2766 src/libslic3r/PrintConfig.cpp:2775 +#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2850 +#: src/libslic3r/PrintConfig.cpp:2860 src/libslic3r/PrintConfig.cpp:2872 +#: src/libslic3r/PrintConfig.cpp:2892 src/libslic3r/PrintConfig.cpp:2902 +#: src/libslic3r/PrintConfig.cpp:2912 src/libslic3r/PrintConfig.cpp:2930 +#: src/libslic3r/PrintConfig.cpp:2945 src/libslic3r/PrintConfig.cpp:2959 +#: src/libslic3r/PrintConfig.cpp:2970 src/libslic3r/PrintConfig.cpp:2983 +#: src/libslic3r/PrintConfig.cpp:3028 src/libslic3r/PrintConfig.cpp:3038 +#: src/libslic3r/PrintConfig.cpp:3047 src/libslic3r/PrintConfig.cpp:3057 +#: src/libslic3r/PrintConfig.cpp:3073 src/libslic3r/PrintConfig.cpp:3097 msgid "mm" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/libslic3r/PrintConfig.cpp:692 -msgid "Diameter" -msgstr "" - -#: src/slic3r/GUI/BedShapeDialog.cpp:93 +#: 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:97 src/slic3r/GUI/GUI_Preview.cpp:247 -#: src/libslic3r/GCode/PreviewData.cpp:159 +#: 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:309 +#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:358 msgid "Custom" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:101 +#: src/slic3r/GUI/BedShapeDialog.cpp:145 +msgid "Invalid" +msgstr "" + +#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2215 +msgid "Shape" +msgstr "" + +#: src/slic3r/GUI/BedShapeDialog.cpp:243 msgid "Load shape from STL..." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:154 +#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1981 msgid "Settings" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:171 +#: src/slic3r/GUI/BedShapeDialog.cpp:315 msgid "Texture" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:181 src/slic3r/GUI/BedShapeDialog.cpp:249 +#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405 msgid "Load..." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:189 src/slic3r/GUI/BedShapeDialog.cpp:257 -#: src/slic3r/GUI/Tab.cpp:3286 +#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413 +#: src/slic3r/GUI/Tab.cpp:3447 msgid "Remove" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:239 +#: 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:464 +#: src/slic3r/GUI/BedShapeDialog.cpp:563 msgid "Choose an STL file to import bed shape from:" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:471 src/slic3r/GUI/BedShapeDialog.cpp:520 -#: src/slic3r/GUI/BedShapeDialog.cpp:543 +#: 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:482 +#: src/slic3r/GUI/BedShapeDialog.cpp:581 msgid "Error! Invalid model" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:490 +#: src/slic3r/GUI/BedShapeDialog.cpp:589 msgid "The selected file contains no geometry." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:494 +#: src/slic3r/GUI/BedShapeDialog.cpp:593 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:509 +#: src/slic3r/GUI/BedShapeDialog.cpp:608 msgid "Choose a file to import bed texture from (PNG/SVG):" msgstr "" -#: src/slic3r/GUI/BedShapeDialog.cpp:532 +#: 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:535 +#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1305 msgid "Bed Shape" msgstr "" @@ -287,6 +336,130 @@ msgid "" "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 "" + +#: src/slic3r/GUI/ConfigManipulation.cpp:48 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1376 +#: 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 "" + +#: src/slic3r/GUI/ConfigManipulation.cpp:60 src/libslic3r/PrintConfig.cpp:938 +msgid "First layer height" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: src/slic3r/GUI/ConfigManipulation.cpp:209 +msgid "Shall I switch to rectilinear fill pattern?" +msgstr "" + +#: 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:388 +#: src/slic3r/GUI/Tab.cpp:1420 src/slic3r/GUI/Tab.cpp:1422 +#: src/libslic3r/PrintConfig.cpp:244 src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:479 src/libslic3r/PrintConfig.cpp:819 +#: src/libslic3r/PrintConfig.cpp:833 src/libslic3r/PrintConfig.cpp:870 +#: src/libslic3r/PrintConfig.cpp:1034 src/libslic3r/PrintConfig.cpp:1044 +#: src/libslic3r/PrintConfig.cpp:1062 src/libslic3r/PrintConfig.cpp:1081 +#: src/libslic3r/PrintConfig.cpp:1100 src/libslic3r/PrintConfig.cpp:1834 +#: src/libslic3r/PrintConfig.cpp:1851 +msgid "Infill" +msgstr "" + +#: src/slic3r/GUI/ConfigManipulation.cpp:322 +msgid "Head penetration should not be greater than the head width." +msgstr "" + +#: src/slic3r/GUI/ConfigManipulation.cpp:324 +msgid "Invalid Head penetration" +msgstr "" + +#: src/slic3r/GUI/ConfigManipulation.cpp:335 +msgid "Pinhead diameter should be smaller than the pillar diameter." +msgstr "" + +#: src/slic3r/GUI/ConfigManipulation.cpp:337 +msgid "Invalid pinhead diameter" +msgstr "" + #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18 msgid "Upgrade" msgstr "" @@ -299,158 +472,199 @@ msgstr "" msgid "Before roll back" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 src/libslic3r/PrintConfig.cpp:139 msgid "User" msgstr "" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27 +#: src/slic3r/GUI/GUI_Preview.cpp:294 src/libslic3r/ExtrusionEntity.cpp:309 msgid "Unknown" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:39 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 msgid "Active" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 -msgid "slic3r version" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50 +msgid "PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1311 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:54 src/libslic3r/Preset.cpp:1257 msgid "print" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 msgid "filaments" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:48 src/slic3r/GUI/Preset.cpp:1315 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 src/libslic3r/Preset.cpp:1259 +msgid "SLA print" +msgstr "" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/slic3r/GUI/Plater.cpp:688 +#: src/libslic3r/Preset.cpp:1260 +msgid "SLA material" +msgstr "" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:61 src/libslic3r/Preset.cpp:1261 msgid "printer" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 src/slic3r/GUI/Tab.cpp:961 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 src/slic3r/GUI/Tab.cpp:1293 msgid "vendor" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:65 msgid "version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 -msgid "min slic3r version" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 +msgid "min PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 -msgid "max slic3r version" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:68 +msgid "max PrusaSlicer version" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 msgid "model" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:71 msgid "variants" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:83 #, possible-c-format msgid "Incompatible with this %s" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:73 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:86 msgid "Activate" msgstr "" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:99 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:112 msgid "Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:123 +#: src/slic3r/GUI/ConfigWizard.cpp:240 msgid "nozzle" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:127 +#: src/slic3r/GUI/ConfigWizard.cpp:244 msgid "Alternate nozzles:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:193 +#: src/slic3r/GUI/ConfigWizard.cpp:308 msgid "All standard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:194 src/slic3r/GUI/Tab.cpp:3336 +#: src/slic3r/GUI/ConfigWizard.cpp:308 +msgid "Standard" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:309 src/slic3r/GUI/ConfigWizard.cpp:599 +#: src/slic3r/GUI/Tab.cpp:3528 src/slic3r/GUI/UnsavedChangesDialog.cpp:921 msgid "All" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:195 src/slic3r/GUI/Plater.cpp:469 -#: src/slic3r/GUI/Plater.cpp:607 src/libslic3r/GCode/PreviewData.cpp:146 +#: src/slic3r/GUI/ConfigWizard.cpp:310 src/slic3r/GUI/ConfigWizard.cpp:600 +#: src/slic3r/GUI/Plater.cpp:360 src/slic3r/GUI/Plater.cpp:500 msgid "None" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:301 +#: src/slic3r/GUI/ConfigWizard.cpp:446 #, possible-c-format msgid "Welcome to the %s Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:303 +#: src/slic3r/GUI/ConfigWizard.cpp:448 #, possible-c-format msgid "Welcome to the %s Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:305 +#: src/slic3r/GUI/ConfigWizard.cpp:450 msgid "Welcome" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:309 src/slic3r/GUI/GUI_App.cpp:793 -#, possible-c-format -msgid "Run %s" -msgstr "" - -#: src/slic3r/GUI/ConfigWizard.cpp:311 +#: src/slic3r/GUI/ConfigWizard.cpp:452 #, 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:316 -msgid "" -"Remove user profiles - install from scratch (a snapshot will be taken " -"beforehand)" +#: src/slic3r/GUI/ConfigWizard.cpp:457 +msgid "Remove user profiles (a snapshot will be taken beforehand)" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:347 +#: src/slic3r/GUI/ConfigWizard.cpp:500 #, possible-c-format msgid "%s Family" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:384 +#: src/slic3r/GUI/ConfigWizard.cpp:588 +msgid "Printer:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:590 +msgid "Vendor:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:591 +msgid "Profile:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:663 src/slic3r/GUI/ConfigWizard.cpp:813 +#: src/slic3r/GUI/ConfigWizard.cpp:874 src/slic3r/GUI/ConfigWizard.cpp:1011 +msgid "(All)" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:692 +msgid "" +"Filaments marked with * are not compatible with some installed " +"printers." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:695 +msgid "All installed printers are compatible with the selected filament." +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:715 +msgid "" +"Only the following installed printers are compatible with the selected " +"filament:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1101 msgid "Custom Printer Setup" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:384 +#: src/slic3r/GUI/ConfigWizard.cpp:1101 msgid "Custom Printer" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:386 +#: src/slic3r/GUI/ConfigWizard.cpp:1103 msgid "Define a custom printer profile" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:388 +#: src/slic3r/GUI/ConfigWizard.cpp:1105 msgid "Custom profile name:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:412 +#: src/slic3r/GUI/ConfigWizard.cpp:1130 msgid "Automatic updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:412 +#: src/slic3r/GUI/ConfigWizard.cpp:1130 msgid "Updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:420 src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:1138 src/slic3r/GUI/Preferences.cpp:81 msgid "Check for application updates" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:424 +#: src/slic3r/GUI/ConfigWizard.cpp:1142 #, possible-c-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -459,11 +673,11 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:430 src/slic3r/GUI/Preferences.cpp:77 +#: src/slic3r/GUI/ConfigWizard.cpp:1148 src/slic3r/GUI/Preferences.cpp:97 msgid "Update built-in Presets automatically" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:434 +#: src/slic3r/GUI/ConfigWizard.cpp:1152 #, possible-c-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -472,189 +686,613 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:437 +#: src/slic3r/GUI/ConfigWizard.cpp:1155 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:442 +#: src/slic3r/GUI/ConfigWizard.cpp:1160 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:449 +#: src/slic3r/GUI/ConfigWizard.cpp:1167 src/slic3r/GUI/GUI_ObjectList.cpp:1793 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3120 +#: src/slic3r/GUI/Plater.cpp:3953 src/slic3r/GUI/Plater.cpp:3982 +msgid "Reload from disk" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1170 +msgid "" +"Export full pathnames of models and parts sources into 3mf and amf files" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1174 +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 "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1182 +msgid "View mode" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1184 +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 "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1189 +msgid "Simple mode" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1190 +msgid "Advanced mode" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1191 +msgid "Expert mode" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1197 +msgid "The size of the object can be specified in inches" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1198 +msgid "Use inches" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1232 msgid "Other Vendors" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:451 +#: src/slic3r/GUI/ConfigWizard.cpp:1236 #, possible-c-format -msgid "Pick another vendor supported by %s:" +msgid "Pick another vendor supported by %s" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:497 +#: src/slic3r/GUI/ConfigWizard.cpp:1267 msgid "Firmware Type" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:497 src/slic3r/GUI/Tab.cpp:2149 +#: src/slic3r/GUI/ConfigWizard.cpp:1267 src/slic3r/GUI/Tab.cpp:2145 msgid "Firmware" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:501 +#: src/slic3r/GUI/ConfigWizard.cpp:1271 msgid "Choose the type of firmware used by your printer." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:535 +#: src/slic3r/GUI/ConfigWizard.cpp:1305 msgid "Bed Shape and Size" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:538 +#: src/slic3r/GUI/ConfigWizard.cpp:1308 msgid "Set the shape of your printer's bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:558 +#: src/slic3r/GUI/ConfigWizard.cpp:1328 msgid "Filament and Nozzle Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:558 +#: src/slic3r/GUI/ConfigWizard.cpp:1328 msgid "Print Diameters" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:572 +#: src/slic3r/GUI/ConfigWizard.cpp:1342 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:575 +#: src/slic3r/GUI/ConfigWizard.cpp:1345 msgid "Nozzle Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:585 +#: src/slic3r/GUI/ConfigWizard.cpp:1355 msgid "Enter the diameter of your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:586 +#: src/slic3r/GUI/ConfigWizard.cpp:1356 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:589 +#: src/slic3r/GUI/ConfigWizard.cpp:1359 msgid "Filament Diameter:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:623 -msgid "Extruder and Bed Temperatures" +#: src/slic3r/GUI/ConfigWizard.cpp:1393 +msgid "Nozzle and Bed Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:623 +#: src/slic3r/GUI/ConfigWizard.cpp:1393 msgid "Temperatures" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:639 +#: src/slic3r/GUI/ConfigWizard.cpp:1409 msgid "Enter the temperature needed for extruding your filament." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:640 +#: src/slic3r/GUI/ConfigWizard.cpp:1410 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:643 +#: src/slic3r/GUI/ConfigWizard.cpp:1413 msgid "Extrusion Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:644 src/slic3r/GUI/ConfigWizard.cpp:658 +#: src/slic3r/GUI/ConfigWizard.cpp:1414 src/slic3r/GUI/ConfigWizard.cpp:1428 +#: src/libslic3r/PrintConfig.cpp:187 src/libslic3r/PrintConfig.cpp:919 +#: src/libslic3r/PrintConfig.cpp:963 src/libslic3r/PrintConfig.cpp:2200 msgid "°C" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:653 +#: src/slic3r/GUI/ConfigWizard.cpp:1423 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:654 +#: src/slic3r/GUI/ConfigWizard.cpp:1424 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:657 +#: src/slic3r/GUI/ConfigWizard.cpp:1427 msgid "Bed Temperature:" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1138 +#: src/slic3r/GUI/ConfigWizard.cpp:1882 src/slic3r/GUI/ConfigWizard.cpp:2534 +msgid "Filaments" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1882 src/slic3r/GUI/ConfigWizard.cpp:2536 +msgid "SLA Materials" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1936 +msgid "FFF Technology Printers" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:1941 +msgid "SLA Technology Printers" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2247 src/slic3r/GUI/DoubleSlider.cpp:2133 +#: src/slic3r/GUI/DoubleSlider.cpp:2153 src/slic3r/GUI/GUI.cpp:244 +msgid "Notice" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2267 +msgid "The following FFF printer models have no filament selected:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2271 +msgid "Do you want to select default filaments for these FFF printer models?" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2285 +msgid "The following SLA printer models have no materials selected:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2289 +msgid "Do you want to select default SLA materials for these printer models?" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2497 msgid "Select all standard printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1141 +#: src/slic3r/GUI/ConfigWizard.cpp:2500 msgid "< &Back" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1142 +#: src/slic3r/GUI/ConfigWizard.cpp:2501 msgid "&Next >" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1143 +#: src/slic3r/GUI/ConfigWizard.cpp:2502 msgid "&Finish" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1144 src/slic3r/GUI/FirmwareDialog.cpp:151 -#: src/slic3r/GUI/ProgressStatusBar.cpp:27 +#: src/slic3r/GUI/ConfigWizard.cpp:2503 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:248 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:644 msgid "Cancel" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1158 +#: src/slic3r/GUI/ConfigWizard.cpp:2516 msgid "Prusa FFF Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1161 +#: src/slic3r/GUI/ConfigWizard.cpp:2519 msgid "Prusa MSLA Technology Printers" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1230 +#: src/slic3r/GUI/ConfigWizard.cpp:2534 +msgid "Filament Profiles Selection" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2534 src/slic3r/GUI/ConfigWizard.cpp:2536 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 +msgid "Type:" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2536 +msgid "SLA Material Profiles Selection" +msgstr "" + +#: src/slic3r/GUI/ConfigWizard.cpp:2634 msgid "Configuration Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1231 +#: src/slic3r/GUI/ConfigWizard.cpp:2635 msgid "Configuration &Assistant" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1233 +#: src/slic3r/GUI/ConfigWizard.cpp:2637 msgid "Configuration Wizard" msgstr "" -#: src/slic3r/GUI/ConfigWizard.cpp:1234 +#: src/slic3r/GUI/ConfigWizard.cpp:2638 msgid "Configuration &Wizard" msgstr "" -#: src/slic3r/GUI/Field.cpp:125 +#: src/slic3r/GUI/DoubleSlider.cpp:106 +msgid "Place bearings in slots and resume printing" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1075 +msgid "One layer mode" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1077 +msgid "Discard all custom changes" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1082 src/slic3r/GUI/DoubleSlider.cpp:1863 +msgid "Jump to move" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1086 +#, possible-c-format +msgid "Jump to height %s or Set extruder sequence for the entire print" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1088 src/slic3r/GUI/DoubleSlider.cpp:1732 +#: src/slic3r/GUI/DoubleSlider.cpp:1863 src/slic3r/GUI/DoubleSlider.cpp:1867 +msgid "Jump to height" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1094 +msgid "Edit current color - Right click the colored slider segment" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1104 +msgid "Print mode" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1118 +msgid "Add extruder change - Left click" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1120 +msgid "" +"Add color change - Left click for predefined color or Shift + Left click for " +"custom color selection" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1122 +msgid "Add color change - Left click" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1123 +msgid "or press \"+\" key" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1125 +msgid "Add another code - Ctrl + Left click" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1126 +msgid "Add another code - Right click" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1132 +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:1141 +msgid "Color change (\"%1%\")" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1142 +msgid "Color change (\"%1%\") for Extruder %2%" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1144 +msgid "Pause print (\"%1%\")" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1146 +msgid "Custom template (\"%1%\")" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1148 +msgid "Extruder (tool) is changed to Extruder \"%1%\"" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1155 +msgid "Note" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1157 +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:1160 +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:1163 +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:1166 +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:1171 +msgid "Delete tick mark - Left click or press \"-\" key" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1173 +msgid "Edit tick mark - Ctrl + Left click" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1174 +msgid "Edit tick mark - Right click" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1274 src/slic3r/GUI/DoubleSlider.cpp:1308 +#: src/slic3r/GUI/GLCanvas3D.cpp:980 src/slic3r/GUI/GUI_ObjectList.cpp:1832 +#: src/slic3r/GUI/Tab.cpp:2500 +#, possible-c-format +msgid "Extruder %d" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1275 src/slic3r/GUI/GUI_ObjectList.cpp:1833 +msgid "active" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1284 +msgid "Switch code to Change extruder" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1284 src/slic3r/GUI/GUI_ObjectList.cpp:1800 +msgid "Change extruder" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1285 +msgid "Change extruder (N/A)" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1287 +msgid "Use another extruder" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1309 +msgid "used" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1317 +msgid "Switch code to Color change (%1%) for:" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1318 +msgid "Add color change (%1%) for:" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1676 +msgid "Add color change" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1686 +msgid "Add pause print" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1690 +msgid "Add custom template" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1693 +msgid "Add custom G-code" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1711 +msgid "Edit color" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1712 +msgid "Edit pause print message" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1713 +msgid "Edit custom G-code" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1719 +msgid "Delete color change" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1720 +msgid "Delete tool change" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1721 +msgid "Delete pause print" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1722 +msgid "Delete custom G-code" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1739 +msgid "Set extruder sequence for the entire print" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1825 +msgid "Enter custom G-code used on current layer" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1826 +msgid "Custom G-code on current layer (%1% mm)." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1841 +msgid "Enter short message shown on Printer display when a print is paused" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1842 +msgid "Message for pause print on current layer (%1% mm)." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1862 +msgid "Enter the move you want to jump to" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:1862 src/slic3r/GUI/DoubleSlider.cpp:1866 +msgid "Enter the height you want to jump to" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:2127 +msgid "The last color change data was saved for a single extruder printing." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:2128 src/slic3r/GUI/DoubleSlider.cpp:2143 +msgid "The last color change data was saved for a multi extruder printing." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:2130 +msgid "Your current changes will delete all saved color changes." +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:2131 src/slic3r/GUI/DoubleSlider.cpp:2151 +msgid "Are you sure you want to continue?" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:2144 +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:2147 +msgid "Do you want to delete all saved tool changes?" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:2149 +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:2150 +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 +msgid "default" +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 +msgid "Set extruder sequence" +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +msgid "Set extruder change for every" +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52 +#: src/libslic3r/PrintConfig.cpp:403 src/libslic3r/PrintConfig.cpp:1047 +#: src/libslic3r/PrintConfig.cpp:1624 src/libslic3r/PrintConfig.cpp:1789 +#: src/libslic3r/PrintConfig.cpp:1856 src/libslic3r/PrintConfig.cpp:2063 +#: src/libslic3r/PrintConfig.cpp:2109 +msgid "layers" +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182 +msgid "Remove extruder from sequence" +msgstr "" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 +msgid "Add extruder to sequence" +msgstr "" + +#: src/slic3r/GUI/Field.cpp:184 msgid "default value" msgstr "" -#: src/slic3r/GUI/Field.cpp:128 +#: src/slic3r/GUI/Field.cpp:187 msgid "parameter name" msgstr "" -#: src/slic3r/GUI/Field.cpp:139 src/slic3r/GUI/OptionsGroup.cpp:569 +#: src/slic3r/GUI/Field.cpp:198 src/slic3r/GUI/OptionsGroup.cpp:774 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:874 msgid "N/A" msgstr "" -#: src/slic3r/GUI/Field.cpp:158 +#: src/slic3r/GUI/Field.cpp:220 #, possible-c-format msgid "%s doesn't support percentage" msgstr "" -#: src/slic3r/GUI/Field.cpp:174 src/slic3r/GUI/Field.cpp:197 -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:337 +#: src/slic3r/GUI/Field.cpp:240 src/slic3r/GUI/Field.cpp:271 +#: src/slic3r/GUI/Field.cpp:1417 src/slic3r/GUI/GUI_ObjectLayers.cpp:413 msgid "Invalid numeric input." msgstr "" -#: src/slic3r/GUI/Field.cpp:179 +#: src/slic3r/GUI/Field.cpp:249 src/slic3r/GUI/Field.cpp:1429 msgid "Input value is out of range" msgstr "" -#: src/slic3r/GUI/Field.cpp:206 +#: src/slic3r/GUI/Field.cpp:285 #, possible-c-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -662,7 +1300,7 @@ msgid "" "or NO if you are sure that %s %s is a correct value." msgstr "" -#: src/slic3r/GUI/Field.cpp:209 +#: src/slic3r/GUI/Field.cpp:288 msgid "Parameter validation" msgstr "" @@ -738,8 +1376,9 @@ msgstr "" msgid "Firmware image:" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1870 -#: src/slic3r/GUI/Tab.cpp:1926 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364 msgid "Browse" msgstr "" @@ -772,461 +1411,1036 @@ msgid "Advanced: Output log" msgstr "" #: src/slic3r/GUI/FirmwareDialog.cpp:852 -#: src/slic3r/GUI/PrintHostDialogs.cpp:161 +#: src/slic3r/GUI/Mouse3DController.cpp:552 +#: src/slic3r/GUI/PrintHostDialogs.cpp:187 msgid "Close" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:903 +#: 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 "" -#: src/slic3r/GUI/FirmwareDialog.cpp:904 +#: src/slic3r/GUI/FirmwareDialog.cpp:903 msgid "Confirmation" msgstr "" -#: src/slic3r/GUI/FirmwareDialog.cpp:907 +#: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:534 -msgid "Layers heights" +#: src/slic3r/GUI/GCodeViewer.cpp:221 +msgid "Tool position" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:965 +msgid "Generating toolpaths" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:1356 +msgid "Generating vertex buffer" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:1437 +msgid "Generating index buffers" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2163 +msgid "Click to hide" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2163 +msgid "Click to show" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2275 +msgid "up to" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2281 +msgid "above" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2289 +msgid "from" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2289 +msgid "to" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2317 src/slic3r/GUI/GCodeViewer.cpp:2325 +#: src/slic3r/GUI/GUI_Preview.cpp:270 src/slic3r/GUI/GUI_Preview.cpp:788 +msgid "Feature type" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2317 src/slic3r/GUI/GCodeViewer.cpp:2325 +#: src/slic3r/GUI/RammingChart.cpp:76 +msgid "Time" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2325 +msgid "Percentage" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2328 +msgid "Height (mm)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2329 +msgid "Width (mm)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2330 +msgid "Speed (mm/s)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2331 +msgid "Fan Speed (%)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2332 +msgid "Volumetric flow rate (mm³/s)" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2333 src/slic3r/GUI/GUI_Preview.cpp:276 +#: src/slic3r/GUI/GUI_Preview.cpp:447 src/slic3r/GUI/GUI_Preview.cpp:694 +#: src/slic3r/GUI/GUI_Preview.cpp:787 src/slic3r/GUI/GUI_Preview.cpp:1266 +msgid "Tool" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2334 src/slic3r/GUI/GUI_Preview.cpp:277 +#: src/slic3r/GUI/GUI_Preview.cpp:785 +msgid "Color Print" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2370 src/slic3r/GUI/GCodeViewer.cpp:2405 +#: src/slic3r/GUI/GCodeViewer.cpp:2410 src/slic3r/GUI/GUI_ObjectList.cpp:296 +#: src/slic3r/GUI/wxExtensions.cpp:515 src/libslic3r/PrintConfig.cpp:530 +msgid "Extruder" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2381 +msgid "Default color" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2405 +msgid "default color" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2500 src/slic3r/GUI/GCodeViewer.cpp:2546 +msgid "Color change" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2519 src/slic3r/GUI/GCodeViewer.cpp:2544 +msgid "Print" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2545 src/slic3r/GUI/GCodeViewer.cpp:2562 +#: src/slic3r/GUI/Plater.cpp:1201 +msgid "Pause" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2550 src/slic3r/GUI/GCodeViewer.cpp:2553 +msgid "Event" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2550 src/slic3r/GUI/GCodeViewer.cpp:2553 +msgid "Remaining time" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2553 +msgid "Duration" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2588 src/slic3r/GUI/GUI_Preview.cpp:330 +#: src/slic3r/GUI/GUI_Preview.cpp:1466 src/libslic3r/PrintConfig.cpp:2286 +msgid "Travel" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2591 +msgid "Movement" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2592 +msgid "Extrusion" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2593 src/slic3r/GUI/Tab.cpp:1680 +#: src/slic3r/GUI/Tab.cpp:2550 +msgid "Retraction" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2624 src/slic3r/GUI/GUI_Preview.cpp:315 +#: src/slic3r/GUI/GUI_Preview.cpp:328 +msgid "Options" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2627 src/slic3r/GUI/GUI_Preview.cpp:331 +#: src/slic3r/GUI/GUI_Preview.cpp:1467 +msgid "Retractions" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2628 src/slic3r/GUI/GUI_Preview.cpp:332 +#: src/slic3r/GUI/GUI_Preview.cpp:1468 +msgid "Deretractions" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2629 src/slic3r/GUI/GUI_Preview.cpp:1469 +msgid "Tool changes" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2630 src/slic3r/GUI/GUI_Preview.cpp:1470 +msgid "Color changes" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2631 src/slic3r/GUI/GUI_Preview.cpp:1471 +msgid "Print pauses" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2632 src/slic3r/GUI/GUI_Preview.cpp:1472 +msgid "Custom G-codes" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2643 src/slic3r/GUI/GCodeViewer.cpp:2667 +#: src/slic3r/GUI/Plater.cpp:689 src/libslic3r/PrintConfig.cpp:113 +msgid "Printer" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2645 src/slic3r/GUI/GCodeViewer.cpp:2672 +#: src/slic3r/GUI/Plater.cpp:685 +msgid "Print settings" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2648 src/slic3r/GUI/GCodeViewer.cpp:2678 +#: src/slic3r/GUI/Plater.cpp:686 src/slic3r/GUI/Tab.cpp:1780 +#: src/slic3r/GUI/Tab.cpp:1781 +msgid "Filament" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2701 src/slic3r/GUI/GCodeViewer.cpp:2706 +#: src/slic3r/GUI/Plater.cpp:241 src/slic3r/GUI/Plater.cpp:1127 +#: src/slic3r/GUI/Plater.cpp:1177 src/slic3r/GUI/Plater.cpp:1198 +msgid "Estimated printing time" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2701 +msgid "Normal mode" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2706 +msgid "Stealth mode" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2733 +msgid "Show stealth mode" +msgstr "" + +#: src/slic3r/GUI/GCodeViewer.cpp:2737 +msgid "Show normal mode" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:228 src/slic3r/GUI/GLCanvas3D.cpp:4965 +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:554 +msgid "Radius" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:287 +msgid "Keep min" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:296 +msgid "Reset" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:562 +msgid "Variable layer height - Manual edit" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:630 +msgid "An object outside the print area was detected." msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:631 -msgid "An object outside the print area was detected" +msgid "A toolpath outside the print area was detected." msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:632 -msgid "A toolpath outside the print area was detected" +msgid "SLA supports outside the print area were detected." msgstr "" #: src/slic3r/GUI/GLCanvas3D.cpp:633 -msgid "SLA supports outside the print area were detected" +msgid "Some objects are not visible." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:634 -msgid "Some objects are not visible when editing supports" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:636 +#: src/slic3r/GUI/GLCanvas3D.cpp:635 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:1733 +#: src/slic3r/GUI/GLCanvas3D.cpp:907 src/slic3r/GUI/GLCanvas3D.cpp:936 +msgid "Default print color" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:937 src/slic3r/GUI/GLCanvas3D.cpp:946 +#: src/slic3r/GUI/GLCanvas3D.cpp:985 +msgid "Pause print or custom G-code" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:958 +#, possible-c-format +msgid "up to %.2f mm" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:962 +#, possible-c-format +msgid "above %.2f mm" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:966 +#, possible-c-format +msgid "%.2f - %.2f mm" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:998 +#, possible-c-format +msgid "Color change for Extruder %d at %.2f mm" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1309 +msgid "Seq." +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1776 +msgid "Variable layer height - Reset" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1784 +msgid "Variable layer height - Adaptive" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1792 +msgid "Variable layer height - Smooth all" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:2228 msgid "Mirror Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:2970 +#: src/slic3r/GUI/GLCanvas3D.cpp:3191 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520 +msgid "Gizmo-Move" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3275 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522 +msgid "Gizmo-Rotate" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3802 msgid "Move Object" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3506 +#: src/slic3r/GUI/GLCanvas3D.cpp:4289 src/slic3r/GUI/GLCanvas3D.cpp:4926 +msgid "Switch to Settings" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4290 src/slic3r/GUI/GLCanvas3D.cpp:4926 +msgid "Print Settings Tab" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4291 src/slic3r/GUI/GLCanvas3D.cpp:4927 +msgid "Filament Settings Tab" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4291 src/slic3r/GUI/GLCanvas3D.cpp:4927 +msgid "Material Settings Tab" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4292 src/slic3r/GUI/GLCanvas3D.cpp:4928 +msgid "Printer Settings Tab" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4348 msgid "Undo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3506 +#: src/slic3r/GUI/GLCanvas3D.cpp:4348 msgid "Redo History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3524 +#: src/slic3r/GUI/GLCanvas3D.cpp:4369 #, possible-c-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3524 +#: src/slic3r/GUI/GLCanvas3D.cpp:4369 #, possible-c-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "" msgstr[1] "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3571 +#: src/slic3r/GUI/GLCanvas3D.cpp:4389 src/slic3r/GUI/GLCanvas3D.cpp:4944 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 src/slic3r/GUI/Search.cpp:426 +msgid "Search" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4403 src/slic3r/GUI/GLCanvas3D.cpp:4411 +#: src/slic3r/GUI/Search.cpp:433 +msgid "Enter a search term" +msgstr "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4820 msgid "Add..." msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3579 src/slic3r/GUI/GUI_ObjectList.cpp:1501 -#: src/slic3r/GUI/Plater.cpp:3520 src/slic3r/GUI/Plater.cpp:3539 -#: src/slic3r/GUI/Tab.cpp:3286 +#: src/slic3r/GUI/GLCanvas3D.cpp:4828 src/slic3r/GUI/GUI_ObjectList.cpp:1846 +#: src/slic3r/GUI/Plater.cpp:3950 src/slic3r/GUI/Plater.cpp:3972 +#: src/slic3r/GUI/Tab.cpp:3447 msgid "Delete" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3588 src/slic3r/GUI/Plater.cpp:4172 +#: src/slic3r/GUI/GLCanvas3D.cpp:4837 src/slic3r/GUI/KBShortcutsDialog.cpp:124 +#: src/slic3r/GUI/Plater.cpp:4882 msgid "Delete all" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3597 src/slic3r/GUI/KBShortcutsDialog.cpp:137 -#: src/slic3r/GUI/Plater.cpp:2681 +#: src/slic3r/GUI/GLCanvas3D.cpp:4846 src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/Plater.cpp:1633 msgid "Arrange" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3597 src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/GLCanvas3D.cpp:4846 src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "Arrange selection" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3609 +#: src/slic3r/GUI/GLCanvas3D.cpp:4858 msgid "Copy" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3618 +#: src/slic3r/GUI/GLCanvas3D.cpp:4867 msgid "Paste" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3630 src/slic3r/GUI/Plater.cpp:3400 -#: src/slic3r/GUI/Plater.cpp:3412 src/slic3r/GUI/Plater.cpp:3526 +#: src/slic3r/GUI/GLCanvas3D.cpp:4879 src/slic3r/GUI/Plater.cpp:3809 +#: src/slic3r/GUI/Plater.cpp:3821 src/slic3r/GUI/Plater.cpp:3959 msgid "Add instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3641 src/slic3r/GUI/Plater.cpp:3528 +#: src/slic3r/GUI/GLCanvas3D.cpp:4890 src/slic3r/GUI/Plater.cpp:3961 msgid "Remove instance" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3654 +#: src/slic3r/GUI/GLCanvas3D.cpp:4903 msgid "Split to objects" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3664 src/slic3r/GUI/GUI_ObjectList.cpp:1340 +#: src/slic3r/GUI/GLCanvas3D.cpp:4913 src/slic3r/GUI/GUI_ObjectList.cpp:1618 msgid "Split to parts" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3677 src/slic3r/GUI/GUI_ObjectList.cpp:2203 -msgid "Height ranges" -msgstr "" - -#: src/slic3r/GUI/GLCanvas3D.cpp:3728 src/slic3r/GUI/MainFrame.cpp:570 +#: src/slic3r/GUI/GLCanvas3D.cpp:5015 src/slic3r/GUI/KBShortcutsDialog.cpp:125 +#: src/slic3r/GUI/MainFrame.cpp:1199 msgid "Undo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3728 src/slic3r/GUI/GLCanvas3D.cpp:3761 -msgid "Click right mouse button to open History" +#: src/slic3r/GUI/GLCanvas3D.cpp:5015 src/slic3r/GUI/GLCanvas3D.cpp:5054 +msgid "Click right mouse button to open/close History" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3745 +#: src/slic3r/GUI/GLCanvas3D.cpp:5038 msgid "Next Undo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3761 src/slic3r/GUI/MainFrame.cpp:573 +#: src/slic3r/GUI/GLCanvas3D.cpp:5054 src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/MainFrame.cpp:1202 msgid "Redo" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:3777 +#: src/slic3r/GUI/GLCanvas3D.cpp:5076 msgid "Next Redo action: %1%" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:5555 +#: src/slic3r/GUI/GLCanvas3D.cpp:7179 msgid "Selection-Add from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3D.cpp:5574 +#: src/slic3r/GUI/GLCanvas3D.cpp:7198 msgid "Selection-Remove from rectangle" msgstr "" -#: src/slic3r/GUI/GLCanvas3DManager.cpp:273 -#, possible-c-format -msgid "" -"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" -"while OpenGL version %s, render %s, vendor %s was detected." -msgstr "" - -#: src/slic3r/GUI/GLCanvas3DManager.cpp:276 -msgid "You may need to update your graphics card driver." -msgstr "" - -#: src/slic3r/GUI/GLCanvas3DManager.cpp:279 -msgid "" -"As a workaround, you may run PrusaSlicer with a software rendered 3D " -"graphics by running prusa-slicer.exe with the --sw_renderer parameter." -msgstr "" - -#: src/slic3r/GUI/GLCanvas3DManager.cpp:281 -msgid "Unsupported OpenGL version" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:145 src/libslic3r/PrintConfig.cpp:3212 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:48 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:146 src/libslic3r/PrintConfig.cpp:3593 msgid "Cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:150 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 msgid "Keep upper part" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171 msgid "Keep lower part" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:152 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:172 msgid "Rotate lower part upwards" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:155 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:177 msgid "Perform cut" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45 -msgid "Place on face" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33 +msgid "Paint-on supports" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 -msgid "Move" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Position (mm)" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Displacement (mm)" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:477 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:496 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:514 -#: src/libslic3r/PrintConfig.cpp:3261 -msgid "Rotate" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:482 -msgid "Rotation (deg)" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:392 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:497 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:515 -#: src/libslic3r/PrintConfig.cpp:3276 -msgid "Scale" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:292 -msgid "Scale (%)" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 -msgid "Head diameter" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 -msgid "Lock supports under new islands" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1449 -msgid "Remove selected points" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 -msgid "Remove all points" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1452 -msgid "Apply changes" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1453 -msgid "Discard changes" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 -msgid "Minimal points distance" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 -#: src/libslic3r/PrintConfig.cpp:2651 -msgid "Support points density" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1455 -msgid "Auto-generate points" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 -msgid "Manual editing" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 +#: 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/GLGizmoSlaSupports.cpp:55 +#: 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/GLGizmoSlaSupports.cpp:531 +#: 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:3089 +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:3642 +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:3657 +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:2919 +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:719 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514 msgid "Delete support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:920 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694 msgid "Change point head diameter" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:986 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762 msgid "Support parameter change" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1094 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 msgid "SLA Support Points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1115 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 msgid "SLA gizmo turned on" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1137 +#: 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:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 msgid "Save changes?" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1150 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924 msgid "SLA gizmo turned off" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1187 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955 msgid "Move support point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1286 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048 msgid "Support points edit" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355 -msgid "" -"Autogeneration will erase all manually edited points.\n" -"\n" -"Are you sure you want to do it?\n" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127 +msgid "Autogeneration will erase all manually edited points." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1357 src/slic3r/GUI/GUI.cpp:289 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 +#: 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:1360 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134 msgid "Autogenerate support points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1412 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181 msgid "SLA gizmo keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1441 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1444 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1445 +#: 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:1441 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210 msgid "Add point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1442 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 msgid "Right click" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1442 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 msgid "Remove point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1443 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1446 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1447 +#: 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:1443 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 msgid "Move point" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1444 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213 msgid "Add point to selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1445 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 msgid "Remove point from selection" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1446 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215 msgid "Select by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1447 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216 msgid "Deselect by rectangle" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1448 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 msgid "Select all points" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1450 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 msgid "Mouse wheel" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1450 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 msgid "Move clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1451 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 msgid "Reset clipping plane" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1454 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 msgid "Switch to editing mode" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:569 -msgid "Gizmo-Place on Face" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:641 -msgid "Gizmo-Move" -msgstr "" - -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:646 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521 msgid "Gizmo-Scale" msgstr "" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:651 -msgid "Gizmo-Rotate" +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:630 +msgid "Gizmo-Place on Face" msgstr "" -#: src/slic3r/GUI/GUI.cpp:141 src/slic3r/GUI/Tab.cpp:3145 -msgid "It's impossible to print multi-part object(s) with SLA technology." +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39 +msgid "Entering Paint-on supports" msgstr "" -#: src/slic3r/GUI/GUI.cpp:142 -msgid "Please check and fix your object list." +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40 +msgid "Entering Seam painting" msgstr "" -#: src/slic3r/GUI/GUI.cpp:143 src/slic3r/GUI/Plater.cpp:2246 -#: src/slic3r/GUI/Tab.cpp:3147 -msgid "Attention!" +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47 +msgid "Leaving Seam painting" msgstr "" -#: src/slic3r/GUI/GUI.cpp:283 -msgid "Notice" +#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48 +msgid "Leaving Paint-on supports" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:132 +#: 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 +#, possible-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:577 #, possible-c-format msgid "" "%s has encountered an error. It was likely caused by running out of memory. " @@ -1236,221 +2450,292 @@ msgid "" "The application will now terminate." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:135 +#: src/slic3r/GUI/GUI_App.cpp:580 msgid "Fatal error" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:442 -msgid "Changing of an application language" +#: src/slic3r/GUI/GUI_App.cpp:700 +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:450 src/slic3r/GUI/GUI_App.cpp:459 +#: src/slic3r/GUI/GUI_App.cpp:706 +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:760 +#, possible-c-format +msgid "" +"%s\n" +"Do you want to continue?" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:762 src/slic3r/GUI/UnsavedChangesDialog.cpp:653 +msgid "Remember my choice" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:797 +msgid "Loading configuration" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:855 +msgid "Preparing settings tabs" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1100 +msgid "" +"You have the following presets with saved options for \"Print Host upload\"" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1104 +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:1106 +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:1109 +msgid "Information" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1122 src/slic3r/GUI/GUI_App.cpp:1133 msgid "Recreating" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:463 +#: src/slic3r/GUI/GUI_App.cpp:1138 msgid "Loading of current presets" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:471 +#: src/slic3r/GUI/GUI_App.cpp:1143 msgid "Loading of a mode view" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:551 +#: src/slic3r/GUI/GUI_App.cpp:1224 msgid "Choose one file (3MF/AMF):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:563 +#: src/slic3r/GUI/GUI_App.cpp:1236 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:625 +#: src/slic3r/GUI/GUI_App.cpp:1248 +msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1259 +msgid "Changing of an application language" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1309 msgid "Select the language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:625 +#: src/slic3r/GUI/GUI_App.cpp:1309 msgid "Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:796 +#: src/slic3r/GUI/GUI_App.cpp:1439 +msgid "modified" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1488 +#, possible-c-format +msgid "Run %s" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1492 msgid "&Configuration Snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:796 +#: src/slic3r/GUI/GUI_App.cpp:1492 msgid "Inspect / activate configuration snapshots" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:797 +#: src/slic3r/GUI/GUI_App.cpp:1493 msgid "Take Configuration &Snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:797 +#: src/slic3r/GUI/GUI_App.cpp:1493 msgid "Capture a configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:800 +#: src/slic3r/GUI/GUI_App.cpp:1494 +msgid "Check for updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1494 +msgid "Check for configuration updates" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1497 msgid "&Preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:806 +#: src/slic3r/GUI/GUI_App.cpp:1503 msgid "Application preferences" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:809 src/slic3r/GUI/wxExtensions.cpp:3043 +#: src/slic3r/GUI/GUI_App.cpp:1508 src/slic3r/GUI/wxExtensions.cpp:673 msgid "Simple" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:809 +#: src/slic3r/GUI/GUI_App.cpp:1508 msgid "Simple View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:810 src/slic3r/GUI/GUI_ObjectList.cpp:97 -#: src/slic3r/GUI/GUI_ObjectList.cpp:620 src/slic3r/GUI/Tab.cpp:1061 -#: src/slic3r/GUI/Tab.cpp:1076 src/slic3r/GUI/Tab.cpp:1174 -#: src/slic3r/GUI/Tab.cpp:1177 src/slic3r/GUI/Tab.cpp:1685 -#: src/slic3r/GUI/Tab.cpp:2169 src/slic3r/GUI/Tab.cpp:3785 -#: src/slic3r/GUI/wxExtensions.cpp:3044 src/libslic3r/PrintConfig.cpp:83 -#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:360 -#: src/libslic3r/PrintConfig.cpp:1013 src/libslic3r/PrintConfig.cpp:2226 +#: src/slic3r/GUI/GUI_App.cpp:1510 src/slic3r/GUI/wxExtensions.cpp:675 +msgctxt "Mode" msgid "Advanced" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:810 +#: src/slic3r/GUI/GUI_App.cpp:1510 msgid "Advanced View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:811 src/slic3r/GUI/wxExtensions.cpp:3045 +#: src/slic3r/GUI/GUI_App.cpp:1511 src/slic3r/GUI/wxExtensions.cpp:676 msgid "Expert" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:811 +#: src/slic3r/GUI/GUI_App.cpp:1511 msgid "Expert View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:816 +#: src/slic3r/GUI/GUI_App.cpp:1516 msgid "Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:816 +#: src/slic3r/GUI/GUI_App.cpp:1516 #, possible-c-format msgid "%s View Mode" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:818 -msgid "Change Application &Language" +#: src/slic3r/GUI/GUI_App.cpp:1519 +msgid "&Language" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:820 +#: src/slic3r/GUI/GUI_App.cpp:1522 msgid "Flash printer &firmware" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:820 +#: src/slic3r/GUI/GUI_App.cpp:1522 msgid "Upload a firmware image into an Arduino based printer" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:832 +#: src/slic3r/GUI/GUI_App.cpp:1538 msgid "Taking configuration snapshot" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:832 +#: src/slic3r/GUI/GUI_App.cpp:1538 msgid "Snapshot name" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:875 +#: src/slic3r/GUI/GUI_App.cpp:1600 +msgid "Language selection" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1602 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:877 +#: src/slic3r/GUI/GUI_App.cpp:1604 msgid "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:878 -msgid "Language selection" -msgstr "" - -#: src/slic3r/GUI/GUI_App.cpp:901 +#: src/slic3r/GUI/GUI_App.cpp:1631 msgid "&Configuration" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:923 -msgid "The presets on the following tabs were modified" +#: src/slic3r/GUI/GUI_App.cpp:1662 +msgid "The preset(s) modifications are successfully saved" msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:923 src/slic3r/GUI/Tab.cpp:3133 -msgid "Discard changes and continue anyway?" +#: src/slic3r/GUI/GUI_App.cpp:1862 src/slic3r/GUI/Tab.cpp:3205 +msgid "It's impossible to print multi-part object(s) with SLA technology." msgstr "" -#: src/slic3r/GUI/GUI_App.cpp:926 -msgid "Unsaved Presets" +#: src/slic3r/GUI/GUI_App.cpp:1863 +msgid "Please check and fix your object list." msgstr "" -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +#: src/slic3r/GUI/GUI_App.cpp:1864 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210 +#: src/slic3r/GUI/Plater.cpp:2347 src/slic3r/GUI/Tab.cpp:3207 +msgid "Attention!" +msgstr "" + +#: src/slic3r/GUI/GUI_App.cpp:1881 +msgid "Select a gcode file:" +msgstr "" + +#: 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:27 src/slic3r/GUI/Tab.cpp:1033 -#: src/libslic3r/PrintConfig.cpp:66 -msgid "Layer height" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153 +#: 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:88 -#: src/slic3r/GUI/GUI_ObjectList.cpp:611 src/libslic3r/PrintConfig.cpp:67 -#: src/libslic3r/PrintConfig.cpp:160 src/libslic3r/PrintConfig.cpp:392 -#: src/libslic3r/PrintConfig.cpp:453 src/libslic3r/PrintConfig.cpp:461 -#: src/libslic3r/PrintConfig.cpp:867 src/libslic3r/PrintConfig.cpp:1051 -#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1420 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:2037 -#: src/libslic3r/PrintConfig.cpp:2095 +#: 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:513 +#: src/libslic3r/PrintConfig.cpp:521 src/libslic3r/PrintConfig.cpp:939 +#: src/libslic3r/PrintConfig.cpp:1128 src/libslic3r/PrintConfig.cpp:1493 +#: src/libslic3r/PrintConfig.cpp:1560 src/libslic3r/PrintConfig.cpp:1741 +#: src/libslic3r/PrintConfig.cpp:2208 src/libslic3r/PrintConfig.cpp:2267 +#: src/libslic3r/PrintConfig.cpp:2276 msgid "Layers and Perimeters" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:89 -#: src/slic3r/GUI/GUI_ObjectList.cpp:612 src/slic3r/GUI/Plater.cpp:497 -#: src/slic3r/GUI/Tab.cpp:1065 src/slic3r/GUI/Tab.cpp:1066 -#: src/libslic3r/PrintConfig.cpp:177 src/libslic3r/PrintConfig.cpp:400 -#: src/libslic3r/PrintConfig.cpp:420 src/libslic3r/PrintConfig.cpp:754 -#: src/libslic3r/PrintConfig.cpp:768 src/libslic3r/PrintConfig.cpp:805 -#: src/libslic3r/PrintConfig.cpp:958 src/libslic3r/PrintConfig.cpp:968 -#: src/libslic3r/PrintConfig.cpp:986 src/libslic3r/PrintConfig.cpp:1004 -#: src/libslic3r/PrintConfig.cpp:1023 src/libslic3r/PrintConfig.cpp:1708 -#: src/libslic3r/PrintConfig.cpp:1725 -msgid "Infill" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:90 -#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/slic3r/GUI/GUI_Preview.cpp:244 -#: src/slic3r/GUI/Tab.cpp:1094 src/slic3r/GUI/Tab.cpp:1095 -#: src/libslic3r/PrintConfig.cpp:344 src/libslic3r/PrintConfig.cpp:1481 -#: src/libslic3r/PrintConfig.cpp:1830 src/libslic3r/PrintConfig.cpp:1836 -#: src/libslic3r/PrintConfig.cpp:1844 src/libslic3r/PrintConfig.cpp:1856 -#: src/libslic3r/PrintConfig.cpp:1866 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:1889 src/libslic3r/PrintConfig.cpp:1910 -#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1937 -#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1955 -#: src/libslic3r/PrintConfig.cpp:1966 src/libslic3r/PrintConfig.cpp:1980 -#: src/libslic3r/PrintConfig.cpp:1988 src/libslic3r/PrintConfig.cpp:1989 -#: src/libslic3r/PrintConfig.cpp:1998 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/GCode/PreviewData.cpp:156 +#: 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:306 +#: src/slic3r/GUI/Tab.cpp:1458 src/slic3r/GUI/Tab.cpp:1460 +#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:352 +#: src/libslic3r/PrintConfig.cpp:411 src/libslic3r/PrintConfig.cpp:1621 +#: src/libslic3r/PrintConfig.cpp:1999 src/libslic3r/PrintConfig.cpp:2005 +#: src/libslic3r/PrintConfig.cpp:2013 src/libslic3r/PrintConfig.cpp:2025 +#: src/libslic3r/PrintConfig.cpp:2035 src/libslic3r/PrintConfig.cpp:2043 +#: src/libslic3r/PrintConfig.cpp:2058 src/libslic3r/PrintConfig.cpp:2079 +#: src/libslic3r/PrintConfig.cpp:2091 src/libslic3r/PrintConfig.cpp:2107 +#: src/libslic3r/PrintConfig.cpp:2116 src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2136 src/libslic3r/PrintConfig.cpp:2150 +#: src/libslic3r/PrintConfig.cpp:2158 src/libslic3r/PrintConfig.cpp:2159 +#: src/libslic3r/PrintConfig.cpp:2168 src/libslic3r/PrintConfig.cpp:2176 +#: src/libslic3r/PrintConfig.cpp:2190 msgid "Support material" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:94 -#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/libslic3r/PrintConfig.cpp:2202 -#: src/libslic3r/PrintConfig.cpp:2210 +#: 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:2386 +#: src/libslic3r/PrintConfig.cpp:2394 msgid "Wipe options" msgstr "" @@ -1474,571 +2759,649 @@ msgstr "" msgid "Add support blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:91 src/slic3r/GUI/GUI_ObjectList.cpp:614 -#: src/slic3r/GUI/GUI_Preview.cpp:223 src/slic3r/GUI/Tab.cpp:1119 -#: src/libslic3r/PrintConfig.cpp:209 src/libslic3r/PrintConfig.cpp:441 -#: src/libslic3r/PrintConfig.cpp:896 src/libslic3r/PrintConfig.cpp:1024 -#: src/libslic3r/PrintConfig.cpp:1410 src/libslic3r/PrintConfig.cpp:1647 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1747 -#: src/libslic3r/PrintConfig.cpp:2080 +#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:653 +#: src/slic3r/GUI/GUI_Preview.cpp:302 src/slic3r/GUI/Tab.cpp:1428 +#: src/libslic3r/ExtrusionEntity.cpp:316 src/libslic3r/ExtrusionEntity.cpp:344 +#: src/libslic3r/PrintConfig.cpp:1135 src/libslic3r/PrintConfig.cpp:1141 +#: src/libslic3r/PrintConfig.cpp:1155 src/libslic3r/PrintConfig.cpp:1165 +#: src/libslic3r/PrintConfig.cpp:1173 src/libslic3r/PrintConfig.cpp:1175 +msgid "Ironing" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:655 +#: src/slic3r/GUI/GUI_Preview.cpp:273 src/slic3r/GUI/Tab.cpp:1484 +#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:501 +#: src/libslic3r/PrintConfig.cpp:970 src/libslic3r/PrintConfig.cpp:1101 +#: src/libslic3r/PrintConfig.cpp:1174 src/libslic3r/PrintConfig.cpp:1550 +#: src/libslic3r/PrintConfig.cpp:1822 src/libslic3r/PrintConfig.cpp:1874 +#: src/libslic3r/PrintConfig.cpp:2252 msgid "Speed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:92 src/slic3r/GUI/GUI_ObjectList.cpp:615 -#: src/slic3r/GUI/Tab.cpp:1154 src/slic3r/GUI/Tab.cpp:2043 -#: src/libslic3r/PrintConfig.cpp:471 src/libslic3r/PrintConfig.cpp:979 -#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1717 -#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1928 +#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:656 +#: src/slic3r/GUI/Tab.cpp:1520 src/slic3r/GUI/Tab.cpp:2085 +#: src/libslic3r/PrintConfig.cpp:531 src/libslic3r/PrintConfig.cpp:1055 +#: src/libslic3r/PrintConfig.cpp:1528 src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:2071 src/libslic3r/PrintConfig.cpp:2098 msgid "Extruders" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:93 src/slic3r/GUI/GUI_ObjectList.cpp:616 -#: src/libslic3r/PrintConfig.cpp:431 src/libslic3r/PrintConfig.cpp:538 -#: src/libslic3r/PrintConfig.cpp:855 src/libslic3r/PrintConfig.cpp:987 -#: src/libslic3r/PrintConfig.cpp:1398 src/libslic3r/PrintConfig.cpp:1737 -#: src/libslic3r/PrintConfig.cpp:1911 src/libslic3r/PrintConfig.cpp:2069 +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:657 +#: src/libslic3r/PrintConfig.cpp:490 src/libslic3r/PrintConfig.cpp:598 +#: src/libslic3r/PrintConfig.cpp:926 src/libslic3r/PrintConfig.cpp:1063 +#: src/libslic3r/PrintConfig.cpp:1537 src/libslic3r/PrintConfig.cpp:1863 +#: src/libslic3r/PrintConfig.cpp:2080 src/libslic3r/PrintConfig.cpp:2240 msgid "Extrusion Width" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:622 -#: src/slic3r/GUI/Plater.cpp:465 src/slic3r/GUI/Tab.cpp:3737 -#: src/slic3r/GUI/Tab.cpp:3738 src/libslic3r/PrintConfig.cpp:2501 -#: src/libslic3r/PrintConfig.cpp:2508 src/libslic3r/PrintConfig.cpp:2517 -#: src/libslic3r/PrintConfig.cpp:2526 src/libslic3r/PrintConfig.cpp:2536 -#: src/libslic3r/PrintConfig.cpp:2562 src/libslic3r/PrintConfig.cpp:2569 -#: src/libslic3r/PrintConfig.cpp:2580 src/libslic3r/PrintConfig.cpp:2590 -#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2612 -#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:2631 -#: src/libslic3r/PrintConfig.cpp:2641 src/libslic3r/PrintConfig.cpp:2652 -#: src/libslic3r/PrintConfig.cpp:2660 +#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:661 +#: src/slic3r/GUI/Tab.cpp:1416 src/slic3r/GUI/Tab.cpp:1438 +#: src/slic3r/GUI/Tab.cpp:1541 src/slic3r/GUI/Tab.cpp:1544 +#: src/slic3r/GUI/Tab.cpp:1828 src/slic3r/GUI/Tab.cpp:2165 +#: src/slic3r/GUI/Tab.cpp:4077 src/libslic3r/PrintConfig.cpp:90 +#: src/libslic3r/PrintConfig.cpp:128 src/libslic3r/PrintConfig.cpp:264 +#: src/libslic3r/PrintConfig.cpp:1090 src/libslic3r/PrintConfig.cpp:2410 +#: src/libslic3r/PrintConfig.cpp:2582 +msgid "Advanced" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:663 +#: src/slic3r/GUI/Plater.cpp:356 src/slic3r/GUI/Tab.cpp:4011 +#: src/slic3r/GUI/Tab.cpp:4012 src/libslic3r/PrintConfig.cpp:2748 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2764 +#: src/libslic3r/PrintConfig.cpp:2773 src/libslic3r/PrintConfig.cpp:2783 +#: src/libslic3r/PrintConfig.cpp:2793 src/libslic3r/PrintConfig.cpp:2830 +#: src/libslic3r/PrintConfig.cpp:2837 src/libslic3r/PrintConfig.cpp:2848 +#: src/libslic3r/PrintConfig.cpp:2858 src/libslic3r/PrintConfig.cpp:2867 +#: src/libslic3r/PrintConfig.cpp:2880 src/libslic3r/PrintConfig.cpp:2890 +#: src/libslic3r/PrintConfig.cpp:2899 src/libslic3r/PrintConfig.cpp:2909 +#: src/libslic3r/PrintConfig.cpp:2920 src/libslic3r/PrintConfig.cpp:2928 msgid "Supports" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:623 -#: src/slic3r/GUI/Plater.cpp:603 src/slic3r/GUI/Tab.cpp:3769 -#: src/slic3r/GUI/Tab.cpp:3770 src/libslic3r/PrintConfig.cpp:2668 -#: src/libslic3r/PrintConfig.cpp:2675 src/libslic3r/PrintConfig.cpp:2689 -#: src/libslic3r/PrintConfig.cpp:2699 src/libslic3r/PrintConfig.cpp:2721 -#: src/libslic3r/PrintConfig.cpp:2732 src/libslic3r/PrintConfig.cpp:2739 -#: src/libslic3r/PrintConfig.cpp:2750 src/libslic3r/PrintConfig.cpp:2759 -#: src/libslic3r/PrintConfig.cpp:2768 +#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:664 +#: src/slic3r/GUI/Plater.cpp:496 src/slic3r/GUI/Tab.cpp:4052 +#: src/slic3r/GUI/Tab.cpp:4053 src/slic3r/GUI/Tab.cpp:4124 +#: src/libslic3r/PrintConfig.cpp:2936 src/libslic3r/PrintConfig.cpp:2943 +#: src/libslic3r/PrintConfig.cpp:2957 src/libslic3r/PrintConfig.cpp:2968 +#: src/libslic3r/PrintConfig.cpp:2978 src/libslic3r/PrintConfig.cpp:3000 +#: src/libslic3r/PrintConfig.cpp:3011 src/libslic3r/PrintConfig.cpp:3018 +#: src/libslic3r/PrintConfig.cpp:3025 src/libslic3r/PrintConfig.cpp:3036 +#: src/libslic3r/PrintConfig.cpp:3045 src/libslic3r/PrintConfig.cpp:3054 msgid "Pad" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:260 +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4070 +#: src/slic3r/GUI/Tab.cpp:4071 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:3064 +#: src/libslic3r/PrintConfig.cpp:3071 src/libslic3r/PrintConfig.cpp:3081 +#: src/libslic3r/PrintConfig.cpp:3090 +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:271 src/slic3r/GUI/GUI_ObjectList.cpp:373 +#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectList.cpp:441 msgid "Editing" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:318 +#: src/slic3r/GUI/GUI_ObjectList.cpp:386 #, possible-c-format -msgid "Auto-repaired (%d errors):\n" +msgid "Auto-repaired (%d errors):" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:325 +#: src/slic3r/GUI/GUI_ObjectList.cpp:393 msgid "degenerate facets" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:326 +#: src/slic3r/GUI/GUI_ObjectList.cpp:394 msgid "edges fixed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:327 +#: src/slic3r/GUI/GUI_ObjectList.cpp:395 msgid "facets removed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:328 +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 msgid "facets added" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:329 +#: src/slic3r/GUI/GUI_ObjectList.cpp:397 msgid "facets reversed" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:330 +#: src/slic3r/GUI/GUI_ObjectList.cpp:398 msgid "backwards edges" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:338 +#: 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:375 +#: 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:377 +#: src/slic3r/GUI/GUI_ObjectList.cpp:445 msgid "Click the icon to change the object settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:381 +#: 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:383 +#: src/slic3r/GUI/GUI_ObjectList.cpp:451 msgid "Click the icon to change the object printable property" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:428 src/slic3r/GUI/GUI_ObjectList.cpp:449 -#: src/slic3r/GUI/GUI_ObjectList.cpp:461 src/slic3r/GUI/GUI_ObjectList.cpp:3642 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3652 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3684 src/slic3r/GUI/wxExtensions.cpp:603 -#: src/slic3r/GUI/wxExtensions.cpp:660 src/slic3r/GUI/wxExtensions.cpp:685 -#: src/slic3r/GUI/wxExtensions.cpp:893 -msgid "default" +#: src/slic3r/GUI/GUI_ObjectList.cpp:574 +msgid "Change Extruder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:433 src/slic3r/GUI/Tab.cpp:1649 -#: src/libslic3r/PrintConfig.cpp:470 -msgid "Extruder" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:546 +#: src/slic3r/GUI/GUI_ObjectList.cpp:589 msgid "Rename Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:546 +#: src/slic3r/GUI/GUI_ObjectList.cpp:589 msgid "Rename Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:987 src/slic3r/GUI/GUI_ObjectList.cpp:3464 +#: 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:1005 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 msgid "Volumes in Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1005 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 msgid "Object reordered" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1060 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1376 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1382 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1623 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1306 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1661 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1667 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2008 #, possible-c-format msgid "Quick Add Settings (%s)" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1137 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1396 msgid "Select showing settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1186 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1445 msgid "Add Settings for Layers" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1187 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 msgid "Add Settings for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1188 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1447 msgid "Add Settings for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1249 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1517 msgid "Add Settings Bundle for Height range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1250 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1518 msgid "Add Settings Bundle for Sub-object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1251 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1519 msgid "Add Settings Bundle for Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1290 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1558 msgid "Load" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1295 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1320 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1323 +#: 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:1295 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 msgid "Cylinder" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1295 -msgid "Sphere" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1295 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 msgid "Slab" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1347 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1631 msgid "Height range Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1355 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1640 msgid "Add settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1422 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1718 msgid "Change type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1429 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1577 +#: 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:1435 -msgid "Printable" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1442 -msgid "Rename" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1453 -msgid "Fix through the Netfabb" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1463 src/slic3r/GUI/Plater.cpp:3552 -msgid "Export as STL" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1470 -msgid "Change extruder" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1489 src/libslic3r/PrintConfig.cpp:309 -msgid "Default" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1495 -msgid "Select new extruder for the object/part" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1507 -msgid "Scale to print volume" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1507 -msgid "Scale the selected object to fit the print volume" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:1577 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1740 msgid "Set as a Separated Objects" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1652 +#: 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 "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1786 src/slic3r/GUI/Plater.cpp:3985 +msgid "Export as STL" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1793 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3953 +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:4994 +msgid "Convert from imperial units" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1861 src/slic3r/GUI/Plater.cpp:4994 +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:3633 +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:1687 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2077 msgid "Error!" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1732 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2152 msgid "Add Generic Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1739 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2181 msgid "Generic" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1843 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1945 +#: 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:1855 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2319 msgid "Delete Settings" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1879 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2341 msgid "Delete All Instances from Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1895 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2357 msgid "Delete Height Range" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1926 +#: 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:1930 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2393 msgid "Delete Subobject" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1949 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 msgid "Delete Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1973 src/slic3r/GUI/Plater.cpp:2838 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2436 src/slic3r/GUI/Plater.cpp:2862 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1977 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2440 msgid "Split to Parts" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2025 +#: 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:2150 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2846 msgid "Group manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2162 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2858 msgid "Object manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2175 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2871 msgid "Object Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2179 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 msgid "Part Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2184 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2880 msgid "Layer range Settings to modify" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2190 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2886 msgid "Part manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2196 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2892 msgid "Instance manipulation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2203 +#: 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:2388 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3083 msgid "Delete Selected Item" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2525 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3221 msgid "Delete Selected" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2584 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2613 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2631 +#: 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:2690 +#: 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:2974 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3754 msgid "Selection-Remove from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2982 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3762 msgid "Selection-Add from list" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3100 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3880 msgid "Object or Instance" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3101 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3234 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3881 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 msgid "Part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3101 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3881 msgid "Layer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3103 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3883 msgid "Unsupported selection" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3104 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3884 #, possible-c-format msgid "You started your selection with %s Item." msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3105 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3885 #, possible-c-format msgid "In this mode you can select only other %s Items%s" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3108 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3888 msgid "of a current Object" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3113 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3188 src/slic3r/GUI/Plater.cpp:126 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3893 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3968 src/slic3r/GUI/Plater.cpp:142 msgid "Info" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3229 +#: 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:3234 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 msgid "Modifier" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3234 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 msgid "Support Enforcer" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3234 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 msgid "Support Blocker" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3236 -msgid "Type:" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3236 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 msgid "Select type of part" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3241 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4021 msgid "Change Part Type" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4266 msgid "Enter new name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3486 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4266 msgid "Renaming" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3502 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3608 src/slic3r/GUI/Tab.cpp:3618 -#: src/slic3r/GUI/Tab.cpp:3622 +#: 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:3503 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3609 src/slic3r/GUI/Tab.cpp:3619 +#: 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:3632 -msgid "Set extruder for selected items" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3633 -msgid "Select extruder number for selected objects and/or parts" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3646 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4458 msgid "Select extruder number:" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3647 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4459 msgid "This extruder will be set for selected items" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3759 src/slic3r/GUI/Selection.cpp:1473 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4484 +msgid "Change Extruders" +msgstr "" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1531 msgid "Set Printable" msgstr "" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3759 src/slic3r/GUI/Selection.cpp:1473 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1531 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:125 -msgid "Object Manipulation" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:178 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:621 msgid "Object name" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:214 +#: 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 #, possible-c-format msgid "Toggle %c axis mirroring" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:247 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305 msgid "Set Mirror" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:287 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:292 -msgid "Reset scale" +#: 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:305 -msgid "Reset rotation" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:330 -msgid "Reset Rotation" -msgstr "" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:342 +#: 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:390 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:454 -msgid "Position" +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372 +msgid "Reset rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:391 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:455 -msgid "Rotation" +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394 +msgid "Reset Rotation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:456 +#: 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:513 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561 msgid "Translate" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:565 +#: 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:735 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797 msgid "Set Position" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:766 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828 msgid "Set Orientation" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:831 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893 msgid "Set Scale" msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:915 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -2047,965 +3410,1352 @@ msgid "" "once the rotation is embedded into the object coordinates." msgstr "" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:918 +#: 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:146 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157 #, possible-c-format msgid "Change Option %s" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:217 +#: src/slic3r/GUI/GUI_Preview.cpp:260 src/slic3r/GUI/GUI_Preview.cpp:266 msgid "View" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:220 src/slic3r/GUI/GUI_Preview.cpp:569 -#: src/libslic3r/GCode/PreviewData.cpp:378 -msgid "Feature type" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/libslic3r/PrintConfig.cpp:483 +#: src/slic3r/GUI/GUI_Preview.cpp:271 src/libslic3r/PrintConfig.cpp:543 msgid "Height" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:2188 +#: src/slic3r/GUI/GUI_Preview.cpp:272 src/libslic3r/PrintConfig.cpp:2372 msgid "Width" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:224 +#: src/slic3r/GUI/GUI_Preview.cpp:274 src/slic3r/GUI/Tab.cpp:1814 +msgid "Fan speed" +msgstr "" + +#: src/slic3r/GUI/GUI_Preview.cpp:275 msgid "Volumetric flow rate" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/GUI_Preview.cpp:333 -#: src/slic3r/GUI/GUI_Preview.cpp:515 src/slic3r/GUI/GUI_Preview.cpp:568 -#: src/slic3r/GUI/GUI_Preview.cpp:774 src/libslic3r/GCode/PreviewData.cpp:388 -msgid "Tool" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:226 src/slic3r/GUI/GUI_Preview.cpp:566 -#: src/libslic3r/GCode/PreviewData.cpp:390 -msgid "Color Print" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:229 +#: src/slic3r/GUI/GUI_Preview.cpp:281 src/slic3r/GUI/GUI_Preview.cpp:283 msgid "Show" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/slic3r/GUI/GUI_Preview.cpp:233 +#: src/slic3r/GUI/GUI_Preview.cpp:288 src/slic3r/GUI/GUI_Preview.cpp:290 +#: src/slic3r/GUI/GUI_Preview.cpp:311 msgid "Feature types" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/GCode/PreviewData.cpp:147 +#: src/slic3r/GUI/GUI_Preview.cpp:296 src/libslic3r/ExtrusionEntity.cpp:310 +#: src/libslic3r/ExtrusionEntity.cpp:332 msgid "Perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/libslic3r/GCode/PreviewData.cpp:148 +#: src/slic3r/GUI/GUI_Preview.cpp:297 src/libslic3r/ExtrusionEntity.cpp:311 +#: src/libslic3r/ExtrusionEntity.cpp:334 msgid "External perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/GCode/PreviewData.cpp:149 +#: src/slic3r/GUI/GUI_Preview.cpp:298 src/libslic3r/ExtrusionEntity.cpp:312 +#: src/libslic3r/ExtrusionEntity.cpp:336 msgid "Overhang perimeter" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/GCode/PreviewData.cpp:150 +#: src/slic3r/GUI/GUI_Preview.cpp:299 src/libslic3r/ExtrusionEntity.cpp:313 +#: src/libslic3r/ExtrusionEntity.cpp:338 msgid "Internal infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/PrintConfig.cpp:1736 -#: src/libslic3r/PrintConfig.cpp:1746 src/libslic3r/GCode/PreviewData.cpp:151 +#: src/slic3r/GUI/GUI_Preview.cpp:300 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:1862 +#: src/libslic3r/PrintConfig.cpp:1873 msgid "Solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/PrintConfig.cpp:2068 -#: src/libslic3r/PrintConfig.cpp:2079 src/libslic3r/GCode/PreviewData.cpp:152 +#: src/slic3r/GUI/GUI_Preview.cpp:301 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2239 +#: src/libslic3r/PrintConfig.cpp:2251 msgid "Top solid infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/GCode/PreviewData.cpp:153 +#: src/slic3r/GUI/GUI_Preview.cpp:303 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/ExtrusionEntity.cpp:346 msgid "Bridge infill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/PrintConfig.cpp:895 -#: src/libslic3r/GCode/PreviewData.cpp:154 +#: src/slic3r/GUI/GUI_Preview.cpp:304 src/libslic3r/ExtrusionEntity.cpp:318 +#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:969 msgid "Gap fill" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/slic3r/GUI/Tab.cpp:1085 -#: src/libslic3r/GCode/PreviewData.cpp:155 +#: src/slic3r/GUI/GUI_Preview.cpp:305 src/slic3r/GUI/Tab.cpp:1448 +#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/ExtrusionEntity.cpp:350 msgid "Skirt" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:245 src/libslic3r/PrintConfig.cpp:1954 -#: src/libslic3r/GCode/PreviewData.cpp:157 +#: src/slic3r/GUI/GUI_Preview.cpp:307 src/libslic3r/ExtrusionEntity.cpp:321 +#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2124 msgid "Support material interface" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:246 src/slic3r/GUI/Tab.cpp:1165 -#: src/libslic3r/GCode/PreviewData.cpp:158 +#: src/slic3r/GUI/GUI_Preview.cpp:308 src/slic3r/GUI/Tab.cpp:1531 +#: src/libslic3r/ExtrusionEntity.cpp:322 src/libslic3r/ExtrusionEntity.cpp:356 msgid "Wipe tower" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:251 src/libslic3r/PrintConfig.cpp:2102 -msgid "Travel" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:252 -msgid "Retractions" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:253 -msgid "Unretractions" -msgstr "" - -#: src/slic3r/GUI/GUI_Preview.cpp:254 +#: src/slic3r/GUI/GUI_Preview.cpp:333 src/slic3r/GUI/GUI_Preview.cpp:1473 msgid "Shells" msgstr "" -#: src/slic3r/GUI/GUI_Preview.cpp:255 +#: src/slic3r/GUI/GUI_Preview.cpp:334 msgid "Legend" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:14 src/slic3r/GUI/MainFrame.cpp:683 +#: src/slic3r/GUI/GUI_Preview.cpp:1474 +msgid "Tool marker" +msgstr "" + +#: src/slic3r/GUI/GUI_Preview.cpp:1475 +msgid "Legend/Estimated printing time" +msgstr "" + +#: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:464 +msgid "Use for search" +msgstr "" + +#: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:458 +msgid "Category" +msgstr "" + +#: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:460 +msgid "Search in English" +msgstr "" + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:149 +msgid "Arranging" +msgstr "" + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:176 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "" + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182 +msgid "Arranging canceled." +msgstr "" + +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 +msgid "Arranging done." +msgstr "" + +#: src/slic3r/GUI/Jobs/Job.cpp: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:2345 +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:2346 +#: src/slic3r/GUI/Tab.cpp:3206 +msgid "Please check your object list before preset changing." +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:37 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:39 src/slic3r/GUI/MainFrame.cpp:953 +#: src/slic3r/GUI/MainFrame.cpp:1344 msgid "Keyboard Shortcuts" msgstr "" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 +msgid "New project, clear plater" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 +msgid "Open project STL/OBJ/AMF/3MF with config, clear plater" +msgstr "" + #: src/slic3r/GUI/KBShortcutsDialog.cpp:107 -msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" +msgid "Save project (3mf)" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:108 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" +msgid "Save project as (3mf)" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:109 -msgid "Load Config from .ini/amf/3mf/gcode" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 src/slic3r/GUI/Plater.cpp:837 -#: src/slic3r/GUI/Plater.cpp:4822 src/libslic3r/PrintConfig.cpp:3163 -msgid "Export G-code" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 -msgid "Save project (3MF)" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 -msgid "Load Config from .ini/amf/3mf/gcode and merge" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 msgid "(Re)slice" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 -msgid "Select Plater Tab" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +msgid "Import STL/OBJ/AMF/3MF without config, keep plater" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 -msgid "Select Print Settings Tab" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +msgid "Import Config from ini/amf/3mf/gcode" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +msgid "Load Config from ini/amf/3mf/gcode and merge" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Plater.cpp:762 +#: src/slic3r/GUI/Plater.cpp:5849 src/libslic3r/PrintConfig.cpp:3538 +msgid "Export G-code" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Plater.cpp:5850 +msgid "Send G-code" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +msgid "Export config" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 src/slic3r/GUI/Plater.cpp:750 +msgid "Export to SD card / Flash drive" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:119 -msgid "Select Filament Settings Tab" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 -msgid "Select Printer Settings Tab" +msgid "Eject SD card / Flash drive" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:121 -msgid "Switch to 3D" +msgid "Select all objects" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:122 -msgid "Switch to Preview" +msgid "Deselect all" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:10 -msgid "Preferences" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 -#: src/slic3r/GUI/PrintHostDialogs.cpp:136 -msgid "Print host upload queue" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 -msgid "Camera view" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 -msgid "Add Instance of the selected object" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 -msgid "Remove Instance of the selected object" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 -msgid "Show keyboard shortcuts list" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -msgid "Press to select multiple object or move multiple object with mouse" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 -msgid "Main Shortcuts" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 -msgid "Select All objects" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 msgid "Delete selected" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -msgid "Delete All" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Copy to clipboard" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 msgid "Paste from clipboard" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 -msgid "Gizmo move" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +msgid "Reload plater from disk" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 +msgid "Select Plater Tab" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 +msgid "Select Print Settings Tab" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +msgid "Select Filament Settings Tab" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +msgid "Select Printer Settings Tab" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +msgid "Switch to 3D" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +msgid "Switch to Preview" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/PrintHostDialogs.cpp:163 +msgid "Print host upload queue" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +msgid "Camera view" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +msgid "Show/Hide object/instance labels" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 src/slic3r/GUI/Preferences.cpp:12 +msgid "Preferences" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:145 -msgid "Gizmo scale" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 -msgid "Gizmo rotate" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Gizmo cut" +msgid "Show keyboard shortcuts list" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:148 -msgid "Gizmo Place face on bed" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 -msgid "Gizmo SLA support points" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -#, possible-c-format -msgid "" -"Press to activate selection rectangle\n" -"or to snap by 5% in Gizmo scale\n" -"or to snap by 1mm in Gizmo move" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 -msgid "" -"Press to scale selection to fit print volume\n" -"in Gizmo scale" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 -msgid "" -"Press to activate deselection rectangle\n" -"or to scale or rotate selected objects\n" -"around their own center" +msgid "Commands" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:153 -msgid "Press to activate one direction scaling in Gizmo scale" +msgid "Add Instance of the selected object" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -msgid "Change camera type (perspective, orthographic)" +msgid "Remove Instance of the selected object" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:155 -msgid "Zoom to Bed" +msgid "" +"Press to select multiple objects\n" +"or move multiple objects with mouse" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:156 -msgid "Zoom to all objects in scene, if none selected" +msgid "Press to activate selection rectangle" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:157 -msgid "Zoom to selected object" +msgid "Press to activate deselection rectangle" msgstr "" #: src/slic3r/GUI/KBShortcutsDialog.cpp:158 -msgid "Zoom in" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 -msgid "Zoom out" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 -msgid "Unselect gizmo / Clear selection" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 -msgid "Plater Shortcuts" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:212 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 msgid "Arrow Up" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 -msgid "Upper Layer" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 +msgid "Move selection 10 mm in positive Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 msgid "Arrow Down" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 -msgid "Lower Layer" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +msgid "Move selection 10 mm in negative Y direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 -msgid "Show/Hide (L)egend" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 -msgid "Preview Shortcuts" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:193 -msgid "Move current slider thumb Up" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 -msgid "Move current slider thumb Down" -msgstr "" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 msgid "Arrow Left" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:195 -msgid "Set upper thumb to current slider thumb" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +msgid "Move selection 10 mm in negative X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 msgid "Arrow Right" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 -msgid "Set lower thumb to current slider thumb" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +msgid "Move selection 10 mm in positive X direction" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 -msgid "Add color change marker for current layer" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +msgid "Any arrow" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 -msgid "Delete color change marker for current layer" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +msgid "Movement step set to 1 mm" msgstr "" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 -msgid "Layers Slider Shortcuts" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +msgid "Movement in camera space" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:64 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +msgid "Page Up" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +msgid "Rotate selection 45 degrees CCW" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +msgid "Page Down" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +msgid "Rotate selection 45 degrees CW" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Gizmo move" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +msgid "Gizmo scale" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +msgid "Gizmo rotate" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Gizmo cut" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Gizmo Place face on bed" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +msgid "Gizmo SLA hollow" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +msgid "Gizmo SLA support points" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +msgid "Unselect gizmo or clear selection" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +msgid "Change camera type (perspective, orthographic)" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 +msgid "Zoom to Bed" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "" -" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" -"releases" +"Zoom to selected object\n" +"or all objects in scene, if none selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:159 -msgid "based on Slic3r" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +msgid "Zoom in" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +msgid "Zoom out" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Switch between Editor/Preview" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 +msgid "Collapse/Expand the sidebar" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 src/slic3r/GUI/MainFrame.cpp:351 +#: src/slic3r/GUI/MainFrame.cpp:363 msgid "Plater" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:400 -msgid "&New Project" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:400 -msgid "Start a new project" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +msgid "Gizmo move: Press to snap by 1mm" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:403 -msgid "&Open Project" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 +msgid "Gizmo scale: Press to snap by 5%" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:403 -msgid "Open a project file" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 +msgid "Gizmo scale: Scale selection to fit print volume" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:408 -msgid "Recent projects" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +msgid "Gizmo scale: Press to activate one direction scaling" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:417 -msgid "The selected project is no more available" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 +msgid "Gizmo scale: Press to scale selected objects around their own center" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:417 src/slic3r/GUI/MainFrame.cpp:755 -#: src/slic3r/GUI/PrintHostDialogs.cpp:231 -msgid "Error" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 +msgid "Gizmo rotate: Press to rotate selected objects around their own center" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:441 -msgid "&Save Project" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 +msgid "Gizmos" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:441 -msgid "Save current project file" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:212 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 +msgid "Upper Layer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:445 src/slic3r/GUI/MainFrame.cpp:447 -msgid "Save Project &as" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 +msgid "Lower Layer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:445 src/slic3r/GUI/MainFrame.cpp:447 -msgid "Save current project file as" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 +msgid "Show/Hide Legend & Estimated printing time" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:455 -msgid "Import STL/OBJ/AM&F/3MF" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 src/slic3r/GUI/Plater.cpp:4153 +#: src/slic3r/GUI/Tab.cpp:2570 +msgid "Preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:455 -msgid "Load a model" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +msgid "Move current slider thumb Up" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:459 -msgid "Import &Config" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:223 +msgid "Move current slider thumb Down" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:459 -msgid "Load exported configuration file" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +msgid "Set upper thumb to current slider thumb" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:461 -msgid "Import Config from &project" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +msgid "Set lower thumb to current slider thumb" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:461 -msgid "Load configuration from project file" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:226 +msgid "Add color change marker for current layer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:464 -msgid "Import Config &Bundle" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:227 +msgid "Delete color change marker for current layer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:464 -msgid "Load presets from a bundle" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:228 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:238 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:239 +msgid "" +"Press to speed up 5 times while moving thumb\n" +"with arrow keys or mouse wheel" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:466 -msgid "&Import" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "Layers Slider" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:469 src/slic3r/GUI/MainFrame.cpp:719 -msgid "Export &G-code" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:236 +msgid "Move current slider thumb Left" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:469 -msgid "Export current plate as G-code" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:237 +msgid "Move current slider thumb Right" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:473 src/slic3r/GUI/MainFrame.cpp:720 -msgid "S&end G-code" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:242 +msgid "Sequential Slider" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:473 -msgid "Send to print current plate as G-code" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:270 +msgid "Keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:478 -msgid "Export plate as &STL" +#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:1274 +msgid "Open new instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:478 -msgid "Export current plate as STL" +#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:77 +#: src/slic3r/GUI/MainFrame.cpp:1274 +msgid "Open a new PrusaSlicer instance" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:481 -msgid "Export plate as STL &including supports" +#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:79 +msgid "G-code preview" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:481 -msgid "Export current plate as STL including supports" +#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:1153 +msgid "Open G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:484 -msgid "Export plate as &AMF" +#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:1410 +msgid "Open PrusaSlicer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:484 -msgid "Export current plate as AMF" +#: src/slic3r/GUI/MainFrame.cpp:79 +msgid "Open new G-code viewer" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:488 -msgid "Export &toolpaths as OBJ" +#: src/slic3r/GUI/MainFrame.cpp:166 +msgid "" +"Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/" +"releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:488 -msgid "Export toolpaths as OBJ" +#: src/slic3r/GUI/MainFrame.cpp:550 src/slic3r/GUI/MainFrame.cpp:552 +msgid "based on Slic3r" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:492 -msgid "Export &Config" +#: src/slic3r/GUI/MainFrame.cpp:921 src/slic3r/GUI/MainFrame.cpp:1320 +msgid "Prusa 3D &Drivers" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:492 -msgid "Export current configuration to file" +#: src/slic3r/GUI/MainFrame.cpp:921 src/slic3r/GUI/MainFrame.cpp:1320 +msgid "Open the Prusa3D drivers download page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:494 -msgid "Export Config &Bundle" +#: src/slic3r/GUI/MainFrame.cpp:923 src/slic3r/GUI/MainFrame.cpp:1322 +msgid "Software &Releases" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:494 -msgid "Export all presets to file" +#: src/slic3r/GUI/MainFrame.cpp:923 src/slic3r/GUI/MainFrame.cpp:1322 +msgid "Open the software releases page in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:496 -msgid "&Export" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:502 -msgid "Quick Slice" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:502 -msgid "Slice a file into a G-code" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:508 -msgid "Quick Slice and Save As" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:508 -msgid "Slice a file into a G-code, save as" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:514 -msgid "Repeat Last Quick Slice" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:514 -msgid "Repeat last quick slice" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:522 -msgid "(Re)Slice No&w" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:522 -msgid "Start new slicing process" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:526 -msgid "&Repair STL file" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:526 -msgid "Automatically repair an STL file" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:529 -msgid "&Quit" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:529 +#: src/slic3r/GUI/MainFrame.cpp:929 src/slic3r/GUI/MainFrame.cpp:1328 #, possible-c-format -msgid "Quit %s" +msgid "%s &Website" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:554 -msgid "&Select all" +#: src/slic3r/GUI/MainFrame.cpp:930 src/slic3r/GUI/MainFrame.cpp:1329 +#, possible-c-format +msgid "Open the %s website in your browser" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:555 -msgid "Selects all objects" +#: src/slic3r/GUI/MainFrame.cpp:936 src/slic3r/GUI/MainFrame.cpp:1335 +msgid "System &Info" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:557 -msgid "D&eselect all" +#: src/slic3r/GUI/MainFrame.cpp:936 src/slic3r/GUI/MainFrame.cpp:1335 +msgid "Show system information" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:558 -msgid "Deselects all objects" +#: src/slic3r/GUI/MainFrame.cpp:938 src/slic3r/GUI/MainFrame.cpp:1337 +msgid "Show &Configuration Folder" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:561 -msgid "&Delete selected" +#: src/slic3r/GUI/MainFrame.cpp:938 src/slic3r/GUI/MainFrame.cpp:1337 +msgid "Show user configuration folder (datadir)" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:562 -msgid "Deletes the current selection" +#: src/slic3r/GUI/MainFrame.cpp:940 src/slic3r/GUI/MainFrame.cpp:1339 +msgid "Report an I&ssue" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:564 -msgid "Delete &all" +#: src/slic3r/GUI/MainFrame.cpp:940 src/slic3r/GUI/MainFrame.cpp:1339 +#, possible-c-format +msgid "Report an issue on %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:565 -msgid "Deletes all objects" +#: src/slic3r/GUI/MainFrame.cpp:945 src/slic3r/GUI/MainFrame.cpp:949 +#: src/slic3r/GUI/MainFrame.cpp:1341 +#, possible-c-format +msgid "&About %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:569 -msgid "&Undo" +#: src/slic3r/GUI/MainFrame.cpp:945 src/slic3r/GUI/MainFrame.cpp:949 +#: src/slic3r/GUI/MainFrame.cpp:1341 +msgid "Show about dialog" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:572 -msgid "&Redo" +#: src/slic3r/GUI/MainFrame.cpp:953 src/slic3r/GUI/MainFrame.cpp:1344 +msgid "Show the list of the keyboard shortcuts" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:577 -msgid "&Copy" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:578 -msgid "Copy selection to clipboard" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:580 -msgid "&Paste" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:581 -msgid "Paste clipboard" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:590 -msgid "&Plater Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:590 -msgid "Show the plater" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:597 -msgid "P&rint Settings Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:597 -msgid "Show the print settings" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:599 src/slic3r/GUI/MainFrame.cpp:722 -msgid "&Filament Settings Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:599 -msgid "Show the filament settings" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:602 -msgid "Print&er Settings Tab" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:602 -msgid "Show the printer settings" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:606 -msgid "3&D" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:606 -msgid "Show the 3D editing view" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:609 -msgid "Pre&view" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:609 -msgid "Show the 3D slices preview" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:628 -msgid "Print &Host Upload Queue" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:628 -msgid "Display the Print Host Upload Queue window" -msgstr "" - -#: src/slic3r/GUI/MainFrame.cpp:637 +#: src/slic3r/GUI/MainFrame.cpp:967 src/slic3r/GUI/MainFrame.cpp:1287 msgid "Iso" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:637 +#: src/slic3r/GUI/MainFrame.cpp:967 src/slic3r/GUI/MainFrame.cpp:1287 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:641 src/libslic3r/PrintConfig.cpp:2094 +#: src/slic3r/GUI/MainFrame.cpp:971 src/slic3r/GUI/MainFrame.cpp:1291 +#: src/libslic3r/PrintConfig.cpp:2266 src/libslic3r/PrintConfig.cpp:2275 msgid "Top" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:971 src/slic3r/GUI/MainFrame.cpp:1291 msgid "Top View" msgstr "" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" -#: src/slic3r/GUI/MainFrame.cpp:644 src/libslic3r/PrintConfig.cpp:159 +#. TRN To be shown in Print Settings "Top solid layers" +#: src/slic3r/GUI/MainFrame.cpp:974 src/slic3r/GUI/MainFrame.cpp:1294 +#: src/libslic3r/PrintConfig.cpp:215 src/libslic3r/PrintConfig.cpp:224 msgid "Bottom" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:644 +#: src/slic3r/GUI/MainFrame.cpp:974 src/slic3r/GUI/MainFrame.cpp:1294 msgid "Bottom View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:646 +#: src/slic3r/GUI/MainFrame.cpp:976 src/slic3r/GUI/MainFrame.cpp:1296 msgid "Front" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:646 +#: src/slic3r/GUI/MainFrame.cpp:976 src/slic3r/GUI/MainFrame.cpp:1296 msgid "Front View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:648 src/libslic3r/PrintConfig.cpp:1611 +#: src/slic3r/GUI/MainFrame.cpp:978 src/slic3r/GUI/MainFrame.cpp:1298 +#: src/libslic3r/PrintConfig.cpp:1751 msgid "Rear" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:648 +#: src/slic3r/GUI/MainFrame.cpp:978 src/slic3r/GUI/MainFrame.cpp:1298 msgid "Rear View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:650 +#: src/slic3r/GUI/MainFrame.cpp:980 src/slic3r/GUI/MainFrame.cpp:1300 msgid "Left" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:650 +#: src/slic3r/GUI/MainFrame.cpp:980 src/slic3r/GUI/MainFrame.cpp:1300 msgid "Left View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:652 +#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:1302 msgid "Right" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:652 +#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:1302 msgid "Right View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:659 -msgid "Prusa 3D &Drivers" +#: src/slic3r/GUI/MainFrame.cpp:998 +msgid "&New Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:659 -msgid "Open the Prusa3D drivers download page in your browser" +#: src/slic3r/GUI/MainFrame.cpp:998 +msgid "Start a new project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:661 -msgid "Software &Releases" +#: src/slic3r/GUI/MainFrame.cpp:1001 +msgid "&Open Project" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:661 -msgid "Open the software releases page in your browser" +#: src/slic3r/GUI/MainFrame.cpp:1001 +msgid "Open a project file" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:667 +#: src/slic3r/GUI/MainFrame.cpp:1006 +msgid "Recent projects" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1015 +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:1015 src/slic3r/GUI/MainFrame.cpp:1498 +#: src/slic3r/GUI/PrintHostDialogs.cpp:259 +msgid "Error" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1040 +msgid "&Save Project" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1040 +msgid "Save current project file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1044 src/slic3r/GUI/MainFrame.cpp:1046 +msgid "Save Project &as" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1044 src/slic3r/GUI/MainFrame.cpp:1046 +msgid "Save current project file as" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1054 +msgid "Import STL/OBJ/AM&F/3MF" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1054 +msgid "Load a model" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1058 +msgid "Import STL (imperial units)" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1058 +msgid "Load an model saved with imperial units" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1062 +msgid "Import SL1 archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1062 +msgid "Load an SL1 archive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1067 +msgid "Import &Config" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1067 +msgid "Load exported configuration file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1070 +msgid "Import Config from &project" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1070 +msgid "Load configuration from project file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1074 +msgid "Import Config &Bundle" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1074 +msgid "Load presets from a bundle" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1077 +msgid "&Import" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1080 src/slic3r/GUI/MainFrame.cpp:1460 +msgid "Export &G-code" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1080 +msgid "Export current plate as G-code" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1084 src/slic3r/GUI/MainFrame.cpp:1461 +msgid "S&end G-code" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1084 +msgid "Send to print current plate as G-code" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1088 +msgid "Export G-code to SD card / Flash drive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1088 +msgid "Export current plate as G-code to SD card / Flash drive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1092 +msgid "Export plate as &STL" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1092 +msgid "Export current plate as STL" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1095 +msgid "Export plate as STL &including supports" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1095 +msgid "Export current plate as STL including supports" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1098 +msgid "Export plate as &AMF" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1098 +msgid "Export current plate as AMF" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1102 src/slic3r/GUI/MainFrame.cpp:1407 +msgid "Export &toolpaths as OBJ" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1102 src/slic3r/GUI/MainFrame.cpp:1407 +msgid "Export toolpaths as OBJ" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1106 +msgid "Export &Config" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1106 +msgid "Export current configuration to file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1109 +msgid "Export Config &Bundle" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1109 +msgid "Export all presets to file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1112 +msgid "Export Config Bundle With Physical Printers" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1112 +msgid "Export all presets including physical printers to file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1115 +msgid "&Export" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1117 +msgid "Ejec&t SD card / Flash drive" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1117 +msgid "Eject SD card / Flash drive after the G-code was exported to it." +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1125 +msgid "Quick Slice" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1125 +msgid "Slice a file into a G-code" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1131 +msgid "Quick Slice and Save As" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1131 +msgid "Slice a file into a G-code, save as" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1137 +msgid "Repeat Last Quick Slice" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1137 +msgid "Repeat last quick slice" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1145 +msgid "(Re)Slice No&w" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1145 +msgid "Start new slicing process" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1149 +msgid "&Repair STL file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1149 +msgid "Automatically repair an STL file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1153 +msgid "&G-code preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1156 src/slic3r/GUI/MainFrame.cpp:1414 +msgid "&Quit" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1156 src/slic3r/GUI/MainFrame.cpp:1414 #, possible-c-format -msgid "%s &Website" +msgid "Quit %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:668 -#, possible-c-format -msgid "Open the %s website in your browser" +#: src/slic3r/GUI/MainFrame.cpp:1183 +msgid "&Select all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:674 -msgid "System &Info" +#: src/slic3r/GUI/MainFrame.cpp:1184 +msgid "Selects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:674 -msgid "Show system information" +#: src/slic3r/GUI/MainFrame.cpp:1186 +msgid "D&eselect all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:676 -msgid "Show &Configuration Folder" +#: src/slic3r/GUI/MainFrame.cpp:1187 +msgid "Deselects all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:676 -msgid "Show user configuration folder (datadir)" +#: src/slic3r/GUI/MainFrame.cpp:1190 +msgid "&Delete selected" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:678 -msgid "Report an I&ssue" +#: src/slic3r/GUI/MainFrame.cpp:1191 +msgid "Deletes the current selection" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:678 -#, possible-c-format -msgid "Report an issue on %s" +#: src/slic3r/GUI/MainFrame.cpp:1193 +msgid "Delete &all" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:680 -#, possible-c-format -msgid "&About %s" +#: src/slic3r/GUI/MainFrame.cpp:1194 +msgid "Deletes all objects" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:680 -msgid "Show about dialog" +#: src/slic3r/GUI/MainFrame.cpp:1198 +msgid "&Undo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:683 -msgid "Show the list of the keyboard shortcuts" +#: src/slic3r/GUI/MainFrame.cpp:1201 +msgid "&Redo" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:691 +#: src/slic3r/GUI/MainFrame.cpp:1206 +msgid "&Copy" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1207 +msgid "Copy selection to clipboard" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1209 +msgid "&Paste" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1210 +msgid "Paste clipboard" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1214 +msgid "Re&load from disk" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1215 +msgid "Reload the plater from disk" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1219 +msgid "Searc&h" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1220 +msgid "Search in settings" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1228 +msgid "&Plater Tab" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1228 +msgid "Show the plater" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1233 +msgid "P&rint Settings Tab" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1233 +msgid "Show the print settings" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1236 src/slic3r/GUI/MainFrame.cpp:1463 +msgid "&Filament Settings Tab" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1236 +msgid "Show the filament settings" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1240 +msgid "Print&er Settings Tab" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1240 +msgid "Show the printer settings" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1246 +msgid "3&D" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1246 +msgid "Show the 3D editing view" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1249 +msgid "Pre&view" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1249 +msgid "Show the 3D slices preview" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1270 +msgid "Print &Host Upload Queue" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1270 +msgid "Display the Print Host Upload Queue window" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1306 +msgid "Show &labels" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1306 +msgid "Show object/instance labels in 3D scene" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1309 +msgid "&Collapse sidebar" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1309 src/slic3r/GUI/Plater.cpp:2235 +msgid "Collapse sidebar" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1359 src/slic3r/GUI/MainFrame.cpp:1369 +#: src/slic3r/GUI/MainFrame.cpp:1429 msgid "&File" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:692 +#: src/slic3r/GUI/MainFrame.cpp:1360 src/slic3r/GUI/MainFrame.cpp:1370 msgid "&Edit" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:693 +#: src/slic3r/GUI/MainFrame.cpp:1361 src/slic3r/GUI/MainFrame.cpp:1371 msgid "&Window" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:694 +#: src/slic3r/GUI/MainFrame.cpp:1362 src/slic3r/GUI/MainFrame.cpp:1372 +#: src/slic3r/GUI/MainFrame.cpp:1430 msgid "&View" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:697 +#: src/slic3r/GUI/MainFrame.cpp:1365 src/slic3r/GUI/MainFrame.cpp:1375 +#: src/slic3r/GUI/MainFrame.cpp:1435 msgid "&Help" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:719 +#: src/slic3r/GUI/MainFrame.cpp:1403 +msgid "&Open G-code" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1403 +msgid "Open a G-code file" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1410 +msgid "Open &PrusaSlicer" +msgstr "" + +#: src/slic3r/GUI/MainFrame.cpp:1460 msgid "E&xport" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:720 +#: src/slic3r/GUI/MainFrame.cpp:1461 msgid "S&end to print" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:722 +#: src/slic3r/GUI/MainFrame.cpp:1463 msgid "Mate&rial Settings Tab" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:743 +#: src/slic3r/GUI/MainFrame.cpp:1486 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:754 +#: src/slic3r/GUI/MainFrame.cpp:1497 msgid "No previously sliced file." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:760 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid "Previously sliced file (" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:760 +#: src/slic3r/GUI/MainFrame.cpp:1503 msgid ") not found." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:761 +#: src/slic3r/GUI/MainFrame.cpp:1504 msgid "File Not Found" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:796 +#: src/slic3r/GUI/MainFrame.cpp:1539 #, possible-c-format msgid "Save %s file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:796 +#: src/slic3r/GUI/MainFrame.cpp:1539 msgid "SVG" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:796 +#: src/slic3r/GUI/MainFrame.cpp:1539 msgid "G-code" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:808 +#: src/slic3r/GUI/MainFrame.cpp:1551 msgid "Save zip file as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:817 src/slic3r/GUI/Plater.cpp:2981 -#: src/slic3r/GUI/Plater.cpp:4533 src/slic3r/GUI/Tab.cpp:1194 -#: src/slic3r/GUI/Tab.cpp:3786 +#: src/slic3r/GUI/MainFrame.cpp:1560 src/slic3r/GUI/Plater.cpp:3013 +#: src/slic3r/GUI/Plater.cpp:5350 src/slic3r/GUI/Tab.cpp:1561 +#: src/slic3r/GUI/Tab.cpp:4078 msgid "Slicing" msgstr "" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:819 +#: src/slic3r/GUI/MainFrame.cpp:1562 #, possible-c-format msgid "Processing %s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:842 -msgid " was successfully sliced." +#: src/slic3r/GUI/MainFrame.cpp:1585 +msgid "%1% was successfully sliced." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:844 +#: src/slic3r/GUI/MainFrame.cpp:1587 msgid "Slicing Done!" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:859 +#: src/slic3r/GUI/MainFrame.cpp:1602 msgid "Select the STL file to repair:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:869 +#: src/slic3r/GUI/MainFrame.cpp:1612 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:881 +#: src/slic3r/GUI/MainFrame.cpp:1624 msgid "Your file was repaired." msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:881 src/libslic3r/PrintConfig.cpp:3257 +#: src/slic3r/GUI/MainFrame.cpp:1624 src/libslic3r/PrintConfig.cpp:3638 msgid "Repair" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:895 +#: src/slic3r/GUI/MainFrame.cpp:1638 msgid "Save configuration as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:914 src/slic3r/GUI/MainFrame.cpp:976 +#: src/slic3r/GUI/MainFrame.cpp:1657 src/slic3r/GUI/MainFrame.cpp:1719 msgid "Select configuration to load:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:950 +#: src/slic3r/GUI/MainFrame.cpp:1693 msgid "Save presets bundle as:" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:997 +#: src/slic3r/GUI/MainFrame.cpp:1740 #, possible-c-format msgid "%d presets successfully imported." msgstr "" +#: src/slic3r/GUI/Mouse3DController.cpp:462 +msgid "3Dconnexion settings" +msgstr "" + +#: 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 #, possible-c-format msgid "%s error" @@ -3016,608 +4766,870 @@ msgstr "" msgid "%s has encountered an error" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:249 +#: src/slic3r/GUI/NotificationManager.hpp:395 +msgid "3D Mouse disconnected." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:398 +msgid "Configuration update is available." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:398 +msgid "See more." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:400 +msgid "New version is available." +msgstr "" + +#: src/slic3r/GUI/NotificationManager.hpp:400 +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 +#, possible-c-format +msgid "Instance %d" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3925 +#: src/slic3r/GUI/Tab.cpp:4007 +msgid "Layers" +msgstr "" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 +msgid "Range" +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:259 +#, possible-c-format +msgid "" +"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" +"while OpenGL version %s, render %s, vendor %s was detected." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:262 +msgid "You may need to update your graphics card driver." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:265 +msgid "" +"As a workaround, you may run PrusaSlicer with a software rendered 3D " +"graphics by running prusa-slicer.exe with the --sw_renderer parameter." +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:267 +msgid "Unsupported OpenGL version" +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:275 +#, possible-c-format +msgid "" +"Unable to load the following shaders:\n" +"%s" +msgstr "" + +#: src/slic3r/GUI/OpenGLManager.cpp:276 +msgid "Error loading shaders" +msgstr "" + +#: src/slic3r/GUI/OptionsGroup.cpp:328 msgctxt "Layers" msgid "Top" msgstr "" -#: src/slic3r/GUI/OptionsGroup.cpp:249 +#: src/slic3r/GUI/OptionsGroup.cpp:328 msgctxt "Layers" msgid "Bottom" msgstr "" -#: src/slic3r/GUI/Plater.cpp:146 +#: 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:2037 +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 "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:366 +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "" + +#: 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 "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:396 +#, possible-c-format +msgid "" +"On this system, %s uses HTTPS certificates from the system Certificate Store " +"or Keychain." +msgstr "" + +#: 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 to change a name of your printer device. It can't be saved." +msgstr "" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555 +msgid "Printer with name \"%1%\" already exists." +msgstr "" + +#: 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:162 msgid "Volume" msgstr "" -#: src/slic3r/GUI/Plater.cpp:147 +#: src/slic3r/GUI/Plater.cpp:163 msgid "Facets" msgstr "" -#: src/slic3r/GUI/Plater.cpp:148 +#: src/slic3r/GUI/Plater.cpp:164 msgid "Materials" msgstr "" -#: src/slic3r/GUI/Plater.cpp:151 +#: src/slic3r/GUI/Plater.cpp:167 msgid "Manifold" msgstr "" -#: src/slic3r/GUI/Plater.cpp:201 +#: src/slic3r/GUI/Plater.cpp:217 msgid "Sliced Info" msgstr "" -#: src/slic3r/GUI/Plater.cpp:220 src/slic3r/GUI/Plater.cpp:1150 +#: src/slic3r/GUI/Plater.cpp:236 src/slic3r/GUI/Plater.cpp:1143 msgid "Used Filament (m)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:221 +#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1155 msgid "Used Filament (mm³)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:222 +#: src/slic3r/GUI/Plater.cpp:238 msgid "Used Filament (g)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:223 +#: src/slic3r/GUI/Plater.cpp:239 msgid "Used Material (unit)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:224 src/slic3r/GUI/Plater.cpp:1165 -#: src/libslic3r/PrintConfig.cpp:742 -msgid "Cost" +#: src/slic3r/GUI/Plater.cpp:240 +msgid "Cost (money)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:225 src/slic3r/GUI/Plater.cpp:1137 -#: src/slic3r/GUI/Plater.cpp:1179 -msgid "Estimated printing time" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:226 +#: src/slic3r/GUI/Plater.cpp:242 msgid "Number of tool changes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:316 -msgid "Click to edit preset" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:468 +#: src/slic3r/GUI/Plater.cpp:359 msgid "Select what kind of support do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:470 src/libslic3r/PrintConfig.cpp:1865 -#: src/libslic3r/PrintConfig.cpp:2561 +#: src/slic3r/GUI/Plater.cpp:361 src/libslic3r/PrintConfig.cpp:2034 +#: src/libslic3r/PrintConfig.cpp:2829 msgid "Support on build plate only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:471 src/slic3r/GUI/Plater.cpp:592 +#: src/slic3r/GUI/Plater.cpp:362 src/slic3r/GUI/Plater.cpp:485 msgid "For support enforcers only" msgstr "" -#: src/slic3r/GUI/Plater.cpp:472 +#: src/slic3r/GUI/Plater.cpp:363 msgid "Everywhere" msgstr "" -#: src/slic3r/GUI/Plater.cpp:504 src/slic3r/GUI/Tab.cpp:1091 +#: src/slic3r/GUI/Plater.cpp:395 src/slic3r/GUI/Tab.cpp:1455 msgid "Brim" msgstr "" -#: src/slic3r/GUI/Plater.cpp:506 +#: src/slic3r/GUI/Plater.cpp:397 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." msgstr "" -#: src/slic3r/GUI/Plater.cpp:514 +#: src/slic3r/GUI/Plater.cpp:405 msgid "Purging volumes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:606 +#: src/slic3r/GUI/Plater.cpp:499 msgid "Select what kind of pad do you need" msgstr "" -#: src/slic3r/GUI/Plater.cpp:608 +#: src/slic3r/GUI/Plater.cpp:501 msgid "Below object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:609 +#: src/slic3r/GUI/Plater.cpp:502 msgid "Around object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:781 -msgid "Print settings" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:782 src/slic3r/GUI/Tab.cpp:1640 -#: src/slic3r/GUI/Tab.cpp:1641 -msgid "Filament" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:783 +#: src/slic3r/GUI/Plater.cpp:687 msgid "SLA print settings" msgstr "" -#: src/slic3r/GUI/Plater.cpp:784 src/slic3r/GUI/Preset.cpp:1314 -msgid "SLA material" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:785 -msgid "Printer" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:835 src/slic3r/GUI/Plater.cpp:4823 +#: src/slic3r/GUI/Plater.cpp:748 src/slic3r/GUI/Plater.cpp:5850 msgid "Send to printer" msgstr "" -#: src/slic3r/GUI/Plater.cpp:838 src/slic3r/GUI/Plater.cpp:2981 -#: src/slic3r/GUI/Plater.cpp:4536 +#: src/slic3r/GUI/Plater.cpp:763 src/slic3r/GUI/Plater.cpp:3013 +#: src/slic3r/GUI/Plater.cpp:5353 msgid "Slice now" msgstr "" -#: src/slic3r/GUI/Plater.cpp:978 +#: src/slic3r/GUI/Plater.cpp:918 msgid "Hold Shift to Slice & Export G-code" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1083 +#: src/slic3r/GUI/Plater.cpp:1063 #, possible-c-format msgid "%d (%d shells)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1088 +#: src/slic3r/GUI/Plater.cpp:1068 #, possible-c-format msgid "Auto-repaired (%d errors)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1091 +#: src/slic3r/GUI/Plater.cpp:1071 #, 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:1101 +#: src/slic3r/GUI/Plater.cpp:1081 msgid "Yes" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1124 +#: src/slic3r/GUI/Plater.cpp:1102 msgid "Used Material (ml)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1127 +#: src/slic3r/GUI/Plater.cpp:1105 msgid "object(s)" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1127 +#: src/slic3r/GUI/Plater.cpp:1105 msgid "supports and pad" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1152 src/slic3r/GUI/Plater.cpp:1167 +#: src/slic3r/GUI/Plater.cpp:1143 +msgid "Used Filament (in)" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1145 src/slic3r/GUI/Plater.cpp:1162 msgid "objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1152 src/slic3r/GUI/Plater.cpp:1167 +#: src/slic3r/GUI/Plater.cpp:1145 src/slic3r/GUI/Plater.cpp:1162 msgid "wipe tower" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1182 +#: src/slic3r/GUI/Plater.cpp:1155 +msgid "Used Filament (in³)" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1160 src/libslic3r/PrintConfig.cpp:803 +#: src/libslic3r/PrintConfig.cpp:2644 src/libslic3r/PrintConfig.cpp:2645 +msgid "Cost" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1179 src/slic3r/GUI/Plater.cpp:1226 msgid "normal mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1186 src/slic3r/GUI/Plater.cpp:1195 -#: src/libslic3r/PrintConfig.cpp:565 -msgid "Color" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:1191 +#: src/slic3r/GUI/Plater.cpp:1189 src/slic3r/GUI/Plater.cpp:1237 msgid "stealth mode" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1286 -msgid "Load File" +#: src/slic3r/GUI/Plater.cpp:1200 src/libslic3r/PrintConfig.cpp:625 +msgid "Color" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1290 -msgid "Load Files" +#: src/slic3r/GUI/Plater.cpp:1410 +#, possible-c-format +msgid "%s - Drop project file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:1519 -msgid "ERROR: not enough resources to execute a new job." +#: src/slic3r/GUI/Plater.cpp:1417 +msgid "Open as project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2089 +#: src/slic3r/GUI/Plater.cpp:1418 +msgid "Import geometry only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1419 +msgid "Import config only" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1422 +msgid "Select an action to apply to the file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1423 +msgid "Action" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1431 +msgid "Don't show again" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1471 +msgid "You can open only one .gcode file at a time." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1472 +msgid "Drag and drop G-code file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1528 src/slic3r/GUI/Plater.cpp:4753 +msgid "Import Object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1639 +msgid "Optimize Rotation" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:1645 +msgid "Import SLA archive" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2123 +#, possible-c-format +msgid "" +"Successfully unmounted. The device %s(%s) can now be safely removed from the " +"computer." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2126 +#, possible-c-format +msgid "Ejecting of device %s(%s) has failed." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2147 msgid "New Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2206 +#: src/slic3r/GUI/Plater.cpp:2234 +msgid "Expand sidebar" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2307 msgid "Loading" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2216 +#: src/slic3r/GUI/Plater.cpp:2317 +msgid "Loading file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:2400 #, possible-c-format -msgid "Processing input file %s\n" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2244 msgid "" -"You can't load SLA project if there is at least one multi-part object on the " -"bed" +"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:2245 src/slic3r/GUI/Tab.cpp:3146 -msgid "Please check your object list before preset changing." +#: src/slic3r/GUI/Plater.cpp:2402 +msgid "The object appears to be saved in inches" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2288 +#: src/slic3r/GUI/Plater.cpp:2410 msgid "" -"This file contains several objects positioned at multiple heights. Instead " -"of considering them as multiple objects, should I consider\n" -"this file as a single object having multiple parts?\n" +"This file contains several objects positioned at multiple heights.\n" +"Instead of considering them as multiple objects, should I consider\n" +"this file as a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2291 src/slic3r/GUI/Plater.cpp:2343 +#: src/slic3r/GUI/Plater.cpp:2413 src/slic3r/GUI/Plater.cpp:2466 msgid "Multi-part object detected" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2298 +#: src/slic3r/GUI/Plater.cpp:2420 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " -"advanced mode?\n" +"advanced mode?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2299 +#: src/slic3r/GUI/Plater.cpp:2421 msgid "Detected advanced data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2320 +#: src/slic3r/GUI/Plater.cpp:2443 #, 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:2340 +#: src/slic3r/GUI/Plater.cpp:2463 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" -"these files to represent a single object having multiple parts?\n" +"these files to represent a single object having multiple parts?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2356 +#: src/slic3r/GUI/Plater.cpp:2479 msgid "Loaded" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2458 +#: src/slic3r/GUI/Plater.cpp:2581 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:2459 +#: src/slic3r/GUI/Plater.cpp:2582 msgid "Object too large?" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2517 +#: src/slic3r/GUI/Plater.cpp:2644 msgid "Export STL file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2524 +#: src/slic3r/GUI/Plater.cpp:2651 msgid "Export AMF file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2530 +#: src/slic3r/GUI/Plater.cpp:2657 msgid "Save file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2536 +#: src/slic3r/GUI/Plater.cpp:2663 msgid "Export OBJ file:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2638 +#: src/slic3r/GUI/Plater.cpp:2764 msgid "Delete Object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2649 +#: src/slic3r/GUI/Plater.cpp:2775 msgid "Reset Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2688 -msgid "Optimize Rotation" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2734 -msgid "Arranging" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2757 -msgid "Could not arrange model objects! Some geometries may be invalid." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2763 -msgid "Arranging canceled." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2764 -msgid "Arranging done." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2780 -msgid "Searching for optimal orientation" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2813 -msgid "Orientation search canceled." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2814 -msgid "Orientation found." -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:2830 +#: src/slic3r/GUI/Plater.cpp:2854 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -#: src/slic3r/GUI/Plater.cpp:2841 +#: src/slic3r/GUI/Plater.cpp:2865 msgid "Split to Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2966 +#: src/slic3r/GUI/Plater.cpp:2997 src/slic3r/GUI/Plater.cpp:3680 msgid "Invalid data" msgstr "" -#: src/slic3r/GUI/Plater.cpp:2975 +#: src/slic3r/GUI/Plater.cpp:3007 msgid "Ready to slice" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3013 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3045 src/slic3r/GUI/PrintHostDialogs.cpp:260 msgid "Cancelling" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3030 +#: src/slic3r/GUI/Plater.cpp:3064 msgid "Another export job is currently running." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3084 src/slic3r/GUI/Plater.cpp:3549 -msgid "Reload from Disk" +#: src/slic3r/GUI/Plater.cpp:3181 +msgid "Please select the file to reload" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3120 +#: src/slic3r/GUI/Plater.cpp:3216 +msgid "It is not allowed to change the file to reload" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3216 +msgid "Do you want to retry" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3234 +msgid "Reload from:" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3325 +msgid "Unable to reload:" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3330 +msgid "Error during reload" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3349 +msgid "Reload all from disk" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3370 msgid "Fix Throught NetFabb" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3307 -msgid "Export failed" +#: src/slic3r/GUI/Plater.cpp:3638 +msgid "There are active warnings concerning sliced models:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3312 src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/Plater.cpp:3649 +msgid "generated warnings" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:3688 src/slic3r/GUI/PrintHostDialogs.cpp:261 msgid "Cancelled" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3520 src/slic3r/GUI/Plater.cpp:3539 +#: src/slic3r/GUI/Plater.cpp:3950 src/slic3r/GUI/Plater.cpp:3972 msgid "Remove the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3526 +#: src/slic3r/GUI/Plater.cpp:3959 msgid "Add one more instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3528 +#: src/slic3r/GUI/Plater.cpp:3961 msgid "Remove one instance of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3530 +#: src/slic3r/GUI/Plater.cpp:3963 msgid "Set number of instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3530 +#: src/slic3r/GUI/Plater.cpp:3963 msgid "Change the number of instances of the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3549 -msgid "Reload the selected file from Disk" +#: src/slic3r/GUI/Plater.cpp:3982 +msgid "Reload the selected object from disk" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3552 +#: src/slic3r/GUI/Plater.cpp:3985 msgid "Export the selected object as STL file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3577 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "Along X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3577 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "Mirror the selected object along the X axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3579 +#: src/slic3r/GUI/Plater.cpp:4018 msgid "Along Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3579 +#: src/slic3r/GUI/Plater.cpp:4018 msgid "Mirror the selected object along the Y axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3581 +#: src/slic3r/GUI/Plater.cpp:4020 msgid "Along Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3581 +#: src/slic3r/GUI/Plater.cpp:4020 msgid "Mirror the selected object along the Z axis" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3584 +#: src/slic3r/GUI/Plater.cpp:4023 msgid "Mirror" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3584 +#: src/slic3r/GUI/Plater.cpp:4023 msgid "Mirror the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3596 +#: src/slic3r/GUI/Plater.cpp:4035 msgid "To objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3596 src/slic3r/GUI/Plater.cpp:3616 +#: src/slic3r/GUI/Plater.cpp:4035 src/slic3r/GUI/Plater.cpp:4055 msgid "Split the selected object into individual objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3598 +#: src/slic3r/GUI/Plater.cpp:4037 msgid "To parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3598 src/slic3r/GUI/Plater.cpp:3630 +#: src/slic3r/GUI/Plater.cpp:4037 src/slic3r/GUI/Plater.cpp:4073 msgid "Split the selected object into individual sub-parts" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3601 src/slic3r/GUI/Plater.cpp:3616 -#: src/slic3r/GUI/Plater.cpp:3630 src/libslic3r/PrintConfig.cpp:3281 +#: src/slic3r/GUI/Plater.cpp:4040 src/slic3r/GUI/Plater.cpp:4055 +#: src/slic3r/GUI/Plater.cpp:4073 src/libslic3r/PrintConfig.cpp:3662 msgid "Split" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3601 +#: src/slic3r/GUI/Plater.cpp:4040 msgid "Split the selected object" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3622 +#: src/slic3r/GUI/Plater.cpp:4062 msgid "Optimize orientation" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3622 +#: src/slic3r/GUI/Plater.cpp:4063 msgid "Optimize the rotation of the object for better print results." msgstr "" -#: src/slic3r/GUI/Plater.cpp:3662 +#: src/slic3r/GUI/Plater.cpp:4145 msgid "3D editor view" msgstr "" -#: src/slic3r/GUI/Plater.cpp:3670 src/slic3r/GUI/Tab.cpp:2590 -msgid "Preview" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:3907 +#: src/slic3r/GUI/Plater.cpp:4521 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:4081 +#: src/slic3r/GUI/Plater.cpp:4725 msgid "Load Project" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4109 -msgid "Import Object" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4113 +#: src/slic3r/GUI/Plater.cpp:4757 msgid "Import Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4172 -msgid "All objects will be removed, continue ?" +#: src/slic3r/GUI/Plater.cpp:4827 +msgid "The selected file" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4180 +#: src/slic3r/GUI/Plater.cpp:4827 +msgid "does not contain valid gcode." +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4828 +msgid "Error while loading .gcode file" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4882 +msgid "All objects will be removed, continue?" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4890 msgid "Delete Selected Objects" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4188 +#: src/slic3r/GUI/Plater.cpp:4898 msgid "Increase Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4224 +#: src/slic3r/GUI/Plater.cpp:4932 msgid "Decrease Instances" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4260 +#: src/slic3r/GUI/Plater.cpp:4963 +msgid "Enter the number of copies:" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4964 +msgid "Copies of the selected object" +msgstr "" + +#: src/slic3r/GUI/Plater.cpp:4968 #, possible-c-format msgid "Set numbers of copies to %d" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4290 +#: src/slic3r/GUI/Plater.cpp:5029 msgid "Cut by Plane" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4322 +#: src/slic3r/GUI/Plater.cpp:5083 msgid "Save G-code file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4322 +#: src/slic3r/GUI/Plater.cpp:5083 msgid "Save SL1 file as:" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4434 +#: src/slic3r/GUI/Plater.cpp:5230 #, possible-c-format msgid "STL file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4450 +#: src/slic3r/GUI/Plater.cpp:5247 #, possible-c-format msgid "AMF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4453 +#: src/slic3r/GUI/Plater.cpp:5250 #, possible-c-format msgid "Error exporting AMF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4479 +#: src/slic3r/GUI/Plater.cpp:5279 #, possible-c-format msgid "3MF file exported to %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4484 +#: src/slic3r/GUI/Plater.cpp:5284 #, possible-c-format msgid "Error exporting 3MF file %s" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4822 +#: src/slic3r/GUI/Plater.cpp:5849 msgid "Export" msgstr "" -#: src/slic3r/GUI/Plater.cpp:4823 -msgid "Send G-code" -msgstr "" - -#: src/slic3r/GUI/Plater.cpp:4907 +#: src/slic3r/GUI/Plater.cpp:5946 msgid "Paste From Clipboard" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:2001 -#: src/slic3r/GUI/Tab.cpp:2242 +#: src/slic3r/GUI/Preferences.cpp:24 src/slic3r/GUI/Tab.cpp:2071 +#: src/slic3r/GUI/Tab.cpp:2253 src/slic3r/GUI/Tab.cpp:2361 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1066 msgid "General" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:44 +#: src/slic3r/GUI/Preferences.cpp:52 msgid "Remember output directory" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/Preferences.cpp:54 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:52 +#: src/slic3r/GUI/Preferences.cpp:64 msgid "Auto-center parts" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:54 +#: src/slic3r/GUI/Preferences.cpp:66 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:60 +#: src/slic3r/GUI/Preferences.cpp:72 msgid "Background processing" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:62 +#: src/slic3r/GUI/Preferences.cpp:74 msgid "" "If this is enabled, Slic3r will pre-process objects as soon as they're " "loaded in order to save time when exporting G-code." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:71 +#: 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 " @@ -3625,7 +5637,17 @@ msgid "" "notification mechanisms, no automatic installation is done." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:79 +#: src/slic3r/GUI/Preferences.cpp:89 +msgid "Export sources full pathnames to 3mf and amf" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:91 +msgid "" +"If enabled, allows the Reload from disk command to automatically find and " +"load the files when invoked." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:99 msgid "" "If enabled, Slic3r downloads updates of built-in system presets in the " "background. These updates are downloaded into a separate temporary location. " @@ -3633,91 +5655,259 @@ msgid "" "startup." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:84 +#: src/slic3r/GUI/Preferences.cpp:104 msgid "Suppress \" - default - \" presets" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:86 +#: src/slic3r/GUI/Preferences.cpp:106 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:92 +#: src/slic3r/GUI/Preferences.cpp:112 msgid "Show incompatible print and filament presets" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:94 +#: src/slic3r/GUI/Preferences.cpp:114 msgid "" "When checked, the print and filament presets are shown in the preset editor " "even if they are marked as incompatible with the active printer" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:101 +#: src/slic3r/GUI/Preferences.cpp:120 +msgid "Show drop project dialog" +msgstr "" + +#: 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 "" + +#: src/slic3r/GUI/Preferences.cpp:127 src/libslic3r/PrintConfig.cpp:3689 +msgid "Single instance mode" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:130 +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:132 +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:142 msgid "Use Retina resolution for the 3D scene" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:103 +#: src/slic3r/GUI/Preferences.cpp:144 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:110 +#: src/slic3r/GUI/Preferences.cpp:161 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:659 +msgid "Ask for unsaved changes when closing application" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:163 +msgid "When closing the application, always ask for unsaved changes" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:168 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:660 +msgid "Ask for unsaved changes when selecting new preset" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:170 +msgid "Always ask for unsaved changes when selecting new preset" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:176 src/slic3r/GUI/Preferences.cpp:178 +msgid "Show splash screen" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:185 +msgid "Camera" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:191 msgid "Use perspective camera" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:112 +#: src/slic3r/GUI/Preferences.cpp:193 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:117 +#: src/slic3r/GUI/Preferences.cpp:198 +msgid "Use free camera" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:200 +msgid "If enabled, use free camera. If not enabled, use constrained camera." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:205 +msgid "Reverse direction of zoom with mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:207 +msgid "If enabled, reverses the direction of zoom with mouse wheel" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:214 +msgid "GUI" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:227 +msgid "Show sidebar collapse/expand button" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:229 +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:234 msgid "Use custom size for toolbar icons" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:119 +#: src/slic3r/GUI/Preferences.cpp:236 msgid "If enabled, you can change size of toolbar icons manually." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:144 +#: src/slic3r/GUI/Preferences.cpp:243 +msgid "Sequential slider applied only to top layer" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:245 +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:269 +msgid "Render" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:275 +msgid "Use environment map" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:277 +msgid "If enabled, renders object using the environment map." +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:313 #, possible-c-format msgid "You need to restart %s to make the changes effective." msgstr "" -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:390 msgid "Icon size in a respect to the default size" msgstr "" -#: src/slic3r/GUI/Preferences.cpp:207 +#: src/slic3r/GUI/Preferences.cpp:405 msgid "Select toolbar icon size in respect to the default one." msgstr "" -#: src/slic3r/GUI/Preset.cpp:212 -msgid "modified" +#: src/slic3r/GUI/Preferences.cpp:436 +msgid "Old regular layout with the tab bar" msgstr "" -#: src/slic3r/GUI/Preset.cpp:967 src/slic3r/GUI/Preset.cpp:1007 -#: src/slic3r/GUI/Preset.cpp:1072 src/slic3r/GUI/Preset.cpp:1104 -#: src/slic3r/GUI/PresetBundle.cpp:1484 src/slic3r/GUI/PresetBundle.cpp:1559 +#: src/slic3r/GUI/Preferences.cpp:437 +msgid "New layout, access via settings button in the top menu" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:438 +msgid "Settings in non-modal window" +msgstr "" + +#: src/slic3r/GUI/Preferences.cpp:447 +msgid "Layout Options" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:188 +#: src/slic3r/GUI/PresetComboBoxes.cpp:226 +#: src/slic3r/GUI/PresetComboBoxes.cpp:752 +#: src/slic3r/GUI/PresetComboBoxes.cpp:802 +#: src/slic3r/GUI/PresetComboBoxes.cpp:916 +#: src/slic3r/GUI/PresetComboBoxes.cpp:960 msgid "System presets" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1011 src/slic3r/GUI/Preset.cpp:1108 -#: src/slic3r/GUI/PresetBundle.cpp:1564 +#: src/slic3r/GUI/PresetComboBoxes.cpp:230 +#: src/slic3r/GUI/PresetComboBoxes.cpp:806 +#: src/slic3r/GUI/PresetComboBoxes.cpp:964 msgid "User presets" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1040 src/slic3r/GUI/Tab.cpp:243 -msgid "Add a new printer" +#: src/slic3r/GUI/PresetComboBoxes.cpp:241 +msgid "Incompatible presets" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1312 -msgid "filament" +#: src/slic3r/GUI/PresetComboBoxes.cpp:276 +msgid "Are you sure you want to delete \"%1%\" printer?" msgstr "" -#: src/slic3r/GUI/Preset.cpp:1313 -msgid "SLA print" +#: src/slic3r/GUI/PresetComboBoxes.cpp:278 +msgid "Delete Physical Printer" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:615 +msgid "Click to edit preset" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:671 +#: src/slic3r/GUI/PresetComboBoxes.cpp:701 +msgid "Add/Remove presets" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:676 +#: src/slic3r/GUI/PresetComboBoxes.cpp:706 src/slic3r/GUI/Tab.cpp:2958 +msgid "Add physical printer" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:690 +msgid "Edit preset" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:694 src/slic3r/GUI/Tab.cpp:2958 +msgid "Edit physical printer" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:697 +msgid "Delete physical printer" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:817 +#: src/slic3r/GUI/PresetComboBoxes.cpp:978 +msgid "Physical printers" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:841 +msgid "Add/Remove filaments" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:843 +msgid "Add/Remove materials" +msgstr "" + +#: src/slic3r/GUI/PresetComboBoxes.cpp:845 +#: src/slic3r/GUI/PresetComboBoxes.cpp:1002 +msgid "Add/Remove printers" msgstr "" #: src/slic3r/GUI/PresetHints.cpp:28 @@ -3729,15 +5919,12 @@ msgstr "" #: src/slic3r/GUI/PresetHints.cpp:35 msgid "" -"\n" "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:39 -msgid "" -"\n" -"During the other layers, fan" +msgid "During the other layers, fan" msgstr "" #: src/slic3r/GUI/PresetHints.cpp:41 @@ -3832,73 +6019,112 @@ msgstr "" msgid "Recommended object thin wall thickness for layer height %.2f and" msgstr "" -#: src/slic3r/GUI/PresetHints.cpp:268 +#: src/slic3r/GUI/PresetHints.cpp:269 #, possible-c-format msgid "%d lines: %.2f mm" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:33 +#: 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 "" + +#: src/slic3r/GUI/PresetHints.cpp:318 +msgid "Minimum top shell thickness is %1% mm." +msgstr "" + +#: 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 "" + +#: src/slic3r/GUI/PresetHints.cpp:337 +msgid "Minimum bottom shell thickness is %1% mm." +msgstr "" + +#: 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 "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:33 +#: src/slic3r/GUI/PrintHostDialogs.cpp:34 msgid "Upload to Printer Host with the following filename:" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:35 +#: src/slic3r/GUI/PrintHostDialogs.cpp:36 msgid "Start printing after upload" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:42 +#: src/slic3r/GUI/PrintHostDialogs.cpp:44 msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:149 +#: src/slic3r/GUI/PrintHostDialogs.cpp:57 +msgid "Group" +msgstr "" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:174 msgid "ID" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:150 +#: src/slic3r/GUI/PrintHostDialogs.cpp:175 msgid "Progress" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:151 +#: src/slic3r/GUI/PrintHostDialogs.cpp:176 msgid "Status" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:152 +#: src/slic3r/GUI/PrintHostDialogs.cpp:177 msgid "Host" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:153 +#: src/slic3r/GUI/PrintHostDialogs.cpp:178 msgid "Filename" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:154 +#: src/slic3r/GUI/PrintHostDialogs.cpp:179 msgid "Error Message" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:157 +#: src/slic3r/GUI/PrintHostDialogs.cpp:182 msgid "Cancel selected" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:159 +#: src/slic3r/GUI/PrintHostDialogs.cpp:184 msgid "Show error message" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:198 -#: src/slic3r/GUI/PrintHostDialogs.cpp:229 +#: src/slic3r/GUI/PrintHostDialogs.cpp:226 +#: src/slic3r/GUI/PrintHostDialogs.cpp:257 msgid "Enqueued" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:230 +#: src/slic3r/GUI/PrintHostDialogs.cpp:258 msgid "Uploading" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:234 +#: src/slic3r/GUI/PrintHostDialogs.cpp:262 msgid "Completed" msgstr "" -#: src/slic3r/GUI/PrintHostDialogs.cpp:272 +#: src/slic3r/GUI/PrintHostDialogs.cpp:300 msgid "Error uploading to print host:" msgstr "" @@ -3906,17 +6132,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:82 -#: src/libslic3r/PrintConfig.cpp:627 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:686 src/libslic3r/PrintConfig.cpp:2349 -#: src/libslic3r/PrintConfig.cpp:2358 src/libslic3r/PrintConfig.cpp:2418 -#: src/libslic3r/PrintConfig.cpp:2426 src/libslic3r/PrintConfig.cpp:2434 -#: src/libslic3r/PrintConfig.cpp:2441 src/libslic3r/PrintConfig.cpp:2449 -#: src/libslic3r/PrintConfig.cpp:2457 +#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 +#: src/libslic3r/PrintConfig.cpp:687 src/libslic3r/PrintConfig.cpp:731 +#: src/libslic3r/PrintConfig.cpp:746 src/libslic3r/PrintConfig.cpp:2542 +#: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2661 +#: src/libslic3r/PrintConfig.cpp:2669 src/libslic3r/PrintConfig.cpp:2677 +#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2692 +#: src/libslic3r/PrintConfig.cpp:2700 msgid "s" msgstr "" @@ -3924,401 +6146,490 @@ msgstr "" msgid "Volumetric speed" msgstr "" -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:584 -#: src/libslic3r/PrintConfig.cpp:1234 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:644 +#: src/libslic3r/PrintConfig.cpp:1367 msgid "mm³/s" msgstr "" -#: src/slic3r/GUI/Selection.cpp:146 +#: 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 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:2389 +msgid "Stealth" +msgstr "" + +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2383 +msgid "Normal" +msgstr "" + +#: src/slic3r/GUI/Selection.cpp:191 msgid "Selection-Add" msgstr "" -#: src/slic3r/GUI/Selection.cpp:187 +#: src/slic3r/GUI/Selection.cpp:232 msgid "Selection-Remove" msgstr "" -#: src/slic3r/GUI/Selection.cpp:219 +#: src/slic3r/GUI/Selection.cpp:264 msgid "Selection-Add Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:238 +#: src/slic3r/GUI/Selection.cpp:283 msgid "Selection-Remove Object" msgstr "" -#: src/slic3r/GUI/Selection.cpp:256 +#: src/slic3r/GUI/Selection.cpp:301 msgid "Selection-Add Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:275 +#: src/slic3r/GUI/Selection.cpp:320 msgid "Selection-Remove Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:376 +#: src/slic3r/GUI/Selection.cpp:421 msgid "Selection-Add All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:402 +#: src/slic3r/GUI/Selection.cpp:447 msgid "Selection-Remove All" msgstr "" -#: src/slic3r/GUI/Selection.cpp:939 +#: src/slic3r/GUI/Selection.cpp:1006 msgid "Scale To Fit" msgstr "" -#: src/slic3r/GUI/Selection.cpp:1474 +#: src/slic3r/GUI/Selection.cpp:1533 msgid "Set Printable Instance" msgstr "" -#: src/slic3r/GUI/Selection.cpp:1474 +#: src/slic3r/GUI/Selection.cpp:1533 msgid "Set Unprintable Instance" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:78 +#: src/slic3r/GUI/SysInfoDialog.cpp:90 src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "" -#: src/slic3r/GUI/SysInfoDialog.cpp:154 +#: src/slic3r/GUI/SysInfoDialog.cpp:177 msgid "Copy to Clipboard" msgstr "" -#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:239 +#: src/slic3r/GUI/Tab.cpp:111 src/libslic3r/PrintConfig.cpp:306 msgid "Compatible printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:53 +#: src/slic3r/GUI/Tab.cpp:112 msgid "Select the printers this profile is compatible with." msgstr "" -#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:254 +#: src/slic3r/GUI/Tab.cpp:117 src/libslic3r/PrintConfig.cpp:321 msgid "Compatible print profiles" msgstr "" -#: src/slic3r/GUI/Tab.cpp:59 +#: src/slic3r/GUI/Tab.cpp:118 msgid "Select the print profiles this profile is compatible with." msgstr "" #. TRN "Save current Settings" -#: src/slic3r/GUI/Tab.cpp:135 +#: src/slic3r/GUI/Tab.cpp:213 #, possible-c-format msgid "Save current %s" msgstr "" -#: src/slic3r/GUI/Tab.cpp:136 +#: src/slic3r/GUI/Tab.cpp:214 msgid "Delete this preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:141 +#: src/slic3r/GUI/Tab.cpp:218 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." msgstr "" -#: src/slic3r/GUI/Tab.cpp:943 +#: src/slic3r/GUI/Tab.cpp:222 +msgid "Search in settings [%1%]" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1228 +msgid "Detach from system preset" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1241 +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:1242 +msgid "" +"The current custom preset will be detached from the parent system preset." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1245 +msgid "Modifications to the current profile will be saved." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1248 +msgid "" +"This action is not revertable.\n" +"Do you want to proceed?" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1250 +msgid "Detach preset" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1276 msgid "This is a default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:945 +#: src/slic3r/GUI/Tab.cpp:1278 msgid "This is a system preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:947 +#: src/slic3r/GUI/Tab.cpp:1280 msgid "Current preset is inherited from the default preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:950 -#, possible-c-format -msgid "" -"Current preset is inherited from:\n" -"\t%s" +#: src/slic3r/GUI/Tab.cpp:1282 +msgid "Current preset is inherited from" msgstr "" -#: src/slic3r/GUI/Tab.cpp:954 +#: src/slic3r/GUI/Tab.cpp:1286 msgid "It can't be deleted or modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:955 +#: src/slic3r/GUI/Tab.cpp:1287 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "" -#: src/slic3r/GUI/Tab.cpp:956 +#: src/slic3r/GUI/Tab.cpp:1288 msgid "To do that please specify a new name for the preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:960 +#: src/slic3r/GUI/Tab.cpp:1292 msgid "Additional information:" msgstr "" -#: src/slic3r/GUI/Tab.cpp:966 +#: src/slic3r/GUI/Tab.cpp:1298 msgid "printer model" msgstr "" -#: src/slic3r/GUI/Tab.cpp:974 +#: src/slic3r/GUI/Tab.cpp:1306 msgid "default print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:977 +#: src/slic3r/GUI/Tab.cpp:1309 msgid "default filament profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:991 +#: src/slic3r/GUI/Tab.cpp:1323 msgid "default SLA material profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:995 +#: src/slic3r/GUI/Tab.cpp:1327 msgid "default SLA print profile" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1032 src/slic3r/GUI/Tab.cpp:3731 +#: src/slic3r/GUI/Tab.cpp:1335 +msgid "full profile name" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1336 +msgid "symbolic profile name" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1374 src/slic3r/GUI/Tab.cpp:4005 msgid "Layers and perimeters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1037 +#: src/slic3r/GUI/Tab.cpp:1380 msgid "Vertical shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1048 +#: src/slic3r/GUI/Tab.cpp:1392 msgid "Horizontal shells" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1049 src/libslic3r/PrintConfig.cpp:1759 +#: src/slic3r/GUI/Tab.cpp:1393 src/libslic3r/PrintConfig.cpp:1886 msgid "Solid layers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1054 +#: src/slic3r/GUI/Tab.cpp:1398 +msgid "Minimum shell thickness" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1409 msgid "Quality (slower slicing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1072 +#: src/slic3r/GUI/Tab.cpp:1434 msgid "Reducing printing time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1084 +#: src/slic3r/GUI/Tab.cpp:1446 msgid "Skirt and brim" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1101 +#: src/slic3r/GUI/Tab.cpp:1466 msgid "Raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1105 +#: src/slic3r/GUI/Tab.cpp:1470 msgid "Options for support material and raft" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1120 +#: src/slic3r/GUI/Tab.cpp:1485 msgid "Speed for print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1132 +#: src/slic3r/GUI/Tab.cpp:1498 msgid "Speed for non-print moves" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1135 +#: src/slic3r/GUI/Tab.cpp:1501 msgid "Modifiers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1138 +#: src/slic3r/GUI/Tab.cpp:1504 msgid "Acceleration control (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1145 +#: src/slic3r/GUI/Tab.cpp:1511 msgid "Autospeed (advanced)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1153 +#: src/slic3r/GUI/Tab.cpp:1519 msgid "Multiple Extruders" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1161 +#: src/slic3r/GUI/Tab.cpp:1527 msgid "Ooze prevention" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1178 +#: src/slic3r/GUI/Tab.cpp:1545 msgid "Extrusion width" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1188 +#: src/slic3r/GUI/Tab.cpp:1555 msgid "Overlap" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1191 +#: src/slic3r/GUI/Tab.cpp:1558 msgid "Flow" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1200 +#: src/slic3r/GUI/Tab.cpp:1567 msgid "Other" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1203 src/slic3r/GUI/Tab.cpp:3789 +#: src/slic3r/GUI/Tab.cpp:1570 src/slic3r/GUI/Tab.cpp:4081 msgid "Output options" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1204 +#: src/slic3r/GUI/Tab.cpp:1571 msgid "Sequential printing" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1206 +#: src/slic3r/GUI/Tab.cpp:1573 msgid "Extruder clearance (mm)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1215 src/slic3r/GUI/Tab.cpp:3790 +#: src/slic3r/GUI/Tab.cpp:1578 src/slic3r/GUI/Tab.cpp:4082 msgid "Output file" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1222 src/libslic3r/PrintConfig.cpp:1432 +#: src/slic3r/GUI/Tab.cpp:1585 src/libslic3r/PrintConfig.cpp:1572 msgid "Post-processing scripts" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1228 src/slic3r/GUI/Tab.cpp:1229 -#: src/slic3r/GUI/Tab.cpp:1752 src/slic3r/GUI/Tab.cpp:1753 -#: src/slic3r/GUI/Tab.cpp:2214 src/slic3r/GUI/Tab.cpp:2215 -#: src/slic3r/GUI/Tab.cpp:2328 src/slic3r/GUI/Tab.cpp:2329 -#: src/slic3r/GUI/Tab.cpp:3668 src/slic3r/GUI/Tab.cpp:3669 +#: src/slic3r/GUI/Tab.cpp:1591 src/slic3r/GUI/Tab.cpp:1592 +#: src/slic3r/GUI/Tab.cpp:1900 src/slic3r/GUI/Tab.cpp:1901 +#: src/slic3r/GUI/Tab.cpp:2234 src/slic3r/GUI/Tab.cpp:2235 +#: src/slic3r/GUI/Tab.cpp:2310 src/slic3r/GUI/Tab.cpp:2311 +#: src/slic3r/GUI/Tab.cpp:3948 src/slic3r/GUI/Tab.cpp:3949 msgid "Notes" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1235 src/slic3r/GUI/Tab.cpp:1760 -#: src/slic3r/GUI/Tab.cpp:2221 src/slic3r/GUI/Tab.cpp:2335 -#: src/slic3r/GUI/Tab.cpp:3676 src/slic3r/GUI/Tab.cpp:3795 +#: src/slic3r/GUI/Tab.cpp:1598 src/slic3r/GUI/Tab.cpp:1908 +#: src/slic3r/GUI/Tab.cpp:2241 src/slic3r/GUI/Tab.cpp:2317 +#: src/slic3r/GUI/Tab.cpp:3956 src/slic3r/GUI/Tab.cpp:4087 msgid "Dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1236 src/slic3r/GUI/Tab.cpp:1761 -#: src/slic3r/GUI/Tab.cpp:2222 src/slic3r/GUI/Tab.cpp:2336 -#: src/slic3r/GUI/Tab.cpp:3677 src/slic3r/GUI/Tab.cpp:3796 +#: src/slic3r/GUI/Tab.cpp:1599 src/slic3r/GUI/Tab.cpp:1909 +#: src/slic3r/GUI/Tab.cpp:2242 src/slic3r/GUI/Tab.cpp:2318 +#: src/slic3r/GUI/Tab.cpp:3957 src/slic3r/GUI/Tab.cpp:4088 msgid "Profile dependencies" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1538 src/slic3r/GUI/Tab.cpp:1593 +#: src/slic3r/GUI/Tab.cpp:1679 msgid "Filament Overrides" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1539 src/slic3r/GUI/Tab.cpp:1598 -#: src/slic3r/GUI/Tab.cpp:2570 -msgid "Retraction" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1648 src/libslic3r/PrintConfig.cpp:2030 +#: src/slic3r/GUI/Tab.cpp:1789 msgid "Temperature" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1654 +#: src/slic3r/GUI/Tab.cpp:1790 +msgid "Nozzle" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:1795 msgid "Bed" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1659 +#: src/slic3r/GUI/Tab.cpp:1800 msgid "Cooling" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1660 src/libslic3r/PrintConfig.cpp:1335 -#: src/libslic3r/PrintConfig.cpp:2150 +#: src/slic3r/GUI/Tab.cpp:1802 src/libslic3r/PrintConfig.cpp:1474 +#: src/libslic3r/PrintConfig.cpp:2334 msgid "Enable" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1671 +#: src/slic3r/GUI/Tab.cpp:1813 msgid "Fan settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1672 -msgid "Fan speed" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1680 +#: src/slic3r/GUI/Tab.cpp:1823 msgid "Cooling thresholds" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1686 +#: src/slic3r/GUI/Tab.cpp:1829 msgid "Filament properties" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1690 +#: src/slic3r/GUI/Tab.cpp:1836 msgid "Print speed override" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1700 +#: src/slic3r/GUI/Tab.cpp:1846 msgid "Wipe tower parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1703 +#: src/slic3r/GUI/Tab.cpp:1849 msgid "Toolchange parameters with single extruder MM printers" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1717 +#: src/slic3r/GUI/Tab.cpp:1862 msgid "Ramming settings" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1739 src/slic3r/GUI/Tab.cpp:2177 +#: src/slic3r/GUI/Tab.cpp:1885 src/slic3r/GUI/Tab.cpp:2173 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "Custom G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1740 src/slic3r/GUI/Tab.cpp:2178 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1800 +#: src/slic3r/GUI/Tab.cpp:1886 src/slic3r/GUI/Tab.cpp:2174 +#: src/libslic3r/PrintConfig.cpp:1919 src/libslic3r/PrintConfig.cpp:1934 msgid "Start G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1746 src/slic3r/GUI/Tab.cpp:2184 -#: src/libslic3r/PrintConfig.cpp:369 src/libslic3r/PrintConfig.cpp:379 +#: src/slic3r/GUI/Tab.cpp:1893 src/slic3r/GUI/Tab.cpp:2181 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:436 msgid "End G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1803 +#: src/slic3r/GUI/Tab.cpp:1943 msgid "Volumetric flow hints not available" msgstr "" -#: src/slic3r/GUI/Tab.cpp:1889 src/slic3r/GUI/Tab.cpp:2117 -msgid "Test" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1899 -msgid "Could not get a valid Printer Host reference" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1905 src/slic3r/GUI/Tab.cpp:2130 -msgid "Success!" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1920 +#: src/slic3r/GUI/Tab.cpp:2039 msgid "" -"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" -"signed certificate." +"Note: All parameters from this group are moved to the Physical Printer " +"settings (see changelog).\n" +"\n" +"A new Physical Printer profile is created by clicking on the \"cog\" icon " +"right of the Printer profiles combo box, by selecting the \"Add 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:1933 -msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1934 -msgid "Open CA certificate file" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:1962 -#, possible-c-format -msgid "" -"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." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2002 src/slic3r/GUI/Tab.cpp:2243 +#: src/slic3r/GUI/Tab.cpp:2072 src/slic3r/GUI/Tab.cpp:2254 msgid "Size and coordinates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2007 src/slic3r/GUI/Tab.cpp:2248 -#: src/slic3r/GUI/Tab.cpp:3338 -msgid "Set" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2039 +#: src/slic3r/GUI/Tab.cpp:2081 src/slic3r/GUI/UnsavedChangesDialog.cpp:1066 msgid "Capabilities" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2044 +#: src/slic3r/GUI/Tab.cpp:2086 msgid "Number of extruders of the printer." msgstr "" -#: src/slic3r/GUI/Tab.cpp:2069 +#: src/slic3r/GUI/Tab.cpp:2114 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" @@ -4326,244 +6637,231 @@ msgid "" "nozzle diameter value?" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2072 src/slic3r/GUI/Tab.cpp:2540 -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:2520 +#: src/libslic3r/PrintConfig.cpp:1443 msgid "Nozzle diameter" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2102 -msgid "USB/Serial connection" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2103 src/libslic3r/PrintConfig.cpp:1640 -msgid "Serial port" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2108 -msgid "Rescan serial ports" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2130 -msgid "Connection to printer works correctly." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2133 -msgid "Connection failed." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2146 src/slic3r/GUI/Tab.cpp:2323 -msgid "Print Host upload" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2190 src/libslic3r/PrintConfig.cpp:138 +#: src/slic3r/GUI/Tab.cpp:2188 src/libslic3r/PrintConfig.cpp:194 msgid "Before layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2196 src/libslic3r/PrintConfig.cpp:1056 +#: src/slic3r/GUI/Tab.cpp:2195 src/libslic3r/PrintConfig.cpp:1182 msgid "After layer change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2202 src/libslic3r/PrintConfig.cpp:2056 +#: src/slic3r/GUI/Tab.cpp:2202 src/libslic3r/PrintConfig.cpp:2227 msgid "Tool change G-code" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2208 +#: src/slic3r/GUI/Tab.cpp:2209 msgid "Between objects G-code (for sequential printing)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2280 +#: src/slic3r/GUI/Tab.cpp:2216 +msgid "Color Change G-code" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2222 src/libslic3r/PrintConfig.cpp:1960 +msgid "Pause Print G-code" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2228 +msgid "Template Custom G-code" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:2261 msgid "Display" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2295 +#: src/slic3r/GUI/Tab.cpp:2276 msgid "Tilt" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2296 +#: src/slic3r/GUI/Tab.cpp:2277 msgid "Tilt time" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2302 src/slic3r/GUI/Tab.cpp:3650 +#: src/slic3r/GUI/Tab.cpp:2283 src/slic3r/GUI/Tab.cpp:3932 msgid "Corrections" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2317 src/slic3r/GUI/Tab.cpp:3646 +#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/Tab.cpp:3928 msgid "Exposure" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2388 src/slic3r/GUI/Tab.cpp:2473 -#: src/libslic3r/PrintConfig.cpp:1106 src/libslic3r/PrintConfig.cpp:1124 -#: src/libslic3r/PrintConfig.cpp:1142 src/libslic3r/PrintConfig.cpp:1159 -#: src/libslic3r/PrintConfig.cpp:1170 src/libslic3r/PrintConfig.cpp:1181 -#: src/libslic3r/PrintConfig.cpp:1192 +#: src/slic3r/GUI/Tab.cpp:2359 src/slic3r/GUI/Tab.cpp:2453 +#: src/libslic3r/PrintConfig.cpp:1211 src/libslic3r/PrintConfig.cpp:1246 +#: src/libslic3r/PrintConfig.cpp:1263 src/libslic3r/PrintConfig.cpp:1280 +#: src/libslic3r/PrintConfig.cpp:1296 src/libslic3r/PrintConfig.cpp:1306 +#: src/libslic3r/PrintConfig.cpp:1316 src/libslic3r/PrintConfig.cpp:1326 msgid "Machine limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2402 +#: src/slic3r/GUI/Tab.cpp:2382 msgid "Values in this column are for Normal mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2403 -msgid "Normal" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2408 +#: src/slic3r/GUI/Tab.cpp:2388 msgid "Values in this column are for Stealth mode" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2409 -msgid "Stealth" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2417 +#: src/slic3r/GUI/Tab.cpp:2397 msgid "Maximum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2422 +#: src/slic3r/GUI/Tab.cpp:2402 msgid "Maximum accelerations" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2429 +#: src/slic3r/GUI/Tab.cpp:2409 msgid "Jerk limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2434 +#: src/slic3r/GUI/Tab.cpp:2414 msgid "Minimum feedrates" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2498 src/slic3r/GUI/Tab.cpp:2506 +#: src/slic3r/GUI/Tab.cpp:2478 src/slic3r/GUI/Tab.cpp:2486 msgid "Single extruder MM setup" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2507 +#: src/slic3r/GUI/Tab.cpp:2487 msgid "Single extruder multimaterial parameters" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2520 src/libslic3r/GCode/PreviewData.cpp:461 -#, possible-c-format -msgid "Extruder %d" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:2538 +#: src/slic3r/GUI/Tab.cpp:2518 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:2562 +#: src/slic3r/GUI/Tab.cpp:2542 msgid "Layer height limits" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2567 +#: src/slic3r/GUI/Tab.cpp:2547 msgid "Position (for multi-extruder printers)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2573 +#: src/slic3r/GUI/Tab.cpp:2553 msgid "Only lift Z" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2586 +#: src/slic3r/GUI/Tab.cpp:2566 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2594 +#: src/slic3r/GUI/Tab.cpp:2573 msgid "Reset to Filament Color" msgstr "" -#: src/slic3r/GUI/Tab.cpp:2775 +#: src/slic3r/GUI/Tab.cpp:2751 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:2777 +#: src/slic3r/GUI/Tab.cpp:2753 msgid "Firmware Retraction" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3106 -#, possible-c-format -msgid "Default preset (%s)" +#: src/slic3r/GUI/Tab.cpp:3339 +msgid "Detached" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3107 -#, possible-c-format -msgid "Preset (%s)" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3124 -msgid "has the following unsaved changes:" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3127 -msgid "is not compatible with printer" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3128 -msgid "is not compatible with print profile" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3130 -msgid "and it has the following unsaved changes:" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3134 -msgid "Unsaved Changes" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3225 -msgid "%1% - Copy" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3248 -msgid "The supplied name is empty. It can't be saved." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3253 -msgid "Cannot overwrite a system profile." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3257 -msgid "Cannot overwrite an external profile." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3283 +#: src/slic3r/GUI/Tab.cpp:3402 msgid "remove" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3283 +#: src/slic3r/GUI/Tab.cpp:3402 msgid "delete" msgstr "" -#. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:3285 +#: src/slic3r/GUI/Tab.cpp:3411 +msgid "It's a last preset for this physical printer." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3416 +msgid "" +"Are you sure you want to delete \"%1%\" preset from the physical printer " +"\"%2%\"?" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3428 +msgid "" +"The physical printer(s) below is based on the preset, you are going to " +"delete." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3432 +msgid "" +"Note, that selected preset will be deleted from this/those printer(s) too." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3436 +msgid "" +"The physical printer(s) below is based only on the preset, you are going to " +"delete." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3440 +msgid "" +"Note, that this/those printer(s) will be deleted after deleting of the " +"selected preset." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3444 msgid "Are you sure you want to %1% the selected preset?" msgstr "" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3288 +#: src/slic3r/GUI/Tab.cpp:3449 msgid "%1% Preset" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3414 +#: src/slic3r/GUI/Tab.cpp:3530 src/slic3r/GUI/Tab.cpp:3602 +msgid "Set" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3666 +msgid "" +"Machine limits will be emitted to G-code and used to estimate print time." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3669 +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:3673 +msgid "" +"Machine limits are not set, therefore the print time estimate may not be " +"accurate." +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:3695 msgid "LOCKED LOCK" msgstr "" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3416 +#: src/slic3r/GUI/Tab.cpp:3697 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:3418 +#: src/slic3r/GUI/Tab.cpp:3699 msgid "UNLOCKED LOCK" msgstr "" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3420 +#: src/slic3r/GUI/Tab.cpp:3701 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -4571,23 +6869,23 @@ msgid "" "to the system (or default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3425 +#: src/slic3r/GUI/Tab.cpp:3706 msgid "WHITE BULLET" msgstr "" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3427 +#: src/slic3r/GUI/Tab.cpp:3708 msgid "" -"for the left button: \tindicates a non-system (or non-default) preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3430 +#: src/slic3r/GUI/Tab.cpp:3711 msgid "BACK ARROW" msgstr "" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3432 +#: src/slic3r/GUI/Tab.cpp:3713 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -4595,13 +6893,13 @@ msgid "" "to the last saved preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3442 +#: src/slic3r/GUI/Tab.cpp:3723 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:3444 +#: src/slic3r/GUI/Tab.cpp:3725 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" @@ -4609,17 +6907,17 @@ msgid "" "default) values." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3447 +#: src/slic3r/GUI/Tab.cpp:3728 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3450 +#: src/slic3r/GUI/Tab.cpp:3731 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:3452 +#: src/slic3r/GUI/Tab.cpp:3733 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" @@ -4627,89 +6925,197 @@ msgid "" "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3458 +#: src/slic3r/GUI/Tab.cpp:3739 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3459 +#: src/slic3r/GUI/Tab.cpp:3740 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:3465 +#: src/slic3r/GUI/Tab.cpp:3746 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." msgstr "" -#: src/slic3r/GUI/Tab.cpp:3466 +#: src/slic3r/GUI/Tab.cpp:3747 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:3579 -#, possible-c-format -msgid "Save %s as:" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3623 -msgid "the following suffix is not allowed:" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3627 -msgid "The supplied name is not available." -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3640 +#: src/slic3r/GUI/Tab.cpp:3891 src/slic3r/GUI/Tab.cpp:3893 msgid "Material" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3642 src/slic3r/GUI/Tab.cpp:3733 -#: src/slic3r/GUI/wxExtensions.cpp:482 -msgid "Layers" -msgstr "" - -#: src/slic3r/GUI/Tab.cpp:3741 +#: src/slic3r/GUI/Tab.cpp:4015 msgid "Support head" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3746 +#: src/slic3r/GUI/Tab.cpp:4020 msgid "Support pillar" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3760 +#: src/slic3r/GUI/Tab.cpp:4043 msgid "Connection of the support sticks and junctions" msgstr "" -#: src/slic3r/GUI/Tab.cpp:3765 +#: src/slic3r/GUI/Tab.cpp:4048 msgid "Automatic generation" msgstr "" -#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:428 +#: src/slic3r/GUI/Tab.cpp:4122 +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:4124 src/libslic3r/PrintConfig.cpp:2908 +msgid "Object elevation" +msgstr "" + +#: src/slic3r/GUI/Tab.cpp:4124 src/libslic3r/PrintConfig.cpp:3010 +msgid "Pad around object" +msgstr "" + +#: src/slic3r/GUI/Tab.hpp:373 src/slic3r/GUI/Tab.hpp:495 msgid "Print Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:353 +#: src/slic3r/GUI/Tab.hpp:404 msgid "Filament Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:389 +#: src/slic3r/GUI/Tab.hpp:445 msgid "Printer Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:413 +#: src/slic3r/GUI/Tab.hpp:479 msgid "Material Settings" msgstr "" -#: src/slic3r/GUI/Tab.hpp:440 -msgid "Save preset" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:137 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:146 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:845 +msgid "Undef" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:525 +msgid "PrusaSlicer is closing: Unsaved Changes" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:542 +msgid "Switching Presets: Unsaved Changes" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:608 +msgid "Old Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:609 +msgid "New Value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:640 +msgid "Transfer" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:641 +msgid "Discard" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:642 +msgid "Save" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:662 +msgid "PrusaSlicer will remember your action." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:664 +msgid "" +"You will not be asked about the unsaved changes the next time you close " +"PrusaSlicer." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:665 +msgid "" +"You will not be asked about the unsaved changes the next time you switch a " +"preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:666 +msgid "" +"Visit \"Preferences\" and check \"%1%\"\n" +"to be asked about unsaved changes again." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:668 +msgid "PrusaSlicer: Don't ask me again" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:735 +msgid "" +"Some fields are too long to fit. Right mouse click reveals the full text." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:737 +msgid "All settings changes will be discarded." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740 +msgid "Save the selected options." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740 +msgid "Transfer the selected settings to the newly selected preset." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:744 +msgid "Save the selected options to preset \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:745 +msgid "Transfer the selected options to the newly selected preset \"%1%\"." +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1004 +msgid "The following presets were modified:" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1009 +msgid "Preset \"%1%\" has the following unsaved changes:" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1013 +msgid "" +"Preset \"%1%\" is not compatible with the new printer profile and it has the " +"following unsaved changes:" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1014 +msgid "" +"Preset \"%1%\" is not compatible with the new print profile and it has the " +"following unsaved changes:" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1061 +msgid "Extruders count" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1177 +msgid "Old value" +msgstr "" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1178 +msgid "New value" msgstr "" #: src/slic3r/GUI/UpdateDialogs.cpp:38 @@ -4721,39 +7127,40 @@ msgstr "" msgid "New version of %s is available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:45 +#: src/slic3r/GUI/UpdateDialogs.cpp:43 msgid "Current version:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:47 +#: src/slic3r/GUI/UpdateDialogs.cpp:45 msgid "New version:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:55 +#: src/slic3r/GUI/UpdateDialogs.cpp:53 msgid "Changelog && Download" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:62 src/slic3r/GUI/UpdateDialogs.cpp:127 +#: 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:67 +#: src/slic3r/GUI/UpdateDialogs.cpp:65 msgid "Open download page" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 +#: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:91 src/slic3r/GUI/UpdateDialogs.cpp:207 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:91 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 msgid "Configuration update is available" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:92 msgid "" "Would you like to install it?\n" "\n" @@ -4763,21 +7170,41 @@ msgid "" "Updated configuration bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:115 +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 msgid "Comment:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 #, possible-c-format msgid "%s incompatibility" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:152 +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +msgid "You must install a configuration update." +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#, possible-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 "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 +#, possible-c-format +msgid "Exit %s" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:211 #, possible-c-format msgid "%s configuration is incompatible" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:157 +#: src/slic3r/GUI/UpdateDialogs.cpp:216 #, possible-c-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -4787,28 +7214,23 @@ msgid "" "\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.\n" +"existing configuration before installing files compatible with this %s." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:166 +#: src/slic3r/GUI/UpdateDialogs.cpp:225 #, possible-c-format msgid "This %s version: %s" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:171 +#: src/slic3r/GUI/UpdateDialogs.cpp:230 msgid "Incompatible bundles:" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:187 -#, possible-c-format -msgid "Exit %s" -msgstr "" - -#: src/slic3r/GUI/UpdateDialogs.cpp:190 +#: src/slic3r/GUI/UpdateDialogs.cpp:249 msgid "Re-configure" msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:211 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 #, possible-c-format msgid "" "%s now uses an updated configuration structure.\n" @@ -4824,15 +7246,28 @@ msgid "" "choose whether to enable automatic preset updates." msgstr "" -#: src/slic3r/GUI/UpdateDialogs.cpp:227 +#: src/slic3r/GUI/UpdateDialogs.cpp:287 msgid "For more information please visit our wiki page:" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +#: src/slic3r/GUI/UpdateDialogs.cpp:304 +msgid "Configuration updates" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:304 +msgid "No updates available" +msgstr "" + +#: src/slic3r/GUI/UpdateDialogs.cpp:309 +#, possible-c-format +msgid "%s has no configuration updates available." +msgstr "" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 +#: src/slic3r/GUI/WipeTowerDialog.cpp:41 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -4845,63 +7280,63 @@ msgid "" "jams, extruder wheel grinding into filament etc." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 msgid "Total rammed volume" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 msgid "Ramming line width" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 msgid "Ramming line spacing" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:226 +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 msgid "unloaded" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +#: src/slic3r/GUI/WipeTowerDialog.cpp:285 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 msgid "Volume to purge (mm³) when the filament is being" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 msgid "From" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:327 +#: src/slic3r/GUI/WipeTowerDialog.cpp:365 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -4909,107 +7344,61 @@ msgid "" "Do you want to proceed?" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show simplified settings" msgstr "" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show advanced settings" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:471 -msgid "Instances" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:475 src/slic3r/GUI/wxExtensions.cpp:619 -#, possible-c-format -msgid "Instance %d" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:509 -msgid "Range" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:2731 -msgid "One layer mode" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:2732 -msgid "Add/Del color change" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:2733 -msgid "Discard all color changes" -msgstr "" - -#: src/slic3r/GUI/wxExtensions.cpp:2993 +#: src/slic3r/GUI/wxExtensions.cpp:623 #, possible-c-format msgid "Switch to the %s mode" msgstr "" -#: src/slic3r/GUI/wxExtensions.cpp:2994 +#: src/slic3r/GUI/wxExtensions.cpp:624 #, possible-c-format msgid "Current mode is %s" msgstr "" -#: src/slic3r/Utils/Duet.cpp:51 -msgid "Connection to Duet works correctly." -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:56 -msgid "Could not connect to Duet" -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 -msgid "Unknown error occured" -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:148 -msgid "Wrong password" -msgstr "" - -#: src/slic3r/Utils/Duet.cpp:151 -msgid "Could not get resources to create a new connection" -msgstr "" - -#: src/slic3r/Utils/OctoPrint.cpp:70 +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68 #, possible-c-format msgid "Mismatched type of print host: %s" msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:85 -msgid "Connection to OctoPrint works correctly." +#: src/slic3r/Utils/AstroBox.cpp:84 +msgid "Connection to AstroBox works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:91 -msgid "Could not connect to OctoPrint" +#: src/slic3r/Utils/AstroBox.cpp:90 +msgid "Could not connect to AstroBox" msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:91 -msgid "Note: OctoPrint version at least 1.1.0 is required." +#: src/slic3r/Utils/AstroBox.cpp:92 +msgid "Note: AstroBox version at least 1.1.0 is required." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:196 -msgid "Connection to Prusa SL1 works correctly." +#: src/slic3r/Utils/Duet.cpp:47 +msgid "Connection to Duet works correctly." msgstr "" -#: src/slic3r/Utils/OctoPrint.cpp:201 -msgid "Could not connect to Prusa SLA" +#: src/slic3r/Utils/Duet.cpp:53 +msgid "Could not connect to Duet" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:614 -#, possible-c-format -msgid "requires min. %s and max. %s" +#: src/slic3r/Utils/Duet.cpp:88 src/slic3r/Utils/Duet.cpp:151 +#: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143 +#: src/slic3r/Utils/FlashAir.cpp:159 +msgid "Unknown error occured" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:619 -#, possible-c-format -msgid "requires min. %s" +#: src/slic3r/Utils/Duet.cpp:145 +msgid "Wrong password" msgstr "" -#: src/slic3r/Utils/PresetUpdater.cpp:621 -#, possible-c-format -msgid "requires max. %s" +#: src/slic3r/Utils/Duet.cpp:148 +msgid "Could not get resources to create a new connection" msgstr "" #: src/slic3r/Utils/FixModelByWin10.cpp:219 @@ -5045,7 +7434,7 @@ msgid "Model fixing" msgstr "" #: src/slic3r/Utils/FixModelByWin10.cpp:341 -msgid "Exporting model..." +msgid "Exporting model" msgstr "" #: src/slic3r/Utils/FixModelByWin10.cpp:368 @@ -5090,230 +7479,359 @@ msgid "Model Repair by the Netfabb service" msgstr "" #: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" +msgid "Model repair failed:" msgstr "" -#: src/libslic3r/Zipper.cpp:32 +#: 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 "" + +#: src/slic3r/Utils/FlashAir.cpp:74 +msgid "Could not connect to FlashAir" +msgstr "" + +#: src/slic3r/Utils/FlashAir.cpp:76 +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:83 +msgid "Connection to OctoPrint works correctly." +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:89 +msgid "Could not connect to OctoPrint" +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:91 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:185 +msgid "Connection to Prusa SL1 works correctly." +msgstr "" + +#: src/slic3r/Utils/OctoPrint.cpp:191 +msgid "Could not connect to Prusa SLA" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:727 +#, possible-c-format +msgid "requires min. %s and max. %s" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:731 +#, possible-c-format +msgid "requires min. %s" +msgstr "" + +#: src/slic3r/Utils/PresetUpdater.cpp:734 +#, possible-c-format +msgid "requires max. %s" +msgstr "" + +#: 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:602 +msgid "There is an object with no extrusions on the first layer." +msgstr "" + +#: src/libslic3r/GCode.cpp:620 +msgid "Empty layers detected, the output would not be printable." +msgstr "" + +#: src/libslic3r/GCode.cpp:621 +msgid "Print z" +msgstr "" + +#: src/libslic3r/GCode.cpp:622 +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/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" +#: src/libslic3r/Preset.cpp:1258 +msgid "filament" msgstr "" -#: src/libslic3r/Print.cpp:1112 +#: src/libslic3r/Print.cpp:1246 msgid "All objects are outside of the print volume." msgstr "" -#: src/libslic3r/Print.cpp:1139 +#: src/libslic3r/Print.cpp:1249 +msgid "The supplied settings will cause an empty print." +msgstr "" + +#: src/libslic3r/Print.cpp:1253 msgid "Some objects are too close; your extruder will collide with them." msgstr "" -#: src/libslic3r/Print.cpp:1154 +#: src/libslic3r/Print.cpp:1255 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." msgstr "" -#: src/libslic3r/Print.cpp:1164 +#: src/libslic3r/Print.cpp:1264 msgid "The Spiral Vase option can only be used when printing a single object." msgstr "" -#: src/libslic3r/Print.cpp:1171 +#: src/libslic3r/Print.cpp:1271 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" -#: src/libslic3r/Print.cpp:1184 +#: src/libslic3r/Print.cpp:1284 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:1189 +#: src/libslic3r/Print.cpp:1290 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:1191 +#: src/libslic3r/Print.cpp:1292 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." msgstr "" -#: src/libslic3r/Print.cpp:1193 +#: src/libslic3r/Print.cpp:1294 msgid "Ooze prevention is currently not supported with the wipe tower enabled." msgstr "" -#: src/libslic3r/Print.cpp:1214 +#: src/libslic3r/Print.cpp:1296 +msgid "" +"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." +msgstr "" + +#: src/libslic3r/Print.cpp:1298 +msgid "" +"The Wipe Tower is currently not supported for multimaterial sequential " +"prints." +msgstr "" + +#: src/libslic3r/Print.cpp:1319 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" -#: src/libslic3r/Print.cpp:1216 +#: src/libslic3r/Print.cpp:1321 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:1218 +#: src/libslic3r/Print.cpp:1323 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:1220 +#: src/libslic3r/Print.cpp:1325 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" -#: src/libslic3r/Print.cpp:1248 +#: src/libslic3r/Print.cpp:1367 msgid "" -"The Wipe tower is only supported if all objects have the same layer height " -"profile" +"The Wipe tower is only supported if all objects have the same variable layer " +"height" msgstr "" -#: src/libslic3r/Print.cpp:1258 -msgid "The supplied settings will cause an empty print." -msgstr "" - -#: src/libslic3r/Print.cpp:1275 +#: src/libslic3r/Print.cpp:1393 msgid "" "One or more object were assigned an extruder that the printer does not have." msgstr "" -#: src/libslic3r/Print.cpp:1284 +#: src/libslic3r/Print.cpp:1402 msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1287 +#: src/libslic3r/Print.cpp:1405 msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" msgstr "" -#: src/libslic3r/Print.cpp:1298 +#: src/libslic3r/Print.cpp:1416 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -5321,13 +7839,13 @@ msgid "" "same diameter." msgstr "" -#: src/libslic3r/Print.cpp:1306 +#: src/libslic3r/Print.cpp:1424 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:1310 +#: src/libslic3r/Print.cpp:1428 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 " @@ -5335,104 +7853,136 @@ msgid "" "set to 0)." msgstr "" -#: src/libslic3r/Print.cpp:1332 +#: src/libslic3r/Print.cpp:1450 msgid "First layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1337 +#: src/libslic3r/Print.cpp:1455 msgid "Layer height can't be greater than nozzle diameter" msgstr "" -#: src/libslic3r/Print.cpp:1492 +#: src/libslic3r/Print.cpp:1614 msgid "Infilling layers" msgstr "" -#: src/libslic3r/Print.cpp:1500 +#: src/libslic3r/Print.cpp:1640 msgid "Generating skirt" msgstr "" -#: src/libslic3r/Print.cpp:1508 +#: src/libslic3r/Print.cpp:1649 msgid "Generating brim" msgstr "" -#: src/libslic3r/Print.cpp:1536 +#: src/libslic3r/Print.cpp:1672 msgid "Exporting G-code" msgstr "" -#: src/libslic3r/Print.cpp:1540 +#: src/libslic3r/Print.cpp:1676 msgid "Generating G-code" msgstr "" -#: src/libslic3r/SLAPrint.cpp:64 -msgid "Slicing model" +#: src/libslic3r/SLA/Pad.cpp:532 +msgid "Pad brim size is too small for the current configuration." msgstr "" -#: src/libslic3r/SLAPrint.cpp:65 src/libslic3r/SLAPrint.cpp:899 -msgid "Generating support points" -msgstr "" - -#: src/libslic3r/SLAPrint.cpp:66 -msgid "Generating support tree" -msgstr "" - -#: src/libslic3r/SLAPrint.cpp:67 -msgid "Generating pad" -msgstr "" - -#: src/libslic3r/SLAPrint.cpp:68 -msgid "Slicing supports" -msgstr "" - -#: src/libslic3r/SLAPrint.cpp:85 -msgid "Merging slices and calculating statistics" -msgstr "" - -#: src/libslic3r/SLAPrint.cpp:86 -msgid "Rasterizing layers" -msgstr "" - -#: src/libslic3r/SLAPrint.cpp:661 +#: src/libslic3r/SLAPrint.cpp:628 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." msgstr "" -#: src/libslic3r/SLAPrint.cpp:678 +#: 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:684 +#: 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:696 +#: src/libslic3r/SLAPrint.cpp:661 msgid "Exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:703 +#: src/libslic3r/SLAPrint.cpp:668 msgid "Initial exposition time is out of printer profile bounds." msgstr "" -#: src/libslic3r/SLAPrint.cpp:787 +#: 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/SLAPrint.cpp:982 src/libslic3r/SLAPrint.cpp:992 -#: src/libslic3r/SLAPrint.cpp:1033 +#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420 +#: src/libslic3r/SLAPrintSteps.cpp:459 msgid "Visualizing supports" msgstr "" -#: src/libslic3r/SLAPrint.cpp:1566 -msgid "Slicing done" +#: src/libslic3r/SLAPrintSteps.cpp:451 +msgid "No pad can be generated for this model with the current configuration" msgstr "" -#: src/libslic3r/PrintBase.cpp:71 +#: 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 "" @@ -5452,101 +8002,131 @@ msgstr "" msgid "Bed custom model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:68 +#: 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:75 +#: src/libslic3r/PrintConfig.cpp:80 msgid "Max print height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:76 +#: 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:82 +#: src/libslic3r/PrintConfig.cpp:89 msgid "Slice gap closing radius" msgstr "" -#: src/libslic3r/PrintConfig.cpp:84 +#: 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:92 -msgid "Hostname, IP or URL" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:93 -msgid "" -"Slic3r can upload G-code files to a printer host. This field should contain " -"the hostname, IP address or URL of the printer host instance." -msgstr "" - #: src/libslic3r/PrintConfig.cpp:99 -msgid "API Key / Password" +msgid "Hostname, IP or URL" msgstr "" #: src/libslic3r/PrintConfig.cpp:100 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " -"the API Key or the password required for authentication." +"the hostname, IP address or URL of the printer host instance." msgstr "" #: src/libslic3r/PrintConfig.cpp:106 -msgid "HTTPS CA File" +msgid "API Key / Password" msgstr "" #: src/libslic3r/PrintConfig.cpp:107 msgid "" +"Slic3r can upload G-code files to a printer host. This field should contain " +"the API Key or the password required for authentication." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp: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:121 +#: 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 "" + +#: 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:176 msgid "Avoid crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:122 +#: 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 "" -#: src/libslic3r/PrintConfig.cpp:129 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:184 src/libslic3r/PrintConfig.cpp:2197 msgid "Other layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:130 +#: 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 "" -#: src/libslic3r/PrintConfig.cpp:132 +#: src/libslic3r/PrintConfig.cpp:188 msgid "Bed temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:139 +#: 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 "" -#: src/libslic3r/PrintConfig.cpp:149 +#: src/libslic3r/PrintConfig.cpp:205 msgid "Between objects G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:150 +#: 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; " @@ -5556,70 +8136,81 @@ msgid "" "S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:161 +#: src/libslic3r/PrintConfig.cpp:217 msgid "Number of solid layers to generate on bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:162 +#: src/libslic3r/PrintConfig.cpp:218 msgid "Bottom solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:167 +#: 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:168 +#: 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 "" -#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:313 -#: src/libslic3r/PrintConfig.cpp:840 src/libslic3r/PrintConfig.cpp:961 -#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:1183 -#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:380 +#: src/libslic3r/PrintConfig.cpp:909 src/libslic3r/PrintConfig.cpp:1037 +#: src/libslic3r/PrintConfig.cpp:1269 src/libslic3r/PrintConfig.cpp:1318 +#: src/libslic3r/PrintConfig.cpp:1328 src/libslic3r/PrintConfig.cpp:1522 msgid "mm/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:176 +#: src/libslic3r/PrintConfig.cpp:243 msgid "Bridging angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:178 +#: 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 "" -#: src/libslic3r/PrintConfig.cpp:181 src/libslic3r/PrintConfig.cpp:758 -#: src/libslic3r/PrintConfig.cpp:1619 src/libslic3r/PrintConfig.cpp:1629 -#: src/libslic3r/PrintConfig.cpp:1858 src/libslic3r/PrintConfig.cpp:2012 -#: src/libslic3r/PrintConfig.cpp:2197 src/libslic3r/PrintConfig.cpp:2614 -#: src/libslic3r/PrintConfig.cpp:2724 +#: src/libslic3r/PrintConfig.cpp:248 src/libslic3r/PrintConfig.cpp:823 +#: src/libslic3r/PrintConfig.cpp:1759 src/libslic3r/PrintConfig.cpp:1769 +#: src/libslic3r/PrintConfig.cpp:2027 src/libslic3r/PrintConfig.cpp:2182 +#: src/libslic3r/PrintConfig.cpp:2381 src/libslic3r/PrintConfig.cpp:2882 +#: src/libslic3r/PrintConfig.cpp:3003 msgid "°" msgstr "" -#: src/libslic3r/PrintConfig.cpp:187 +#: src/libslic3r/PrintConfig.cpp:254 msgid "Bridges fan speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:188 +#: src/libslic3r/PrintConfig.cpp:255 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "" -#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:770 -#: src/libslic3r/PrintConfig.cpp:1203 src/libslic3r/PrintConfig.cpp:1266 -#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:2366 -#: src/libslic3r/PrintConfig.cpp:2654 +#: src/libslic3r/PrintConfig.cpp:256 src/libslic3r/PrintConfig.cpp:835 +#: src/libslic3r/PrintConfig.cpp:1157 src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1651 +#: src/libslic3r/PrintConfig.cpp:2559 src/libslic3r/PrintConfig.cpp:2796 +#: src/libslic3r/PrintConfig.cpp:2922 msgid "%" msgstr "" -#: src/libslic3r/PrintConfig.cpp:196 +#: src/libslic3r/PrintConfig.cpp:263 msgid "Bridge flow ratio" msgstr "" -#: src/libslic3r/PrintConfig.cpp:198 +#: 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 " @@ -5627,83 +8218,84 @@ msgid "" "before tweaking this." msgstr "" -#: src/libslic3r/PrintConfig.cpp:208 +#: src/libslic3r/PrintConfig.cpp:275 msgid "Bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:210 +#: src/libslic3r/PrintConfig.cpp:277 msgid "Speed for printing bridges." msgstr "" -#: src/libslic3r/PrintConfig.cpp:211 src/libslic3r/PrintConfig.cpp:592 -#: src/libslic3r/PrintConfig.cpp:600 src/libslic3r/PrintConfig.cpp:609 -#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:644 -#: src/libslic3r/PrintConfig.cpp:663 src/libslic3r/PrintConfig.cpp:899 -#: src/libslic3r/PrintConfig.cpp:1026 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1161 -#: src/libslic3r/PrintConfig.cpp:1172 src/libslic3r/PrintConfig.cpp:1225 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1412 -#: src/libslic3r/PrintConfig.cpp:1586 src/libslic3r/PrintConfig.cpp:1595 -#: src/libslic3r/PrintConfig.cpp:1991 src/libslic3r/PrintConfig.cpp:2104 +#: src/libslic3r/PrintConfig.cpp:278 src/libslic3r/PrintConfig.cpp:652 +#: src/libslic3r/PrintConfig.cpp:660 src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:677 src/libslic3r/PrintConfig.cpp:704 +#: src/libslic3r/PrintConfig.cpp:723 src/libslic3r/PrintConfig.cpp:973 +#: src/libslic3r/PrintConfig.cpp:1103 src/libslic3r/PrintConfig.cpp:1176 +#: src/libslic3r/PrintConfig.cpp:1252 src/libslic3r/PrintConfig.cpp:1286 +#: src/libslic3r/PrintConfig.cpp:1298 src/libslic3r/PrintConfig.cpp:1308 +#: src/libslic3r/PrintConfig.cpp:1358 src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1735 src/libslic3r/PrintConfig.cpp:2161 +#: src/libslic3r/PrintConfig.cpp:2288 msgid "mm/s" msgstr "" -#: src/libslic3r/PrintConfig.cpp:218 +#: src/libslic3r/PrintConfig.cpp:285 msgid "Brim width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:219 +#: 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:226 +#: src/libslic3r/PrintConfig.cpp:293 msgid "Clip multi-part objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:227 +#: 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 "" -#: src/libslic3r/PrintConfig.cpp:234 +#: src/libslic3r/PrintConfig.cpp:301 msgid "Colorprint height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:302 msgid "Heights at which a filament change is to occur." msgstr "" -#: src/libslic3r/PrintConfig.cpp:245 +#: src/libslic3r/PrintConfig.cpp:312 msgid "Compatible printers condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:246 +#: 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 "" -#: src/libslic3r/PrintConfig.cpp:260 +#: src/libslic3r/PrintConfig.cpp:327 msgid "Compatible print profiles condition" msgstr "" -#: src/libslic3r/PrintConfig.cpp:261 +#: 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 "" -#: src/libslic3r/PrintConfig.cpp:278 +#: src/libslic3r/PrintConfig.cpp:345 msgid "Complete individual objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:279 +#: 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). " @@ -5711,114 +8303,97 @@ msgid "" "warn and prevent you from extruder collisions, but beware." msgstr "" -#: src/libslic3r/PrintConfig.cpp:287 +#: src/libslic3r/PrintConfig.cpp:354 msgid "Enable auto cooling" msgstr "" -#: src/libslic3r/PrintConfig.cpp:288 +#: 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:293 +#: src/libslic3r/PrintConfig.cpp:360 msgid "Cooling tube position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:294 +#: src/libslic3r/PrintConfig.cpp:361 msgid "Distance of the center-point of the cooling tube from the extruder tip." msgstr "" -#: src/libslic3r/PrintConfig.cpp:301 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Cooling tube length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:302 +#: src/libslic3r/PrintConfig.cpp:369 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:310 +#: 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 "" -#: src/libslic3r/PrintConfig.cpp:319 +#: src/libslic3r/PrintConfig.cpp:386 msgid "Default filament profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:320 +#: 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:326 +#: src/libslic3r/PrintConfig.cpp:393 msgid "Default print profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:327 src/libslic3r/PrintConfig.cpp:2479 -#: src/libslic3r/PrintConfig.cpp:2490 +#: src/libslic3r/PrintConfig.cpp:394 src/libslic3r/PrintConfig.cpp:2726 +#: src/libslic3r/PrintConfig.cpp:2737 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:333 +#: src/libslic3r/PrintConfig.cpp:400 msgid "Disable fan for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:334 +#: 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:336 src/libslic3r/PrintConfig.cpp:971 -#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1669 -#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1894 -#: src/libslic3r/PrintConfig.cpp:1939 -msgid "layers" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:343 +#: src/libslic3r/PrintConfig.cpp:410 msgid "Don't support bridges" msgstr "" -#: src/libslic3r/PrintConfig.cpp:345 +#: src/libslic3r/PrintConfig.cpp:412 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" -#: src/libslic3r/PrintConfig.cpp:351 +#: src/libslic3r/PrintConfig.cpp:418 msgid "Distance between copies" msgstr "" -#: src/libslic3r/PrintConfig.cpp:352 +#: src/libslic3r/PrintConfig.cpp:419 msgid "Distance used for the auto-arrange feature of the plater." msgstr "" -#: src/libslic3r/PrintConfig.cpp:359 -msgid "Elephant foot compensation" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:361 -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:370 +#: 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 "" -#: src/libslic3r/PrintConfig.cpp:380 +#: 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 " @@ -5827,62 +8402,66 @@ msgid "" "in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:391 +#: src/libslic3r/PrintConfig.cpp:448 msgid "Ensure vertical shell thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:393 +#: 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:399 +#: src/libslic3r/PrintConfig.cpp:456 msgid "Top fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:401 +#: 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:409 src/libslic3r/PrintConfig.cpp:821 -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:467 src/libslic3r/PrintConfig.cpp:888 +#: src/libslic3r/PrintConfig.cpp:2142 msgid "Rectilinear" msgstr "" -#: src/libslic3r/PrintConfig.cpp:410 src/libslic3r/PrintConfig.cpp:827 +#: src/libslic3r/PrintConfig.cpp:468 +msgid "Monotonic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:469 src/libslic3r/PrintConfig.cpp:894 msgid "Concentric" msgstr "" -#: src/libslic3r/PrintConfig.cpp:411 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:470 src/libslic3r/PrintConfig.cpp:898 msgid "Hilbert Curve" msgstr "" -#: src/libslic3r/PrintConfig.cpp:412 src/libslic3r/PrintConfig.cpp:832 +#: src/libslic3r/PrintConfig.cpp:471 src/libslic3r/PrintConfig.cpp:899 msgid "Archimedean Chords" msgstr "" -#: src/libslic3r/PrintConfig.cpp:413 src/libslic3r/PrintConfig.cpp:833 +#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:900 msgid "Octagram Spiral" msgstr "" -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:478 msgid "Bottom fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:421 +#: src/libslic3r/PrintConfig.cpp:480 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:430 src/libslic3r/PrintConfig.cpp:440 +#: src/libslic3r/PrintConfig.cpp:489 src/libslic3r/PrintConfig.cpp:500 msgid "External perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:432 +#: src/libslic3r/PrintConfig.cpp:491 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, " @@ -5890,43 +8469,43 @@ msgid "" "(for example 200%), it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:435 src/libslic3r/PrintConfig.cpp:543 -#: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:872 -#: src/libslic3r/PrintConfig.cpp:992 src/libslic3r/PrintConfig.cpp:1017 -#: src/libslic3r/PrintConfig.cpp:1403 src/libslic3r/PrintConfig.cpp:1741 -#: src/libslic3r/PrintConfig.cpp:1847 src/libslic3r/PrintConfig.cpp:1915 -#: src/libslic3r/PrintConfig.cpp:2074 +#: src/libslic3r/PrintConfig.cpp:494 src/libslic3r/PrintConfig.cpp:603 +#: src/libslic3r/PrintConfig.cpp:931 src/libslic3r/PrintConfig.cpp:944 +#: src/libslic3r/PrintConfig.cpp:1068 src/libslic3r/PrintConfig.cpp:1094 +#: src/libslic3r/PrintConfig.cpp:1542 src/libslic3r/PrintConfig.cpp:1867 +#: src/libslic3r/PrintConfig.cpp:2016 src/libslic3r/PrintConfig.cpp:2084 +#: src/libslic3r/PrintConfig.cpp:2245 msgid "mm or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:442 +#: src/libslic3r/PrintConfig.cpp:502 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:445 src/libslic3r/PrintConfig.cpp:881 -#: src/libslic3r/PrintConfig.cpp:1700 src/libslic3r/PrintConfig.cpp:1751 -#: src/libslic3r/PrintConfig.cpp:1958 src/libslic3r/PrintConfig.cpp:2086 +#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:953 +#: src/libslic3r/PrintConfig.cpp:1826 src/libslic3r/PrintConfig.cpp:1878 +#: src/libslic3r/PrintConfig.cpp:2128 src/libslic3r/PrintConfig.cpp:2258 msgid "mm/s or %" msgstr "" -#: src/libslic3r/PrintConfig.cpp:452 +#: src/libslic3r/PrintConfig.cpp:512 msgid "External perimeters first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:454 +#: src/libslic3r/PrintConfig.cpp:514 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:460 +#: src/libslic3r/PrintConfig.cpp:520 msgid "Extra perimeters if needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:462 +#: src/libslic3r/PrintConfig.cpp:522 #, possible-c-format msgid "" "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r " @@ -5934,14 +8513,14 @@ msgid "" "is supported." msgstr "" -#: src/libslic3r/PrintConfig.cpp:472 +#: src/libslic3r/PrintConfig.cpp:532 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:484 +#: src/libslic3r/PrintConfig.cpp:544 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 " @@ -5949,30 +8528,26 @@ msgid "" "extruder can peek before colliding with other printed objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:494 -msgid "Radius" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:495 +#: src/libslic3r/PrintConfig.cpp:555 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:505 +#: src/libslic3r/PrintConfig.cpp:565 msgid "Extruder Color" msgstr "" -#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:566 +#: src/libslic3r/PrintConfig.cpp:566 src/libslic3r/PrintConfig.cpp:626 msgid "This is only used in the Slic3r interface as a visual help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:512 +#: src/libslic3r/PrintConfig.cpp:572 msgid "Extruder offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:513 +#: src/libslic3r/PrintConfig.cpp:573 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 " @@ -5980,21 +8555,21 @@ msgid "" "coordinates (they will be subtracted from the XY coordinate)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:522 +#: src/libslic3r/PrintConfig.cpp:582 msgid "Extrusion axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:523 +#: src/libslic3r/PrintConfig.cpp:583 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:528 +#: src/libslic3r/PrintConfig.cpp:588 msgid "Extrusion multiplier" msgstr "" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:589 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. " @@ -6002,11 +8577,11 @@ msgid "" "more, check filament diameter and your firmware E steps." msgstr "" -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:597 msgid "Default extrusion width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:599 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 " @@ -6015,119 +8590,119 @@ msgid "" "height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:548 +#: src/libslic3r/PrintConfig.cpp:609 msgid "Keep fan always on" msgstr "" -#: src/libslic3r/PrintConfig.cpp:549 +#: src/libslic3r/PrintConfig.cpp:610 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:554 +#: src/libslic3r/PrintConfig.cpp:615 msgid "Enable fan if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:555 +#: src/libslic3r/PrintConfig.cpp:616 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:557 src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:618 src/libslic3r/PrintConfig.cpp:1814 msgid "approximate seconds" msgstr "" -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:631 msgid "Filament notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:632 msgid "You can put your notes regarding the filament here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:580 src/libslic3r/PrintConfig.cpp:1231 +#: src/libslic3r/PrintConfig.cpp:640 src/libslic3r/PrintConfig.cpp:1364 msgid "Max volumetric speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:581 +#: src/libslic3r/PrintConfig.cpp:641 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:590 +#: src/libslic3r/PrintConfig.cpp:650 msgid "Loading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:651 msgid "Speed used for loading the filament on the wipe tower." msgstr "" -#: src/libslic3r/PrintConfig.cpp:598 +#: src/libslic3r/PrintConfig.cpp:658 msgid "Loading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:599 +#: src/libslic3r/PrintConfig.cpp:659 msgid "Speed used at the very beginning of loading phase." msgstr "" -#: src/libslic3r/PrintConfig.cpp:606 +#: src/libslic3r/PrintConfig.cpp:666 msgid "Unloading speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:607 +#: src/libslic3r/PrintConfig.cpp:667 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:615 +#: src/libslic3r/PrintConfig.cpp:675 msgid "Unloading speed at the start" msgstr "" -#: src/libslic3r/PrintConfig.cpp:616 +#: src/libslic3r/PrintConfig.cpp:676 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "" -#: src/libslic3r/PrintConfig.cpp:623 +#: src/libslic3r/PrintConfig.cpp:683 msgid "Delay after unloading" msgstr "" -#: src/libslic3r/PrintConfig.cpp:624 +#: src/libslic3r/PrintConfig.cpp:684 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:633 +#: src/libslic3r/PrintConfig.cpp:693 msgid "Number of cooling moves" msgstr "" -#: src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:694 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:642 +#: src/libslic3r/PrintConfig.cpp:702 msgid "Speed of the first cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:643 +#: src/libslic3r/PrintConfig.cpp:703 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:650 +#: src/libslic3r/PrintConfig.cpp:710 msgid "Minimal purge on wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:651 +#: src/libslic3r/PrintConfig.cpp:711 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 " @@ -6136,62 +8711,63 @@ msgid "" "to produce successive infill or sacrificial object extrusions reliably." msgstr "" -#: src/libslic3r/PrintConfig.cpp:655 +#: src/libslic3r/PrintConfig.cpp:715 msgid "mm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:661 +#: src/libslic3r/PrintConfig.cpp:721 msgid "Speed of the last cooling move" msgstr "" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:729 msgid "Filament load time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:670 +#: src/libslic3r/PrintConfig.cpp:730 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:677 +#: src/libslic3r/PrintConfig.cpp:737 msgid "Ramming parameters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:738 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:684 +#: src/libslic3r/PrintConfig.cpp:744 msgid "Filament unload time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:745 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:693 +#: src/libslic3r/PrintConfig.cpp:753 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:700 +#: src/libslic3r/PrintConfig.cpp:760 src/libslic3r/PrintConfig.cpp:2637 +#: src/libslic3r/PrintConfig.cpp:2638 msgid "Density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:701 +#: src/libslic3r/PrintConfig.cpp:761 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 " @@ -6199,113 +8775,129 @@ msgid "" "displacement." msgstr "" -#: src/libslic3r/PrintConfig.cpp:704 +#: src/libslic3r/PrintConfig.cpp:764 msgid "g/cm³" msgstr "" -#: src/libslic3r/PrintConfig.cpp:709 +#: src/libslic3r/PrintConfig.cpp:769 msgid "Filament type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:710 +#: src/libslic3r/PrintConfig.cpp:770 msgid "The filament material type for use in custom G-codes." msgstr "" -#: src/libslic3r/PrintConfig.cpp:736 +#: src/libslic3r/PrintConfig.cpp:797 msgid "Soluble material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:737 +#: src/libslic3r/PrintConfig.cpp:798 msgid "Soluble material is most likely used for a soluble support." msgstr "" -#: src/libslic3r/PrintConfig.cpp:743 +#: src/libslic3r/PrintConfig.cpp:804 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:805 msgid "money/kg" msgstr "" -#: src/libslic3r/PrintConfig.cpp:753 +#: src/libslic3r/PrintConfig.cpp:814 src/libslic3r/PrintConfig.cpp:2721 +msgid "(Unknown)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:818 msgid "Fill angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:820 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:767 +#: src/libslic3r/PrintConfig.cpp:832 msgid "Fill density" msgstr "" -#: src/libslic3r/PrintConfig.cpp:769 +#: src/libslic3r/PrintConfig.cpp:834 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "" -#: src/libslic3r/PrintConfig.cpp:804 +#: src/libslic3r/PrintConfig.cpp:869 msgid "Fill pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:806 +#: src/libslic3r/PrintConfig.cpp:871 msgid "Fill pattern for general low-density infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:822 +#: src/libslic3r/PrintConfig.cpp:889 msgid "Grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:823 +#: src/libslic3r/PrintConfig.cpp:890 msgid "Triangles" msgstr "" -#: src/libslic3r/PrintConfig.cpp:824 +#: src/libslic3r/PrintConfig.cpp:891 msgid "Stars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:825 +#: src/libslic3r/PrintConfig.cpp:892 msgid "Cubic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:826 +#: src/libslic3r/PrintConfig.cpp:893 msgid "Line" msgstr "" -#: src/libslic3r/PrintConfig.cpp:828 src/libslic3r/PrintConfig.cpp:1974 +#: src/libslic3r/PrintConfig.cpp:895 src/libslic3r/PrintConfig.cpp:2144 msgid "Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:829 +#: src/libslic3r/PrintConfig.cpp:896 msgid "3D Honeycomb" msgstr "" -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:897 msgid "Gyroid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:837 src/libslic3r/PrintConfig.cpp:846 -#: src/libslic3r/PrintConfig.cpp:854 src/libslic3r/PrintConfig.cpp:887 +#: src/libslic3r/PrintConfig.cpp:901 +msgid "Adaptive Cubic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:902 +msgid "Support Cubic" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:906 src/libslic3r/PrintConfig.cpp:915 +#: src/libslic3r/PrintConfig.cpp:925 src/libslic3r/PrintConfig.cpp:959 msgid "First layer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:907 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:847 +#: src/libslic3r/PrintConfig.cpp:916 +msgid "First layer bed temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:917 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:856 +#: src/libslic3r/PrintConfig.cpp:927 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 " @@ -6313,11 +8905,7 @@ msgid "" "layer height. If set to zero, it will use the default extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:866 -msgid "First layer height" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:868 +#: src/libslic3r/PrintConfig.cpp:940 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 " @@ -6325,47 +8913,51 @@ msgid "" "example: 150%) over the default layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:949 msgid "First layer speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:950 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:888 -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." +#: src/libslic3r/PrintConfig.cpp:960 +msgid "First layer nozzle temperature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:897 +#: 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 "" + +#: src/libslic3r/PrintConfig.cpp:971 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:905 +#: src/libslic3r/PrintConfig.cpp:979 msgid "Verbose G-code" msgstr "" -#: src/libslic3r/PrintConfig.cpp:906 +#: src/libslic3r/PrintConfig.cpp:980 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:913 +#: src/libslic3r/PrintConfig.cpp:987 msgid "G-code flavor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:914 +#: src/libslic3r/PrintConfig.cpp:988 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 " @@ -6373,15 +8965,15 @@ msgid "" "extrusion value at all." msgstr "" -#: src/libslic3r/PrintConfig.cpp:937 +#: src/libslic3r/PrintConfig.cpp:1013 msgid "No extrusion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:942 +#: src/libslic3r/PrintConfig.cpp:1018 msgid "Label objects" msgstr "" -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:1019 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 " @@ -6389,46 +8981,46 @@ msgid "" "setup and Wipe into Object / Wipe into Infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:950 +#: src/libslic3r/PrintConfig.cpp:1026 msgid "High extruder current on filament swap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:1027 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:959 +#: src/libslic3r/PrintConfig.cpp:1035 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:967 +#: src/libslic3r/PrintConfig.cpp:1043 msgid "Combine infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:969 +#: src/libslic3r/PrintConfig.cpp:1045 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:972 +#: src/libslic3r/PrintConfig.cpp:1048 msgid "Combine infill every n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1054 msgid "Infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:980 +#: src/libslic3r/PrintConfig.cpp:1056 msgid "The extruder to use when printing infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:988 +#: src/libslic3r/PrintConfig.cpp:1064 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 " @@ -6437,32 +9029,32 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1074 msgid "Infill before perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1075 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1003 +#: src/libslic3r/PrintConfig.cpp:1080 msgid "Only infill where needed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1082 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:1012 +#: src/libslic3r/PrintConfig.cpp:1089 msgid "Infill/perimeters overlap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1014 +#: src/libslic3r/PrintConfig.cpp:1091 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -6470,30 +9062,59 @@ msgid "" "perimeter extrusion width." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1025 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1033 +#: src/libslic3r/PrintConfig.cpp:1110 msgid "Inherits profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1034 +#: src/libslic3r/PrintConfig.cpp:1111 msgid "Name of the profile, from which this profile inherits." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1047 +#: src/libslic3r/PrintConfig.cpp:1124 msgid "Interface shells" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1048 +#: src/libslic3r/PrintConfig.cpp:1125 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:1057 +#: src/libslic3r/PrintConfig.cpp:1133 +msgid "Enable ironing" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1134 +msgid "" +"Enable ironing of the top layers with the hot print head for smooth surface" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1140 src/libslic3r/PrintConfig.cpp:1142 +msgid "Ironing Type" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1154 +msgid "Flow rate" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1156 +msgid "Percent of a flow rate relative to object's normal layer height." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1164 +msgid "Spacing between ironing passes" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1166 +msgid "Distance between ironing lines" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1183 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 " @@ -6501,11 +9122,11 @@ msgid "" "[layer_z]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1068 +#: src/libslic3r/PrintConfig.cpp:1194 msgid "Supports remaining times" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1069 +#: src/libslic3r/PrintConfig.cpp:1195 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. " @@ -6513,151 +9134,175 @@ msgid "" "firmware supports M73 Qxx Sxx for the silent mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1077 +#: src/libslic3r/PrintConfig.cpp:1203 msgid "Supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1078 +#: src/libslic3r/PrintConfig.cpp:1204 msgid "The firmware supports stealth mode" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1102 +#: src/libslic3r/PrintConfig.cpp:1209 +msgid "How to apply limits" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1210 +msgid "Purpose of Machine Limits" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1212 +msgid "How to apply the Machine Limits" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1217 +msgid "Emit to G-code" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1218 +msgid "Use for time estimate" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1219 +msgid "Ignore" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Maximum feedrate X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1103 +#: src/libslic3r/PrintConfig.cpp:1243 msgid "Maximum feedrate Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1104 +#: src/libslic3r/PrintConfig.cpp:1244 msgid "Maximum feedrate Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1105 +#: src/libslic3r/PrintConfig.cpp:1245 msgid "Maximum feedrate E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1108 +#: src/libslic3r/PrintConfig.cpp:1248 msgid "Maximum feedrate of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1109 +#: src/libslic3r/PrintConfig.cpp:1249 msgid "Maximum feedrate of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1110 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "Maximum feedrate of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1251 msgid "Maximum feedrate of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1120 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "Maximum acceleration X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1260 msgid "Maximum acceleration Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1261 msgid "Maximum acceleration Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1123 +#: src/libslic3r/PrintConfig.cpp:1262 msgid "Maximum acceleration E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1126 +#: src/libslic3r/PrintConfig.cpp:1265 msgid "Maximum acceleration of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1127 +#: src/libslic3r/PrintConfig.cpp:1266 msgid "Maximum acceleration of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1128 +#: src/libslic3r/PrintConfig.cpp:1267 msgid "Maximum acceleration of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1129 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "Maximum acceleration of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1138 +#: src/libslic3r/PrintConfig.cpp:1276 msgid "Maximum jerk X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1139 +#: src/libslic3r/PrintConfig.cpp:1277 msgid "Maximum jerk Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1140 +#: src/libslic3r/PrintConfig.cpp:1278 msgid "Maximum jerk Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1141 +#: src/libslic3r/PrintConfig.cpp:1279 msgid "Maximum jerk E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1144 +#: src/libslic3r/PrintConfig.cpp:1282 msgid "Maximum jerk of the X axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1145 +#: src/libslic3r/PrintConfig.cpp:1283 msgid "Maximum jerk of the Y axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1146 +#: src/libslic3r/PrintConfig.cpp:1284 msgid "Maximum jerk of the Z axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1285 msgid "Maximum jerk of the E axis" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1158 +#: src/libslic3r/PrintConfig.cpp:1295 msgid "Minimum feedrate when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1160 +#: src/libslic3r/PrintConfig.cpp:1297 msgid "Minimum feedrate when extruding (M205 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1169 +#: src/libslic3r/PrintConfig.cpp:1305 msgid "Minimum travel feedrate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1171 +#: src/libslic3r/PrintConfig.cpp:1307 msgid "Minimum travel feedrate (M205 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:1315 msgid "Maximum acceleration when extruding" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:1317 msgid "Maximum acceleration when extruding (M204 S)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1191 +#: src/libslic3r/PrintConfig.cpp:1325 msgid "Maximum acceleration when retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1193 +#: src/libslic3r/PrintConfig.cpp:1327 msgid "Maximum acceleration when retracting (M204 T)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1201 src/libslic3r/PrintConfig.cpp:1210 +#: src/libslic3r/PrintConfig.cpp:1334 src/libslic3r/PrintConfig.cpp:1343 msgid "Max" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1335 msgid "This setting represents the maximum speed of your fan." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1211 +#: src/libslic3r/PrintConfig.cpp:1344 #, possible-c-format msgid "" "This is the highest printable layer height for this extruder, used to cap " @@ -6666,28 +9311,28 @@ msgid "" "adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1221 +#: src/libslic3r/PrintConfig.cpp:1354 msgid "Max print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1222 +#: src/libslic3r/PrintConfig.cpp:1355 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:1232 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1374 msgid "Max volumetric slope positive" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1242 src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1375 src/libslic3r/PrintConfig.cpp:1386 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 " @@ -6695,95 +9340,95 @@ msgid "" "s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1257 +#: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1390 msgid "mm³/s²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1385 msgid "Max volumetric slope negative" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1397 src/libslic3r/PrintConfig.cpp:1406 msgid "Min" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1265 +#: src/libslic3r/PrintConfig.cpp:1398 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1274 +#: src/libslic3r/PrintConfig.cpp:1407 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:1282 +#: src/libslic3r/PrintConfig.cpp:1415 msgid "Min print speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1283 +#: src/libslic3r/PrintConfig.cpp:1416 msgid "Slic3r will not scale speed down below this speed." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1290 +#: src/libslic3r/PrintConfig.cpp:1423 msgid "Minimal filament extrusion length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/libslic3r/PrintConfig.cpp:1424 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:1300 +#: src/libslic3r/PrintConfig.cpp:1433 msgid "Configuration notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1301 +#: src/libslic3r/PrintConfig.cpp:1434 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1311 +#: src/libslic3r/PrintConfig.cpp:1444 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1316 +#: src/libslic3r/PrintConfig.cpp:1449 msgid "Host Type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1317 +#: src/libslic3r/PrintConfig.cpp:1450 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:1328 +#: src/libslic3r/PrintConfig.cpp:1467 msgid "Only retract when crossing perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1329 +#: src/libslic3r/PrintConfig.cpp:1468 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:1336 +#: src/libslic3r/PrintConfig.cpp:1475 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:1343 +#: src/libslic3r/PrintConfig.cpp:1482 msgid "Output filename format" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1483 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -6791,31 +9436,31 @@ msgid "" "[input_filename], [input_filename_base]." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1353 +#: src/libslic3r/PrintConfig.cpp:1492 msgid "Detect bridging perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1355 +#: src/libslic3r/PrintConfig.cpp:1494 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:1361 +#: src/libslic3r/PrintConfig.cpp:1500 msgid "Filament parking position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1362 +#: src/libslic3r/PrintConfig.cpp:1501 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:1370 +#: src/libslic3r/PrintConfig.cpp:1509 msgid "Extra loading distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1510 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 " @@ -6823,28 +9468,28 @@ msgid "" "than unloading." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1397 -#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1419 +#: src/libslic3r/PrintConfig.cpp:1518 src/libslic3r/PrintConfig.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:1549 src/libslic3r/PrintConfig.cpp:1559 msgid "Perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1380 +#: src/libslic3r/PrintConfig.cpp:1519 msgid "" "This is the acceleration your printer will use for perimeters. A high value " "like 9000 usually gives good results if your hardware is up to the job. Set " "zero to disable acceleration control for perimeters." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1388 +#: src/libslic3r/PrintConfig.cpp:1527 msgid "Perimeter extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1538 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 " @@ -6853,12 +9498,12 @@ msgid "" "it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1411 +#: src/libslic3r/PrintConfig.cpp:1551 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1421 +#: src/libslic3r/PrintConfig.cpp:1561 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 " @@ -6866,11 +9511,11 @@ msgid "" "Perimeters option is enabled." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1425 +#: src/libslic3r/PrintConfig.cpp:1565 msgid "(minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1433 +#: src/libslic3r/PrintConfig.cpp:1573 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. " @@ -6879,55 +9524,55 @@ msgid "" "environment variables." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1445 +#: src/libslic3r/PrintConfig.cpp:1585 msgid "Printer type" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1446 +#: src/libslic3r/PrintConfig.cpp:1586 msgid "Type of the printer." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1451 +#: src/libslic3r/PrintConfig.cpp:1591 msgid "Printer notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1452 +#: src/libslic3r/PrintConfig.cpp:1592 msgid "You can put your notes regarding the printer here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1600 msgid "Printer vendor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1461 +#: src/libslic3r/PrintConfig.cpp:1601 msgid "Name of the printer vendor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1466 +#: src/libslic3r/PrintConfig.cpp:1606 msgid "Printer variant" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1607 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1620 msgid "Raft layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1622 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Resolution" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -6935,278 +9580,277 @@ msgid "" "simplification and use full resolution from input." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1501 +#: src/libslic3r/PrintConfig.cpp:1641 msgid "Minimum travel after retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1502 +#: src/libslic3r/PrintConfig.cpp:1642 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1648 msgid "Retract amount before wipe" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1649 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:1516 +#: src/libslic3r/PrintConfig.cpp:1656 msgid "Retract on layer change" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1657 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1522 src/libslic3r/PrintConfig.cpp:1530 +#: src/libslic3r/PrintConfig.cpp:1662 src/libslic3r/PrintConfig.cpp:1670 msgid "Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1523 +#: src/libslic3r/PrintConfig.cpp:1663 msgid "Retraction Length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1664 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:1526 src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1666 src/libslic3r/PrintConfig.cpp:1675 msgid "mm (zero to disable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1531 +#: src/libslic3r/PrintConfig.cpp:1671 msgid "Retraction Length (Toolchange)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1532 +#: src/libslic3r/PrintConfig.cpp:1672 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:1540 +#: src/libslic3r/PrintConfig.cpp:1680 msgid "Lift Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1541 +#: src/libslic3r/PrintConfig.cpp:1681 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:1548 +#: src/libslic3r/PrintConfig.cpp:1688 msgid "Above Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1549 +#: src/libslic3r/PrintConfig.cpp:1689 msgid "Only lift Z above" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1550 +#: src/libslic3r/PrintConfig.cpp:1690 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:1557 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "Below Z" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1558 +#: src/libslic3r/PrintConfig.cpp:1698 msgid "Only lift Z below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1699 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:1567 src/libslic3r/PrintConfig.cpp:1575 +#: src/libslic3r/PrintConfig.cpp:1707 src/libslic3r/PrintConfig.cpp:1715 msgid "Extra length on restart" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1708 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:1576 +#: src/libslic3r/PrintConfig.cpp:1716 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1584 +#: src/libslic3r/PrintConfig.cpp:1723 src/libslic3r/PrintConfig.cpp:1724 msgid "Retraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1585 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1591 src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1731 src/libslic3r/PrintConfig.cpp:1732 msgid "Deretraction Speed" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1733 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:1600 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "Seam position" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1602 +#: src/libslic3r/PrintConfig.cpp:1742 msgid "Position of perimeters starting points." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "Random" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1609 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Nearest" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1750 msgid "Aligned" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1618 +#: src/libslic3r/PrintConfig.cpp:1758 msgid "Direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1620 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Preferred direction of the seam" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1621 +#: src/libslic3r/PrintConfig.cpp:1761 msgid "Seam preferred direction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1628 +#: src/libslic3r/PrintConfig.cpp:1768 msgid "Jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1630 +#: src/libslic3r/PrintConfig.cpp:1770 msgid "Seam preferred direction jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1631 +#: src/libslic3r/PrintConfig.cpp:1771 msgid "Preferred direction of the seam - jitter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1641 -msgid "USB/serial port for printer connection." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:1648 -msgid "Serial port speed" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:1649 -msgid "Speed (baud) of USB/serial port for printer connection." -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:1658 +#: src/libslic3r/PrintConfig.cpp:1778 msgid "Distance from object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1779 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:1666 +#: src/libslic3r/PrintConfig.cpp:1786 msgid "Skirt height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1667 +#: src/libslic3r/PrintConfig.cpp:1787 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:1674 +#: src/libslic3r/PrintConfig.cpp:1794 +msgid "Draft shield" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1795 +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:1801 msgid "Loops (minimum)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1675 +#: src/libslic3r/PrintConfig.cpp:1802 msgid "Skirt Loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1676 +#: src/libslic3r/PrintConfig.cpp:1803 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:1684 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Slow down if layer print time is below" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1685 +#: src/libslic3r/PrintConfig.cpp:1812 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:1695 +#: src/libslic3r/PrintConfig.cpp:1821 msgid "Small perimeters" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1697 +#: src/libslic3r/PrintConfig.cpp:1823 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:1707 +#: src/libslic3r/PrintConfig.cpp:1833 msgid "Solid infill threshold area" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1835 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1836 msgid "mm²" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1716 +#: src/libslic3r/PrintConfig.cpp:1842 msgid "Solid infill extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1718 +#: src/libslic3r/PrintConfig.cpp:1844 msgid "The extruder to use when printing solid infill." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1724 +#: src/libslic3r/PrintConfig.cpp:1850 msgid "Solid infill every" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1852 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 " @@ -7214,7 +9858,7 @@ msgid "" "according to nozzle diameter and layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1738 +#: src/libslic3r/PrintConfig.cpp:1864 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, " @@ -7222,22 +9866,26 @@ msgid "" "(for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1748 +#: src/libslic3r/PrintConfig.cpp:1875 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:1760 +#: src/libslic3r/PrintConfig.cpp:1887 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1766 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:1894 +msgid "Minimum thickness of a top / bottom shell" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1900 msgid "Spiral vase" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1901 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, " @@ -7246,18 +9894,18 @@ msgid "" "when printing more than an object." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1775 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Temperature variation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1776 +#: src/libslic3r/PrintConfig.cpp:1910 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:1786 +#: src/libslic3r/PrintConfig.cpp:1920 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " @@ -7268,7 +9916,7 @@ msgid "" "put a \"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1935 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 " @@ -7281,93 +9929,121 @@ msgid "" "extruders, the gcode is processed in extruder order." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1817 +#: src/libslic3r/PrintConfig.cpp:1951 +msgid "Color change G-code" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1952 +msgid "This G-code will be used as a code for the color change" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1961 +msgid "This G-code will be used as a code for the pause print" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1970 +msgid "This G-code will be used as a custom code" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1978 msgid "Single Extruder Multi Material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1818 +#: src/libslic3r/PrintConfig.cpp:1979 msgid "The printer multiplexes filaments into a single hot end." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1823 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Prime all printing extruders" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/libslic3r/PrintConfig.cpp:1985 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:1829 +#: src/libslic3r/PrintConfig.cpp:1990 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:1991 +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:1998 msgid "Generate support material" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:2000 msgid "Enable support material generation." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1835 +#: src/libslic3r/PrintConfig.cpp:2004 msgid "Auto generated supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1837 +#: src/libslic3r/PrintConfig.cpp:2006 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:1843 +#: src/libslic3r/PrintConfig.cpp:2012 msgid "XY separation between an object and its support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1845 +#: src/libslic3r/PrintConfig.cpp:2014 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:1855 +#: src/libslic3r/PrintConfig.cpp:2024 msgid "Pattern angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1857 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1867 src/libslic3r/PrintConfig.cpp:2563 +#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2831 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:2042 msgid "Contact Z distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1875 +#: src/libslic3r/PrintConfig.cpp:2044 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:1882 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "0 (soluble)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1883 +#: src/libslic3r/PrintConfig.cpp:2052 msgid "0.2 (detachable)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1888 +#: src/libslic3r/PrintConfig.cpp:2057 msgid "Enforce support for the first" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:2059 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -7375,21 +10051,21 @@ msgid "" "of objects having a very thin or poor footprint on the build plate." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:2064 msgid "Enforce support for the first n layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:2070 msgid "Support material/raft/skirt extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:2072 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:1912 +#: src/libslic3r/PrintConfig.cpp:2081 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, " @@ -7397,89 +10073,89 @@ msgid "" "example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1920 +#: src/libslic3r/PrintConfig.cpp:2090 msgid "Interface loops" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1922 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1927 +#: src/libslic3r/PrintConfig.cpp:2097 msgid "Support material/raft interface extruder" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:2099 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:1936 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Interface layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:2108 msgid "" "Number of interface layers to insert between the object(s) and support " "material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:2115 msgid "Interface pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1947 +#: src/libslic3r/PrintConfig.cpp:2117 msgid "Spacing between interface lines. Set zero to get a solid interface." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:2126 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:1965 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Pattern" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1967 +#: src/libslic3r/PrintConfig.cpp:2137 msgid "Pattern used to generate support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1973 +#: src/libslic3r/PrintConfig.cpp:2143 msgid "Rectilinear grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1979 +#: src/libslic3r/PrintConfig.cpp:2149 msgid "Pattern spacing" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2151 msgid "Spacing between support material lines." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1990 +#: src/libslic3r/PrintConfig.cpp:2160 msgid "Speed for printing support material." msgstr "" -#: src/libslic3r/PrintConfig.cpp:1997 +#: src/libslic3r/PrintConfig.cpp:2167 msgid "Synchronize with object layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:1999 +#: src/libslic3r/PrintConfig.cpp:2169 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:2005 +#: src/libslic3r/PrintConfig.cpp:2175 msgid "Overhang threshold" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2177 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -7488,43 +10164,47 @@ msgid "" "detection (recommended)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2019 +#: src/libslic3r/PrintConfig.cpp:2189 msgid "With sheath around the support" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2191 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:2028 +#: src/libslic3r/PrintConfig.cpp:2198 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:2036 +#: src/libslic3r/PrintConfig.cpp:2201 +msgid "Nozzle temperature" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2207 msgid "Detect thin walls" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2038 +#: src/libslic3r/PrintConfig.cpp:2209 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:2044 +#: src/libslic3r/PrintConfig.cpp:2215 msgid "Threads" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2216 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:2057 +#: src/libslic3r/PrintConfig.cpp:2228 msgid "" "This custom code is inserted before every toolchange. Placeholder variables " "for all PrusaSlicer settings as well as {previous_extruder} and " @@ -7534,7 +10214,7 @@ msgid "" "behaviour both before and after the toolchange." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2241 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 " @@ -7543,7 +10223,7 @@ msgid "" "percentage (for example 90%) it will be computed over layer height." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2081 +#: src/libslic3r/PrintConfig.cpp:2253 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 " @@ -7552,43 +10232,54 @@ msgid "" "for auto." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2268 msgid "Number of solid layers to generate on top surfaces." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2097 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "Top solid layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2277 +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:2280 +msgid "Minimum top shell thickness" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2287 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2111 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Use firmware retraction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2296 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:2118 +#: src/libslic3r/PrintConfig.cpp:2302 msgid "Use relative E distances" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2119 +#: src/libslic3r/PrintConfig.cpp:2303 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2309 msgid "Use volumetric E" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2126 +#: src/libslic3r/PrintConfig.cpp:2310 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -7598,127 +10289,127 @@ msgid "" "only supported in recent Marlin." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2320 msgid "Enable variable layer height feature" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2137 +#: src/libslic3r/PrintConfig.cpp:2321 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2327 msgid "Wipe while retracting" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2144 +#: src/libslic3r/PrintConfig.cpp:2328 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2151 +#: src/libslic3r/PrintConfig.cpp:2335 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:2157 +#: src/libslic3r/PrintConfig.cpp:2341 msgid "Purging volumes - load/unload volumes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2158 +#: src/libslic3r/PrintConfig.cpp:2342 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:2164 +#: src/libslic3r/PrintConfig.cpp:2348 msgid "Purging volumes - matrix" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2349 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:2174 +#: src/libslic3r/PrintConfig.cpp:2358 msgid "Position X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2175 +#: src/libslic3r/PrintConfig.cpp:2359 msgid "X coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2181 +#: src/libslic3r/PrintConfig.cpp:2365 msgid "Position Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2182 +#: src/libslic3r/PrintConfig.cpp:2366 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2189 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "Width of a wipe tower" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2379 msgid "Wipe tower rotation angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2380 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2387 msgid "Wipe into this object's infill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2388 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:2211 +#: src/libslic3r/PrintConfig.cpp:2395 msgid "Wipe into this object" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2396 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:2218 +#: src/libslic3r/PrintConfig.cpp:2402 msgid "Maximal bridging distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2403 msgid "Maximal distance between supports on sparse infill sections." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2225 +#: src/libslic3r/PrintConfig.cpp:2409 msgid "XY Size Compensation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2227 +#: src/libslic3r/PrintConfig.cpp:2411 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:2235 +#: src/libslic3r/PrintConfig.cpp:2419 msgid "Z offset" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2236 +#: src/libslic3r/PrintConfig.cpp:2420 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 " @@ -7726,361 +10417,414 @@ msgid "" "print bed, set this to -0.3 (or fix your endstop)." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2487 msgid "Display width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2295 +#: src/libslic3r/PrintConfig.cpp:2488 msgid "Width of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2300 +#: src/libslic3r/PrintConfig.cpp:2493 msgid "Display height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2494 msgid "Height of the display" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2306 +#: src/libslic3r/PrintConfig.cpp:2499 msgid "Number of pixels in" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2501 msgid "Number of pixels in X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2314 +#: src/libslic3r/PrintConfig.cpp:2507 msgid "Number of pixels in Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2319 +#: src/libslic3r/PrintConfig.cpp:2512 msgid "Display horizontal mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2320 +#: src/libslic3r/PrintConfig.cpp:2513 msgid "Mirror horizontally" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2321 +#: src/libslic3r/PrintConfig.cpp:2514 msgid "Enable horizontal mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2519 msgid "Display vertical mirroring" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2327 +#: src/libslic3r/PrintConfig.cpp:2520 msgid "Mirror vertically" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2328 +#: src/libslic3r/PrintConfig.cpp:2521 msgid "Enable vertical mirroring of output images" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2526 msgid "Display orientation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2334 +#: src/libslic3r/PrintConfig.cpp:2527 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:2340 +#: src/libslic3r/PrintConfig.cpp:2533 msgid "Landscape" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2534 msgid "Portrait" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2346 +#: src/libslic3r/PrintConfig.cpp:2539 msgid "Fast" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2347 +#: src/libslic3r/PrintConfig.cpp:2540 msgid "Fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2348 +#: src/libslic3r/PrintConfig.cpp:2541 msgid "Time of the fast tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2355 +#: src/libslic3r/PrintConfig.cpp:2548 msgid "Slow" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2356 +#: src/libslic3r/PrintConfig.cpp:2549 msgid "Slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2357 +#: src/libslic3r/PrintConfig.cpp:2550 msgid "Time of the slow tilt" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2557 msgid "Area fill" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2558 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:2372 src/libslic3r/PrintConfig.cpp:2373 -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2566 +#: src/libslic3r/PrintConfig.cpp:2567 msgid "Printer scaling correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2380 src/libslic3r/PrintConfig.cpp:2381 +#: src/libslic3r/PrintConfig.cpp:2573 src/libslic3r/PrintConfig.cpp:2574 msgid "Printer absolute correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2575 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2581 +msgid "Elephant foot minimum width" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2583 +msgid "" +"Minimum width of features to maintain when doing elephant foot compensation." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2590 src/libslic3r/PrintConfig.cpp:2591 msgid "Printer gamma correction" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2390 +#: src/libslic3r/PrintConfig.cpp:2592 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:2401 src/libslic3r/PrintConfig.cpp:2402 +#: src/libslic3r/PrintConfig.cpp:2604 src/libslic3r/PrintConfig.cpp:2605 +msgid "SLA material type" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2616 src/libslic3r/PrintConfig.cpp:2617 msgid "Initial layer height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2408 +#: src/libslic3r/PrintConfig.cpp:2623 src/libslic3r/PrintConfig.cpp:2624 +msgid "Bottle volume" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2625 +msgid "ml" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2630 src/libslic3r/PrintConfig.cpp:2631 +msgid "Bottle weight" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2632 +msgid "kg" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2639 +msgid "g/ml" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2646 +msgid "money/bottle" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2651 msgid "Faded layers" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2409 +#: src/libslic3r/PrintConfig.cpp:2652 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2416 src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2659 src/libslic3r/PrintConfig.cpp:2660 msgid "Minimum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2667 src/libslic3r/PrintConfig.cpp:2668 msgid "Maximum exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2432 src/libslic3r/PrintConfig.cpp:2433 +#: src/libslic3r/PrintConfig.cpp:2675 src/libslic3r/PrintConfig.cpp:2676 msgid "Exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2682 src/libslic3r/PrintConfig.cpp:2683 msgid "Minimum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2447 src/libslic3r/PrintConfig.cpp:2448 +#: src/libslic3r/PrintConfig.cpp:2690 src/libslic3r/PrintConfig.cpp:2691 msgid "Maximum initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2455 src/libslic3r/PrintConfig.cpp:2456 +#: src/libslic3r/PrintConfig.cpp:2698 src/libslic3r/PrintConfig.cpp:2699 msgid "Initial exposure time" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2462 src/libslic3r/PrintConfig.cpp:2463 +#: src/libslic3r/PrintConfig.cpp:2705 src/libslic3r/PrintConfig.cpp:2706 msgid "Correction for expansion" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2469 +#: src/libslic3r/PrintConfig.cpp:2712 msgid "SLA print material notes" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2470 +#: src/libslic3r/PrintConfig.cpp:2713 msgid "You can put your notes regarding the SLA print material here." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2478 src/libslic3r/PrintConfig.cpp:2489 +#: src/libslic3r/PrintConfig.cpp:2725 src/libslic3r/PrintConfig.cpp:2736 msgid "Default SLA material profile" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2500 +#: src/libslic3r/PrintConfig.cpp:2747 msgid "Generate supports" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2502 +#: src/libslic3r/PrintConfig.cpp:2749 msgid "Generate supports for the models" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2507 -msgid "Support head front diameter" +#: src/libslic3r/PrintConfig.cpp:2754 +msgid "Pinhead front diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:2756 msgid "Diameter of the pointing side of the head" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2516 -msgid "Support head penetration" +#: src/libslic3r/PrintConfig.cpp:2763 +msgid "Head penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2518 +#: src/libslic3r/PrintConfig.cpp:2765 msgid "How much the pinhead has to penetrate the model surface" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2525 -msgid "Support head width" +#: src/libslic3r/PrintConfig.cpp:2772 +msgid "Pinhead width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2527 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Width from the back sphere center to the front sphere center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2535 -msgid "Support pillar diameter" +#: src/libslic3r/PrintConfig.cpp:2782 +msgid "Pillar diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2537 +#: src/libslic3r/PrintConfig.cpp:2784 msgid "Diameter in mm of the support pillars" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2545 -msgid "Support pillar connection mode" +#: src/libslic3r/PrintConfig.cpp:2792 +msgid "Small pillar diameter percent" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2794 +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:2803 +msgid "Max bridges on a pillar" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2805 +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:2813 +msgid "Pillar connection mode" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2814 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:2554 +#: src/libslic3r/PrintConfig.cpp:2822 msgid "Zig-Zag" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2555 +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Cross" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2556 +#: src/libslic3r/PrintConfig.cpp:2824 msgid "Dynamic" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2568 +#: src/libslic3r/PrintConfig.cpp:2836 msgid "Pillar widening factor" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2570 +#: src/libslic3r/PrintConfig.cpp:2838 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:2579 +#: src/libslic3r/PrintConfig.cpp:2847 msgid "Support base diameter" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2581 +#: src/libslic3r/PrintConfig.cpp:2849 msgid "Diameter in mm of the pillar base" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2589 +#: src/libslic3r/PrintConfig.cpp:2857 msgid "Support base height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2591 +#: src/libslic3r/PrintConfig.cpp:2859 msgid "The height of the pillar base cone" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2866 msgid "Support base safety distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2601 +#: src/libslic3r/PrintConfig.cpp:2869 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:2611 +#: src/libslic3r/PrintConfig.cpp:2879 msgid "Critical angle" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2613 +#: src/libslic3r/PrintConfig.cpp:2881 msgid "The default angle for connecting support sticks and junctions." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2621 +#: src/libslic3r/PrintConfig.cpp:2889 msgid "Max bridge length" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2623 +#: src/libslic3r/PrintConfig.cpp:2891 msgid "The max length of a bridge" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2630 +#: src/libslic3r/PrintConfig.cpp:2898 msgid "Max pillar linking distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2632 +#: src/libslic3r/PrintConfig.cpp:2900 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:2640 -msgid "Object elevation" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2642 +#: src/libslic3r/PrintConfig.cpp:2910 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:2653 +#: src/libslic3r/PrintConfig.cpp:2921 msgid "This is a relative measure of support points density." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2659 +#: src/libslic3r/PrintConfig.cpp:2927 msgid "Minimal distance of the support points" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2661 +#: src/libslic3r/PrintConfig.cpp:2929 msgid "No support points will be placed closer than this threshold." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2935 msgid "Use pad" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2937 msgid "Add a pad underneath the supported model" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2674 +#: src/libslic3r/PrintConfig.cpp:2942 msgid "Pad wall thickness" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2676 +#: src/libslic3r/PrintConfig.cpp:2944 msgid "The thickness of the pad and its optional cavity walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2684 +#: src/libslic3r/PrintConfig.cpp:2952 msgid "Pad wall height" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2685 +#: src/libslic3r/PrintConfig.cpp:2953 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 " @@ -8088,376 +10832,400 @@ msgid "" "difficult." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2698 +#: src/libslic3r/PrintConfig.cpp:2966 +msgid "Pad brim size" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2967 +msgid "How far should the pad extend around the contained geometry" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2977 msgid "Max merge distance" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2700 +#: src/libslic3r/PrintConfig.cpp:2979 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:2720 +#: src/libslic3r/PrintConfig.cpp:2999 msgid "Pad wall slope" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2722 +#: src/libslic3r/PrintConfig.cpp:3001 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2731 -msgid "Pad around object" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:2733 +#: src/libslic3r/PrintConfig.cpp:3012 msgid "Create pad around object and ignore the support elevation" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2738 +#: src/libslic3r/PrintConfig.cpp:3017 +msgid "Pad around object everywhere" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3019 +msgid "Force pad around object everywhere" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3024 msgid "Pad object gap" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2740 +#: src/libslic3r/PrintConfig.cpp:3026 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2749 +#: src/libslic3r/PrintConfig.cpp:3035 msgid "Pad object connector stride" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2751 +#: src/libslic3r/PrintConfig.cpp:3037 msgid "" "Distance between two connector sticks which connect the object and the " "generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2758 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "Pad object connector width" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2760 +#: src/libslic3r/PrintConfig.cpp:3046 msgid "" "Width of the connector sticks which connect the object and the generated pad." msgstr "" -#: src/libslic3r/PrintConfig.cpp:2767 +#: src/libslic3r/PrintConfig.cpp:3053 msgid "Pad object connector penetration" msgstr "" -#: src/libslic3r/PrintConfig.cpp:2770 +#: src/libslic3r/PrintConfig.cpp:3056 msgid "How much should the tiny connectors penetrate into the model body." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3130 +#: src/libslic3r/PrintConfig.cpp:3063 +msgid "Enable hollowing" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3065 +msgid "Hollow out a model to have an empty interior" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3070 +msgid "Wall thickness" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3072 +msgid "Minimum wall thickness of a hollowed model." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3080 +msgid "Accuracy" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3082 +msgid "" +"Performance vs accuracy of calculation. Lower values may produce unwanted " +"artifacts." +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3092 +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:3505 msgid "Export OBJ" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3131 +#: src/libslic3r/PrintConfig.cpp:3506 msgid "Export the model(s) as OBJ." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3142 +#: src/libslic3r/PrintConfig.cpp:3517 msgid "Export SLA" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3143 +#: src/libslic3r/PrintConfig.cpp:3518 msgid "Slice the model and export SLA printing layers as PNG." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3148 +#: src/libslic3r/PrintConfig.cpp:3523 msgid "Export 3MF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3149 +#: src/libslic3r/PrintConfig.cpp:3524 msgid "Export the model(s) as 3MF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3153 +#: src/libslic3r/PrintConfig.cpp:3528 msgid "Export AMF" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3154 +#: src/libslic3r/PrintConfig.cpp:3529 msgid "Export the model(s) as AMF." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3158 +#: src/libslic3r/PrintConfig.cpp:3533 msgid "Export STL" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3159 +#: src/libslic3r/PrintConfig.cpp:3534 msgid "Export the model(s) as STL." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3164 +#: src/libslic3r/PrintConfig.cpp:3539 msgid "Slice the model and export toolpaths as G-code." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3169 +#: src/libslic3r/PrintConfig.cpp:3544 +msgid "G-code viewer" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3545 +msgid "Visualize an already sliced and saved G-code" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:3550 msgid "Slice" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3170 +#: src/libslic3r/PrintConfig.cpp:3551 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3175 +#: src/libslic3r/PrintConfig.cpp:3556 msgid "Help" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3176 +#: src/libslic3r/PrintConfig.cpp:3557 msgid "Show this help." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3181 +#: src/libslic3r/PrintConfig.cpp:3562 msgid "Help (FFF options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3182 +#: src/libslic3r/PrintConfig.cpp:3563 msgid "Show the full list of print/G-code configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3186 +#: src/libslic3r/PrintConfig.cpp:3567 msgid "Help (SLA options)" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3187 +#: src/libslic3r/PrintConfig.cpp:3568 msgid "Show the full list of SLA print configuration options." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3191 +#: src/libslic3r/PrintConfig.cpp:3572 msgid "Output Model Info" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3192 +#: src/libslic3r/PrintConfig.cpp:3573 msgid "Write information about the model to the console." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3196 +#: src/libslic3r/PrintConfig.cpp:3577 msgid "Save config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3197 +#: src/libslic3r/PrintConfig.cpp:3578 msgid "Save configuration to the specified file." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3207 +#: src/libslic3r/PrintConfig.cpp:3588 msgid "Align XY" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3208 +#: src/libslic3r/PrintConfig.cpp:3589 msgid "Align the model to the given point." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3213 +#: src/libslic3r/PrintConfig.cpp:3594 msgid "Cut model at the given Z." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3234 +#: src/libslic3r/PrintConfig.cpp:3615 msgid "Center" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3235 +#: src/libslic3r/PrintConfig.cpp:3616 msgid "Center the print around the given center." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3239 +#: src/libslic3r/PrintConfig.cpp:3620 msgid "Don't arrange" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3240 +#: src/libslic3r/PrintConfig.cpp:3621 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3243 +#: src/libslic3r/PrintConfig.cpp:3624 msgid "Duplicate" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3244 +#: src/libslic3r/PrintConfig.cpp:3625 msgid "Multiply copies by this factor." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3248 +#: src/libslic3r/PrintConfig.cpp:3629 msgid "Duplicate by grid" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3630 msgid "Multiply copies by creating a grid." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3252 -msgid "Merge" -msgstr "" - -#: src/libslic3r/PrintConfig.cpp:3253 +#: src/libslic3r/PrintConfig.cpp:3634 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:3258 +#: src/libslic3r/PrintConfig.cpp:3639 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:3262 +#: src/libslic3r/PrintConfig.cpp:3643 msgid "Rotation angle around the Z axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3266 +#: src/libslic3r/PrintConfig.cpp:3647 msgid "Rotate around X" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3648 msgid "Rotation angle around the X axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3271 +#: src/libslic3r/PrintConfig.cpp:3652 msgid "Rotate around Y" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3272 +#: src/libslic3r/PrintConfig.cpp:3653 msgid "Rotation angle around the Y axis in degrees." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3277 +#: src/libslic3r/PrintConfig.cpp:3658 msgid "Scaling factor or percentage." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3663 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3285 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "Scale to Fit" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3286 +#: src/libslic3r/PrintConfig.cpp:3667 msgid "Scale to fit the given volume." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3295 +#: src/libslic3r/PrintConfig.cpp:3676 msgid "Ignore non-existent config files" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3296 +#: src/libslic3r/PrintConfig.cpp:3677 msgid "Do not fail if a file supplied to --load does not exist." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3299 +#: src/libslic3r/PrintConfig.cpp:3680 msgid "Load config file" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3300 +#: src/libslic3r/PrintConfig.cpp:3681 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:3303 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "Output File" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3304 +#: src/libslic3r/PrintConfig.cpp:3685 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:3314 +#: src/libslic3r/PrintConfig.cpp:3690 +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:3701 msgid "Data directory" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3315 +#: src/libslic3r/PrintConfig.cpp:3702 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:3318 +#: src/libslic3r/PrintConfig.cpp:3705 msgid "Logging level" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3319 +#: src/libslic3r/PrintConfig.cpp:3706 msgid "" -"Messages with severity lower or eqal to the loglevel will be printed out. 0:" -"trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" +"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" +"trace\n" +"For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -#: src/libslic3r/PrintConfig.cpp:3324 +#: src/libslic3r/PrintConfig.cpp:3712 msgid "Render with a software renderer" msgstr "" -#: src/libslic3r/PrintConfig.cpp:3325 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." msgstr "" -#: src/libslic3r/PrintObject.cpp:110 +#: src/libslic3r/Zipper.cpp:27 +msgid "Error with zip archive" +msgstr "" + +#: src/libslic3r/PrintObject.cpp:114 msgid "Processing triangulated mesh" msgstr "" -#: src/libslic3r/PrintObject.cpp:141 +#: src/libslic3r/PrintObject.cpp:158 msgid "Generating perimeters" msgstr "" -#: src/libslic3r/PrintObject.cpp:251 +#: src/libslic3r/PrintObject.cpp:261 msgid "Preparing infill" msgstr "" -#: src/libslic3r/PrintObject.cpp:391 +#: src/libslic3r/PrintObject.cpp:422 msgid "Generating support material" msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:160 -msgid "Mixed" -msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:380 -msgid "Height (mm)" -msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:382 -msgid "Width (mm)" -msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:384 -msgid "Speed (mm/s)" -msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:386 -msgid "Volumetric flow rate (mm3/s)" -msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:477 -msgid "Default print color" -msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:484 -#, possible-c-format -msgid "up to %.2f mm" -msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:488 -#, possible-c-format -msgid "above %.2f mm" -msgstr "" - -#: src/libslic3r/GCode/PreviewData.cpp:493 -#, possible-c-format -msgid "%.2f - %.2f mm" -msgstr "" diff --git a/resources/localization/cs/PrusaSlicer.mo b/resources/localization/cs/PrusaSlicer.mo index e199866204..27449080de 100644 Binary files a/resources/localization/cs/PrusaSlicer.mo and b/resources/localization/cs/PrusaSlicer.mo differ diff --git a/resources/localization/cs/PrusaSlicer_cs.po b/resources/localization/cs/PrusaSlicer_cs.po index e4e56d8b31..25222b0613 100644 --- a/resources/localization/cs/PrusaSlicer_cs.po +++ b/resources/localization/cs/PrusaSlicer_cs.po @@ -5,460 +5,666 @@ 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: PhraseApp (phraseapp.com)\n" +"X-Generator: Poedit 2.4.1\n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: Oleksandra Iushchenko \n" +"Language-Team: \n" -#: src/slic3r/GUI/PresetHints.cpp:39 -msgid "\nDuring the other layers, fan" -msgstr "\nV průběhu ostaních vrstev, ventilátor" +#: 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/PresetHints.cpp:35 -msgid "\nIf estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%." -msgstr "\nPokud 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/slic3r/GUI/MainFrame.cpp:61 -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:727 +#: src/slic3r/GUI/MainFrame.cpp:1573 msgid " was successfully sliced." msgstr " byl úspěšně slicován." -#: src/libslic3r/PrintConfig.cpp:179 src/libslic3r/PrintConfig.cpp:745 -#: src/libslic3r/PrintConfig.cpp:1154 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2260 -#: src/libslic3r/PrintConfig.cpp:2502 +#: src/slic3r/GUI/Tab.cpp:4124 +msgid "" +"\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n" +"To enable \"%1%\", please switch off \"%2%\"" +msgstr "" +"\"%1%\" je deaktivováno, protože \"%2%\" je zapnuto v kategorii \"%3%\".\n" +"Chcete-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/libslic3r/GCode/PreviewData.cpp:504 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:969 +#, c-format msgid "%.2f - %.2f mm" msgstr "%.2f - %.2f mm" -#: src/slic3r/GUI/Tab.cpp:2895 -msgid "%1% - Copy" -msgstr "%1% - Kopírovat" - #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:2958 +#: src/slic3r/GUI/Tab.cpp:3425 msgid "%1% Preset" msgstr "%1% Přednastavení" -#: src/slic3r/GUI/Plater.cpp:3831 +#: 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:1282 +#: 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:228 -#, possible-c-format +#, 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:974 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1061 +#, c-format msgid "%d (%d shells)" msgstr "%d (%d obalů)" -#: src/slic3r/GUI/Plater.cpp:982 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1069 +#, 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:268 -#, possible-c-format +#: src/slic3r/GUI/PresetHints.cpp:269 +#, c-format msgid "%d lines: %.2f mm" msgstr "%d perimetry: %.2f mm" -#: src/slic3r/GUI/MainFrame.cpp:894 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:1728 +#, c-format msgid "%d presets successfully imported." msgstr "%d přednastavení úspěšně importováno." -#: src/slic3r/GUI/MainFrame.cpp:550 -#, possible-c-format +#: src/slic3r/GUI/GUI_App.cpp:718 +#, c-format +msgid "" +"%s\n" +"Do you want to continue?" +msgstr "" +"%s\n" +"Chcete pokračovat?" + +#: src/slic3r/GUI/MainFrame.cpp:917 src/slic3r/GUI/MainFrame.cpp:1316 +#, c-format msgid "%s &Website" msgstr "%s &Webová stránka" -#: src/slic3r/GUI/UpdateDialogs.cpp:113 -#, possible-c-format +#: src/slic3r/GUI/GUI_App.cpp:394 +#, c-format +msgid "%s - BREAKING CHANGE" +msgstr "%s - ZLOMOVÁ ZMĚNA" + +#: src/slic3r/GUI/UpdateDialogs.cpp:211 +#, c-format msgid "%s configuration is incompatible" msgstr "Konfigurace %s není kompatibilní" -#: src/slic3r/GUI/Field.cpp:136 -#, possible-c-format +#: src/slic3r/GUI/Field.cpp:223 +#, c-format msgid "%s doesn't support percentage" msgstr "%s nepodporuje procenta" #: src/slic3r/GUI/MsgDialog.cpp:73 -#, possible-c-format +#, c-format msgid "%s error" msgstr "%s chyba" -#: src/slic3r/GUI/ConfigWizard.cpp:336 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:499 +#, c-format msgid "%s Family" msgstr "%s Rodina" #: src/slic3r/GUI/MsgDialog.cpp:74 -#, possible-c-format +#, c-format msgid "%s has encountered an error" msgstr "Došlo k chybě v programu %s" -#: src/slic3r/GUI/GUI_App.cpp:132 -#, 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/GUI_App.cpp:528 +#, 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/BackgroundSlicingProcess.cpp:155 -#, possible-c-format +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:62 +#, 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:112 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:309 +#, 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 msgid "%s incompatibility" msgstr "Není kompatibilní s %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:172 -#, 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/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:681 -#, possible-c-format +#: src/slic3r/GUI/GUI_App.cpp:1512 +#, c-format msgid "%s View Mode" msgstr "%s Režim zobrazení" -#: src/slic3r/GUI/MainFrame.cpp:563 -#, possible-c-format -msgid "&About %s" -msgstr "O %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 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/GUI_App.cpp:769 +#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937 +#: src/slic3r/GUI/MainFrame.cpp:1329 +#, c-format +msgid "&About %s" +msgstr "&O %su" + +#: 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:661 +#: src/slic3r/GUI/GUI_App.cpp:1480 msgid "&Configuration Snapshots" -msgstr "Záloha konfigura&ce" +msgstr "Zálohy konfigura&ce" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:1194 msgid "&Copy" -msgstr "Kopírovat" +msgstr "&Kopírovat" -#: src/slic3r/GUI/MainFrame.cpp:447 +#: src/slic3r/GUI/MainFrame.cpp:1178 msgid "&Delete selected" -msgstr "&Smazat vybrané" +msgstr "Sma&zat vybrané" -#: src/slic3r/GUI/MainFrame.cpp:575 +#: src/slic3r/GUI/MainFrame.cpp:1348 src/slic3r/GUI/MainFrame.cpp:1358 msgid "&Edit" msgstr "&Editovat" -#: src/slic3r/GUI/MainFrame.cpp:377 +#: src/slic3r/GUI/MainFrame.cpp:1103 msgid "&Export" msgstr "&Exportovat" -#: src/slic3r/GUI/MainFrame.cpp:480 src/slic3r/GUI/MainFrame.cpp:604 +#: 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:574 +#: 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:1094 +#: src/slic3r/GUI/ConfigWizard.cpp:2492 msgid "&Finish" msgstr "&Dokončit" -#: src/slic3r/GUI/MainFrame.cpp:580 +#: 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:359 +#: src/slic3r/GUI/MainFrame.cpp:1065 msgid "&Import" msgstr "&Importovat" -#: src/slic3r/GUI/MainFrame.cpp:376 +#: src/slic3r/GUI/GUI_App.cpp:1517 +msgid "&Language" +msgstr "&Jazyk" + +#: src/slic3r/GUI/MainFrame.cpp:986 msgid "&New Project" msgstr "&Nový projekt" -#: src/slic3r/GUI/ConfigWizard.cpp:1093 +#: src/slic3r/GUI/ConfigWizard.cpp:2491 msgid "&Next >" msgstr "&Další>" -#: src/slic3r/GUI/MainFrame.cpp:339 +#: 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:456 +#: src/slic3r/GUI/MainFrame.cpp:1197 msgid "&Paste" -msgstr "Vložit" +msgstr "Vloži&t" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "&Plater Tab" msgstr "&Panel Podložka" -#: src/slic3r/GUI/GUI_App.cpp:665 +#: src/slic3r/GUI/GUI_App.cpp:1487 msgid "&Preferences" -msgstr "Nastavení" +msgstr "Nas&tavení" -#: src/slic3r/GUI/MainFrame.cpp:409 +#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402 msgid "&Quit" -msgstr "&Ukončit" +msgstr "Ukonči&t" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/MainFrame.cpp:1189 msgid "&Redo" -msgstr "Vp&řed" +msgstr "&Vpřed" -#: src/slic3r/GUI/MainFrame.cpp:406 +#: src/slic3r/GUI/MainFrame.cpp:1137 msgid "&Repair STL file" msgstr "Op&ravit soubor STL" -#: src/slic3r/GUI/MainFrame.cpp:341 +#: src/slic3r/GUI/MainFrame.cpp:1028 msgid "&Save Project" -msgstr "Uložit projekt" +msgstr "&Uložit projekt" -#: src/slic3r/GUI/MainFrame.cpp:444 +#: src/slic3r/GUI/MainFrame.cpp:1171 msgid "&Select all" -msgstr "Vybrat vše" +msgstr "Vybrat &vše" -#: src/slic3r/GUI/MainFrame.cpp:558 +#: src/slic3r/GUI/MainFrame.cpp:1186 msgid "&Undo" msgstr "&Zpět" -#: src/slic3r/GUI/MainFrame.cpp:577 +#: 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:576 +#: src/slic3r/GUI/MainFrame.cpp:1349 src/slic3r/GUI/MainFrame.cpp:1359 msgid "&Window" msgstr "&Okno" -#: src/libslic3r/PrintConfig.cpp:1376 +#: 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:1554 msgid "(minimum)" msgstr "(minimálně)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 msgid "(Re)slice" msgstr "(Znovu)Slicovat" -#: src/slic3r/GUI/MainFrame.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:1133 msgid "(Re)Slice No&w" -msgstr "(Znovu) S&licovat" +msgstr "&(Znovu) Slicovat" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/libslic3r/PrintConfig.cpp:807 src/libslic3r/PrintConfig.cpp:2730 +msgid "(Unknown)" +msgstr "(Neznámý)" + +#: src/slic3r/GUI/MainFrame.cpp:1491 msgid ") not found." msgstr ") nebyl nalezen." -#: src/libslic3r/PrintConfig.cpp:1857 +#: src/libslic3r/PrintConfig.cpp:2060 msgid "0 (soluble)" msgstr "0 (rozpustné)" -#: src/libslic3r/PrintConfig.cpp:1858 +#: src/libslic3r/PrintConfig.cpp:2061 msgid "0.2 (detachable)" msgstr "0.2 (oddělitelné)" -#: src/slic3r/GUI/MainFrame.cpp:487 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/Plater.cpp:3074 +#: src/slic3r/GUI/Plater.cpp:4044 msgid "3D editor view" msgstr "Zobrazení 3D editoru" -#: src/libslic3r/PrintConfig.cpp:804 +#: src/libslic3r/PrintConfig.cpp:889 msgid "3D Honeycomb" msgstr "3D Plástev" -#: src/slic3r/GUI/Plater.cpp:3590 -#, possible-c-format +#: 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:5167 +#, c-format msgid "3MF file exported to %s" msgstr "Soubor 3MF byl exportován do %s" -#: src/slic3r/GUI/ConfigWizard.cpp:1092 +#: src/slic3r/GUI/ConfigWizard.cpp:2490 msgid "< &Back" msgstr "<&Zpět" -#: src/libslic3r/PrintConfig.cpp:251 +#: 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:236 +#: 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/ConfigWizard.cpp:609 +#: 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: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° pro PLA a 215 až 250° pro ABS." +msgstr "Obecným pravidlem je 160 až 230 °C pro PLA a 215 až 250 °C pro ABS." -#: src/slic3r/GUI/ConfigWizard.cpp:623 +#: 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 160 až 230° pro PLA a 215 až 250° pro ABS. Zadejte nula, pokud nemáte vyhřívanou podložku." +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:721 -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:35 -#, possible-c-format +#: src/slic3r/GUI/AboutDialog.cpp:212 src/slic3r/GUI/AboutDialog.cpp:215 +#, c-format msgid "About %s" msgstr "O %s" -#: src/libslic3r/GCode/PreviewData.cpp:499 -#, possible-c-format +#: src/slic3r/GUI/GCodeViewer.cpp:2189 +msgid "above" +msgstr "nad" + +#: src/slic3r/GUI/GLCanvas3D.cpp:965 +#, c-format msgid "above %.2f mm" msgstr "nad %.2f mm" -#: src/libslic3r/PrintConfig.cpp:1499 +#: src/libslic3r/PrintConfig.cpp:1677 msgid "Above Z" msgstr "Nad Z" -#: src/slic3r/GUI/Tab.cpp:1103 +#: src/slic3r/GUI/Tab.cpp:1494 msgid "Acceleration control (advanced)" msgstr "Kontrola akcelerací (pokročilé)" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:73 +#: 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/ConfigSnapshotDialog.cpp:78 msgid "Activate" msgstr "Aktivovat" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:39 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 msgid "Active" msgstr "Aktivní" -#: src/slic3r/GUI/Preset.cpp:1003 src/slic3r/GUI/Tab.cpp:237 -msgid "Add a new printer" -msgstr "Přidat novou tiskárnu" +#: src/slic3r/GUI/DoubleSlider.cpp:1264 src/slic3r/GUI/GUI_ObjectList.cpp:1833 +msgid "active" +msgstr "aktivní" -#: src/libslic3r/PrintConfig.cpp:2517 +#: src/slic3r/GUI/GLCanvas3D.cpp:254 +msgid "Adaptive" +msgstr "Adaptivní" + +#: 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:2946 msgid "Add a pad underneath the supported model" msgstr "Pod podepíraný model přidá podložku" -#: src/libslic3r/PrintConfig.cpp:1971 +#: 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/KBShortcutsDialog.cpp:186 +#: 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:1115 +msgid "Add another code - Right click" +msgstr "Přidání jiného kódu - Pravé tlačítko" + +#: src/slic3r/GUI/DoubleSlider.cpp:1665 +msgid "Add color change" +msgstr "Přidat změnu barvy" + +#: 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:1111 +msgid "Add color change - Left click" +msgstr "Přidat změnu barvy - Levé tlačítko myši" + +#: 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:219 msgid "Add color change marker for current layer" msgstr "Přidat značku změny barvy pro aktuální vrstvu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1662 +#: src/slic3r/GUI/DoubleSlider.cpp:1682 +msgid "Add custom G-code" +msgstr "Přidat vlastní G-code" + +#: 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:308 +msgid "Add drainage hole" +msgstr "Přidání odtokového otvoru" + +#: src/slic3r/GUI/DoubleSlider.cpp:1107 +msgid "Add extruder change - Left click" +msgstr "Přidat změnu extruderu - Levé tlačítko myši" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 +msgid "Add extruder to sequence" +msgstr "Přidat extruder do seznamu" + +#: 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:2584 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2613 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2631 +#: 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:3463 +#: 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:124 +#: 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:1950 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2692 msgid "Add Layers" msgstr "Přidat Vrstvy" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 msgid "Add modifier" msgstr "Přidat modifikátor" -#: src/libslic3r/PrintConfig.cpp:447 -#, no-c-format +#: src/libslic3r/PrintConfig.cpp:515 +#, 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:3516 +#: 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" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1066 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1082 +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 msgid "Add part" msgstr "Přidat díl" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/DoubleSlider.cpp:1675 +msgid "Add pause print" +msgstr "Přidat pozastavení tisku" + +#: 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:1232 +#: 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:1118 +#: 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:1252 +#: 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:1191 +#: 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:1190 +#: 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:1126 +#: 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:1128 +#: 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:1127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1446 msgid "Add Settings for Sub-object" msgstr "Přidání nastavení pro Dílčí objeky" -#: src/libslic3r/PrintConfig.cpp:382 +#: 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: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)." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1069 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1089 +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 msgid "Add support blocker" msgstr "Přidat blokátor podpěr" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1068 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1086 +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 msgid "Add support enforcer" msgstr "Přidat vynucení podpěr" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:531 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374 msgid "Add support point" msgstr "Přidání podpěrného bodu" -#: src/slic3r/GUI/GLCanvas3D.cpp:3392 +#: 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..." -#: src/slic3r/GUI/wxExtensions.cpp:2571 -msgid "Add/Del color change" -msgstr "Přidat/odebrat změnu barvy vrstvy" +#: src/slic3r/GUI/PresetBundle.cpp:1704 +msgid "Add/Remove filaments" +msgstr "Přidání / Odebrání filamentů" -#: src/slic3r/GUI/Tab.cpp:920 +#: src/slic3r/GUI/PresetComboBoxes.cpp:813 +msgid "Add/Remove materials" +msgstr "Přidání / Odebrání materiálů" + +#: 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:1288 msgid "Additional information:" msgstr "Doplňující informace:" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62 msgid "Additional Settings" msgstr "Další nastavení" -#: src/slic3r/GUI/ConfigWizard.cpp:431 +#: 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í." @@ -466,279 +672,370 @@ 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:675 src/slic3r/GUI/GUI_ObjectList.cpp:76 -#: src/slic3r/GUI/GUI_ObjectList.cpp:517 src/slic3r/GUI/Tab.cpp:1026 -#: src/slic3r/GUI/Tab.cpp:1041 src/slic3r/GUI/Tab.cpp:1139 -#: src/slic3r/GUI/Tab.cpp:1142 src/slic3r/GUI/Tab.cpp:1515 -#: src/slic3r/GUI/Tab.cpp:1940 src/slic3r/GUI/Tab.cpp:3435 -#: src/slic3r/GUI/wxExtensions.cpp:2460 src/libslic3r/PrintConfig.cpp:72 -#: src/libslic3r/PrintConfig.cpp:187 src/libslic3r/PrintConfig.cpp:350 -#: src/libslic3r/PrintConfig.cpp:988 src/libslic3r/PrintConfig.cpp:2175 +#: 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/GUI_App.cpp:675 +#: src/slic3r/GUI/ConfigWizard.cpp:1180 +msgid "Advanced mode" +msgstr "Pokročilý režim" + +#: src/slic3r/GUI/GUI_App.cpp:1506 msgid "Advanced View Mode" msgstr "Pokročilý režim" -#: src/slic3r/GUI/FirmwareDialog.cpp:803 +#: src/slic3r/GUI/FirmwareDialog.cpp:841 msgid "Advanced: Output log" msgstr "Pokročilý:  Výstupní log" -#: src/libslic3r/PrintConfig.cpp:636 +#: 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:1967 src/libslic3r/PrintConfig.cpp:1031 +#: 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:3009 +#: src/libslic3r/PrintConfig.cpp:3597 msgid "Align the model to the given point." msgstr "Zarovnejte model s daným bodem." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3596 msgid "Align XY" msgstr "Zarovnat XY" -#: src/libslic3r/PrintConfig.cpp:1561 +#: src/libslic3r/PrintConfig.cpp:1739 msgid "Aligned" msgstr "Zarovnaný" -#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:2986 +#: 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:1135 +#: 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/slic3r/GUI/UnsavedChangesDialog.cpp:737 +msgid "All modified options will be reverted." +msgstr "Všechny upravené možnosti budou vráceny." + +#: 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:3298 -msgid "All objects will be removed, continue ?" -msgstr "Všechny objekty budou obebrány, pokračovat?" +#: 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:188 +#: src/slic3r/GUI/ConfigWizard.cpp:307 msgid "All standard" msgstr "Všechny běžné" -#: src/libslic3r/Zipper.cpp:65 +#: src/libslic3r/miniz_extension.cpp:121 msgid "allocation failed" msgstr "alokace selhala" -#: src/slic3r/GUI/Plater.cpp:2939 +#: src/slic3r/GUI/Plater.cpp:3915 msgid "Along X axis" msgstr "Podél osy X" -#: src/slic3r/GUI/Plater.cpp:2941 +#: src/slic3r/GUI/Plater.cpp:3917 msgid "Along Y axis" msgstr "Podél osy Y" -#: src/slic3r/GUI/Plater.cpp:2943 +#: src/slic3r/GUI/Plater.cpp:3919 msgid "Along Z axis" msgstr "Podél osy Z" -#: src/slic3r/GUI/ConfigWizard.cpp:122 +#: 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:3561 -#, possible-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 +#, c-format msgid "AMF file exported to %s" msgstr "Soubor AMF byl exportován do %s" -#: src/slic3r/GUI/GLCanvas3D.cpp:725 -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/GLCanvas3D.cpp:638 +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:720 -msgid "An object outside the print area was detected" -msgstr "Byl detekován objekt mimo tiskovou oblast" +#: 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/Tab.cpp:2781 -msgid "and it has the following unsaved changes:" -msgstr "a má neuložené následující změny:" - -#: src/slic3r/GUI/Plater.cpp:2461 +#: 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/Tab.cpp:926 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +msgid "Any arrow" +msgstr "Šipky" + +#: 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:88 +#: src/libslic3r/PrintConfig.cpp:106 msgid "API Key / Password" msgstr "API klíč / Heslo" -#: src/slic3r/GUI/GUI_App.cpp:671 +#: src/slic3r/GUI/GUI_App.cpp:1493 msgid "Application preferences" msgstr "Nastavení aplikace" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:864 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1240 +#: 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:542 src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:611 src/libslic3r/PrintConfig.cpp:1823 msgid "approximate seconds" msgstr "vteřin přibližně" -#: src/libslic3r/PrintConfig.cpp:401 src/libslic3r/PrintConfig.cpp:807 +#: src/libslic3r/PrintConfig.cpp:464 src/libslic3r/PrintConfig.cpp:892 msgid "Archimedean Chords" msgstr "Archimedean Chords" -#: src/libslic3r/Zipper.cpp:91 +#: src/libslic3r/miniz_extension.cpp:147 msgid "archive is too large" msgstr "archiv je moc velký" -#. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:2955 +#: 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:862 -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/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!" -#: src/libslic3r/PrintConfig.cpp:2258 +#: 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/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:2566 msgid "Area fill" msgstr "Zaplněná plocha" -#: src/slic3r/GUI/Plater.cpp:609 +#: src/slic3r/GUI/Plater.cpp:507 msgid "Around object" msgstr "Okolo objektu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: 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:3486 +#: 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:3054 +#: 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:2106 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:149 msgid "Arranging" msgstr "Uspořádávání" -#: src/slic3r/GUI/Plater.cpp:2718 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182 msgid "Arranging canceled." msgstr "Uspořádávání zrušeno." -#: src/slic3r/GUI/Plater.cpp:2144 +#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183 msgid "Arranging done." msgstr "Uspořádávání dokončeno." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: 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:184 +#: 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:185 +#: 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:171 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: 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/GUI_App.cpp:303 +#: 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.cpp:144 src/slic3r/GUI/GUI_App.cpp:743 -#: src/slic3r/GUI/Tab.cpp:2798 +#: 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/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:1785 +#: 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:44 +#: src/slic3r/GUI/Preferences.cpp:64 msgid "Auto-center parts" msgstr "Auto-centrování objektů" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:902 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1243 +#: 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:979 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1066 +#, c-format msgid "Auto-repaired (%d errors)" msgstr "Automaticky opraveno (%d chyb)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:230 -#, possible-c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "Automaticky opraveno ( %d chyb):\n" +#: src/slic3r/GUI/GUI_ObjectList.cpp:386 +#, c-format +msgid "Auto-repaired (%d errors):" +msgstr "Automaticky opraveno ( %d chyb):" -#: src/slic3r/GUI/FirmwareDialog.cpp:771 +#: src/slic3r/GUI/FirmwareDialog.cpp:809 msgid "Autodetected" msgstr "Automaticky detekováno" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1338 +#: 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:1166 -msgid "Autogeneration will erase all manually edited points.\n\nAre you sure you want to do it?\n" -msgstr "Automatické generování vymaže všechny ručně vytvořené body. \n\nOpravdu to chcete udělat?\n" +#: 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:3421 +#: src/slic3r/GUI/Tab.cpp:4051 msgid "Automatic generation" msgstr "Automatické generování" -#: src/slic3r/GUI/ConfigWizard.cpp:401 +#: src/slic3r/GUI/ConfigWizard.cpp:1120 msgid "Automatic updates" msgstr "Automatické aktualizace" -#: src/slic3r/GUI/MainFrame.cpp:406 +#: src/slic3r/GUI/MainFrame.cpp:1137 msgid "Automatically repair an STL file" msgstr "Automaticky opravit STL soubor" -#: src/slic3r/GUI/Tab.cpp:1110 +#: 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:111 +#: src/libslic3r/PrintConfig.cpp:169 msgid "Avoid crossing perimeters" msgstr "Vyhnout se přejíždění perimetrů" -#: src/slic3r/GUI/Tab.cpp:3081 +#: src/slic3r/GUI/Tab.cpp:3705 msgid "BACK ARROW" msgstr "ŠIPKA ZPĚT" -#: src/slic3r/GUI/Tab.cpp:3113 -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:3727 +msgid "" +"BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n" +"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:3127 -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/Tab.cpp:3741 +msgid "" +"BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\n" +"Click to reset current value to the last saved preset." +msgstr "" +"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/Preferences.cpp:52 +#: src/slic3r/GUI/Preferences.cpp:72 msgid "Background processing" msgstr "Zpracování na pozadí" -#: src/slic3r/GUI/GUI_ObjectList.cpp:242 +#: src/slic3r/GUI/GUI_ObjectList.cpp:398 msgid "backwards edges" msgstr "zadní okraje" -#: src/slic3r/GUI/MainFrame.cpp:152 +#: 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:1484 +#: src/slic3r/GUI/Tab.cpp:1785 msgid "Bed" msgstr "Tisková podložka" @@ -750,31 +1047,31 @@ msgstr "Vlastní model podložky" msgid "Bed custom texture" msgstr "Vlastní textura podložky" -#: src/slic3r/GUI/BedShapeDialog.hpp:45 src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1295 msgid "Bed Shape" msgstr "Tvar tiskové podložky" -#: src/libslic3r/PrintConfig.cpp:50 +#: src/libslic3r/PrintConfig.cpp:51 msgid "Bed shape" msgstr "Tvar tiskové podložky" -#: src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/ConfigWizard.cpp:1295 msgid "Bed Shape and Size" msgstr "Tvar a rozměr podložky" -#: src/libslic3r/PrintConfig.cpp:122 +#: src/libslic3r/PrintConfig.cpp:181 msgid "Bed temperature" msgstr "Teplota tiskové podložky" -#: src/libslic3r/PrintConfig.cpp:120 +#: 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:626 +#: src/slic3r/GUI/ConfigWizard.cpp:1417 msgid "Bed Temperature:" msgstr "Teplota tiskové podložky:" -#: src/slic3r/GUI/Tab.cpp:1961 src/libslic3r/PrintConfig.cpp:128 +#: 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" @@ -782,941 +1079,1322 @@ 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:608 +#: src/slic3r/GUI/Plater.cpp:506 msgid "Below object" msgstr "Pod objektem" -#: src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1686 msgid "Below Z" msgstr "Pod Z" -#: src/libslic3r/PrintConfig.cpp:139 +#: src/libslic3r/PrintConfig.cpp:198 msgid "Between objects G-code" msgstr "G-code mezi objekty" -#: src/slic3r/GUI/Tab.cpp:1979 +#: src/slic3r/GUI/Tab.cpp:2196 msgid "Between objects G-code (for sequential printing)" msgstr "G-code mezi objekty (pro sekvenční tisk)" +#: 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:2639 src/libslic3r/PrintConfig.cpp:2640 +msgid "Bottle weight" +msgstr "Hmotnost láhve" + #. TRN To be shown in the main menu View->Bottom -#: src/slic3r/GUI/MainFrame.cpp:524 +#. 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: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:409 +#: src/libslic3r/PrintConfig.cpp:471 msgid "Bottom fill pattern" msgstr "Vzor spodní výplně" -#: src/libslic3r/PrintConfig.cpp:152 +#: src/slic3r/GUI/PresetHints.cpp:340 +msgid "Bottom is open." +msgstr "Spodní část je otevřená." + +#: 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:211 msgid "Bottom solid layers" msgstr "Plné spodní vrstvy" -#: src/slic3r/GUI/MainFrame.cpp:524 +#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282 msgid "Bottom View" msgstr "Pohled zespod" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1087 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1090 +#: 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:157 +#: src/libslic3r/PrintConfig.cpp:227 msgid "Bridge" msgstr "Most" -#: src/libslic3r/PrintConfig.cpp:186 +#: 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:233 src/libslic3r/GCode/PreviewData.cpp:169 +#: 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:198 +#: src/libslic3r/PrintConfig.cpp:268 msgid "Bridges" msgstr "Mosty" -#: src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:247 msgid "Bridges fan speed" msgstr "Rychlost ventilátoru při vytváření mostů" -#: src/libslic3r/PrintConfig.cpp:166 +#: src/libslic3r/PrintConfig.cpp:236 msgid "Bridging angle" msgstr "Úhel vytváření mostů" -#: src/libslic3r/PrintConfig.cpp:168 +#: 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°." -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:218 msgid "Bridging volumetric" msgstr "Volumetrická hodnota mostů" -#: src/slic3r/GUI/Plater.cpp:446 src/slic3r/GUI/Tab.cpp:1056 +#: src/slic3r/GUI/Plater.cpp:400 src/slic3r/GUI/Tab.cpp:1446 msgid "Brim" msgstr "Límec" -#: src/libslic3r/PrintConfig.cpp:208 +#: src/libslic3r/PrintConfig.cpp:278 msgid "Brim width" msgstr "Šířka límce" -#: src/slic3r/GUI/Tab.cpp:1681 +#: 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:85 +#: 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.\n" +"Settings will be available in physical printers settings." +msgstr "" +"Ale od této verze PrusaSliceru již nebudeme tyto informace zobrazovat v Nastavení tiskárny.\n" +"Nastavení 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:220 +#: src/slic3r/GUI/GUI_App.cpp:1084 +msgid "" +"By default new Printer devices will be named as \"Printer N\" during its creation.\n" +"Note: This name can be changed later from the physical printers settings" +msgstr "" +"Ve výchozím stavu budou při vytváření nové tiskárny pojmenovány jako „Printer N“.\n" +"Pozná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/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:178 +msgid "Camera" +msgstr "Kamera" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Camera view" msgstr "Pohled kamery" -#: src/slic3r/GUI/ConfigWizard.cpp:1095 src/slic3r/GUI/FirmwareDialog.cpp:147 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:37 -#: src/slic3r/GUI/ProgressStatusBar.cpp:28 +#: 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:156 +#: src/slic3r/GUI/PrintHostDialogs.cpp:155 msgid "Cancel selected" msgstr "Zrušit vybrané" -#: src/slic3r/GUI/Plater.cpp:2727 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3589 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "Zrušeno" -#: src/slic3r/GUI/Plater.cpp:2444 src/slic3r/GUI/PrintHostDialogs.cpp:231 +#: src/slic3r/GUI/Plater.cpp:2953 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "Zrušení" -#: src/slic3r/GUI/FirmwareDialog.cpp:866 +#: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." msgstr "Ukončování..." -#: src/slic3r/GUI/Tab.cpp:2905 +#: src/libslic3r/Flow.cpp:61 +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:3400 +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: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 "" +"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: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 "" +"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/SavePresetDialog.cpp:137 msgid "Cannot overwrite a system profile." msgstr "Nelze přepsat systémový profil." -#: src/slic3r/GUI/Tab.cpp:2909 +#: src/slic3r/GUI/SavePresetDialog.cpp:142 msgid "Cannot overwrite an external profile." msgstr "Nelze přepsat externí profil." -#: src/libslic3r/SLAPrint.cpp:612 +#: 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:1840 +#: src/slic3r/GUI/Tab.cpp:2068 src/slic3r/GUI/UnsavedChangesDialog.cpp:1066 msgid "Capabilities" msgstr "Možnosti" -#: src/slic3r/GUI/GUI_App.cpp:662 +#: src/slic3r/GUI/GUI_App.cpp:1481 msgid "Capture a configuration snapshot" msgstr "Vytvořit aktuální zálohu konfigurace" -#: src/libslic3r/PrintConfig.cpp:3035 +#: 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:3036 +#: 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:1744 +#: 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/GUI_App.cpp:683 -msgid "Change Application &Language" -msgstr "Změnit jazyk ap&likace" +#: 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:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Change camera type (perspective, orthographic)" msgstr "Změna typu kamery (perspektivní, ortografická)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1226 +#: 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:1273 src/slic3r/GUI/GUI_ObjectList.cpp:1800 msgid "Change extruder" msgstr "Změnit extruder" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:144 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectList.cpp:574 +msgid "Change Extruder" +msgstr "Změnit Extruder" + +#: src/slic3r/GUI/DoubleSlider.cpp:1274 +msgid "Change extruder (N/A)" +msgstr "Změnit extruder (N/A)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4484 +msgid "Change Extruders" +msgstr "Změnit Extrudery" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157 +#, c-format msgid "Change Option %s" msgstr "Změna parametru %s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3134 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4021 msgid "Change Part Type" msgstr "Změna typu části" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:925 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694 msgid "Change point head diameter" msgstr "Změna průměru hrotu" -#: src/slic3r/GUI/Plater.cpp:3520 +#: 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:1185 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1718 msgid "Change type" msgstr "Změnit typ" -#: src/slic3r/GUI/UpdateDialogs.cpp:56 +#: src/slic3r/GUI/UpdateDialogs.cpp:53 msgid "Changelog && Download" msgstr "Changelog && Stažení" -#: src/slic3r/GUI/GUI_App.cpp:378 +#: src/slic3r/GUI/GUI_App.cpp:1245 msgid "Changing of an application language" msgstr "Změnit jazyk aplikace" -#: src/slic3r/GUI/ConfigWizard.cpp:409 src/slic3r/GUI/Preferences.cpp:61 +#: src/slic3r/GUI/ConfigWizard.cpp:1128 src/slic3r/GUI/Preferences.cpp:81 msgid "Check for application updates" msgstr "Zkontrolovat aktualizace aplikace" -#: src/slic3r/GUI/BedShapeDialog.cpp:509 +#: src/slic3r/GUI/GUI_App.cpp:1482 +msgid "Check for configuration updates" +msgstr "Zkontrolujte aktualizace konfigurace" + +#: src/slic3r/GUI/GUI_App.cpp:1482 +msgid "Check for updates" +msgstr "Zkontrolovat akt&ualizace" + +#: 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:621 +#: 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:532 +#: 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:464 +#: 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:510 +#: 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:501 +#: 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:490 +#: 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:84 +#: 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:3701 src/slic3r/GUI/GLCanvas3D.cpp:3734 -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/GUI_ObjectList.cpp:383 +#: 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:377 +#: 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:292 +#: src/slic3r/GUI/PresetComboBoxes.cpp:566 msgid "Click to edit preset" msgstr "Klikněte pro editaci přednastavení" -#: src/libslic3r/PrintConfig.cpp:216 +#: 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/GLGizmoSlaSupports.cpp:928 +#: 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:814 -#: src/slic3r/GUI/PrintHostDialogs.cpp:160 +#: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/Mouse3DController.cpp:353 +#: src/slic3r/GUI/PrintHostDialogs.cpp:159 msgid "Close" msgstr "Zavřít" -#: src/libslic3r/PrintConfig.cpp:550 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +#: src/libslic3r/PrintConfig.cpp:3098 +msgid "Closing distance" +msgstr "Vzdálenost uzavření" + +#: 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/GUI_Preview.cpp:218 src/slic3r/GUI/GUI_Preview.cpp:535 -#: src/libslic3r/GCode/PreviewData.cpp:406 +#: 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:1131 +msgid "Color change (\"%1%\") for Extruder %2%" +msgstr "Změna barvy (\"%1%\") pro Extruder %2%" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1001 +#, 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/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:224 +#: src/libslic3r/PrintConfig.cpp:294 msgid "Colorprint height" msgstr "Výška barevného tisku" -#: src/libslic3r/PrintConfig.cpp:942 +#: src/libslic3r/PrintConfig.cpp:1034 msgid "Combine infill every" msgstr "Kombinovat výplň každou" -#: src/libslic3r/PrintConfig.cpp:947 +#: src/libslic3r/PrintConfig.cpp:1039 msgid "Combine infill every n layers" msgstr "Kombinovat výplň každou n vrstvu" -#: src/slic3r/GUI/UpdateDialogs.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +msgid "Commands" +msgstr "Příkazy" + +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 msgid "Comment:" msgstr "Komentář:" -#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:244 +#: src/slic3r/GUI/Tab.cpp:107 src/libslic3r/PrintConfig.cpp:314 msgid "Compatible print profiles" msgstr "Kompatibilní tiskové profily" -#: src/libslic3r/PrintConfig.cpp:250 +#: 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:229 +#: src/slic3r/GUI/Tab.cpp:101 src/libslic3r/PrintConfig.cpp:299 msgid "Compatible printers" msgstr "Kompatibilní tiskárny" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:305 msgid "Compatible printers condition" msgstr "Stav kompatibilních tiskáren" -#: src/libslic3r/PrintConfig.cpp:268 +#: src/libslic3r/PrintConfig.cpp:338 msgid "Complete individual objects" msgstr "Dokončení individuálních objektů" -#: src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/PrintHostDialogs.cpp:234 msgid "Completed" msgstr "Dokončeno" -#: src/libslic3r/Zipper.cpp:57 +#: src/libslic3r/miniz_extension.cpp:113 msgid "compression failed" msgstr "komprese se nezdařila" -#: src/libslic3r/PrintConfig.cpp:399 src/libslic3r/PrintConfig.cpp:802 +#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:887 msgid "Concentric" msgstr "Koncentrická" -#: src/slic3r/GUI/ConfigWizard.cpp:1185 +#: src/slic3r/GUI/ConfigWizard.cpp:2625 msgid "Configuration &Assistant" msgstr "Průvodce n&astavením" -#: src/slic3r/GUI/ConfigWizard.cpp:1182 +#: src/slic3r/GUI/ConfigWizard.cpp:2628 msgid "Configuration &Wizard" -msgstr "Průvodce nastavením" +msgstr "Průvodce &nastavením" -#: src/slic3r/GUI/ConfigWizard.cpp:1184 +#: src/slic3r/GUI/ConfigWizard.cpp:2624 msgid "Configuration Assistant" msgstr "Průvodce nastavení tiskárny" -#: src/libslic3r/PrintConfig.cpp:1251 +#: src/libslic3r/PrintConfig.cpp:1424 msgid "Configuration notes" msgstr "Konfigurační poznámky" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:99 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104 msgid "Configuration Snapshots" -msgstr "Záloha konfigurace" +msgstr "Zálohy konfigurace" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 src/slic3r/GUI/UpdateDialogs.cpp:168 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" msgstr "Aktualizace nastavení" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 msgid "Configuration update is available" msgstr "Je k dispozici aktualizace nastavení" -#: src/slic3r/GUI/ConfigWizard.cpp:1181 +#: 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:2627 msgid "Configuration Wizard" msgstr "Průvodce nastavením" -#: src/slic3r/GUI/FirmwareDialog.cpp:863 +#: src/slic3r/GUI/FirmwareDialog.cpp:903 msgid "Confirmation" msgstr "Potvrzení" -#: src/slic3r/GUI/Tab.cpp:1904 -msgid "Connection failed." -msgstr "Připojení selhalo." - -#: src/slic3r/GUI/Tab.cpp:3416 +#: 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/Duet.cpp:51 +#: src/slic3r/Utils/AstroBox.cpp:84 +msgid "Connection to AstroBox works correctly." +msgstr "Připojení k AstroBoxu funguje správně." + +#: src/slic3r/Utils/Duet.cpp:49 msgid "Connection to Duet works correctly." msgstr "Připojení k Duet funguje správně." -#: src/slic3r/Utils/OctoPrint.cpp:84 +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "Připojení k FlashAir funguje správně a nahrávání je povoleno." + +#: src/slic3r/Utils/OctoPrint.cpp:83 msgid "Connection to OctoPrint works correctly." msgstr "Připojení k OctoPrint pracuje správně." -#: src/slic3r/GUI/Tab.cpp:1901 -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:195 +#: 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:1823 +#: src/libslic3r/PrintConfig.cpp:2051 msgid "Contact Z distance" msgstr "Mezera mezi podpěrami a objektem v ose Z" -#: src/slic3r/GUI/AboutDialog.cpp:96 +#: 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:2433 +#: 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:1489 +#: 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:629 +#: 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:648 +#: 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:1510 +#: src/slic3r/GUI/Tab.cpp:1811 msgid "Cooling thresholds" msgstr "Podmínky chlazení" -#: src/libslic3r/PrintConfig.cpp:291 +#: src/libslic3r/PrintConfig.cpp:361 msgid "Cooling tube length" msgstr "Délka chladící trubičky" -#: src/libslic3r/PrintConfig.cpp:283 +#: src/libslic3r/PrintConfig.cpp:353 msgid "Cooling tube position" msgstr "Pozice chladící trubičky" -#: src/slic3r/GUI/Tab.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:4856 +msgid "Copies of the selected object" +msgstr "Kopie vybraného modelu" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4871 msgid "Copy" msgstr "Kopírovat" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: 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:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 msgid "Copy to clipboard" msgstr "Kopírovat do schránky" -#: src/slic3r/GUI/SysInfoDialog.cpp:120 +#: src/slic3r/GUI/SysInfoDialog.cpp:177 msgid "Copy to Clipboard" msgstr "Kopírovat do Schránky" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:84 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:400 +#: 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: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: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:92 -msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?" +#: 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?\n" +"Error 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?" -#: src/slic3r/GUI/AboutDialog.cpp:92 +#: 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:139 src/slic3r/GUI/AboutDialog.cpp:281 msgid "Copyright" msgstr "Autorská práva" -#: src/libslic3r/PrintConfig.cpp:2324 src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2714 src/libslic3r/PrintConfig.cpp:2715 msgid "Correction for expansion" msgstr "Korekce expanze" -#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:3310 +#: src/slic3r/GUI/Tab.cpp:2270 src/slic3r/GUI/Tab.cpp:3935 msgid "Corrections" msgstr "Korekce" -#: src/slic3r/GUI/Plater.cpp:216 src/slic3r/GUI/Plater.cpp:1056 -#: src/libslic3r/PrintConfig.cpp:717 +#: 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:2140 +#: src/slic3r/GUI/Plater.cpp:245 +msgid "Cost (money)" +msgstr "Cena (peníze)" + +#: 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/Duet.cpp:56 +#: src/slic3r/Utils/AstroBox.cpp:90 +msgid "Could not connect to AstroBox" +msgstr "Nelze se připojit k AstroBoxu" + +#: src/slic3r/Utils/Duet.cpp:55 msgid "Could not connect to Duet" msgstr "Nelze se připojit k Duet" -#: src/slic3r/Utils/OctoPrint.cpp:90 +#: src/slic3r/Utils/FlashAir.cpp:74 +msgid "Could not connect to FlashAir" +msgstr "Nelze se spojit s FlashAir" + +#: src/slic3r/Utils/OctoPrint.cpp:89 msgid "Could not connect to OctoPrint" msgstr "Nelze se spojit s OctoPrintem" -#: src/slic3r/Utils/OctoPrint.cpp:200 +#: 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:1710 +#: 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:151 +#: 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:1872 +#: 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:73 +#: 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:61 +#: src/libslic3r/miniz_extension.cpp:117 msgid "CRC-32 check failed" msgstr "CRC-32 kontrola selhala" -#: src/libslic3r/PrintConfig.cpp:2734 +#: 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:2460 +#: src/libslic3r/PrintConfig.cpp:2888 msgid "Critical angle" msgstr "Kritický úhel" -#: src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2832 msgid "Cross" msgstr "Cross" -#: src/libslic3r/PrintConfig.cpp:800 +#: 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:2413 -#, possible-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 +#, c-format msgid "Current mode is %s" msgstr "Aktuální režim je %s" -#: src/slic3r/GUI/Tab.cpp:925 +#: 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:1276 msgid "Current preset is inherited from the default preset." msgstr "Aktuální nastavení je zděděno z výchozího nastavení." -#: src/slic3r/GUI/Tab.cpp:928 -#, possible-c-format -msgid "Current preset is inherited from:\n\t%s" -msgstr "Aktuální nastavení je zděděné od:\n%s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:45 +#: src/slic3r/GUI/UpdateDialogs.cpp:43 msgid "Current version:" msgstr "Aktuální verze:" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/slic3r/GUI/GUI_Preview.cpp:239 -#: src/libslic3r/GCode/PreviewData.cpp:175 +#: 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:96 +#: 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:1563 src/slic3r/GUI/Tab.cpp:1948 +#: 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/ConfigWizard.cpp:373 +#: 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/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:373 +#: src/slic3r/GUI/ConfigWizard.cpp:1091 msgid "Custom Printer Setup" msgstr "Vlastní nastavení tiskárny" -#: src/slic3r/GUI/ConfigWizard.cpp:377 +#: src/slic3r/GUI/ConfigWizard.cpp:1095 msgid "Custom profile name:" msgstr "Vlastní název profilu:" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3013 +#: 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:4193 +#: src/slic3r/GUI/Plater.cpp:4921 msgid "Cut by Plane" msgstr "Řez Rovinou" -#: src/libslic3r/PrintConfig.cpp:3014 +#: 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:1055 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 msgid "Cylinder" msgstr "Válec" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:1174 msgid "D&eselect all" msgstr "Odznačit vš&e" -#: src/libslic3r/PrintConfig.cpp:3115 +#: src/libslic3r/PrintConfig.cpp:3709 msgid "Data directory" msgstr "Složka Data" -#: src/libslic3r/Zipper.cpp:55 +#: src/slic3r/GUI/Mouse3DController.cpp:300 +msgid "Deadzone:" +msgstr "Mrtvá zóna:" + +#: 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:4127 +#: src/slic3r/GUI/Plater.cpp:4824 msgid "Decrease Instances" msgstr "Odebrání Instancí" -#: src/slic3r/GUI/GUI_App.cpp:594 src/slic3r/GUI/GUI_ObjectList.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/libslic3r/PrintConfig.cpp:369 msgid "Default" msgstr "Výchozí" -#: xs/src/slic3r/GUI/Field.cpp:98 +#: 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:730 +#: 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:522 +#: 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:937 +#: src/slic3r/GUI/Tab.cpp:1305 msgid "default filament profile" msgstr "výchozí profil filamentu" -#: src/libslic3r/PrintConfig.cpp:309 +#: src/libslic3r/PrintConfig.cpp:379 msgid "Default filament profile" msgstr "Výchozí profil filamentu" -#: src/libslic3r/PrintConfig.cpp:310 +#: 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:2757 -#, possible-c-format -msgid "Default preset (%s)" -msgstr "Výchozí přednastavení (%s)" - -#: src/libslic3r/GCode/PreviewData.cpp:491 +#: src/slic3r/GUI/GLCanvas3D.cpp:910 src/slic3r/GUI/GLCanvas3D.cpp:939 msgid "Default print color" msgstr "Výchozí barva tisku" -#: src/slic3r/GUI/Tab.cpp:934 +#: src/slic3r/GUI/Tab.cpp:1302 msgid "default print profile" msgstr "výchozí tiskový profil" -#: src/libslic3r/PrintConfig.cpp:316 +#: src/libslic3r/PrintConfig.cpp:386 msgid "Default print profile" msgstr "Výchozí tiskový profil" -#: src/libslic3r/PrintConfig.cpp:317 src/libslic3r/PrintConfig.cpp:2341 -#: src/libslic3r/PrintConfig.cpp:2352 +#: 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:951 +#: src/slic3r/GUI/Tab.cpp:1319 msgid "default SLA material profile" msgstr "výchozí profil pro SLA materiál" -#: src/libslic3r/PrintConfig.cpp:2340 src/libslic3r/PrintConfig.cpp:2351 +#: 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:955 +#: src/slic3r/GUI/Tab.cpp:1323 msgid "default SLA print profile" msgstr "výchozí SLA tiskový profil" -#: src/slic3r/GUI/Field.cpp:105 +#: src/slic3r/GUI/Field.cpp:184 msgid "default value" msgstr "výchozí hodnota" -#: src/slic3r/GUI/ConfigWizard.cpp:375 +#: src/slic3r/GUI/ConfigWizard.cpp:1093 msgid "Define a custom printer profile" msgstr "Vytvořit vlastní tiskový profil" -#: src/libslic3r/PrintConfig.cpp:2558 +#: 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:237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:393 msgid "degenerate facets" msgstr "degenerace facetů" -#: src/libslic3r/PrintConfig.cpp:608 +#: src/libslic3r/PrintConfig.cpp:676 msgid "Delay after unloading" msgstr "Zpoždění po vyjmutí" -#: src/slic3r/GUI/Tab.cpp:2935 +#: src/slic3r/GUI/Tab.cpp:3386 msgid "delete" msgstr "smazat" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1257 src/slic3r/GUI/Plater.cpp:2891 -#: src/slic3r/GUI/Plater.cpp:2909 src/slic3r/GUI/Tab.cpp:2937 +#: 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:449 +#: src/slic3r/GUI/MainFrame.cpp:1181 msgid "Delete &all" msgstr "Sm&azat vše" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 -msgid "Delete All" -msgstr "Smazat vše" - -#: src/slic3r/GUI/Plater.cpp:3298 +#: 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:1806 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2341 msgid "Delete All Instances from Object" msgstr "Smazat všechny instance objektu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/DoubleSlider.cpp:1708 +msgid "Delete color change" +msgstr "Smazat změnu barvy" + +#: 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/GUI_ObjectList.cpp:1898 +#: src/slic3r/GUI/DoubleSlider.cpp:1711 +msgid "Delete custom G-code" +msgstr "Smazat vlastní G-code" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424 +msgid "Delete drainage hole" +msgstr "Odstranění odtokového otvoru" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2357 msgid "Delete Height Range" msgstr "Odstranění Rozsahu vrstev" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 msgid "Delete Instance" msgstr "Smazání Instance" -#: src/slic3r/GUI/Plater.cpp:2592 +#: src/slic3r/GUI/Plater.cpp:2673 msgid "Delete Object" msgstr "Smazat Objekt" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:100 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104 +#, c-format msgid "Delete Option %s" msgstr "Odebrání parametru %s" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/DoubleSlider.cpp:1710 +msgid "Delete pause print" +msgstr "Odebrat pozastavení tisku" + +#: 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:2415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3221 msgid "Delete Selected" msgstr "Smazání vybraných" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2303 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3083 msgid "Delete Selected Item" msgstr "Smazat vybrané položky" -#: src/slic3r/GUI/Plater.cpp:4083 +#: src/slic3r/GUI/Plater.cpp:4782 msgid "Delete Selected Objects" msgstr "Odstranit vybrané objekty" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2319 msgid "Delete Settings" msgstr "Smazat Nastavení" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1857 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2393 msgid "Delete Subobject" msgstr "Smazání dílčího objektu" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:720 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514 msgid "Delete support point" msgstr "Odebrání podpěrného bodu" -#: src/slic3r/GUI/Tab.cpp:131 +#: src/slic3r/GUI/Tab.cpp:204 msgid "Delete this preset" msgstr "Smazat přednastavení" -#: src/slic3r/GUI/MainFrame.cpp:449 +#: 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:1709 +msgid "Delete tool change" +msgstr "Smazat změnu nástroje" + +#: src/slic3r/GUI/MainFrame.cpp:1182 msgid "Deletes all objects" msgstr "Smazat všechny objekty" -#: src/slic3r/GUI/MainFrame.cpp:447 +#: src/slic3r/GUI/MainFrame.cpp:1179 msgid "Deletes the current selection" msgstr "Smaže aktuální výběr" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:2646 +#: src/libslic3r/PrintConfig.cpp:2647 msgid "Density" msgstr "Hustota" -#: src/libslic3r/PrintConfig.cpp:744 +#: 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%." -#: src/slic3r/GUI/Tab.cpp:1200 src/slic3r/GUI/Tab.cpp:1584 -#: src/slic3r/GUI/Tab.cpp:1992 src/slic3r/GUI/Tab.cpp:2086 -#: src/slic3r/GUI/Tab.cpp:3336 src/slic3r/GUI/Tab.cpp:3445 +#: 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:1542 src/libslic3r/PrintConfig.cpp:1543 +#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1721 msgid "Deretraction Speed" msgstr "Rychlost deretrakce" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1235 +#: 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:1216 msgid "Deselect by rectangle" msgstr "Odznačit obdélníkovým výběrem myši" -#: src/slic3r/GUI/MainFrame.cpp:492 +#: src/slic3r/GUI/MainFrame.cpp:1175 msgid "Deselects all objects" msgstr "Odznačit všechny objekty" -#: src/libslic3r/PrintConfig.cpp:1304 +#: 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:1246 +msgid "Detach preset" +msgstr "Oddělení přednastavení" + +#: src/slic3r/GUI/Tab.cpp:3323 +msgid "Detached" +msgstr "Odpojeno" + +#: src/libslic3r/PrintConfig.cpp:1481 msgid "Detect bridging perimeters" msgstr "Detekovat perimetry přemostění" -#: src/libslic3r/PrintConfig.cpp:1988 +#: 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:1986 +#: src/libslic3r/PrintConfig.cpp:2216 msgid "Detect thin walls" msgstr "Detekovat tenké zdi" -#: src/libslic3r/PrintConfig.cpp:3083 +#: 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:1713 +#: src/slic3r/GUI/Plater.cpp:2330 msgid "Detected advanced data" msgstr "Byla detekována data z pokročilého režimu" -#: src/slic3r/GUI/BedShapeDialog.cpp:88 src/libslic3r/PrintConfig.cpp:677 +#: src/slic3r/GUI/Mouse3DController.cpp:274 +msgid "Device:" +msgstr "Zařízení:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:745 msgid "Diameter" msgstr "Průměr" -#: src/libslic3r/PrintConfig.cpp:2443 +#: 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:2399 +#: 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:2371 +#: 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:89 +#: 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:1569 +#: src/libslic3r/PrintConfig.cpp:1747 msgid "Direction" msgstr "Směr" -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:393 msgid "Disable fan for the first" msgstr "Vypnutí chlazení pro prvních" -#: src/libslic3r/PrintConfig.cpp:1280 +#: 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/wxExtensions.cpp:2572 -msgid "Discard all color changes" -msgstr "Odstranit všechny změny barev" +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:641 +msgid "Discard" +msgstr "Zahodit" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1241 +#: 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:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222 msgid "Discard changes" msgstr "Zahodit změny" -#: src/slic3r/GUI/Tab.cpp:2784 -msgid "Discard changes and continue anyway?" -msgstr "Zahodit změny a pokračovat?" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Displacement (mm)" -msgstr "Posunutí (mm)" - -#: src/slic3r/GUI/Tab.cpp:2041 +#: src/slic3r/GUI/Tab.cpp:2248 msgid "Display" msgstr "Displej" -#: src/libslic3r/PrintConfig.cpp:2208 +#: src/libslic3r/PrintConfig.cpp:2502 msgid "Display height" msgstr "Výška displeje" -#: src/libslic3r/PrintConfig.cpp:2319 +#: src/libslic3r/PrintConfig.cpp:2521 msgid "Display horizontal mirroring" msgstr "Horizontální zrcadlení displeje" -#: src/libslic3r/PrintConfig.cpp:2227 +#: src/libslic3r/PrintConfig.cpp:2535 msgid "Display orientation" msgstr "Orientace displeje" -#: src/slic3r/GUI/MainFrame.cpp:510 +#: 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:2326 +#: src/libslic3r/PrintConfig.cpp:2528 msgid "Display vertical mirroring" msgstr "Vertikální zrcadlení displeje" -#: src/libslic3r/PrintConfig.cpp:2202 +#: src/libslic3r/PrintConfig.cpp:2496 msgid "Display width" msgstr "Šířka displeje" -#: src/libslic3r/PrintConfig.cpp:341 +#: src/libslic3r/PrintConfig.cpp:411 msgid "Distance between copies" msgstr "Vzdálenost mezi kopiemi" -#: src/libslic3r/PrintConfig.cpp:1610 +#: 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:2752 +#: 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:1609 +#: src/libslic3r/PrintConfig.cpp:1787 msgid "Distance from object" msgstr "Vzdálenost od objektu" -#: src/slic3r/GUI/BedShapeDialog.cpp:80 +#: 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:285 +#: 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:1338 +#: 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:342 +#: 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:3097 +#: 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:3041 +#: 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:206 -#, 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/Field.cpp:288 +#, 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/GUI_App.cpp:754 +#: 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:1610 msgid "Do you want to proceed?" msgstr "Chcete pokračovat?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1024 +#: src/slic3r/GUI/Plater.cpp:3124 +msgid "Do you want to retry" +msgstr "Chcete to zkusit znovu" + +#: 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/libslic3r/PrintConfig.cpp:3040 +#: 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: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/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" -#: src/slic3r/GUI/UpdateDialogs.cpp:55 +#: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" msgstr "Neupozorňovat na nové verze" -#: src/libslic3r/PrintConfig.cpp:333 +#: src/libslic3r/PrintConfig.cpp:403 msgid "Don't support bridges" msgstr "Nevytvářet podpěry pod mosty" @@ -1724,206 +2402,377 @@ msgstr "Nevytvářet podpěry pod mosty" msgid "Downgrade" msgstr "Downgrade" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1233 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1236 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1237 +#: src/libslic3r/PrintConfig.cpp:1803 +msgid "Draft shield" +msgstr "Ochranný štít" + +#: 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/slic3r/GUI/GUI_ObjectManipulation.cpp:340 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:355 +#: 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: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:345 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357 msgid "Drop to bed" msgstr "Spadnout na podložku" -#: src/libslic3r/PrintConfig.cpp:3044 +#: src/libslic3r/PrintConfig.cpp:3632 msgid "Duplicate" msgstr "Duplikovat" -#: src/libslic3r/PrintConfig.cpp:3049 +#: src/libslic3r/PrintConfig.cpp:3637 msgid "Duplicate by grid" msgstr "Duplikovat mřížkou" -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/slic3r/GUI/GCodeViewer.cpp:2445 +msgid "Duration" +msgstr "Doba trvání" + +#: src/slic3r/GUI/PresetHints.cpp:39 +msgid "During the other layers, fan" +msgstr "V průběhu ostatních vrstev, ventilátor" + +#: src/libslic3r/PrintConfig.cpp:2833 msgid "Dynamic" msgstr "Dynamic" -#: src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/MainFrame.cpp:1448 msgid "E&xport" msgstr "E&xportovat" -#: src/slic3r/GUI/GUI_ObjectList.cpp:238 +#: src/slic3r/GUI/GUI_ObjectList.cpp:394 msgid "edges fixed" msgstr "hrany opraveny" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2690 +#: src/slic3r/GUI/DoubleSlider.cpp:1700 +msgid "Edit color" +msgstr "Upravit barvu" + +#: 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:1702 +msgid "Edit custom G-code" +msgstr "Upravit vlastní G-code" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3459 msgid "Edit Height Range" msgstr "Úprava Rozsahu vrstev" -#: src/slic3r/GUI/GUI_ObjectList.cpp:373 +#: src/slic3r/GUI/DoubleSlider.cpp:1701 +msgid "Edit pause print message" +msgstr "Upravit zprávu při pozastavení tisku" + +#: 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:1163 +msgid "Edit tick mark - Right click" +msgstr "Upravit značku - Pravé tlačítko myši" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectList.cpp:441 msgid "Editing" msgstr "Editace" -#: src/libslic3r/PrintConfig.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:1105 +msgid "Ejec&t SD card / Flash drive" +msgstr "Vysunou&t SD kartu / Flash disk" + +#: 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: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:2034 +#, c-format +msgid "Ejecting of device %s(%s) has failed." +msgstr "Vysunutí zařízení %s(%s) se nezdařilo." + +#: src/libslic3r/PrintConfig.cpp:120 msgid "Elephant foot compensation" msgstr "Kompenzace rozplácnutí první vrstvy" -#: src/libslic3r/SLAPrint.cpp:681 -msgid "Elevation is too low for object. Use the \"Pad around obect\" feature to print the object without elevation." -msgstr "Vzdálenost od podložky je příliš nízká. Zvolte funkci \"Podložka okolo objektu\" pro tisk objektu bez nadzvednutí." +#: src/libslic3r/PrintConfig.cpp:2590 +msgid "Elephant foot minimum width" +msgstr "Minimální šířka po kompenzaci rozplácnutí první vrstvy" -#: src/libslic3r/SLAPrint.cpp:678 +#: 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:1044 +#: 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/slic3r/GUI/Tab.cpp:1490 src/libslic3r/PrintConfig.cpp:1286 -#: src/libslic3r/PrintConfig.cpp:2099 +#: 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:1791 src/libslic3r/PrintConfig.cpp:1463 +#: src/libslic3r/PrintConfig.cpp:2343 msgid "Enable" msgstr "Zapnout" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:347 msgid "Enable auto cooling" msgstr "Zapnutí automatického chlazení" -#: src/libslic3r/PrintConfig.cpp:539 +#: 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:2321 +#: src/libslic3r/PrintConfig.cpp:3072 +msgid "Enable hollowing" +msgstr "Povolit tvorbu dutin" + +#: 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:1781 +#: 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/libslic3r/PrintConfig.cpp:2009 msgid "Enable support material generation." msgstr "Zapne generování podpěr." -#: src/libslic3r/PrintConfig.cpp:918 +#: 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:881 +#: 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:2085 +#: src/libslic3r/PrintConfig.cpp:2329 msgid "Enable variable layer height feature" msgstr "Zapnout variabilní výšku vrstev" -#: src/libslic3r/PrintConfig.cpp:2328 +#: 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:1570 src/slic3r/GUI/Tab.cpp:1955 -#: src/libslic3r/PrintConfig.cpp:359 src/libslic3r/PrintConfig.cpp:369 +#: 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:1838 +#: 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:1845 +#: 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/PrintHostDialogs.cpp:197 -#: src/slic3r/GUI/PrintHostDialogs.cpp:228 +#: 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:380 +#: src/libslic3r/PrintConfig.cpp:441 msgid "Ensure vertical shell thickness" msgstr "Zajistit tloušťku svislých stěn" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 +#: 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:4266 msgid "Enter new name" msgstr "Zadejte nový název" -#: src/slic3r/GUI/ConfigWizard.cpp:622 +#: 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: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:570 +#: 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:557 +#: 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/ConfigWizard.cpp:608 +#: 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/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:1399 msgid "Enter the temperature needed for extruding your filament." msgstr "Zadejte požadovanou teplotu pro extruzi vašeho filamentu." -#: src/libslic3r/PrintConfig.cpp:718 +#: 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:686 +#: 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:678 +#: 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:636 src/slic3r/GUI/PrintHostDialogs.cpp:230 +#: 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:608 -#, possible-c-format +#: src/slic3r/GUI/FirmwareDialog.cpp:645 +#, 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:3593 -#, possible-c-format +#: 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:5172 +#, c-format msgid "Error exporting 3MF file %s" msgstr "Chyba při exportu souboru 3MF %s" -#: src/slic3r/GUI/Plater.cpp:3564 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:5138 +#, c-format msgid "Error exporting AMF file %s" msgstr "Chyba při exportu souboru AMF %s" -#: src/slic3r/GUI/PrintHostDialogs.cpp:153 +#: 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/PrintHostDialogs.cpp:271 +#: 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." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:272 msgid "Error uploading to print host:" msgstr "Chyba při nahrávání do tiskového serveru:" -#: src/libslic3r/Zipper.cpp:105 +#: 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/BedShapeDialog.cpp:333 src/slic3r/GUI/GUI_ObjectList.cpp:1443 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2077 msgid "Error!" msgstr "Chyba!" -#: src/slic3r/GUI/BedShapeDialog.cpp:482 +#: src/slic3r/GUI/BedShapeDialog.cpp:581 msgid "Error! Invalid model" msgstr "Chyba! Neplatný model" -#: src/slic3r/GUI/FirmwareDialog.cpp:610 -#, possible-c-format +#: 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 msgid "Error: %s" msgstr "Chyba: %s" -#: src/slic3r/GUI/Plater.cpp:1503 +#: 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:217 src/slic3r/GUI/Plater.cpp:1028 -#: src/slic3r/GUI/Plater.cpp:1070 +#: 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:424 +#: 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" @@ -1935,105 +2784,138 @@ msgstr "s výjimkou prvních %1% vrstev." msgid "except for the first layer." msgstr "vyjma první vrstvy." -#: src/libslic3r/Print.cpp:1285 +#: 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:148 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 +#, c-format msgid "Exit %s" msgstr "Ukončit %s" -#: src/libslic3r/PrintConfig.cpp:335 +#: 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:1306 +#: 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:676 src/slic3r/GUI/wxExtensions.cpp:2461 +#: src/slic3r/GUI/GUI_App.cpp:1507 src/slic3r/GUI/wxExtensions.cpp:676 msgid "Expert" msgstr "Expert" -#: src/slic3r/GUI/GUI_App.cpp:676 +#: src/slic3r/GUI/ConfigWizard.cpp:1181 +msgid "Expert mode" +msgstr "Expertní režim" + +#: src/slic3r/GUI/GUI_App.cpp:1507 msgid "Expert View Mode" msgstr "Režim Expert" -#: src/slic3r/GUI/MainFrame.cpp:602 src/slic3r/GUI/Plater.cpp:3821 +#: src/slic3r/GUI/Plater.cpp:5706 msgid "Export" msgstr "Exportovat" -#: src/slic3r/GUI/MainFrame.cpp:373 +#: src/slic3r/GUI/MainFrame.cpp:1094 msgid "Export &Config" msgstr "Exportovat Konfigura&ci" -#: src/slic3r/GUI/MainFrame.cpp:362 src/slic3r/GUI/MainFrame.cpp:602 +#: 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:488 +#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395 msgid "Export &toolpaths as OBJ" -msgstr "Exportovat tras&sy extruderu jako OBJ" +msgstr "Exportovat &trasy extruderu jako OBJ" -#: src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:3531 msgid "Export 3MF" msgstr "Exportovat 3MF" -#: src/slic3r/GUI/MainFrame.cpp:375 +#: 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:2954 +#: src/libslic3r/PrintConfig.cpp:3536 msgid "Export AMF" msgstr "Exportovat AMF" -#: src/slic3r/GUI/Plater.cpp:1932 +#: src/slic3r/GUI/Plater.cpp:2560 msgid "Export AMF file:" msgstr "Exportovat AMF soubor:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1219 src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1786 src/slic3r/GUI/Plater.cpp:3884 msgid "Export as STL" msgstr "Exportovat jako STL" -#: src/slic3r/GUI/MainFrame.cpp:375 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +msgid "Export config" +msgstr "Exportovat konfiguraci" + +#: src/slic3r/GUI/MainFrame.cpp:1097 msgid "Export Config &Bundle" msgstr "Exportovat Konfigurační &Balík" -#: src/slic3r/GUI/MainFrame.cpp:373 +#: 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:370 +#: 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:362 +#: 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:366 +#: 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:1080 msgid "Export current plate as STL" msgstr "Exportovat stávající plochu jako STL" -#: src/slic3r/GUI/MainFrame.cpp:368 +#: 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:2722 -msgid "Export failed" -msgstr "Exportování selhalo" +#: 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:108 src/slic3r/GUI/Plater.cpp:733 -#: src/slic3r/GUI/Plater.cpp:3821 src/libslic3r/PrintConfig.cpp:2964 +#: 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/libslic3r/PrintConfig.cpp:2931 +#: 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/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:2531 +#: src/slic3r/GUI/Plater.cpp:2572 msgid "Export OBJ file:" msgstr "Exportovat OBJ soubor:" @@ -2041,200 +2923,219 @@ 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:370 +#: src/slic3r/GUI/MainFrame.cpp:1086 msgid "Export plate as &AMF" msgstr "Exportovat plochu jako &AMF" -#: src/slic3r/GUI/MainFrame.cpp:366 +#: src/slic3r/GUI/MainFrame.cpp:1080 msgid "Export plate as &STL" msgstr "Exportovat plochu jako &STL" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: 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:2943 +#: src/libslic3r/PrintConfig.cpp:3525 msgid "Export SLA" msgstr "Exportovat SLA" -#: src/libslic3r/PrintConfig.cpp:2959 +#: 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:3541 msgid "Export STL" msgstr "Exportovat STL" -#: src/slic3r/GUI/Plater.cpp:1925 +#: src/slic3r/GUI/Plater.cpp:2553 msgid "Export STL file:" msgstr "Exportovat STL soubor:" -#: src/libslic3r/PrintConfig.cpp:2950 +#: src/libslic3r/PrintConfig.cpp:3532 msgid "Export the model(s) as 3MF." msgstr "Exportovat model(y) jako 3MF." -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3537 msgid "Export the model(s) as AMF." msgstr "Exportovat model(y) jako AMF." -#: src/libslic3r/PrintConfig.cpp:2932 +#: src/libslic3r/PrintConfig.cpp:3514 msgid "Export the model(s) as OBJ." msgstr "Exportovat model(y) jako OBJ." -#: src/libslic3r/PrintConfig.cpp:2960 +#: src/libslic3r/PrintConfig.cpp:3542 msgid "Export the model(s) as STL." msgstr "Exportovat model(y) jako STL." -#: src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/Plater.cpp:3884 msgid "Export the selected object as STL file" msgstr "Exportovat vybrané objekty jako STL soubor" -#: src/slic3r/GUI/MainFrame.cpp:488 +#: 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/Plater.cpp:755 +msgid "Export to SD card / Flash drive " +msgstr "Export na SD kartu / Flash disk" + +#: 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:1517 +#: 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:700 +#: 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:3306 +#: src/slic3r/GUI/Tab.cpp:2287 src/slic3r/GUI/Tab.cpp:3931 msgid "Exposure" msgstr "Osvit" -#: src/libslic3r/PrintConfig.cpp:2310 src/libslic3r/PrintConfig.cpp:2311 +#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685 msgid "Exposure time" msgstr "Doba osvitu" -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/GCode/PreviewData.cpp:164 +#: 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:153 +#: src/slic3r/GUI/PresetHints.cpp:155 msgid "external perimeters" msgstr "vnější perimetry" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:425 +#: src/libslic3r/PrintConfig.cpp:482 src/libslic3r/PrintConfig.cpp:493 msgid "External perimeters" msgstr "Vnější perimetry" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:505 msgid "External perimeters first" msgstr "Nejprve tisknout vnější perimetry" -#: src/libslic3r/PrintConfig.cpp:1518 src/libslic3r/PrintConfig.cpp:1526 +#: 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:1321 +#: src/libslic3r/PrintConfig.cpp:1498 msgid "Extra loading distance" msgstr "Extra délka při zavádění" -#: src/libslic3r/PrintConfig.cpp:445 +#: src/libslic3r/PrintConfig.cpp:513 msgid "Extra perimeters if needed" msgstr "Extra perimetry (pokud jsou potřeba)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:335 src/slic3r/GUI/Tab.cpp:1479 -#: src/libslic3r/PrintConfig.cpp:455 +#: 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/Tab.cpp:2253 src/libslic3r/GCode/PreviewData.cpp:475 -#, possible-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 +#, c-format msgid "Extruder %d" msgstr "Extruder %d" -#: src/slic3r/GUI/ConfigWizard.cpp:592 -msgid "Extruder and Bed Temperatures" -msgstr "Teploty extruderu a podložky" +#: 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/WipeTowerDialog.cpp:226 +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" msgstr "Extruder změněn na" -#: src/slic3r/GUI/Tab.cpp:1171 +#: src/slic3r/GUI/Tab.cpp:1563 msgid "Extruder clearance (mm)" msgstr "Kolizní oblast extruderu (mm)" -#: src/libslic3r/PrintConfig.cpp:490 +#: src/libslic3r/PrintConfig.cpp:558 msgid "Extruder Color" msgstr "Barva extruderu" -#: src/libslic3r/PrintConfig.cpp:497 +#: src/libslic3r/PrintConfig.cpp:565 msgid "Extruder offset" msgstr "Odsazení extruderu" -#: src/libslic3r/PrintConfig.cpp:863 -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:1978 -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:33 src/slic3r/GUI/GUI_ObjectList.cpp:72 -#: src/slic3r/GUI/GUI_ObjectList.cpp:513 src/slic3r/GUI/Tab.cpp:1119 -#: src/slic3r/GUI/Tab.cpp:1844 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:954 src/libslic3r/PrintConfig.cpp:1340 -#: src/libslic3r/PrintConfig.cpp:1668 src/libslic3r/PrintConfig.cpp:1852 -#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:2151 -#: src/libslic3r/PrintConfig.cpp:2159 +#: 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:507 +#: 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:513 +#: src/libslic3r/PrintConfig.cpp:581 msgid "Extrusion multiplier" msgstr "Násobič extruze" -#: src/slic3r/GUI/ConfigWizard.cpp:612 +#: src/slic3r/GUI/ConfigWizard.cpp:1403 msgid "Extrusion Temperature:" msgstr "Teplota extruze:" -#: src/slic3r/GUI/Tab.cpp:1143 +#: src/slic3r/GUI/Tab.cpp:1535 msgid "Extrusion width" msgstr "Šířka extruze" -#: src/slic3r/GUI/GUI_ObjectList.cpp:73 src/slic3r/GUI/GUI_ObjectList.cpp:514 -#: src/libslic3r/PrintConfig.cpp:416 src/libslic3r/PrintConfig.cpp:523 -#: src/libslic3r/PrintConfig.cpp:830 src/libslic3r/PrintConfig.cpp:962 -#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1688 -#: src/libslic3r/PrintConfig.cpp:1861 src/libslic3r/PrintConfig.cpp:2018 +#: 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:139 +#: src/slic3r/GUI/Plater.cpp:168 msgid "Facets" msgstr "Facety" -#: src/slic3r/GUI/GUI_ObjectList.cpp:240 +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 msgid "facets added" msgstr "facety přidány" -#: src/slic3r/GUI/GUI_ObjectList.cpp:239 +#: src/slic3r/GUI/GUI_ObjectList.cpp:395 msgid "facets removed" msgstr "facety odebrány" -#: src/slic3r/GUI/GUI_ObjectList.cpp:241 +#: src/slic3r/GUI/GUI_ObjectList.cpp:397 msgid "facets reversed" msgstr "facety otočeny" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2660 msgid "Faded layers" msgstr "Vrstvy počátečního osvitu" -#: src/libslic3r/Zipper.cpp:47 +#: src/libslic3r/miniz_extension.cpp:103 msgid "failed finding central directory" msgstr "selhalo nalezení kořenového adresáře" @@ -2242,7 +3143,7 @@ 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:65 +#: src/libslic3r/PrintBase.cpp:72 msgid "Failed processing of the output_filename_format template." msgstr "Zpracování šablony output_filename_format selhalo." @@ -2250,157 +3151,187 @@ msgstr "Zpracování šablony output_filename_format selhalo." msgid "Fan" msgstr "Ventilátor" -#: src/slic3r/GUI/Tab.cpp:1501 +#: src/slic3r/GUI/Tab.cpp:1802 msgid "Fan settings" msgstr "Nastavení ventilátoru" -#: src/slic3r/GUI/Tab.cpp:1502 +#: src/slic3r/GUI/GUI_Preview.cpp:279 src/slic3r/GUI/Tab.cpp:1803 msgid "Fan speed" msgstr "Rychlost ventilátoru" -#: src/libslic3r/PrintConfig.cpp:2240 +#: src/slic3r/GUI/GCodeViewer.cpp:2239 src/libslic3r/GCode/PreviewData.cpp:358 +msgid "Fan Speed (%)" +msgstr "Rychlost ventilátoru (%)" + +#: src/libslic3r/PrintConfig.cpp:2548 msgid "Fast" msgstr "Rychlý" -#: src/libslic3r/PrintConfig.cpp:2241 +#: src/libslic3r/PrintConfig.cpp:2549 msgid "Fast tilt" msgstr "Rychlý náklon" -#: src/slic3r/GUI/GUI_App.cpp:135 +#: src/slic3r/GUI/GUI_App.cpp:531 msgid "Fatal error" msgstr "Fatální chyba" -#: src/slic3r/GUI/GUI_Preview.cpp:212 src/slic3r/GUI/GUI_Preview.cpp:537 -#: src/libslic3r/GCode/PreviewData.cpp:394 +#: 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:224 src/slic3r/GUI/GUI_Preview.cpp:225 +#: 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í" -#: src/slic3r/GUI/Plater.cpp:682 src/slic3r/GUI/Tab.cpp:1470 -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/ConfigWizard.cpp:1926 +msgid "FFF Technology Printers" +msgstr "Tiskárny technologie FFF" + +#: 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:1275 +#: src/libslic3r/Preset.cpp:1301 msgid "filament" msgstr "filament" -#: src/slic3r/GUI/ConfigWizard.cpp:541 +#: src/slic3r/GUI/ConfigWizard.cpp:1318 msgid "Filament and Nozzle Diameters" -msgstr "Průměry filamentu a trysky" +msgstr "Průměr filamentu a trysky" -#: src/slic3r/GUI/ConfigWizard.cpp:574 +#: src/slic3r/GUI/ConfigWizard.cpp:1349 msgid "Filament Diameter:" msgstr "Průměr filamentu:" -#: src/libslic3r/PrintConfig.cpp:620 +#: 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:654 +#: src/libslic3r/PrintConfig.cpp:722 msgid "Filament load time" msgstr "Doba zavádění filamentu" -#: src/libslic3r/PrintConfig.cpp:556 +#: src/libslic3r/PrintConfig.cpp:624 msgid "Filament notes" msgstr "Poznámky k filamentu" -#: src/slic3r/GUI/Tab.cpp:1502 src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1669 msgid "Filament Overrides" msgstr "Přepsání globálních hodnot" -#: src/libslic3r/PrintConfig.cpp:1312 +#: src/libslic3r/PrintConfig.cpp:1489 msgid "Filament parking position" msgstr "Parkovací pozice filamentu" -#: src/slic3r/GUI/Tab.cpp:1516 +#: src/slic3r/GUI/ConfigWizard.cpp:2524 +msgid "Filament Profiles Selection" +msgstr "Výběr Filamentových Profilů" + +#: src/slic3r/GUI/Tab.cpp:1817 msgid "Filament properties" msgstr "Vlastnosti filamentu" -#: src/slic3r/GUI/Tab.hpp:335 +#: src/slic3r/GUI/Tab.hpp:409 msgid "Filament Settings" msgstr "Nastavení filamentu" -#: src/libslic3r/PrintConfig.cpp:694 +#: 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:669 +#: src/libslic3r/PrintConfig.cpp:737 msgid "Filament unload time" msgstr "Doba vysouvání filamentu" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "filaments" msgstr "filamenty" -#: src/libslic3r/Zipper.cpp:75 +#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2524 +msgid "Filaments" +msgstr "Filamenty" + +#: src/slic3r/GUI/ConfigWizard.cpp:691 +msgid "Filaments marked with * are not compatible with some installed printers." +msgstr "Filamenty označené znakem * nejsou 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:69 +#: src/libslic3r/miniz_extension.cpp:125 msgid "file create failed" msgstr "vytvoření souboru selhalo" -#: src/slic3r/GUI/MainFrame.cpp:642 +#: src/slic3r/GUI/MainFrame.cpp:1492 msgid "File Not Found" msgstr "Soubor nenalezen" -#: src/libslic3r/Zipper.cpp:89 +#: src/libslic3r/miniz_extension.cpp:145 msgid "file not found" msgstr "soubor nenalezen" -#: src/libslic3r/Zipper.cpp:67 +#: src/libslic3r/miniz_extension.cpp:123 msgid "file open failed" msgstr "otevření souboru selhalo" -#: src/libslic3r/Zipper.cpp:73 +#: src/libslic3r/miniz_extension.cpp:129 msgid "file read failed" msgstr "čtení souboru se nezdařilo" -#: src/libslic3r/Zipper.cpp:77 +#: src/libslic3r/miniz_extension.cpp:133 msgid "file seek failed" msgstr "hledání souboru selhalo" -#: src/libslic3r/Zipper.cpp:79 +#: src/libslic3r/miniz_extension.cpp:135 msgid "file stat failed" msgstr "soubor stat selhal" -#: src/libslic3r/Zipper.cpp:39 +#: src/libslic3r/miniz_extension.cpp:95 msgid "file too large" msgstr "soubor je příliš velký" -#: src/libslic3r/Zipper.cpp:71 +#: src/libslic3r/miniz_extension.cpp:127 msgid "file write failed" msgstr "zápis souboru se nezdařil" -#: src/slic3r/GUI/PrintHostDialogs.cpp:152 +#: src/slic3r/GUI/PrintHostDialogs.cpp:151 msgid "Filename" msgstr "Název souboru" -#: src/libslic3r/PrintConfig.cpp:728 +#: src/libslic3r/PrintConfig.cpp:811 msgid "Fill angle" msgstr "Úhel výplně" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:825 msgid "Fill density" msgstr "Hustota výplně" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:862 msgid "Fill pattern" msgstr "Vzor výplně" -#: src/libslic3r/PrintConfig.cpp:410 +#: 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:781 +#: 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:390 +#: 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." @@ -2408,364 +3339,534 @@ msgstr "Nastavte vzor pro horní výplň. Ovlivňuje pouze horní viditelnou vrs msgid "Finished" msgstr "Dokončeno" -#: src/slic3r/GUI/ConfigWizard.cpp:486 src/slic3r/GUI/Tab.cpp:1920 +#: src/slic3r/GUI/ConfigWizard.cpp:1257 src/slic3r/GUI/Tab.cpp:2132 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/FirmwareDialog.cpp:740 +#: src/slic3r/GUI/FirmwareDialog.cpp:777 msgid "Firmware flasher" msgstr "Aktualizace firmware" -#: src/slic3r/GUI/FirmwareDialog.cpp:765 +#: src/slic3r/GUI/FirmwareDialog.cpp:802 msgid "Firmware image:" msgstr "Soubor s firmware:" -#: src/slic3r/GUI/Tab.cpp:2431 +#: src/slic3r/GUI/Tab.cpp:2733 msgid "Firmware Retraction" msgstr "Firmware Retrakce" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:1257 msgid "Firmware Type" msgstr "Typ firmware" -#: src/libslic3r/PrintConfig.cpp:812 src/libslic3r/PrintConfig.cpp:821 -#: src/libslic3r/PrintConfig.cpp:829 src/libslic3r/PrintConfig.cpp:862 +#: 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/libslic3r/PrintConfig.cpp:841 +#: 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:1328 +#: 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:852 +#: 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:216 +#: src/slic3r/GUI/PresetHints.cpp:218 msgid "First layer volumetric" msgstr "Volumetrická hodnota první vrstvy" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1210 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1776 msgid "Fix through the Netfabb" msgstr "Opravit pomocí služby Netfabb" -#: src/slic3r/GUI/Plater.cpp:3072 +#: src/slic3r/GUI/Plater.cpp:3278 msgid "Fix Throught NetFabb" msgstr "Opravit pomocí Netfabb" -#: src/slic3r/GUI/GUI_App.cpp:685 +#: src/slic3r/GUI/GUI_App.cpp:1522 msgid "Flash printer &firmware" msgstr "Nahrát &firmware tiskárny" -#: src/slic3r/GUI/FirmwareDialog.cpp:146 +#: src/slic3r/GUI/FirmwareDialog.cpp:150 msgid "Flash!" msgstr "Nahrát!" -#: src/slic3r/GUI/FirmwareDialog.cpp:275 +#: src/slic3r/GUI/FirmwareDialog.cpp:284 msgid "Flashing cancelled." msgstr "Nahrávání zrušeno." -#: src/slic3r/GUI/FirmwareDialog.cpp:192 +#: src/slic3r/GUI/FirmwareDialog.cpp:199 msgid "Flashing failed" msgstr "Nahrávání selhalo" -#: src/slic3r/GUI/FirmwareDialog.cpp:274 +#: src/slic3r/GUI/FirmwareDialog.cpp:283 msgid "Flashing failed. Please see the avrdude log below." msgstr "Nahrání selhalo. Projděte si prosím avrdude log níže." -#: src/slic3r/GUI/FirmwareDialog.cpp:148 +#: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flashing in progress. Please do not disconnect the printer!" msgstr "Probíhá nahrávání firmware. Prosím neodpojujte tiskárnu!" -#: src/slic3r/GUI/FirmwareDialog.cpp:273 +#: src/slic3r/GUI/FirmwareDialog.cpp:282 msgid "Flashing succeeded!" msgstr "Nahrávání bylo úspěšné!" -#: src/slic3r/GUI/Tab.cpp:1156 +#: src/slic3r/GUI/Tab.cpp:1548 msgid "Flow" msgstr "Průtok" +#: 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:188 +#: 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:435 src/slic3r/GUI/Plater.cpp:528 +#: 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:3345 -msgid "for the left button: \tindicates a non-system (or non-default) preset,\nfor the right button: \tindicates 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/Tab.cpp:3702 +msgid "" +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." +msgstr "" +"na levé straně: indikuje nesystémové (jiné než výchozí) přednastavení,\n" +"na pravé straně: indikuje, že nastavení nebylo změněno." -#: src/libslic3r/Print.cpp:1302 +#: 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 "" +"U čistící věže pokud pracujte s rozpustnými materiály, je třeba\n" +"synchronizovat vrstvy podpěr s vrstvami objektů." + +#: 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\nsynchronizovat vrstvy podpěr s vrstvami objektů." +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/libslic3r/PrintConfig.cpp:1660 +#: src/libslic3r/PrintConfig.cpp:3028 +msgid "Force pad around object everywhere" +msgstr "Vynutit podložku všude okolo objektů" + +#: 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:1023 +#: 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." -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 msgid "From" msgstr "Předchozí extruder" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1853 +#: 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:525 +#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284 msgid "Front" msgstr "Zepředu" -#: src/slic3r/GUI/MainFrame.cpp:525 +#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284 msgid "Front View" msgstr "Pohled zepředu" -#: src/slic3r/GUI/MainFrame.cpp:677 +#: src/slic3r/GUI/Tab.cpp:1331 +msgid "full profile name" +msgstr "celé jméno profilu" + +#: src/slic3r/GUI/MainFrame.cpp:1527 msgid "G-code" msgstr "G-code" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:87 +#: src/slic3r/GUI/DoubleSlider.cpp:1146 +msgid "" +"G-code associated to this tick mark is in a conflict with print mode.\n" +"Editing it will cause changes of Slider data." +msgstr "" +"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/BackgroundSlicingProcess.cpp:165 msgid "G-code file exported to %1%" msgstr "G-code byl exportován do %1%" -#: src/libslic3r/PrintConfig.cpp:888 +#: src/libslic3r/PrintConfig.cpp:980 msgid "G-code flavor" msgstr "Druh G-code" -#: src/libslic3r/PrintConfig.cpp:689 +#: 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:3552 +msgid "G-code viewer" +msgstr "Prohlížeč G-codu" + +#: src/libslic3r/PrintConfig.cpp:757 msgid "g/cm³" msgstr "g/cm³" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/PrintConfig.cpp:870 -#: src/libslic3r/GCode/PreviewData.cpp:170 +#: src/libslic3r/PrintConfig.cpp:2648 +msgid "g/ml" +msgstr "g/ml" + +#: 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:19 src/slic3r/GUI/Tab.cpp:1812 -#: src/slic3r/GUI/Tab.cpp:2013 +#: 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:1242 +#: 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." -#: src/libslic3r/PrintConfig.cpp:1779 +#: src/libslic3r/PrintConfig.cpp:2007 msgid "Generate support material" msgstr "Generovat podpěry" -#: src/libslic3r/PrintConfig.cpp:1840 +#: 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:2362 +#: src/libslic3r/PrintConfig.cpp:2756 msgid "Generate supports" msgstr "Generovat podpěry" -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2758 msgid "Generate supports for the models" msgstr "Generovat podpěry modelů" -#: src/libslic3r/Print.cpp:1492 +#: 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:1524 +#: src/libslic3r/Print.cpp:1680 msgid "Generating G-code" msgstr "Generování G-code" -#: src/libslic3r/SLAPrint.cpp:58 +#: 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:141 +#: src/libslic3r/PrintObject.cpp:158 msgid "Generating perimeters" msgstr "Generování perimetrů" -#: src/libslic3r/Print.cpp:1484 +#: src/libslic3r/Print.cpp:1636 msgid "Generating skirt" msgstr "Generování obrysových smyček" -#: src/libslic3r/PrintObject.cpp:391 +#: src/libslic3r/PrintObject.cpp:422 msgid "Generating support material" msgstr "Generování podpěr" -#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:809 +#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359 msgid "Generating support points" msgstr "Generování podpěrných bodů" -#: src/libslic3r/SLAPrint.cpp:57 +#: src/libslic3r/SLAPrintSteps.cpp:48 msgid "Generating support tree" msgstr "Generování podpěr typu strom" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 +#: 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:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 msgid "Gizmo cut" msgstr "Gizmo řez" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 msgid "Gizmo move" msgstr "Gizmo posuv" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: 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:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 msgid "Gizmo rotate" msgstr "Gizmo rotace" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: 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:146 +#: 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:172 msgid "Gizmo SLA support points" msgstr "Gizmo SLA podpěrné body" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:641 +#: 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:569 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:639 msgid "Gizmo-Place on Face" msgstr "Gizmo-Umístit plochou na podložku" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:651 +#: 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:646 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521 msgid "Gizmo-Scale" msgstr "Gizmo-Měřítko" -#: src/slic3r/GUI/AboutDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 +msgid "Gizmos" +msgstr "Gizma" + +#: 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:571 +#: 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:797 +#: src/libslic3r/PrintConfig.cpp:882 msgid "Grid" msgstr "Mřížka" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1846 +#: 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/libslic3r/PrintConfig.cpp:805 +#: src/slic3r/GUI/Preferences.cpp:200 +msgid "GUI" +msgstr "GUI" + +#: src/libslic3r/PrintConfig.cpp:890 msgid "Gyroid" msgstr "Gyroid" -#: src/slic3r/GUI/Tab.cpp:2775 -msgid "has the following unsaved changes:" -msgstr "má neuložené následující změny:" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:840 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 msgid "Head diameter" msgstr "Průměr hrotu" -#: src/libslic3r/PrintConfig.cpp:822 +#: 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: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:213 src/libslic3r/PrintConfig.cpp:468 +#: src/slic3r/GUI/GUI_Preview.cpp:276 src/libslic3r/PrintConfig.cpp:536 msgid "Height" msgstr "Výška" -#: src/libslic3r/GCode/PreviewData.cpp:396 +#: src/slic3r/GUI/GCodeViewer.cpp:2236 src/libslic3r/GCode/PreviewData.cpp:352 msgid "Height (mm)" msgstr "Výška (mm)" -#: src/libslic3r/PrintConfig.cpp:1618 +#: 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:2209 +#: src/libslic3r/PrintConfig.cpp:2503 msgid "Height of the display" msgstr "Výška displeje" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1350 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1631 msgid "Height range Modifier" msgstr "Modifikátor Výškového rozsahu" -#: src/slic3r/GUI/GLCanvas3D.cpp:3650 src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2899 msgid "Height ranges" msgstr "Výškové rozsahy" -#: src/libslic3r/PrintConfig.cpp:226 +#: 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:300 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:451 +#, 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 "Zdravím, vítejte v %s! Tento %s vám pomůže se základní konfigurací; jen několik nastavení a budete připraveni k tisku." +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:2976 +#: src/libslic3r/PrintConfig.cpp:3564 msgid "Help" msgstr "Nápověda" -#: src/libslic3r/PrintConfig.cpp:2982 +#: src/libslic3r/PrintConfig.cpp:3570 msgid "Help (FFF options)" msgstr "Nápověda (pro FFF)" -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3575 msgid "Help (SLA options)" msgstr "Nápověda (pro SLA)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." msgstr "Zde můžete upravit požadovaný objem čištění (mm³) pro kteroukoliv dvojici extruderů." -#: src/libslic3r/PrintConfig.cpp:925 +#: 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/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:806 +#: 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:463 src/libslic3r/PrintConfig.cpp:891 msgid "Hilbert Curve" msgstr "Hilbertova křivka" -#: src/slic3r/GUI/Plater.cpp:873 +#: src/slic3r/GUI/Plater.cpp:916 msgid "Hold Shift to Slice & Export G-code" msgstr "Stiskni Shift pro Slicování & Export G-codu" -#: src/libslic3r/PrintConfig.cpp:803 src/libslic3r/PrintConfig.cpp:1924 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +msgid "Hole depth" +msgstr "Hloubka otvoru" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +msgid "Hole diameter" +msgstr "Průměr otvoru" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785 +msgid "Hollow and drill" +msgstr "Vydutit a vyvrtat" + +#: 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:40 +msgid "Hollow this object" +msgstr "Vydutit tento objekt" + +#: 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/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:44 +msgid "Hollowing model" +msgstr "Vydutění modelu" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624 +msgid "Hollowing parameter change" +msgstr "Změna parametru dutiny" + +#: src/libslic3r/PrintConfig.cpp:888 src/libslic3r/PrintConfig.cpp:2153 msgid "Honeycomb" msgstr "Plástev" -#: src/slic3r/GUI/Tab.cpp:1013 +#: src/slic3r/GUI/Tab.cpp:1386 msgid "Horizontal shells" msgstr "Vodorovné stěny" -#: src/libslic3r/PrintConfig.cpp:209 +#: 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." -#: src/slic3r/GUI/PrintHostDialogs.cpp:151 +#: src/slic3r/GUI/PrintHostDialogs.cpp:150 msgid "Host" msgstr "Server" -#: src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1440 msgid "Host Type" msgstr "Typ tiskového serveru" @@ -2773,82 +3874,138 @@ msgstr "Typ tiskového serveru" msgid "Hostname" msgstr "Název serveru" -#: src/libslic3r/PrintConfig.cpp:81 +#: src/libslic3r/PrintConfig.cpp:99 msgid "Hostname, IP or URL" msgstr "Název serveru, IP nebo URL" -#: src/slic3r/GUI/Tab.cpp:136 -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/slic3r/GUI/Tab.cpp:210 +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/libslic3r/PrintConfig.cpp:2734 +#: 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: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:2380 +#: 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:2642 +#: 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:95 +#: 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/slic3r/GUI/PhysicalPrinterDialog.cpp:358 +#: src/libslic3r/PrintConfig.cpp:113 msgid "HTTPS CA File" msgstr "Soubor HTTPS CA" -#: src/slic3r/GUI/Tab.cpp:1731 +#: 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/Tab.cpp:1773 -#, possible-c-format -msgid "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." -msgstr "Soubor HTTPS CA:\nV tomto systému používá %s certifikáty HTTPS ze systému Certificate Store nebo Keychain. Chcete-li použít vlastní soubor CA, importujte soubor CA do Certificate Store / Keychain." - -#: src/slic3r/GUI/Preferences.cpp:192 +#: 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:148 +#: src/slic3r/GUI/PrintHostDialogs.cpp:147 msgid "ID" msgstr "ID" -#: src/libslic3r/PrintConfig.cpp:1787 +#: 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:413 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:1132 +#, 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:423 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:1142 +#, 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:1774 +#: 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/Preferences.cpp:63 +#: src/slic3r/GUI/ConfigWizard.cpp:1164 +msgid "" +"If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\n" +"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/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: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:71 +#: 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: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:105 +#: 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/slic3r/GUI/Preferences.cpp:112 -msgid "If enabled, use perspective camera. If not enabled, use orthographic camera." -msgstr "Pokud je zaškrtnuto, použijte perspektivní kameru. Pokud není, použijte ortografickou kameru." +#: 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/slic3r/GUI/Preferences.cpp:119 +#: 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/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: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: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: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: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ů." @@ -2856,79 +4013,108 @@ msgstr "Pokud je zaškrtnuto, můžete nastavit velikost ikon na panelu nástro 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/libslic3r/PrintConfig.cpp:853 +#: 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: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:540 +#: 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:1636 +#: 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:534 +#: 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:46 +#: 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:54 +#: 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:38 +#: 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:1492 +#: 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:1501 +#: 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:1510 +#: 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:1384 +#: 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:498 +#: 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:2068 +#: 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:3096 +#: src/libslic3r/PrintConfig.cpp:3684 msgid "Ignore non-existent config files" msgstr "Ignorovat neexistující konfigurační soubory" -#: src/slic3r/GUI/MainFrame.cpp:352 +#: 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:357 +#: src/slic3r/GUI/MainFrame.cpp:1062 msgid "Import Config &Bundle" msgstr "Importovat Konfigurační &Balík" -#: src/slic3r/GUI/MainFrame.cpp:354 +#: src/slic3r/GUI/MainFrame.cpp:1058 msgid "Import Config from &project" msgstr "Načíst konfiguraci z &projektu" -#: src/slic3r/GUI/Plater.cpp:4016 +#: 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/Jobs/SLAImportJob.cpp:39 +msgid "Import file: " +msgstr "Importovat soubor:" + +#: 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:4020 +#: src/slic3r/GUI/Plater.cpp:4659 msgid "Import Objects" msgstr "Importovat Objekty" @@ -2936,439 +4122,607 @@ msgstr "Importovat Objekty" msgid "Import of the repaired 3mf file failed" msgstr "Import opraveného 3MF souboru selhal" -#: src/slic3r/GUI/MainFrame.cpp:349 +#: 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:106 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "Nahrát soubor STL/OBJ/AMF/3MF bez konfigurace (zachová stávající tiskovou plochu)" +#: 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:2416 -#, possible-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 +#, 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/UpdateDialogs.cpp:132 +#: src/slic3r/GUI/UpdateDialogs.cpp:230 msgid "Incompatible bundles:" msgstr "Nekompatibilní balíky:" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 -#, possible-c-format +#: src/slic3r/GUI/PresetComboBoxes.cpp:241 +msgid "Incompatible presets" +msgstr "Nekompatibilní předvolby" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#, c-format msgid "Incompatible with this %s" msgstr "Nekompatibilní s tímto %s" -#: src/slic3r/GUI/Plater.cpp:4091 +#: src/slic3r/GUI/Plater.cpp:4790 msgid "Increase Instances" msgstr "Přidání Instancí" +#: src/slic3r/GUI/GLCanvas3D.cpp:251 +msgid "Increase/decrease edit area" +msgstr "Zvětšit / zmenšit oblast úprav" + #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3338 -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." +#: src/slic3r/GUI/Tab.cpp:3695 +msgid "" +"indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n" +"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." #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3334 +#: 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:3083 -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í. 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/Tab.cpp:3707 +msgid "" +"indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n" +"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/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:69 -#: src/slic3r/GUI/GUI_ObjectList.cpp:510 src/slic3r/GUI/Plater.cpp:439 -#: src/slic3r/GUI/Tab.cpp:1030 src/slic3r/GUI/Tab.cpp:1031 -#: src/slic3r/GUI/Tab.cpp:1360 src/libslic3r/PrintConfig.cpp:167 -#: src/libslic3r/PrintConfig.cpp:389 src/libslic3r/PrintConfig.cpp:729 -#: src/libslic3r/PrintConfig.cpp:743 src/libslic3r/PrintConfig.cpp:780 -#: src/libslic3r/PrintConfig.cpp:933 src/libslic3r/PrintConfig.cpp:943 -#: src/libslic3r/PrintConfig.cpp:961 src/libslic3r/PrintConfig.cpp:979 -#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1659 -#: src/libslic3r/PrintConfig.cpp:1676 +#: 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:171 +#: src/slic3r/GUI/PresetHints.cpp:173 msgid "infill" msgstr "výplň" -#: src/libslic3r/PrintConfig.cpp:972 +#: src/libslic3r/PrintConfig.cpp:1065 msgid "Infill before perimeters" msgstr "Tisknout výplň před tiskem perimetrů" -#: src/libslic3r/PrintConfig.cpp:953 +#: src/libslic3r/PrintConfig.cpp:1045 msgid "Infill extruder" msgstr "Extruder pro výplň" -#: src/libslic3r/PrintConfig.cpp:987 +#: src/libslic3r/PrintConfig.cpp:1080 msgid "Infill/perimeters overlap" msgstr "Přesah pro výplň/perimetry" -#: src/libslic3r/Print.cpp:1476 +#: src/libslic3r/Print.cpp:1610 msgid "Infilling layers" msgstr "Generování výplně vrstev" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:118 +#: 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:1008 +#: src/slic3r/GUI/GUI_App.cpp:1087 src/slic3r/GUI/Tab.cpp:3435 +msgid "Information" +msgstr "Informace" + +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:547 +msgid "Infornation" +msgstr "Informace" + +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Inherits profile" msgstr "Zdědí profil" -#: src/libslic3r/SLAPrint.cpp:707 +#: 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:2317 src/libslic3r/PrintConfig.cpp:2318 +#: 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:2295 src/libslic3r/PrintConfig.cpp:2296 +#: src/libslic3r/PrintConfig.cpp:2625 src/libslic3r/PrintConfig.cpp:2626 msgid "Initial layer height" msgstr "Výška první vrstvy" -#: src/slic3r/GUI/Field.cpp:155 +#: 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:661 +#: src/slic3r/GUI/GUI_App.cpp:1480 msgid "Inspect / activate configuration snapshots" msgstr "Zkontrolovat / aktivovat zálohy konfigurace" -#: src/slic3r/GUI/wxExtensions.cpp:407 src/slic3r/GUI/wxExtensions.cpp:474 -#, possible-c-format +#: src/slic3r/GUI/ObjectDataViewModel.cpp:62 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:218 +#, c-format msgid "Instance %d" msgstr "Instance %d" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1887 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2892 msgid "Instance manipulation" msgstr "Manipulace s instancí objektu" -#: src/slic3r/GUI/wxExtensions.cpp:358 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:58 msgid "Instances" msgstr "Instance" -#: src/slic3r/GUI/GUI_ObjectList.cpp:934 src/slic3r/GUI/GUI_ObjectList.cpp:3346 +#: 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:1886 +#: src/libslic3r/PrintConfig.cpp:2115 msgid "Interface layers" msgstr "Kontaktní vrstvy" -#: src/libslic3r/PrintConfig.cpp:1870 +#: src/libslic3r/PrintConfig.cpp:2099 msgid "Interface loops" msgstr "Kontaktní smyčky" -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:2124 msgid "Interface pattern spacing" msgstr "Rozteč kontaktních vrstev" -#: src/libslic3r/PrintConfig.cpp:1022 +#: src/libslic3r/PrintConfig.cpp:1115 msgid "Interface shells" msgstr "Mezilehlé stěny" -#: src/libslic3r/Zipper.cpp:87 +#: src/libslic3r/miniz_extension.cpp:143 msgid "internal error" msgstr "interní chyba" -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/GCode/PreviewData.cpp:166 +#: 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:2397 +#: 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:471 src/slic3r/GUI/BedShapeDialog.cpp:520 -#: src/slic3r/GUI/BedShapeDialog.cpp:543 +#: 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:83 +#: src/libslic3r/miniz_extension.cpp:139 msgid "invalid filename" msgstr "neplatný název souboru" -#: src/libslic3r/Zipper.cpp:51 +#: src/slic3r/GUI/ConfigManipulation.cpp:324 +msgid "Invalid Head penetration" +msgstr "Neplatný průnik podpěry do modelu" + +#: 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:150 src/slic3r/GUI/Field.cpp:173 +#: 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:81 +#: src/libslic3r/miniz_extension.cpp:137 msgid "invalid parameter" msgstr "neplatný parametr" +#: 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:94 +#: 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:2779 -msgid "is not compatible with print profile" -msgstr "není kompatibilní s tiskovým profilem" - -#: src/slic3r/GUI/Tab.cpp:2778 -msgid "is not compatible with printer" -msgstr "není kompatibilní s tiskárnou" - -#: src/slic3r/GUI/MainFrame.cpp:519 +#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275 msgid "Iso" msgstr "Izometrické" -#: src/slic3r/GUI/MainFrame.cpp:519 +#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275 msgid "Iso View" msgstr "Izometrické zobrazení" -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:1282 msgid "It can't be deleted or modified." msgstr "Nelze smazat nebo upravit." -#: src/libslic3r/PrintConfig.cpp:926 +#: 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: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.cpp:142 src/slic3r/GUI/Tab.cpp:2796 +#: 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:2177 +#: 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:1579 +#: src/libslic3r/PrintConfig.cpp:1757 msgid "Jitter" msgstr "Rozkmit (Jitter)" -#: src/libslic3r/PrintConfig.cpp:533 +#: 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:1075 +#, 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: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:194 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171 msgid "Keep lower part" msgstr "Zachovat spodní část" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:193 +#: src/slic3r/GUI/GLCanvas3D.cpp:290 +msgid "Keep min" +msgstr "Zachovat minima" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 msgid "Keep upper part" msgstr "Zachovat horní část" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:566 +#: 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/libslic3r/PrintConfig.cpp:917 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:259 +msgid "Keyboard shortcuts" +msgstr "Klávesové zkratky" + +#: src/libslic3r/PrintConfig.cpp:2641 +msgid "kg" +msgstr "kg" + +#: src/libslic3r/PrintConfig.cpp:1009 msgid "Label objects" msgstr "Označování objektů" -#: src/libslic3r/PrintConfig.cpp:2234 +#: src/libslic3r/PrintConfig.cpp:2542 msgid "Landscape" msgstr "Orientace na šířku" -#: src/slic3r/GUI/GUI_App.cpp:524 +#: src/slic3r/GUI/GUI_App.cpp:1295 msgid "Language" msgstr "Jazyk" -#: src/slic3r/GUI/GUI_App.cpp:755 +#: 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:1770 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: 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:2994 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3881 msgid "Layer" msgstr "Vrstva" -#: src/slic3r/GUI/Tab.cpp:998 src/libslic3r/PrintConfig.cpp:55 +#: 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:1332 +#: 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:2260 +#: src/slic3r/GUI/Tab.cpp:2531 msgid "Layer height limits" msgstr "Výškové limity vrstvy" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2109 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2880 msgid "Layer range Settings to modify" msgstr "Nastavení pro vrstvy v rozsahu" -#: src/libslic3r/PrintConfig.cpp:326 src/libslic3r/PrintConfig.cpp:946 -#: src/libslic3r/PrintConfig.cpp:1435 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1844 -#: src/libslic3r/PrintConfig.cpp:1889 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52 +#: 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/Tab.cpp:3302 src/slic3r/GUI/Tab.cpp:3393 +#: 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:997 src/slic3r/GUI/Tab.cpp:3391 +#: 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:28 src/slic3r/GUI/GUI_ObjectList.cpp:68 -#: src/slic3r/GUI/GUI_ObjectList.cpp:509 src/libslic3r/PrintConfig.cpp:56 -#: src/libslic3r/PrintConfig.cpp:150 src/libslic3r/PrintConfig.cpp:381 -#: src/libslic3r/PrintConfig.cpp:438 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1026 -#: src/libslic3r/PrintConfig.cpp:1305 src/libslic3r/PrintConfig.cpp:1371 -#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1987 -#: src/libslic3r/PrintConfig.cpp:2044 +#: 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/GLCanvas3D.cpp:526 -msgid "Layers heights" -msgstr "Výšky vrstev" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 -msgid "Layers Slider Shortcuts" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:225 +msgid "Layers Slider" msgstr "Posuvníky" -#. TRN To be shown in Print Settings "Bottom solid layers" -#: rc/libslic3r/PrintConfig.cpp:149 +#: src/slic3r/GUI/OptionsGroup.cpp:293 msgctxt "Layers" msgid "Bottom" msgstr "Spodních" -#. TRN To be shown in Print Settings "Top solid layers" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/slic3r/GUI/OptionsGroup.cpp:293 msgctxt "Layers" msgid "Top" msgstr "Vrchních" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/Preferences.cpp:440 +msgid "Layout Options" +msgstr "Možnosti rozložení" + +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:233 +msgid "Least supports" +msgstr "Nejméně podpěr" + +#: 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:1231 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1234 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1235 +#: 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/MainFrame.cpp:527 +#: 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:968 src/slic3r/GUI/MainFrame.cpp:1288 msgid "Left View" msgstr "Pohled zleva" -#: src/slic3r/GUI/GUI_Preview.cpp:255 +#: src/slic3r/GUI/GUI_Preview.cpp:339 msgid "Legend" msgstr "Legenda" -#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1481 +#: src/slic3r/GUI/GUI_Preview.cpp:1480 +msgid "Legend/Estimated printing time" +msgstr "Legenda / Odhadovaný čas tisku" + +#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1659 msgid "Length" msgstr "Vzdálenost" -#: src/libslic3r/PrintConfig.cpp:293 +#: 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." #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:124 +#: 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:1491 +#: src/libslic3r/PrintConfig.cpp:1669 msgid "Lift Z" msgstr "Zvednout Z" -#: src/libslic3r/PrintConfig.cpp:801 +#: src/libslic3r/PrintConfig.cpp:886 msgid "Line" msgstr "Čára" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1050 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1558 msgid "Load" msgstr "Načíst" -#: src/slic3r/GUI/MainFrame.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:1042 msgid "Load a model" msgstr "Načíst model" -#: src/libslic3r/PrintConfig.cpp:3116 +#: 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:3100 +#: src/libslic3r/PrintConfig.cpp:3688 msgid "Load config file" msgstr "Načíst konfigurační soubor" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 -msgid "Load Config from .ini/amf/3mf/gcode" -msgstr "Načíst konfiguraci z .ini/amf/3mf/gcode" +#: 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/KBShortcutsDialog.cpp:110 -msgid "Load Config from .ini/amf/3mf/gcode and merge" -msgstr "Načíst konfiguraci z .ini/amf/3mf/gcode a sloučit" - -#: src/slic3r/GUI/MainFrame.cpp:354 +#: src/slic3r/GUI/MainFrame.cpp:1058 msgid "Load configuration from project file" msgstr "Načíst konfiguraci z projektu" -#: src/libslic3r/PrintConfig.cpp:3101 +#: 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:352 +#: src/slic3r/GUI/MainFrame.cpp:1055 msgid "Load exported configuration file" msgstr "Načíst exportovaný konfigurační soubor" -#: src/slic3r/GUI/Plater.cpp:1271 +#: src/slic3r/GUI/Plater.cpp:1436 msgid "Load File" msgstr "Načtení souboru" -#: src/slic3r/GUI/Plater.cpp:1275 +#: src/slic3r/GUI/Plater.cpp:1440 msgid "Load Files" msgstr "Naštení souborů" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1585 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2038 msgid "Load Part" msgstr "Přidání části" -#: src/slic3r/GUI/MainFrame.cpp:357 +#: 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:3992 +#: src/slic3r/GUI/Plater.cpp:4627 msgid "Load Project" msgstr "Načíst Projekt" -#: src/slic3r/GUI/BedShapeDialog.cpp:97 +#: src/slic3r/GUI/BedShapeDialog.cpp:243 msgid "Load shape from STL..." msgstr "Načíst tvar ze souboru STL…" -#: src/slic3r/GUI/BedShapeDialog.cpp:181 src/slic3r/GUI/BedShapeDialog.cpp:249 +#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405 msgid "Load..." msgstr "Načíst..." -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" msgstr "zaváděn" -#: src/slic3r/GUI/Plater.cpp:1782 +#: src/slic3r/GUI/Plater.cpp:2388 msgid "Loaded" msgstr "Načteno" -#: src/slic3r/GUI/Plater.cpp:1590 +#: src/slic3r/GUI/Plater.cpp:2216 msgid "Loading" msgstr "Načítání" -#: src/slic3r/GUI/GUI_App.cpp:407 +#: src/slic3r/GUI/GUI_App.cpp:759 +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:399 +#: src/slic3r/GUI/GUI_App.cpp:1120 msgid "Loading of current presets" msgstr "Načítání aktuálních předvoleb" @@ -3377,277 +4731,315 @@ msgstr "Načítání aktuálních předvoleb" msgid "Loading repaired model" msgstr "Načítaní opraveného modelu" -#: src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:643 msgid "Loading speed" msgstr "Rychlost zavádění" -#: src/libslic3r/PrintConfig.cpp:583 +#: 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:41 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: 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:851 +#: 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:3065 +#: src/slic3r/GUI/Tab.cpp:3689 msgid "LOCKED LOCK" msgstr "ZAMČENÝ ZÁMEK" -#: src/slic3r/GUI/Tab.cpp:3360 +#: 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:3376 +#: 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:3119 +#: src/libslic3r/PrintConfig.cpp:3713 msgid "Logging level" msgstr "Úroveň logování" -#: src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:1810 msgid "Loops (minimum)" msgstr "Smyček (minimálně)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 msgid "Lower Layer" msgstr "Nižší vrstva" -#: src/slic3r/GUI/Tab.cpp:2136 src/slic3r/GUI/Tab.cpp:2209 -#: src/libslic3r/PrintConfig.cpp:1077 src/libslic3r/PrintConfig.cpp:1087 -#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1110 -#: src/libslic3r/PrintConfig.cpp:1121 src/libslic3r/PrintConfig.cpp:1132 -#: src/libslic3r/PrintConfig.cpp:1143 +#: 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/KBShortcutsDialog.cpp:129 -msgid "Main Shortcuts" -msgstr "Hlavní" +#: 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/Plater.cpp:143 +#: 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:908 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 msgid "Manual editing" msgstr "Manuální úprava" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:105 +#: 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:604 +#: 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:3300 +#: src/slic3r/GUI/Tab.cpp:3894 src/slic3r/GUI/Tab.cpp:3896 msgid "Material" msgstr "Materiál" -#: src/slic3r/GUI/Tab.hpp:391 +#: src/slic3r/GUI/Tab.hpp:486 msgid "Material Settings" msgstr "Nastavení materiálu" -#: src/slic3r/GUI/Plater.cpp:140 +#: 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:1152 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:1325 src/libslic3r/PrintConfig.cpp:1334 msgid "Max" msgstr "Maximum" -#: src/libslic3r/PrintConfig.cpp:2470 +#: src/libslic3r/PrintConfig.cpp:2898 msgid "Max bridge length" msgstr "Maximální délka mostu" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2812 +msgid "Max bridges on a pillar" +msgstr "Max počet mostů na sloupu" + +#: src/libslic3r/PrintConfig.cpp:2986 msgid "Max merge distance" msgstr "Maximální vzdálenost pro sloučení" -#: src/libslic3r/PrintConfig.cpp:2479 +#: src/libslic3r/PrintConfig.cpp:2907 msgid "Max pillar linking distance" msgstr "Max. vzdálenost propojení podpěr" -#: src/libslic3r/PrintConfig.cpp:64 +#: src/libslic3r/PrintConfig.cpp:80 msgid "Max print height" msgstr "Maximální výška tisku" -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/libslic3r/PrintConfig.cpp:1345 msgid "Max print speed" msgstr "Maximální rychlost tisku" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 -msgid "max slic3r version" -msgstr "max verze slic3ru" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +msgid "max PrusaSlicer version" +msgstr "max PrusaSlicer verze" -#: src/libslic3r/PrintConfig.cpp:1203 +#: src/libslic3r/PrintConfig.cpp:1376 msgid "Max volumetric slope negative" msgstr "Maximální negativní objemový sklon" -#: src/libslic3r/PrintConfig.cpp:1192 +#: src/libslic3r/PrintConfig.cpp:1365 msgid "Max volumetric slope positive" msgstr "Maximální pozitivní objemový sklon" -#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:633 src/libslic3r/PrintConfig.cpp:1355 msgid "Max volumetric speed" msgstr "Maximální objemová rychlost" -#: src/libslic3r/PrintConfig.cpp:2167 +#: src/libslic3r/PrintConfig.cpp:2411 msgid "Maximal bridging distance" msgstr "Maximální vzdálenost přemostění" -#: src/libslic3r/PrintConfig.cpp:2193 +#: 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:1099 +#: src/libslic3r/PrintConfig.cpp:1253 msgid "Maximum acceleration E" msgstr "Maximální zrychlení E" -#: src/libslic3r/PrintConfig.cpp:1105 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "Maximum acceleration of the E axis" msgstr "Maximální zrychlení osy E" -#: src/libslic3r/PrintConfig.cpp:1102 +#: src/libslic3r/PrintConfig.cpp:1256 msgid "Maximum acceleration of the X axis" msgstr "Maximální zrychlení osy X" -#: src/libslic3r/PrintConfig.cpp:1103 +#: src/libslic3r/PrintConfig.cpp:1257 msgid "Maximum acceleration of the Y axis" msgstr "Maximální zrychlení osy Y" -#: src/libslic3r/PrintConfig.cpp:1104 +#: src/libslic3r/PrintConfig.cpp:1258 msgid "Maximum acceleration of the Z axis" msgstr "Maximální zrychlení osy Z" -#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133 +#: src/libslic3r/PrintConfig.cpp:1306 msgid "Maximum acceleration when extruding" msgstr "Maximální zrychlení při extruzi" -#: src/libslic3r/PrintConfig.cpp:1158 +#: 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:1142 src/libslic3r/PrintConfig.cpp:1144 +#: src/libslic3r/PrintConfig.cpp:1316 msgid "Maximum acceleration when retracting" msgstr "Maximální zrychlení při retrakci" -#: src/libslic3r/PrintConfig.cpp:1169 +#: 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:1096 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "Maximum acceleration X" msgstr "Maximální zrychlení X" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1251 msgid "Maximum acceleration Y" msgstr "Maximální zrychlení Y" -#: src/libslic3r/PrintConfig.cpp:1098 +#: src/libslic3r/PrintConfig.cpp:1252 msgid "Maximum acceleration Z" msgstr "Maximální zrychlení Z" -#: src/slic3r/GUI/Tab.cpp:2170 +#: src/slic3r/GUI/Tab.cpp:2391 msgid "Maximum accelerations" msgstr "Maximální zrychlení" -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2677 msgid "Maximum exposure time" msgstr "Maximální doba osvitu" -#: src/libslic3r/PrintConfig.cpp:1081 +#: src/libslic3r/PrintConfig.cpp:1236 msgid "Maximum feedrate E" msgstr "Maximální rychlost posuvu E" -#: src/libslic3r/PrintConfig.cpp:1087 +#: src/libslic3r/PrintConfig.cpp:1242 msgid "Maximum feedrate of the E axis" msgstr "Maximální rychlost posuvu osy E" -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1239 msgid "Maximum feedrate of the X axis" msgstr "Maximální rychlost posuvu osy X" -#: src/libslic3r/PrintConfig.cpp:1085 +#: src/libslic3r/PrintConfig.cpp:1240 msgid "Maximum feedrate of the Y axis" msgstr "Maximální rychlost posuvu osy Y" -#: src/libslic3r/PrintConfig.cpp:1086 +#: src/libslic3r/PrintConfig.cpp:1241 msgid "Maximum feedrate of the Z axis" msgstr "Maximální rychlost posuvu osy Z" -#: src/libslic3r/PrintConfig.cpp:1078 +#: src/libslic3r/PrintConfig.cpp:1233 msgid "Maximum feedrate X" msgstr "Maximální rychlost posuvu X" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1234 msgid "Maximum feedrate Y" msgstr "Maximální rychlost posuvu Y" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1235 msgid "Maximum feedrate Z" msgstr "Maximální rychlost posuvu Z" -#: src/slic3r/GUI/Tab.cpp:2165 +#: src/slic3r/GUI/Tab.cpp:2386 msgid "Maximum feedrates" msgstr "Maximální rychlosti posuvu" -#: src/libslic3r/PrintConfig.cpp:2447 src/libslic3r/PrintConfig.cpp:2448 +#: 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:1117 +#: src/libslic3r/PrintConfig.cpp:1270 msgid "Maximum jerk E" msgstr "Maximální ryv E" -#: src/libslic3r/PrintConfig.cpp:1123 +#: src/libslic3r/PrintConfig.cpp:1276 msgid "Maximum jerk of the E axis" msgstr "Maximální ryv (jerk) osy E" -#: src/libslic3r/PrintConfig.cpp:1120 +#: src/libslic3r/PrintConfig.cpp:1273 msgid "Maximum jerk of the X axis" msgstr "Maximální ryv (jerk) osy X" -#: src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1274 msgid "Maximum jerk of the Y axis" msgstr "Maximální ryv (jerk) osy Y" -#: src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1275 msgid "Maximum jerk of the Z axis" msgstr "Maximální ryv (jerk) osy Z" -#: src/libslic3r/PrintConfig.cpp:1114 +#: src/libslic3r/PrintConfig.cpp:1267 msgid "Maximum jerk X" msgstr "Maximální ryv X" -#: src/libslic3r/PrintConfig.cpp:1115 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "Maximum jerk Y" msgstr "Maximální ryv Y" -#: src/libslic3r/PrintConfig.cpp:1116 +#: src/libslic3r/PrintConfig.cpp:1269 msgid "Maximum jerk Z" msgstr "Maximální ryv Z" -#: src/libslic3r/PrintConfig.cpp:566 +#: 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: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:3053 +#: 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:2432 +#: 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/SLAPrint.cpp:71 +#: src/libslic3r/SLAPrintSteps.cpp:65 msgid "Merging slices and calculating statistics" msgstr "Slučování tiskových vrstev a výpočet statistik" @@ -3655,207 +5047,261 @@ msgstr "Slučování tiskových vrstev a výpočet statistik" msgid "Mesh repair failed." msgstr "Oprava meshe selhala." -#: src/libslic3r/PrintConfig.cpp:3120 -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" -msgstr "Zprávy se závažností nižší nebo rovnou úrovni logování budou vypsány. 0: trace, 1: debug, 2: info, 3: warning, 4: error, 5: fatal" +#: 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:1215 src/libslic3r/PrintConfig.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:1388 src/libslic3r/PrintConfig.cpp:1397 msgid "Min" msgstr "Minimum" -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1406 msgid "Min print speed" msgstr "Minimální rychlost tisku" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 -msgid "min slic3r version" -msgstr "min verze slic3ru" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "min PrusaSlicer version" +msgstr "min PrusaSlicer verze" -#: src/libslic3r/PrintConfig.cpp:2507 +#: 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:1241 +#: src/libslic3r/PrintConfig.cpp:1414 msgid "Minimal filament extrusion length" msgstr "Minimální délka extruze filamentu" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:879 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 msgid "Minimal points distance" msgstr "Minimální vzdálenost bodů" -#: src/libslic3r/PrintConfig.cpp:635 +#: 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:1442 +#: src/libslic3r/PrintConfig.cpp:221 +msgid "Minimum bottom shell thickness" +msgstr "Minimální tloušťka spodní skořepiny" + +#: 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: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:2416 src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2669 msgid "Minimum exposure time" msgstr "Minimální doba osvitu" -#: src/libslic3r/PrintConfig.cpp:1109 src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1286 msgid "Minimum feedrate when extruding" msgstr "Minimální rychlosti posuvu během extruze" -#: src/libslic3r/PrintConfig.cpp:1136 +#: 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:2182 +#: src/slic3r/GUI/Tab.cpp:2403 msgid "Minimum feedrates" msgstr "Minimální rychlosti posuvu" -#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 +#: 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/libslic3r/PrintConfig.cpp:1452 +#: src/slic3r/GUI/Tab.cpp:1391 +msgid "Minimum shell thickness" +msgstr "Minimální tloušťka skořepiny" + +#: 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:2289 +msgid "Minimum top shell thickness" +msgstr "Minimální tloušťka vrchní skořepiny" + +#: 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:1630 msgid "Minimum travel after retraction" msgstr "Minimální dráha extruderu po retrakci" -#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1296 msgid "Minimum travel feedrate" msgstr "Minimální rychlost při přesunu" -#: src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1298 msgid "Minimum travel feedrate (M205 T)" msgstr "Minimální rychlost při přesunu (M205 T)" -#: src/slic3r/GUI/Plater.cpp:2946 +#: 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: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:3922 msgid "Mirror" msgstr "Zrcadlit" -#: src/libslic3r/PrintConfig.cpp:2320 +#: src/libslic3r/PrintConfig.cpp:2522 msgid "Mirror horizontally" msgstr "Zrcadlit horizontálně" -#: src/slic3r/GUI/GLCanvas3D.cpp:1711 +#: src/slic3r/GUI/GLCanvas3D.cpp:2226 msgid "Mirror Object" msgstr "Zrcadlit Objekt" -#: src/slic3r/GUI/Plater.cpp:2946 +#: src/slic3r/GUI/Plater.cpp:3922 msgid "Mirror the selected object" msgstr "Zrcadlit vybraný objekt" -#: src/slic3r/GUI/Plater.cpp:2939 +#: 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:2941 +#: 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:2943 +#: 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:2327 +#: src/libslic3r/PrintConfig.cpp:2529 msgid "Mirror vertically" msgstr "Zrcadlit vertikálně" -#: src/slic3r/Utils/OctoPrint.cpp:69 -#, possible-c-format +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68 +#, c-format msgid "Mismatched type of print host: %s" msgstr "Nesprávný typ tiskového serveru: % s" -#: src/libslic3r/GCode/PreviewData.cpp:176 +#: src/libslic3r/ExtrusionEntity.cpp:328 src/libslic3r/ExtrusionEntity.cpp:364 msgid "Mixed" msgstr "Smíšený" -#: src/slic3r/GUI/BedShapeDialog.cpp:87 src/slic3r/GUI/ConfigWizard.cpp:118 -#: src/slic3r/GUI/ConfigWizard.cpp:561 src/slic3r/GUI/ConfigWizard.cpp:575 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 -#: src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:84 -#: src/libslic3r/PrintConfig.cpp:59 src/libslic3r/PrintConfig.cpp:66 -#: src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:210 -#: src/libslic3r/PrintConfig.cpp:285 src/libslic3r/PrintConfig.cpp:293 -#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:353 -#: src/libslic3r/PrintConfig.cpp:473 src/libslic3r/PrintConfig.cpp:484 -#: src/libslic3r/PrintConfig.cpp:502 src/libslic3r/PrintConfig.cpp:680 -#: src/libslic3r/PrintConfig.cpp:1166 src/libslic3r/PrintConfig.cpp:1227 -#: src/libslic3r/PrintConfig.cpp:1245 src/libslic3r/PrintConfig.cpp:1263 -#: src/libslic3r/PrintConfig.cpp:1315 src/libslic3r/PrintConfig.cpp:1325 -#: src/libslic3r/PrintConfig.cpp:1446 src/libslic3r/PrintConfig.cpp:1454 -#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 -#: src/libslic3r/PrintConfig.cpp:1513 src/libslic3r/PrintConfig.cpp:1521 -#: src/libslic3r/PrintConfig.cpp:1529 src/libslic3r/PrintConfig.cpp:1612 -#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1898 -#: src/libslic3r/PrintConfig.cpp:1932 src/libslic3r/PrintConfig.cpp:2125 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2139 -#: src/libslic3r/PrintConfig.cpp:2169 src/libslic3r/PrintConfig.cpp:2179 -#: src/libslic3r/PrintConfig.cpp:2189 src/libslic3r/PrintConfig.cpp:2297 -#: src/libslic3r/PrintConfig.cpp:2372 src/libslic3r/PrintConfig.cpp:2381 -#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2400 -#: src/libslic3r/PrintConfig.cpp:2444 src/libslic3r/PrintConfig.cpp:2454 -#: src/libslic3r/PrintConfig.cpp:2473 src/libslic3r/PrintConfig.cpp:2483 -#: src/libslic3r/PrintConfig.cpp:2492 src/libslic3r/PrintConfig.cpp:2510 -#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2539 -#: src/libslic3r/PrintConfig.cpp:2552 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2634 +msgid "ml" +msgstr "ml" + +#: 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/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: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:1477 src/libslic3r/PrintConfig.cpp:1486 +#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1664 msgid "mm (zero to disable)" msgstr "mm (nula pro vypnutí)" -#: src/libslic3r/PrintConfig.cpp:847 src/libslic3r/PrintConfig.cpp:992 -#: src/libslic3r/PrintConfig.cpp:1797 +#: 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:201 src/libslic3r/PrintConfig.cpp:577 -#: src/libslic3r/PrintConfig.cpp:585 src/libslic3r/PrintConfig.cpp:594 -#: src/libslic3r/PrintConfig.cpp:602 src/libslic3r/PrintConfig.cpp:629 -#: src/libslic3r/PrintConfig.cpp:648 src/libslic3r/PrintConfig.cpp:874 -#: src/libslic3r/PrintConfig.cpp:1001 src/libslic3r/PrintConfig.cpp:1079 -#: src/libslic3r/PrintConfig.cpp:1099 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1123 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1363 -#: src/libslic3r/PrintConfig.cpp:1537 src/libslic3r/PrintConfig.cpp:1546 -#: src/libslic3r/PrintConfig.cpp:1941 src/libslic3r/PrintConfig.cpp:2053 +#: 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:430 src/libslic3r/PrintConfig.cpp:856 -#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1702 -#: src/libslic3r/PrintConfig.cpp:1908 src/libslic3r/PrintConfig.cpp:2035 +#: 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:160 src/libslic3r/PrintConfig.cpp:303 -#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:936 -#: src/libslic3r/PrintConfig.cpp:1089 src/libslic3r/PrintConfig.cpp:1134 -#: src/libslic3r/PrintConfig.cpp:1145 src/libslic3r/PrintConfig.cpp:1334 +#: 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:1661 +#: src/libslic3r/PrintConfig.cpp:1845 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:640 +#: src/libslic3r/PrintConfig.cpp:708 msgid "mm³" msgstr "mm³" -#: src/libslic3r/PrintConfig.cpp:569 src/libslic3r/PrintConfig.cpp:1185 +#: 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:1197 src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1370 src/libslic3r/PrintConfig.cpp:1381 msgid "mm³/s²" msgstr "mm³/s²" -#: src/slic3r/GUI/GUI_App.cpp:681 +#: src/slic3r/GUI/GUI_App.cpp:1512 msgid "Mode" -msgstr "Režim" +msgstr "Reži&m" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "model" msgstr "model" -#: src/slic3r/GUI/BedShapeDialog.cpp:239 +#: src/slic3r/GUI/BedShapeDialog.cpp:395 msgid "Model" msgstr "Model" @@ -3873,8 +5319,8 @@ msgid "Model repair canceled" msgstr "Oprava modelu byla zrušena" #: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" -msgstr "Oprava modelu selhala:\n" +msgid "Model repair failed:" +msgstr "Oprava modelu selhala:" #: src/slic3r/Utils/FixModelByWin10.cpp:400 msgid "Model repair finished" @@ -3884,104 +5330,182 @@ msgstr "Oprava modelu byla dokončena" msgid "Model repaired successfully" msgstr "Model byl úspěšně opraven" -#: src/slic3r/GUI/Preset.cpp:207 +#: 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/GUI_App.cpp:1425 msgid "modified" msgstr "upraveno" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 msgid "Modifier" msgstr "Modifikátor" -#: src/slic3r/GUI/Tab.cpp:1100 +#: src/slic3r/GUI/Tab.cpp:1491 msgid "Modifiers" msgstr "Modifikátory" -#: src/libslic3r/PrintConfig.cpp:719 +#: src/libslic3r/PrintConfig.cpp:2655 +msgid "money/bottle" +msgstr "cena/láhev" + +#: src/libslic3r/PrintConfig.cpp:798 msgid "money/kg" msgstr "korun/kg" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1240 +#: src/libslic3r/PrintConfig.cpp:461 +msgid "Monotonic" +msgstr "Monotóní" + +#: 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/Gizmos/GLGizmoMove.cpp:51 +#: src/slic3r/GUI/GLCanvas3D.cpp:249 +msgid "Mouse wheel:" +msgstr "Kolečko myši:" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64 msgid "Move" msgstr "Přesunout" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1238 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219 msgid "Move clipping plane" msgstr "Posunout řezovou rovinu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 msgid "Move current slider thumb Down" msgstr "Posunout aktivní posuvník dolů" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:229 +msgid "Move current slider thumb Left" +msgstr "Posunout aktivní posuvník vlevo" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:230 +msgid "Move current slider thumb Right" +msgstr "Posunout aktivní posuvník vpravo" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Move current slider thumb Up" msgstr "Posunout aktivní posuvník nahoru" -#: src/slic3r/GUI/GLCanvas3D.cpp:2872 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835 +msgid "Move drainage hole" +msgstr "Posun odtokového otvoru" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3810 msgid "Move Object" msgstr "Posunutí Objektu" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212 msgid "Move point" msgstr "Posunout bod" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1183 +#: 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: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: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: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:955 msgid "Move support point" msgstr "Posun podpěrného bodu" -#: src/libslic3r/PrintConfig.cpp:2100 +#: 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:162 +msgid "Movement step set to 1 mm" +msgstr "Krok pro posun výběru o velikosti 1 mm" + +#: 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:1661 src/slic3r/GUI/Plater.cpp:1769 +#: 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:400 src/slic3r/GUI/FirmwareDialog.cpp:436 -#, possible-c-format +#: 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 "Bylo nalezeno více zařízení %s . Během flashování mějte připojené pouze jedno." -#: src/slic3r/GUI/Tab.cpp:1118 +#: src/slic3r/GUI/Tab.cpp:1509 msgid "Multiple Extruders" msgstr "Více Extruderů" -#: src/slic3r/GUI/Plater.cpp:1766 -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?\n" -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ů?\n" +#: src/slic3r/GUI/Plater.cpp:2372 +msgid "" +"Multiple objects were loaded for a multi-material printer.\n" +"Instead of considering them as multiple objects, should I consider\n" +"these files to represent a single object having multiple parts?" +msgstr "" +"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/libslic3r/PrintConfig.cpp:3050 +#: 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:3045 +#: src/libslic3r/PrintConfig.cpp:3633 msgid "Multiply copies by this factor." msgstr "Vynásobí kopie tímto číslem." -#: src/slic3r/GUI/Field.cpp:139 +#: 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:176 +#: src/slic3r/GUI/GUI_ObjectList.cpp:284 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161 msgid "Name" msgstr "Název" -#: src/libslic3r/PrintConfig.cpp:1418 +#: 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:1412 +#: src/libslic3r/PrintConfig.cpp:1590 msgid "Name of the printer vendor." msgstr "Název prodejce tiskárny." -#: src/libslic3r/PrintConfig.cpp:1009 +#: 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:1560 +#: src/libslic3r/PrintConfig.cpp:1738 msgid "Nearest" msgstr "Nejbližší" @@ -3989,32 +5513,56 @@ msgstr "Nejbližší" msgid "Network lookup" msgstr "Hledání v síti" +#: 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/UpdateDialogs.cpp:30 -#, possible-c-format +#: 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 msgid "New version of %s is available" msgstr "Je dostupná nová verze %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:47 +#: src/slic3r/GUI/UpdateDialogs.cpp:45 msgid "New version:" msgstr "Nová verze:" -#: src/slic3r/GUI/GLCanvas3D.cpp:3750 +#: src/slic3r/GUI/GLCanvas3D.cpp:5089 msgid "Next Redo action: %1%" msgstr "Akce vpřed: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:3718 +#: src/slic3r/GUI/GLCanvas3D.cpp:5051 msgid "Next Undo action: %1%" msgstr "Akce zpět: %1%" -#: src/libslic3r/PrintConfig.cpp:912 +#: src/libslic3r/PrintConfig.cpp:1004 msgid "No extrusion" msgstr "Žádná extruze" -#: src/slic3r/GUI/MainFrame.cpp:635 +#: 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:1485 msgid "No previously sliced file." msgstr "Žádné dříve slicované soubory." @@ -4022,152 +5570,221 @@ msgstr "Žádné dříve slicované soubory." msgid "NO RAMMING AT ALL" msgstr "ŽÁDNÁ RAPIDNÍ EXTRUZE" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:1999 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "Bez řídkých vrstev (EXPERIMENTÁLNÍ)" + +#: 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/ConfigWizard.cpp:190 src/slic3r/GUI/Plater.cpp:422 -#: src/libslic3r/GCode/PreviewData.cpp:162 +#: src/slic3r/GUI/UpdateDialogs.cpp:304 +msgid "No updates available" +msgstr "Žádné aktualizace nejsou dostupné" + +#: 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:2152 +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2372 msgid "Normal" msgstr "Normální" -#: src/slic3r/GUI/Plater.cpp:1073 +#: src/slic3r/GUI/Plater.cpp:1177 src/slic3r/GUI/Plater.cpp:1224 msgid "normal mode" msgstr "normální režim" -#: src/libslic3r/Zipper.cpp:49 +#: 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/Utils/OctoPrint.cpp:90 +#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446 +msgid "Not found:" +msgstr "Nenalezeno:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1144 +msgid "Note" +msgstr "Poznámka" + +#: 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" +"\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 "" +"Poznámka: Všechna nastavení z této sekce jsou přesunuta do nastavení Fyzické tiskárny (viz changelog).\n" +"\n" +"Nový 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: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: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:1213 +#: 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:1193 src/slic3r/GUI/Tab.cpp:1194 -#: src/slic3r/GUI/Tab.cpp:1576 src/slic3r/GUI/Tab.cpp:1577 -#: src/slic3r/GUI/Tab.cpp:1985 src/slic3r/GUI/Tab.cpp:1986 -#: src/slic3r/GUI/Tab.cpp:2079 src/slic3r/GUI/Tab.cpp:2080 -#: src/slic3r/GUI/Tab.cpp:3328 src/slic3r/GUI/Tab.cpp:3329 +#: 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/GUI.cpp:277 +#: 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:118 +#: src/slic3r/GUI/ConfigWizard.cpp:236 msgid "nozzle" msgstr "tryska" -#: src/libslic3r/PrintConfig.cpp:1261 +#: 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:560 +#: src/slic3r/GUI/ConfigWizard.cpp:1335 msgid "Nozzle Diameter:" msgstr "Průměr trysky:" -#: src/libslic3r/PrintConfig.cpp:618 +#: 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 pro 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:1845 +#: src/slic3r/GUI/Tab.cpp:2073 msgid "Number of extruders of the printer." msgstr "Počet extrudérů tiskárny." -#: src/libslic3r/PrintConfig.cpp:1888 +#: 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:1627 +#: 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:2214 +#: src/libslic3r/PrintConfig.cpp:2508 msgid "Number of pixels in" msgstr "Počet pixelů v ose" -#: src/libslic3r/PrintConfig.cpp:2216 +#: src/libslic3r/PrintConfig.cpp:2510 msgid "Number of pixels in X" msgstr "Počet pixelů v ose X" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2516 msgid "Number of pixels in Y" msgstr "Počet pixelů v ose Y" -#: src/libslic3r/PrintConfig.cpp:151 +#: 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:1711 +#: 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:2045 +#: 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:2303 +#: 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:218 +#: src/slic3r/GUI/Plater.cpp:247 msgid "Number of tool changes" msgstr "Počet změn nástroje" -#: src/libslic3r/PrintConfig.cpp:2489 +#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:2917 msgid "Object elevation" msgstr "Nadzvednutí objektu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2858 msgid "Object manipulation" msgstr "Manipulace s objektem" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:27 -msgid "Object Manipulation" -msgstr "Manipulace s objektem" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:78 +#: 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:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3880 msgid "Object or Instance" msgstr "Objekt nebo Instanci" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1010 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 msgid "Object reordered" msgstr "Zěna pořadí objektů" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1868 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2871 msgid "Object Settings to modify" msgstr "Změna nastavení objektu" -#: src/slic3r/GUI/Plater.cpp:1875 +#: src/slic3r/GUI/Plater.cpp:2491 msgid "Object too large?" msgstr "Objekt moc velký?" -#: src/libslic3r/PrintConfig.cpp:2161 +#: 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:1018 +#: src/slic3r/GUI/Plater.cpp:1103 msgid "object(s)" msgstr "objekt(y)" -#: src/slic3r/GUI/Plater.cpp:1043 src/slic3r/GUI/Plater.cpp:1058 +#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160 msgid "objects" msgstr "objekty" -#: src/libslic3r/PrintConfig.cpp:402 src/libslic3r/PrintConfig.cpp:808 +#: src/libslic3r/PrintConfig.cpp:465 src/libslic3r/PrintConfig.cpp:893 msgid "Octagram Spiral" msgstr "Octagram Spiral" @@ -4175,807 +5792,1209 @@ msgstr "Octagram Spiral" msgid "OctoPrint version" msgstr "Verze OctoPrintu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3888 msgid "of a current Object" msgstr "současného Objektu" -#: src/slic3r/GUI/wxExtensions.cpp:2570 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Offset" +msgstr "Odsazení" + +#: 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 +#, 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:1064 msgid "One layer mode" msgstr "Zobrazení po jedné vrstvě" -#: src/libslic3r/Print.cpp:1285 +#: 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:1817 src/libslic3r/PrintConfig.cpp:2425 +#: 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:978 +#: src/libslic3r/PrintConfig.cpp:1071 msgid "Only infill where needed" msgstr "Výplň pouze kde je potřeba" -#: src/slic3r/GUI/Tab.cpp:2271 +#: src/slic3r/GUI/Tab.cpp:2542 msgid "Only lift Z" msgstr "Pouze zvednout Z" -#: src/libslic3r/PrintConfig.cpp:1500 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "Only lift Z above" msgstr "Zvednout Z pouze nad" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "Only lift Z below" msgstr "Zvednout Z pouze pod" -#: src/libslic3r/PrintConfig.cpp:1279 +#: 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:1126 +#: 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:1193 +#: 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:339 +#: 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:1745 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330 msgid "Open CA certificate file" msgstr "Otevřít soubor s certifikátem CA" -#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:126 +#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:183 msgid "Open changelog page" msgstr "Otevře stránku s changelogem" -#: src/slic3r/GUI/UpdateDialogs.cpp:68 +#: src/slic3r/GUI/UpdateDialogs.cpp:65 msgid "Open download page" msgstr "Otevře stránku pro stažení programu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 -msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "Otevřít soubor STL/OBJ/AMF/3MF s konfigurací (smaže tiskovou plochu)" +#: src/slic3r/GUI/NotificationManager.cpp:742 +msgid "Open Folder." +msgstr "Otevřít složku" -#: src/slic3r/GUI/MainFrame.cpp:551 -#, possible-c-format +#: 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: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 +#, 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:542 +#: 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:549 +#: 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:2994 +#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:220 src/slic3r/GUI/Plater.cpp:3961 msgid "Optimize orientation" msgstr "Optimalizovat orientaci" -#: src/slic3r/GUI/Plater.cpp:2643 +#: src/slic3r/GUI/Plater.cpp:1555 msgid "Optimize Rotation" msgstr "Optimalizovat Orientaci" -#: src/slic3r/GUI/Plater.cpp:2994 +#: 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:112 +#: 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:1070 +#: 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/Plater.cpp:2251 +#: 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/Jobs/RotoptimizeJob.cpp:74 msgid "Orientation found." msgstr "Orientace nalezena." -#: src/slic3r/GUI/Plater.cpp:2768 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73 msgid "Orientation search canceled." msgstr "Hledání optimální orientace zrušeno." -#: src/slic3r/GUI/BedShapeDialog.cpp:79 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 msgid "Origin" msgstr "Počátek" -#: src/slic3r/GUI/Tab.cpp:1165 +#: src/slic3r/GUI/Tab.cpp:1557 msgid "Other" msgstr "Ostatní" -#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:1977 +#: src/libslic3r/PrintConfig.cpp:177 src/libslic3r/PrintConfig.cpp:2206 msgid "Other layers" msgstr "Ostatní vrstvy" -#: src/slic3r/GUI/ConfigWizard.cpp:438 +#: src/slic3r/GUI/ConfigWizard.cpp:1222 msgid "Other Vendors" msgstr "Ostatní výrobci" -#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:3440 +#: src/slic3r/GUI/Tab.cpp:1568 src/slic3r/GUI/Tab.cpp:4085 msgid "Output file" msgstr "Výstupní soubor" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3692 msgid "Output File" msgstr "Výstupní soubor" -#: src/libslic3r/PrintConfig.cpp:1294 +#: src/libslic3r/PrintConfig.cpp:1471 msgid "Output filename format" msgstr "Formát názvu výstupního souboru" -#: src/libslic3r/PrintConfig.cpp:2992 +#: src/libslic3r/PrintConfig.cpp:3580 msgid "Output Model Info" msgstr "Info o výstupním modelu" -#: src/slic3r/GUI/Tab.cpp:1168 src/slic3r/GUI/Tab.cpp:3439 +#: 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:229 src/libslic3r/GCode/PreviewData.cpp:165 +#: 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:1955 +#: src/libslic3r/PrintConfig.cpp:2184 msgid "Overhang threshold" msgstr "Mezní úhel převisu" -#: src/slic3r/GUI/Tab.cpp:1153 +#: src/slic3r/GUI/Tab.cpp:1545 msgid "Overlap" msgstr "Překrytí" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "P&rint Settings Tab" -msgstr "Panel nastavení tisku" +msgstr "Panel Nastavení &tisku" -#: src/slic3r/GUI/GUI_ObjectList.cpp:79 src/slic3r/GUI/GUI_ObjectList.cpp:520 -#: src/slic3r/GUI/Tab.cpp:3425 src/slic3r/GUI/Tab.cpp:3426 -#: src/libslic3r/PrintConfig.cpp:2516 src/libslic3r/PrintConfig.cpp:2523 -#: src/libslic3r/PrintConfig.cpp:2537 src/libslic3r/PrintConfig.cpp:2547 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2569 +#: 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" -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 msgid "Pad and Support" msgstr "Podložka a Podpěry" -#: src/libslic3r/PrintConfig.cpp:2732 +#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:3019 msgid "Pad around object" msgstr "Podložka okolo objektu" -#: src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:3026 +msgid "Pad around object everywhere" +msgstr "Podložka všude okolo objektu" + +#: src/libslic3r/PrintConfig.cpp:2975 +msgid "Pad brim size" +msgstr "Velikost límce podložky" + +#: 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:3062 msgid "Pad object connector penetration" msgstr "Průnik spojky Podložka-Objekt" -#: src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:3044 msgid "Pad object connector stride" msgstr "Rozteč spojek Podložka-Objekt" -#: src/libslic3r/PrintConfig.cpp:2721 +#: src/libslic3r/PrintConfig.cpp:3053 msgid "Pad object connector width" msgstr "Šířka spojky Podložka-Objekt" -#: src/libslic3r/PrintConfig.cpp:2700 +#: src/libslic3r/PrintConfig.cpp:3033 msgid "Pad object gap" msgstr "Mezera Podložka-Objekt" -#: src/libslic3r/PrintConfig.cpp:2532 +#: src/libslic3r/PrintConfig.cpp:2961 msgid "Pad wall height" msgstr "Výška bočnice podložky" -#: src/libslic3r/PrintConfig.cpp:2568 +#: src/libslic3r/PrintConfig.cpp:3008 msgid "Pad wall slope" msgstr "Sklon bočnice podložky" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2951 msgid "Pad wall thickness" msgstr "Tloušťka stěny podložky" -#: src/slic3r/GUI/Field.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +msgid "Page Down" +msgstr "Page Down" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +msgid "Page Up" +msgstr "Page Up" + +#: 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:184 +#: src/slic3r/GUI/Field.cpp:291 msgid "Parameter validation" msgstr "Validace parametru" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3881 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 msgid "Part" msgstr "Část" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1881 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2886 msgid "Part manipulation" msgstr "Manipulace s částmi" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 msgid "Part Settings to modify" msgstr "Změna nastavení části" -#: src/slic3r/GUI/GLCanvas3D.cpp:3449 +#: 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:456 +#: src/slic3r/GUI/MainFrame.cpp:1198 msgid "Paste clipboard" msgstr "Vložit ze schránky" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 msgid "Paste from clipboard" msgstr "Vložit ze schránky" -#: src/slic3r/GUI/Plater.cpp:4772 +#: src/slic3r/GUI/Plater.cpp:5803 msgid "Paste From Clipboard" msgstr "Vložení ze schránky" -#: src/libslic3r/PrintConfig.cpp:1915 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Pattern" msgstr "Vzor" -#: src/libslic3r/PrintConfig.cpp:1805 +#: src/libslic3r/PrintConfig.cpp:2033 msgid "Pattern angle" msgstr "Úhel vzoru" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:2158 msgid "Pattern spacing" msgstr "Rozteč podpěr" -#: src/libslic3r/PrintConfig.cpp:1917 +#: src/libslic3r/PrintConfig.cpp:2146 msgid "Pattern used to generate support material." msgstr "Vzor použitý pro generování podpěr." -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:198 +#: 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:1133 +msgid "Pause print (\"%1%\")" +msgstr "Pozastavení tisku (\"%1%\")" + +#: src/slic3r/GUI/Tab.cpp:2209 src/libslic3r/PrintConfig.cpp:1969 +msgid "Pause Print G-code" +msgstr "G-code pro pozastavení tisku" + +#: src/slic3r/GUI/GLCanvas3D.cpp:940 src/slic3r/GUI/GLCanvas3D.cpp:949 +#: src/slic3r/GUI/GLCanvas3D.cpp:988 +msgid "Pause print or custom G-code" +msgstr "Pozastavit tisk nebo vložit vlastní G-code" + +#: 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:177 msgid "Perform cut" msgstr "Provést řez" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/GCode/PreviewData.cpp:163 +#: 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:301 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/ExtrusionEntity.cpp:336 msgid "Perimeter" msgstr "Perimetr" -#: src/libslic3r/PrintConfig.cpp:1339 +#: src/libslic3r/PrintConfig.cpp:1516 msgid "Perimeter extruder" msgstr "Extruder pro perimetry" -#: src/slic3r/GUI/PresetHints.cpp:162 +#: src/slic3r/GUI/PresetHints.cpp:164 msgid "perimeters" msgstr "perimetry" -#: src/libslic3r/PrintConfig.cpp:1330 src/libslic3r/PrintConfig.cpp:1348 -#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1370 +#: 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:440 -#, possible-c-format -msgid "Pick another vendor supported by %s:" -msgstr "Vyberte si jiného prodejce podporovaného v %s:" +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:159 +msgid "Physical Printer" +msgstr "Fyzická tiskárna" -#: src/libslic3r/PrintConfig.cpp:2430 +#: 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 +#, 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: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:2845 msgid "Pillar widening factor" msgstr "Koeficient rozšiřování podpěry" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:32 +#: 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/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:41 msgid "Place on face" msgstr "Umístit plochou na podložku" -#: src/slic3r/GUI/MainFrame.cpp:161 +#: 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/KBShortcutsDialog.cpp:156 -msgid "Plater Shortcuts" -msgstr "Podložka" - -#: src/slic3r/GUI/GUI.cpp:143 +#: src/slic3r/GUI/GUI_App.cpp:1877 msgid "Please check and fix your object list." msgstr "Zkontrolujte a opravte seznam objektů." -#: src/slic3r/GUI/Tab.cpp:2797 +#: 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/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:286 +#: 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:43 src/slic3r/GUI/AboutDialog.cpp:48 +#: src/slic3r/GUI/AboutDialog.cpp:317 msgid "Portions copyright" msgstr "Autorská práva" -#: src/libslic3r/PrintConfig.cpp:2235 +#: src/libslic3r/PrintConfig.cpp:2543 msgid "Portrait" msgstr "Orientace na výšku" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:193 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505 msgid "Position" msgstr "Pozice" -#: src/slic3r/GUI/Tab.cpp:2265 +#: src/slic3r/GUI/Tab.cpp:2536 msgid "Position (for multi-extruder printers)" msgstr "Pozice (pro tiskárny s více extrudery)" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Position (mm)" -msgstr "Pozice (mm)" - -#: src/libslic3r/PrintConfig.cpp:1553 +#: src/libslic3r/PrintConfig.cpp:1731 msgid "Position of perimeters starting points." msgstr "Pozice začátku perimetrů." -#: src/libslic3r/PrintConfig.cpp:2123 +#: src/libslic3r/PrintConfig.cpp:2367 msgid "Position X" msgstr "Pozice X" -#: src/libslic3r/PrintConfig.cpp:2130 +#: src/libslic3r/PrintConfig.cpp:2374 msgid "Position Y" msgstr "Pozice Y" -#: src/slic3r/GUI/Tab.cpp:1187 src/libslic3r/PrintConfig.cpp:1383 +#: src/slic3r/GUI/Tab.cpp:1575 src/libslic3r/PrintConfig.cpp:1561 msgid "Post-processing scripts" msgstr "Postprodukční skripty" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:1237 msgid "Pre&view" -msgstr "Náhled" +msgstr "&Náhled" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 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:1571 +#: src/libslic3r/PrintConfig.cpp:1749 msgid "Preferred direction of the seam" msgstr "Preferovaný směr švu" -#: src/libslic3r/PrintConfig.cpp:1582 +#: src/libslic3r/PrintConfig.cpp:1760 msgid "Preferred direction of the seam - jitter" msgstr "Preferovaný směr švu - rozkmit" -#: src/libslic3r/PrintObject.cpp:251 +#: src/libslic3r/PrintObject.cpp:261 msgid "Preparing infill" msgstr "Příprava výplně" -#: src/slic3r/GUI/Tab.cpp:2758 -#, possible-c-format -msgid "Preset (%s)" -msgstr "Přednastavení (%s)" +#: src/slic3r/GUI/GUI_App.cpp:895 +msgid "Preparing settings tabs..." +msgstr "Příprava karet s nastavením..." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Press to activate deselection rectangle\nor to scale or rotate selected objects\naround their own center" -msgstr "Stiskem aktivujete obdélníkové odstranění \nvýběru nebo změnu velikosti nebo otočení \nvybraných objektů kolem vlastních středů" +#: 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/KBShortcutsDialog.cpp:148 -msgid "Press to activate one direction scaling in Gizmo scale" -msgstr "Stiskem aktivujete změnu velikosti pouze v jednom směru" +#: 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/KBShortcutsDialog.cpp:146 -#, possible-c-format -msgid "Press to activate selection rectangle\nor to snap by 5% in Gizmo scale\nor to snap by 1mm in Gizmo move" -msgstr "Stiskem aktivujete obdélníkvý výběr\nnebo 5% krok při změně velikosti\nnebo 1mm krok při posunu" +#: 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/KBShortcutsDialog.cpp:147 -msgid "Press to scale selection to fit print volume\nin Gizmo scale" -msgstr "Stiskem v režimu Gizmo měřítko vyplní tiskovou\nplochu aktivním výběrem" +#: src/slic3r/GUI/SavePresetDialog.cpp:136 +msgid "Preset with name \"%1%\" already exists and is imcopatible with selected printer." +msgstr "Přednastavení s názvem \"%1%\" již existuje a není kompatibilní s vybranou tiskárnou." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 -msgid "Press to select multiple object or move multiple object with mouse" -msgstr "Stisknutím vyberte více objektů nebo přesuňte více objektů pomocí myši" +#: 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:2288 +#: src/slic3r/GUI/SavePresetDialog.cpp:219 +msgctxt "PresetName" +msgid "Copy" +msgstr "Kopie" + +#: 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:156 +msgid "Press to activate selection rectangle" +msgstr "Stiskem aktivujete obdélníkový výběr" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +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:221 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:231 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:232 +msgid "" +"Press to speed up 5 times while moving thumb\n" +"with arrow keys or mouse wheel" +msgstr "" +"5× zrychlíte pohyb posuvníku pomocí\n" +"šipek nebo kolečkem myši" + +#: 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/KBShortcutsDialog.cpp:176 -msgid "Preview Shortcuts" -msgstr "Náhled" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +msgid "Preview hollowed and drilled model" +msgstr "Náhled dutého modelu" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:1491 msgid "Previously sliced file (" msgstr "Dříve slicovaný soubor (" -#: src/libslic3r/PrintConfig.cpp:1773 +#: src/libslic3r/PrintConfig.cpp:1993 msgid "Prime all printing extruders" msgstr "Příprava všech tiskových extruderů" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1274 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/libslic3r/Preset.cpp:1300 msgid "print" msgstr "tisk" -#: src/slic3r/GUI/MainFrame.cpp:510 +#: 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:439 +#: 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:541 +#: src/slic3r/GUI/ConfigWizard.cpp:1318 msgid "Print Diameters" -msgstr "Průměry tisku" +msgstr "Parametry extruderu" -#: src/slic3r/GUI/Tab.cpp:1917 src/slic3r/GUI/Tab.cpp:2074 +#: 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:122 -#: src/slic3r/GUI/PrintHostDialogs.cpp:135 +#: 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/Tab.hpp:317 src/slic3r/GUI/Tab.hpp:405 +#: src/slic3r/GUI/DoubleSlider.cpp:1093 +msgid "Print mode" +msgstr "Režim tisku" + +#: 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:681 +#: src/slic3r/GUI/Plater.cpp:690 msgid "Print settings" msgstr "Nastavení tisku" -#: src/slic3r/GUI/Tab.cpp:1520 +#: 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/slic3r/GUI/MainFrame.cpp:483 -msgid "Print&er Settings Tab" -msgstr "Panel nastavení tiskárny" +#: src/libslic3r/GCode.cpp:623 +msgid "Print z" +msgstr "Tisk ve výšce" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:1228 +msgid "Print&er Settings Tab" +msgstr "Panel Nastav&ení tiskárny" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1750 msgid "Printable" msgstr "Tisknout objekt" -#: src/slic3r/GUI/Plater.cpp:685 +#: src/slic3r/GUI/Plater.cpp:694 msgid "Printer" msgstr "Tiskárna" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:48 src/slic3r/GUI/Preset.cpp:1278 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/libslic3r/Preset.cpp:1304 msgid "printer" msgstr "tiskárna" -#: src/libslic3r/PrintConfig.cpp:2274 src/libslic3r/PrintConfig.cpp:2275 +#: src/libslic3r/PrintConfig.cpp:2582 src/libslic3r/PrintConfig.cpp:2583 msgid "Printer absolute correction" msgstr "Absolutní korekce tiskárny" -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2600 msgid "Printer gamma correction" msgstr "Gamma korekce tiskárny" -#: src/slic3r/GUI/Tab.cpp:926 +#: src/slic3r/GUI/Tab.cpp:1294 msgid "printer model" msgstr "model tiskárny" -#: src/libslic3r/PrintConfig.cpp:1402 +#: src/libslic3r/PrintConfig.cpp:1580 msgid "Printer notes" msgstr "Poznámky o tiskárně" -#: src/libslic3r/PrintConfig.cpp:2266 src/libslic3r/PrintConfig.cpp:2267 -#: src/libslic3r/PrintConfig.cpp:2268 +#: 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:368 +#: src/slic3r/GUI/Tab.hpp:453 msgid "Printer Settings" msgstr "Nastavení tiskárny" -#: src/libslic3r/PrintConfig.cpp:42 src/libslic3r/PrintConfig.cpp:43 +#: 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:1396 +#: src/libslic3r/PrintConfig.cpp:1574 msgid "Printer type" msgstr "Typ tiskárny" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1595 msgid "Printer variant" msgstr "Varianta tiskárny" -#: src/libslic3r/PrintConfig.cpp:1411 +#: src/libslic3r/PrintConfig.cpp:1589 msgid "Printer vendor" msgstr "Prodejce tiskárny" -#: src/libslic3r/Print.cpp:1294 +#: 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:715 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:1550 +#, c-format msgid "Processing %s" msgstr "Zpracovávám %s" -#: src/slic3r/GUI/Plater.cpp:1600 -#, possible-c-format -msgid "Processing input file %s\n" -msgstr "Zpracovávám vstupní soubor %s\n" - -#: src/libslic3r/PrintObject.cpp:110 +#: src/libslic3r/PrintObject.cpp:114 msgid "Processing triangulated mesh" msgstr "Zpracovávám tringulační sítě" -#: src/slic3r/GUI/Tab.cpp:1201 src/slic3r/GUI/Tab.cpp:1585 -#: src/slic3r/GUI/Tab.cpp:1993 src/slic3r/GUI/Tab.cpp:2087 -#: src/slic3r/GUI/Tab.cpp:3337 src/slic3r/GUI/Tab.cpp:3446 +#: 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/PrintHostDialogs.cpp:149 +#: src/slic3r/GUI/ConfigWizard.cpp:590 +msgid "Profile:" +msgstr "Profil:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:148 msgid "Progress" msgstr "Průběh" -#: src/slic3r/GUI/FirmwareDialog.cpp:779 +#: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Progress:" msgstr "Průběh:" -#: src/slic3r/GUI/MainFrame.cpp:542 +#: 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:1109 +#: src/slic3r/GUI/ConfigWizard.cpp:2506 msgid "Prusa FFF Technology Printers" msgstr "Prusa tiskárny technologie FFF" -#: src/slic3r/GUI/ConfigWizard.cpp:1112 +#: src/slic3r/GUI/ConfigWizard.cpp:2509 msgid "Prusa MSLA Technology Printers" msgstr "Prusa tiskárny technologie MSLA" -#: src/slic3r/GUI/AboutDialog.cpp:255 +#: 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/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/GUI_App.cpp:297 -#, 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." +#: 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 +#, 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 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/libslic3r/PrintConfig.cpp:2153 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50 +msgid "PrusaSlicer version" +msgstr "verze PrusaSliceru" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:662 +msgid "PrusaSlicer will remember your action." +msgstr "PrusaSlicer si vaši akci zapamatuje." + +#: src/slic3r/GUI/ConfigWizard.cpp:1174 +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: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:456 +#: src/slic3r/GUI/Plater.cpp:410 msgid "Purging volumes" msgstr "Objemy čištění" -#: src/libslic3r/PrintConfig.cpp:2106 +#: 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:2113 +#: src/libslic3r/PrintConfig.cpp:2357 msgid "Purging volumes - matrix" msgstr "Objemy čištění - matice" -#: src/slic3r/GUI/Tab.cpp:1019 +#: 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:1402 msgid "Quality (slower slicing)" msgstr "Kvalita (pomalejší slicing)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:854 src/slic3r/GUI/GUI_ObjectList.cpp:1139 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1145 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1377 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:260 +msgid "Quality / Speed" +msgstr "Kvalita / Rychlost" + +#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:56 +msgid "Quality: " +msgstr "Kvalita:" + +#: 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 +#, c-format msgid "Quick Add Settings (%s)" msgstr "Rychlé přidání nastavení (%s)" -#: src/slic3r/GUI/MainFrame.cpp:383 +#: src/slic3r/GUI/MainFrame.cpp:1113 msgid "Quick Slice" msgstr "Rychlé Slicování" -#: src/slic3r/GUI/MainFrame.cpp:389 +#: 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:409 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402 +#, c-format msgid "Quit %s" msgstr "Ukončit %s" -#: src/libslic3r/PrintConfig.cpp:479 +#: 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:1066 +#: src/slic3r/GUI/Tab.cpp:1456 msgid "Raft" msgstr "Raft" -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1609 msgid "Raft layers" msgstr "Vrstev raftu" -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" msgstr "Přizpůsobení rapidní extruze" -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 -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: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." -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 msgid "Ramming line spacing" msgstr "Rozestup linek při rapidní extruzi" -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 msgid "Ramming line width" msgstr "Šířka linky při rapidní extruzi" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:730 msgid "Ramming parameters" msgstr "Parametry rapidní extruze" -#: src/slic3r/GUI/Tab.cpp:1545 +#: src/slic3r/GUI/Tab.cpp:1850 msgid "Ramming settings" msgstr "Nastavení rapidní extruze" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1737 msgid "Random" msgstr "Náhodný" -#: src/slic3r/GUI/wxExtensions.cpp:486 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:96 msgid "Range" msgstr "Rozsah" -#: src/libslic3r/SLAPrint.cpp:72 +#: src/libslic3r/SLAPrintSteps.cpp:66 msgid "Rasterizing layers" msgstr "Rasterizace vrstev" -#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#: src/slic3r/GUI/MainFrame.cpp:1202 +msgid "Re&load from disk" +msgstr "Znovu &načíst z disku" + +#: src/slic3r/GUI/UpdateDialogs.cpp:249 msgid "Re-configure" msgstr "Přenastavit" -#: src/slic3r/GUI/FirmwareDialog.cpp:783 +#: src/slic3r/GUI/FirmwareDialog.cpp:821 msgid "Ready" msgstr "Připraveno" -#: src/slic3r/GUI/Plater.cpp:2406 +#: src/slic3r/GUI/Plater.cpp:2915 msgid "Ready to slice" msgstr "Připraven ke slicování" -#: src/slic3r/GUI/MainFrame.cpp:526 src/libslic3r/PrintConfig.cpp:1562 +#: 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:526 +#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286 msgid "Rear View" msgstr "Pohled zezadu" -#: src/slic3r/GUI/MainFrame.cpp:401 +#: src/slic3r/GUI/MainFrame.cpp:994 msgid "Recent projects" -msgstr "Poslední projekty" +msgstr "N&edávné projekty" #: src/slic3r/GUI/PresetHints.cpp:262 -#, possible-c-format +#, 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:247 +#: 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: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:386 src/slic3r/GUI/GUI_App.cpp:395 +#: src/slic3r/GUI/GUI_App.cpp:1102 src/slic3r/GUI/GUI_App.cpp:1115 msgid "Recreating" msgstr "Obnovení" -#: src/slic3r/GUI/BedShapeDialog.cpp:68 +#: src/slic3r/GUI/BedShapeDialog.cpp:141 msgid "Rectangular" msgstr "Obdélníkový" -#: src/libslic3r/PrintConfig.cpp:398 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1922 +#: 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:1923 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "Rectilinear grid" msgstr "Přímočará mřížka" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3639 -#: src/slic3r/GUI/MainFrame.cpp:562 +#: 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:3497 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:4382 +#, 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:3479 +#: src/slic3r/GUI/GLCanvas3D.cpp:4361 msgid "Redo History" msgstr "Historie operací Vpřed" -#: src/slic3r/GUI/Tab.cpp:1037 +#: src/slic3r/GUI/Tab.cpp:1426 msgid "Reducing printing time" msgstr "Zkracování tiskového času" -#: src/slic3r/GUI/Plater.cpp:2924 -msgid "Reload from Disk" -msgstr "Znovu načíst z Disku" +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327 +msgid "Refresh Printers" +msgstr "Obnovit tiskárny" -#: src/slic3r/GUI/Plater.cpp:2924 -msgid "Reload the selected file from Disk" -msgstr "Znovu načíst vybraný objekt z Disku" +#: src/libslic3r/PrintConfig.cpp:145 +msgid "Related printer preset name" +msgstr "Název souvisejícího přednastavení tiskárny" -#: src/slic3r/GUI/Preferences.cpp:36 +#: src/slic3r/GUI/Plater.cpp:3257 +msgid "Reload all from disk" +msgstr "Vše znovu načíst z disku" + +#: 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:3142 +msgid "Reload from:" +msgstr "Znovu načíst z:" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +msgid "Reload plater from disk" +msgstr "Znovu načíst podložku z disku" + +#: 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:3881 +msgid "Reload the selected object from disk" +msgstr "Znovu načíst vybraný objekt z disku" + +#: 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/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:2935 +#: src/slic3r/GUI/Tab.cpp:3386 msgid "remove" msgstr "odebrat" -#: src/slic3r/GUI/Tab.cpp:2937 +#: 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/GLGizmoSlaSupports.cpp:859 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +msgid "Remove all holes" +msgstr "Odebrat všechny otvory" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 msgid "Remove all points" msgstr "Odebrat všechny body" -#: src/slic3r/GUI/GLCanvas3D.cpp:3475 +#: 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/ExtruderSequenceDialog.cpp:182 +msgid "Remove extruder from sequence" +msgstr "Odebrat extruder ze seznamu" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4903 src/slic3r/GUI/Plater.cpp:3860 msgid "Remove instance" msgstr "Odebrat instanci" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +#: 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:3518 +#: 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:83 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98 msgid "Remove parameter" msgstr "Odebrat parametr" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1230 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 msgid "Remove point" msgstr "Odebrat bod" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1233 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214 msgid "Remove point from selection" msgstr "Odebrat bod z výběru" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:855 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1237 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Remove selected holes" +msgstr "Smazat označené otvory" + +#: 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:2891 src/slic3r/GUI/Plater.cpp:2909 +#: 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:305 -msgid "Remove user profiles - install from scratch (a snapshot will be taken beforehand)" -msgstr "Odstranit uživatelské profily - čistá instalace (nejprve bude provedena záloha)" +#: 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:1200 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1765 msgid "Rename" msgstr "Přejmenovat" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:589 msgid "Rename Object" msgstr "Přejmenování objektu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: 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:2709 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4266 msgid "Renaming" msgstr "Přejmenování" -#: src/libslic3r/PrintConfig.cpp:3125 -msgid "Render with a software renderer" -msgstr "Vykreslení pomocí softwaru" +#: 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:3126 +#: src/slic3r/GUI/Preferences.cpp:255 +msgid "Render" +msgstr "Render" + +#: src/libslic3r/PrintConfig.cpp:3720 +msgid "Render with a software renderer" +msgstr "Vykreslování pomocí softwaru" + +#: 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:772 src/libslic3r/PrintConfig.cpp:3058 +#: src/slic3r/GUI/MainFrame.cpp:1612 src/libslic3r/PrintConfig.cpp:3646 msgid "Repair" msgstr "Oprava" @@ -4999,279 +7018,340 @@ 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/KBShortcutsDialog.cpp:113 src/slic3r/GUI/MainFrame.cpp:395 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Repeat last quick slice" msgstr "Opakovat poslední rychlé slicování" -#: src/slic3r/GUI/MainFrame.cpp:395 +#: src/slic3r/GUI/MainFrame.cpp:1125 msgid "Repeat Last Quick Slice" msgstr "Opakovat poslední rychlé slicování" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:477 +msgid "Replace?" +msgstr "Nahradit?" + +#: 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:561 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327 +#, c-format msgid "Report an issue on %s" msgstr "Nahlásit chybu v programu %s" -#: src/slic3r/Utils/PresetUpdater.cpp:590 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:733 +#, c-format msgid "requires max. %s" msgstr "vyžaduje max. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:588 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:730 +#, c-format msgid "requires min. %s" msgstr "vyžaduje min. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:583 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:726 +#, c-format msgid "requires min. %s and max. %s" msgstr "vyžaduje min. %s a max. %s" -#: src/slic3r/GUI/FirmwareDialog.cpp:772 +#: src/slic3r/GUI/FirmwareDialog.cpp:810 msgid "Rescan" msgstr "Skenovat" -#: src/slic3r/GUI/Tab.cpp:1879 -msgid "Rescan serial ports" -msgstr "Znovu prohledat sériové porty" +#: src/slic3r/GUI/GLCanvas3D.cpp:299 +msgid "Reset" +msgstr "Výchozí" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1239 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220 msgid "Reset clipping plane" msgstr "Obnovit řezovou rovinu" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:928 +#: 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:2603 +#: src/slic3r/GUI/Plater.cpp:2684 msgid "Reset Project" msgstr "Resetovat Projekt" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:303 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372 msgid "Reset rotation" msgstr "Výchozí natočení" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:328 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394 msgid "Reset Rotation" msgstr "Výchozí Natočení" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:290 +#: 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/Tab.cpp:2584 -msgid "Reset to Filament Color" -msgstr "Obnovit barvu filamentu" +#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136 +#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118 +msgid "Reset selection" +msgstr "Resetovat výběr" -#: src/libslic3r/PrintConfig.cpp:1441 +#: src/slic3r/GUI/GLCanvas3D.cpp:243 +msgid "Reset to base" +msgstr "Obnovit na výchozí" + +#: src/slic3r/GUI/Tab.cpp:2564 +msgid "Reset to Filament Color" +msgstr "Obnovit na barvu filamentu" + +#: src/libslic3r/PrintConfig.cpp:1619 msgid "Resolution" msgstr "Rozlišení" -#: src/libslic3r/PrintConfig.cpp:1459 +#: 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:1467 +#: src/libslic3r/PrintConfig.cpp:1645 msgid "Retract on layer change" msgstr "Retrakce při změně vrstvy" -#: src/slic3r/GUI/Tab.cpp:2268 +#: 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:1453 +#: 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:1474 +#: src/libslic3r/PrintConfig.cpp:1652 msgid "Retraction Length" msgstr "Vzdálenost retrakce" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1660 msgid "Retraction Length (Toolchange)" msgstr "Vzdálenost retrakce (při změně extruderu)" -#: src/libslic3r/PrintConfig.cpp:1534 src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1712 src/libslic3r/PrintConfig.cpp:1713 msgid "Retraction Speed" msgstr "Rychlost retrakce" -#: src/slic3r/GUI/Tab.cpp:2284 +#: 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:244 +#: 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:528 +#: 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:381 +#: 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:279 +#: 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:250 +#: 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:1232 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211 msgid "Right click" msgstr "Pravý klik" -#: src/slic3r/GUI/MainFrame.cpp:528 +#: 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:970 src/slic3r/GUI/MainFrame.cpp:1290 msgid "Right View" msgstr "Pohled zprava" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:233 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:253 -#: src/libslic3r/PrintConfig.cpp:3062 +#: 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:3067 +#: src/libslic3r/PrintConfig.cpp:3655 msgid "Rotate around X" msgstr "Otočit okolo osy X" -#: src/libslic3r/PrintConfig.cpp:3072 +#: src/libslic3r/PrintConfig.cpp:3660 msgid "Rotate around Y" msgstr "Otočit okolo osy Y" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:35 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:172 msgid "Rotate lower part upwards" msgstr "Otočit spodní část řezem dolů" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:151 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:194 +#: 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: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/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/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:491 -msgid "Rotation (deg)" -msgstr "Otáčení (stupně)" - -#: src/libslic3r/PrintConfig.cpp:3068 +#: 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:3073 +#: 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:3063 +#: 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/ConfigWizard.cpp:298 src/slic3r/GUI/GUI_App.cpp:658 -#, possible-c-format +#: src/slic3r/GUI/GUI_App.cpp:1474 +#, c-format msgid "Run %s" msgstr "Spustit %s" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:85 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:398 +#: 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/RammingChart.cpp:81 -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 src/libslic3r/PrintConfig.cpp:612 -#: src/libslic3r/PrintConfig.cpp:656 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:2243 src/libslic3r/PrintConfig.cpp:2252 -#: src/libslic3r/PrintConfig.cpp:2312 src/libslic3r/PrintConfig.cpp:2319 +#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 +#: 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:466 src/slic3r/GUI/MainFrame.cpp:709 +#: 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:709 +#: src/slic3r/GUI/MainFrame.cpp:1449 msgid "S&end to print" msgstr "Od&eslat do tiskárny" -#. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3264 -#, possible-c-format +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:642 +msgid "Save" +msgstr "Uložit" + +#: src/slic3r/GUI/SavePresetDialog.cpp:72 +#, c-format msgid "Save %s as:" msgstr "Uložit %s jako:" -#: src/slic3r/GUI/MainFrame.cpp:686 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:1527 +#, c-format msgid "Save %s file as:" msgstr "Uložit %s soubor jako:" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1023 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 msgid "Save changes?" msgstr "Uložit změny?" -#: src/libslic3r/PrintConfig.cpp:2997 +#: src/libslic3r/PrintConfig.cpp:3585 msgid "Save config file" msgstr "Uložit konfigurační soubor" -#: src/slic3r/GUI/MainFrame.cpp:786 +#: src/slic3r/GUI/MainFrame.cpp:1626 msgid "Save configuration as:" msgstr "Uložit konfiguraci jako:" -#: src/libslic3r/PrintConfig.cpp:2998 +#: 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 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:203 +#, c-format msgid "Save current %s" msgstr "Uložit stávající %s" -#: src/slic3r/GUI/MainFrame.cpp:341 +#: src/slic3r/GUI/MainFrame.cpp:1028 msgid "Save current project file" msgstr "Uložit stávající projekt" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: 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:1938 +#: src/slic3r/GUI/Plater.cpp:2566 msgid "Save file as:" msgstr "Uložit soubor jako:" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/Plater.cpp:4975 msgid "Save G-code file as:" msgstr "Uložit G-code jako:" -#: src/slic3r/GUI/MainFrame.cpp:757 +#: 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:417 +#: 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:843 +#: src/slic3r/GUI/MainFrame.cpp:1681 msgid "Save presets bundle as:" msgstr "Uložit balík přednastavení jako:" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: 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:109 -msgid "Save project (3MF)" -msgstr "Uložit projekt (3MF)" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 +msgid "Save project (3mf)" +msgstr "Uložit projekt (3mf)" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Save project as (3mf)" +msgstr "Uložit projekt jako (3mf)" + +#: src/slic3r/GUI/Plater.cpp:4975 msgid "Save SL1 file as:" msgstr "Uložit SL1 soubor jako:" -#: src/slic3r/GUI/MainFrame.cpp:692 +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:744 +msgid "Save the selected options to preset \"%1%\"." +msgstr "Uložte 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:" @@ -5281,210 +7361,246 @@ 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/GUI_ObjectManipulation.cpp:152 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:234 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:254 -#: src/libslic3r/PrintConfig.cpp:3077 +#: 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/Gizmos/GLGizmoScale.cpp:276 -msgid "Scale (%)" -msgstr "Měřítko (%)" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:195 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507 msgid "Scale factors" msgstr "Měřítka" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: 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:3086 +#: src/libslic3r/PrintConfig.cpp:3674 msgid "Scale to Fit" msgstr "Vyplnit tiskový objem" -#: src/slic3r/GUI/Selection.cpp:947 +#: src/slic3r/GUI/Selection.cpp:988 msgid "Scale To Fit" msgstr "Vyplnit tiskový objem" -#: src/libslic3r/PrintConfig.cpp:3087 +#: 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:1440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1852 msgid "Scale to print volume" msgstr "Změnit velikost podle tiskového objemu" -#: src/libslic3r/PrintConfig.cpp:3078 +#: src/libslic3r/PrintConfig.cpp:3666 msgid "Scaling factor or percentage." msgstr "Procentuální měřítko." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:409 +#: 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:1551 +#: 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:1572 +#: src/libslic3r/PrintConfig.cpp:1750 msgid "Seam preferred direction" msgstr "Preferovaný směr švu" -#: src/libslic3r/PrintConfig.cpp:1581 +#: 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:2190 +#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41 msgid "Searching for optimal orientation" msgstr "Hledání optimální orientace" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 -msgid "Select All objects" +#: 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:121 +msgid "Select all objects" msgstr "Vybrat všechny objekty" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1236 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217 msgid "Select all points" msgstr "Vybrat všechny body" -#: src/slic3r/GUI/ConfigWizard.cpp:1089 +#: src/slic3r/GUI/ConfigWizard.cpp:2487 msgid "Select all standard printers" msgstr "Vybrat všechny standardní tiskárny" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1234 +#: 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:806 src/slic3r/GUI/MainFrame.cpp:870 +#: 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:60 +#: 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:2834 -msgid "Select extruder number for selected objects and/or parts" -msgstr "Vyberte číslo extruderu pro vybrané objekty a / nebo části" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2847 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4458 msgid "Select extruder number:" msgstr "Vyberte číslo extruderu:" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 msgid "Select Filament Settings Tab" msgstr "Zobrazit panel Nastavení filamentu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1251 -msgid "Select new extruder for the object/part" -msgstr "Vyberte nový extruder pro objekt/část" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 msgid "Select Plater Tab" msgstr "Zobrazit panel Podložka" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 msgid "Select Print Settings Tab" msgstr "Zobrazit panel Nastavení tisku" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 msgid "Select Printer Settings Tab" msgstr "Zobrazit panel Nastavení tiskárny" -#: src/slic3r/GUI/GUI_ObjectList.cpp:917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1396 msgid "Select showing settings" msgstr "Zvolte nastavení zobrazení" -#: src/slic3r/GUI/GUI_App.cpp:524 +#: 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:744 +#: src/slic3r/GUI/MainFrame.cpp:1590 msgid "Select the STL file to repair:" msgstr "Vyberte STL soubor k opravě:" -#: src/slic3r/GUI/Preferences.cpp:207 +#: 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:2545 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 msgid "Select type of part" msgstr "Vyberte typ součásti" -#: src/slic3r/GUI/Plater.cpp:606 +#: 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:421 +#: 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/Selection.cpp:146 +#: src/slic3r/GUI/DoubleSlider.cpp:2135 +msgid "" +"Select YES if you want to delete all saved tool changes, \n" +"NO if you want all tool changes switch to color changes, \n" +"or CANCEL to leave it unchanged." +msgstr "" +"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/Selection.cpp:191 msgid "Selection-Add" msgstr "Výběř - Přidání" -#: src/slic3r/GUI/Selection.cpp:384 +#: src/slic3r/GUI/Selection.cpp:421 msgid "Selection-Add All" msgstr "Výběr - Označení všeho" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 +#: 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:5623 +#: 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:410 +#: src/slic3r/GUI/Selection.cpp:447 msgid "Selection-Remove All" msgstr "Výběr - Zrušení" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2867 +#: 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:5642 +#: 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:444 +#: src/slic3r/GUI/MainFrame.cpp:1172 msgid "Selects all objects" msgstr "Vybrat všechny objekty" -#: src/slic3r/GUI/Plater.cpp:3822 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Plater.cpp:5707 msgid "Send G-code" msgstr "Odeslat G-code" @@ -5492,27 +7608,35 @@ msgstr "Odeslat G-code" msgid "Send G-Code to printer host" msgstr "Odeslat G-Code do tiskového serveru" -#: src/slic3r/GUI/MainFrame.cpp:466 +#: 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:731 src/slic3r/GUI/Plater.cpp:3822 +#: src/slic3r/GUI/Plater.cpp:753 src/slic3r/GUI/Plater.cpp:5707 msgid "Send to printer" msgstr "Odeslat do tiskárny" -#: src/slic3r/GUI/Tab.cpp:1169 +#: src/slic3r/GUI/Plater.cpp:753 +msgid "Send to printer " +msgstr "Odeslat do tiskárny" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1312 +msgid "Seq." +msgstr "Sekv." + +#: src/slic3r/GUI/Tab.cpp:1561 msgid "Sequential printing" msgstr "Sekvenční tisk" -#: src/slic3r/GUI/Tab.cpp:1874 src/libslic3r/PrintConfig.cpp:1591 -msgid "Serial port" -msgstr "Sériový port" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:235 +msgid "Sequential Slider" +msgstr "Sekvenční posuvník" -#: src/libslic3r/PrintConfig.cpp:1599 -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:769 +#: src/slic3r/GUI/FirmwareDialog.cpp:807 msgid "Serial port:" msgstr "Sériový port:" @@ -5520,642 +7644,810 @@ msgstr "Sériový port:" msgid "Service name" msgstr "Název služby" -#: src/slic3r/GUI/Tab.cpp:1824 src/slic3r/GUI/Tab.cpp:2025 -#: src/slic3r/GUI/Tab.cpp:3008 +#: src/slic3r/GUI/Tab.cpp:3509 src/slic3r/GUI/Tab.cpp:3588 msgid "Set" msgstr "Nastavit" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1192 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +#: 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:1331 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1740 msgid "Set as a Separated Objects" msgstr "Převést na oddělené objekty" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +msgid "Set extruder change for every" +msgstr "Nastavit změnu extruderu po každých" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1800 msgid "Set extruder for selected items" msgstr "Zvolte extruder pro vybrané položky" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 +msgid "Set extruder sequence" +msgstr "Nastavte pořadí extruderu" + +#: src/slic3r/GUI/DoubleSlider.cpp:1728 +msgid "Set extruder sequence for the entire print" +msgstr "Nastavení sekvence extruderů pro celý tisk" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "Nastavte pořadí extruderu(nástroje)" + +#: 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:245 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305 msgid "Set Mirror" msgstr "Zrcadlení" -#: src/slic3r/GUI/Plater.cpp:3520 +#: src/slic3r/GUI/Plater.cpp:3862 msgid "Set number of instances" msgstr "Zadat počet instancí" -#: src/slic3r/GUI/Plater.cpp:4163 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:4860 +#, c-format msgid "Set numbers of copies to %d" msgstr "Nastavení počtu kopií na %d" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:746 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828 msgid "Set Orientation" msgstr "Změna orientace" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:715 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797 msgid "Set Position" msgstr "Nastavení pozice" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3759 +#: 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:1482 +#: src/slic3r/GUI/Selection.cpp:1515 msgid "Set Printable Instance" msgstr "Zvolen příznak Tisknout Instanci" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893 msgid "Set Scale" msgstr "Nastavení měřítka" -#: src/libslic3r/PrintConfig.cpp:2228 +#: 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:527 +#: 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:524 +#: 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." -#: src/libslic3r/PrintConfig.cpp:417 +#: 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:831 +#: 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í." -#: src/libslic3r/PrintConfig.cpp:1689 +#: 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:2019 +#: 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:963 +#: 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." -#: src/libslic3r/PrintConfig.cpp:1350 +#: 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:1862 +#: 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:480 +#: 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." -#: src/libslic3r/PrintConfig.cpp:65 +#: src/libslic3r/PrintConfig.cpp:81 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:469 +#: 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:3759 +#: 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:1482 +#: src/slic3r/GUI/Selection.cpp:1515 msgid "Set Unprintable Instance" msgstr "Odebrán příznak Tisknout Instanci" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 msgid "Set upper thumb to current slider thumb" msgstr "Aktivovat horní ukazatel aktivního posuvníku" -#: src/slic3r/GUI/BedShapeDialog.cpp:143 +#: src/libslic3r/PrintConfig.cpp:3714 +msgid "" +"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\n" +"For example. loglevel=2 logs fatal, error and warning level messages." +msgstr "" +"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/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1969 msgid "Settings" msgstr "Nastavení" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2899 msgid "Settings for height range" msgstr "Nastavení pro výškový rozsah" -#: src/slic3r/GUI/BedShapeDialog.cpp:60 +#: 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: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: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: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: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:156 src/slic3r/GUI/BedShapeDialog.cpp:222 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2215 msgid "Shape" msgstr "Tvar" -#: src/slic3r/GUI/GUI_Preview.cpp:246 +#: src/slic3r/GUI/GUI_Preview.cpp:338 src/slic3r/GUI/GUI_Preview.cpp:1478 msgid "Shells" -msgstr "Skořápky" +msgstr "Skořepiny" -#: src/slic3r/GUI/GUI_Preview.cpp:221 +#: 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:245 +msgid "Shift + Right mouse button:" +msgstr "Shift + Pravé tlačítko myši:" + +#: src/slic3r/GUI/GUI_Preview.cpp:286 src/slic3r/GUI/GUI_Preview.cpp:288 msgid "Show" msgstr "Zobrazit" -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325 msgid "Show &Configuration Folder" -msgstr "Otevřít adresář nastavení" +msgstr "Otevřít adresář s &konfiguracemi" -#: src/slic3r/GUI/MainFrame.cpp:563 +#: src/slic3r/GUI/MainFrame.cpp:1294 +msgid "Show &labels" +msgstr "Zobrazit &popisky" + +#: 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" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show advanced settings" msgstr "Zobrazit rozšířená nastavení" -#: src/slic3r/GUI/PrintHostDialogs.cpp:158 +#: src/slic3r/GUI/PrintHostDialogs.cpp:157 msgid "Show error message" msgstr "Zobrazit chybovou hlášku" -#: src/slic3r/GUI/Preferences.cpp:84 +#: 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:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 msgid "Show keyboard shortcuts list" msgstr "Zobrazit přehled klávesových zkratek" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/GCodeViewer.cpp:2591 +msgid "Show normal mode" +msgstr "V normálním režimu" + +#: 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/MainFrame.cpp:557 +#: 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:924 src/slic3r/GUI/MainFrame.cpp:1323 msgid "Show system information" msgstr "Zobrazit systémové informace" -#: src/slic3r/GUI/MainFrame.cpp:487 +#: src/slic3r/GUI/MainFrame.cpp:1234 msgid "Show the 3D editing view" msgstr "Zobrazit 3D editaci" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:1237 msgid "Show the 3D slices preview" msgstr "Zobrazit 3D náhled vrstev" -#: src/slic3r/GUI/MainFrame.cpp:480 +#: src/slic3r/GUI/MainFrame.cpp:1224 msgid "Show the filament settings" msgstr "Zobrazit nastavení filamentu" -#: src/libslic3r/PrintConfig.cpp:2983 +#: 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:2988 +#: 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:566 +#: 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:471 +#: src/slic3r/GUI/MainFrame.cpp:1216 msgid "Show the plater" msgstr "Zobrazit podložku" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:1221 msgid "Show the print settings" msgstr "Zobrazit nastavení tisku" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/slic3r/GUI/MainFrame.cpp:1228 msgid "Show the printer settings" msgstr "Zobrazit nastavení tiskárny" -#: src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:3565 msgid "Show this help." msgstr "Zobrazí tuto nápovědu." -#: src/slic3r/GUI/MainFrame.cpp:559 +#: 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 -msgid "Show/Hide (L)egend" -msgstr "Zobrazit/Skrýt (L)egendu" +#: 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/GUI_App.cpp:674 src/slic3r/GUI/wxExtensions.cpp:2459 +#: 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:141 +msgid "Show/Hide object/instance labels" +msgstr "Zobrazit/skrýt popisky objektů/instancí" + +#: src/slic3r/GUI/GUI_App.cpp:1504 src/slic3r/GUI/wxExtensions.cpp:673 msgid "Simple" msgstr "Jednoduchý" -#: src/slic3r/GUI/GUI_App.cpp:674 +#: src/slic3r/GUI/ConfigWizard.cpp:1179 +msgid "Simple mode" +msgstr "Jednoduchý režim" + +#: src/slic3r/GUI/GUI_App.cpp:1504 msgid "Simple View Mode" msgstr "Jednoduchý režim" -#: src/slic3r/GUI/Tab.cpp:2231 src/slic3r/GUI/Tab.cpp:2239 +#: 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:1767 +#: src/libslic3r/PrintConfig.cpp:1987 msgid "Single Extruder Multi Material" msgstr "MultiMaterial tisk s jedním extrudérem" -#: src/slic3r/GUI/Tab.cpp:2023 -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:2101 +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:2240 +#: src/slic3r/GUI/Tab.cpp:2476 msgid "Single extruder multimaterial parameters" msgstr "Parametry jednoho multi materiálového extruderu" -#: src/slic3r/GUI/BedShapeDialog.cpp:72 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 src/slic3r/GUI/Plater.cpp:137 -#: src/slic3r/GUI/Tab.cpp:2257 +#: 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:1813 src/slic3r/GUI/Tab.cpp:2014 +#: 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:73 +#: 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:235 src/slic3r/GUI/Tab.cpp:1050 -#: src/libslic3r/GCode/PreviewData.cpp:171 +#: 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:1049 +#: src/slic3r/GUI/Tab.cpp:1438 msgid "Skirt and brim" msgstr "Obrys a límec" -#: src/libslic3r/PrintConfig.cpp:1617 +#: src/libslic3r/PrintConfig.cpp:1795 msgid "Skirt height" msgstr "Výška obrysu" -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1811 msgid "Skirt Loops" msgstr "Počet obrysových smyček" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1200 +#: 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:1150 +#: 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:1115 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897 msgid "SLA gizmo turned on" msgstr "Vstup do režimu SLA gizmo" -#: src/slic3r/GUI/Plater.cpp:684 src/slic3r/GUI/Preset.cpp:1277 +#: src/slic3r/GUI/Plater.cpp:693 src/libslic3r/Preset.cpp:1303 msgid "SLA material" msgstr "SLA materiál" -#: src/slic3r/GUI/Plater.cpp:683 src/slic3r/GUI/Preset.cpp:1276 +#: src/slic3r/GUI/ConfigWizard.cpp:2526 +msgid "SLA Material Profiles Selection" +msgstr "Výběr SLA materiálových profilů" + +#: src/libslic3r/PrintConfig.cpp:2613 src/libslic3r/PrintConfig.cpp:2614 +msgid "SLA material type" +msgstr "Typ SLA materiálu" + +#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2526 +msgid "SLA Materials" +msgstr "SLA Materiály" + +#: src/libslic3r/Preset.cpp:1302 msgid "SLA print" msgstr "SLA tisk" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2721 msgid "SLA print material notes" msgstr "Poznámky pro SLA materiál" -#: src/slic3r/GUI/Plater.cpp:690 +#: src/slic3r/GUI/Plater.cpp:692 msgid "SLA print settings" msgstr "Nastavení SLA tisku" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:997 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 msgid "SLA Support Points" msgstr "SLA Podpěrné Body" -#: src/slic3r/GUI/GLCanvas3D.cpp:722 -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/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/ConfigWizard.cpp:1931 +msgid "SLA Technology Printers" +msgstr "Tiskárny technologie SLA" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1563 msgid "Slab" msgstr "Deska" -#: src/libslic3r/PrintConfig.cpp:1268 +#: 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:89 +#: 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:82 +#: 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 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/slic3r/GUI/ConfigSnapshotDialog.cpp:45 -msgid "slic3r version" -msgstr "verze slic3ru" - -#: src/libslic3r/PrintConfig.cpp:1234 +#: 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:2970 +#: src/libslic3r/PrintConfig.cpp:3558 msgid "Slice" msgstr "Slicovat" -#: src/slic3r/GUI/MainFrame.cpp:383 +#: 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:389 +#: 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:71 +#: src/libslic3r/PrintConfig.cpp:89 msgid "Slice gap closing radius" msgstr "Poloměr uzavření mezery v tiskové vrstvě" -#: src/slic3r/GUI/Plater.cpp:734 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3618 +#: 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:2944 +#: 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:2965 +#: 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:2971 +#: 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:193 +#: src/slic3r/GUI/Plater.cpp:222 msgid "Sliced Info" msgstr "Informace o slicování" -#: src/slic3r/GUI/MainFrame.cpp:704 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3615 src/slic3r/GUI/Tab.cpp:1159 -#: src/slic3r/GUI/Tab.cpp:3436 +#: 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:91 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:170 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:219 msgid "Slicing complete" msgstr "Slicování dokončeno" -#: src/libslic3r/SLAPrint.cpp:1459 +#: src/libslic3r/SLAPrint.cpp:780 msgid "Slicing done" msgstr "Slicování dokončeno" -#: src/slic3r/GUI/MainFrame.cpp:729 +#: src/slic3r/GUI/MainFrame.cpp:1575 msgid "Slicing Done!" msgstr "Slicování dokončeno!" -#: src/libslic3r/SLAPrint.cpp:759 +#: 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/SLAPrint.cpp:55 +#: src/libslic3r/SLAPrintSteps.cpp:46 msgid "Slicing model" msgstr "Slicuji model" -#: src/libslic3r/SLAPrint.cpp:59 +#: src/libslic3r/SLAPrintSteps.cpp:50 msgid "Slicing supports" msgstr "Slicování podpěr" -#: src/libslic3r/PrintConfig.cpp:2249 +#: src/libslic3r/PrintConfig.cpp:2557 msgid "Slow" msgstr "Pomalý" -#: src/libslic3r/PrintConfig.cpp:1635 +#: 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:2250 +#: src/libslic3r/PrintConfig.cpp:2558 msgid "Slow tilt" msgstr "Pomalý náklon" -#: src/libslic3r/PrintConfig.cpp:1646 +#: src/libslic3r/PrintConfig.cpp:1830 msgid "Small perimeters" msgstr "Malé perimetry" -#: src/slic3r/GUI/GUI_App.cpp:697 +#: 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:247 +msgid "Smoothing" +msgstr "Vyhlazení" + +#: src/slic3r/GUI/GUI_App.cpp:1540 msgid "Snapshot name" msgstr "Název zálohy" -#: src/slic3r/GUI/MainFrame.cpp:549 +#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310 msgid "Software &Releases" msgstr "Vydané ve&rze" -#: src/slic3r/GUI/PresetHints.cpp:181 +#: src/slic3r/GUI/PresetHints.cpp:183 msgid "solid infill" msgstr "plná výplň" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/PrintConfig.cpp:1687 -#: src/libslic3r/PrintConfig.cpp:1697 src/libslic3r/GCode/PreviewData.cpp:167 +#: 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:1675 +#: src/libslic3r/PrintConfig.cpp:1859 msgid "Solid infill every" msgstr "Plná výplň každou" -#: src/libslic3r/PrintConfig.cpp:1667 +#: src/libslic3r/PrintConfig.cpp:1851 msgid "Solid infill extruder" msgstr "Extruder pro plnou výplň" -#: src/libslic3r/PrintConfig.cpp:1658 +#: src/libslic3r/PrintConfig.cpp:1842 msgid "Solid infill threshold area" msgstr "Prahová hodnota plochy pro plnou výplň" -#: src/slic3r/GUI/Tab.cpp:1014 src/libslic3r/PrintConfig.cpp:1710 +#: src/slic3r/GUI/Tab.cpp:1387 src/libslic3r/PrintConfig.cpp:1895 msgid "Solid layers" msgstr "Plných vrstev" -#: src/libslic3r/PrintConfig.cpp:711 +#: src/libslic3r/PrintConfig.cpp:790 msgid "Soluble material" msgstr "Rozpustný materiál" -#: src/libslic3r/PrintConfig.cpp:712 +#: 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:914 +#: 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:721 -msgid "Some objects are not visible when editing supports" -msgstr "Některé objekty nejsou při úpravách podpěr viditelné" +#: src/slic3r/GUI/Plater.cpp:2309 +#, 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 "" +"Některé objekty v souboru %s se zdá, že jsou uložené v palcích.\n" +"Mám je považovat za uložené v palcích a převést je?" -#: src/libslic3r/Print.cpp:1162 +#: 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:1177 +#: 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:2548 +#: 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:2086 +#: 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:1897 +#: 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:1931 +#: 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:71 src/slic3r/GUI/GUI_ObjectList.cpp:512 -#: src/slic3r/GUI/GUI_Preview.cpp:215 src/slic3r/GUI/Tab.cpp:1084 -#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:426 -#: src/libslic3r/PrintConfig.cpp:871 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1361 src/libslic3r/PrintConfig.cpp:1598 -#: src/libslic3r/PrintConfig.cpp:1647 src/libslic3r/PrintConfig.cpp:1698 -#: src/libslic3r/PrintConfig.cpp:2029 +#: 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:1600 -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:400 +#: src/slic3r/GUI/GCodeViewer.cpp:2238 src/libslic3r/GCode/PreviewData.cpp:356 msgid "Speed (mm/s)" msgstr "Rychlost (mm/s)" -#: src/libslic3r/PrintConfig.cpp:872 +#: 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:1097 +#: src/slic3r/GUI/Tab.cpp:1488 msgid "Speed for non-print moves" msgstr "Netiskové rychlosti" -#: src/libslic3r/PrintConfig.cpp:1362 +#: 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:1085 +#: src/slic3r/GUI/Tab.cpp:1475 msgid "Speed for print moves" msgstr "Rychlosti pohybů tiskárny" -#: src/libslic3r/PrintConfig.cpp:200 +#: src/libslic3r/PrintConfig.cpp:270 msgid "Speed for printing bridges." msgstr "Rychlost pro vytváření mostů." -#: src/libslic3r/PrintConfig.cpp:1699 +#: 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:1906 +#: 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:1940 +#: src/libslic3r/PrintConfig.cpp:2169 msgid "Speed for printing support material." msgstr "Rychlost tisku podpěr." -#: src/libslic3r/PrintConfig.cpp:1000 +#: 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:2030 +#: 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:2052 +#: 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:627 +#: src/libslic3r/PrintConfig.cpp:695 msgid "Speed of the first cooling move" msgstr "Rychlost prvního pohybu chlazení" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:714 msgid "Speed of the last cooling move" msgstr "Rychlost posledního pohybu chlazení" -#: src/libslic3r/PrintConfig.cpp:585 +#: 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:577 +#: 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:593 +#: 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:602 +#: 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/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/Mouse3DController.cpp:279 +msgid "Speed:" +msgstr "Rychlost:" + +#: 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:1717 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Spiral vase" msgstr "Spirálová váza" -#: src/slic3r/GUI/Plater.cpp:2971 src/slic3r/GUI/Plater.cpp:2988 -#: src/slic3r/GUI/Plater.cpp:3008 src/libslic3r/PrintConfig.cpp:3082 +#: src/slic3r/GUI/ConfigManipulation.cpp:89 +msgid "Spiral Vase" +msgstr "Spirálová Váza" + +#: 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:2971 +#: src/slic3r/GUI/Plater.cpp:3939 msgid "Split the selected object" msgstr "Rozdělit vybraný objekt" -#: src/slic3r/GUI/Plater.cpp:2966 src/slic3r/GUI/Plater.cpp:2988 +#: 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:2968 src/slic3r/GUI/Plater.cpp:3008 +#: 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:3490 +#: src/slic3r/GUI/GLCanvas3D.cpp:4916 msgid "Split to objects" msgstr "Rozdělit na objekty" -#: src/slic3r/GUI/Plater.cpp:2796 +#: src/slic3r/GUI/Plater.cpp:2774 msgid "Split to Objects" msgstr "Rozdělit na Objekty" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1110 +#: 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:1904 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2440 msgid "Split to Parts" msgstr "Rozdělit na Části" -#: src/libslic3r/PrintConfig.cpp:799 +#: src/slic3r/GUI/ConfigWizard.cpp:307 +msgid "Standard" +msgstr "Běžné" + +#: src/libslic3r/PrintConfig.cpp:884 msgid "Stars" msgstr "Hvězdy" -#: src/slic3r/GUI/MainFrame.cpp:376 +#: 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:1564 src/slic3r/GUI/Tab.cpp:1949 -#: src/libslic3r/PrintConfig.cpp:1736 src/libslic3r/PrintConfig.cpp:1751 +#: 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:403 +#: src/slic3r/GUI/MainFrame.cpp:1133 msgid "Start new slicing process" msgstr "Zahájit nový slicovací proces" @@ -6163,971 +8455,1391 @@ msgstr "Zahájit nový slicovací proces" msgid "Start printing after upload" msgstr "Spustit tisk po nahrání" -#: src/slic3r/GUI/PrintHostDialogs.cpp:150 +#: 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" +"\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 "" +"Počínaje %1% 2.3 se konfigurační adresář v systému Linux změnil (podle specifikace XDG Base Directory) na %2%.\n" +"\n" +"Tento adresář ještě neexistoval (možná používáte novou verzi poprvé).\n" +"Byl však zjištěn starý konfigurační adresář %1% v\n" +"%3%.\n" +"\n" +"Zvažte přesunutí obsahu starého adresáře do nového umístění za účelem přístupu k vašim profilům atd.\n" +"Pamatujte, že pokud se v budoucnu rozhodnete %1% downgradovat, použije znovu staré umístění.\n" +"\n" +"Co chcete udělat?" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:149 msgid "Status" msgstr "Stav" -#: src/slic3r/GUI/FirmwareDialog.cpp:782 +#: src/slic3r/GUI/FirmwareDialog.cpp:820 msgid "Status:" msgstr "Stav:" -#: src/slic3r/GUI/Tab.cpp:2158 +#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2378 msgid "Stealth" msgstr "Tichý" -#: src/slic3r/GUI/Plater.cpp:1084 +#: src/slic3r/GUI/Plater.cpp:1187 src/slic3r/GUI/Plater.cpp:1235 msgid "stealth mode" msgstr "tichý režim" -#: src/slic3r/GUI/Plater.cpp:3545 -#, possible-c-format +#: src/slic3r/GUI/GCodeViewer.cpp:2557 +msgid "Stealth mode" +msgstr "Tichý režim" + +#: src/slic3r/GUI/Plater.cpp:5118 +#, 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:1716 src/slic3r/GUI/Tab.cpp:1901 +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:295 msgid "Success!" msgstr "Úspěch!" -#: src/slic3r/GUI/PresetHints.cpp:200 +#: src/slic3r/GUI/Plater.cpp:2047 +#, 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/Gizmos/GLGizmoRotate.cpp:234 +msgid "Suface quality" +msgstr "Kvalita povrchu" + +#: src/slic3r/GUI/PresetHints.cpp:202 msgid "support" msgstr "podpěry" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2856 msgid "Support base diameter" msgstr "Průměr podpěrné základny" -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2866 msgid "Support base height" msgstr "Výška podpěrné základny" -#: src/libslic3r/PrintConfig.cpp:2566 +#: 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:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4014 msgid "Support Blocker" msgstr "Blokátor podpěr" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: 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/Tab.cpp:3401 +#: src/slic3r/GUI/ConfigManipulation.cpp:162 +msgid "Support Generator" +msgstr "Generátor Podpěr" + +#: src/slic3r/GUI/Tab.cpp:4018 msgid "Support head" msgstr "Hrot podpěry" -#: src/libslic3r/PrintConfig.cpp:2369 -msgid "Support head front diameter" -msgstr "Průměr hrotu podpěry" - -#: src/libslic3r/PrintConfig.cpp:2378 -msgid "Support head penetration" -msgstr "Průnik podpěry do modelu" - -#: src/libslic3r/PrintConfig.cpp:2387 -msgid "Support head width" -msgstr "Tloušťka hrotu podpěry" - -#: src/slic3r/GUI/PresetHints.cpp:210 +#: src/slic3r/GUI/PresetHints.cpp:212 msgid "support interface" msgstr "kontaktní vrstva podpěr" -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:70 -#: src/slic3r/GUI/GUI_ObjectList.cpp:511 src/slic3r/GUI/GUI_Preview.cpp:236 -#: src/slic3r/GUI/Tab.cpp:1059 src/slic3r/GUI/Tab.cpp:1060 -#: src/libslic3r/PrintConfig.cpp:334 src/libslic3r/PrintConfig.cpp:1432 -#: src/libslic3r/PrintConfig.cpp:1780 src/libslic3r/PrintConfig.cpp:1786 -#: src/libslic3r/PrintConfig.cpp:1794 src/libslic3r/PrintConfig.cpp:1806 -#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:1824 -#: src/libslic3r/PrintConfig.cpp:1839 src/libslic3r/PrintConfig.cpp:1860 -#: src/libslic3r/PrintConfig.cpp:1871 src/libslic3r/PrintConfig.cpp:1887 -#: src/libslic3r/PrintConfig.cpp:1896 src/libslic3r/PrintConfig.cpp:1905 -#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1930 -#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1939 -#: src/libslic3r/PrintConfig.cpp:1948 src/libslic3r/PrintConfig.cpp:1956 -#: src/libslic3r/PrintConfig.cpp:1970 src/libslic3r/GCode/PreviewData.cpp:172 +#: 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:237 src/libslic3r/PrintConfig.cpp:1904 -#: src/libslic3r/GCode/PreviewData.cpp:173 +#: 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:1957 +#: 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:1877 +#: src/libslic3r/PrintConfig.cpp:2106 msgid "Support material/raft interface extruder" msgstr "Extruder pro kontaktní podpěry/raft" -#: src/libslic3r/PrintConfig.cpp:1851 +#: src/libslic3r/PrintConfig.cpp:2079 msgid "Support material/raft/skirt extruder" msgstr "Extruder pro podpěry/raft/obrys" -#: src/slic3r/GUI/Plater.cpp:423 src/libslic3r/PrintConfig.cpp:1815 -#: src/libslic3r/PrintConfig.cpp:2423 +#: 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:991 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762 msgid "Support parameter change" msgstr "Změna nastavení podpěr" -#: src/slic3r/GUI/Tab.cpp:3406 +#: src/slic3r/GUI/Tab.cpp:4023 msgid "Support pillar" msgstr "Podpěrný pilíř" -#: src/libslic3r/PrintConfig.cpp:2407 -msgid "Support pillar connection mode" -msgstr "Propojení podpěr" - -#: src/libslic3r/PrintConfig.cpp:2397 -msgid "Support pillar diameter" -msgstr "Tloušťka podpěry" - -#: src/libslic3r/PrintConfig.cpp:2499 +#: 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:1282 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048 msgid "Support points edit" msgstr "Úprava podpěrných bodů" -#: src/slic3r/GUI/GUI_ObjectList.cpp:78 src/slic3r/GUI/GUI_ObjectList.cpp:519 -#: src/slic3r/GUI/Plater.cpp:418 src/slic3r/GUI/Tab.cpp:3397 -#: src/slic3r/GUI/Tab.cpp:3398 src/libslic3r/PrintConfig.cpp:2363 -#: src/libslic3r/PrintConfig.cpp:2370 src/libslic3r/PrintConfig.cpp:2379 -#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2398 -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2431 -#: src/libslic3r/PrintConfig.cpp:2442 src/libslic3r/PrintConfig.cpp:2452 -#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2471 -#: src/libslic3r/PrintConfig.cpp:2480 src/libslic3r/PrintConfig.cpp:2490 -#: src/libslic3r/PrintConfig.cpp:2500 src/libslic3r/PrintConfig.cpp:2508 +#: 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:1018 +#: src/slic3r/GUI/Plater.cpp:1103 msgid "supports and pad" msgstr "podpěry a podložka" -#: src/libslic3r/PrintConfig.cpp:1043 +#: src/libslic3r/PrintConfig.cpp:1185 msgid "Supports remaining times" msgstr "Podpora zbývajících tiskových časů" -#: src/libslic3r/PrintConfig.cpp:1053 +#: src/libslic3r/PrintConfig.cpp:1194 msgid "Supports stealth mode" msgstr "Podporuje tichý režim" -#: src/slic3r/GUI/Preferences.cpp:76 +#: 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:104 msgid "Suppress \" - default - \" presets" msgstr "Potlačit “ - výchozí - “ přednastavení" -#: src/slic3r/GUI/Preferences.cpp:78 +#: 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:677 +#: src/slic3r/GUI/MainFrame.cpp:1527 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +#: 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: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:136 msgid "Switch to 3D" msgstr "Přepnout do 3D" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223 msgid "Switch to editing mode" msgstr "Přepnout do režimu editace" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 msgid "Switch to Preview" msgstr "Přepnout do náhledu" -#: src/slic3r/GUI/wxExtensions.cpp:2412 -#, possible-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 +#, c-format msgid "Switch to the %s mode" msgstr "Přepnout do režimu %s" -#: src/slic3r/GUI/GUI_App.cpp:752 -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/UnsavedChangesDialog.cpp:542 +msgid "Switching Presets: Unsaved Changes" +msgstr "Přepnutí na jiné přednastavení: Neuložené změny" -#: src/slic3r/GUI/WipeTowerDialog.cpp:327 -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/GUI_App.cpp:1608 +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/libslic3r/PrintConfig.cpp:1949 +#: 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?" + +#: src/slic3r/GUI/Tab.cpp:1332 +msgid "symbolic profile name" +msgstr "symbolické jméno profilu" + +#: 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:1947 +#: src/libslic3r/PrintConfig.cpp:2176 msgid "Synchronize with object layers" msgstr "Synchronizovat s vrstvami objektu" -#: src/slic3r/GUI/MainFrame.cpp:557 +#: 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:44 +#: src/slic3r/GUI/SysInfoDialog.cpp:90 src/slic3r/GUI/SysInfoDialog.cpp:92 msgid "System Information" msgstr "Systémové informace" -#: src/slic3r/GUI/Preset.cpp:930 src/slic3r/GUI/Preset.cpp:970 -#: src/slic3r/GUI/Preset.cpp:1035 src/slic3r/GUI/Preset.cpp:1067 -#: src/slic3r/GUI/PresetBundle.cpp:1488 src/slic3r/GUI/PresetBundle.cpp:1553 +#: 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:662 +#: src/slic3r/GUI/GUI_App.cpp:1481 msgid "Take Configuration &Snapshot" -msgstr "Prové&st Zálohu Konfigurace" +msgstr "Prové&st Zálohu konfigurace" -#: src/slic3r/GUI/GUI_App.cpp:697 +#: src/slic3r/GUI/GUI_App.cpp:1540 msgid "Taking configuration snapshot" msgstr "Ukládání zálohy nastavení" -#: src/libslic3r/PrintConfig.cpp:1980 +#: src/slic3r/GUI/Tab.cpp:1779 msgid "Temperature" msgstr "Teplota" -#: src/libslic3r/PrintConfig.cpp:1727 +#: 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:1726 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "Temperature variation" msgstr "Kolísání teploty" -#: src/slic3r/GUI/ConfigWizard.cpp:592 +#: src/slic3r/GUI/ConfigWizard.cpp:1383 msgid "Temperatures" msgstr "Teploty" -#: src/slic3r/GUI/Tab.cpp:1700 src/slic3r/GUI/Tab.cpp:1888 +#: 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:171 +#: src/slic3r/GUI/BedShapeDialog.cpp:315 msgid "Texture" msgstr "Textura" -#: src/slic3r/GUI/FirmwareDialog.cpp:530 -#, possible-c-format +#: 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 msgid "The %s device could not have been found" msgstr "Zařízení %s nebylo nalezeno" -#: src/slic3r/GUI/FirmwareDialog.cpp:417 -#, 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 ..." +#: 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 "Zařízení %s nebylo nalezeno. Pokud je zařízení připojeno, stiskněte tlačítko Reset vedle USB konektoru ..." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 -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." +#: 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: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 "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:2462 +#: 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:670 +#: 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:457 +#: 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:955 +#: 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:1341 +#: 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:1669 +#: 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:1879 +#: 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:1853 +#: 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:695 +#: 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:3105 +#: 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:1054 +#: src/libslic3r/PrintConfig.cpp:1195 msgid "The firmware supports stealth mode" msgstr "Firmware podporuje tichý režim" -#: src/libslic3r/PrintConfig.cpp:351 +#: 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:2726 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2813 src/slic3r/GUI/Tab.cpp:3279 +#: 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/Tab.cpp:3311 +#: 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/UnsavedChangesDialog.cpp:1004 +msgid "The following presets were modified:" +msgstr "Byla upravena následující přednastavení:" + +#: 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/SavePresetDialog.cpp:125 msgid "the following suffix is not allowed:" msgstr "následující přípona není povolená:" -#: src/libslic3r/PrintConfig.cpp:2702 +#: 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:2453 +#: src/libslic3r/PrintConfig.cpp:2868 msgid "The height of the pillar base cone" msgstr "Výška ukotvení podpěrného kužele" -#: src/libslic3r/PrintConfig.cpp:2481 +#: 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: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: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: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:2472 +#: src/libslic3r/PrintConfig.cpp:2900 msgid "The max length of a bridge" msgstr "Maximální délka přemostění" -#: src/libslic3r/PrintConfig.cpp:2569 +#: 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:2176 +#: src/slic3r/GUI/SavePresetDialog.cpp:142 +msgid "The name cannot be empty." +msgstr "Název nesmí být prázdný." + +#: 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: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/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:1433 +#: 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:2259 -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/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/slic3r/GUI/GUI_App.cpp:831 -msgid "The presets on the following tabs were modified" -msgstr "Byla upravena přednastavení na následujících kartách" +#: src/libslic3r/PrintConfig.cpp:2567 +msgid "" +"The percentage of the bed area. \n" +"If the print area exceeds the specified value, \n" +"then a slow tilt will be used, otherwise - a fast tilt" +msgstr "" +"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:1768 +#: 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/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/slic3r/GUI/BedShapeDialog.cpp:342 +#: 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: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/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:346 +#: 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:2271 +#: 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:1737 src/slic3r/GUI/Plater.cpp:2279 +#: 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:410 -msgid "The selected project is no more available" -msgstr "Vybraný projekt již není dostupný" +#: src/slic3r/GUI/MainFrame.cpp:1003 +msgid "" +"The selected project is no longer available.\n" +"Do you want to remove it from the recent projects list?" +msgstr "" +"Vybraný projekt již není k dispozici.\n" +"Chcete ho odstranit ze seznamu posledních projektů?" -#: src/libslic3r/PrintConfig.cpp:2570 +#: src/slic3r/GUI/DoubleSlider.cpp:1121 +msgid "" +"The sequential print is on.\n" +"It's impossible to apply any custom G-code for objects printing 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/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: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:1544 +#: 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:1536 +#: 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/libslic3r/Print.cpp:1187 +#: src/slic3r/GUI/ConfigManipulation.cpp:80 +#, 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:1263 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:1189 +#: 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:2900 +#: 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:3287 +#: 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:2725 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2812 src/slic3r/GUI/Tab.cpp:3278 -#: src/slic3r/GUI/Tab.cpp:3282 +#: 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:1268 +#: 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:2524 +#: 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:1825 +#: 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:2429 -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/slic3r/GUI/Tab.cpp:2731 +msgid "" +"The Wipe option is not available when using the Firmware Retraction mode.\n" +"\n" +"Shall I disable it in order to enable Firmware Retraction?" +msgstr "" +"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/libslic3r/Print.cpp:1306 +#: 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: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 "" +"Č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/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\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)." +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/libslic3r/Print.cpp:1200 -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: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:1202 +#: 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: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:1225 +#: 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:1227 +#: 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:1229 +#: 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:1223 +#: 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:1155 +#: 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:1258 -msgid "The Wipe tower is only supported if all objects have the same layer height profile" -msgstr "Čistící věž je podporována pouze v případě, že všechny objekty mají stejný výškový profil" +#: 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/slic3r/GUI/UpdateDialogs.cpp:127 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:3543 +msgid "There are active warnings concerning sliced models:\n" +msgstr "Varování týkající se slicovaných modelů:\n" + +#: 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:1155 +msgid "" +"There is a color change for extruder that has not been used before.\n" +"Check your settings to avoid redundant color changes." +msgstr "" +"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:1149 +msgid "" +"There is a color change for extruder that won't be used till the end of print job.\n" +"This code won't be processed during G-code generation." +msgstr "" +"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:1152 +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/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 msgid "This %s version: %s" msgstr "Tento %s verze: %s" -#: src/libslic3r/PrintConfig.cpp:140 +#: src/slic3r/GUI/Tab.cpp:1244 +msgid "" +"This action is not revertable.\n" +"Do you want to proceed?" +msgstr "" +"Tato akce je nevratná.\n" +"Chcete pokračovat?" + +#: 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:2057 -msgid "This custom code is inserted at every extruder change. If you don't leave this empty, you are expected to take care of the toolchange yourself - PrusaSlicer will not output any other G-code to change the filament. You can use placeholder variables for all Slic3r settings as well as [previous_extruder] and [next_extruder], so e.g. the standard toolchange command can be scripted as T[next_extruder]." -msgstr "Tento vlastní kód je vložen při každé změně extruderu. Pokud toto nenecháte prázdné, očekává se, že se o výměnu nástroje postaráte sami - PrusaSlicer nevytvoří žádný jiný G-kód, který by měnil filament. Proměnné zástupných symbolů můžete použít pro všechna nastavení Slic3r, jakož i [previous_extruder] a [next_extruder], např. standardní příkaz výměny nástroje lze skriptovat jako T[next_extruder]." - -#: src/libslic3r/PrintConfig.cpp:1032 +#: 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:129 +#: 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:2057 +#: 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:380 +#: 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:370 +#: 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:1193 src/libslic3r/PrintConfig.cpp:1204 +#: 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:1183 +#: 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:2061 +#: 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:2075 +#: 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.\n" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2848 +#: 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:188 +#: 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." -#: src/libslic3r/PrintConfig.cpp:514 +#: 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." -#: src/libslic3r/PrintConfig.cpp:178 +#: 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:944 +#: 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:1677 +#: 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:1718 +#: src/libslic3r/PrintConfig.cpp:1910 msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, 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/slic3r/GUI/Plater.cpp:1712 -msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?\n" -msgstr "Tento soubor nelze načíst v jednoduchém režimu. Chcete přepnout do pokročilého režimu?\n" +#: 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:1658 -msgid "This file contains several objects positioned at multiple heights. Instead of considering them as multiple objects, should I consider\nthis file as a single object having multiple parts?\n" -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ů?\n" +#: src/slic3r/GUI/Plater.cpp:2319 +msgid "" +"This file contains several objects positioned at multiple heights.\n" +"Instead of considering them as multiple objects, should I consider\n" +"this file as a single object having multiple parts?" +msgstr "" +"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/FirmwareDialog.cpp:313 -#, 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/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:278 +#: 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:448 +#: 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:1468 +#: 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:2093 +#: 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:921 +#: 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:2501 +#: 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:2528 +#: 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:923 +#: src/slic3r/GUI/Tab.cpp:1274 msgid "This is a system preset." msgstr "Toto je systémové přednastavení." -#: src/libslic3r/PrintConfig.cpp:491 src/libslic3r/PrintConfig.cpp:551 +#: 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:300 +#: 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:158 +#: 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." -#: src/libslic3r/PrintConfig.cpp:813 +#: 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:934 +#: 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:1331 +#: src/libslic3r/PrintConfig.cpp:1508 msgid "This is the acceleration your printer will use for perimeters. A high value like 9000 usually gives good results if your hardware is up to the job. Set zero to disable acceleration control for perimeters." msgstr "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:1262 +#: 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:1162 -#, no-c-format +#: src/libslic3r/PrintConfig.cpp:1335 +#, 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:1225 +#: 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/PrintConfig.cpp:2139 +#: 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: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:643 -msgid "This operation is irreversible.\nDo you want to proceed?" -msgstr "Tato operace je nevratná.\nChcete pokračovat?" +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928 +msgid "" +"This operation is irreversible.\n" +"Do you want to proceed?" +msgstr "" +"Tato operace je nevratná.\n" +"Chcete pokračovat?" -#: src/libslic3r/PrintConfig.cpp:1372 +#: 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:1287 +#: 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:980 +#: 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:973 +#: 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:427 +#: 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:1648 +#: 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:989 +#: 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ů." -#: src/libslic3r/PrintConfig.cpp:57 +#: 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 "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:1153 +#: 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:1216 +#: 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:1801 +#: 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:1786 +#: 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:664 +#: 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:2185 +#: 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:2132 +#: 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:118 -#, 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.\n" -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.\n" +#: 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." -#: src/libslic3r/PrintConfig.cpp:2284 +#: 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:1994 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Threads" msgstr "Vlákna" -#: src/libslic3r/PrintConfig.cpp:1995 +#: 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:2052 +#: 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:2053 +#: 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:655 +#: 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:670 +#: 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:2242 +#: src/libslic3r/PrintConfig.cpp:2550 msgid "Time of the fast tilt" msgstr "Doba trvání rychlého náklonu" -#: src/libslic3r/PrintConfig.cpp:2251 +#: src/libslic3r/PrintConfig.cpp:2559 msgid "Time of the slow tilt" msgstr "Doba trvání pomalého náklonu" -#: src/libslic3r/PrintConfig.cpp:610 +#: 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:916 +#: 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:2966 +#: src/slic3r/GUI/Plater.cpp:3934 msgid "To objects" -msgstr "Objektům" +msgstr "Na objekty" -#: src/slic3r/GUI/Plater.cpp:2968 +#: src/slic3r/GUI/Plater.cpp:3936 msgid "To parts" msgstr "Na části" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:212 -#, possible-c-format +#: 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:271 +#, c-format msgid "Toggle %c axis mirroring" msgstr "Přepnout zrcadlení podle osy %c" -#: src/libslic3r/Zipper.cpp:37 +#: src/libslic3r/miniz_extension.cpp:93 msgid "too many files" msgstr "příliš mnoho souborů" -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:315 -#: src/slic3r/GUI/GUI_Preview.cpp:481 src/slic3r/GUI/GUI_Preview.cpp:537 -#: src/slic3r/GUI/GUI_Preview.cpp:713 src/libslic3r/GCode/PreviewData.cpp:404 +#: src/libslic3r/SLAPrintSteps.cpp:192 +msgid "Too many overlapping holes." +msgstr "Příliš mnoho překrývajících se otvorů." + +#: 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" -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" msgstr "Nástroj #" -#: src/slic3r/GUI/Tab.cpp:1973 src/libslic3r/PrintConfig.cpp:2006 +#: 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:1530 +#: 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 -#: src/slic3r/GUI/MainFrame.cpp:522 +#. TRN To be shown in Print Settings "Top solid layers" +#: 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/libslic3r/PrintConfig.cpp:388 +#: 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:449 msgid "Top fill pattern" msgstr "Vzor výplně horní vrstvy" -#: src/slic3r/GUI/PresetHints.cpp:189 +#: src/slic3r/GUI/PresetHints.cpp:321 +msgid "Top is open." +msgstr "Horní část je otevřená." + +#: 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:191 msgid "top solid infill" msgstr "vrchní plná výplň" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/PrintConfig.cpp:2017 -#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/GCode/PreviewData.cpp:168 +#: 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:2046 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "Top solid layers" msgstr "Vrchních plných vrstev" -#: src/slic3r/GUI/MainFrame.cpp:522 +#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279 msgid "Top View" msgstr "Pohled svrchu" -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +#: src/slic3r/GUI/WipeTowerDialog.cpp:285 msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded." msgstr "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." -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 msgid "Total rammed volume" msgstr "Celkový objem rapidní extruze" -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" msgstr "Celkový čas rapidní extruze" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:252 +#: 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/GUI_Preview.cpp:243 src/libslic3r/PrintConfig.cpp:2051 +#: src/slic3r/GUI/Mouse3DController.cpp:282 +#: src/slic3r/GUI/Mouse3DController.cpp:303 +msgid "Translation" +msgstr "Translace" + +#: 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:798 +#: src/libslic3r/PrintConfig.cpp:883 msgid "Triangles" msgstr "Trojúhelníky" -#: src/libslic3r/PrintConfig.cpp:3059 +#: 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:1397 +#: 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/GUI_ObjectList.cpp:2549 +#: src/slic3r/GUI/ConfigWizard.cpp:2524 src/slic3r/GUI/ConfigWizard.cpp:2526 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4016 msgid "Type:" msgstr "Typ:" -#: src/libslic3r/Zipper.cpp:35 +#: src/slic3r/GUI/OpenGLManager.cpp:275 +#, 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/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:3389 src/slic3r/GUI/GLCanvas3D.cpp:3609 -#: src/slic3r/GUI/MainFrame.cpp:559 +#: 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:3497 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:4382 +#, 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:3479 +#: src/slic3r/GUI/GLCanvas3D.cpp:4361 msgid "Undo History" msgstr "Historie operací Zpět" -#: src/libslic3r/Zipper.cpp:59 +#: 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:84 src/slic3r/Utils/Duet.cpp:154 +#: 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/WipeTowerDialog.cpp:234 +#: 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:591 +#: src/libslic3r/PrintConfig.cpp:659 msgid "Unloading speed" msgstr "Rychlost vysunutí" -#: src/libslic3r/PrintConfig.cpp:600 +#: src/libslic3r/PrintConfig.cpp:668 msgid "Unloading speed at the start" msgstr "Počáteční rychlost vysouvání filamentu" -#: src/slic3r/GUI/Tab.cpp:3069 +#: src/slic3r/GUI/Tab.cpp:3693 msgid "UNLOCKED LOCK" msgstr "ODEMČENÝ ZÁMEK" -#: src/slic3r/GUI/Tab.cpp:3362 -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." +#: src/slic3r/GUI/Tab.cpp:3719 +msgid "" +"UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n" +"Click 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:3377 -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/Tab.cpp:3734 +msgid "" +"UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\n" +"Click to reset current value to the system (or default) value." +msgstr "" +"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/GUI_Preview.cpp:245 -msgid "Unretractions" -msgstr "Deretrakce" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +msgid "Unselect gizmo or clear selection" +msgstr "Zrušit gizmo nebo zrušit výběr" -#: src/slic3r/GUI/Tab.cpp:2785 -msgid "Unsaved Changes" -msgstr "Neuložené Změny" - -#: src/slic3r/GUI/GUI_App.cpp:790 -msgid "Unsaved Presets" -msgstr "Neuložená přednastavení" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -msgid "Unselect gizmo / Clear selection" -msgstr "Zrušit gizmo / Zrušit výběr" - -#: src/libslic3r/Zipper.cpp:63 +#: src/libslic3r/miniz_extension.cpp:119 msgid "unsupported central directory size" msgstr "nepodporovaná velikost centrálního adresáře" -#: src/libslic3r/Zipper.cpp:43 +#: src/libslic3r/miniz_extension.cpp:99 msgid "unsupported encryption" msgstr "nepodporované šifrování" -#: src/libslic3r/Zipper.cpp:45 +#: src/libslic3r/miniz_extension.cpp:101 msgid "unsupported feature" msgstr "nepodporovaná funkce" -#: src/libslic3r/Zipper.cpp:41 +#: src/libslic3r/miniz_extension.cpp:97 msgid "unsupported method" msgstr "nepodporovaná metoda" -#: src/libslic3r/Zipper.cpp:53 +#: src/libslic3r/miniz_extension.cpp:109 msgid "unsupported multidisk archive" msgstr "nepodporovaný multidisk archiv" -#: src/slic3r/GUI/GUI_App.cpp:305 +#: src/slic3r/GUI/OpenGLManager.cpp:267 msgid "Unsupported OpenGL version" msgstr "Nepodporovaná verze OpenGL" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2414 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3883 msgid "Unsupported selection" msgstr "Nepodporovaný výběr" -#: src/libslic3r/GCode/PreviewData.cpp:495 -#, possible-c-format +#: src/slic3r/GUI/GCodeViewer.cpp:2183 +msgid "up to" +msgstr "až do" + +#: src/slic3r/GUI/GLCanvas3D.cpp:961 +#, c-format msgid "up to %.2f mm" msgstr "do % .2f mm" -#: src/slic3r/GUI/UpdateDialogs.cpp:30 +#: src/slic3r/GUI/UpdateDialogs.cpp:38 msgid "Update available" msgstr "Je dostupná aktualizace" -#: src/slic3r/GUI/ConfigWizard.cpp:419 src/slic3r/GUI/Preferences.cpp:69 +#: 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:401 +#: src/slic3r/GUI/ConfigWizard.cpp:1120 msgid "Updates" msgstr "Aktualizace" -#: src/slic3r/GUI/ConfigWizard.cpp:426 +#: 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í." @@ -7135,285 +9847,373 @@ msgstr "Aktualizace nejsou nikdy nainstalovány bez vědomí uživatele a nikdy msgid "Upgrade" msgstr "Aktualizovat" -#: src/slic3r/GUI/GUI_App.cpp:685 +#: 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" +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "Na kartě FlashAir není nahrávání povoleno." + #: src/slic3r/GUI/PrintHostDialogs.cpp:33 msgid "Upload to Printer Host with the following filename:" msgstr "Nahrát soubor do tiskového serveru se jménem:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:229 +#: src/slic3r/GUI/PrintHostDialogs.cpp:230 msgid "Uploading" msgstr "Nahrávání" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Upper Layer" msgstr "Vyšší vrstva" -#: src/slic3r/GUI/Tab.cpp:1873 -msgid "USB/Serial connection" -msgstr "USB/Sériové připojení" +#: src/slic3r/GUI/DoubleSlider.cpp:1276 +msgid "Use another extruder" +msgstr "Použít jiný extruder" -#: src/libslic3r/PrintConfig.cpp:1592 -msgid "USB/serial port for printer connection." -msgstr "USB/sériový port pro připojení tiskárny." - -#: src/slic3r/GUI/Preferences.cpp:117 +#: 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:2060 +#: 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/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/libslic3r/PrintConfig.cpp:2515 +#: src/slic3r/GUI/Preferences.cpp:191 +msgid "Use free camera" +msgstr "Scéna v režimu „free camera“" + +#: 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:110 +#: src/slic3r/GUI/Preferences.cpp:184 msgid "Use perspective camera" -msgstr "Perspektivní zobrazení" +msgstr "Perspektivní zobrazení scény" -#: src/libslic3r/PrintConfig.cpp:2067 +#: src/libslic3r/PrintConfig.cpp:2311 msgid "Use relative E distances" msgstr "Použít relativní E vzdálenosti" -#: src/slic3r/GUI/Preferences.cpp:103 +#: 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:508 +#: 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:1807 +#: 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:2074 +#: src/libslic3r/PrintConfig.cpp:2318 msgid "Use volumetric E" msgstr "Použít volumetrickou hodnotu E" -#: src/slic3r/GUI/Plater.cpp:214 +#: src/slic3r/GUI/DoubleSlider.cpp:1298 +msgid "used" +msgstr "použitý" + +#: src/slic3r/GUI/Plater.cpp:243 msgid "Used Filament (g)" msgstr "Použito Filamentu (g)" -#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:1041 +#: 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:213 +#: 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:1015 +#: src/slic3r/GUI/Plater.cpp:1100 msgid "Used Material (ml)" msgstr "Použitý materiál (ml)" -#: src/slic3r/GUI/Plater.cpp:215 +#: 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:974 src/slic3r/GUI/Preset.cpp:1071 -#: src/slic3r/GUI/PresetBundle.cpp:1558 +#: 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:93 +#: src/libslic3r/miniz_extension.cpp:149 msgid "validation failed" msgstr "validace selhala" -#: src/slic3r/GUI/ButtonsDescription.cpp:41 +#: src/slic3r/GUI/ButtonsDescription.cpp:36 msgid "Value is the same as the system value" msgstr "Hodnota je shodná se systémovou hodnotou" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:53 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:2151 +#: 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:2157 +#: 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/ConfigSnapshotDialog.cpp:58 +#: 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:1786 +msgid "Variable layer height - Adaptive" +msgstr "Variabilní výška vrstev - Adaptivní" + +#: 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:1778 +msgid "Variable layer height - Reset" +msgstr "Variabilní výška vrstev - Reset" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1794 +msgid "Variable layer height - Smooth all" +msgstr "Variabilní výška vrstev - Vyhladit vše" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "variants" msgstr "varianty" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 src/slic3r/GUI/Tab.cpp:921 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1289 msgid "vendor" msgstr "prodejce" -#: src/libslic3r/PrintConfig.cpp:880 +#: src/slic3r/GUI/ConfigWizard.cpp:589 +msgid "Vendor:" +msgstr "Prodejce:" + +#: src/libslic3r/PrintConfig.cpp:972 msgid "Verbose G-code" msgstr "Komentáře do G-code" -#: src/slic3r/GUI/AboutDialog.cpp:67 src/slic3r/GUI/MainFrame.cpp:53 +#: src/slic3r/GUI/AboutDialog.cpp:256 src/slic3r/GUI/GUI_App.cpp:239 +#: src/slic3r/GUI/MainFrame.cpp:164 msgid "Version" msgstr "Verze" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 msgid "version" msgstr "verze" -#: src/slic3r/GUI/Tab.cpp:1002 +#: src/slic3r/GUI/Tab.cpp:1375 msgid "Vertical shells" msgstr "Svislé stěny" -#: src/slic3r/GUI/GUI_Preview.cpp:209 +#: src/slic3r/GUI/GUI_Preview.cpp:265 src/slic3r/GUI/GUI_Preview.cpp:271 msgid "View" msgstr "Zobrazení" -#: src/libslic3r/SLAPrint.cpp:857 src/libslic3r/SLAPrint.cpp:867 -#: src/libslic3r/SLAPrint.cpp:915 +#: src/slic3r/GUI/ConfigWizard.cpp:1172 +msgid "View mode" +msgstr "Režim zobrazení" + +#: src/slic3r/GUI/UnsavedChangesDialog.cpp:666 +msgid "" +"Visit \"Preferences\" and check \"%1%\"\n" +"to 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:138 +#: src/slic3r/GUI/Plater.cpp:167 msgid "Volume" msgstr "Obsah" -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 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:1010 +#: 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:216 +#: src/slic3r/GUI/PresetHints.cpp:218 msgid "Volumetric" msgstr "Volumetrický" -#: src/slic3r/GUI/Tab.cpp:1800 +#: 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:216 +#: src/slic3r/GUI/GUI_Preview.cpp:280 msgid "Volumetric flow rate" msgstr "Objemový průtok" -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "Objemový průtok (mm3/s)" +#: src/slic3r/GUI/GCodeViewer.cpp:2240 src/libslic3r/GCode/PreviewData.cpp:360 +msgid "Volumetric flow rate (mm³/s)" +msgstr "Objemový průtok (mm³/s)" #: src/slic3r/GUI/RammingChart.cpp:81 msgid "Volumetric speed" msgstr "Objemová rychlost" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1168 src/slic3r/GUI/GUI.cpp:283 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 +#: src/libslic3r/PrintConfig.cpp:3079 +msgid "Wall thickness" +msgstr "Tloušťka stěny" + +#: 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:294 +#: 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:296 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:445 +#, c-format msgid "Welcome to the %s Configuration Assistant" msgstr "Vítejte v %s Konfiguračním Asistentu" -#: src/slic3r/GUI/ConfigWizard.cpp:298 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:447 +#, c-format msgid "Welcome to the %s Configuration Wizard" msgstr "Vítejte v %s Konfiguračním průvodci" -#: src/slic3r/GUI/Preferences.cpp:86 +#: 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/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:217 +#: 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)." -#: src/libslic3r/PrintConfig.cpp:269 +#: 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:843 +#: 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:1483 +#: 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:1475 +#: 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:1347 +#: 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:1173 +#: 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:1527 +#: 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:1519 +#: 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:3076 +#: src/slic3r/GUI/Tab.cpp:3700 msgid "WHITE BULLET" msgstr "BÍLÁ TEČKA" -#: src/slic3r/GUI/Tab.cpp:3365 +#: 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:3111 +#: 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:3126 +#: 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:214 src/libslic3r/PrintConfig.cpp:2137 +#: src/slic3r/GUI/GUI_Preview.cpp:277 src/libslic3r/PrintConfig.cpp:2381 msgid "Width" msgstr "Šířka" -#: src/libslic3r/GCode/PreviewData.cpp:398 +#: src/slic3r/GUI/GCodeViewer.cpp:2237 src/libslic3r/GCode/PreviewData.cpp:354 msgid "Width (mm)" msgstr "Šířka (mm)" -#: src/libslic3r/PrintConfig.cpp:2389 +#: 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:2138 +#: src/libslic3r/PrintConfig.cpp:2382 msgid "Width of a wipe tower" msgstr "Šířka čistící věže" -#: src/libslic3r/PrintConfig.cpp:2761 +#: 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:2203 +#: src/libslic3r/PrintConfig.cpp:2497 msgid "Width of the display" msgstr "Šířka displeje" @@ -7421,54 +10221,59 @@ msgstr "Šířka displeje" msgid "will always run at %1%%%" msgstr "bude vždy běžet na %1%%%" -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:54 msgid "will be turned off." msgstr "bude vypnut." -#: src/libslic3r/PrintConfig.cpp:2276 +#: 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:2160 +#: src/libslic3r/PrintConfig.cpp:2404 msgid "Wipe into this object" msgstr "Vyčistit do tohoto objektu" -#: src/libslic3r/PrintConfig.cpp:2152 +#: 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:35 src/slic3r/GUI/GUI_ObjectList.cpp:90 -#: src/slic3r/GUI/GUI_ObjectList.cpp:564 src/libslic3r/PrintConfig.cpp:2202 -#: src/libslic3r/PrintConfig.cpp:2210 +#: 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:238 src/slic3r/GUI/Tab.cpp:1130 -#: src/libslic3r/GCode/PreviewData.cpp:174 +#: 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:1043 src/slic3r/GUI/Plater.cpp:1058 +#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160 msgid "wipe tower" msgstr "čistící věž" -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +#: src/slic3r/GUI/ConfigManipulation.cpp:119 +#: src/slic3r/GUI/ConfigManipulation.cpp:139 +msgid "Wipe Tower" +msgstr "Čistící Věž" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" msgstr "Čistící věž - Úprava objemu čištění" -#: src/slic3r/GUI/Tab.cpp:1664 +#: src/slic3r/GUI/Tab.cpp:1834 msgid "Wipe tower parameters" msgstr "Parametry čistící věže" -#: src/libslic3r/PrintConfig.cpp:2144 +#: src/libslic3r/PrintConfig.cpp:2388 msgid "Wipe tower rotation angle" msgstr "Úhel natočení čistící věže" -#: src/libslic3r/PrintConfig.cpp:2170 +#: 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:2092 +#: src/libslic3r/PrintConfig.cpp:2336 msgid "Wipe while retracting" msgstr "Očistit při retrakci" @@ -7476,157 +10281,235 @@ msgstr "Očistit při retrakci" msgid "with a volumetric rate" msgstr "s objemovou rychlostí" -#: src/libslic3r/PrintConfig.cpp:1460 +#: 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:1969 +#: src/libslic3r/PrintConfig.cpp:2198 msgid "With sheath around the support" msgstr "Pouzdro okolo podpěr" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:40 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:83 +#: 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:76 -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/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í:" -#: src/libslic3r/Zipper.cpp:95 +#: src/libslic3r/miniz_extension.cpp:151 msgid "write calledback failed" msgstr "zpětné volání se nezdařilo" -#: src/libslic3r/PrintConfig.cpp:2993 +#: 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:148 +#: src/slic3r/Utils/Duet.cpp:133 msgid "Wrong password" msgstr "Chybné heslo" -#: src/libslic3r/PrintConfig.cpp:2124 +#: 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:1793 +#: 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:1795 +#: 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:2174 +#: src/libslic3r/PrintConfig.cpp:2418 msgid "XY Size Compensation" msgstr "Kompenzace XY rozměrů" -#: src/libslic3r/PrintConfig.cpp:2131 +#: 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:992 +#: src/slic3r/GUI/Plater.cpp:1079 msgid "Yes" msgstr "Ano" -#: src/libslic3r/PrintConfig.cpp:1252 +#: 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:557 +#: 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:1403 +#: 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:2332 +#: 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:324 +#: 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:1295 +#: 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:2538 +#: 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:2243 -msgid "You can't load SLA project if there is at least one multi-part object on the bed" -msgstr "Nemůžete načíst SLA projekt, pokud je na tiskové ploše vícedílný objekt" - -#: src/slic3r/GUI/Plater.cpp:1746 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:2352 +#, 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/GUI_ObjectManipulation.cpp:565 +#: 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: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/GUI_App.cpp:300 +#: src/slic3r/GUI/SavePresetDialog.cpp:277 +msgid "" +"You have selected physical printer \"%1%\" \n" +"with related printer preset \"%2%\"" +msgstr "" +"Vybrali jste fyzickou tiskárnu \"%1%\"\n" +"s 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." -#: src/slic3r/GUI/Preferences.cpp:130 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +msgid "You must install a configuration update." +msgstr "Je nutné nainstalovat aktualizaci konfigurace." + +#: src/slic3r/GUI/Preferences.cpp:299 +#, 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:2415 -#, possible-c-format +#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:468 +msgid "You should to change a name of your printer device. It can't be saved." +msgstr "Měli byste změnit název tiskového zařízení. Nemůže být uloženo." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3884 +#, c-format msgid "You started your selection with %s Item." msgstr "Začali jste výběr s položkou %s." -#: src/slic3r/GUI/MainFrame.cpp:772 +#: 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: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:1612 msgid "Your file was repaired." msgstr "Váš soubor byl opraven." -#: src/slic3r/GUI/Plater.cpp:1874 +#: 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:2184 +#: src/libslic3r/PrintConfig.cpp:2428 msgid "Z offset" msgstr "Odsazení Z" -#: src/libslic3r/PrintConfig.cpp:2416 +#: 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 "" +"Nulová výška první vrstvy není platná.\n" +"\n" +"Výška první vrstvy bude resetována na 0.01." + +#: 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 "" +"Nulová výška vrstvy není platná.\n" +"\n" +"Výška vrstvy bude resetována na 0.01." + +#: src/libslic3r/PrintConfig.cpp:2831 msgid "Zig-Zag" msgstr "Zig-Zag" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/Mouse3DController.cpp:294 +#: src/slic3r/GUI/Mouse3DController.cpp:303 +msgid "Zoom" +msgstr "Zoom" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 msgid "Zoom in" msgstr "Přiblížit" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 msgid "Zoom out" msgstr "Oddálit" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -msgid "Zoom to all objects in scene, if none selected" -msgstr "Pohled na všechny objekty ve scéně, pokud žádný není vybraný" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 msgid "Zoom to Bed" msgstr "Pohled na tiskovou plochu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 -msgid "Zoom to selected object" -msgstr "Pohled na vybraný objekt" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 +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:171 src/libslic3r/PrintConfig.cpp:733 -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:1580 -#: src/libslic3r/PrintConfig.cpp:1808 src/libslic3r/PrintConfig.cpp:1962 -#: src/libslic3r/PrintConfig.cpp:2146 src/libslic3r/PrintConfig.cpp:2463 +#: 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:613 src/slic3r/GUI/ConfigWizard.cpp:627 +#: 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 740f3f0e46..7a3021c301 100644 Binary files a/resources/localization/de/PrusaSlicer.mo and b/resources/localization/de/PrusaSlicer.mo differ diff --git a/resources/localization/de/PrusaSlicer_de.po b/resources/localization/de/PrusaSlicer_de.po index a0cd64007a..e926a61459 100644 --- a/resources/localization/de/PrusaSlicer_de.po +++ b/resources/localization/de/PrusaSlicer_de.po @@ -5,360 +5,468 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: PhraseApp (phraseapp.com)\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/PresetHints.cpp:39 -msgid "\nDuring the other layers, fan" -msgstr "\nWährend der übrigen Schichten, Lüfter" - -#: src/slic3r/GUI/PresetHints.cpp:35 -msgid "\nIf estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%." -msgstr "\nFalls 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/slic3r/GUI/MainFrame.cpp:61 +#: 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:727 +#: src/slic3r/GUI/MainFrame.cpp:872 msgid " was successfully sliced." msgstr " wurde erfolgreich gesliced." -#: src/libslic3r/PrintConfig.cpp:179 src/libslic3r/PrintConfig.cpp:745 -#: src/libslic3r/PrintConfig.cpp:1154 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2260 -#: src/libslic3r/PrintConfig.cpp:2502 +#: 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 msgid "%" msgstr "%" -#: src/libslic3r/GCode/PreviewData.cpp:504 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:963 +#, c-format msgid "%.2f - %.2f mm" msgstr "%.2f - %.2f mm" -#: src/slic3r/GUI/Tab.cpp:2895 -msgid "%1% - Copy" -msgstr "%1% - Kopie" - #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:2958 +#: src/slic3r/GUI/Tab.cpp:3126 msgid "%1% Preset" msgstr "%1% Voreinstellung" -#: src/slic3r/GUI/Plater.cpp:3831 +#: src/slic3r/GUI/Plater.cpp:4400 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:1282 +#: src/libslic3r/Print.cpp:1374 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:228 -#, possible-c-format +#: src/slic3r/GUI/PresetHints.cpp:229 +#, 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:974 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1152 +#, c-format msgid "%d (%d shells)" -msgstr "%d (%d Konturhüllen)" +msgstr "%d (%d Konturhüllen)" -#: src/slic3r/GUI/Plater.cpp:982 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1160 +#, 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:268 -#, possible-c-format +#: src/slic3r/GUI/PresetHints.cpp:270 +#, c-format msgid "%d lines: %.2f mm" msgstr "%d Linien: %.2f mm" -#: src/slic3r/GUI/MainFrame.cpp:894 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:1027 +#, c-format msgid "%d presets successfully imported." msgstr "%d Voreinstellungen erfolgreich importiert." -#: src/slic3r/GUI/MainFrame.cpp:550 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:692 +#, c-format msgid "%s &Website" msgstr "%s &Webseite" -#: src/slic3r/GUI/UpdateDialogs.cpp:113 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:211 +#, c-format msgid "%s configuration is incompatible" msgstr "%s Konfiguration ist nicht kompatibel" -#: src/slic3r/GUI/Field.cpp:136 -#, possible-c-format +#: src/slic3r/GUI/Field.cpp:175 +#, c-format msgid "%s doesn't support percentage" msgstr "%s akzeptiert keine Prozentangaben" #: src/slic3r/GUI/MsgDialog.cpp:73 -#, possible-c-format +#, c-format msgid "%s error" msgstr "%s Fehler" -#: src/slic3r/GUI/ConfigWizard.cpp:336 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:481 +#, c-format msgid "%s Family" msgstr "%s Familie" #: src/slic3r/GUI/MsgDialog.cpp:74 -#, possible-c-format +#, c-format msgid "%s has encountered an error" msgstr "%s ist auf einen Fehler gestoßen" -#: src/slic3r/GUI/GUI_App.cpp:132 -#, 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/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/BackgroundSlicingProcess.cpp:155 -#, possible-c-format +#: 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 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:112 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:308 +#, 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 msgid "%s incompatibility" msgstr "%s-Inkompatibilität" -#: src/slic3r/GUI/UpdateDialogs.cpp:172 -#, 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/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:681 -#, possible-c-format +#: src/slic3r/GUI/GUI_App.cpp:820 +#, c-format msgid "%s View Mode" msgstr "%s Anzeigemodus" -#: src/slic3r/GUI/MainFrame.cpp:563 -#, possible-c-format -msgid "&About %s" -msgstr "Über %s (&A)" +#: 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/GUI_App.cpp:769 +#: src/slic3r/GUI/MainFrame.cpp:705 +#, c-format +msgid "&About %s" +msgstr "Ü&ber %s" + +#: src/slic3r/GUI/GUI_App.cpp:908 msgid "&Configuration" msgstr "&Konfiguration" -#: src/slic3r/GUI/GUI_App.cpp:661 +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "&Configuration Snapshots" -msgstr "Konfigurations-Momentaufnahmen (&C)" +msgstr "Konfi&gurations-Momentaufnahmen" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:588 msgid "&Copy" -msgstr "Kopieren (&C)" +msgstr "&Kopieren" -#: src/slic3r/GUI/MainFrame.cpp:447 +#: src/slic3r/GUI/MainFrame.cpp:572 msgid "&Delete selected" -msgstr "Löschen ausgewählt (&D)" +msgstr "Löschen aus&gewählt" -#: src/slic3r/GUI/MainFrame.cpp:575 +#: src/slic3r/GUI/MainFrame.cpp:722 msgid "&Edit" -msgstr "B&earbeiten" +msgstr "&Bearbeiten" -#: src/slic3r/GUI/MainFrame.cpp:377 +#: src/slic3r/GUI/MainFrame.cpp:506 msgid "&Export" msgstr "&Export" -#: src/slic3r/GUI/MainFrame.cpp:480 src/slic3r/GUI/MainFrame.cpp:604 +#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:752 msgid "&Filament Settings Tab" msgstr "&Filamenteinstellungen" -#: src/slic3r/GUI/MainFrame.cpp:574 +#: src/slic3r/GUI/MainFrame.cpp:721 msgid "&File" msgstr "&Datei" -#: src/slic3r/GUI/ConfigWizard.cpp:1094 +#: src/slic3r/GUI/ConfigWizard.cpp:1981 msgid "&Finish" msgstr "&Beenden" -#: src/slic3r/GUI/MainFrame.cpp:580 +#: src/slic3r/GUI/MainFrame.cpp:727 msgid "&Help" msgstr "&Hilfe" -#: src/slic3r/GUI/MainFrame.cpp:359 +#: src/slic3r/GUI/MainFrame.cpp:474 msgid "&Import" msgstr "&Import" -#: src/slic3r/GUI/MainFrame.cpp:376 +#: src/slic3r/GUI/GUI_App.cpp:822 +msgid "&Language" +msgstr "Sp&rache" + +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "&New Project" msgstr "&Neues Projekt" -#: src/slic3r/GUI/ConfigWizard.cpp:1093 +#: src/slic3r/GUI/ConfigWizard.cpp:1980 msgid "&Next >" msgstr "&Weiter >" -#: src/slic3r/GUI/MainFrame.cpp:339 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "&Open Project" msgstr "Pr&ojekt öffnen" -#: src/slic3r/GUI/MainFrame.cpp:456 +#: src/slic3r/GUI/MainFrame.cpp:591 msgid "&Paste" -msgstr "Einfügen (&P)" +msgstr "Ei&nfügen" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "&Plater Tab" msgstr "Druck&platte" -#: src/slic3r/GUI/GUI_App.cpp:665 +#: src/slic3r/GUI/GUI_App.cpp:804 msgid "&Preferences" -msgstr "Einstellungen (&P)" +msgstr "&Einstellungen" -#: src/slic3r/GUI/MainFrame.cpp:409 +#: src/slic3r/GUI/MainFrame.cpp:540 msgid "&Quit" msgstr "&Beenden" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/MainFrame.cpp:583 msgid "&Redo" msgstr "&Redo" -#: src/slic3r/GUI/MainFrame.cpp:406 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "&Repair STL file" msgstr "STL-Datei &reparieren" -#: src/slic3r/GUI/MainFrame.cpp:341 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "&Save Project" msgstr "Projekt &sichern" -#: src/slic3r/GUI/MainFrame.cpp:444 +#: src/slic3r/GUI/MainFrame.cpp:565 msgid "&Select all" msgstr "Alle&s auswählen" -#: src/slic3r/GUI/MainFrame.cpp:558 +#: src/slic3r/GUI/MainFrame.cpp:580 msgid "&Undo" msgstr "&Undo" -#: src/slic3r/GUI/MainFrame.cpp:577 +#: src/slic3r/GUI/MainFrame.cpp:724 msgid "&View" msgstr "&Anzeige" -#: src/slic3r/GUI/MainFrame.cpp:576 +#: src/slic3r/GUI/MainFrame.cpp:723 msgid "&Window" msgstr "&Fenster" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631 +msgid "(All)" +msgstr "(Alles)" + +#: src/libslic3r/PrintConfig.cpp:1446 msgid "(minimum)" msgstr "(Minimum)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 msgid "(Re)slice" msgstr "(Re)Slice" -#: src/slic3r/GUI/MainFrame.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "(Re)Slice No&w" -msgstr "(Re)Slice jetzt (&w)" +msgstr "(Re)Slice jet&zt" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587 +msgid "(Unknown)" +msgstr "(Unbekannt)" + +#: src/slic3r/GUI/MainFrame.cpp:790 msgid ") not found." msgstr ") nicht gefunden." -#: src/libslic3r/PrintConfig.cpp:1857 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "0 (soluble)" msgstr "0 (löslich)" -#: src/libslic3r/PrintConfig.cpp:1858 +#: src/libslic3r/PrintConfig.cpp:1919 msgid "0.2 (detachable)" msgstr "0,2 (lösbar)" -#: src/slic3r/GUI/MainFrame.cpp:487 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/Plater.cpp:3074 +#: src/slic3r/GUI/Plater.cpp:4097 msgid "3D editor view" msgstr "3D Editiermodus" -#: src/libslic3r/PrintConfig.cpp:804 +#: src/libslic3r/PrintConfig.cpp:851 msgid "3D Honeycomb" msgstr "3D Bienenwabe" -#: src/slic3r/GUI/Plater.cpp:3590 -#, possible-c-format +#: src/slic3r/GUI/Mouse3DController.cpp:274 +msgid "3Dconnexion settings" +msgstr "3Dconnexion Einstellungen" + +#: src/slic3r/GUI/Plater.cpp:5038 +#, c-format msgid "3MF file exported to %s" msgstr "3MF Datei exportiert nach %s" -#: src/slic3r/GUI/ConfigWizard.cpp:1092 +#: src/slic3r/GUI/ConfigWizard.cpp:1979 msgid "< &Back" msgstr "< &Zurück" -#: src/libslic3r/PrintConfig.cpp:251 +#: src/libslic3r/PrintConfig.cpp:287 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:236 +#: src/libslic3r/PrintConfig.cpp:272 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/ConfigWizard.cpp:609 +#: src/slic3r/GUI/Tab.cpp:975 +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 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:623 +#: src/slic3r/GUI/ConfigWizard.cpp:1048 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 Bett vorhanden ist." +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:721 +#: 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/AboutDialog.cpp:35 -#, possible-c-format +#: src/slic3r/GUI/AboutDialog.cpp:199 +#, c-format msgid "About %s" msgstr "Über %s" -#: src/libslic3r/GCode/PreviewData.cpp:499 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:959 +#, c-format msgid "above %.2f mm" msgstr "oberhalb %.2f mm" -#: src/libslic3r/PrintConfig.cpp:1499 +#: src/libslic3r/PrintConfig.cpp:1569 msgid "Above Z" msgstr "Über Z" -#: src/slic3r/GUI/Tab.cpp:1103 +#: src/slic3r/GUI/Tab.cpp:1164 msgid "Acceleration control (advanced)" msgstr "Beschleunigungskontrolle (fortgeschritten)" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:73 +#: src/libslic3r/PrintConfig.cpp:2925 +msgid "Accuracy" +msgstr "Genauigkeit" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 msgid "Activate" msgstr "Aktivieren" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:39 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 msgid "Active" msgstr "Aktiv" -#: src/slic3r/GUI/Preset.cpp:1003 src/slic3r/GUI/Tab.cpp:237 +#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1705 +msgid "active" +msgstr "aktiv" + +#: src/slic3r/GUI/GLCanvas3D.cpp:267 +msgid "Adaptive" +msgstr "Adaptiv" + +#: src/slic3r/GUI/Tab.cpp:241 msgid "Add a new printer" msgstr "Neuen Drucker hinzufügen" -#: src/libslic3r/PrintConfig.cpp:2517 +#: src/libslic3r/PrintConfig.cpp:2782 msgid "Add a pad underneath the supported model" msgstr "Fügt eine Grundschicht unter das gestützte Modell" -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2058 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 das Stützmaterial 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ützstrukturen zuverlässiger, aber auch schwieriger zu entfernen." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/DoubleSlider.cpp:991 +msgid "Add another code - Ctrl + Left click" +msgstr "Weiteren Code hinzufügen - Strg + Linksklick" + +#: src/slic3r/GUI/DoubleSlider.cpp:992 +msgid "Add another code - Right click" +msgstr "Weiteren Code hinzufügen - Rechtsklick" + +#: src/slic3r/GUI/DoubleSlider.cpp:1477 +msgid "Add color change" +msgstr "Farbwechsel hinzufügen" + +#: src/slic3r/GUI/DoubleSlider.cpp:1180 +msgid "Add color change (%1%) for:" +msgstr "Farbwechsel (%1%) hinzufügen für:" + +#: src/slic3r/GUI/DoubleSlider.cpp:988 +msgid "Add color change - Left click" +msgstr "Farbwechsel hinzufügen - Linksklick" + +#: src/slic3r/GUI/DoubleSlider.cpp:986 +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 msgid "Add color change marker for current layer" msgstr "Fügt einen Farbwechselmarker der aktuellen Schicht hinzu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1662 +#: src/slic3r/GUI/DoubleSlider.cpp:1490 +msgid "Add custom G-code" +msgstr "Benutzerdefinierten G-Code hinzufügen" + +#: src/slic3r/GUI/GLCanvas3D.cpp:240 +msgid "Add detail" +msgstr "Detail hinzufügen" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:421 +msgid "Add drainage hole" +msgstr "Drainageloch hinzufügen" + +#: src/slic3r/GUI/DoubleSlider.cpp:984 +msgid "Add extruder change - Left click" +msgstr "Extruderwechsel hinzufügen - Linksklick" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 +msgid "Add extruder to sequence" +msgstr "Extruder zur Sequenz hinzufügen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1993 msgid "Add Generic Subobject" msgstr "Generische Subobjekt hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2584 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2613 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2896 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2925 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 msgid "Add Height Range" msgstr "Höhenbereich hinzufügen" -#: src/slic3r/GUI/GLCanvas3D.cpp:3463 +#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3788 +#: src/slic3r/GUI/Plater.cpp:3800 src/slic3r/GUI/Plater.cpp:3940 msgid "Add instance" msgstr "Kopie hinzufügen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Add Instance of the selected object" msgstr "Kopie des gewählten Objektes hinzufügen" @@ -366,415 +474,465 @@ msgstr "Kopie des gewählten Objektes hinzufügen" msgid "Add layer range" msgstr "Schichtbereich hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1950 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2328 msgid "Add Layers" msgstr "Schichten hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 msgid "Add modifier" msgstr "Modifizierer hinzufügen" -#: src/libslic3r/PrintConfig.cpp:447 +#: src/libslic3r/PrintConfig.cpp:479 #, no-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. Slic3r fügt immer wieder Perimeter hinzu, bis mehr als 70% der unmittelbar darüber liegenden Schleife unterstützt werden." +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:3516 +#: src/slic3r/GUI/Plater.cpp:3940 msgid "Add one more instance of the selected object" msgstr "Eine weitere Kopie des gewählten Objekts hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1066 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1082 +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 msgid "Add part" msgstr "Teil hinzufügen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/DoubleSlider.cpp:1487 +msgid "Add pause print" +msgstr "Druckpause hinzufügen" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 msgid "Add point" msgstr "Punkt hinzufügen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1232 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 msgid "Add point to selection" msgstr "Punkt zur Auswahl hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1118 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 msgid "Add settings" msgstr "Einstellungen hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1252 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 msgid "Add Settings Bundle for Height range" msgstr "Höhenbreich Einstellungsbündel hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1191 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1388 msgid "Add Settings Bundle for Object" msgstr "Objekt Einstellungsbündel hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1190 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1387 msgid "Add Settings Bundle for Sub-object" msgstr "Subobjekt Einstellungsbündel hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1126 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1314 msgid "Add Settings for Layers" msgstr "Schichten Einstellungen hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1128 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 msgid "Add Settings for Object" msgstr "Objekt Einstellungen hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1315 msgid "Add Settings for Sub-object" msgstr "Subobjekt Einstellungen hinzufügen" -#: src/libslic3r/PrintConfig.cpp:382 -msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)." -msgstr "Fügen Sie stabiles Infill in der Nähe von schrägen Flächen hinzu, um die vertikale Schalenstärke zu gewährleisten (obere und untere massive Schichten)." +#: src/slic3r/GUI/GUI_ObjectList.cpp:1793 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2051 +msgid "Add Shape" +msgstr "Form hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1069 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1089 +#: src/libslic3r/PrintConfig.cpp:409 +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)." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 msgid "Add support blocker" msgstr "Stützblocker hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1068 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1086 +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 msgid "Add support enforcer" msgstr "Stützverstärker hinzufügen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:531 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:494 msgid "Add support point" msgstr "Stützpunkt hinzufügen" -#: src/slic3r/GUI/GLCanvas3D.cpp:3392 +#: src/slic3r/GUI/GLCanvas3D.cpp:4467 msgid "Add..." msgstr "Hinzufügen..." -#: src/slic3r/GUI/wxExtensions.cpp:2571 -msgid "Add/Del color change" -msgstr "Farbwechsel hinzufügen/löschen" +#: src/slic3r/GUI/PresetBundle.cpp:1704 +msgid "Add/Remove filaments" +msgstr "Filamente hinzufügen/entfernen" -#: src/slic3r/GUI/Tab.cpp:920 +#: src/slic3r/GUI/Preset.cpp:1201 +msgid "Add/Remove materials" +msgstr "Materialien hinzufügen/entfernen" + +#: src/slic3r/GUI/Preset.cpp:1203 +msgid "Add/Remove printers" +msgstr "Drucker hinzufügen/entfernen" + +#: src/slic3r/GUI/Tab.cpp:970 msgid "Additional information:" msgstr "Weitere Informationen:" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59 msgid "Additional Settings" msgstr "Zusätzliche Einstellungen" -#: src/slic3r/GUI/ConfigWizard.cpp:431 +#: src/slic3r/GUI/ConfigWizard.cpp:791 msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied." -msgstr "Zusätzlich wird ein Momentaufnahme der gesamten Konfiguration als Sicherung erstellt, bevor ein Update durchgeführt wird." +msgstr "Zusätzlich wird eine Momentaufnahme der gesamten Konfiguration als Sicherung erstellt, bevor ein Update durchgeführt wird." #: src/slic3r/GUI/BonjourDialog.cpp:72 msgid "Address" msgstr "Adresse" -#: src/slic3r/GUI/GUI_App.cpp:675 src/slic3r/GUI/GUI_ObjectList.cpp:76 -#: src/slic3r/GUI/GUI_ObjectList.cpp:517 src/slic3r/GUI/Tab.cpp:1026 -#: src/slic3r/GUI/Tab.cpp:1041 src/slic3r/GUI/Tab.cpp:1139 -#: src/slic3r/GUI/Tab.cpp:1142 src/slic3r/GUI/Tab.cpp:1515 -#: src/slic3r/GUI/Tab.cpp:1940 src/slic3r/GUI/Tab.cpp:3435 -#: src/slic3r/GUI/wxExtensions.cpp:2460 src/libslic3r/PrintConfig.cpp:72 -#: src/libslic3r/PrintConfig.cpp:187 src/libslic3r/PrintConfig.cpp:350 -#: src/libslic3r/PrintConfig.cpp:988 src/libslic3r/PrintConfig.cpp:2175 +#: 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 msgid "Advanced" msgstr "Erweiterte Einstellungen" -#: src/slic3r/GUI/GUI_App.cpp:675 +#: src/slic3r/GUI/ConfigWizard.cpp:821 +msgid "Advanced mode" +msgstr "Fortgeschrittener Modus" + +#: src/slic3r/GUI/GUI_App.cpp:814 msgid "Advanced View Mode" msgstr "Erweiterter Anzeigemodus" -#: src/slic3r/GUI/FirmwareDialog.cpp:803 +#: src/slic3r/GUI/FirmwareDialog.cpp:841 msgid "Advanced: Output log" msgstr "Fortgeschritten: Ausgabeprotokoll" -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:668 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 Slic3r immer diese Materialmenge in den Wischturm leiten, um aufeinanderfolgende Füll- oder Opferobjekt-Extrusionen zuverlässig herzustellen." +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:1967 src/libslic3r/PrintConfig.cpp:1031 +#: src/slic3r/GUI/Tab.cpp:1994 src/libslic3r/PrintConfig.cpp:1080 msgid "After layer change G-code" msgstr "G-Code am Schichtende" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3398 msgid "Align the model to the given point." msgstr "Das Modell auf den angegebenen Punkt ausrichten." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3397 msgid "Align XY" msgstr "Ausrichten von XY" -#: src/libslic3r/PrintConfig.cpp:1561 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "Aligned" msgstr "Ausgerichtet" -#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:2986 +#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573 +#: src/slic3r/GUI/Tab.cpp:3174 msgid "All" msgstr "Alle" -#: src/libslic3r/Print.cpp:1135 +#: src/libslic3r/Print.cpp:1219 msgid "All objects are outside of the print volume." -msgstr "Alle Objekte befinden sich ausserhalb des Druckraums." +msgstr "Alle Objekte befinden sich außerhalb des Druckraums." -#: src/slic3r/GUI/Plater.cpp:3298 -msgid "All objects will be removed, continue ?" +#: src/slic3r/GUI/Plater.cpp:4669 +msgid "All objects will be removed, continue?" msgstr "Alle Objekte werden entfernt, fortfahren?" -#: src/slic3r/GUI/ConfigWizard.cpp:188 +#: src/slic3r/GUI/ConfigWizard.cpp:289 msgid "All standard" msgstr "Alles standard" -#: src/libslic3r/Zipper.cpp:65 +#: src/libslic3r/Zipper.cpp:62 msgid "allocation failed" msgstr "Allokation fehlgeschlagen" -#: src/slic3r/GUI/Plater.cpp:2939 +#: src/slic3r/GUI/Plater.cpp:3995 msgid "Along X axis" msgstr "Entlang der X Achse" -#: src/slic3r/GUI/Plater.cpp:2941 +#: src/slic3r/GUI/Plater.cpp:3997 msgid "Along Y axis" msgstr "Entlang der Y Achse" -#: src/slic3r/GUI/Plater.cpp:2943 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Along Z axis" msgstr "Entlang der Z Achse" -#: src/slic3r/GUI/ConfigWizard.cpp:122 +#: src/slic3r/GUI/ConfigWizard.cpp:222 msgid "Alternate nozzles:" msgstr "Alternative Düsen:" -#: src/slic3r/GUI/Plater.cpp:3561 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:5002 +#, c-format msgid "AMF file exported to %s" msgstr "AMF Datei exportiert nach %s" -#: src/slic3r/GUI/GLCanvas3D.cpp:725 -msgid "An object outside the print area was detected\nResolve the current problem to continue slicing" -msgstr "Ein Objekt außerhalb des Druckbereichs wurde erkannt.\nBeheben Sie das aktuelle Problem, um mit dem Slicen fortzufahren" +#: 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:720 +#: 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/Tab.cpp:2781 +#: src/slic3r/GUI/Tab.cpp:2943 msgid "and it has the following unsaved changes:" msgstr "und hat die folgenden ungesicherten Änderungen:" -#: src/slic3r/GUI/Plater.cpp:2461 +#: src/slic3r/GUI/Plater.cpp:3170 msgid "Another export job is currently running." -msgstr "Ein anderer Exportjob läuft zur Zeit." +msgstr "Ein anderer Exportjob läuft zurzeit." -#: src/slic3r/GUI/Tab.cpp:926 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Any arrow" +msgstr "Jeder Pfeil" + +#: src/slic3r/GUI/Tab.cpp:965 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:88 +#: src/libslic3r/PrintConfig.cpp:104 msgid "API Key / Password" msgstr "API Key / Kennwort" -#: src/slic3r/GUI/GUI_App.cpp:671 +#: src/slic3r/GUI/GUI_App.cpp:810 msgid "Application preferences" msgstr "Anwendungseinstellungen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:864 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1240 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1374 msgid "Apply changes" msgstr "Änderungen anwenden" -#: src/libslic3r/PrintConfig.cpp:542 src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708 msgid "approximate seconds" msgstr "ungefähre Sekunden" -#: src/libslic3r/PrintConfig.cpp:401 src/libslic3r/PrintConfig.cpp:807 +#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854 msgid "Archimedean Chords" msgstr "Archimedische Bögen" -#: src/libslic3r/Zipper.cpp:91 +#: src/libslic3r/Zipper.cpp:88 msgid "archive is too large" msgstr "Archiv ist zu groß" #. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:2955 +#: src/slic3r/GUI/Tab.cpp:3123 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:862 -msgid "Are you sure you want to cancel firmware flashing?\nThis could leave your printer in an unusable state!" +#: 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 "Sind Sie sicher, dass Sie das Flashen der Firmware abbrechen wollen? Dies könnte Ihren Drucker in einen unbrauchbaren Zustand versetzen!" -#: src/libslic3r/PrintConfig.cpp:2258 +#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924 +msgid "Are you sure you want to continue?" +msgstr "Sind Sie sicher, dass Sie weitermachen wollen?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 +msgid "Are you sure you want to do it?" +msgstr "Sind Sie sicher, dass Sie es tun wollen?" + +#: src/libslic3r/PrintConfig.cpp:2423 msgid "Area fill" msgstr "Bereichsfüllung" -#: src/slic3r/GUI/Plater.cpp:609 +#: src/slic3r/GUI/Plater.cpp:641 msgid "Around object" msgstr "Um das Objekt" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/Plater.cpp:2754 msgid "Arrange" msgstr "Anordnen" -#: src/slic3r/GUI/GLCanvas3D.cpp:3486 +#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Arrange selection" msgstr "Auswahl anordnen" -#: src/libslic3r/PrintConfig.cpp:3054 +#: src/libslic3r/PrintConfig.cpp:3443 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:2106 +#: src/slic3r/GUI/Plater.cpp:2813 msgid "Arranging" msgstr "Anordnen" -#: src/slic3r/GUI/Plater.cpp:2718 +#: src/slic3r/GUI/Plater.cpp:2841 msgid "Arranging canceled." msgstr "Anordnen abgebrochen." -#: src/slic3r/GUI/Plater.cpp:2144 +#: src/slic3r/GUI/Plater.cpp:2842 msgid "Arranging done." msgstr "Anordnung beendet." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Arrow Down" msgstr "Pfeil runter" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 msgid "Arrow Left" msgstr "Pfeil links" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 msgid "Arrow Right" msgstr "Pfeil rechts" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 msgid "Arrow Up" msgstr "Pfeil hoch" -#: src/slic3r/GUI/GUI_App.cpp:303 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:290 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.cpp:144 src/slic3r/GUI/GUI_App.cpp:743 -#: src/slic3r/GUI/Tab.cpp:2798 +#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2313 +#: src/slic3r/GUI/Tab.cpp:2960 msgid "Attention!" msgstr "Achtung!" -#: src/libslic3r/PrintConfig.cpp:1785 +#: src/libslic3r/PrintConfig.cpp:1871 msgid "Auto generated supports" msgstr "Stützstrukturen automatisch generieren" -#: src/slic3r/GUI/Preferences.cpp:44 +#: src/slic3r/GUI/Preferences.cpp:47 msgid "Auto-center parts" msgstr "Teile automatisch zentrieren" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:902 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1243 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1377 msgid "Auto-generate points" msgstr "Punkte automatisch generieren" -#: src/slic3r/GUI/Plater.cpp:979 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1157 +#, c-format msgid "Auto-repaired (%d errors)" msgstr "Auto-Reparatur (%d Fehler)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:230 -#, possible-c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "Auto-Reparatur (%d Fehler):\n" +#: src/slic3r/GUI/GUI_ObjectList.cpp:339 +#, c-format +msgid "Auto-repaired (%d errors):" +msgstr "Auto-Reparatur (%d Fehler):" -#: src/slic3r/GUI/FirmwareDialog.cpp:771 +#: src/slic3r/GUI/FirmwareDialog.cpp:809 msgid "Autodetected" msgstr "Automatisch erkannt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1338 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Autogenerate support points" msgstr "Stützpunkte automatisch generieren" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1166 -msgid "Autogeneration will erase all manually edited points.\n\nAre you sure you want to do it?\n" -msgstr "Die automatische Generierung löscht alle manuell bearbeiteten Punkte.\n\nSind Sie sicher, dass Sie das wirklich tun wollen?\n" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 +msgid "Autogeneration will erase all manually edited points." +msgstr "Die automatische Generierung löscht alle manuell bearbeiteten Punkte." -#: src/slic3r/GUI/Tab.cpp:3421 +#: src/slic3r/GUI/Tab.cpp:3632 msgid "Automatic generation" msgstr "Automatische Erzeugung" -#: src/slic3r/GUI/ConfigWizard.cpp:401 +#: src/slic3r/GUI/ConfigWizard.cpp:761 msgid "Automatic updates" msgstr "Automatische Updates" -#: src/slic3r/GUI/MainFrame.cpp:406 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "Automatically repair an STL file" msgstr "Repariere automatisch die STL Datei" -#: src/slic3r/GUI/Tab.cpp:1110 +#: src/slic3r/GUI/Tab.cpp:1171 msgid "Autospeed (advanced)" -msgstr "Automatische Geschindigkeit (fortgeschritten)" +msgstr "Automatische Geschwindigkeit (fortgeschritten)" -#: src/libslic3r/PrintConfig.cpp:111 +#: src/libslic3r/PrintConfig.cpp:136 msgid "Avoid crossing perimeters" msgstr "Kreuzen der Kontur vermeiden" -#: src/slic3r/GUI/Tab.cpp:3081 +#: src/slic3r/GUI/Tab.cpp:3268 msgid "BACK ARROW" msgstr "PFEIL ZURÜCK" -#: src/slic3r/GUI/Tab.cpp:3113 -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." +#: 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 "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:3127 -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/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/Preferences.cpp:52 +#: src/slic3r/GUI/Preferences.cpp:55 msgid "Background processing" msgstr "Hintergrundberechnung" -#: src/slic3r/GUI/GUI_ObjectList.cpp:242 +#: src/slic3r/GUI/GUI_ObjectList.cpp:351 msgid "backwards edges" msgstr "umgekehrte Kanten" -#: src/slic3r/GUI/MainFrame.cpp:152 +#: src/slic3r/GUI/MainFrame.cpp:174 msgid "based on Slic3r" msgstr "basiert auf Slic3r" -#: src/slic3r/GUI/Tab.cpp:1484 +#: src/slic3r/GUI/Tab.cpp:1439 msgid "Bed" msgstr "Druckbett" #: src/libslic3r/PrintConfig.cpp:61 msgid "Bed custom model" -msgstr "Bett individuelles Modell" +msgstr "Druckbett individuelles Modell" #: src/libslic3r/PrintConfig.cpp:56 msgid "Bed custom texture" -msgstr "Bett individuelle Textur" +msgstr "Druckbett individuelle Textur" -#: src/slic3r/GUI/BedShapeDialog.hpp:45 src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:929 msgid "Bed Shape" msgstr "Druckbrettprofil" -#: src/libslic3r/PrintConfig.cpp:50 +#: src/libslic3r/PrintConfig.cpp:51 msgid "Bed shape" msgstr "Druckbettkontur" -#: src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/ConfigWizard.cpp:929 msgid "Bed Shape and Size" -msgstr "Bettform und -größe" +msgstr "Druckbettform und -größe" -#: src/libslic3r/PrintConfig.cpp:122 +#: src/libslic3r/PrintConfig.cpp:147 msgid "Bed temperature" msgstr "Druckbetttemperatur" -#: src/libslic3r/PrintConfig.cpp:120 +#: src/libslic3r/PrintConfig.cpp:145 msgid "Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands in the output." -msgstr "Druckbett-Temperatur für Schichten nach der ersten Schicht. Setzen Sie diesen Wert auf Null, um die Befehle zur Steuerung der Betttemperatur im Output zu deaktivieren." +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:626 +#: src/slic3r/GUI/ConfigWizard.cpp:1051 msgid "Bed Temperature:" -msgstr "Betttemperatur:" +msgstr "Druckbetttemperatur:" -#: src/slic3r/GUI/Tab.cpp:1961 src/libslic3r/PrintConfig.cpp:128 +#: src/slic3r/GUI/Tab.cpp:1988 src/libslic3r/PrintConfig.cpp:153 msgid "Before layer change G-code" msgstr "G-Code vor dem Schichtwechsel" @@ -782,90 +940,110 @@ msgstr "G-Code vor dem Schichtwechsel" msgid "Before roll back" msgstr "Vor dem Zurückwechseln" -#: src/slic3r/GUI/Plater.cpp:608 +#: src/slic3r/GUI/Plater.cpp:640 msgid "Below object" msgstr "Unter dem Objekt" -#: src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Below Z" msgstr "Unter Z" -#: src/libslic3r/PrintConfig.cpp:139 +#: src/libslic3r/PrintConfig.cpp:164 msgid "Between objects G-code" msgstr "G-Code zwischen Objekten" -#: src/slic3r/GUI/Tab.cpp:1979 +#: src/slic3r/GUI/Tab.cpp:2006 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 +msgid "Bottle volume" +msgstr "Flaschenvolumen" + +#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497 +msgid "Bottle weight" +msgstr "Flaschengewicht" + #. TRN To be shown in the main menu View->Bottom -#: src/slic3r/GUI/MainFrame.cpp:524 +#. 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 msgid "Bottom" msgstr "Unten" -#: src/libslic3r/PrintConfig.cpp:409 +#: src/libslic3r/PrintConfig.cpp:435 msgid "Bottom fill pattern" msgstr "Bodenfüllmuster" -#: src/libslic3r/PrintConfig.cpp:152 +#: src/slic3r/GUI/PresetHints.cpp:342 +msgid "Bottom is open." +msgstr "Boden ist offen." + +#: src/slic3r/GUI/PresetHints.cpp:336 +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 msgid "Bottom solid layers" -msgstr "Kompakte Basisschichten" +msgstr "Massive Basisschichten" -#: src/slic3r/GUI/MainFrame.cpp:524 +#: src/slic3r/GUI/MainFrame.cpp:665 msgid "Bottom View" -msgstr "Ansicht von Unten" +msgstr "Ansicht von unten" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1087 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1090 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1464 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1468 msgid "Box" msgstr "Kubus" -#: src/libslic3r/PrintConfig.cpp:157 +#: src/libslic3r/PrintConfig.cpp:193 msgid "Bridge" msgstr "Überbrückung" -#: src/libslic3r/PrintConfig.cpp:186 +#: src/libslic3r/PrintConfig.cpp:222 msgid "Bridge flow ratio" msgstr "Brückenflussverhältnis" -#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/GCode/PreviewData.cpp:169 +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316 msgid "Bridge infill" msgstr "Überbrückungs-Infill" -#: src/libslic3r/PrintConfig.cpp:198 +#: src/libslic3r/PrintConfig.cpp:234 msgid "Bridges" msgstr "Überbrückungen" -#: src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:213 msgid "Bridges fan speed" -msgstr "Brückenventilatorgeschwindigkeit" +msgstr "Brückenlüftergeschwindigkeit" -#: src/libslic3r/PrintConfig.cpp:166 +#: src/libslic3r/PrintConfig.cpp:202 msgid "Bridging angle" msgstr "Überbrückungswinkel" -#: src/libslic3r/PrintConfig.cpp:168 +#: src/libslic3r/PrintConfig.cpp:204 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." +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:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Bridging volumetric" msgstr "Überbrückungvolumen" -#: src/slic3r/GUI/Plater.cpp:446 src/slic3r/GUI/Tab.cpp:1056 +#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117 msgid "Brim" msgstr "Rand" -#: src/libslic3r/PrintConfig.cpp:208 +#: src/libslic3r/PrintConfig.cpp:244 msgid "Brim width" msgstr "Randbreite" -#: src/slic3r/GUI/Tab.cpp:1681 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1658 +#: src/slic3r/GUI/Tab.cpp:1721 msgid "Browse" msgstr "Suchen" -#: src/libslic3r/Zipper.cpp:85 +#: src/libslic3r/Zipper.cpp:82 msgid "buffer too small" msgstr "Puffer zu klein" @@ -873,850 +1051,1042 @@ msgstr "Puffer zu klein" msgid "Buttons And Text Colors Description" msgstr "Schaltflächen und Textfarben Beschreibung" -#: src/slic3r/GUI/PresetHints.cpp:220 +#: src/slic3r/GUI/PresetHints.cpp:223 msgid "by the print profile maximum" msgstr "mit dem Maximum des Druckerprofils" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:113 +msgid "Camera" +msgstr "Kamera" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Camera view" msgstr "Kameraansicht" -#: src/slic3r/GUI/ConfigWizard.cpp:1095 src/slic3r/GUI/FirmwareDialog.cpp:147 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:37 -#: src/slic3r/GUI/ProgressStatusBar.cpp:28 +#: src/slic3r/GUI/ConfigWizard.cpp:1982 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 msgid "Cancel" msgstr "Abbrechen" -#: src/slic3r/GUI/PrintHostDialogs.cpp:156 +#: src/slic3r/GUI/PrintHostDialogs.cpp:157 msgid "Cancel selected" msgstr "Abbruch ausgewählt" -#: src/slic3r/GUI/Plater.cpp:2727 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3669 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "Abgebrochen" -#: src/slic3r/GUI/Plater.cpp:2444 src/slic3r/GUI/PrintHostDialogs.cpp:231 +#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "Abbrechen" -#: src/slic3r/GUI/FirmwareDialog.cpp:866 +#: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." msgstr "Abbrechen..." -#: src/slic3r/GUI/Tab.cpp:2905 +#: src/libslic3r/Flow.cpp:61 +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: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: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/Tab.cpp:3073 msgid "Cannot overwrite a system profile." msgstr "Systemprofil kann nicht überschrieben werden." -#: src/slic3r/GUI/Tab.cpp:2909 +#: src/slic3r/GUI/Tab.cpp:3077 msgid "Cannot overwrite an external profile." msgstr "Ein externes Profil kann nicht überschrieben werden." -#: src/libslic3r/SLAPrint.cpp:612 +#: src/libslic3r/SLAPrint.cpp:613 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." -#: src/slic3r/GUI/Tab.cpp:1840 +#: src/slic3r/GUI/Tab.cpp:1834 msgid "Capabilities" msgstr "Fähigkeiten" -#: src/slic3r/GUI/GUI_App.cpp:662 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Capture a configuration snapshot" msgstr "Erfassen einer Konfigurations-Momentaufnahme" -#: src/libslic3r/PrintConfig.cpp:3035 +#: src/libslic3r/PrintConfig.cpp:3424 msgid "Center" msgstr "Mitte" -#: src/libslic3r/PrintConfig.cpp:3036 +#: src/libslic3r/PrintConfig.cpp:3425 msgid "Center the print around the given center." msgstr "Zentriert den Druck um den angegebenen Mittelpunkt." -#: src/slic3r/GUI/Tab.cpp:1744 +#: src/slic3r/GUI/Tab.cpp:1728 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Zertifikatsdatei (*.crt, *.pem)|*.crt;*.pem|alle Dateien|*.*" -#: src/slic3r/GUI/GUI_App.cpp:683 -msgid "Change Application &Language" -msgstr "Wechse&l der Anwendungssprache" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Change camera type (perspective, orthographic)" msgstr "Ändern des Kameratyps (perspektivisch, orthografisch)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:885 +msgid "Change drainage hole diameter" +msgstr "Durchmesser des Drainagelochs ändern" + +#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1671 msgid "Change extruder" msgstr "Wechsel Extruder" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:144 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectList.cpp:536 +msgid "Change Extruder" +msgstr "Wechsel Extruder" + +#: src/slic3r/GUI/DoubleSlider.cpp:1145 +msgid "Change extruder (N/A)" +msgstr "Extruder wechseln (nv)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3997 +msgid "Change Extruders" +msgstr "Wechsel Extruder" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 +#, c-format msgid "Change Option %s" msgstr "Ändere Option %s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3134 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3558 msgid "Change Part Type" msgstr "Teil Typ ändern" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:925 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820 msgid "Change point head diameter" msgstr "Ändern des Stützpunkt-Kopfdurchmessers" -#: src/slic3r/GUI/Plater.cpp:3520 +#: src/slic3r/GUI/Plater.cpp:3944 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:1185 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1589 msgid "Change type" msgstr "Typ ändern" -#: src/slic3r/GUI/UpdateDialogs.cpp:56 +#: src/slic3r/GUI/UpdateDialogs.cpp:53 msgid "Changelog && Download" msgstr "Changelog && Download" -#: src/slic3r/GUI/GUI_App.cpp:378 +#: src/slic3r/GUI/GUI_App.cpp:442 msgid "Changing of an application language" msgstr "Wechsele die Anwendungssprache" -#: src/slic3r/GUI/ConfigWizard.cpp:409 src/slic3r/GUI/Preferences.cpp:61 +#: src/slic3r/GUI/ConfigWizard.cpp:769 src/slic3r/GUI/Preferences.cpp:64 msgid "Check for application updates" msgstr "Nach Updates suchen" -#: src/slic3r/GUI/BedShapeDialog.cpp:509 -msgid "Choose a file to import bed texture from (PNG/SVG):" -msgstr "Wählen Sie eine Datei aus, aus der Sie die Betttextur importieren möchten (PNG/SVG):" +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for configuration updates" +msgstr "Suche nach Konfigurationsaktualisierungen" -#: src/slic3r/GUI/MainFrame.cpp:621 +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for updates" +msgstr "Nach &Updates suchen" + +#: src/slic3r/GUI/BedShapeDialog.cpp:532 +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 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:532 +#: src/slic3r/GUI/BedShapeDialog.cpp:555 msgid "Choose an STL file to import bed model from:" -msgstr "Wählen Sie eine STL-Datei aus, aus der Sie das Bettmodell importieren möchten:" +msgstr "Wählen Sie eine STL-Datei aus, aus der Sie das Druckbettmodell importieren möchten:" -#: src/slic3r/GUI/BedShapeDialog.cpp:464 +#: src/slic3r/GUI/BedShapeDialog.cpp:487 msgid "Choose an STL file to import bed shape from:" -msgstr "Wählen Sie eine STL-Datei aus, aus der Sie die Bettform importieren möchten:" +msgstr "Wählen Sie eine STL-Datei aus, aus der Sie die Druckbettform importieren möchten:" -#: src/slic3r/GUI/GUI_App.cpp:510 +#: src/slic3r/GUI/GUI_App.cpp:555 msgid "Choose one file (3MF/AMF):" msgstr "Wählen Sie eine Datei (3MF/AMF):" -#: src/slic3r/GUI/GUI_App.cpp:501 +#: src/slic3r/GUI/GUI_App.cpp:567 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:490 +#: src/slic3r/GUI/ConfigWizard.cpp:895 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:84 +#: src/slic3r/GUI/BedShapeDialog.cpp:89 msgid "Circular" msgstr "Kreisförmig" -#: src/slic3r/GUI/GLCanvas3D.cpp:3701 src/slic3r/GUI/GLCanvas3D.cpp:3734 +#: 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/GUI_ObjectList.cpp:383 +#: src/slic3r/GUI/GUI_ObjectList.cpp:404 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:377 +#: src/slic3r/GUI/GUI_ObjectList.cpp:398 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:292 +#: src/slic3r/GUI/Plater.cpp:343 msgid "Click to edit preset" msgstr "Klicken zum Bearbeiten der Voreinstellung" -#: src/libslic3r/PrintConfig.cpp:216 +#: src/libslic3r/PrintConfig.cpp:252 msgid "Clip multi-part objects" msgstr "Beschneiden von Objekten aus mehreren Teilen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:928 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 msgid "Clipping of view" msgstr "Ausschnitt der Ansicht" -#: src/slic3r/GUI/FirmwareDialog.cpp:814 -#: src/slic3r/GUI/PrintHostDialogs.cpp:160 +#: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/Mouse3DController.cpp:364 +#: src/slic3r/GUI/PrintHostDialogs.cpp:161 msgid "Close" -msgstr "Schliessen" +msgstr "Schließen" -#: src/libslic3r/PrintConfig.cpp:550 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +#: src/libslic3r/PrintConfig.cpp:2934 +msgid "Closing distance" +msgstr "Schliessabstand" + +#: src/slic3r/GUI/Plater.cpp:1260 src/libslic3r/PrintConfig.cpp:582 msgid "Color" msgstr "Farbe" -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/GUI_Preview.cpp:535 -#: src/libslic3r/GCode/PreviewData.cpp:406 +#: src/slic3r/GUI/DoubleSlider.cpp:1005 +msgid "Color change (\"%1%\")" +msgstr "Farbwechsel (\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:1006 +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/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572 +#: src/libslic3r/GCode/PreviewData.cpp:359 msgid "Color Print" msgstr "Color Print" -#: src/libslic3r/PrintConfig.cpp:224 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Colorprint height" msgstr "Colorprint Höhe" -#: src/libslic3r/PrintConfig.cpp:942 +#: src/libslic3r/PrintConfig.cpp:990 msgid "Combine infill every" msgstr "Infill kombinieren alle" -#: src/libslic3r/PrintConfig.cpp:947 +#: src/libslic3r/PrintConfig.cpp:995 msgid "Combine infill every n layers" msgstr "Kombiniere das Infill all n Schichten" -#: src/slic3r/GUI/UpdateDialogs.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Commands" +msgstr "Befehle" + +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 msgid "Comment:" msgstr "Kommentar:" -#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:244 +#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280 msgid "Compatible print profiles" msgstr "Kompatible Druckprofile" -#: src/libslic3r/PrintConfig.cpp:250 +#: src/libslic3r/PrintConfig.cpp:286 msgid "Compatible print profiles condition" msgstr "Kompatible Druckprofile Bedingung" -#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:229 +#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265 msgid "Compatible printers" msgstr "Kompatible Drucker" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:271 msgid "Compatible printers condition" msgstr "Kompatible Druckerbedingung" -#: src/libslic3r/PrintConfig.cpp:268 +#: src/libslic3r/PrintConfig.cpp:304 msgid "Complete individual objects" msgstr "Kompatible Einzelobjekte" -#: src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/PrintHostDialogs.cpp:234 msgid "Completed" msgstr "Fertig" -#: src/libslic3r/Zipper.cpp:57 +#: src/libslic3r/Zipper.cpp:54 msgid "compression failed" msgstr "Komprimierung fehlgeschlagen" -#: src/libslic3r/PrintConfig.cpp:399 src/libslic3r/PrintConfig.cpp:802 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849 msgid "Concentric" msgstr "Konzentrisch" -#: src/slic3r/GUI/ConfigWizard.cpp:1185 +#: src/slic3r/GUI/ConfigWizard.cpp:2110 msgid "Configuration &Assistant" msgstr "Konfigurations &Assistent" -#: src/slic3r/GUI/ConfigWizard.cpp:1182 +#: src/slic3r/GUI/ConfigWizard.cpp:2113 msgid "Configuration &Wizard" -msgstr "Konfigurations-Assistent (&W)" +msgstr "&Konfigurations-Assistent" -#: src/slic3r/GUI/ConfigWizard.cpp:1184 +#: src/slic3r/GUI/ConfigWizard.cpp:2109 msgid "Configuration Assistant" msgstr "Konfigurations-Assistent" -#: src/libslic3r/PrintConfig.cpp:1251 +#: src/libslic3r/PrintConfig.cpp:1316 msgid "Configuration notes" msgstr "Konfigurationsnotizen" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:99 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104 msgid "Configuration Snapshots" msgstr "Konfigurations-Momentaufnahmen" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 src/slic3r/GUI/UpdateDialogs.cpp:168 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" msgstr "Konfigurationsupdate" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 msgid "Configuration update is available" msgstr "Konfigurationsupdate ist verfügbar" -#: src/slic3r/GUI/ConfigWizard.cpp:1181 +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "Configuration updates" +msgstr "Konfigurationsupdates" + +#: src/slic3r/GUI/ConfigWizard.cpp:2112 msgid "Configuration Wizard" msgstr "Konfigurations-Assistent" -#: src/slic3r/GUI/FirmwareDialog.cpp:863 +#: src/slic3r/GUI/FirmwareDialog.cpp:903 msgid "Confirmation" msgstr "Bestätigung" -#: src/slic3r/GUI/Tab.cpp:1904 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Connection failed." msgstr "Verbindung ist fehlgeschlagen." -#: src/slic3r/GUI/Tab.cpp:3416 +#: src/slic3r/GUI/Tab.cpp:3627 msgid "Connection of the support sticks and junctions" msgstr "Verbindung von Stützstäben und Verbindungen" -#: src/slic3r/Utils/Duet.cpp:51 +#: src/slic3r/Utils/AstroBox.cpp:83 +msgid "Connection to AstroBox works correctly." +msgstr "Die Verbindung zur AstroBox funktioniert korrekt." + +#: src/slic3r/Utils/Duet.cpp:49 msgid "Connection to Duet works correctly." msgstr "Verbindung zu Duet funktioniert einwandfrei." -#: src/slic3r/Utils/OctoPrint.cpp:84 -msgid "Connection to OctoPrint works correctly." -msgstr "Verbindung zu Octoprint funktioniert einwandfrei." +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "Die Verbindung zu FlashAir funktioniert einwandfrei und der Upload ist aktiviert." -#: src/slic3r/GUI/Tab.cpp:1901 +#: src/slic3r/Utils/OctoPrint.cpp:83 +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/Utils/OctoPrint.cpp:195 +#: src/slic3r/Utils/OctoPrint.cpp:176 msgid "Connection to Prusa SL1 works correctly." msgstr "Verbindung zum Prusa SL1 funktioniert einwandfrei." -#: src/libslic3r/PrintConfig.cpp:1823 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Contact Z distance" msgstr "Kontakt Z-Abstand" -#: src/slic3r/GUI/AboutDialog.cpp:96 +#: src/slic3r/GUI/AboutDialog.cpp:261 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:2433 +#: src/libslic3r/PrintConfig.cpp:2659 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:1489 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Cooling" msgstr "Kühlung" -#: src/libslic3r/PrintConfig.cpp:629 +#: src/libslic3r/PrintConfig.cpp:660 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "Kühlbewegungen beschleunigen von dieser Anfangsgeschwindigkeit aus." -#: src/libslic3r/PrintConfig.cpp:648 +#: src/libslic3r/PrintConfig.cpp:679 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "Kühlbewegungen beschleunigen auf diese Geschwindigkeit hin." -#: src/slic3r/GUI/Tab.cpp:1510 +#: src/slic3r/GUI/Tab.cpp:1465 msgid "Cooling thresholds" msgstr "Kühlungsschwellwerte" -#: src/libslic3r/PrintConfig.cpp:291 +#: src/libslic3r/PrintConfig.cpp:327 msgid "Cooling tube length" msgstr "Länge des Kühlschlauchs" -#: src/libslic3r/PrintConfig.cpp:283 +#: src/libslic3r/PrintConfig.cpp:319 msgid "Cooling tube position" msgstr "Position des Kühlschlauchs" -#: src/slic3r/GUI/Tab.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:4752 +msgid "Copies of the selected object" +msgstr "Kopien des ausgewählten Objekts" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4505 msgid "Copy" msgstr "Kopieren" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:589 msgid "Copy selection to clipboard" msgstr "Auswahl in Zwischenablage kopieren" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 msgid "Copy to clipboard" msgstr "Zu Zwischenablage kopieren" -#: src/slic3r/GUI/SysInfoDialog.cpp:120 +#: src/slic3r/GUI/SysInfoDialog.cpp:154 msgid "Copy to Clipboard" msgstr "Zu Zwischenablage kopieren" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:84 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:400 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121 +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 +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 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:92 +#: 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/AboutDialog.cpp:92 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112 +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 msgid "Copyright" msgstr "Urheberrecht" -#: src/libslic3r/PrintConfig.cpp:2324 src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572 msgid "Correction for expansion" msgstr "Korrektur der Ausdehnung" -#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:3310 +#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:3519 msgid "Corrections" msgstr "Korrekturen" -#: src/slic3r/GUI/Plater.cpp:216 src/slic3r/GUI/Plater.cpp:1056 -#: src/libslic3r/PrintConfig.cpp:717 +#: src/slic3r/GUI/Plater.cpp:1243 src/libslic3r/PrintConfig.cpp:760 +#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511 msgid "Cost" msgstr "Kosten" -#: src/slic3r/GUI/Plater.cpp:2140 +#: src/slic3r/GUI/Plater.cpp:239 +msgid "Cost (money)" +msgstr "Kosten (Geld)" + +#: src/slic3r/GUI/Plater.cpp:2835 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/Duet.cpp:56 +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Could not connect to AstroBox" +msgstr "Konnte keine Verbindung zur AstroBox herstellen" + +#: src/slic3r/Utils/Duet.cpp:54 msgid "Could not connect to Duet" msgstr "Ich konnte keine Verbindung zum Duet herstellen" -#: src/slic3r/Utils/OctoPrint.cpp:90 +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "Could not connect to FlashAir" +msgstr "Die Verbindung zu FlashAir konnte nicht hergestellt werden" + +#: src/slic3r/Utils/OctoPrint.cpp:89 msgid "Could not connect to OctoPrint" msgstr "Ich konnte keine Verbindung zu OctoPrint herstellen" -#: src/slic3r/Utils/OctoPrint.cpp:200 +#: src/slic3r/Utils/OctoPrint.cpp:181 msgid "Could not connect to Prusa SLA" msgstr "Ich konnte keine Verbindung zum Prusa SLA herstellen" -#: src/slic3r/GUI/Tab.cpp:1710 +#: src/slic3r/GUI/Tab.cpp:1687 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:151 +#: src/slic3r/Utils/Duet.cpp:134 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:1872 +#: src/libslic3r/PrintConfig.cpp:1959 msgid "Cover the top contact layer of the supports with loops. Disabled by default." -msgstr "Decken Sie die obere Kontaktschicht der Stützen mit Schleifen ab. Standardmäßig deaktiviert." +msgstr "Deckt die obere Kontaktschicht der Stützstrukturen mit Schleifen ab. Standardmäßig deaktiviert." -#: src/libslic3r/PrintConfig.cpp:73 +#: src/libslic3r/PrintConfig.cpp:89 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:61 +#: src/libslic3r/Zipper.cpp:58 msgid "CRC-32 check failed" msgstr "CRC-32 Check fehlgeschlagen" -#: src/libslic3r/PrintConfig.cpp:2734 +#: src/libslic3r/PrintConfig.cpp:2857 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:2460 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Critical angle" msgstr "Kritischer Winkel" -#: src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2668 msgid "Cross" msgstr "Kreuz" -#: src/libslic3r/PrintConfig.cpp:800 +#: src/libslic3r/PrintConfig.cpp:847 msgid "Cubic" msgstr "Kubisch" -#: src/slic3r/GUI/wxExtensions.cpp:2413 -#, possible-c-format +#: src/slic3r/GUI/wxExtensions.cpp:704 +#, c-format msgid "Current mode is %s" msgstr "Aktueller Modus ist %s" -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" +msgstr "Aktuelle Voreinstellung ist abgeleitet von" + +#: src/slic3r/GUI/Tab.cpp:957 msgid "Current preset is inherited from the default preset." msgstr "Aktuelle Voreinstellung ist abgeleitet von der Standardvoreinstellung." -#: src/slic3r/GUI/Tab.cpp:928 -#, possible-c-format -msgid "Current preset is inherited from:\n\t%s" -msgstr "Aktuelle Voreinstellung ist abgeleitet von:\n%s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:45 +#: src/slic3r/GUI/UpdateDialogs.cpp:43 msgid "Current version:" msgstr "Aktuelle Version:" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/slic3r/GUI/GUI_Preview.cpp:239 -#: src/libslic3r/GCode/PreviewData.cpp:175 +#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249 +#: src/libslic3r/ExtrusionEntity.cpp:322 msgid "Custom" msgstr "Benutzerdefiniert" -#: src/libslic3r/PrintConfig.cpp:96 +#: src/libslic3r/PrintConfig.cpp:112 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:1563 src/slic3r/GUI/Tab.cpp:1948 +#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1975 msgid "Custom G-code" msgstr "Benutzerdefinierter G-Code" -#: src/slic3r/GUI/ConfigWizard.cpp:373 +#: src/slic3r/GUI/DoubleSlider.cpp:1619 +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 msgid "Custom Printer" msgstr "Benutzerdefinierter Drucker" -#: src/slic3r/GUI/ConfigWizard.cpp:373 +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer Setup" msgstr "Benutzerdefinierte Drucker-Einrichtung" -#: src/slic3r/GUI/ConfigWizard.cpp:377 +#: src/slic3r/GUI/ConfigWizard.cpp:736 msgid "Custom profile name:" msgstr "Benutzerdefinierter Profilname:" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3013 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3402 msgid "Cut" msgstr "Schneiden" -#: src/slic3r/GUI/Plater.cpp:4193 +#: src/slic3r/GUI/Plater.cpp:4786 msgid "Cut by Plane" msgstr "Schneiden durch Ebene" -#: src/libslic3r/PrintConfig.cpp:3014 +#: src/libslic3r/PrintConfig.cpp:3403 msgid "Cut model at the given Z." msgstr "Schneidet Modell am gegebenen Z-Wert." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Cylinder" msgstr "Zylinder" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:568 msgid "D&eselect all" msgstr "All&es Abwählen" -#: src/libslic3r/PrintConfig.cpp:3115 +#: src/libslic3r/PrintConfig.cpp:3504 msgid "Data directory" msgstr "Datenverzeichnis" -#: src/libslic3r/Zipper.cpp:55 +#: src/slic3r/GUI/Mouse3DController.cpp:313 +msgid "Deadzone:" +msgstr "Todeszone:" + +#: src/libslic3r/Zipper.cpp:52 msgid "decompression failed or archive is corrupted" msgstr "Entpacken fehlgeschlagen oder Archiv defekt" -#: src/slic3r/GUI/Plater.cpp:4127 +#: src/slic3r/GUI/Plater.cpp:4720 msgid "Decrease Instances" msgstr "Kopien verringern" -#: src/slic3r/GUI/GUI_App.cpp:594 src/slic3r/GUI/GUI_ObjectList.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1704 src/libslic3r/PrintConfig.cpp:335 msgid "Default" msgstr "Standard" -#: xs/src/slic3r/GUI/Field.cpp:98 +#: 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 msgid "default" msgstr "Standard" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:777 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:522 +#: src/libslic3r/PrintConfig.cpp:554 msgid "Default extrusion width" msgstr "Standardextrusionsbreite" -#: src/slic3r/GUI/Tab.cpp:937 +#: src/slic3r/GUI/Tab.cpp:987 msgid "default filament profile" msgstr "Standard-Filamentprofil" -#: src/libslic3r/PrintConfig.cpp:309 +#: src/libslic3r/PrintConfig.cpp:345 msgid "Default filament profile" msgstr "Standard-Filamentprofil" -#: src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:346 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:2757 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:2919 +#, c-format msgid "Default preset (%s)" msgstr "Standard Voreinstellung(%s)" -#: src/libslic3r/GCode/PreviewData.cpp:491 +#: src/slic3r/GUI/GLCanvas3D.cpp:904 src/slic3r/GUI/GLCanvas3D.cpp:933 msgid "Default print color" msgstr "Standard Druckfarbe" -#: src/slic3r/GUI/Tab.cpp:934 +#: src/slic3r/GUI/Tab.cpp:984 msgid "default print profile" msgstr "Standard-Druckprofil" -#: src/libslic3r/PrintConfig.cpp:316 +#: src/libslic3r/PrintConfig.cpp:352 msgid "Default print profile" msgstr "Standard-Druckprofil" -#: src/libslic3r/PrintConfig.cpp:317 src/libslic3r/PrintConfig.cpp:2341 -#: src/libslic3r/PrintConfig.cpp:2352 +#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592 +#: src/libslic3r/PrintConfig.cpp:2603 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:951 +#: src/slic3r/GUI/Tab.cpp:1001 msgid "default SLA material profile" msgstr "Standard-SLA-Materialprofil" -#: src/libslic3r/PrintConfig.cpp:2340 src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602 msgid "Default SLA material profile" msgstr "Standard-SLA-Materialprofil" -#: src/slic3r/GUI/Tab.cpp:955 +#: src/slic3r/GUI/Tab.cpp:1005 msgid "default SLA print profile" msgstr "Standard-SLA-Druckprofil" -#: src/slic3r/GUI/Field.cpp:105 +#: src/slic3r/GUI/Field.cpp:136 msgid "default value" msgstr "Standardwert" -#: src/slic3r/GUI/ConfigWizard.cpp:375 +#: src/slic3r/GUI/ConfigWizard.cpp:734 msgid "Define a custom printer profile" msgstr "Benutzerdefiniertes Druckerprofil definieren" -#: src/libslic3r/PrintConfig.cpp:2558 +#: src/libslic3r/PrintConfig.cpp:2798 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." +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:237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:346 msgid "degenerate facets" msgstr "entartete Facetten" -#: src/libslic3r/PrintConfig.cpp:608 +#: src/libslic3r/PrintConfig.cpp:640 msgid "Delay after unloading" msgstr "Verzögerung nach dem Entladen" -#: src/slic3r/GUI/Tab.cpp:2935 +#: src/slic3r/GUI/Tab.cpp:3121 msgid "delete" msgstr "löschen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1257 src/slic3r/GUI/Plater.cpp:2891 -#: src/slic3r/GUI/Plater.cpp:2909 src/slic3r/GUI/Tab.cpp:2937 +#: 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 msgid "Delete" msgstr "Löschen" -#: src/slic3r/GUI/MainFrame.cpp:449 +#: src/slic3r/GUI/MainFrame.cpp:575 msgid "Delete &all" msgstr "&Alles löschen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 -msgid "Delete All" -msgstr "Alle löschen" - -#: src/slic3r/GUI/Plater.cpp:3298 +#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129 +#: src/slic3r/GUI/Plater.cpp:4669 msgid "Delete all" msgstr "Alle löschen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1806 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2176 msgid "Delete All Instances from Object" msgstr "Alle Kopien des Objektes löschen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/DoubleSlider.cpp:1516 +msgid "Delete color change" +msgstr "Farbwechsel löschen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Delete color change marker for current layer" msgstr "Löscht einen Farbwechselmarker der aktuellen Schicht" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1898 +#: src/slic3r/GUI/DoubleSlider.cpp:1519 +msgid "Delete custom G-code" +msgstr "Benutzerdefinierten G-Code löschen" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:539 +msgid "Delete drainage hole" +msgstr "Drainageloch entfernen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2192 msgid "Delete Height Range" msgstr "Höhenbereich löschen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2246 msgid "Delete Instance" msgstr "Kopie löschen" -#: src/slic3r/GUI/Plater.cpp:2592 +#: src/slic3r/GUI/Plater.cpp:2712 msgid "Delete Object" msgstr "Objekt löschen" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:100 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 +#, c-format msgid "Delete Option %s" msgstr "Lösche Option %s" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/DoubleSlider.cpp:1518 +msgid "Delete pause print" +msgstr "Druckpause löschen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 msgid "Delete selected" msgstr "Löschen ausgewählt" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2830 msgid "Delete Selected" msgstr "Löschen ausgewählt" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2303 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2693 msgid "Delete Selected Item" msgstr "Gewähltes Element löschen" -#: src/slic3r/GUI/Plater.cpp:4083 +#: src/slic3r/GUI/Plater.cpp:4677 msgid "Delete Selected Objects" msgstr "Ausgewählte Objekte entfernen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2152 msgid "Delete Settings" msgstr "Einstellungen löschen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1857 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2227 msgid "Delete Subobject" msgstr "Subobjekt löschen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:720 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631 msgid "Delete support point" msgstr "Stützpunkt löschen" -#: src/slic3r/GUI/Tab.cpp:131 +#: src/slic3r/GUI/Tab.cpp:134 msgid "Delete this preset" msgstr "Lösche diese Voreinstellung" -#: src/slic3r/GUI/MainFrame.cpp:449 +#: src/slic3r/GUI/DoubleSlider.cpp:1035 +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 +msgid "Delete tool change" +msgstr "Werkzeugwechsel löschen" + +#: src/slic3r/GUI/MainFrame.cpp:576 msgid "Deletes all objects" msgstr "Löscht alle Objekte" -#: src/slic3r/GUI/MainFrame.cpp:447 +#: src/slic3r/GUI/MainFrame.cpp:573 msgid "Deletes the current selection" msgstr "Löscht die aktuelle Auswahl" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:2504 msgid "Density" msgstr "Dichte" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:791 msgid "Density of internal infill, expressed in the range 0% - 100%." -msgstr "Infilldichte. Als Prozentwert von 0% - 100% ausgedrückt." +msgstr "Infilldichte. Als Prozentwert von 0% - 100% ausgedrückt." -#: src/slic3r/GUI/Tab.cpp:1200 src/slic3r/GUI/Tab.cpp:1584 -#: src/slic3r/GUI/Tab.cpp:1992 src/slic3r/GUI/Tab.cpp:2086 -#: src/slic3r/GUI/Tab.cpp:3336 src/slic3r/GUI/Tab.cpp:3445 +#: 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 msgid "Dependencies" msgstr "Abhängigkeiten" -#: src/libslic3r/PrintConfig.cpp:1542 src/libslic3r/PrintConfig.cpp:1543 +#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613 msgid "Deretraction Speed" msgstr "Wiedereinzugsgeschwindigkeit" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +msgid "Deselect all" +msgstr "Alles abwählen" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369 msgid "Deselect by rectangle" msgstr "Abwahl über Rechteck" -#: src/slic3r/GUI/MainFrame.cpp:492 +#: src/slic3r/GUI/MainFrame.cpp:569 msgid "Deselects all objects" msgstr "Alle Objekte abwählen" -#: src/libslic3r/PrintConfig.cpp:1304 +#: src/slic3r/GUI/Tab.cpp:963 +msgid "Detach from system preset" +msgstr "Lösen von der Systemvoreinstellung" + +#: src/slic3r/GUI/Tab.cpp:984 +msgid "Detach preset" +msgstr "Lösen der Voreinstellugen" + +#: src/slic3r/GUI/Tab.cpp:3029 +msgid "Detached" +msgstr "Losgelöst" + +#: src/libslic3r/PrintConfig.cpp:1373 msgid "Detect bridging perimeters" msgstr "Umfangbrücken entdecken" -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:2075 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:1986 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "Detect thin walls" msgstr "Dünne Wände erkennen" -#: src/libslic3r/PrintConfig.cpp:3083 +#: src/libslic3r/PrintConfig.cpp:3472 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:1713 +#: src/slic3r/GUI/Plater.cpp:2368 msgid "Detected advanced data" msgstr "Erweiterte Daten gefunden" -#: src/slic3r/GUI/BedShapeDialog.cpp:88 src/libslic3r/PrintConfig.cpp:677 +#: src/slic3r/GUI/Mouse3DController.cpp:289 +msgid "Device:" +msgstr "Gerät:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709 msgid "Diameter" msgstr "Durchmesser" -#: src/libslic3r/PrintConfig.cpp:2443 +#: src/libslic3r/PrintConfig.cpp:2694 msgid "Diameter in mm of the pillar base" msgstr "Durchmesser der Pfeilerbasis in mm" -#: src/libslic3r/PrintConfig.cpp:2399 +#: src/libslic3r/PrintConfig.cpp:2650 msgid "Diameter in mm of the support pillars" -msgstr "Duchmesser der Stützpfeiler in mm" +msgstr "Durchmesser der Stützpfeiler in mm" -#: src/libslic3r/PrintConfig.cpp:2371 +#: src/libslic3r/PrintConfig.cpp:2622 msgid "Diameter of the pointing side of the head" msgstr "Durchmesser der Spitzenseite des Kopfes" -#: src/slic3r/GUI/BedShapeDialog.cpp:89 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 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:1569 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Direction" msgstr "Richtung" -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:359 msgid "Disable fan for the first" -msgstr "Kein Ventilator für die ersten" +msgstr "Kein Lüfter für die ersten" -#: src/libslic3r/PrintConfig.cpp:1280 +#: src/libslic3r/PrintConfig.cpp:1349 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/wxExtensions.cpp:2572 -msgid "Discard all color changes" -msgstr "Alle Farbwechsel verwerfen" +#: src/slic3r/GUI/DoubleSlider.cpp:952 +msgid "Discard all custom changes" +msgstr "Alle benutzerdefinierten Änderungen verwerfen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1241 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1375 msgid "Discard changes" msgstr "Änderungen verwerfen" -#: src/slic3r/GUI/Tab.cpp:2784 +#: 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/Gizmos/GLGizmoMove.cpp:177 -msgid "Displacement (mm)" -msgstr "Versatz (mm)" - -#: src/slic3r/GUI/Tab.cpp:2041 +#: src/slic3r/GUI/Tab.cpp:2078 msgid "Display" msgstr "Display" -#: src/libslic3r/PrintConfig.cpp:2208 +#: src/libslic3r/PrintConfig.cpp:2359 msgid "Display height" msgstr "Displayhöhe" -#: src/libslic3r/PrintConfig.cpp:2319 +#: src/libslic3r/PrintConfig.cpp:2378 msgid "Display horizontal mirroring" msgstr "Zeige horizontale Spiegelung" -#: src/libslic3r/PrintConfig.cpp:2227 +#: src/libslic3r/PrintConfig.cpp:2392 msgid "Display orientation" msgstr "Displayausrichtung" -#: src/slic3r/GUI/MainFrame.cpp:510 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Display the Print Host Upload Queue window" msgstr "Zeige das Druckhost Warteschlangenfenster" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2385 msgid "Display vertical mirroring" msgstr "Zeige vertikale Spiegelung" -#: src/libslic3r/PrintConfig.cpp:2202 +#: src/libslic3r/PrintConfig.cpp:2353 msgid "Display width" msgstr "Displaybreite" -#: src/libslic3r/PrintConfig.cpp:341 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Distance between copies" msgstr "Abstand zwischen Kopien" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1680 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." +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:2752 +#: src/libslic3r/PrintConfig.cpp:2882 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:1609 +#: src/libslic3r/PrintConfig.cpp:1679 msgid "Distance from object" msgstr "Abstand vom Objekt" -#: src/slic3r/GUI/BedShapeDialog.cpp:80 +#: src/slic3r/GUI/BedShapeDialog.cpp:85 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:285 +#: src/libslic3r/PrintConfig.cpp:320 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:1338 +#: src/libslic3r/PrintConfig.cpp:1382 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:342 +#: src/libslic3r/PrintConfig.cpp:378 msgid "Distance used for the auto-arrange feature of the plater." msgstr "Abstand für die automatische Druckplattenbelegung." -#: src/libslic3r/PrintConfig.cpp:3097 +#: src/libslic3r/PrintConfig.cpp:3486 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:3041 +#: src/libslic3r/PrintConfig.cpp:3430 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:206 -#, 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/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/GUI_App.cpp:754 +#: src/slic3r/GUI/DoubleSlider.cpp:1920 +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 msgid "Do you want to proceed?" msgstr "Wollen Sie fortfahren?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1024 +#: src/slic3r/GUI/Plater.cpp:3321 +msgid "Do you want to retry" +msgstr "Möchten Sie es erneut versuchen" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1045 msgid "Do you want to save your manually edited support points?" msgstr "Möchten Sie Ihre manuell bearbeiteten Stützpunkte speichern?" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:1834 +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 +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 msgid "Don't arrange" msgstr "Nicht Anordnen" -#: src/slic3r/GUI/UpdateDialogs.cpp:55 +#: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" msgstr "Keine Benachrichtigung mehr über neue Releases" -#: src/libslic3r/PrintConfig.cpp:333 +#: src/libslic3r/PrintConfig.cpp:369 msgid "Don't support bridges" msgstr "Brücken nicht unterstützen" @@ -1724,316 +2094,426 @@ msgstr "Brücken nicht unterstützen" msgid "Downgrade" msgstr "Downgrade" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1233 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1236 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1237 +#: src/libslic3r/PrintConfig.cpp:1695 +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 msgid "Drag" msgstr "Ziehen" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:340 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:355 -msgid "Drop to bed" -msgstr "Auf das Bett fallen lassen" +#: src/libslic3r/SLAPrintSteps.cpp:44 +msgid "Drilling holes into model." +msgstr "Löcher in das Modell bohren." -#: src/libslic3r/PrintConfig.cpp:3044 +#: src/libslic3r/SLAPrintSteps.cpp:199 +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 +msgid "Drop to bed" +msgstr "Auf das Druckbett fallen lassen" + +#: src/libslic3r/PrintConfig.cpp:3433 msgid "Duplicate" msgstr "Duplizieren" -#: src/libslic3r/PrintConfig.cpp:3049 +#: src/libslic3r/PrintConfig.cpp:3438 msgid "Duplicate by grid" msgstr "Duplizieren nach Raster" -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/slic3r/GUI/PresetHints.cpp:40 +msgid "During the other layers, fan" +msgstr "Während der übrigen Schichten, Lüfter" + +#: src/libslic3r/PrintConfig.cpp:2669 msgid "Dynamic" msgstr "Dynamisch" -#: src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/MainFrame.cpp:749 msgid "E&xport" msgstr "E&xport" -#: src/slic3r/GUI/GUI_ObjectList.cpp:238 +#: src/slic3r/GUI/GUI_ObjectList.cpp:347 msgid "edges fixed" msgstr "Kanten korrigiert" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2690 +#: src/slic3r/GUI/DoubleSlider.cpp:1508 +msgid "Edit color" +msgstr "Farbe bearbeiten" + +#: src/slic3r/GUI/DoubleSlider.cpp:960 +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 +msgid "Edit custom G-code" +msgstr "Benutzerdefinierten G-Code bearbeiten" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3003 msgid "Edit Height Range" msgstr "Höhenbereich bearbeiten" -#: src/slic3r/GUI/GUI_ObjectList.cpp:373 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 +msgid "Edit pause print message" +msgstr "Druckpausen-Mitteilung bearbeiten" + +#: src/slic3r/GUI/DoubleSlider.cpp:1037 +msgid "Edit tick mark - Ctrl + Left click" +msgstr "Häkchen bearbeiten - Strg + Linksklick" + +#: src/slic3r/GUI/DoubleSlider.cpp:1038 +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 msgid "Editing" msgstr "Bearbeitung" -#: src/libslic3r/PrintConfig.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:547 +msgid "Ejec&t SD card / Flash drive" +msgstr "SD-Kar&te/Flash-Laufwerk auswerfen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Eject SD card / Flash drive" +msgstr "SD-Karte/Flash-Laufwerk auswerfen" + +#: src/slic3r/GUI/MainFrame.cpp:547 +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 +msgid "Ejecting of device %s(%s) has failed." +msgstr "Das Auswerfen von Gerät %s(%s) ist fehlgeschlagen." + +#: src/libslic3r/PrintConfig.cpp:118 msgid "Elephant foot compensation" -msgstr "Elefantenfuss Kompensation" +msgstr "Elefantenfußkompensation" -#: src/libslic3r/SLAPrint.cpp:681 -msgid "Elevation is too low for object. Use the \"Pad around obect\" feature to print the object without elevation." -msgstr "Die Höhe 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:2447 +msgid "Elephant foot minimum width" +msgstr "Elefantenfuß Mindestbreite" -#: src/libslic3r/SLAPrint.cpp:678 +#: src/libslic3r/SLAPrint.cpp:625 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:1044 +#: src/libslic3r/PrintConfig.cpp:1093 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/slic3r/GUI/Tab.cpp:1490 src/libslic3r/PrintConfig.cpp:1286 -#: src/libslic3r/PrintConfig.cpp:2099 +#: src/libslic3r/GCode.cpp:637 +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 msgid "Enable" msgstr "Aktivieren" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:313 msgid "Enable auto cooling" msgstr "Automatische Kühlung aktivieren" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:572 msgid "Enable fan if layer print time is below" -msgstr "Ventilator anschalten wenn die Schichtdruckzeit geringer ist als" +msgstr "Lüfter einschalten wenn die Schichtdruckzeit geringer ist als" -#: src/libslic3r/PrintConfig.cpp:2321 +#: src/libslic3r/PrintConfig.cpp:2908 +msgid "Enable hollowing" +msgstr "Aushöhlung aktivieren" + +#: src/libslic3r/PrintConfig.cpp:2380 msgid "Enable horizontal mirroring of output images" msgstr "Horizontale Spiegelung der Ausgabebilder aktivieren" -#: src/libslic3r/PrintConfig.cpp:1781 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Enable support material generation." msgstr "Aktiviert Generierung von Stützstrukturen." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:966 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." +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:881 +#: src/libslic3r/PrintConfig.cpp:929 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:2085 +#: src/libslic3r/PrintConfig.cpp:2186 msgid "Enable variable layer height feature" msgstr "Variable Schichthöhen aktivieren" -#: src/libslic3r/PrintConfig.cpp:2328 +#: src/libslic3r/PrintConfig.cpp:2387 msgid "Enable vertical mirroring of output images" msgstr "Vertikale Spiegelung der Ausgabebilder aktivieren" -#: src/slic3r/GUI/Tab.cpp:1570 src/slic3r/GUI/Tab.cpp:1955 -#: src/libslic3r/PrintConfig.cpp:359 src/libslic3r/PrintConfig.cpp:369 +#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:1982 +#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 msgid "End G-code" msgstr "G-Code am Ende" -#: src/libslic3r/PrintConfig.cpp:1838 +#: src/libslic3r/PrintConfig.cpp:1924 msgid "Enforce support for the first" msgstr "Erzwinge Stützstrukturen bei den ersten" -#: src/libslic3r/PrintConfig.cpp:1845 +#: src/libslic3r/PrintConfig.cpp:1931 msgid "Enforce support for the first n layers" -msgstr "Erzwinge Stützmaterial bei den ersten n Schichten" +msgstr "Erzwinge Stützstrukturen bei den ersten n Schichten" -#: src/slic3r/GUI/PrintHostDialogs.cpp:197 -#: src/slic3r/GUI/PrintHostDialogs.cpp:228 +#: src/slic3r/GUI/PrintHostDialogs.cpp:198 +#: src/slic3r/GUI/PrintHostDialogs.cpp:229 msgid "Enqueued" msgstr "In der Warteschlange" -#: src/libslic3r/PrintConfig.cpp:380 +#: src/libslic3r/PrintConfig.cpp:407 msgid "Ensure vertical shell thickness" -msgstr "Stelle die vertikale Hüllenstärke sicher" +msgstr "Stelle die vertikale Hüllenstärke sicher" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 +#: src/slic3r/GUI/DoubleSlider.cpp:1618 +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 msgid "Enter new name" msgstr "Geben Sie den neuen Namen ein" -#: src/slic3r/GUI/ConfigWizard.cpp:622 -msgid "Enter the bed temperature needed for getting your filament to stick to your heated bed." -msgstr "Geben Sie die Betttemperatur ein, die erforderlich ist, damit Ihr Filament an Ihrem beheizten Bett haftet." +#: src/slic3r/GUI/DoubleSlider.cpp:1634 +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:570 +#: src/slic3r/GUI/ConfigWizard.cpp:1047 +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 msgid "Enter the diameter of your filament." msgstr "Geben Sie den Durchmesser des Filaments ein." -#: src/slic3r/GUI/ConfigWizard.cpp:557 +#: src/slic3r/GUI/ConfigWizard.cpp:966 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "Geben Sie den Durchmesser der Hotenddüse ein." -#: src/slic3r/GUI/ConfigWizard.cpp:608 +#: src/slic3r/GUI/DoubleSlider.cpp:1650 +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 +msgid "Enter the number of copies:" +msgstr "Geben Sie die Anzahl der Kopien ein:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1033 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:718 +#: src/libslic3r/PrintConfig.cpp:761 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:686 +#: src/libslic3r/PrintConfig.cpp:718 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:678 +#: src/libslic3r/PrintConfig.cpp:710 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:636 src/slic3r/GUI/PrintHostDialogs.cpp:230 +#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:785 +#: src/slic3r/GUI/PrintHostDialogs.cpp:231 msgid "Error" msgstr "Fehler" -#: src/slic3r/GUI/FirmwareDialog.cpp:608 -#, possible-c-format +#: src/slic3r/GUI/FirmwareDialog.cpp:645 +#, c-format msgid "Error accessing port at %s: %s" msgstr "Fehler beim Zugriff auf Port bei %s:%s" -#: src/slic3r/GUI/Plater.cpp:3593 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:3433 +msgid "Error during reload" +msgstr "Fehler beim erneuten Laden" + +#: src/slic3r/GUI/Plater.cpp:5043 +#, c-format msgid "Error exporting 3MF file %s" msgstr "Fehler beim Exportieren der 3MF Datei %s" -#: src/slic3r/GUI/Plater.cpp:3564 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:5005 +#, c-format msgid "Error exporting AMF file %s" -msgstr "Fehler beim Exportieren der AMF Datei %s" +msgstr "Fehler beim Exportieren der AMF Datei %s" -#: src/slic3r/GUI/PrintHostDialogs.cpp:153 +#: src/slic3r/GUI/PrintHostDialogs.cpp:154 msgid "Error Message" msgstr "Fehlermeldung" -#: src/slic3r/GUI/PrintHostDialogs.cpp:271 +#: src/slic3r/GUI/AppConfig.cpp:114 +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." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:272 msgid "Error uploading to print host:" msgstr "Fehler beim Hochloden zu Druckhost:" -#: src/libslic3r/Zipper.cpp:105 +#: src/libslic3r/Zipper.cpp:102 msgid "Error with zip archive" msgstr "Fehler beim ZIP-Archiv" -#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/GUI_ObjectList.cpp:1443 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1918 msgid "Error!" msgstr "Fehler!" -#: src/slic3r/GUI/BedShapeDialog.cpp:482 +#: src/slic3r/GUI/BedShapeDialog.cpp:505 msgid "Error! Invalid model" msgstr "Fehler! Ungültiges Modell" -#: src/slic3r/GUI/FirmwareDialog.cpp:610 -#, possible-c-format +#: src/slic3r/GUI/FirmwareDialog.cpp:647 +#, c-format msgid "Error: %s" msgstr "Fehler: %s" -#: src/slic3r/GUI/Plater.cpp:1503 +#: src/slic3r/GUI/Job.hpp:123 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:217 src/slic3r/GUI/Plater.cpp:1028 -#: src/slic3r/GUI/Plater.cpp:1070 +#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1216 +#: src/slic3r/GUI/Plater.cpp:1258 msgid "Estimated printing time" msgstr "Erwartete Druckzeit" -#: src/slic3r/GUI/Plater.cpp:424 +#: src/slic3r/GUI/Plater.cpp:502 msgid "Everywhere" msgstr "Überall" -#: src/slic3r/GUI/PresetHints.cpp:50 +#: src/slic3r/GUI/PresetHints.cpp:51 msgid "except for the first %1% layers." msgstr "außer für die ersten %1% Schichten." -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:53 msgid "except for the first layer." msgstr "außer für die erste Schicht." -#: src/libslic3r/Print.cpp:1285 +#: src/libslic3r/Print.cpp:1377 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:148 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 +#, c-format msgid "Exit %s" msgstr "%s beenden" -#: src/libslic3r/PrintConfig.cpp:335 +#: src/libslic3r/PrintConfig.cpp:371 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:1306 +#: src/libslic3r/PrintConfig.cpp:1375 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:676 src/slic3r/GUI/wxExtensions.cpp:2461 +#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755 msgid "Expert" msgstr "Experte" -#: src/slic3r/GUI/GUI_App.cpp:676 +#: src/slic3r/GUI/ConfigWizard.cpp:822 +msgid "Expert mode" +msgstr "Expertenmodus" + +#: src/slic3r/GUI/GUI_App.cpp:815 msgid "Expert View Mode" msgstr "Experten Anzeigemodus" -#: src/slic3r/GUI/MainFrame.cpp:602 src/slic3r/GUI/Plater.cpp:3821 +#: src/slic3r/GUI/Plater.cpp:5521 msgid "Export" msgstr "Export" -#: src/slic3r/GUI/MainFrame.cpp:373 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export &Config" -msgstr "Export Konfiguration (&C)" +msgstr "Export &Konfiguration" -#: src/slic3r/GUI/MainFrame.cpp:362 src/slic3r/GUI/MainFrame.cpp:602 +#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:749 msgid "Export &G-code" msgstr "Export &G-Code" -#: src/slic3r/GUI/MainFrame.cpp:488 +#: src/slic3r/GUI/MainFrame.cpp:496 msgid "Export &toolpaths as OBJ" -msgstr "Werkzeugpfade als OBJ exportieren (&t)" +msgstr "&Werkzeugpfade als OBJ exportieren" -#: src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Export 3MF" msgstr "Export 3MF" -#: src/slic3r/GUI/MainFrame.cpp:375 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export all presets to file" msgstr "Exportiere alle Voreinstellungen in eine Datei" -#: src/libslic3r/PrintConfig.cpp:2954 +#: src/libslic3r/PrintConfig.cpp:3343 msgid "Export AMF" msgstr "Exportiere AMF" -#: src/slic3r/GUI/Plater.cpp:1932 +#: src/slic3r/GUI/Plater.cpp:2598 msgid "Export AMF file:" msgstr "Exportiere AMF Datei:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1219 src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1657 src/slic3r/GUI/Plater.cpp:3966 msgid "Export as STL" msgstr "Exportiere als STL" -#: src/slic3r/GUI/MainFrame.cpp:375 -msgid "Export Config &Bundle" -msgstr "Konfigurationssamlung exportieren (&B)" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +msgid "Export config" +msgstr "Konfiguration exportieren" -#: src/slic3r/GUI/MainFrame.cpp:373 +#: src/slic3r/GUI/MainFrame.cpp:503 +msgid "Export Config &Bundle" +msgstr "Konfigurationssa&mlung exportieren" + +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export current configuration to file" msgstr "Exportiere die aktuelle Konfiguration in eine Datei" -#: src/slic3r/GUI/MainFrame.cpp:370 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export current plate as AMF" msgstr "Exportiere die aktuelle Plattenbelegung als AMF" -#: src/slic3r/GUI/MainFrame.cpp:362 +#: src/slic3r/GUI/MainFrame.cpp:477 msgid "Export current plate as G-code" msgstr "Exportiere die aktuelle Plattenbelegung als G-Code" -#: src/slic3r/GUI/MainFrame.cpp:366 +#: src/slic3r/GUI/MainFrame.cpp:521 +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 msgid "Export current plate as STL" msgstr "Exportiere die aktuelle Plattenbelegung als STL" -#: src/slic3r/GUI/MainFrame.cpp:368 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export current plate as STL including supports" -msgstr "Exportiert die aktuelle Plattenbelegung als STL einschliesslich Stützstrukturen" +msgstr "Exportiert die aktuelle Plattenbelegung als STL einschließlich Stützstrukturen" -#: src/slic3r/GUI/Plater.cpp:2722 +#: src/slic3r/GUI/Plater.cpp:3664 msgid "Export failed" msgstr "Export ist fehlgeschlagen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/Plater.cpp:733 -#: src/slic3r/GUI/Plater.cpp:3821 src/libslic3r/PrintConfig.cpp:2964 +#: src/slic3r/GUI/ConfigWizard.cpp:801 +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 msgid "Export G-code" msgstr "Export G-Code" -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/slic3r/GUI/MainFrame.cpp:521 +msgid "Export G-code to SD card / Flash drive" +msgstr "G-Code auf SD-Karte/Flash-Laufwerk exportieren" + +#: src/libslic3r/PrintConfig.cpp:3320 msgid "Export OBJ" msgstr "Exportiere OBJ" -#: src/slic3r/GUI/Plater.cpp:2531 +#: src/slic3r/GUI/Plater.cpp:2610 msgid "Export OBJ file:" msgstr "Exportiere OBJ Datei:" @@ -2041,55 +2521,63 @@ 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:370 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export plate as &AMF" -msgstr "Exportiere die Plattenbelegung als $AMF" +msgstr "Exportiere die Plattenbelegung als &AMF" -#: src/slic3r/GUI/MainFrame.cpp:366 +#: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export plate as &STL" msgstr "Exportiere die Plattenbelegung als &STL" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export plate as STL &including supports" -msgstr "Exportiere Plattenbelegung als STL einschliesslich Stützstrukturen" +msgstr "Export&iere Plattenbelegung als STL einschließlich Stützstrukturen" -#: src/libslic3r/PrintConfig.cpp:2943 +#: src/libslic3r/PrintConfig.cpp:3332 msgid "Export SLA" msgstr "Exportiere SLA" -#: src/libslic3r/PrintConfig.cpp:2959 +#: src/slic3r/GUI/Preferences.cpp:72 +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 msgid "Export STL" msgstr "Exportiere STL" -#: src/slic3r/GUI/Plater.cpp:1925 +#: src/slic3r/GUI/Plater.cpp:2591 msgid "Export STL file:" msgstr "Exportiere STL Datei:" -#: src/libslic3r/PrintConfig.cpp:2950 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "Export the model(s) as 3MF." msgstr "Exportiert das/die Modell(e) als 3MF Datei." -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3344 msgid "Export the model(s) as AMF." msgstr "Exportiert das/die Modell(e) als AMF Datei." -#: src/libslic3r/PrintConfig.cpp:2932 +#: src/libslic3r/PrintConfig.cpp:3321 msgid "Export the model(s) as OBJ." msgstr "Exportiert das/die Modell(e) als OBJ Datei." -#: src/libslic3r/PrintConfig.cpp:2960 +#: src/libslic3r/PrintConfig.cpp:3349 msgid "Export the model(s) as STL." msgstr "Exportiert das/die Modell(e) als STL Datei." -#: src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/Plater.cpp:3966 msgid "Export the selected object as STL file" msgstr "Exportiere das gewählte Objekt als STL Datei" -#: src/slic3r/GUI/MainFrame.cpp:488 +#: src/slic3r/GUI/Plater.cpp:880 +msgid "Export to SD card / Flash drive" +msgstr "Export auf SD-Karte/Flash-Laufwerk" + +#: src/slic3r/GUI/MainFrame.cpp:496 msgid "Export toolpaths as OBJ" msgstr "Werkzeugpfad als OBJ exportieren" -#: src/libslic3r/Print.cpp:1517 +#: src/libslic3r/Print.cpp:1638 msgid "Exporting G-code" msgstr "Exportiere G-Code" @@ -2102,139 +2590,143 @@ msgstr "Exportiere Modell..." msgid "Exporting source model" msgstr "Exportieren des Quellmodells" -#: src/libslic3r/SLAPrint.cpp:700 +#: src/libslic3r/SLAPrint.cpp:646 msgid "Exposition time is out of printer profile bounds." msgstr "Belichtungszeit ist außerhalb der Druckerprofilgrenzen." -#: src/slic3r/GUI/Tab.cpp:3306 +#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:3515 msgid "Exposure" msgstr "Belichtung" -#: src/libslic3r/PrintConfig.cpp:2310 src/libslic3r/PrintConfig.cpp:2311 +#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542 msgid "Exposure time" msgstr "Belichtungszeit" -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/GCode/PreviewData.cpp:164 +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311 msgid "External perimeter" -msgstr "Aussenschicht" +msgstr "Außenkontur" -#: src/slic3r/GUI/PresetHints.cpp:153 +#: src/slic3r/GUI/PresetHints.cpp:156 msgid "external perimeters" -msgstr "Aussenschichten" +msgstr "Außenkonturen" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:425 +#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457 msgid "External perimeters" -msgstr "Aussenschichten" +msgstr "Außenkonturen" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:469 msgid "External perimeters first" -msgstr "Aussenkonturen zuerst drucken" +msgstr "Außenkonturen zuerst drucken" -#: src/libslic3r/PrintConfig.cpp:1518 src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596 msgid "Extra length on restart" msgstr "Extra Länge bei Neustart" -#: src/libslic3r/PrintConfig.cpp:1321 +#: src/libslic3r/PrintConfig.cpp:1390 msgid "Extra loading distance" msgstr "Zusätzliche Ladestrecke" -#: src/libslic3r/PrintConfig.cpp:445 +#: src/libslic3r/PrintConfig.cpp:477 msgid "Extra perimeters if needed" msgstr "Extra Konturen wenn notwendig" -#: src/slic3r/GUI/GUI_ObjectList.cpp:335 src/slic3r/GUI/Tab.cpp:1479 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1434 +#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487 msgid "Extruder" msgstr "Extruder" -#: src/slic3r/GUI/Tab.cpp:2253 src/libslic3r/GCode/PreviewData.cpp:475 -#, possible-c-format +#: 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 msgid "Extruder %d" msgstr "Extruder %d" -#: src/slic3r/GUI/ConfigWizard.cpp:592 +#: src/slic3r/GUI/DoubleSlider.cpp:1011 +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:226 +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" msgstr "Extruder geändert auf" -#: src/slic3r/GUI/Tab.cpp:1171 +#: src/slic3r/GUI/Tab.cpp:1233 msgid "Extruder clearance (mm)" msgstr "Extruder Abstand (mm)" -#: src/libslic3r/PrintConfig.cpp:490 +#: src/libslic3r/PrintConfig.cpp:522 msgid "Extruder Color" msgstr "Extruder Farbe" -#: src/libslic3r/PrintConfig.cpp:497 +#: src/libslic3r/PrintConfig.cpp:529 msgid "Extruder offset" msgstr "Extruder Offset" -#: src/libslic3r/PrintConfig.cpp:863 +#: 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." +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:1978 +#: 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 im Ausgabedatei zu deaktivieren." +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:33 src/slic3r/GUI/GUI_ObjectList.cpp:72 -#: src/slic3r/GUI/GUI_ObjectList.cpp:513 src/slic3r/GUI/Tab.cpp:1119 -#: src/slic3r/GUI/Tab.cpp:1844 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:954 src/libslic3r/PrintConfig.cpp:1340 -#: src/libslic3r/PrintConfig.cpp:1668 src/libslic3r/PrintConfig.cpp:1852 -#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:2151 -#: src/libslic3r/PrintConfig.cpp:2159 +#: 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 msgid "Extruders" msgstr "Extruder" -#: src/libslic3r/PrintConfig.cpp:507 +#: src/libslic3r/PrintConfig.cpp:539 msgid "Extrusion axis" msgstr "Extrusionsachse" -#: src/libslic3r/PrintConfig.cpp:513 +#: src/libslic3r/PrintConfig.cpp:545 msgid "Extrusion multiplier" msgstr "Extrusionsfaktor" -#: src/slic3r/GUI/ConfigWizard.cpp:612 +#: src/slic3r/GUI/ConfigWizard.cpp:1037 msgid "Extrusion Temperature:" msgstr "Extrusionstemperatur:" -#: src/slic3r/GUI/Tab.cpp:1143 +#: src/slic3r/GUI/Tab.cpp:1205 msgid "Extrusion width" msgstr "Extrusionbreite" -#: src/slic3r/GUI/GUI_ObjectList.cpp:73 src/slic3r/GUI/GUI_ObjectList.cpp:514 -#: src/libslic3r/PrintConfig.cpp:416 src/libslic3r/PrintConfig.cpp:523 -#: src/libslic3r/PrintConfig.cpp:830 src/libslic3r/PrintConfig.cpp:962 -#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1688 -#: src/libslic3r/PrintConfig.cpp:1861 src/libslic3r/PrintConfig.cpp:2018 +#: 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 msgid "Extrusion Width" msgstr "Extrusionsbreite" -#: src/slic3r/GUI/Plater.cpp:139 +#: src/slic3r/GUI/Plater.cpp:162 msgid "Facets" msgstr "Flächen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:240 +#: src/slic3r/GUI/GUI_ObjectList.cpp:349 msgid "facets added" msgstr "Facetten hinzugefügt" -#: src/slic3r/GUI/GUI_ObjectList.cpp:239 +#: src/slic3r/GUI/GUI_ObjectList.cpp:348 msgid "facets removed" msgstr "Facetten enfernt" -#: src/slic3r/GUI/GUI_ObjectList.cpp:241 +#: src/slic3r/GUI/GUI_ObjectList.cpp:350 msgid "facets reversed" msgstr "Facetten umgekehrt" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2517 msgid "Faded layers" msgstr "Ausblendende Schichten" -#: src/libslic3r/Zipper.cpp:47 +#: src/libslic3r/Zipper.cpp:44 msgid "failed finding central directory" msgstr "Zentrales Verzeichnis nicht gefunden" @@ -2242,530 +2734,655 @@ msgstr "Zentrales Verzeichnis nicht gefunden" msgid "Failed loading the input model." msgstr "Das Laden des Inputmodells ist fehlgeschlagen." -#: src/libslic3r/PrintBase.cpp:65 +#: src/libslic3r/PrintBase.cpp:71 msgid "Failed processing of the output_filename_format template." msgstr "Die Verarbeitung der output_filename_format Vorlage ist fehlgeschlagen." -#: src/slic3r/GUI/PresetHints.cpp:41 +#: src/slic3r/GUI/PresetHints.cpp:42 msgid "Fan" msgstr "Kühllüfter" -#: src/slic3r/GUI/Tab.cpp:1501 +#: src/slic3r/GUI/Tab.cpp:1456 msgid "Fan settings" -msgstr "Ventilator Einstellungen" +msgstr "Lüfter Einstellungen" -#: src/slic3r/GUI/Tab.cpp:1502 +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1457 msgid "Fan speed" -msgstr "Ventilatorgeschwindigkeit" +msgstr "Lüftergeschwindigkeit" -#: src/libslic3r/PrintConfig.cpp:2240 +#: src/libslic3r/GCode/PreviewData.cpp:353 +msgid "Fan Speed (%)" +msgstr "Lüftergeschwindigkeit (%)" + +#: src/libslic3r/PrintConfig.cpp:2405 msgid "Fast" msgstr "Schnell" -#: src/libslic3r/PrintConfig.cpp:2241 +#: src/libslic3r/PrintConfig.cpp:2406 msgid "Fast tilt" msgstr "Schnelles Kippen" -#: src/slic3r/GUI/GUI_App.cpp:135 +#: src/slic3r/GUI/GUI_App.cpp:141 msgid "Fatal error" msgstr "Fataler Fehler" -#: src/slic3r/GUI/GUI_Preview.cpp:212 src/slic3r/GUI/GUI_Preview.cpp:537 -#: src/libslic3r/GCode/PreviewData.cpp:394 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/GUI_Preview.cpp:575 +#: src/libslic3r/GCode/PreviewData.cpp:345 msgid "Feature type" msgstr "Merkmalstyp" -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:225 +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235 msgid "Feature types" msgstr "Merkmalstypen" -#: src/slic3r/GUI/Plater.cpp:682 src/slic3r/GUI/Tab.cpp:1470 -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/ConfigWizard.cpp:1525 +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 msgid "Filament" msgstr "Filament" -#: src/slic3r/GUI/Preset.cpp:1275 +#: src/slic3r/GUI/Preset.cpp:1522 msgid "filament" msgstr "Filament" -#: src/slic3r/GUI/ConfigWizard.cpp:541 +#: src/slic3r/GUI/ConfigWizard.cpp:952 msgid "Filament and Nozzle Diameters" msgstr "Filament- und Düsendurchmesser" -#: src/slic3r/GUI/ConfigWizard.cpp:574 +#: src/slic3r/GUI/ConfigWizard.cpp:983 msgid "Filament Diameter:" msgstr "Filamentdurchmesser:" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:651 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:654 +#: src/libslic3r/PrintConfig.cpp:686 msgid "Filament load time" msgstr "Filament Ladezeit" -#: src/libslic3r/PrintConfig.cpp:556 +#: src/libslic3r/PrintConfig.cpp:588 msgid "Filament notes" msgstr "Filament Bemerkungen" -#: src/slic3r/GUI/Tab.cpp:1502 src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1378 msgid "Filament Overrides" msgstr "Filament Übersteuerung" -#: src/libslic3r/PrintConfig.cpp:1312 +#: src/libslic3r/PrintConfig.cpp:1381 msgid "Filament parking position" msgstr "Filament Parkposition" -#: src/slic3r/GUI/Tab.cpp:1516 +#: src/slic3r/GUI/ConfigWizard.cpp:2013 +msgid "Filament Profiles Selection" +msgstr "Filament Profile Auswahl" + +#: src/slic3r/GUI/Tab.cpp:1471 msgid "Filament properties" msgstr "Filament Eigenschaften" -#: src/slic3r/GUI/Tab.hpp:335 +#: src/slic3r/GUI/Tab.hpp:355 msgid "Filament Settings" msgstr "Filamenteinstellungen" -#: src/libslic3r/PrintConfig.cpp:694 +#: src/libslic3r/PrintConfig.cpp:726 msgid "Filament type" msgstr "Filament Typ" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:701 msgid "Filament unload time" msgstr "Filament Entladezeit" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "filaments" msgstr "Filamente" -#: src/libslic3r/Zipper.cpp:75 -msgid "file close failed" -msgstr "Dateischliessen fehlgeschlagen" +#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2013 +msgid "Filaments" +msgstr "Filamente" -#: src/libslic3r/Zipper.cpp:69 +#: src/libslic3r/Zipper.cpp:72 +msgid "file close failed" +msgstr "Dateischließen fehlgeschlagen" + +#: src/libslic3r/Zipper.cpp:66 msgid "file create failed" msgstr "Dateierzeugen fehlgeschlagen" -#: src/slic3r/GUI/MainFrame.cpp:642 +#: src/slic3r/GUI/MainFrame.cpp:791 msgid "File Not Found" msgstr "Datei nicht gefunden" -#: src/libslic3r/Zipper.cpp:89 +#: src/libslic3r/Zipper.cpp:86 msgid "file not found" msgstr "Datei nicht gefunden" -#: src/libslic3r/Zipper.cpp:67 +#: src/libslic3r/Zipper.cpp:64 msgid "file open failed" msgstr "Öffnen der Datei fehlgeschlagen" -#: src/libslic3r/Zipper.cpp:73 +#: src/libslic3r/Zipper.cpp:70 msgid "file read failed" msgstr "Dateilesen fehlgeschlagen" -#: src/libslic3r/Zipper.cpp:77 +#: src/libslic3r/Zipper.cpp:74 msgid "file seek failed" msgstr "Dateizugriff fehlgeschlagen" -#: src/libslic3r/Zipper.cpp:79 +#: src/libslic3r/Zipper.cpp:76 msgid "file stat failed" msgstr "Zugriff auf Dateieigenschaften fehlgeschlagen" -#: src/libslic3r/Zipper.cpp:39 +#: src/libslic3r/Zipper.cpp:36 msgid "file too large" msgstr "Datei zu groß" -#: src/libslic3r/Zipper.cpp:71 +#: src/libslic3r/Zipper.cpp:68 msgid "file write failed" msgstr "Schreiben der Datei fehlgeschlagen" -#: src/slic3r/GUI/PrintHostDialogs.cpp:152 +#: src/slic3r/GUI/PrintHostDialogs.cpp:153 msgid "Filename" msgstr "Dateiname" -#: src/libslic3r/PrintConfig.cpp:728 +#: src/libslic3r/PrintConfig.cpp:775 msgid "Fill angle" msgstr "Füllwinkel" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:789 msgid "Fill density" msgstr "Fülldichte" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:826 msgid "Fill pattern" msgstr "Füllmuster" -#: src/libslic3r/PrintConfig.cpp:410 +#: src/libslic3r/PrintConfig.cpp:437 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 soliden Konturen." +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:781 +#: src/libslic3r/PrintConfig.cpp:828 msgid "Fill pattern for general low-density infill." msgstr "Füllmuster für allgemeines Infill mit niedriger Dichte." -#: src/libslic3r/PrintConfig.cpp:390 +#: src/libslic3r/PrintConfig.cpp:417 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 festen Schalen." +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/BonjourDialog.cpp:225 msgid "Finished" msgstr "Fertig" -#: src/slic3r/GUI/ConfigWizard.cpp:486 src/slic3r/GUI/Tab.cpp:1920 +#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1947 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/FirmwareDialog.cpp:740 +#: src/slic3r/GUI/FirmwareDialog.cpp:777 msgid "Firmware flasher" msgstr "Firmware Flasher" -#: src/slic3r/GUI/FirmwareDialog.cpp:765 +#: src/slic3r/GUI/FirmwareDialog.cpp:802 msgid "Firmware image:" msgstr "Firmware Image:" -#: src/slic3r/GUI/Tab.cpp:2431 +#: src/slic3r/GUI/Tab.cpp:2577 msgid "Firmware Retraction" msgstr "Firmware Einzug" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:891 msgid "Firmware Type" msgstr "Firmware Typ" -#: src/libslic3r/PrintConfig.cpp:812 src/libslic3r/PrintConfig.cpp:821 -#: src/libslic3r/PrintConfig.cpp:829 src/libslic3r/PrintConfig.cpp:862 +#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868 +#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910 msgid "First layer" msgstr "Erste Schicht" -#: src/libslic3r/PrintConfig.cpp:841 +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889 msgid "First layer height" msgstr "Höhe der ersten Schicht" -#: src/libslic3r/Print.cpp:1328 +#: src/libslic3r/Print.cpp:1422 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:852 +#: src/libslic3r/PrintConfig.cpp:900 msgid "First layer speed" msgstr "Druckgeschwindigkeit der ersten Schicht" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "First layer volumetric" msgstr "Volumenparameter der ersten Schicht" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1210 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 msgid "Fix through the Netfabb" msgstr "Reparieren mittels Netfabb" -#: src/slic3r/GUI/Plater.cpp:3072 +#: src/slic3r/GUI/Plater.cpp:3473 msgid "Fix Throught NetFabb" msgstr "Reparieren mittels Netfabb" -#: src/slic3r/GUI/GUI_App.cpp:685 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Flash printer &firmware" msgstr "Flashe Drucker &Firmware" -#: src/slic3r/GUI/FirmwareDialog.cpp:146 +#: src/slic3r/GUI/FirmwareDialog.cpp:150 msgid "Flash!" msgstr "Flash!" -#: src/slic3r/GUI/FirmwareDialog.cpp:275 +#: src/slic3r/GUI/FirmwareDialog.cpp:284 msgid "Flashing cancelled." msgstr "Flashen abgebrochen." -#: src/slic3r/GUI/FirmwareDialog.cpp:192 +#: src/slic3r/GUI/FirmwareDialog.cpp:199 msgid "Flashing failed" msgstr "Flashen fehlgeschlagen" -#: src/slic3r/GUI/FirmwareDialog.cpp:274 +#: src/slic3r/GUI/FirmwareDialog.cpp:283 msgid "Flashing failed. Please see the avrdude log below." msgstr "Flashen misslungen. Bitte überprüfen Sie das Avrdude log unterhalb." -#: src/slic3r/GUI/FirmwareDialog.cpp:148 +#: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flashing in progress. Please do not disconnect the printer!" msgstr "Es wird geflashed. Bitte nicht den Drucker abklemmen!" -#: src/slic3r/GUI/FirmwareDialog.cpp:273 +#: src/slic3r/GUI/FirmwareDialog.cpp:282 msgid "Flashing succeeded!" msgstr "Flashen erfolgreich!" -#: src/slic3r/GUI/Tab.cpp:1156 +#: src/slic3r/GUI/Tab.cpp:1218 msgid "Flow" msgstr "Fluss" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:220 msgid "flow rate is maximized" msgstr "die Durchflussmenge ist am Maximum" -#: src/slic3r/GUI/UpdateDialogs.cpp:188 +#: src/slic3r/GUI/UpdateDialogs.cpp:286 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:435 src/slic3r/GUI/Plater.cpp:528 +#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Plater.cpp:624 msgid "For support enforcers only" msgstr "Nur für Stützverstärker" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3345 -msgid "for the left button: \tindicates a non-system (or non-default) preset,\nfor the right button: \tindicates 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/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/libslic3r/Print.cpp:1302 +#: 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 "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 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:1660 +#: src/libslic3r/PrintConfig.cpp:2864 +msgid "Force pad around object everywhere" +msgstr "Grundschicht überall um Objekt erzwingen" + +#: src/libslic3r/PrintConfig.cpp:1729 msgid "Force solid infill for regions having a smaller area than the specified threshold." -msgstr "Feste Füllung für Bereiche, die eine kleinere Fläche als die angegebene Schwelle aufweisen." +msgstr "Massives Infill für Bereiche, die eine kleinere Fläche als die angegebene Schwelle aufweisen." -#: src/libslic3r/PrintConfig.cpp:1023 +#: src/libslic3r/PrintConfig.cpp:1072 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 festen Schalen zwischen benachbarten Materialien/Volumina. Geeignet für Multiextruderdrucke mit transluzenten Materialien oder manuell löslichen Trägermaterialien." +msgstr "Erzwingt die Erzeugung von massiven Schalen zwischen benachbarten Materialien/Volumina. Geeignet für Multiextruderdrucke mit transluzenten Materialien oder manuell löslichen Trägermaterialien." -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 msgid "From" msgstr "Von" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1853 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2223 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:525 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front" msgstr "Front" -#: src/slic3r/GUI/MainFrame.cpp:525 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front View" msgstr "Frontalansicht" -#: src/slic3r/GUI/MainFrame.cpp:677 +#: src/slic3r/GUI/Tab.cpp:1013 +msgid "full profile name" +msgstr "vollständiger Profilname" + +#: src/slic3r/GUI/MainFrame.cpp:826 msgid "G-code" msgstr "G-Code" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:87 +#: 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/BackgroundSlicingProcess.cpp:130 msgid "G-code file exported to %1%" msgstr "G-Code Datei exportiert nach %1%" -#: src/libslic3r/PrintConfig.cpp:888 +#: src/libslic3r/PrintConfig.cpp:936 msgid "G-code flavor" msgstr "G-Code Typ" -#: src/libslic3r/PrintConfig.cpp:689 +#: src/libslic3r/PrintConfig.cpp:721 msgid "g/cm³" msgstr "g/cm³" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/PrintConfig.cpp:870 -#: src/libslic3r/GCode/PreviewData.cpp:170 +#: src/libslic3r/PrintConfig.cpp:2505 +msgid "g/ml" +msgstr "g/ml" + +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/PrintConfig.cpp:918 msgid "Gap fill" msgstr "Lückenfüllung" -#: src/slic3r/GUI/Preferences.cpp:19 src/slic3r/GUI/Tab.cpp:1812 -#: src/slic3r/GUI/Tab.cpp:2013 +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1796 +#: src/slic3r/GUI/Tab.cpp:2040 msgid "General" msgstr "Allgemein" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1307 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:1779 +#: src/libslic3r/PrintConfig.cpp:1865 msgid "Generate support material" msgstr "Generiere Stützstrukturen" -#: src/libslic3r/PrintConfig.cpp:1840 +#: src/libslic3r/PrintConfig.cpp:1926 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ü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." +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." -#: src/libslic3r/PrintConfig.cpp:2362 +#: src/libslic3r/PrintConfig.cpp:2613 msgid "Generate supports" msgstr "Stützstrukturen generieren" -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2615 msgid "Generate supports for the models" msgstr "Erzeugt Stützstrukturen für die Modelle" -#: src/libslic3r/Print.cpp:1492 +#: src/libslic3r/Print.cpp:1614 msgid "Generating brim" msgstr "Generiere Rand" -#: src/libslic3r/Print.cpp:1524 +#: src/libslic3r/Print.cpp:1642 msgid "Generating G-code" msgstr "Generiere G-Code" -#: src/libslic3r/SLAPrint.cpp:58 +#: src/libslic3r/SLAPrintSteps.cpp:48 msgid "Generating pad" msgstr "Generiere Grundschicht" -#: src/libslic3r/PrintObject.cpp:141 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" -msgstr "Generiere Aussenschichten" +msgstr "Generiere Außenkonturen" -#: src/libslic3r/Print.cpp:1484 +#: src/libslic3r/Print.cpp:1606 msgid "Generating skirt" msgstr "Generiere Schürze" -#: src/libslic3r/PrintObject.cpp:391 +#: src/libslic3r/PrintObject.cpp:395 msgid "Generating support material" msgstr "Generiere Stützstrukturen" -#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:809 +#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356 msgid "Generating support points" msgstr "Erzeuge Stützpunkte" -#: src/libslic3r/SLAPrint.cpp:57 +#: src/libslic3r/SLAPrintSteps.cpp:47 msgid "Generating support tree" msgstr "Erzeuge Baumstützstruktur" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2022 msgid "Generic" msgstr "Generisch" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 msgid "Gizmo cut" msgstr "Gizmo Schnitt" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Gizmo move" msgstr "Gizmo Bewegung" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Gizmo Place face on bed" msgstr "Gizmo auf Fläche platzieren" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Gizmo rotate" msgstr "Gizmo Rotieren" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Gizmo scale" msgstr "Gizmo Skalieren" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +msgid "Gizmo SLA hollow" +msgstr "Gizmo SLA Aushöhlung" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 msgid "Gizmo SLA support points" msgstr "Gizmo SLA Stützpunkte" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:641 +#: src/slic3r/GUI/GLCanvas3D.cpp:2921 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 msgid "Gizmo-Move" msgstr "Gizmo Bewegen" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:569 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:489 msgid "Gizmo-Place on Face" msgstr "Gizmo Auf Fläche legen" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:651 +#: src/slic3r/GUI/GLCanvas3D.cpp:3001 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:564 msgid "Gizmo-Rotate" msgstr "Gizmo-Rotation" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:646 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:563 msgid "Gizmo-Scale" msgstr "Gizmo Skalierung" -#: src/slic3r/GUI/AboutDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +msgid "Gizmos" +msgstr "Gizmos" + +#: src/slic3r/GUI/AboutDialog.cpp:259 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, Version 3" -#: src/slic3r/GUI/ConfigWizard.cpp:571 +#: src/slic3r/GUI/ConfigWizard.cpp:980 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:797 +#: src/libslic3r/PrintConfig.cpp:844 msgid "Grid" msgstr "Gitternetz" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1846 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2454 msgid "Group manipulation" msgstr "Gruppenbearbeitung" -#: src/libslic3r/PrintConfig.cpp:805 +#: src/slic3r/GUI/Preferences.cpp:133 +msgid "GUI" +msgstr "GUI" + +#: src/libslic3r/PrintConfig.cpp:852 msgid "Gyroid" msgstr "Gyroid" -#: src/slic3r/GUI/Tab.cpp:2775 +#: src/slic3r/GUI/Tab.cpp:2937 msgid "has the following unsaved changes:" msgstr "hat die folgenden ungesicherten Änderungen:" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:840 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 msgid "Head diameter" msgstr "Kopfdurchmesser" -#: src/libslic3r/PrintConfig.cpp:822 -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/ConfigManipulation.cpp:317 +msgid "Head penetration should not be greater than the head width." +msgstr "Die Kopfeindringung sollte nicht größer als die Kopfbreite sein." -#: src/slic3r/GUI/GUI_Preview.cpp:213 src/libslic3r/PrintConfig.cpp:468 +#: src/libslic3r/PrintConfig.cpp:869 +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 msgid "Height" msgstr "Höhe" -#: src/libslic3r/GCode/PreviewData.cpp:396 +#: src/libslic3r/GCode/PreviewData.cpp:347 msgid "Height (mm)" msgstr "Höhe (mm)" -#: src/libslic3r/PrintConfig.cpp:1618 +#: src/libslic3r/PrintConfig.cpp:1688 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." +msgstr "Höhe der Schürze in Schichten. Eine hohe Schürze kann gegen Zugluft schützen." -#: src/libslic3r/PrintConfig.cpp:2209 +#: src/libslic3r/PrintConfig.cpp:2360 msgid "Height of the display" msgstr "Displayhöhe" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1350 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1500 msgid "Height range Modifier" msgstr "Höhenbereich Modifizierer" -#: src/slic3r/GUI/GLCanvas3D.cpp:3650 src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 msgid "Height ranges" msgstr "Höhenbereiche" -#: src/libslic3r/PrintConfig.cpp:226 +#: src/libslic3r/PrintConfig.cpp:261 msgid "Heights at which a filament change is to occur." msgstr "Höhen, bei denen eine Filamentwechsel stattfinden soll." -#: src/slic3r/GUI/ConfigWizard.cpp:300 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:433 +#, 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:2976 +#: src/libslic3r/PrintConfig.cpp:3365 msgid "Help" msgstr "Hilfe" -#: src/libslic3r/PrintConfig.cpp:2982 +#: src/libslic3r/PrintConfig.cpp:3371 msgid "Help (FFF options)" msgstr "Hilfe (FFF Optionen)" -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3376 msgid "Help (SLA options)" msgstr "Hilfe (SLA Optionen)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." msgstr "Hier können Sie das erforderliche Reinigungsvolumen (mm³) für ein beliebiges Werkzeugpaar einstellen." -#: src/libslic3r/PrintConfig.cpp:925 +#: src/libslic3r/PrintConfig.cpp:973 msgid "High extruder current on filament swap" msgstr "Hohe Extruderstromstärke beim Filamentwechsel" -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:806 +#: src/slic3r/GUI/GLCanvas3D.cpp:277 +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 msgid "Hilbert Curve" msgstr "HIlbertkurve" -#: src/slic3r/GUI/Plater.cpp:873 +#: src/slic3r/GUI/Plater.cpp:1042 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/libslic3r/PrintConfig.cpp:803 src/libslic3r/PrintConfig.cpp:1924 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Hole depth" +msgstr "Lochtiefe" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +msgid "Hole diameter" +msgstr "Lochdurchmesser" + +#: src/slic3r/GUI/Plater.cpp:2760 +msgid "Hollow" +msgstr "Aushöhlen" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:977 +msgid "Hollow and drill" +msgstr "Aushöhlen und Bohren" + +#: src/libslic3r/PrintConfig.cpp:2910 +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 +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 +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 +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 +msgid "Hollowing model" +msgstr "Aushöhlen des Modells" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:813 +msgid "Hollowing parameter change" +msgstr "Änderung der Aushöhlungsparameter" + +#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011 msgid "Honeycomb" msgstr "Bienenwabe" -#: src/slic3r/GUI/Tab.cpp:1013 +#: src/slic3r/GUI/Tab.cpp:1064 msgid "Horizontal shells" msgstr "Horizontale Konturhüllen" -#: src/libslic3r/PrintConfig.cpp:209 +#: src/libslic3r/PrintConfig.cpp:245 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:151 +#: src/slic3r/GUI/PrintHostDialogs.cpp:152 msgid "Host" msgstr "Host" -#: src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Host Type" msgstr "Host Typ" @@ -2773,162 +3390,197 @@ msgstr "Host Typ" msgid "Hostname" msgstr "Hostname" -#: src/libslic3r/PrintConfig.cpp:81 +#: src/libslic3r/PrintConfig.cpp:97 msgid "Hostname, IP or URL" msgstr "Hostname, IP oder URL" -#: src/slic3r/GUI/Tab.cpp:136 -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/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/libslic3r/PrintConfig.cpp:2734 +#: src/libslic3r/PrintConfig.cpp:2812 +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 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:2380 +#: src/libslic3r/PrintConfig.cpp:2631 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:2642 +#: src/libslic3r/PrintConfig.cpp:2755 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:95 +#: src/libslic3r/PrintConfig.cpp:111 msgid "HTTPS CA File" msgstr "HTTPS CA Datei" -#: src/slic3r/GUI/Tab.cpp:1731 +#: src/slic3r/GUI/Tab.cpp:1713 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/Tab.cpp:1773 -#, possible-c-format -msgid "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." -msgstr "HTTPS CA-Datei:\nAuf diesem System verwendet %s HTTPS-Zertifikate aus dem System Zertifikatsspeicher oder Schlüsselbund. Um eine benutzerdefinierte CA-Datei zu verwenden, importieren Sie bitte Ihre CA-Datei in den Zertifikatsspeicher / Schlüsselbund." - -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:222 msgid "Icon size in a respect to the default size" msgstr "Symbolgröße in Bezug auf die Standardgröße" -#: src/slic3r/GUI/PrintHostDialogs.cpp:148 +#: src/slic3r/GUI/PrintHostDialogs.cpp:149 msgid "ID" msgstr "ID" -#: src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1873 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." -#: src/slic3r/GUI/ConfigWizard.cpp:413 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:773 +#, 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:423 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:783 +#, 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:1774 +#: src/libslic3r/PrintConfig.cpp:1852 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/Preferences.cpp:63 +#: 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/Preferences.cpp:74 +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 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:71 +#: src/slic3r/GUI/Preferences.cpp:82 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:105 +#: src/slic3r/GUI/Preferences.cpp:106 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/slic3r/GUI/Preferences.cpp:112 +#: src/libslic3r/PrintConfig.cpp:1696 +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 +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 +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 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:119 +#: src/slic3r/GUI/Preferences.cpp:145 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:28 +#: src/slic3r/GUI/PresetHints.cpp:29 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)." +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/libslic3r/PrintConfig.cpp:853 +#: src/slic3r/GUI/PresetHints.cpp:36 +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 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:540 +#: src/libslic3r/PrintConfig.cpp:573 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:1636 +#: src/libslic3r/PrintConfig.cpp:1706 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:534 +#: src/libslic3r/PrintConfig.cpp:567 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:46 +#: src/slic3r/GUI/Preferences.cpp:49 msgid "If this is enabled, Slic3r will auto-center objects around the print bed center." -msgstr "Wenn diese Option aktiviert ist, zentriert Slic3r Objekte automatisch um die Mitte des Druckbettes." +msgstr "Wenn diese Option aktiviert ist, zentriert PrusaSlicer Objekte automatisch um die Mitte des Druckbettes." -#: src/slic3r/GUI/Preferences.cpp:54 +#: src/slic3r/GUI/Preferences.cpp:57 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 Slic3r Objekte vorverarbeiten, sobald sie geladen werden, um Zeit beim Export von G-Code zu sparen." +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:38 +#: src/slic3r/GUI/Preferences.cpp:41 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 Slic3r das letzte Ausgabeverzeichnis anstelle des Verzeichnisses, in dem sich die Eingabedateien befinden." +msgstr "Wenn diese Option aktiviert ist, öffnet PrusaSlicer das letzte Ausgabeverzeichnis anstelle des Verzeichnisses, in dem sich die Eingabedateien befinden." -#: src/libslic3r/PrintConfig.cpp:1492 +#: src/libslic3r/PrintConfig.cpp:1562 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:1501 +#: src/libslic3r/PrintConfig.cpp:1571 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:1510 +#: src/libslic3r/PrintConfig.cpp:1580 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:1384 +#: src/libslic3r/PrintConfig.cpp:1454 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 werden als erstes Argument die absoluten Pfad zur G-Code-Datei übergeben, und sie können auf die Slic3r-Konfigurationseinstellungen zugreifen, indem sie Umgebungsvariablen lesen." +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:498 +#: src/libslic3r/PrintConfig.cpp:530 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:2068 +#: src/libslic3r/PrintConfig.cpp:2169 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:3096 +#: src/libslic3r/PrintConfig.cpp:3485 msgid "Ignore non-existent config files" msgstr "Ignoriere fehlende Konfigurationsdateien" -#: src/slic3r/GUI/MainFrame.cpp:352 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Import &Config" -msgstr "Importiere Konfiguration (&C)" +msgstr "Importiere &Konfiguration" -#: src/slic3r/GUI/MainFrame.cpp:357 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Import Config &Bundle" -msgstr "Importiere Konfigurationssamlung (&B)" +msgstr "Importiere Konfi&gurationssamlung" -#: src/slic3r/GUI/MainFrame.cpp:354 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Import Config from &project" msgstr "Importiere Konfiguration von &Projekt" -#: src/slic3r/GUI/Plater.cpp:4016 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +msgid "Import Config from ini/amf/3mf/gcode" +msgstr "Konfiguration aus ini/amf/3mf/gcode importieren" + +#: src/slic3r/GUI/Plater.cpp:4603 msgid "Import Object" msgstr "Objekt importieren" -#: src/slic3r/GUI/Plater.cpp:4020 +#: src/slic3r/GUI/Plater.cpp:4607 msgid "Import Objects" msgstr "Objekte importieren" @@ -2936,439 +3588,496 @@ msgstr "Objekte importieren" msgid "Import of the repaired 3mf file failed" msgstr "Import einer reparierten 3MF Datei fehlgeschlagen" -#: src/slic3r/GUI/MainFrame.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Importiere STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "Importe STL/OBJ/AMF/3MF ohne Konfigurationsdaten, behalte Bett bei" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +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:2416 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectList.cpp:3422 +#, 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/UpdateDialogs.cpp:132 +#: src/slic3r/GUI/UpdateDialogs.cpp:230 msgid "Incompatible bundles:" msgstr "Inkompatible Konfigurationssammlungen:" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 -#, possible-c-format +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#, c-format msgid "Incompatible with this %s" msgstr "Nicht kompatibel mit diesem %s" -#: src/slic3r/GUI/Plater.cpp:4091 +#: src/slic3r/GUI/Plater.cpp:4685 msgid "Increase Instances" msgstr "Kopien erhöhen" +#: src/slic3r/GUI/GLCanvas3D.cpp:264 +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:3338 -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." +#: 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." #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3334 +#: src/slic3r/GUI/Tab.cpp:3254 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:3083 -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/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/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:69 -#: src/slic3r/GUI/GUI_ObjectList.cpp:510 src/slic3r/GUI/Plater.cpp:439 -#: src/slic3r/GUI/Tab.cpp:1030 src/slic3r/GUI/Tab.cpp:1031 -#: src/slic3r/GUI/Tab.cpp:1360 src/libslic3r/PrintConfig.cpp:167 -#: src/libslic3r/PrintConfig.cpp:389 src/libslic3r/PrintConfig.cpp:729 -#: src/libslic3r/PrintConfig.cpp:743 src/libslic3r/PrintConfig.cpp:780 -#: src/libslic3r/PrintConfig.cpp:933 src/libslic3r/PrintConfig.cpp:943 -#: src/libslic3r/PrintConfig.cpp:961 src/libslic3r/PrintConfig.cpp:979 -#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1659 -#: src/libslic3r/PrintConfig.cpp:1676 +#: 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 msgid "Infill" msgstr "Infill" -#: src/slic3r/GUI/PresetHints.cpp:171 +#: src/slic3r/GUI/PresetHints.cpp:174 msgid "infill" msgstr "Infill" -#: src/libslic3r/PrintConfig.cpp:972 +#: src/libslic3r/PrintConfig.cpp:1021 msgid "Infill before perimeters" msgstr "Infill vor Kontur" -#: src/libslic3r/PrintConfig.cpp:953 +#: src/libslic3r/PrintConfig.cpp:1001 msgid "Infill extruder" msgstr "Infill Extruder" -#: src/libslic3r/PrintConfig.cpp:987 +#: src/libslic3r/PrintConfig.cpp:1036 msgid "Infill/perimeters overlap" msgstr "Infill/Kontur Überlappung" -#: src/libslic3r/Print.cpp:1476 +#: src/libslic3r/Print.cpp:1584 msgid "Infilling layers" msgstr "Fülle Schichten" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:118 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3430 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 src/slic3r/GUI/Plater.cpp:141 msgid "Info" msgstr "Info" -#: src/libslic3r/PrintConfig.cpp:1008 +#: src/libslic3r/PrintConfig.cpp:1057 msgid "Inherits profile" msgstr "Übernimmt Profil" -#: src/libslic3r/SLAPrint.cpp:707 +#: src/libslic3r/SLAPrint.cpp:653 msgid "Initial exposition time is out of printer profile bounds." msgstr "Anfang-Belichtungszeit ist außerhalb der Druckerprofilgrenzen." -#: src/libslic3r/PrintConfig.cpp:2317 src/libslic3r/PrintConfig.cpp:2318 +#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565 msgid "Initial exposure time" msgstr "Anfang-Belichtungszeit" -#: src/libslic3r/PrintConfig.cpp:2295 src/libslic3r/PrintConfig.cpp:2296 +#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483 msgid "Initial layer height" msgstr "Anfangsschichthöhe" -#: src/slic3r/GUI/Field.cpp:155 +#: src/slic3r/GUI/Field.cpp:204 msgid "Input value is out of range" msgstr "Der Eingabewert ist nicht im gültigen Bereich" -#: src/slic3r/GUI/GUI_App.cpp:661 +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "Inspect / activate configuration snapshots" msgstr "Inspiziere / aktiviere Konfigurations-Momentaufnahmen" -#: src/slic3r/GUI/wxExtensions.cpp:407 src/slic3r/GUI/wxExtensions.cpp:474 -#, possible-c-format +#: src/slic3r/GUI/ObjectDataViewModel.cpp:60 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:216 +#, c-format msgid "Instance %d" msgstr "Kopie %d" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1887 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2500 msgid "Instance manipulation" msgstr "Kopie Bearbeitung" -#: src/slic3r/GUI/wxExtensions.cpp:358 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:56 msgid "Instances" msgstr "Kopien" -#: src/slic3r/GUI/GUI_ObjectList.cpp:934 src/slic3r/GUI/GUI_ObjectList.cpp:3346 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3781 msgid "Instances to Separated Objects" msgstr "Kopien in einzelne Objekte wandeln" -#: src/libslic3r/PrintConfig.cpp:1886 +#: src/libslic3r/PrintConfig.cpp:1973 msgid "Interface layers" msgstr "Schnittstellen Schichten" -#: src/libslic3r/PrintConfig.cpp:1870 +#: src/libslic3r/PrintConfig.cpp:1957 msgid "Interface loops" msgstr "Kontaktschleifen" -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:1982 msgid "Interface pattern spacing" msgstr "Schnittstellenmuster Abstand" -#: src/libslic3r/PrintConfig.cpp:1022 +#: src/libslic3r/PrintConfig.cpp:1071 msgid "Interface shells" msgstr "Schnittstellenshells" -#: src/libslic3r/Zipper.cpp:87 +#: src/libslic3r/Zipper.cpp:84 msgid "internal error" msgstr "interner Fehler" -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/GCode/PreviewData.cpp:166 +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313 msgid "Internal infill" msgstr "Internes Infill" -#: src/slic3r/GUI/Plater.cpp:2397 +#: src/slic3r/GUI/Plater.cpp:3106 msgid "Invalid data" msgstr "Ungültige Daten" -#: src/slic3r/GUI/BedShapeDialog.cpp:471 src/slic3r/GUI/BedShapeDialog.cpp:520 -#: src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:566 msgid "Invalid file format." msgstr "Ungültiges Dateiformat." -#: src/libslic3r/Zipper.cpp:83 +#: src/libslic3r/Zipper.cpp:80 msgid "invalid filename" msgstr "ungültiger Dateiname" -#: src/libslic3r/Zipper.cpp:51 +#: src/slic3r/GUI/ConfigManipulation.cpp:319 +msgid "Invalid Head penetration" +msgstr "Ungültige Eindringtiefe des Stützkopfes" + +#: src/libslic3r/Zipper.cpp:48 msgid "invalid header or archive is corrupted" msgstr "ungültiger Dateiheader oder Archiv ist beschädigt" -#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/Field.cpp:173 +#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376 msgid "Invalid numeric input." msgstr "Ungültige numerische Eingabe." -#: src/libslic3r/Zipper.cpp:81 +#: src/libslic3r/Zipper.cpp:78 msgid "invalid parameter" msgstr "ungültiger Parameter" +#: src/slic3r/GUI/ConfigManipulation.cpp:332 +msgid "Invalid pinhead diameter" +msgstr "Ungültiger Nadelkopfdurchmesser" + #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:94 +#: src/slic3r/GUI/AboutDialog.cpp:258 msgid "is licensed under the" msgstr "ist unter der Lizenz der" -#: src/slic3r/GUI/Tab.cpp:2779 +#: 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:2778 +#: src/slic3r/GUI/Tab.cpp:2940 msgid "is not compatible with printer" msgstr "ist mit dem Drucker nicht kompatibel" -#: src/slic3r/GUI/MainFrame.cpp:519 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso" msgstr "Iso" -#: src/slic3r/GUI/MainFrame.cpp:519 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso View" msgstr "Iso Ansicht" -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:964 msgid "It can't be deleted or modified." msgstr "Es ist keine Löschung oder Änderung möglich." -#: src/libslic3r/PrintConfig.cpp:926 +#: src/slic3r/GUI/Plater.cpp:3321 +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 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.cpp:142 src/slic3r/GUI/Tab.cpp:2796 +#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2958 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:2177 +#: src/slic3r/GUI/Tab.cpp:2229 msgid "Jerk limits" msgstr "Ruck-Begrenzungen" -#: src/libslic3r/PrintConfig.cpp:1579 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Jitter" msgstr "Jitter" -#: src/libslic3r/PrintConfig.cpp:533 -msgid "Keep fan always on" -msgstr "Ventilator ständig laufen lassen" +#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529 +#: src/slic3r/GUI/DoubleSlider.cpp:1651 +msgid "Jump to height" +msgstr "Zur Höhe wechseln" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 +#: 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/libslic3r/PrintConfig.cpp:566 +msgid "Keep fan always on" +msgstr "Lüfter ständig laufen lassen" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 msgid "Keep lower part" msgstr "Unteren Teil behalten" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:193 +#: src/slic3r/GUI/GLCanvas3D.cpp:304 +msgid "Keep min" +msgstr "Halte min" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168 msgid "Keep upper part" msgstr "Oberen Teil behalten" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:566 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:708 msgid "Keyboard Shortcuts" msgstr "Tastaturkürzel" -#: src/libslic3r/PrintConfig.cpp:917 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +msgid "Keyboard shortcuts" +msgstr "Tastaturkürzel" + +#: src/libslic3r/PrintConfig.cpp:2498 +msgid "kg" +msgstr "kg" + +#: src/libslic3r/PrintConfig.cpp:965 msgid "Label objects" msgstr "Objekte benennen" -#: src/libslic3r/PrintConfig.cpp:2234 +#: src/libslic3r/PrintConfig.cpp:2399 msgid "Landscape" msgstr "Querformat" -#: src/slic3r/GUI/GUI_App.cpp:524 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Language" msgstr "Spache" -#: src/slic3r/GUI/GUI_App.cpp:755 +#: src/slic3r/GUI/GUI_App.cpp:885 msgid "Language selection" msgstr "Sprachauswahl" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1770 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2140 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2242 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:2994 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 msgid "Layer" msgstr "Schicht" -#: src/slic3r/GUI/Tab.cpp:998 src/libslic3r/PrintConfig.cpp:55 +#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:71 msgid "Layer height" msgstr "Schichthöhe" -#: src/libslic3r/Print.cpp:1332 +#: src/libslic3r/Print.cpp:1427 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:2260 +#: src/slic3r/GUI/Tab.cpp:2362 msgid "Layer height limits" msgstr "Schichthöhen Grenzen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2109 +#: src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "Layer height:" +msgstr "Schichthöhe:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2488 msgid "Layer range Settings to modify" msgstr "Schichtbereicheinstellungen zum Ändern" -#: src/libslic3r/PrintConfig.cpp:326 src/libslic3r/PrintConfig.cpp:946 -#: src/libslic3r/PrintConfig.cpp:1435 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1844 -#: src/libslic3r/PrintConfig.cpp:1889 +#: 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 msgid "layers" msgstr "Schichten" -#: src/slic3r/GUI/Tab.cpp:3302 src/slic3r/GUI/Tab.cpp:3393 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3512 +#: src/slic3r/GUI/Tab.cpp:3600 msgid "Layers" msgstr "Schichten" -#: src/slic3r/GUI/Tab.cpp:997 src/slic3r/GUI/Tab.cpp:3391 +#: src/slic3r/GUI/Tab.cpp:1048 src/slic3r/GUI/Tab.cpp:3598 msgid "Layers and perimeters" msgstr "Schichten und Umfänge" -#: src/slic3r/GUI/GUI_ObjectList.cpp:28 src/slic3r/GUI/GUI_ObjectList.cpp:68 -#: src/slic3r/GUI/GUI_ObjectList.cpp:509 src/libslic3r/PrintConfig.cpp:56 -#: src/libslic3r/PrintConfig.cpp:150 src/libslic3r/PrintConfig.cpp:381 -#: src/libslic3r/PrintConfig.cpp:438 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1026 -#: src/libslic3r/PrintConfig.cpp:1305 src/libslic3r/PrintConfig.cpp:1371 -#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1987 -#: src/libslic3r/PrintConfig.cpp:2044 +#: 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 msgid "Layers and Perimeters" msgstr "Schichten und Konturen" -#: src/slic3r/GUI/GLCanvas3D.cpp:526 -msgid "Layers heights" -msgstr "Schichthöhen" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +msgid "Layers Slider" +msgstr "Schichtenschieber" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 -msgid "Layers Slider Shortcuts" -msgstr "Schichtenschieber Kürzel" - -#. TRN To be shown in Print Settings "Bottom solid layers" -#: rc/libslic3r/PrintConfig.cpp:149 +#: src/slic3r/GUI/OptionsGroup.cpp:258 msgctxt "Layers" msgid "Bottom" msgstr "Boden" -#. TRN To be shown in Print Settings "Top solid layers" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/slic3r/GUI/OptionsGroup.cpp:258 msgctxt "Layers" msgid "Top" msgstr "Decke" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left" msgstr "Links" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1234 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1235 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 msgid "Left click" msgstr "Linker Mausklick" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/GLCanvas3D.cpp:237 +msgid "Left mouse button:" +msgstr "Linke Maustaste:" + +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left View" msgstr "Anicht von Links" -#: src/slic3r/GUI/GUI_Preview.cpp:255 +#: src/slic3r/GUI/GUI_Preview.cpp:257 msgid "Legend" msgstr "Legende" -#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551 msgid "Length" msgstr "Länge" -#: src/libslic3r/PrintConfig.cpp:293 +#: src/libslic3r/PrintConfig.cpp:328 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." #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:124 +#: src/slic3r/GUI/AboutDialog.cpp:129 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:1491 +#: src/libslic3r/PrintConfig.cpp:1561 msgid "Lift Z" msgstr "Z Hebung" -#: src/libslic3r/PrintConfig.cpp:801 +#: src/libslic3r/PrintConfig.cpp:848 msgid "Line" msgstr "Linie" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1050 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1427 msgid "Load" msgstr "Laden" -#: src/slic3r/GUI/MainFrame.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Load a model" msgstr "Lade ein Modell" -#: src/libslic3r/PrintConfig.cpp:3116 +#: src/libslic3r/PrintConfig.cpp:3505 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:3100 +#: src/libslic3r/PrintConfig.cpp:3489 msgid "Load config file" msgstr "Lade Konfigurationsdatei" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 -msgid "Load Config from .ini/amf/3mf/gcode" -msgstr "Lade Konfiguration von .ini/amf/3mf/gcode" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +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/KBShortcutsDialog.cpp:110 -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:354 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Load configuration from project file" msgstr "Lade Konfiguration aus Projektdatei" -#: src/libslic3r/PrintConfig.cpp:3101 +#: src/libslic3r/PrintConfig.cpp:3490 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:352 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Load exported configuration file" msgstr "Laden einer exportierten Konfigurationsdatei" -#: src/slic3r/GUI/Plater.cpp:1271 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Load File" msgstr "Datei laden" -#: src/slic3r/GUI/Plater.cpp:1275 +#: src/slic3r/GUI/Plater.cpp:1399 msgid "Load Files" msgstr "Dateien laden" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1585 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1879 msgid "Load Part" msgstr "Teil laden" -#: src/slic3r/GUI/MainFrame.cpp:357 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Load presets from a bundle" msgstr "Lade Voreinstellungen aus einer Sammlung" -#: src/slic3r/GUI/Plater.cpp:3992 +#: src/slic3r/GUI/Plater.cpp:4575 msgid "Load Project" msgstr "Projekt laden" -#: src/slic3r/GUI/BedShapeDialog.cpp:97 +#: src/slic3r/GUI/BedShapeDialog.cpp:102 msgid "Load shape from STL..." msgstr "Lade Umriß von STL..." -#: src/slic3r/GUI/BedShapeDialog.cpp:181 src/slic3r/GUI/BedShapeDialog.cpp:249 +#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261 msgid "Load..." msgstr "Laden..." -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" msgstr "geladen wird" -#: src/slic3r/GUI/Plater.cpp:1782 +#: src/slic3r/GUI/Plater.cpp:2426 msgid "Loaded" msgstr "Geladen" -#: src/slic3r/GUI/Plater.cpp:1590 +#: src/slic3r/GUI/Plater.cpp:2273 msgid "Loading" msgstr "Lade" -#: src/slic3r/GUI/GUI_App.cpp:407 +#: src/slic3r/GUI/GUI_App.cpp:474 msgid "Loading of a mode view" msgstr "Lade Anzeigemodus" -#: src/slic3r/GUI/GUI_App.cpp:399 +#: src/slic3r/GUI/GUI_App.cpp:466 msgid "Loading of current presets" msgstr "Laden der aktuellen Voreinstellungen" @@ -3377,277 +4086,281 @@ msgstr "Laden der aktuellen Voreinstellungen" msgid "Loading repaired model" msgstr "Lade repariertes Modell" -#: src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:607 msgid "Loading speed" msgstr "Ladegeschwindigkeit" -#: src/libslic3r/PrintConfig.cpp:583 +#: src/libslic3r/PrintConfig.cpp:615 msgid "Loading speed at the start" msgstr "Ladegeschwindigkeit zu Beginn" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:41 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106 msgid "Local coordinates" msgstr "Lokale Koordinaten" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:851 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 msgid "Lock supports under new islands" msgstr "Fixiere Stützen unter neuen Inseln" -#: src/slic3r/GUI/Tab.cpp:3065 +#: src/slic3r/GUI/Tab.cpp:3252 msgid "LOCKED LOCK" msgstr "GESCHLOSSENES SCHLOSS" -#: src/slic3r/GUI/Tab.cpp:3360 +#: src/slic3r/GUI/Tab.cpp:3280 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" -#: src/slic3r/GUI/Tab.cpp:3376 +#: src/slic3r/GUI/Tab.cpp:3296 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." -#: src/libslic3r/PrintConfig.cpp:3119 +#: src/libslic3r/PrintConfig.cpp:3508 msgid "Logging level" msgstr "Logging-Level" -#: src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "Loops (minimum)" msgstr "Schleifen (minimal)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Lower Layer" msgstr "Untere Schicht" -#: src/slic3r/GUI/Tab.cpp:2136 src/slic3r/GUI/Tab.cpp:2209 -#: src/libslic3r/PrintConfig.cpp:1077 src/libslic3r/PrintConfig.cpp:1087 -#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1110 -#: src/libslic3r/PrintConfig.cpp:1121 src/libslic3r/PrintConfig.cpp:1132 -#: src/libslic3r/PrintConfig.cpp:1143 +#: 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 msgid "Machine limits" msgstr "Maschinengrenzen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -msgid "Main Shortcuts" -msgstr "Haupt Kürzel" - -#: src/slic3r/GUI/Plater.cpp:143 +#: src/slic3r/GUI/Plater.cpp:166 msgid "Manifold" msgstr "Hülle ok" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:908 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 msgid "Manual editing" msgstr "Manuelle Bearbeitung" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:105 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180 msgid "Masked SLA file exported to %1%" msgstr "Maskierte SLA-Datei exportiert nach %1%" -#: src/slic3r/GUI/MainFrame.cpp:604 +#: src/slic3r/GUI/MainFrame.cpp:752 msgid "Mate&rial Settings Tab" msgstr "Mate&rial Einstellungen" -#: src/slic3r/GUI/Tab.cpp:3300 +#: src/slic3r/GUI/Tab.cpp:3478 src/slic3r/GUI/Tab.cpp:3480 msgid "Material" msgstr "Material" -#: src/slic3r/GUI/Tab.hpp:391 +#: src/slic3r/GUI/Tab.hpp:416 msgid "Material Settings" msgstr "Material Einstellungen" -#: src/slic3r/GUI/Plater.cpp:140 +#: src/slic3r/GUI/Plater.cpp:163 msgid "Materials" msgstr "Material" -#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226 msgid "Max" msgstr "Max" -#: src/libslic3r/PrintConfig.cpp:2470 +#: src/libslic3r/PrintConfig.cpp:2734 msgid "Max bridge length" msgstr "Max Überbrückungslänge" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "Max Brücken auf einem Pfeiler" + +#: src/libslic3r/PrintConfig.cpp:2822 msgid "Max merge distance" msgstr "Maximaler Zusammenfügeabstand" -#: src/libslic3r/PrintConfig.cpp:2479 +#: src/libslic3r/PrintConfig.cpp:2743 msgid "Max pillar linking distance" msgstr "Max. Pfeiler Verbindungsabstand" -#: src/libslic3r/PrintConfig.cpp:64 +#: src/libslic3r/PrintConfig.cpp:80 msgid "Max print height" msgstr "Max. Druckhöhe" -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "Max print speed" msgstr "Maximale Druckgeschwindigkeit" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 -msgid "max slic3r version" -msgstr "Max. Slic3r Version" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +msgid "max PrusaSlicer version" +msgstr "max PrusaSlicer Version" -#: src/libslic3r/PrintConfig.cpp:1203 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "Max volumetric slope negative" msgstr "Max. volumetrische Steigung negativ" -#: src/libslic3r/PrintConfig.cpp:1192 +#: src/libslic3r/PrintConfig.cpp:1257 msgid "Max volumetric slope positive" msgstr "Max. volumetrische Steigung positiv" -#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247 msgid "Max volumetric speed" msgstr "Maximale Volumengeschwindigkeit" -#: src/libslic3r/PrintConfig.cpp:2167 +#: src/libslic3r/PrintConfig.cpp:2268 msgid "Maximal bridging distance" msgstr "Maximaler Überbrückungsabstand" -#: src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "Maximal distance between supports on sparse infill sections." msgstr "Maximalabstand zwischen Stützen auf spärlichen Infill-Abschnitten." -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Maximum acceleration E" msgstr "Maximale Beschleunigung E" -#: src/libslic3r/PrintConfig.cpp:1105 +#: src/libslic3r/PrintConfig.cpp:1151 msgid "Maximum acceleration of the E axis" msgstr "Maximale Beschleunigung der E-Achse" -#: src/libslic3r/PrintConfig.cpp:1102 +#: src/libslic3r/PrintConfig.cpp:1148 msgid "Maximum acceleration of the X axis" msgstr "Maximale Beschleunigung der X-Achse" -#: src/libslic3r/PrintConfig.cpp:1103 +#: src/libslic3r/PrintConfig.cpp:1149 msgid "Maximum acceleration of the Y axis" msgstr "Maximale Beschleunigung der Y-Achse" -#: src/libslic3r/PrintConfig.cpp:1104 +#: src/libslic3r/PrintConfig.cpp:1150 msgid "Maximum acceleration of the Z axis" msgstr "Maximale Beschleunigung der Z-Achse" -#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133 +#: src/libslic3r/PrintConfig.cpp:1198 msgid "Maximum acceleration when extruding" -msgstr "Maximale Beschleunigung beim Extruden" +msgstr "Maximale Beschleunigung beim Extrudieren" -#: src/libslic3r/PrintConfig.cpp:1158 +#: src/libslic3r/PrintConfig.cpp:1200 msgid "Maximum acceleration when extruding (M204 S)" -msgstr "Maximale Beschleunigung beim Extruden (M204 S)" +msgstr "Maximale Beschleunigung beim Extrudieren (M204 S)" -#: src/libslic3r/PrintConfig.cpp:1142 src/libslic3r/PrintConfig.cpp:1144 +#: src/libslic3r/PrintConfig.cpp:1208 msgid "Maximum acceleration when retracting" msgstr "Maximale Beschleunigung beim Einzug" -#: src/libslic3r/PrintConfig.cpp:1169 +#: src/libslic3r/PrintConfig.cpp:1210 msgid "Maximum acceleration when retracting (M204 T)" msgstr "Maximale Beschleunigung beim Einzug (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1096 +#: src/libslic3r/PrintConfig.cpp:1142 msgid "Maximum acceleration X" msgstr "Maximale Beschleunigung X" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1143 msgid "Maximum acceleration Y" msgstr "Maximale Beschleunigung Y" -#: src/libslic3r/PrintConfig.cpp:1098 +#: src/libslic3r/PrintConfig.cpp:1144 msgid "Maximum acceleration Z" msgstr "Maximale Beschleunigung Z" -#: src/slic3r/GUI/Tab.cpp:2170 +#: src/slic3r/GUI/Tab.cpp:2222 msgid "Maximum accelerations" msgstr "Maximale Beschleunigungen" -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534 msgid "Maximum exposure time" msgstr "Maximale Belichtungszeit" -#: src/libslic3r/PrintConfig.cpp:1081 +#: src/libslic3r/PrintConfig.cpp:1128 msgid "Maximum feedrate E" msgstr "Maximaler Vorschub E" -#: src/libslic3r/PrintConfig.cpp:1087 +#: src/libslic3r/PrintConfig.cpp:1134 msgid "Maximum feedrate of the E axis" msgstr "Maximaler Vorschub auf der E-Achse" -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1131 msgid "Maximum feedrate of the X axis" msgstr "Maximaler Vorschub auf der X-Achse" -#: src/libslic3r/PrintConfig.cpp:1085 +#: src/libslic3r/PrintConfig.cpp:1132 msgid "Maximum feedrate of the Y axis" msgstr "Maximaler Vorschub auf der Y-Achse" -#: src/libslic3r/PrintConfig.cpp:1086 +#: src/libslic3r/PrintConfig.cpp:1133 msgid "Maximum feedrate of the Z axis" msgstr "Maximaler Vorschub auf der Z-Achse" -#: src/libslic3r/PrintConfig.cpp:1078 +#: src/libslic3r/PrintConfig.cpp:1125 msgid "Maximum feedrate X" msgstr "Maximaler Vorschub X" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Maximum feedrate Y" msgstr "Maximaler Vorschub Y" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "Maximum feedrate Z" msgstr "Maximaler Vorschub Z" -#: src/slic3r/GUI/Tab.cpp:2165 +#: src/slic3r/GUI/Tab.cpp:2217 msgid "Maximum feedrates" msgstr "Maximaler Vorschub" -#: src/libslic3r/PrintConfig.cpp:2447 src/libslic3r/PrintConfig.cpp:2448 +#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557 msgid "Maximum initial exposure time" msgstr "Maximale Anfang-Belichtungszeit" -#: src/libslic3r/PrintConfig.cpp:1117 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "Maximum jerk E" msgstr "Maximaler Ruck E" -#: src/libslic3r/PrintConfig.cpp:1123 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Maximum jerk of the E axis" msgstr "Maximaler Ruck auf der E-Achse" -#: src/libslic3r/PrintConfig.cpp:1120 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Maximum jerk of the X axis" msgstr "Maximaler Ruck auf der X-Achse" -#: src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "Maximum jerk of the Y axis" msgstr "Maximaler Ruck auf der Y-Achse" -#: src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1167 msgid "Maximum jerk of the Z axis" msgstr "Maximaler Ruck auf der Z-Achse" -#: src/libslic3r/PrintConfig.cpp:1114 +#: src/libslic3r/PrintConfig.cpp:1159 msgid "Maximum jerk X" msgstr "Maximaler Ruck X" -#: src/libslic3r/PrintConfig.cpp:1115 +#: src/libslic3r/PrintConfig.cpp:1160 msgid "Maximum jerk Y" msgstr "Maximaler Ruck Y" -#: src/libslic3r/PrintConfig.cpp:1116 +#: src/libslic3r/PrintConfig.cpp:1161 msgid "Maximum jerk Z" msgstr "Maximaler Ruck Z" -#: src/libslic3r/PrintConfig.cpp:566 -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:2660 +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:3053 +#: src/libslic3r/PrintConfig.cpp:598 +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 msgid "Merge" msgstr "Zusammenfügen" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2683 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/SLAPrint.cpp:71 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Merging slices and calculating statistics" msgstr "Zusammenführung der Slices und Berechnung der Statistiken" @@ -3655,207 +4368,256 @@ msgstr "Zusammenführung der Slices und Berechnung der Statistiken" msgid "Mesh repair failed." msgstr "Netzreparatur fehlgeschlagen." -#: src/libslic3r/PrintConfig.cpp:3120 -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" -msgstr "Meldungen mit einem niedrigeren oder gleichwertigen Schweregrad zum Loglevel werden ausgegeben. 0:Protokoll, 1:Debug, 2:Info, 3:Warnung, 4:Fehler, 5:Fatal" +#: src/slic3r/GUI/DoubleSlider.cpp:1635 +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:1215 src/libslic3r/PrintConfig.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289 msgid "Min" msgstr "Min" -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1298 msgid "Min print speed" msgstr "Minimale Druckgeschwindigkeit" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 -msgid "min slic3r version" -msgstr "Min. Slic3r Version" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "min PrusaSlicer version" +msgstr "min PrusaSlicer Version" -#: src/libslic3r/PrintConfig.cpp:2507 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Minimal distance of the support points" msgstr "Minimaler Abstand der Stützpunkte" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1306 msgid "Minimal filament extrusion length" msgstr "Minimale Filament Extrusionlänge" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:879 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 msgid "Minimal points distance" msgstr "Minimaler Prunktabstand" -#: src/libslic3r/PrintConfig.cpp:635 +#: src/libslic3r/PrintConfig.cpp:667 msgid "Minimal purge on wipe tower" msgstr "Minimale Wischmenge im Wischturm" -#: src/libslic3r/PrintConfig.cpp:1442 +#: src/libslic3r/PrintConfig.cpp:187 +msgid "Minimum bottom shell thickness" +msgstr "Minimale Stärke der Bodenschale" + +#: src/slic3r/GUI/PresetHints.cpp:339 +msgid "Minimum bottom shell thickness is %1% mm." +msgstr "Die Mindeststärke der Bodenschale beträgt %1% mm." + +#: src/libslic3r/PrintConfig.cpp:1512 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:2416 src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526 msgid "Minimum exposure time" msgstr "Minimale Belichtungszeit" -#: src/libslic3r/PrintConfig.cpp:1109 src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1178 msgid "Minimum feedrate when extruding" msgstr "Maximaler Vorschub bei Extrusion" -#: src/libslic3r/PrintConfig.cpp:1136 +#: src/libslic3r/PrintConfig.cpp:1180 msgid "Minimum feedrate when extruding (M205 S)" -msgstr "Minimaler Vorschub beim Extruden (M205 S)" +msgstr "Minimaler Vorschub beim Extrudieren (M205 S)" -#: src/slic3r/GUI/Tab.cpp:2182 +#: src/slic3r/GUI/Tab.cpp:2234 msgid "Minimum feedrates" msgstr "Minimaler Vorschub" -#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549 msgid "Minimum initial exposure time" msgstr "Minimale Anfang-Belichtungszeit" -#: src/libslic3r/PrintConfig.cpp:1452 +#: src/slic3r/GUI/Tab.cpp:1069 +msgid "Minimum shell thickness" +msgstr "Minimale Schalenstärke" + +#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788 +msgid "Minimum thickness of a top / bottom shell" +msgstr "Mindeststärke einer Ober-/Bodenschale" + +#: src/libslic3r/PrintConfig.cpp:2146 +msgid "Minimum top shell thickness" +msgstr "Mindeststärke der oberen Schale" + +#: src/slic3r/GUI/PresetHints.cpp:320 +msgid "Minimum top shell thickness is %1% mm." +msgstr "Die Mindeststärke der Oberschale beträgt %1% mm." + +#: src/libslic3r/PrintConfig.cpp:1522 msgid "Minimum travel after retraction" msgstr "Minimalbewegung nach Einziehen" -#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "Minimum travel feedrate" msgstr "Minimaler Vorschub im Eilgang" -#: src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1190 msgid "Minimum travel feedrate (M205 T)" msgstr "Minimaler Vorschub im Eilgang (M205 T)" -#: src/slic3r/GUI/Plater.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:2917 +msgid "Minimum wall thickness of a hollowed model." +msgstr "Mindestwandstärke eines ausgehöhlten Modells." + +#: src/libslic3r/PrintConfig.cpp:2449 +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 msgid "Mirror" msgstr "Spiegeln" -#: src/libslic3r/PrintConfig.cpp:2320 +#: src/libslic3r/PrintConfig.cpp:2379 msgid "Mirror horizontally" msgstr "Horizontal spiegeln" -#: src/slic3r/GUI/GLCanvas3D.cpp:1711 +#: src/slic3r/GUI/GLCanvas3D.cpp:2053 msgid "Mirror Object" msgstr "Objekt spiegeln" -#: src/slic3r/GUI/Plater.cpp:2946 +#: src/slic3r/GUI/Plater.cpp:4002 msgid "Mirror the selected object" msgstr "Ausgewähltes Objekt spiegeln" -#: src/slic3r/GUI/Plater.cpp:2939 +#: src/slic3r/GUI/Plater.cpp:3995 msgid "Mirror the selected object along the X axis" msgstr "Ausgewähltes Objekt entlang der X-Achse spiegeln" -#: src/slic3r/GUI/Plater.cpp:2941 +#: src/slic3r/GUI/Plater.cpp:3997 msgid "Mirror the selected object along the Y axis" msgstr "Ausgewähltes Objekt entlang der Y-Achse spiegeln" -#: src/slic3r/GUI/Plater.cpp:2943 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Mirror the selected object along the Z axis" msgstr "Ausgewähltes Objekt entlang der Z-Achse spiegeln" -#: src/libslic3r/PrintConfig.cpp:2327 +#: src/libslic3r/PrintConfig.cpp:2386 msgid "Mirror vertically" msgstr "Vertikal spiegeln" -#: src/slic3r/Utils/OctoPrint.cpp:69 -#, possible-c-format +#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68 +#, c-format msgid "Mismatched type of print host: %s" msgstr "Nicht übereinstimmender Typ des Druckhosts: %s" -#: src/libslic3r/GCode/PreviewData.cpp:176 +#: src/libslic3r/ExtrusionEntity.cpp:323 msgid "Mixed" msgstr "Gemischt" -#: src/slic3r/GUI/BedShapeDialog.cpp:87 src/slic3r/GUI/ConfigWizard.cpp:118 -#: src/slic3r/GUI/ConfigWizard.cpp:561 src/slic3r/GUI/ConfigWizard.cpp:575 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 -#: src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:84 -#: src/libslic3r/PrintConfig.cpp:59 src/libslic3r/PrintConfig.cpp:66 -#: src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:210 -#: src/libslic3r/PrintConfig.cpp:285 src/libslic3r/PrintConfig.cpp:293 -#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:353 -#: src/libslic3r/PrintConfig.cpp:473 src/libslic3r/PrintConfig.cpp:484 -#: src/libslic3r/PrintConfig.cpp:502 src/libslic3r/PrintConfig.cpp:680 -#: src/libslic3r/PrintConfig.cpp:1166 src/libslic3r/PrintConfig.cpp:1227 -#: src/libslic3r/PrintConfig.cpp:1245 src/libslic3r/PrintConfig.cpp:1263 -#: src/libslic3r/PrintConfig.cpp:1315 src/libslic3r/PrintConfig.cpp:1325 -#: src/libslic3r/PrintConfig.cpp:1446 src/libslic3r/PrintConfig.cpp:1454 -#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 -#: src/libslic3r/PrintConfig.cpp:1513 src/libslic3r/PrintConfig.cpp:1521 -#: src/libslic3r/PrintConfig.cpp:1529 src/libslic3r/PrintConfig.cpp:1612 -#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1898 -#: src/libslic3r/PrintConfig.cpp:1932 src/libslic3r/PrintConfig.cpp:2125 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2139 -#: src/libslic3r/PrintConfig.cpp:2169 src/libslic3r/PrintConfig.cpp:2179 -#: src/libslic3r/PrintConfig.cpp:2189 src/libslic3r/PrintConfig.cpp:2297 -#: src/libslic3r/PrintConfig.cpp:2372 src/libslic3r/PrintConfig.cpp:2381 -#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2400 -#: src/libslic3r/PrintConfig.cpp:2444 src/libslic3r/PrintConfig.cpp:2454 -#: src/libslic3r/PrintConfig.cpp:2473 src/libslic3r/PrintConfig.cpp:2483 -#: src/libslic3r/PrintConfig.cpp:2492 src/libslic3r/PrintConfig.cpp:2510 -#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2539 -#: src/libslic3r/PrintConfig.cpp:2552 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2491 +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/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: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 msgid "mm" msgstr "mm" -#: src/libslic3r/PrintConfig.cpp:1477 src/libslic3r/PrintConfig.cpp:1486 +#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556 msgid "mm (zero to disable)" -msgstr "mm (Null eingeben zum deaktivieren)" +msgstr "mm (null eingeben zum Deaktivieren)" -#: src/libslic3r/PrintConfig.cpp:847 src/libslic3r/PrintConfig.cpp:992 -#: src/libslic3r/PrintConfig.cpp:1797 +#: 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 msgid "mm or %" msgstr "mm oder %" -#: src/libslic3r/PrintConfig.cpp:201 src/libslic3r/PrintConfig.cpp:577 -#: src/libslic3r/PrintConfig.cpp:585 src/libslic3r/PrintConfig.cpp:594 -#: src/libslic3r/PrintConfig.cpp:602 src/libslic3r/PrintConfig.cpp:629 -#: src/libslic3r/PrintConfig.cpp:648 src/libslic3r/PrintConfig.cpp:874 -#: src/libslic3r/PrintConfig.cpp:1001 src/libslic3r/PrintConfig.cpp:1079 -#: src/libslic3r/PrintConfig.cpp:1099 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1123 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1363 -#: src/libslic3r/PrintConfig.cpp:1537 src/libslic3r/PrintConfig.cpp:1546 -#: src/libslic3r/PrintConfig.cpp:1941 src/libslic3r/PrintConfig.cpp:2053 +#: 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 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:430 src/libslic3r/PrintConfig.cpp:856 -#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1702 -#: src/libslic3r/PrintConfig.cpp:1908 src/libslic3r/PrintConfig.cpp:2035 +#: 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 msgid "mm/s or %" msgstr "mm/s oder %" -#: src/libslic3r/PrintConfig.cpp:160 src/libslic3r/PrintConfig.cpp:303 -#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:936 -#: src/libslic3r/PrintConfig.cpp:1089 src/libslic3r/PrintConfig.cpp:1134 -#: src/libslic3r/PrintConfig.cpp:1145 src/libslic3r/PrintConfig.cpp:1334 +#: 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 msgid "mm/s²" msgstr "mm/s²" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:640 +#: src/libslic3r/PrintConfig.cpp:672 msgid "mm³" msgstr "mm³" -#: src/libslic3r/PrintConfig.cpp:569 src/libslic3r/PrintConfig.cpp:1185 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "mm³/s" msgstr "mm³/s" -#: src/libslic3r/PrintConfig.cpp:1197 src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273 msgid "mm³/s²" msgstr "mm³/s²" -#: src/slic3r/GUI/GUI_App.cpp:681 +#: src/slic3r/GUI/GUI_App.cpp:820 msgid "Mode" -msgstr "Modus" +msgstr "&Modus" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "model" msgstr "Modell" -#: src/slic3r/GUI/BedShapeDialog.cpp:239 +#: src/slic3r/GUI/BedShapeDialog.cpp:251 msgid "Model" msgstr "Modell" @@ -3873,8 +4635,8 @@ msgid "Model repair canceled" msgstr "Modellreparatur abgebrochen" #: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" -msgstr "Modellreparatur fehlgeschlagen:\n" +msgid "Model repair failed:" +msgstr "Modellreparatur fehlgeschlagen:" #: src/slic3r/Utils/FixModelByWin10.cpp:400 msgid "Model repair finished" @@ -3884,104 +4646,151 @@ msgstr "Modellreparatur beendet" msgid "Model repaired successfully" msgstr "Modellreparatur erfolgreich" -#: src/slic3r/GUI/Preset.cpp:207 +#: src/slic3r/GUI/Tab.cpp:979 +msgid "Modifications to the current profile will be saved." +msgstr "Änderungen am aktuellen Profil werden gespeichert." + +#: src/slic3r/GUI/Preset.cpp:247 msgid "modified" msgstr "geändert" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Modifier" msgstr "Veränderer" -#: src/slic3r/GUI/Tab.cpp:1100 +#: src/slic3r/GUI/Tab.cpp:1161 msgid "Modifiers" msgstr "Veränderer" -#: src/libslic3r/PrintConfig.cpp:719 +#: src/libslic3r/PrintConfig.cpp:2512 +msgid "money/bottle" +msgstr "Kosten/Flasche" + +#: src/libslic3r/PrintConfig.cpp:762 msgid "money/kg" msgstr "Kosten/kg" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1240 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 msgid "Mouse wheel" msgstr "Mausrad" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:51 +#: src/slic3r/GUI/GLCanvas3D.cpp:261 +msgid "Mouse wheel:" +msgstr "Mausrad:" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 msgid "Move" msgstr "Bewegen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1238 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 msgid "Move clipping plane" msgstr "Beschnittebene bewegen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Move current slider thumb Down" msgstr "Bewege aktuellen Schieberegler nach unten" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 msgid "Move current slider thumb Up" msgstr "Bewege aktuellen Schieberegler nach oben" -#: src/slic3r/GUI/GLCanvas3D.cpp:2872 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1059 +msgid "Move drainage hole" +msgstr "Drainageloch bewegen" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3505 msgid "Move Object" msgstr "Objekt bewegen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365 msgid "Move point" msgstr "Punkt bewegen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Move selection 10 mm in negative X direction" +msgstr "Auswahl 10 mm in negativer X-Richtung verschieben" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +msgid "Move selection 10 mm in negative Y direction" +msgstr "Auswahl 10 mm in negativer Y-Richtung verschieben" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +msgid "Move selection 10 mm in positive X direction" +msgstr "Auswahl 10 mm in positiver X-Richtung verschieben" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +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 msgid "Move support point" msgstr "Stützpunkt bewegen" -#: src/libslic3r/PrintConfig.cpp:2100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Movement in camera space" +msgstr "Bewegung im Kameraraum" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +msgid "Movement step set to 1 mm" +msgstr "Bewegungsschritt auf 1 mm eingestellt" + +#: src/libslic3r/PrintConfig.cpp:2201 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:1661 src/slic3r/GUI/Plater.cpp:1769 +#: src/slic3r/GUI/Plater.cpp:2360 src/slic3r/GUI/Plater.cpp:2413 msgid "Multi-part object detected" msgstr "Objekt mit mehreren Teilen erkannt" -#: src/slic3r/GUI/FirmwareDialog.cpp:400 src/slic3r/GUI/FirmwareDialog.cpp:436 -#, possible-c-format +#: 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 "Mehrere %s Geräte gefunden. Bitte immer nur eins zum Flashen anschliessen." +msgstr "Mehrere %s Geräte gefunden. Bitte immer nur eins zum Flashen anschließen." -#: src/slic3r/GUI/Tab.cpp:1118 +#: src/slic3r/GUI/Tab.cpp:1179 msgid "Multiple Extruders" msgstr "Mehrere Extruder" -#: src/slic3r/GUI/Plater.cpp:1766 -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?\n" -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?\n" +#: 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/libslic3r/PrintConfig.cpp:3050 +#: src/libslic3r/PrintConfig.cpp:3439 msgid "Multiply copies by creating a grid." msgstr "Multiple Kopien durch Erstellen eines Rasters." -#: src/libslic3r/PrintConfig.cpp:3045 +#: src/libslic3r/PrintConfig.cpp:3434 msgid "Multiply copies by this factor." msgstr "Mehrfache Kopien mit diesem Faktor." -#: src/slic3r/GUI/Field.cpp:139 +#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:580 msgid "N/A" msgstr "N.V." -#: src/slic3r/GUI/GUI_ObjectList.cpp:176 +#: src/slic3r/GUI/GUI_ObjectList.cpp:270 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 msgid "Name" msgstr "Name" -#: src/libslic3r/PrintConfig.cpp:1418 +#: src/libslic3r/PrintConfig.cpp:1488 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:1412 +#: src/libslic3r/PrintConfig.cpp:1482 msgid "Name of the printer vendor." msgstr "Name des Druckerherstellers." -#: src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1058 msgid "Name of the profile, from which this profile inherits." msgstr "Name des Profils, von dem dieses Profil abgeleitet wurde." -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Nearest" msgstr "Nächste" @@ -3989,32 +4798,40 @@ msgstr "Nächste" msgid "Network lookup" msgstr "Network Lookup" -#: src/slic3r/GUI/Plater.cpp:2056 +#: src/slic3r/GUI/Plater.cpp:2151 msgid "New Project" msgstr "Neues Projekt" -#: src/slic3r/GUI/UpdateDialogs.cpp:30 -#, possible-c-format +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +msgid "New project, clear plater" +msgstr "Neues Projekt, Druckplatte leeren" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +#, c-format msgid "New version of %s is available" msgstr "Eine neue Version von %s ist verfügbar" -#: src/slic3r/GUI/UpdateDialogs.cpp:47 +#: src/slic3r/GUI/UpdateDialogs.cpp:45 msgid "New version:" msgstr "Neue Version:" -#: src/slic3r/GUI/GLCanvas3D.cpp:3750 +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 msgid "Next Redo action: %1%" msgstr "Nächste Redo Aktion: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:3718 +#: src/slic3r/GUI/GLCanvas3D.cpp:4641 msgid "Next Undo action: %1%" msgstr "Nächste Undo-Aktion: %1%" -#: src/libslic3r/PrintConfig.cpp:912 +#: src/libslic3r/PrintConfig.cpp:960 msgid "No extrusion" msgstr "Keine Extrusion" -#: src/slic3r/GUI/MainFrame.cpp:635 +#: src/libslic3r/SLAPrintSteps.cpp:453 +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 msgid "No previously sliced file." msgstr "Keine vorher gesclicete Datei." @@ -4022,152 +4839,175 @@ msgstr "Keine vorher gesclicete Datei." msgid "NO RAMMING AT ALL" msgstr "ÜBERHAUPT KEIN RAMMEN" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:1857 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "Keine spärlichen Schichten (EXPERIMENTELL)" + +#: src/libslic3r/PrintConfig.cpp:2774 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/ConfigWizard.cpp:190 src/slic3r/GUI/Plater.cpp:422 -#: src/libslic3r/GCode/PreviewData.cpp:162 +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +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 msgid "None" msgstr "Kein" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2203 msgid "Normal" msgstr "Normal" -#: src/slic3r/GUI/Plater.cpp:1073 +#: src/slic3r/GUI/Plater.cpp:1286 msgid "normal mode" msgstr "Normaler Modus" -#: src/libslic3r/Zipper.cpp:49 +#: src/libslic3r/Zipper.cpp:46 msgid "not a ZIP archive" msgstr "kein ZIP Archiv" -#: src/slic3r/Utils/OctoPrint.cpp:90 +#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302 +msgid "Not found:" +msgstr "Nicht gefunden:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1019 +msgid "Note" +msgstr "Hinweis" + +#: src/slic3r/Utils/AstroBox.cpp:89 +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 +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 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:1213 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "Hinweis: Einige Tastenkombinationen funktionieren nur im (Nicht-)Bearbeitungsmodus." -#: src/slic3r/GUI/Tab.cpp:1193 src/slic3r/GUI/Tab.cpp:1194 -#: src/slic3r/GUI/Tab.cpp:1576 src/slic3r/GUI/Tab.cpp:1577 -#: src/slic3r/GUI/Tab.cpp:1985 src/slic3r/GUI/Tab.cpp:1986 -#: src/slic3r/GUI/Tab.cpp:2079 src/slic3r/GUI/Tab.cpp:2080 -#: src/slic3r/GUI/Tab.cpp:3328 src/slic3r/GUI/Tab.cpp:3329 +#: 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 msgid "Notes" msgstr "Anmerkungen" -#: src/slic3r/GUI/GUI.cpp:277 +#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905 +#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:245 msgid "Notice" msgstr "Hinweis" -#: src/slic3r/GUI/ConfigWizard.cpp:118 +#: src/slic3r/GUI/ConfigWizard.cpp:218 msgid "nozzle" msgstr "Düse" -#: src/libslic3r/PrintConfig.cpp:1261 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2340 +#: src/libslic3r/PrintConfig.cpp:1326 msgid "Nozzle diameter" msgstr "Düsendurchmesser" -#: src/slic3r/GUI/ConfigWizard.cpp:560 +#: src/slic3r/GUI/ConfigWizard.cpp:969 msgid "Nozzle Diameter:" msgstr "Düsendurchmesser:" -#: src/libslic3r/PrintConfig.cpp:618 +#: src/libslic3r/PrintConfig.cpp:650 msgid "Number of cooling moves" msgstr "Anzahl der Kühlbewegungen" -#: src/slic3r/GUI/Tab.cpp:1845 +#: src/slic3r/GUI/Tab.cpp:1839 msgid "Number of extruders of the printer." msgstr "Anzahl der Extruder des Druckers." -#: src/libslic3r/PrintConfig.cpp:1888 +#: src/libslic3r/PrintConfig.cpp:1975 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:1627 +#: src/libslic3r/PrintConfig.cpp:1697 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." +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:2214 +#: src/libslic3r/PrintConfig.cpp:2365 msgid "Number of pixels in" msgstr "Anzahl an Pixeln in" -#: src/libslic3r/PrintConfig.cpp:2216 +#: src/libslic3r/PrintConfig.cpp:2367 msgid "Number of pixels in X" msgstr "Anzahl an Pixeln in X" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "Number of pixels in Y" msgstr "Anzahl an Pixeln in Y" -#: src/libslic3r/PrintConfig.cpp:151 +#: src/libslic3r/PrintConfig.cpp:176 msgid "Number of solid layers to generate on bottom surfaces." -msgstr "Anzahl der zu erzeugenden festen Schichten auf der Bodenfläche." +msgstr "Anzahl der zu erzeugenden massiven Schichten auf der Bodenfläche." -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1781 msgid "Number of solid layers to generate on top and bottom surfaces." -msgstr "Anzahl der zu erzeugenden festen Schichten auf der Ober- und Unterseite." +msgstr "Anzahl der zu erzeugenden massiven Schichten auf der Ober- und Unterseite." -#: src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2134 msgid "Number of solid layers to generate on top surfaces." -msgstr "Anzahl der zu erzeugenden festen Schichten auf der Oberseite." +msgstr "Anzahl der zu erzeugenden massiven Schichten auf der Oberseite." -#: src/libslic3r/PrintConfig.cpp:2303 +#: src/libslic3r/PrintConfig.cpp:2518 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:218 +#: src/slic3r/GUI/Plater.cpp:241 msgid "Number of tool changes" msgstr "Anzahl der Werkzeugwechsel" -#: src/libslic3r/PrintConfig.cpp:2489 +#: src/libslic3r/PrintConfig.cpp:2753 msgid "Object elevation" msgstr "Objekt-Hebung" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2466 msgid "Object manipulation" msgstr "Objektbearbeitung" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:27 -msgid "Object Manipulation" -msgstr "Objektbearbeitung" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:78 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638 msgid "Object name" msgstr "Objektname" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3417 msgid "Object or Instance" msgstr "Objekt oder Kopie" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1010 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 msgid "Object reordered" msgstr "Objekt neu angeordnet" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1868 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2479 msgid "Object Settings to modify" msgstr "Abweichende Objekteigenschaften" -#: src/slic3r/GUI/Plater.cpp:1875 +#: src/slic3r/GUI/Plater.cpp:2529 msgid "Object too large?" msgstr "Objekt zu groß?" -#: src/libslic3r/PrintConfig.cpp:2161 +#: src/libslic3r/PrintConfig.cpp:2262 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:1018 +#: src/slic3r/GUI/Plater.cpp:1194 msgid "object(s)" msgstr "Objekt(e)" -#: src/slic3r/GUI/Plater.cpp:1043 src/slic3r/GUI/Plater.cpp:1058 +#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245 msgid "objects" msgstr "Objekte" -#: src/libslic3r/PrintConfig.cpp:402 src/libslic3r/PrintConfig.cpp:808 +#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 msgid "Octagram Spiral" msgstr "Achterstern-Spirale" @@ -4175,806 +5015,993 @@ msgstr "Achterstern-Spirale" msgid "OctoPrint version" msgstr "OctoPrint Version" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3425 msgid "of a current Object" msgstr "des aktuellen Objekts" -#: src/slic3r/GUI/wxExtensions.cpp:2570 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +msgid "Offset" +msgstr "Offset" + +#: src/slic3r/GUI/Tab.cpp:1755 +#, 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 msgid "One layer mode" msgstr "Eine Schicht Modus" -#: src/libslic3r/Print.cpp:1285 +#: src/libslic3r/Print.cpp:1365 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:1817 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2676 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." -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1027 msgid "Only infill where needed" msgstr "Infill nur wo es notwendig ist drucken" -#: src/slic3r/GUI/Tab.cpp:2271 +#: src/slic3r/GUI/Tab.cpp:2373 msgid "Only lift Z" msgstr "Nur Z anheben" -#: src/libslic3r/PrintConfig.cpp:1500 +#: src/libslic3r/PrintConfig.cpp:1570 msgid "Only lift Z above" msgstr "Z nur Anheben über" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1579 msgid "Only lift Z below" msgstr "Z anheben nur unter" -#: src/libslic3r/PrintConfig.cpp:1279 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Only retract when crossing perimeters" msgstr "Nur bei Umfangsüberquerungen einziehen" -#: src/slic3r/GUI/Tab.cpp:1126 +#: src/slic3r/GUI/Tab.cpp:1187 msgid "Ooze prevention" msgstr "Vermeidung von Nachsickern (Ooze)" -#: src/libslic3r/Print.cpp:1193 +#: src/libslic3r/Print.cpp:1266 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:339 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "Open a project file" msgstr "Öffne eine Projektdatei" -#: src/slic3r/GUI/Tab.cpp:1745 +#: src/slic3r/GUI/Tab.cpp:1729 msgid "Open CA certificate file" msgstr "Open CA Zertifikat Datei" -#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:126 +#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:183 msgid "Open changelog page" msgstr "Änderungsseite öffnen" -#: src/slic3r/GUI/UpdateDialogs.cpp:68 +#: src/slic3r/GUI/UpdateDialogs.cpp:65 msgid "Open download page" msgstr "Downloadseite öffnen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 -msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "Öffne Konfiguration aus Projekt STL/OBJ/AMF/3MF, lösche Druckbett" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +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:551 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:693 +#, c-format msgid "Open the %s website in your browser" msgstr "%s-Website in Ihrem Browser öffnen" -#: src/slic3r/GUI/MainFrame.cpp:542 +#: src/slic3r/GUI/MainFrame.cpp:684 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:549 +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Open the software releases page in your browser" msgstr "Seite mit Programmversionen in Ihrem Browser öffnen" -#: src/slic3r/GUI/Plater.cpp:2994 +#: src/slic3r/GUI/Plater.cpp:4040 msgid "Optimize orientation" msgstr "Optimiere Ausrichtung" -#: src/slic3r/GUI/Plater.cpp:2643 +#: src/slic3r/GUI/Plater.cpp:2767 msgid "Optimize Rotation" msgstr "Rotation optimieren" -#: src/slic3r/GUI/Plater.cpp:2994 +#: src/slic3r/GUI/Plater.cpp:4040 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:112 +#: src/libslic3r/PrintConfig.cpp:137 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:1070 +#: src/slic3r/GUI/Tab.cpp:1131 msgid "Options for support material and raft" -msgstr "Optionen für Stützmaterial und Raft" +msgstr "Optionen für Stützstrukturen und Raft" -#: src/slic3r/GUI/Plater.cpp:2251 +#: src/slic3r/GUI/DoubleSlider.cpp:989 +msgid "or press \"+\" key" +msgstr "oder drücken Sie die Taste \"+\"" + +#: src/slic3r/GUI/Plater.cpp:2892 msgid "Orientation found." msgstr "Ausrichtung gefunden." -#: src/slic3r/GUI/Plater.cpp:2768 +#: src/slic3r/GUI/Plater.cpp:2891 msgid "Orientation search canceled." msgstr "Ausrichtungssuche abgebrochen." -#: src/slic3r/GUI/BedShapeDialog.cpp:79 +#: src/slic3r/GUI/BedShapeDialog.cpp:84 msgid "Origin" msgstr "Nullpunkt" -#: src/slic3r/GUI/Tab.cpp:1165 +#: src/slic3r/GUI/Tab.cpp:1227 msgid "Other" msgstr "Sonstige" -#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:1977 +#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064 msgid "Other layers" msgstr "Andere Schichten" -#: src/slic3r/GUI/ConfigWizard.cpp:438 +#: src/slic3r/GUI/ConfigWizard.cpp:856 msgid "Other Vendors" msgstr "Andere Hersteller" -#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:3440 +#: src/slic3r/GUI/Tab.cpp:1238 src/slic3r/GUI/Tab.cpp:3666 msgid "Output file" msgstr "Ausgabedatei" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3493 msgid "Output File" msgstr "Ausgabedatei" -#: src/libslic3r/PrintConfig.cpp:1294 +#: src/libslic3r/PrintConfig.cpp:1363 msgid "Output filename format" msgstr "Ausgabe Dateinamen Format" -#: src/libslic3r/PrintConfig.cpp:2992 +#: src/libslic3r/PrintConfig.cpp:3381 msgid "Output Model Info" msgstr "Ausgabe Modellinformationen" -#: src/slic3r/GUI/Tab.cpp:1168 src/slic3r/GUI/Tab.cpp:3439 +#: src/slic3r/GUI/Tab.cpp:1230 src/slic3r/GUI/Tab.cpp:3665 msgid "Output options" msgstr "Ausgabeoptionen" -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/GCode/PreviewData.cpp:165 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312 msgid "Overhang perimeter" -msgstr "Überhängende Aussenschicht" +msgstr "Überhängende Außenkontur" -#: src/libslic3r/PrintConfig.cpp:1955 +#: src/libslic3r/PrintConfig.cpp:2042 msgid "Overhang threshold" msgstr "Überhangsschwellwert" -#: src/slic3r/GUI/Tab.cpp:1153 +#: src/slic3r/GUI/Tab.cpp:1215 msgid "Overlap" msgstr "Überlappung" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "P&rint Settings Tab" msgstr "D&ruckeinstellungen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:79 src/slic3r/GUI/GUI_ObjectList.cpp:520 -#: src/slic3r/GUI/Tab.cpp:3425 src/slic3r/GUI/Tab.cpp:3426 -#: src/libslic3r/PrintConfig.cpp:2516 src/libslic3r/PrintConfig.cpp:2523 -#: src/libslic3r/PrintConfig.cpp:2537 src/libslic3r/PrintConfig.cpp:2547 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2569 +#: 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 msgid "Pad" msgstr "Grundschicht (Pad)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 msgid "Pad and Support" msgstr "Grundschicht und Stützen" -#: src/libslic3r/PrintConfig.cpp:2732 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "Pad around object" msgstr "Grundschicht um Objekt" -#: src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:2862 +msgid "Pad around object everywhere" +msgstr "Grundschicht überall um Objekt" + +#: src/libslic3r/PrintConfig.cpp:2811 +msgid "Pad brim size" +msgstr "Grundschicht Randgröße" + +#: src/libslic3r/SLA/Pad.cpp:691 +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 msgid "Pad object connector penetration" msgstr "Objektgrundschicht Verbindungseindringtiefe" -#: src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2880 msgid "Pad object connector stride" msgstr "Objektgrundschicht Verbindungsschritte" -#: src/libslic3r/PrintConfig.cpp:2721 +#: src/libslic3r/PrintConfig.cpp:2889 msgid "Pad object connector width" msgstr "Objektgrundschicht Verbinderbreite" -#: src/libslic3r/PrintConfig.cpp:2700 +#: src/libslic3r/PrintConfig.cpp:2869 msgid "Pad object gap" msgstr "Grundschicht Objekt Abstand" -#: src/libslic3r/PrintConfig.cpp:2532 +#: src/libslic3r/PrintConfig.cpp:2797 msgid "Pad wall height" msgstr "Grundschicht Wandhöhe" -#: src/libslic3r/PrintConfig.cpp:2568 +#: src/libslic3r/PrintConfig.cpp:2844 msgid "Pad wall slope" msgstr "Grundschicht Wandneigung" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2787 msgid "Pad wall thickness" -msgstr "Grundschicht Wanddicke" +msgstr "Grundschicht Wandstärke" -#: src/slic3r/GUI/Field.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +msgid "Page Down" +msgstr "Page Down" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Page Up" +msgstr "Page Up" + +#: src/slic3r/GUI/Field.cpp:139 msgid "parameter name" msgstr "Parametername" -#: src/slic3r/GUI/Field.cpp:184 +#: src/slic3r/GUI/Field.cpp:243 msgid "Parameter validation" msgstr "Parameterüberprüfung" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Part" msgstr "Teil" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1881 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2494 msgid "Part manipulation" msgstr "Teilbearbeitung" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2483 msgid "Part Settings to modify" msgstr "Abweichende Teileigenschaften" -#: src/slic3r/GUI/GLCanvas3D.cpp:3449 +#: src/slic3r/GUI/GLCanvas3D.cpp:4514 msgid "Paste" msgstr "Einfügen" -#: src/slic3r/GUI/MainFrame.cpp:456 +#: src/slic3r/GUI/MainFrame.cpp:592 msgid "Paste clipboard" msgstr "Aus Zwischenablage einfügen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 msgid "Paste from clipboard" msgstr "Aus Zwischenablage einfügen" -#: src/slic3r/GUI/Plater.cpp:4772 +#: src/slic3r/GUI/Plater.cpp:5606 msgid "Paste From Clipboard" msgstr "Aus Zwischenablage einfügen" -#: src/libslic3r/PrintConfig.cpp:1915 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "Pattern" msgstr "Muster" -#: src/libslic3r/PrintConfig.cpp:1805 +#: src/libslic3r/PrintConfig.cpp:1891 msgid "Pattern angle" msgstr "Muster Winkel" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:2016 msgid "Pattern spacing" msgstr "Muster Abstand" -#: src/libslic3r/PrintConfig.cpp:1917 +#: src/libslic3r/PrintConfig.cpp:2004 msgid "Pattern used to generate support material." msgstr "Unterstützungsmaterialmuster." -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:198 +#: src/slic3r/GUI/Plater.cpp:1261 +msgid "Pause" +msgstr "Pause" + +#: src/slic3r/GUI/DoubleSlider.cpp:1009 +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/Gizmos/GLGizmoCut.cpp:175 msgid "Perform cut" msgstr "Schnitt ausführen" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/GCode/PreviewData.cpp:163 -msgid "Perimeter" -msgstr "Aussenschicht" +#: src/libslic3r/PrintConfig.cpp:2927 +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/libslic3r/PrintConfig.cpp:1339 +#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:310 +msgid "Perimeter" +msgstr "Außenkontur" + +#: src/libslic3r/PrintConfig.cpp:1408 msgid "Perimeter extruder" msgstr "Umfang Extruder" -#: src/slic3r/GUI/PresetHints.cpp:162 +#: src/slic3r/GUI/PresetHints.cpp:165 msgid "perimeters" -msgstr "Aussenschichten" +msgstr "Außenkonturen" -#: src/libslic3r/PrintConfig.cpp:1330 src/libslic3r/PrintConfig.cpp:1348 -#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1370 +#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440 msgid "Perimeters" msgstr "Konturen" -#: src/slic3r/GUI/ConfigWizard.cpp:440 -#, possible-c-format -msgid "Pick another vendor supported by %s:" -msgstr "Wählen Sie einen anderen von %s unterstützten Hersteller:" +#: src/slic3r/GUI/ConfigWizard.cpp:860 +#, 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:2430 +#: 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:2681 msgid "Pillar widening factor" msgstr "Pfeilerverbreiterungsfaktor" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:32 +#: src/slic3r/GUI/ConfigManipulation.cpp:330 +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 +msgid "Place bearings in slots and resume printing" +msgstr "Lager in Nuten einsetzen und Druck wieder aufnehmen" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45 msgid "Place on face" msgstr "Auf Fläche legen" -#: src/slic3r/GUI/MainFrame.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:204 msgid "Plater" msgstr "Druckplatte" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 -msgid "Plater Shortcuts" -msgstr "Druckplatten Kürzel" - -#: src/slic3r/GUI/GUI.cpp:143 +#: src/slic3r/GUI/GUI_App.cpp:1085 msgid "Please check and fix your object list." msgstr "Bitte überprüfen und korrigieren Sie Ihre Objektliste." -#: src/slic3r/GUI/Tab.cpp:2797 +#: src/slic3r/GUI/Plater.cpp:2312 src/slic3r/GUI/Tab.cpp:2959 msgid "Please check your object list before preset changing." msgstr "Bitte überprüfen Sie Ihre Objektliste, bevor Sie die Voreinstellungen ändern." -#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:286 +#: src/slic3r/GUI/Plater.cpp:3286 +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 msgid "Portions copyright" msgstr "Teile des Urheberrechts" -#: src/libslic3r/PrintConfig.cpp:2235 +#: src/libslic3r/PrintConfig.cpp:2400 msgid "Portrait" msgstr "Hochformat" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:193 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457 msgid "Position" msgstr "Position" -#: src/slic3r/GUI/Tab.cpp:2265 +#: src/slic3r/GUI/Tab.cpp:2367 msgid "Position (for multi-extruder printers)" msgstr "Position (für Multi-Extruder-Drucker)" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Position (mm)" -msgstr "Position (mm)" - -#: src/libslic3r/PrintConfig.cpp:1553 +#: src/libslic3r/PrintConfig.cpp:1623 msgid "Position of perimeters starting points." msgstr "Position des Startpunktes des Umfangs." -#: src/libslic3r/PrintConfig.cpp:2123 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Position X" msgstr "X-Position" -#: src/libslic3r/PrintConfig.cpp:2130 +#: src/libslic3r/PrintConfig.cpp:2231 msgid "Position Y" msgstr "Y-Position" -#: src/slic3r/GUI/Tab.cpp:1187 src/libslic3r/PrintConfig.cpp:1383 +#: src/slic3r/GUI/Tab.cpp:1245 src/libslic3r/PrintConfig.cpp:1453 msgid "Post-processing scripts" msgstr "Nachbearbeitungs Script" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Pre&view" msgstr "&Vorschau" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 src/slic3r/GUI/Preferences.cpp:10 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10 msgid "Preferences" msgstr "Einstellungen" -#: src/libslic3r/PrintConfig.cpp:1571 +#: src/libslic3r/PrintConfig.cpp:1641 msgid "Preferred direction of the seam" msgstr "Bevorzugte Richtung für die Naht" -#: src/libslic3r/PrintConfig.cpp:1582 +#: src/libslic3r/PrintConfig.cpp:1652 msgid "Preferred direction of the seam - jitter" msgstr "Bevorzugte Zitterrichtung für die Naht" -#: src/libslic3r/PrintObject.cpp:251 +#: src/libslic3r/PrintObject.cpp:255 msgid "Preparing infill" msgstr "Infill wird vorbereitet" -#: src/slic3r/GUI/Tab.cpp:2758 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:2920 +#, c-format msgid "Preset (%s)" msgstr "Voreinstellung (%s)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Press to activate deselection rectangle\nor to scale or rotate selected objects\naround their own center" -msgstr "Drücken um das Abwahlrechteck zu aktivieren\noder um gewählte Objekte zu skalieren oder\num die eigene Mitte zu drehen" +#: src/slic3r/GUI/Tab.cpp:3082 +msgid "Preset with name \"%1%\" already exists." +msgstr "Eine Voreinstellung mit dem Namen \"%1%\" existiert bereits." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/Tab.cpp:3029 +msgctxt "PresetName" +msgid "Copy" +msgstr "Kopieren" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +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:146 -#, possible-c-format -msgid "Press to activate selection rectangle\nor to snap by 5% in Gizmo scale\nor to snap by 1mm in Gizmo move" -msgstr "Drücken um Auswahlrechteck zu aktivieren\noder mit 5% bei der Gizmo Skalierung zu rasten\noder mit 1 mm bei der Gizmo Bewegung" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +msgid "Press to activate selection rectangle" +msgstr "Drücken um das Auswahlrechteck zu aktivieren" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Press to scale selection to fit print volume\nin Gizmo scale" -msgstr "Drücken, um die Auswahl passend zum\nDruckvolumen in der Gizmo Skalierung anzupassen" +#: 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:127 -msgid "Press to select multiple object or move multiple object with mouse" -msgstr "Drücken zum Auswählen des mehrteiligen Objekts oder Bewegen des mehrteiligen Objekts mit der Maus" +#: 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/Tab.cpp:2288 +#: 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:211 src/slic3r/GUI/Plater.cpp:4105 +#: src/slic3r/GUI/Tab.cpp:2390 msgid "Preview" msgstr "Vorschau" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -msgid "Preview Shortcuts" -msgstr "Vorschau Kürzel" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Preview hollowed and drilled model" +msgstr "Vorschau des ausgehöhlten und aufgebohrten Modells" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:790 msgid "Previously sliced file (" msgstr "Vorher geslicete Datei (" -#: src/libslic3r/PrintConfig.cpp:1773 +#: src/libslic3r/PrintConfig.cpp:1851 msgid "Prime all printing extruders" msgstr "Alle Druckextruder vorfüllen" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1274 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1521 msgid "print" msgstr "Druck" -#: src/slic3r/GUI/MainFrame.cpp:510 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Print &Host Upload Queue" msgstr "Druck&host Warteschlange" -#: src/libslic3r/PrintConfig.cpp:439 +#: src/libslic3r/PrintConfig.cpp:471 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:541 +#: src/slic3r/GUI/ConfigWizard.cpp:952 msgid "Print Diameters" msgstr "Druckdurchmesser" -#: src/slic3r/GUI/Tab.cpp:1917 src/slic3r/GUI/Tab.cpp:2074 +#: src/slic3r/GUI/Tab.cpp:1944 src/slic3r/GUI/Tab.cpp:2123 msgid "Print Host upload" msgstr "Hochladen zum Druckhost" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 -#: src/slic3r/GUI/PrintHostDialogs.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/PrintHostDialogs.cpp:136 msgid "Print host upload queue" msgstr "Druckhost Warteschlange" -#: src/slic3r/GUI/Tab.hpp:317 src/slic3r/GUI/Tab.hpp:405 +#: src/slic3r/GUI/DoubleSlider.cpp:970 +msgid "Print mode" +msgstr "Druckmodus" + +#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:431 msgid "Print Settings" msgstr "Druckeinstellungen" -#: src/slic3r/GUI/Plater.cpp:681 +#: src/slic3r/GUI/Plater.cpp:815 msgid "Print settings" msgstr "Druckeinstellungen" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1478 msgid "Print speed override" msgstr "Korrektur der Druckgeschwindigkeit" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/libslic3r/GCode.cpp:638 +msgid "Print z" +msgstr "Druck z" + +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Print&er Settings Tab" msgstr "Druck&ereinstellungen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1438 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1621 msgid "Printable" msgstr "Druckbar" -#: src/slic3r/GUI/Plater.cpp:685 +#: src/slic3r/GUI/Plater.cpp:819 msgid "Printer" msgstr "Drucker" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:48 src/slic3r/GUI/Preset.cpp:1278 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1525 msgid "printer" msgstr "Drucker" -#: src/libslic3r/PrintConfig.cpp:2274 src/libslic3r/PrintConfig.cpp:2275 +#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 msgid "Printer absolute correction" msgstr "Drucker absolute Korrektur" -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457 msgid "Printer gamma correction" msgstr "Drucker Gammakorrektur" -#: src/slic3r/GUI/Tab.cpp:926 +#: src/slic3r/GUI/Tab.cpp:976 msgid "printer model" msgstr "Druckermodell" -#: src/libslic3r/PrintConfig.cpp:1402 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Printer notes" msgstr "Drucker Anmerkungen" -#: src/libslic3r/PrintConfig.cpp:2266 src/libslic3r/PrintConfig.cpp:2267 -#: src/libslic3r/PrintConfig.cpp:2268 +#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2433 msgid "Printer scaling correction" msgstr "Drucker skalierte Korrektur" -#: src/slic3r/GUI/Tab.hpp:368 +#: src/slic3r/GUI/Tab.hpp:391 msgid "Printer Settings" msgstr "Druckereinstellungen" -#: src/libslic3r/PrintConfig.cpp:42 src/libslic3r/PrintConfig.cpp:43 +#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 msgid "Printer technology" msgstr "Druckertechnologie" -#: src/libslic3r/PrintConfig.cpp:1396 +#: src/libslic3r/PrintConfig.cpp:1466 msgid "Printer type" msgstr "Druckertyp" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1487 msgid "Printer variant" msgstr "Druckervariante" -#: src/libslic3r/PrintConfig.cpp:1411 +#: src/libslic3r/PrintConfig.cpp:1481 msgid "Printer vendor" msgstr "Druckerhersteller" -#: src/libslic3r/Print.cpp:1294 +#: src/libslic3r/Print.cpp:1388 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:715 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:849 +#, c-format msgid "Processing %s" msgstr "Berechne %s" -#: src/slic3r/GUI/Plater.cpp:1600 -#, possible-c-format -msgid "Processing input file %s\n" -msgstr "Eingabe Datei %s wird verarbeitet\n" +#: src/slic3r/GUI/Plater.cpp:2283 +#, c-format +msgid "Processing input file %s" +msgstr "Eingabe Datei %s wird verarbeitet" -#: src/libslic3r/PrintObject.cpp:110 +#: src/libslic3r/PrintObject.cpp:108 msgid "Processing triangulated mesh" msgstr "Verarbeitung der dreieckigen Netze" -#: src/slic3r/GUI/Tab.cpp:1201 src/slic3r/GUI/Tab.cpp:1585 -#: src/slic3r/GUI/Tab.cpp:1993 src/slic3r/GUI/Tab.cpp:2087 -#: src/slic3r/GUI/Tab.cpp:3337 src/slic3r/GUI/Tab.cpp:3446 +#: 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 msgid "Profile dependencies" msgstr "Profil Abhängigkeiten" -#: src/slic3r/GUI/PrintHostDialogs.cpp:149 +#: src/slic3r/GUI/ConfigWizard.cpp:566 +msgid "Profile:" +msgstr "Profil:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:150 msgid "Progress" msgstr "Fortschritt" -#: src/slic3r/GUI/FirmwareDialog.cpp:779 +#: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Progress:" msgstr "Fortschritt:" -#: src/slic3r/GUI/MainFrame.cpp:542 +#: src/slic3r/GUI/MainFrame.cpp:684 msgid "Prusa 3D &Drivers" msgstr "Prusa 3&D Treiber" -#: src/slic3r/GUI/ConfigWizard.cpp:1109 +#: src/slic3r/GUI/ConfigWizard.cpp:1995 msgid "Prusa FFF Technology Printers" msgstr "Prusa FFF Technologie Drucker" -#: src/slic3r/GUI/ConfigWizard.cpp:1112 +#: src/slic3r/GUI/ConfigWizard.cpp:1998 msgid "Prusa MSLA Technology Printers" msgstr "Prusa MSLA Technologie Drucker" -#: src/slic3r/GUI/AboutDialog.cpp:255 +#: src/slic3r/GUI/AboutDialog.cpp:260 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/GUI_App.cpp:297 -#, 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." +#: 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 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/libslic3r/PrintConfig.cpp:2153 +#: 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/libslic3r/PrintConfig.cpp:2254 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:456 +#: src/slic3r/GUI/Plater.cpp:544 msgid "Purging volumes" msgstr "Reinigungsvolumen" -#: src/libslic3r/PrintConfig.cpp:2106 +#: src/libslic3r/PrintConfig.cpp:2207 msgid "Purging volumes - load/unload volumes" msgstr "Reinigungsvolumen - Lade-/Entladevolumen" -#: src/libslic3r/PrintConfig.cpp:2113 +#: src/libslic3r/PrintConfig.cpp:2214 msgid "Purging volumes - matrix" msgstr "Reinigungsvolumen - Matrix" -#: src/slic3r/GUI/Tab.cpp:1019 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +msgid "Quality" +msgstr "Qualität" + +#: src/slic3r/GUI/Tab.cpp:1080 msgid "Quality (slower slicing)" msgstr "Qualität (langsameres Slicen)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:854 src/slic3r/GUI/GUI_ObjectList.cpp:1139 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1145 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1377 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:273 +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 msgid "Quick Add Settings (%s)" msgstr "Schnelles Einstellen (%s)" -#: src/slic3r/GUI/MainFrame.cpp:383 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Quick Slice" msgstr "Quick Slice" -#: src/slic3r/GUI/MainFrame.cpp:389 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Quick Slice and Save As" msgstr "Quick Slice und Speichern unter" -#: src/slic3r/GUI/MainFrame.cpp:409 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:540 +#, c-format msgid "Quit %s" msgstr "%s verlassen" -#: src/libslic3r/PrintConfig.cpp:479 +#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511 msgid "Radius" msgstr "Radius" -#: src/slic3r/GUI/Tab.cpp:1066 +#: src/slic3r/GUI/Tab.cpp:1127 msgid "Raft" msgstr "Raft" -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1501 msgid "Raft layers" -msgstr "Raft Schichten" +msgstr "Raftschichten" -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" msgstr "Einstellungen für das Rammen" -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 -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: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." -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 msgid "Ramming line spacing" msgstr "Abstand der Rammlinien" -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 msgid "Ramming line width" msgstr "Breite der Rammlinie" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Ramming parameters" msgstr "Rammparameter" -#: src/slic3r/GUI/Tab.cpp:1545 +#: src/slic3r/GUI/Tab.cpp:1505 msgid "Ramming settings" msgstr "Einstellungen für das Rammen" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "Random" msgstr "Zufällig" -#: src/slic3r/GUI/wxExtensions.cpp:486 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 msgid "Range" msgstr "Bereich" -#: src/libslic3r/SLAPrint.cpp:72 +#: src/libslic3r/SLAPrintSteps.cpp:65 msgid "Rasterizing layers" msgstr "Schichten werden gerastert" -#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#: src/slic3r/GUI/MainFrame.cpp:596 +msgid "Re&load from disk" +msgstr "Erneutes &Laden von der Festplatte" + +#: src/slic3r/GUI/UpdateDialogs.cpp:249 msgid "Re-configure" msgstr "Neu konfigurieren" -#: src/slic3r/GUI/FirmwareDialog.cpp:783 +#: src/slic3r/GUI/FirmwareDialog.cpp:821 msgid "Ready" msgstr "Fertig" -#: src/slic3r/GUI/Plater.cpp:2406 +#: src/slic3r/GUI/Plater.cpp:3115 msgid "Ready to slice" msgstr "Bereit zum Slicen" -#: src/slic3r/GUI/MainFrame.cpp:526 src/libslic3r/PrintConfig.cpp:1562 +#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632 msgid "Rear" msgstr "Hinten" -#: src/slic3r/GUI/MainFrame.cpp:526 +#: src/slic3r/GUI/MainFrame.cpp:669 msgid "Rear View" msgstr "Ansicht von Hinten" -#: src/slic3r/GUI/MainFrame.cpp:401 +#: src/slic3r/GUI/MainFrame.cpp:413 msgid "Recent projects" -msgstr "Letzte Projekte" +msgstr "L&etzte Projekte" -#: src/slic3r/GUI/PresetHints.cpp:262 -#, possible-c-format +#: src/slic3r/GUI/PresetHints.cpp:263 +#, 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 +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 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." +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:386 src/slic3r/GUI/GUI_App.cpp:395 +#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459 msgid "Recreating" msgstr "Neu Erzeugen" -#: src/slic3r/GUI/BedShapeDialog.cpp:68 +#: src/slic3r/GUI/BedShapeDialog.cpp:73 msgid "Rectangular" msgstr "Rechteckig" -#: src/libslic3r/PrintConfig.cpp:398 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1922 +#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843 +#: src/libslic3r/PrintConfig.cpp:2009 msgid "Rectilinear" msgstr "Geradlinig" -#: src/libslic3r/PrintConfig.cpp:1923 +#: src/libslic3r/PrintConfig.cpp:2010 msgid "Rectilinear grid" msgstr "Rechtwinkliges Gitter" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3639 -#: src/slic3r/GUI/MainFrame.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131 +#: src/slic3r/GUI/MainFrame.cpp:584 msgid "Redo" msgstr "Redo" -#: src/slic3r/GUI/GLCanvas3D.cpp:3497 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 +#, 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:3479 +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 msgid "Redo History" msgstr "Redo Verlauf" -#: src/slic3r/GUI/Tab.cpp:1037 +#: src/slic3r/GUI/Tab.cpp:1098 msgid "Reducing printing time" msgstr "Druckzeit wird verkürzt" -#: src/slic3r/GUI/Plater.cpp:2924 -msgid "Reload from Disk" -msgstr "Von Festplatte neu laden" +#: src/slic3r/GUI/Plater.cpp:3452 +msgid "Reload all from disk" +msgstr "Alles von der Festplatte neu laden" -#: src/slic3r/GUI/Plater.cpp:2924 -msgid "Reload the selected file from Disk" -msgstr "Ausgewählte Datei von 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 +msgid "Reload from disk" +msgstr "Neuladen von Festplatte" -#: src/slic3r/GUI/Preferences.cpp:36 +#: src/slic3r/GUI/Plater.cpp:3339 +msgid "Reload from:" +msgstr "Neuladen von:" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +msgid "Reload plater from disk" +msgstr "Druckplatte neu von der Festplatte laden" + +#: src/slic3r/GUI/MainFrame.cpp:597 +msgid "Reload the plater from disk" +msgstr "Druckplatte neu von der Festplatte laden" + +#: src/slic3r/GUI/Plater.cpp:3963 +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 +msgid "Reload the selected volumes from disk" +msgstr "Die ausgewählten Volumen von der Festplatte neu laden" + +#: src/slic3r/GUI/Preferences.cpp:39 msgid "Remember output directory" msgstr "Ausgabeverzeichnis merken" -#: src/slic3r/GUI/Tab.cpp:2935 +#: src/slic3r/GUI/Tab.cpp:3121 msgid "remove" msgstr "Entfernen" -#: src/slic3r/GUI/Tab.cpp:2937 +#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 +#: src/slic3r/GUI/Tab.cpp:3124 msgid "Remove" msgstr "Entfernen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:859 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +msgid "Remove all holes" +msgstr "Alle Löcher entfernen" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 msgid "Remove all points" msgstr "Alle Punkte entfernen" -#: src/slic3r/GUI/GLCanvas3D.cpp:3475 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 +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 msgid "Remove instance" msgstr "Kopie entfernen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Remove Instance of the selected object" -msgstr "Entfernt Kopie des gewählten Objekt" +msgstr "Entfernt Kopie des gewählten Objekts" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:153 msgid "Remove layer range" msgstr "Schichtbereich entfernen" -#: src/slic3r/GUI/Plater.cpp:3518 +#: src/slic3r/GUI/Plater.cpp:3942 msgid "Remove one instance of the selected object" -msgstr "Entferne eine Kopie des gewählten Objekt" +msgstr "Entferne eine Kopie des gewählten Objekts" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:83 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95 msgid "Remove parameter" msgstr "Parameter entfernen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1230 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 msgid "Remove point" msgstr "Punkt entfernen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1233 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 msgid "Remove point from selection" msgstr "Punkt von Auswahl entfernen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:855 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1237 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +msgid "Remove selected holes" +msgstr "Ausgewählte Löcher entfernen" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1371 msgid "Remove selected points" msgstr "Ausgewählte Punkte entfernen" -#: src/slic3r/GUI/Plater.cpp:2891 src/slic3r/GUI/Plater.cpp:2909 +#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953 msgid "Remove the selected object" msgstr "Ausgewähltes Objekt entfernen" -#: src/slic3r/GUI/ConfigWizard.cpp:305 -msgid "Remove user profiles - install from scratch (a snapshot will be taken beforehand)" -msgstr "Benutzerprofile entfernen - von Grund auf neu installieren (eine Momentaufnahme wird vorab erstellt)" +#: src/slic3r/GUI/ConfigWizard.cpp:453 +msgid "Remove user profiles (a snapshot will be taken beforehand)" +msgstr "Benutzerprofile entfernen (eine Momentaufnahme wird vorab erstellt)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1200 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1636 msgid "Rename" msgstr "Umbenennen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:551 msgid "Rename Object" msgstr "Objekt umbenennen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:551 msgid "Rename Sub-object" msgstr "Subobjekt umbenennen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3803 msgid "Renaming" msgstr "Am Umbenennen" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115 +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 msgid "Render with a software renderer" msgstr "Rendern mit einem Software-Renderer" -#: src/libslic3r/PrintConfig.cpp:3126 +#: src/libslic3r/PrintConfig.cpp:3516 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:772 src/libslic3r/PrintConfig.cpp:3058 +#: src/slic3r/GUI/MainFrame.cpp:911 src/libslic3r/PrintConfig.cpp:3447 msgid "Repair" msgstr "Reparieren" @@ -4998,279 +6025,310 @@ 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/KBShortcutsDialog.cpp:113 src/slic3r/GUI/MainFrame.cpp:395 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat last quick slice" msgstr "Letzten Quick Slice wiederholen" -#: src/slic3r/GUI/MainFrame.cpp:395 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat Last Quick Slice" msgstr "Letzten Quick Slice wiederholen" -#: src/slic3r/GUI/MainFrame.cpp:561 -msgid "Report an I&ssue" -msgstr "E&in Problem melden" +#: src/slic3r/GUI/Tab.cpp:3083 +msgid "Replace?" +msgstr "Ersetzen?" -#: src/slic3r/GUI/MainFrame.cpp:561 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:703 +msgid "Report an I&ssue" +msgstr "Ein &Problem melden" + +#: src/slic3r/GUI/MainFrame.cpp:703 +#, c-format msgid "Report an issue on %s" msgstr "Einen Problem melden über %s" -#: src/slic3r/Utils/PresetUpdater.cpp:590 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:713 +#, c-format msgid "requires max. %s" msgstr "benötigt max. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:588 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:710 +#, c-format msgid "requires min. %s" msgstr "benötigt min. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:583 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:705 +#, c-format msgid "requires min. %s and max. %s" msgstr "benötigt min. %s und max. %s" -#: src/slic3r/GUI/FirmwareDialog.cpp:772 +#: src/slic3r/GUI/FirmwareDialog.cpp:810 msgid "Rescan" msgstr "Rescan" -#: src/slic3r/GUI/Tab.cpp:1879 +#: src/slic3r/GUI/Tab.cpp:1906 msgid "Rescan serial ports" msgstr "Serielle Schnittstellen nochmals abfragen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1239 +#: src/slic3r/GUI/GLCanvas3D.cpp:313 +msgid "Reset" +msgstr "Rücksetzen" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1373 msgid "Reset clipping plane" msgstr "Beschnittebene zurücksetzen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:928 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 msgid "Reset direction" msgstr "Richtung zurücksetzen" -#: src/slic3r/GUI/Plater.cpp:2603 +#: src/slic3r/GUI/Plater.cpp:2723 msgid "Reset Project" msgstr "Projekt zurücksetzen" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:303 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 msgid "Reset rotation" msgstr "Rotation zurücksetzen" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:328 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 msgid "Reset Rotation" msgstr "Rotation zurücksetzen" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:290 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 msgid "Reset scale" msgstr "Skalierung zurücksetzen" -#: src/slic3r/GUI/Tab.cpp:2584 +#: src/slic3r/GUI/GLCanvas3D.cpp:252 +msgid "Reset to base" +msgstr "Zurücksetzen auf Basis" + +#: src/slic3r/GUI/Tab.cpp:2394 msgid "Reset to Filament Color" msgstr "Zurücksetzen auf Filamentfarbe" -#: src/libslic3r/PrintConfig.cpp:1441 +#: src/libslic3r/PrintConfig.cpp:1511 msgid "Resolution" msgstr "Auflösung" -#: src/libslic3r/PrintConfig.cpp:1459 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Retract amount before wipe" msgstr "Einzugslänge vor einer Reinigung" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1537 msgid "Retract on layer change" -msgstr "Bei Schichtwechsel Einziehen" +msgstr "Bei Schichtwechsel einziehen" -#: src/slic3r/GUI/Tab.cpp:2268 +#: src/slic3r/GUI/Tab.cpp:1324 src/slic3r/GUI/Tab.cpp:1383 +#: src/slic3r/GUI/Tab.cpp:2370 msgid "Retraction" msgstr "Einzug" -#: src/libslic3r/PrintConfig.cpp:1453 +#: src/libslic3r/PrintConfig.cpp:1523 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:1474 +#: src/libslic3r/PrintConfig.cpp:1544 msgid "Retraction Length" msgstr "Einzugslänge" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1552 msgid "Retraction Length (Toolchange)" msgstr "Einzugslänge (Werkzeugwechsel)" -#: src/libslic3r/PrintConfig.cpp:1534 src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605 msgid "Retraction Speed" msgstr "Einzugsgeschwindigkeit" -#: src/slic3r/GUI/Tab.cpp:2284 +#: src/slic3r/GUI/Tab.cpp:2386 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:244 +#: src/slic3r/GUI/GUI_Preview.cpp:254 msgid "Retractions" msgstr "Einzüge" -#: src/slic3r/GUI/MainFrame.cpp:528 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right" msgstr "Rechts" -#: src/slic3r/GUI/GUI_ObjectList.cpp:381 +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 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:279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 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:250 +#: src/slic3r/GUI/GUI_ObjectList.cpp:359 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:1232 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 msgid "Right click" msgstr "Rechter Mausklick" -#: src/slic3r/GUI/MainFrame.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:243 +msgid "Right mouse button:" +msgstr "Rechte Maustaste:" + +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right View" msgstr "Ansicht von rechts" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:233 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:253 -#: src/libslic3r/PrintConfig.cpp:3062 +#: 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 msgid "Rotate" msgstr "Drehen" -#: src/libslic3r/PrintConfig.cpp:3067 +#: src/libslic3r/PrintConfig.cpp:3456 msgid "Rotate around X" msgstr "Rotiere um X" -#: src/libslic3r/PrintConfig.cpp:3072 +#: src/libslic3r/PrintConfig.cpp:3461 msgid "Rotate around Y" msgstr "Rotiere um Y" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:35 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 msgid "Rotate lower part upwards" msgstr "Unteren Teil umdrehen" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:151 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:194 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Rotate selection 45 degrees CCW" +msgstr "Auswahl um 45 Grad drehen gegen UZS" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +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 msgid "Rotation" msgstr "Rotation" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:491 -msgid "Rotation (deg)" -msgstr "Rotation (Grad)" - -#: src/libslic3r/PrintConfig.cpp:3068 +#: src/libslic3r/PrintConfig.cpp:3457 msgid "Rotation angle around the X axis in degrees." msgstr "Rotationswinkel um die X-Achse in Grad." -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3462 msgid "Rotation angle around the Y axis in degrees." msgstr "Rotationswinkel um die Y-Achse in Grad." -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3452 msgid "Rotation angle around the Z axis in degrees." msgstr "Rotationswinkel um die Z-Achse in Grad." -#: src/slic3r/GUI/ConfigWizard.cpp:298 src/slic3r/GUI/GUI_App.cpp:658 -#, possible-c-format +#: src/slic3r/GUI/GUI_App.cpp:797 +#, c-format msgid "Run %s" msgstr "%s ausführen" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:85 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:398 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478 msgid "Running post-processing scripts" msgstr "Post-Prozess Scripts werden ausgeführt" -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/RammingChart.cpp:81 -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 src/libslic3r/PrintConfig.cpp:612 -#: src/libslic3r/PrintConfig.cpp:656 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:2243 src/libslic3r/PrintConfig.cpp:2252 -#: src/libslic3r/PrintConfig.cpp:2312 src/libslic3r/PrintConfig.cpp:2319 +#: 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 msgid "s" msgstr "s" -#: src/slic3r/GUI/MainFrame.cpp:466 src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:750 msgid "S&end G-code" msgstr "S&ende G-code" -#: src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:750 msgid "S&end to print" msgstr "Zum Drucken s&enden" #. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3264 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:3417 +#, c-format msgid "Save %s as:" msgstr "Speichere %s als:" -#: src/slic3r/GUI/MainFrame.cpp:686 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:826 +#, c-format msgid "Save %s file as:" msgstr "Speichere %s Datei als:" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1023 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046 msgid "Save changes?" msgstr "Änderungen speichern?" -#: src/libslic3r/PrintConfig.cpp:2997 +#: src/libslic3r/PrintConfig.cpp:3386 msgid "Save config file" msgstr "Speichere Konfigurationsdatei" -#: src/slic3r/GUI/MainFrame.cpp:786 +#: src/slic3r/GUI/MainFrame.cpp:925 msgid "Save configuration as:" msgstr "Konfiguration speichern unter:" -#: src/libslic3r/PrintConfig.cpp:2998 +#: src/libslic3r/PrintConfig.cpp:3387 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 -#, possible-c-format +#, c-format msgid "Save current %s" msgstr "Speichere aktuelle %s" -#: src/slic3r/GUI/MainFrame.cpp:341 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "Save current project file" msgstr "Speichere aktuelle Projektdatei" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save current project file as" msgstr "Speichere aktuelle Projektdatei als" -#: src/slic3r/GUI/Plater.cpp:1938 +#: src/slic3r/GUI/Plater.cpp:2604 msgid "Save file as:" msgstr "Speichere Datei als:" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/Plater.cpp:4839 msgid "Save G-code file as:" msgstr "Speichere G-Code Datei als:" -#: src/slic3r/GUI/MainFrame.cpp:757 +#: src/slic3r/GUI/MainFrame.cpp:899 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:417 +#: src/slic3r/GUI/Tab.hpp:443 msgid "Save preset" msgstr "Sichern der Voreinstellung" -#: src/slic3r/GUI/MainFrame.cpp:843 +#: src/slic3r/GUI/MainFrame.cpp:980 msgid "Save presets bundle as:" msgstr "Sichern der Voreinstellungssammlung unter:" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save Project &as" msgstr "Projekt sichern &als" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 -msgid "Save project (3MF)" -msgstr "Speichere Projekt (3MF)" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +msgid "Save project (3mf)" +msgstr "Speichere Projekt (3mf)" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +msgid "Save project as (3mf)" +msgstr "Speichere Projekt als (3mf)" + +#: src/slic3r/GUI/Plater.cpp:4839 msgid "Save SL1 file as:" msgstr "Speichere SL1 Datei als:" -#: src/slic3r/GUI/MainFrame.cpp:692 +#: src/slic3r/GUI/MainFrame.cpp:838 msgid "Save zip file as:" msgstr "Speichere Zip Datei als:" @@ -5280,58 +6338,61 @@ 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/GUI_ObjectManipulation.cpp:152 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:234 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:254 -#: src/libslic3r/PrintConfig.cpp:3077 +#: 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 msgid "Scale" msgstr "Skalieren" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:276 -msgid "Scale (%)" -msgstr "Skaliere (%)" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:195 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 msgid "Scale factors" msgstr "Skalierungsfaktoren" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: 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 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:3086 +#: src/libslic3r/PrintConfig.cpp:3475 msgid "Scale to Fit" msgstr "Passend skalieren" -#: src/slic3r/GUI/Selection.cpp:947 +#: src/slic3r/GUI/Selection.cpp:939 msgid "Scale To Fit" msgstr "Passend skalieren" -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3476 msgid "Scale to fit the given volume." msgstr "Auf das gegebene Volumen skalieren." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1724 msgid "Scale to print volume" msgstr "Auf Druckvolumen skalieren" -#: src/libslic3r/PrintConfig.cpp:3078 +#: src/libslic3r/PrintConfig.cpp:3467 msgid "Scaling factor or percentage." msgstr "Skalierungsfaktor oder Prozentsatz." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:409 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505 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:1551 +#: src/libslic3r/PrintConfig.cpp:1621 msgid "Seam position" msgstr "Nahtposition" -#: src/libslic3r/PrintConfig.cpp:1572 +#: src/libslic3r/PrintConfig.cpp:1642 msgid "Seam preferred direction" msgstr "Bevorzugte Richtung für Nähte" -#: src/libslic3r/PrintConfig.cpp:1581 +#: src/libslic3r/PrintConfig.cpp:1651 msgid "Seam preferred direction jitter" msgstr "Bevorzugte Zitterrichtung für Nähte" @@ -5339,67 +6400,63 @@ msgstr "Bevorzugte Zitterrichtung für Nähte" msgid "Searching for devices" msgstr "Es wird nach Geräten gesucht" -#: src/slic3r/GUI/Plater.cpp:2190 +#: src/slic3r/GUI/Plater.cpp:2858 msgid "Searching for optimal orientation" msgstr "Suche nach der optimalen Orientierung" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 -msgid "Select All objects" +#: src/slic3r/GUI/GUI_App.cpp:1103 +msgid "Select a gcode file:" +msgstr "Gcode Datei auswählen:" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Select all objects" msgstr "Alle Objekte auswählen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1236 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1370 msgid "Select all points" msgstr "Alle Punkte auswählen" -#: src/slic3r/GUI/ConfigWizard.cpp:1089 +#: src/slic3r/GUI/ConfigWizard.cpp:1976 msgid "Select all standard printers" msgstr "Wähle alle Standarddrucker" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1234 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368 msgid "Select by rectangle" msgstr "Auswahl über Rechteck" -#: src/slic3r/GUI/MainFrame.cpp:806 src/slic3r/GUI/MainFrame.cpp:870 +#: src/slic3r/GUI/MainFrame.cpp:944 src/slic3r/GUI/MainFrame.cpp:1006 msgid "Select configuration to load:" msgstr "Konfiguration zum Laden auswählen:" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82 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:2834 -msgid "Select extruder number for selected objects and/or parts" -msgstr "Wählen Sie die Extrudernummer für die ausgewählten Objekte und/oder Teile" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2847 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3971 msgid "Select extruder number:" msgstr "Wählen Sie die Extruder Nummer:" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 msgid "Select Filament Settings Tab" msgstr "Wählt Filamenteinstellungsreiter" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1251 -msgid "Select new extruder for the object/part" -msgstr "Wählt einen anderen Extruder für das Objekte / Teil" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 msgid "Select Plater Tab" msgstr "Wählt Druckplattenreiter" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 msgid "Select Print Settings Tab" msgstr "Wählt Druckeinstellungsreiter" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 msgid "Select Printer Settings Tab" msgstr "Wählt Druckereinstellungsreiter" -#: src/slic3r/GUI/GUI_ObjectList.cpp:917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1265 msgid "Select showing settings" msgstr "Wähle Anzeigeeinstellungen" -#: src/slic3r/GUI/GUI_App.cpp:524 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Select the language" msgstr "Wählen Sie die Sprache aus" @@ -5411,39 +6468,49 @@ msgstr "Wählt die Druckprofile, die mit diesem Profil kompatibel sind." 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:744 +#: src/slic3r/GUI/MainFrame.cpp:889 msgid "Select the STL file to repair:" msgstr "Geben Sie die STL-Datei an, die repariert werden soll:" -#: src/slic3r/GUI/Preferences.cpp:207 +#: src/slic3r/GUI/Preferences.cpp:237 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:2545 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3553 msgid "Select type of part" msgstr "Wählen Sie den Typ des Teils" -#: src/slic3r/GUI/Plater.cpp:606 +#: src/slic3r/GUI/Plater.cpp:638 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:421 +#: src/slic3r/GUI/Plater.cpp:498 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/Selection.cpp:146 msgid "Selection-Add" msgstr "Auswahl hinzufügen" -#: src/slic3r/GUI/Selection.cpp:384 +#: src/slic3r/GUI/Selection.cpp:376 msgid "Selection-Add All" msgstr "Auswahl Alles hinzufügen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3299 msgid "Selection-Add from list" msgstr "Auswahl aus Liste hinzufügen" -#: src/slic3r/GUI/GLCanvas3D.cpp:5623 +#: src/slic3r/GUI/GLCanvas3D.cpp:6598 msgid "Selection-Add from rectangle" msgstr "Auswahl über Rechteck hinzufügen" @@ -5459,15 +6526,15 @@ msgstr "Auswahl Objekt hinzufügen" msgid "Selection-Remove" msgstr "Auswahl entfernen" -#: src/slic3r/GUI/Selection.cpp:410 +#: src/slic3r/GUI/Selection.cpp:402 msgid "Selection-Remove All" msgstr "Auswahl Alles entfernen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2867 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3291 msgid "Selection-Remove from list" msgstr "Auswahl aus Liste entfernen" -#: src/slic3r/GUI/GLCanvas3D.cpp:5642 +#: src/slic3r/GUI/GLCanvas3D.cpp:6617 msgid "Selection-Remove from rectangle" msgstr "Auswahl über Rechteck entfernen" @@ -5479,11 +6546,11 @@ msgstr "Auswahl Kopie entfernen" msgid "Selection-Remove Object" msgstr "Auswahl Objekt entfernen" -#: src/slic3r/GUI/MainFrame.cpp:444 +#: src/slic3r/GUI/MainFrame.cpp:566 msgid "Selects all objects" msgstr "Alle Objekte auswählen" -#: src/slic3r/GUI/Plater.cpp:3822 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5522 msgid "Send G-code" msgstr "Sende G-code" @@ -5491,27 +6558,31 @@ msgstr "Sende G-code" msgid "Send G-Code to printer host" msgstr "Sende G-Code zum Druckerhost" -#: src/slic3r/GUI/MainFrame.cpp:466 +#: src/slic3r/GUI/MainFrame.cpp:481 msgid "Send to print current plate as G-code" msgstr "Sende die aktuelle Plattenbelegung als G-Code zum Drucken" -#: src/slic3r/GUI/Plater.cpp:731 src/slic3r/GUI/Plater.cpp:3822 +#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5522 msgid "Send to printer" msgstr "Zum Drucker senden" -#: src/slic3r/GUI/Tab.cpp:1169 +#: src/slic3r/GUI/GLCanvas3D.cpp:1305 +msgid "Seq." +msgstr "Seq." + +#: src/slic3r/GUI/Tab.cpp:1231 msgid "Sequential printing" msgstr "Sequentielles Drucken" -#: src/slic3r/GUI/Tab.cpp:1874 src/libslic3r/PrintConfig.cpp:1591 +#: src/slic3r/GUI/Tab.cpp:1901 src/libslic3r/PrintConfig.cpp:1661 msgid "Serial port" msgstr "Serieller Port" -#: src/libslic3r/PrintConfig.cpp:1599 +#: src/libslic3r/PrintConfig.cpp:1669 msgid "Serial port speed" msgstr "Serielle Portgeschwindigkeit" -#: src/slic3r/GUI/FirmwareDialog.cpp:769 +#: src/slic3r/GUI/FirmwareDialog.cpp:807 msgid "Serial port:" msgstr "Serieller Port:" @@ -5519,629 +6590,743 @@ msgstr "Serieller Port:" msgid "Service name" msgstr "Name des Dienstes" -#: src/slic3r/GUI/Tab.cpp:1824 src/slic3r/GUI/Tab.cpp:2025 -#: src/slic3r/GUI/Tab.cpp:3008 +#: src/slic3r/GUI/Tab.cpp:1802 src/slic3r/GUI/Tab.cpp:2046 +#: src/slic3r/GUI/Tab.cpp:3176 msgid "Set" msgstr "Setzen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1192 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1599 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 msgid "Set as a Separated Object" msgstr "Als separates Objekt festlegen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 msgid "Set as a Separated Objects" msgstr "Als separate Objekte festlegen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +msgid "Set extruder change for every" +msgstr "Extruderwechsel bei jedem" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1671 msgid "Set extruder for selected items" msgstr "Extruder für die gewählten Elemente wählen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 +msgid "Set extruder sequence" +msgstr "Extrudersequenz einstellen" + +#: src/slic3r/GUI/DoubleSlider.cpp:1532 +msgid "Set extruder sequence for the entire print" +msgstr "Extrudersequenz für den gesamten Druck einstellen" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "Extruder(werkzeug)sequenz einstellen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 msgid "Set lower thumb to current slider thumb" msgstr "Stelle den unteren Regler auf den aktuellen Schieberegler" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:245 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297 msgid "Set Mirror" msgstr "Spiegel setzen" -#: src/slic3r/GUI/Plater.cpp:3520 +#: src/slic3r/GUI/Plater.cpp:3944 msgid "Set number of instances" msgstr "Setze Anzahl der Kopien" -#: src/slic3r/GUI/Plater.cpp:4163 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:4756 +#, c-format msgid "Set numbers of copies to %d" msgstr "Setze Anzahl der Kopien auf %d" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:746 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781 msgid "Set Orientation" msgstr "Orientierung setzen" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:715 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750 msgid "Set Position" msgstr "Position setzen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3759 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Printable" msgstr "Setze Druckbar" -#: src/slic3r/GUI/Selection.cpp:1482 +#: src/slic3r/GUI/Selection.cpp:1475 msgid "Set Printable Instance" msgstr "Setze druckbare Kopie" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846 msgid "Set Scale" msgstr "Setze Skalierung" -#: src/libslic3r/PrintConfig.cpp:2228 +#: src/libslic3r/PrintConfig.cpp:2393 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:527 +#: src/slic3r/GUI/ConfigWizard.cpp:932 msgid "Set the shape of your printer's bed." msgstr "Stellen Sie die Konturen Ihres Druckerbettes ein." -#: src/libslic3r/PrintConfig.cpp:524 +#: src/libslic3r/PrintConfig.cpp:556 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 Slic3r die Extrusionsbreiten vom Durchmesser der Druckdüse ableiten (siehe die Hilfstexte für die Extrusionsbreite für Aussenschichten, Infill usw.). Falls als Prozentwert (z.B. 230%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet." +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:417 +#: src/libslic3r/PrintConfig.cpp:448 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 Aussenschichten 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." +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:831 +#: src/libslic3r/PrintConfig.cpp:878 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 dickere 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." +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:1689 +#: src/libslic3r/PrintConfig.cpp:1758 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 stabilen 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." +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:2019 +#: src/libslic3r/PrintConfig.cpp:2107 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 Aussenflä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." +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:963 +#: src/libslic3r/PrintConfig.cpp:1011 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. Dickere 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." +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:1350 +#: src/libslic3r/PrintConfig.cpp:1419 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 Aussenschichten 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." +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:1862 +#: src/libslic3r/PrintConfig.cpp:1948 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 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." +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." -#: src/libslic3r/PrintConfig.cpp:480 +#: src/libslic3r/PrintConfig.cpp:512 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." +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." -#: src/libslic3r/PrintConfig.cpp:65 +#: src/libslic3r/PrintConfig.cpp:81 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:469 +#: src/libslic3r/PrintConfig.cpp:501 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:3759 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Unprintable" msgstr "Setze Undruckbar" -#: src/slic3r/GUI/Selection.cpp:1482 +#: src/slic3r/GUI/Selection.cpp:1475 msgid "Set Unprintable Instance" msgstr "Setze undruckbare Kopie" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 msgid "Set upper thumb to current slider thumb" msgstr "Stelle den oberen Regler auf den aktuellen Schieberegler" -#: src/slic3r/GUI/BedShapeDialog.cpp:143 +#: 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/slic3r/GUI/BedShapeDialog.cpp:155 msgid "Settings" msgstr "Einstellungen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 msgid "Settings for height range" msgstr "Einstellungen für Höhenbereich" -#: src/slic3r/GUI/BedShapeDialog.cpp:60 +#: src/slic3r/GUI/ConfigManipulation.cpp:162 +msgid "Shall I adjust those settings for supports?" +msgstr "Soll ich diese Einstellungen für Stützen anpassen?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:89 +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 +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 +msgid "Shall I switch to rectilinear fill pattern?" +msgstr "Soll ich auf geradliniges Füllmuster wechseln?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:139 +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 msgid "Shape" msgstr "Form" -#: src/slic3r/GUI/GUI_Preview.cpp:246 +#: src/slic3r/GUI/GUI_Preview.cpp:256 msgid "Shells" msgstr "Konturhüllen" -#: src/slic3r/GUI/GUI_Preview.cpp:221 +#: src/slic3r/GUI/GLCanvas3D.cpp:249 +msgid "Shift + Left mouse button:" +msgstr "Gross + Linke Maustaste:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:255 +msgid "Shift + Right mouse button:" +msgstr "Gross + Rechte Maustaste:" + +#: src/slic3r/GUI/GUI_Preview.cpp:231 msgid "Show" msgstr "Anzeigen" -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show &Configuration Folder" -msgstr "Zeige Konfigurationsordner (&C)" +msgstr "Zeige &Konfigurationsordner" -#: src/slic3r/GUI/MainFrame.cpp:563 +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Show &labels" +msgstr "Anzeigen &Beschriftungen" + +#: src/slic3r/GUI/MainFrame.cpp:705 msgid "Show about dialog" msgstr "\"Über\"-Dialog anzeigen" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show advanced settings" msgstr "Ausführliche Einstellungen anzeigen" -#: src/slic3r/GUI/PrintHostDialogs.cpp:158 +#: src/slic3r/GUI/PrintHostDialogs.cpp:159 msgid "Show error message" msgstr "Fehlermeldungen anzeigen" -#: src/slic3r/GUI/Preferences.cpp:84 +#: src/slic3r/GUI/Preferences.cpp:95 msgid "Show incompatible print and filament presets" msgstr "Inkompatible Druck- und Filamenteinstellungen anzeigen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Show keyboard shortcuts list" msgstr "Liste der Tastaturkürzel anzeigen" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Show object/instance labels in 3D scene" +msgstr "Objekt-/Kopiebeschriftungen in der 3D-Szene anzeigen" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show simplified settings" msgstr "Vereinfachte Einstellungen anzeigen" -#: src/slic3r/GUI/MainFrame.cpp:557 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52 +msgid "Show supports" +msgstr "Stützen anzeigen" + +#: src/slic3r/GUI/MainFrame.cpp:699 msgid "Show system information" msgstr "Systeminformationen anzeigen" -#: src/slic3r/GUI/MainFrame.cpp:487 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "Show the 3D editing view" msgstr "Anzeigen des 3D Editiermodus" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Show the 3D slices preview" msgstr "Vorschau der 3D-Schnitte anzeigen" -#: src/slic3r/GUI/MainFrame.cpp:480 +#: src/slic3r/GUI/MainFrame.cpp:617 msgid "Show the filament settings" msgstr "Filamenteinstellungen anzeigen" -#: src/libslic3r/PrintConfig.cpp:2983 +#: src/libslic3r/PrintConfig.cpp:3372 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:2988 +#: src/libslic3r/PrintConfig.cpp:3377 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:566 +#: src/slic3r/GUI/MainFrame.cpp:708 msgid "Show the list of the keyboard shortcuts" msgstr "Liste der Tastaturkürzel anzeigen" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "Show the plater" msgstr "Druckplatte anzeigen" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "Show the print settings" msgstr "Druckeinstellungen anzeigen" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Show the printer settings" msgstr "Druckereinstellungen anzeigen" -#: src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:3366 msgid "Show this help." msgstr "Diese Hilfe zeigen." -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show user configuration folder (datadir)" -msgstr "Zeige User Konfiguration Ordner (datadir)" +msgstr "Zeige Benutzerkonfigurationsordner (datadir)" #: src/slic3r/GUI/KBShortcutsDialog.cpp:185 -msgid "Show/Hide (L)egend" -msgstr "Zeige/Verberge (L)egende" +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Einstellungsdialog für 3Dconnexion-Geräte ein-/ausblenden" -#: src/slic3r/GUI/GUI_App.cpp:674 src/slic3r/GUI/wxExtensions.cpp:2459 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +msgid "Show/Hide Legend" +msgstr "Zeige/Verberge Legende" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +msgid "Show/Hide object/instance labels" +msgstr "Objekt-/Kopiebeschriftungen ein-/ausblenden" + +#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:753 msgid "Simple" msgstr "Einfach" -#: src/slic3r/GUI/GUI_App.cpp:674 +#: src/slic3r/GUI/ConfigWizard.cpp:820 +msgid "Simple mode" +msgstr "Einfacher Modus" + +#: src/slic3r/GUI/GUI_App.cpp:813 msgid "Simple View Mode" msgstr "EInfacher Anzeigemodus" -#: src/slic3r/GUI/Tab.cpp:2231 src/slic3r/GUI/Tab.cpp:2239 +#: src/slic3r/GUI/Tab.cpp:2298 src/slic3r/GUI/Tab.cpp:2306 msgid "Single extruder MM setup" -msgstr "Einzelner Extruder MM Setup" +msgstr "Einzelextruder MM Setup" -#: src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1845 msgid "Single Extruder Multi Material" -msgstr "Einzelner Extruder mit Multi-Material" +msgstr "Einzelextruder mit Multi-Material" -#: src/slic3r/GUI/Tab.cpp:2023 -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: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:2240 +#: src/slic3r/GUI/Tab.cpp:2307 msgid "Single extruder multimaterial parameters" -msgstr "Einzelner Extruder Multimaterial Parameter" +msgstr "Einzelextruder Multimaterial Parameter" -#: src/slic3r/GUI/BedShapeDialog.cpp:72 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 src/slic3r/GUI/Plater.cpp:137 -#: src/slic3r/GUI/Tab.cpp:2257 +#: 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 msgid "Size" -msgstr "Grösse" +msgstr "Größe" -#: src/slic3r/GUI/Tab.cpp:1813 src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:1797 src/slic3r/GUI/Tab.cpp:2041 msgid "Size and coordinates" -msgstr "Grösse und Koordinaten" +msgstr "Größe und Koordinaten" -#: src/slic3r/GUI/BedShapeDialog.cpp:73 +#: src/slic3r/GUI/BedShapeDialog.cpp:78 msgid "Size in X and Y of the rectangular plate." -msgstr "Grösse der rechteckigen Platte in X und Y." +msgstr "Größe der rechteckigen Platte in X und Y." -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/slic3r/GUI/Tab.cpp:1050 -#: src/libslic3r/GCode/PreviewData.cpp:171 +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1111 +#: src/libslic3r/ExtrusionEntity.cpp:318 msgid "Skirt" msgstr "Schürze" -#: src/slic3r/GUI/Tab.cpp:1049 +#: src/slic3r/GUI/Tab.cpp:1110 msgid "Skirt and brim" msgstr "Schürze und Rand" -#: src/libslic3r/PrintConfig.cpp:1617 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "Skirt height" msgstr "Schürzenhöhe" -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Skirt Loops" msgstr "Schleifen für die Schürze" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1200 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1334 msgid "SLA gizmo keyboard shortcuts" msgstr "SLA Gizmo Tastaturkürzel" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1150 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1058 msgid "SLA gizmo turned off" msgstr "SLA Gizmo ausgeschaltet" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1115 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1017 msgid "SLA gizmo turned on" msgstr "SLA Gizmo eingeschaltet" -#: src/slic3r/GUI/Plater.cpp:684 src/slic3r/GUI/Preset.cpp:1277 +#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1524 msgid "SLA material" msgstr "SLA Material" -#: src/slic3r/GUI/Plater.cpp:683 src/slic3r/GUI/Preset.cpp:1276 +#: src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "SLA Material Profiles Selection" +msgstr "SLA Material Profile Auswahl" + +#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471 +msgid "SLA material type" +msgstr "SLA Materialtyp" + +#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "SLA Materials" +msgstr "SLA Materialien" + +#: src/slic3r/GUI/Preset.cpp:1523 msgid "SLA print" msgstr "SLA Druck" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2578 msgid "SLA print material notes" msgstr "SLA Druckmaterial-Anmerkungen" -#: src/slic3r/GUI/Plater.cpp:690 +#: src/slic3r/GUI/Plater.cpp:817 msgid "SLA print settings" msgstr "SLA Druckeinstellungen" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:997 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:996 msgid "SLA Support Points" msgstr "SLA Stützpunkte" -#: src/slic3r/GUI/GLCanvas3D.cpp:722 +#: 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/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/ConfigWizard.cpp:1530 +msgid "SLA Technology Printers" +msgstr "SLA Technologie Drucker" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Slab" msgstr "Slab" -#: src/libslic3r/PrintConfig.cpp:1268 +#: src/libslic3r/PrintConfig.cpp:1333 msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host." -msgstr "Slic3r kann G-Code Dateien auf einen Drucker-Host hochladen. Dieses Feld sollte den Typ des Hosts enthalten." +msgstr "PrusaSlicer kann G-Code Dateien auf einen Drucker-Host hochladen. Dieses Feld sollte den Typ des Hosts enthalten." -#: src/libslic3r/PrintConfig.cpp:89 +#: src/libslic3r/PrintConfig.cpp:105 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 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." +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:82 +#: 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 kann G-Code Dateien auf einen Drucker-Host hochladen. Dieses Feld sollte den Hostnamen, die IP-Adresse oder die URL der Drucker-Hostinstanz enthalten." +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/slic3r/GUI/ConfigSnapshotDialog.cpp:45 -msgid "slic3r version" -msgstr "Slic3r Version" - -#: src/libslic3r/PrintConfig.cpp:1234 +#: src/libslic3r/PrintConfig.cpp:1299 msgid "Slic3r will not scale speed down below this speed." -msgstr "Slic3r wird die Geschwindigkeit nicht unterhalb dieser Geschwindigkeit skalieren." +msgstr "PrusaSlicer wird die Geschwindigkeit nicht unterhalb dieser Geschwindigkeit skalieren." -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3359 msgid "Slice" msgstr "Slice" -#: src/slic3r/GUI/MainFrame.cpp:383 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Slice a file into a G-code" msgstr "Datei zu G-Code slicen" -#: src/slic3r/GUI/MainFrame.cpp:389 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Slice a file into a G-code, save as" msgstr "Datei zu G-Code slicen, speichern als" -#: src/libslic3r/PrintConfig.cpp:71 +#: src/libslic3r/PrintConfig.cpp:87 msgid "Slice gap closing radius" msgstr "Slice Lückenschlussradius" -#: src/slic3r/GUI/Plater.cpp:734 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3618 +#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3121 +#: src/slic3r/GUI/Plater.cpp:5110 msgid "Slice now" msgstr "Jetzt slicen" -#: src/libslic3r/PrintConfig.cpp:2944 +#: src/libslic3r/PrintConfig.cpp:3333 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:2965 +#: src/libslic3r/PrintConfig.cpp:3354 msgid "Slice the model and export toolpaths as G-code." msgstr "Modell slicen und Werkzeugwege als G-Code exportieren." -#: src/libslic3r/PrintConfig.cpp:2971 +#: src/libslic3r/PrintConfig.cpp:3360 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:193 +#: src/slic3r/GUI/Plater.cpp:216 msgid "Sliced Info" msgstr "Slice-Info" -#: src/slic3r/GUI/MainFrame.cpp:704 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3615 src/slic3r/GUI/Tab.cpp:1159 -#: src/slic3r/GUI/Tab.cpp:3436 +#: 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 msgid "Slicing" msgstr "Slice" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:91 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184 msgid "Slicing complete" -msgstr "Der Slice ist abgeschlossen" +msgstr "Slicing abgeschlossen" -#: src/libslic3r/SLAPrint.cpp:1459 +#: src/libslic3r/SLAPrint.cpp:760 msgid "Slicing done" -msgstr "Der Slice ist beendet" +msgstr "Slicing abgeschlossen" -#: src/slic3r/GUI/MainFrame.cpp:729 +#: src/slic3r/GUI/MainFrame.cpp:874 msgid "Slicing Done!" -msgstr "Der Slice ist beendet!" +msgstr "Slicing abgeschlossen!" -#: src/libslic3r/SLAPrint.cpp:759 +#: src/libslic3r/SLAPrintSteps.cpp:245 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/SLAPrint.cpp:55 +#: src/libslic3r/SLAPrintSteps.cpp:45 msgid "Slicing model" msgstr "Slice das Modell" -#: src/libslic3r/SLAPrint.cpp:59 +#: src/libslic3r/SLAPrintSteps.cpp:49 msgid "Slicing supports" msgstr "Slice Stützstrukturen" -#: src/libslic3r/PrintConfig.cpp:2249 +#: src/libslic3r/PrintConfig.cpp:2414 msgid "Slow" msgstr "Langsam" -#: src/libslic3r/PrintConfig.cpp:1635 +#: src/libslic3r/PrintConfig.cpp:1705 msgid "Slow down if layer print time is below" msgstr "Langsamer drucken wenn die Schichtdruckzeit geringer ist als" -#: src/libslic3r/PrintConfig.cpp:2250 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "Slow tilt" msgstr "Langsames Kippen" -#: src/libslic3r/PrintConfig.cpp:1646 +#: src/libslic3r/PrintConfig.cpp:1715 msgid "Small perimeters" -msgstr "Dünne Aussenschichten" +msgstr "Dünne Außenkonturen" -#: src/slic3r/GUI/GUI_App.cpp:697 +#: src/slic3r/GUI/GLCanvas3D.cpp:288 +msgid "Smooth" +msgstr "Glätten" + +#: src/slic3r/GUI/GLCanvas3D.cpp:258 +msgid "Smoothing" +msgstr "Glätten" + +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Snapshot name" msgstr "Name der Momentaufnahme" -#: src/slic3r/GUI/MainFrame.cpp:549 +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Software &Releases" msgstr "Software &Release" -#: src/slic3r/GUI/PresetHints.cpp:181 +#: src/slic3r/GUI/PresetHints.cpp:184 msgid "solid infill" -msgstr "Stabiles Infill" +msgstr "Massives Infill" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/PrintConfig.cpp:1687 -#: src/libslic3r/PrintConfig.cpp:1697 src/libslic3r/GCode/PreviewData.cpp:167 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767 msgid "Solid infill" -msgstr "Stabiles Infill" +msgstr "Massives Infill" -#: src/libslic3r/PrintConfig.cpp:1675 +#: src/libslic3r/PrintConfig.cpp:1744 msgid "Solid infill every" msgstr "Massives Infill alle" -#: src/libslic3r/PrintConfig.cpp:1667 +#: src/libslic3r/PrintConfig.cpp:1736 msgid "Solid infill extruder" msgstr "Massives Infill Extruder" -#: src/libslic3r/PrintConfig.cpp:1658 +#: src/libslic3r/PrintConfig.cpp:1727 msgid "Solid infill threshold area" msgstr "Massives Infill Flächen Schwellwert" -#: src/slic3r/GUI/Tab.cpp:1014 src/libslic3r/PrintConfig.cpp:1710 +#: src/slic3r/GUI/Tab.cpp:1065 src/libslic3r/PrintConfig.cpp:1780 msgid "Solid layers" -msgstr "Kompakte Schichten" +msgstr "Massive Schichten" -#: src/libslic3r/PrintConfig.cpp:711 +#: src/libslic3r/PrintConfig.cpp:754 msgid "Soluble material" msgstr "Lösliches Material" -#: src/libslic3r/PrintConfig.cpp:712 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Soluble material is most likely used for a soluble support." -msgstr "Lösliches Material wird meistens für lösliche Stützen verwendet." +msgstr "Lösliches Material wird meistens für Stützstrukturen verwendet." -#: src/libslic3r/PrintConfig.cpp:914 +#: src/libslic3r/PrintConfig.cpp:937 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:721 -msgid "Some objects are not visible when editing supports" -msgstr "Einige Objekte sind bei der Bearbeitung von Stützen nicht sichtbar" +#: src/slic3r/GUI/GLCanvas3D.cpp:688 +msgid "Some objects are not visible" +msgstr "Einige Objekte sind nicht sichtbar" -#: src/libslic3r/Print.cpp:1162 +#: src/libslic3r/Print.cpp:1226 msgid "Some objects are too close; your extruder will collide with them." -msgstr "Einige Objekte sind zu nahe; Ihr Extruder wird mit ihnen zusammenstossen." +msgstr "Einige Objekte sind zu nahe; Ihr Extruder wird mit ihnen zusammenstoßen." -#: src/libslic3r/Print.cpp:1177 +#: src/libslic3r/Print.cpp:1228 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:2548 +#: src/libslic3r/PrintConfig.cpp:2824 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:2086 +#: src/libslic3r/PrintConfig.cpp:2187 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:1897 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Spacing between interface lines. Set zero to get a solid interface." -msgstr "Abstand zwischen den Schnittstellenlinien. Auf Null stellen, um ein solides Interface zu erhalten." +msgstr "Abstand zwischen den Schnittstellenlinien. Auf null stellen, um ein massives Interface zu erhalten." -#: src/libslic3r/PrintConfig.cpp:1931 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "Spacing between support material lines." -msgstr "Abstand zwischen Stützmateriallinien." +msgstr "Abstand zwischen Stützstrukturlinien." -#: src/slic3r/GUI/GUI_ObjectList.cpp:71 src/slic3r/GUI/GUI_ObjectList.cpp:512 -#: src/slic3r/GUI/GUI_Preview.cpp:215 src/slic3r/GUI/Tab.cpp:1084 -#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:426 -#: src/libslic3r/PrintConfig.cpp:871 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1361 src/libslic3r/PrintConfig.cpp:1598 -#: src/libslic3r/PrintConfig.cpp:1647 src/libslic3r/PrintConfig.cpp:1698 -#: src/libslic3r/PrintConfig.cpp:2029 +#: 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 msgid "Speed" msgstr "Geschwindigkeit" -#: src/libslic3r/PrintConfig.cpp:1600 +#: 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:400 +#: src/libslic3r/GCode/PreviewData.cpp:351 msgid "Speed (mm/s)" msgstr "Geschwindigkeit (mm/s)" -#: src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:920 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." +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:1097 +#: src/slic3r/GUI/Tab.cpp:1158 msgid "Speed for non-print moves" msgstr "Geschwindigkeit für Bewegungen zwischen den Druckvorgängen" -#: src/libslic3r/PrintConfig.cpp:1362 +#: src/libslic3r/PrintConfig.cpp:1432 msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." -msgstr "Geschwindigkeit für Aussenschichten (Konturen, bzw. vertikale Hüllen). Für Automatik auf Null setzen." +msgstr "Geschwindigkeit für Außenkonturen (Konturen, bzw. vertikale Hüllen). Für Automatik auf null setzen." -#: src/slic3r/GUI/Tab.cpp:1085 +#: src/slic3r/GUI/Tab.cpp:1146 msgid "Speed for print moves" msgstr "Geschwindigkeit für Druckbewegungen" -#: src/libslic3r/PrintConfig.cpp:200 +#: src/libslic3r/PrintConfig.cpp:236 msgid "Speed for printing bridges." msgstr "Brückendruckgeschwindigkeit." -#: src/libslic3r/PrintConfig.cpp:1699 +#: src/libslic3r/PrintConfig.cpp:1769 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 stabile 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." +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:1906 +#: src/libslic3r/PrintConfig.cpp:1993 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:1940 +#: src/libslic3r/PrintConfig.cpp:2027 msgid "Speed for printing support material." -msgstr "Druckgeschwindigkeit des Stützmaterials." +msgstr "Druckgeschwindigkeit der Stützstrukturen." -#: src/libslic3r/PrintConfig.cpp:1000 +#: src/libslic3r/PrintConfig.cpp:1049 msgid "Speed for printing the internal fill. Set to zero for auto." -msgstr "Druckgeschwindigkeit für den Infill. Für Automatik auf Null setzen." +msgstr "Druckgeschwindigkeit für den Infill. Für Automatik auf null setzen." -#: src/libslic3r/PrintConfig.cpp:2030 +#: src/libslic3r/PrintConfig.cpp:2119 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 stabilen Schichten (betrifft nur die obersten Aussenschichten und nicht deren innenliegende stabilen 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 stabiles Infill angegeben werden. Für Automatik auf Null setzen." +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:2052 +#: src/libslic3r/PrintConfig.cpp:2153 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "Bewegungsgeschwindigkeit (zwischen weit entfernten Extrusionsorten)." -#: src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:659 msgid "Speed of the first cooling move" msgstr "Geschwindigkeit der ersten Kühlbewegung" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:678 msgid "Speed of the last cooling move" msgstr "Geschwindigkeit der letzten Kühlbewegung" -#: src/libslic3r/PrintConfig.cpp:585 +#: src/libslic3r/PrintConfig.cpp:616 msgid "Speed used at the very beginning of loading phase." msgstr "Geschwindigkeit, die zu Beginn der Ladephase verwendet wird." -#: src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:608 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:593 +#: src/libslic3r/PrintConfig.cpp:624 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:602 +#: src/libslic3r/PrintConfig.cpp:633 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/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/Mouse3DController.cpp:296 +msgid "Speed:" +msgstr "Geschwindigkeit:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Sphere" msgstr "Kugel" -#: src/libslic3r/PrintConfig.cpp:1717 +#: src/libslic3r/PrintConfig.cpp:1794 msgid "Spiral vase" msgstr "Spiralvasenmodus" -#: src/slic3r/GUI/Plater.cpp:2971 src/slic3r/GUI/Plater.cpp:2988 -#: src/slic3r/GUI/Plater.cpp:3008 src/libslic3r/PrintConfig.cpp:3082 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 +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 msgid "Split" msgstr "Trennen" -#: src/slic3r/GUI/Plater.cpp:2971 +#: src/slic3r/GUI/Plater.cpp:4019 msgid "Split the selected object" msgstr "Teile das gewählte Objekt" -#: src/slic3r/GUI/Plater.cpp:2966 src/slic3r/GUI/Plater.cpp:2988 +#: src/slic3r/GUI/Plater.cpp:4014 src/slic3r/GUI/Plater.cpp:4034 msgid "Split the selected object into individual objects" msgstr "Ausgewähltes Objekt in Einzelobjekte trennen" -#: src/slic3r/GUI/Plater.cpp:2968 src/slic3r/GUI/Plater.cpp:3008 +#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4048 msgid "Split the selected object into individual sub-parts" msgstr "Ausgewähltes Objekt in einzelne Unterteile trennen" -#: src/slic3r/GUI/GLCanvas3D.cpp:3490 +#: src/slic3r/GUI/GLCanvas3D.cpp:4550 msgid "Split to objects" msgstr "In Objekte trennen" -#: src/slic3r/GUI/Plater.cpp:2796 +#: src/slic3r/GUI/Plater.cpp:2981 msgid "Split to Objects" msgstr "In Objekte trennen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1110 +#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1487 msgid "Split to parts" msgstr "In Teile trennen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1904 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2274 msgid "Split to Parts" msgstr "In Teile trennen" -#: src/libslic3r/PrintConfig.cpp:799 +#: src/slic3r/GUI/ConfigWizard.cpp:289 +msgid "Standard" +msgstr "Standard" + +#: src/libslic3r/PrintConfig.cpp:846 msgid "Stars" msgstr "Sterne" -#: src/slic3r/GUI/MainFrame.cpp:376 +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "Start a new project" msgstr "Ein neues Projekt beginnen" @@ -6149,12 +7334,12 @@ msgstr "Ein neues Projekt beginnen" msgid "Start at height" msgstr "Starte auf Höhe" -#: src/slic3r/GUI/Tab.cpp:1564 src/slic3r/GUI/Tab.cpp:1949 -#: src/libslic3r/PrintConfig.cpp:1736 src/libslic3r/PrintConfig.cpp:1751 +#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1976 +#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828 msgid "Start G-code" msgstr "Start G-Code" -#: src/slic3r/GUI/MainFrame.cpp:403 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "Start new slicing process" msgstr "Neuen Slicing-Prozess starten" @@ -6162,24 +7347,24 @@ msgstr "Neuen Slicing-Prozess starten" msgid "Start printing after upload" msgstr "Beginne den Druckjob nach dem Hochladen" -#: src/slic3r/GUI/PrintHostDialogs.cpp:150 +#: src/slic3r/GUI/PrintHostDialogs.cpp:151 msgid "Status" msgstr "Status" -#: src/slic3r/GUI/FirmwareDialog.cpp:782 +#: src/slic3r/GUI/FirmwareDialog.cpp:820 msgid "Status:" msgstr "Status:" -#: src/slic3r/GUI/Tab.cpp:2158 +#: src/slic3r/GUI/Tab.cpp:2209 msgid "Stealth" msgstr "Stealth" -#: src/slic3r/GUI/Plater.cpp:1084 +#: src/slic3r/GUI/Plater.cpp:1291 msgid "stealth mode" msgstr "Stealth Modus" -#: src/slic3r/GUI/Plater.cpp:3545 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:4985 +#, c-format msgid "STL file exported to %s" msgstr "Die STL-Datei wurde exportiert zu %s" @@ -6187,699 +7372,914 @@ msgstr "Die STL-Datei wurde exportiert zu %s" msgid "Stop at height" msgstr "Stoppe auf Höhe" -#: src/slic3r/GUI/Tab.cpp:1716 src/slic3r/GUI/Tab.cpp:1901 +#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:1928 msgid "Success!" msgstr "Erfolg!" -#: src/slic3r/GUI/PresetHints.cpp:200 +#: src/slic3r/GUI/PresetHints.cpp:203 msgid "support" msgstr "Stützen" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2692 msgid "Support base diameter" -msgstr "Stützfuss Durchmesser" +msgstr "Stützfuß Durchmesser" -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "Support base height" -msgstr "Stützfuss Höhe" +msgstr "Stützfuß Höhe" -#: src/libslic3r/PrintConfig.cpp:2566 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "Support base safety distance" msgstr "Sicherheitsabstand der Stützbasis" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Support Blocker" msgstr "Stützblocker" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Support Enforcer" msgstr "Stützverstärker" -#: src/slic3r/GUI/Tab.cpp:3401 +#: src/slic3r/GUI/ConfigManipulation.cpp:163 +msgid "Support Generator" +msgstr "Stütz-Generator" + +#: src/slic3r/GUI/Tab.cpp:3608 msgid "Support head" msgstr "Stützkopf" -#: src/libslic3r/PrintConfig.cpp:2369 +#: src/libslic3r/PrintConfig.cpp:2620 msgid "Support head front diameter" msgstr "Durchmesser des Stützkopfes vorne" -#: src/libslic3r/PrintConfig.cpp:2378 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "Support head penetration" msgstr "Eindringtiefe des Stützkopfes" -#: src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2638 msgid "Support head width" msgstr "Stützkopfbreite" -#: src/slic3r/GUI/PresetHints.cpp:210 +#: src/slic3r/GUI/PresetHints.cpp:213 msgid "support interface" msgstr "Schnittstelle zu den Stützen" -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:70 -#: src/slic3r/GUI/GUI_ObjectList.cpp:511 src/slic3r/GUI/GUI_Preview.cpp:236 -#: src/slic3r/GUI/Tab.cpp:1059 src/slic3r/GUI/Tab.cpp:1060 -#: src/libslic3r/PrintConfig.cpp:334 src/libslic3r/PrintConfig.cpp:1432 -#: src/libslic3r/PrintConfig.cpp:1780 src/libslic3r/PrintConfig.cpp:1786 -#: src/libslic3r/PrintConfig.cpp:1794 src/libslic3r/PrintConfig.cpp:1806 -#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:1824 -#: src/libslic3r/PrintConfig.cpp:1839 src/libslic3r/PrintConfig.cpp:1860 -#: src/libslic3r/PrintConfig.cpp:1871 src/libslic3r/PrintConfig.cpp:1887 -#: src/libslic3r/PrintConfig.cpp:1896 src/libslic3r/PrintConfig.cpp:1905 -#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1930 -#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1939 -#: src/libslic3r/PrintConfig.cpp:1948 src/libslic3r/PrintConfig.cpp:1956 -#: src/libslic3r/PrintConfig.cpp:1970 src/libslic3r/GCode/PreviewData.cpp:172 +#: 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 msgid "Support material" -msgstr "Stützmaterial" +msgstr "Stützstrukturen" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/PrintConfig.cpp:1904 -#: src/libslic3r/GCode/PreviewData.cpp:173 +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/libslic3r/PrintConfig.cpp:1991 msgid "Support material interface" -msgstr "Schnittstelle zum Stützmaterial" +msgstr "Schnittstellenmaterial zu den Stützstrukturen" -#: src/libslic3r/PrintConfig.cpp:1957 +#: src/libslic3r/PrintConfig.cpp:2044 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 kein Stützmaterial 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 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)." -#: src/libslic3r/PrintConfig.cpp:1877 +#: src/libslic3r/PrintConfig.cpp:1964 msgid "Support material/raft interface extruder" -msgstr "Stützmaterial/Raft Schnittstellen Extruder" +msgstr "Stützstrukturen/Raft Schnittstellen Extruder" -#: src/libslic3r/PrintConfig.cpp:1851 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Support material/raft/skirt extruder" -msgstr "Stützmaterial/Raft/Schürzen Extruder" +msgstr "Stützstrukturen/Raft/Schürzen Extruder" -#: src/slic3r/GUI/Plater.cpp:423 src/libslic3r/PrintConfig.cpp:1815 -#: src/libslic3r/PrintConfig.cpp:2423 +#: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "Support on build plate only" -msgstr "Stützmaterial nur auf dem Druckbrett" +msgstr "Stützstrukturen nur auf dem Druckbrett" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:991 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888 msgid "Support parameter change" -msgstr "Stützmaterial Änderung" +msgstr "Stützparameter Änderung" -#: src/slic3r/GUI/Tab.cpp:3406 +#: src/slic3r/GUI/Tab.cpp:3613 msgid "Support pillar" msgstr "Stützpfeiler" -#: src/libslic3r/PrintConfig.cpp:2407 +#: src/libslic3r/PrintConfig.cpp:2658 msgid "Support pillar connection mode" msgstr "Stützpfeiler Verbindungsmodus" -#: src/libslic3r/PrintConfig.cpp:2397 +#: src/libslic3r/PrintConfig.cpp:2648 msgid "Support pillar diameter" msgstr "Durchmesser der Stützpfeiler" -#: src/libslic3r/PrintConfig.cpp:2499 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/libslic3r/PrintConfig.cpp:2764 msgid "Support points density" msgstr "Stützpunktdichte" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1196 msgid "Support points edit" msgstr "Stützpunkte editieren" -#: src/slic3r/GUI/GUI_ObjectList.cpp:78 src/slic3r/GUI/GUI_ObjectList.cpp:519 -#: src/slic3r/GUI/Plater.cpp:418 src/slic3r/GUI/Tab.cpp:3397 -#: src/slic3r/GUI/Tab.cpp:3398 src/libslic3r/PrintConfig.cpp:2363 -#: src/libslic3r/PrintConfig.cpp:2370 src/libslic3r/PrintConfig.cpp:2379 -#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2398 -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2431 -#: src/libslic3r/PrintConfig.cpp:2442 src/libslic3r/PrintConfig.cpp:2452 -#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2471 -#: src/libslic3r/PrintConfig.cpp:2480 src/libslic3r/PrintConfig.cpp:2490 -#: src/libslic3r/PrintConfig.cpp:2500 src/libslic3r/PrintConfig.cpp:2508 +#: 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 msgid "Supports" msgstr "Stützen" -#: src/slic3r/GUI/Plater.cpp:1018 +#: src/slic3r/GUI/Plater.cpp:1194 msgid "supports and pad" msgstr "Stützen und Grundschicht" -#: src/libslic3r/PrintConfig.cpp:1043 +#: src/libslic3r/PrintConfig.cpp:1092 msgid "Supports remaining times" msgstr "Unterstützt Restzeit" -#: src/libslic3r/PrintConfig.cpp:1053 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Supports stealth mode" msgstr "Unterstützt Stealth Modus" -#: src/slic3r/GUI/Preferences.cpp:76 +#: 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/Preferences.cpp:87 msgid "Suppress \" - default - \" presets" msgstr "\"Standard\"-Einstellungen unterdrücken" -#: src/slic3r/GUI/Preferences.cpp:78 +#: src/slic3r/GUI/Preferences.cpp:89 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:677 +#: src/slic3r/GUI/MainFrame.cpp:826 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +#: src/slic3r/GUI/DoubleSlider.cpp:1144 +msgid "Switch code to Change extruder" +msgstr "Code umschalten auf Extruder wechseln" + +#: src/slic3r/GUI/DoubleSlider.cpp:1179 +msgid "Switch code to Color change (%1%) for:" +msgstr "Umschalten des Codes auf Farbwechsel (%1%) für:" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Switch to 3D" msgstr "Zeige 3D" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1376 msgid "Switch to editing mode" msgstr "Zum Bearbeitungsmodus umschalten" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Switch to Preview" msgstr "Wechseln zur Vorschau" -#: src/slic3r/GUI/wxExtensions.cpp:2412 -#, possible-c-format +#: src/slic3r/GUI/wxExtensions.cpp:703 +#, c-format msgid "Switch to the %s mode" msgstr "Wechseln zum %s Modus" -#: src/slic3r/GUI/GUI_App.cpp:752 -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/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/WipeTowerDialog.cpp:327 -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/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?" -#: src/libslic3r/PrintConfig.cpp:1949 +#: src/slic3r/GUI/Tab.cpp:1014 +msgid "symbolic profile name" +msgstr "symbolischer Profilname" + +#: src/libslic3r/PrintConfig.cpp:2036 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:1947 +#: src/libslic3r/PrintConfig.cpp:2034 msgid "Synchronize with object layers" msgstr "Mit Objektschichten synchronisieren" -#: src/slic3r/GUI/MainFrame.cpp:557 +#: src/slic3r/GUI/MainFrame.cpp:699 msgid "System &Info" msgstr "System&informationen" -#: src/slic3r/GUI/SysInfoDialog.cpp:44 +#: src/slic3r/GUI/SysInfoDialog.cpp:78 msgid "System Information" msgstr "Systeminformationen" -#: src/slic3r/GUI/Preset.cpp:930 src/slic3r/GUI/Preset.cpp:970 -#: src/slic3r/GUI/Preset.cpp:1035 src/slic3r/GUI/Preset.cpp:1067 -#: src/slic3r/GUI/PresetBundle.cpp:1488 src/slic3r/GUI/PresetBundle.cpp:1553 +#: 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 msgid "System presets" msgstr "Systemvoreinstellungen" -#: src/slic3r/GUI/GUI_App.cpp:662 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Take Configuration &Snapshot" msgstr "Erfa&ssen einer Konfigurations-Momentaufnahme" -#: src/slic3r/GUI/GUI_App.cpp:697 +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Taking configuration snapshot" msgstr "Ich erfasse eine Momentaufnahme der Konfiguration" -#: src/libslic3r/PrintConfig.cpp:1980 +#: src/slic3r/GUI/Tab.cpp:1433 src/libslic3r/PrintConfig.cpp:2067 msgid "Temperature" msgstr "Temperatur" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1804 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:1726 +#: src/libslic3r/PrintConfig.cpp:1803 msgid "Temperature variation" msgstr "Temperaturen" -#: src/slic3r/GUI/ConfigWizard.cpp:592 +#: src/slic3r/GUI/ConfigWizard.cpp:1017 msgid "Temperatures" msgstr "Temperaturen" -#: src/slic3r/GUI/Tab.cpp:1700 src/slic3r/GUI/Tab.cpp:1888 +#: src/slic3r/GUI/Tab.cpp:1677 src/slic3r/GUI/Tab.cpp:1915 msgid "Test" msgstr "Test" -#: src/slic3r/GUI/BedShapeDialog.cpp:171 +#: src/slic3r/GUI/BedShapeDialog.cpp:172 msgid "Texture" msgstr "Textur" -#: src/slic3r/GUI/FirmwareDialog.cpp:530 -#, possible-c-format +#: src/slic3r/GUI/ConfigManipulation.cpp:208 +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 msgid "The %s device could not have been found" msgstr "Das %s-Gerät konnte nicht gefunden werden" -#: src/slic3r/GUI/FirmwareDialog.cpp:417 -#, 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/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...." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 -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/slic3r/GUI/Tab.cpp:976 +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/libslic3r/PrintConfig.cpp:2462 +#: 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/libslic3r/PrintConfig.cpp:2726 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:670 +#: src/libslic3r/SLAPrint.cpp:631 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:457 +#: src/libslic3r/PrintConfig.cpp:489 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 Aussenschicht- und Infill-Extruder, aber nicht die Angabe des Extruders für die Stützen." +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:955 +#: src/libslic3r/PrintConfig.cpp:1003 msgid "The extruder to use when printing infill." msgstr "Extruder der beim Infill benutzt wird." -#: src/libslic3r/PrintConfig.cpp:1341 +#: src/libslic3r/PrintConfig.cpp:1410 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:1669 +#: src/libslic3r/PrintConfig.cpp:1738 msgid "The extruder to use when printing solid infill." -msgstr "Der Extruder der beim Drucken von solidem Infill benutzt werden soll." +msgstr "Der Extruder der beim Drucken von massivem Infill benutzt werden soll." -#: src/libslic3r/PrintConfig.cpp:1879 +#: src/libslic3r/PrintConfig.cpp:1966 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 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." +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." -#: src/libslic3r/PrintConfig.cpp:1853 +#: src/libslic3r/PrintConfig.cpp:1939 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ützmaterial, 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ützstrukturen, 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:695 +#: src/libslic3r/PrintConfig.cpp:727 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:3105 +#: src/libslic3r/PrintConfig.cpp:3494 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:1054 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "The firmware supports stealth mode" msgstr "Die Firmware unterstützt den Stealth Modus" -#: src/libslic3r/PrintConfig.cpp:351 +#: src/libslic3r/PrintConfig.cpp:120 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:2726 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2813 src/slic3r/GUI/Tab.cpp:3279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3820 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3457 msgid "the following characters are not allowed:" msgstr "die folgenden Zeichen sind nicht erlaubt:" -#: src/slic3r/GUI/Tab.cpp:3311 +#: src/slic3r/GUI/ConfigWizard.cpp:1830 +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 +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 msgid "the following suffix is not allowed:" msgstr "das folgenden Suffix ist nicht erlaubt:" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2871 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:2453 +#: src/libslic3r/PrintConfig.cpp:2704 msgid "The height of the pillar base cone" msgstr "Die Höhe des Pfeilergrundkegels" -#: src/libslic3r/PrintConfig.cpp:2481 -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/slic3r/GUI/DoubleSlider.cpp:1922 +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/libslic3r/PrintConfig.cpp:2472 +#: src/slic3r/GUI/DoubleSlider.cpp:1900 src/slic3r/GUI/DoubleSlider.cpp:1916 +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 +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 +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 msgid "The max length of a bridge" msgstr "Die maximale Länge einer Überbrückung" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2714 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:2176 +#: src/libslic3r/PrintConfig.cpp:185 +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 +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 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:1433 +#: src/libslic3r/PrintConfig.cpp:1503 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:2259 -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 Bettfläche.\nWenn der Druckbereich den angegebenen Wert überschreitet,\nwird eine langsame Verkippung verwendet, andernfalls - eine schnelle Verkippung" +#: 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/slic3r/GUI/GUI_App.cpp:831 +#: 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/libslic3r/PrintConfig.cpp:1768 +#: src/libslic3r/PrintConfig.cpp:1846 msgid "The printer multiplexes filaments into a single hot end." msgstr "Der Drucker multiplext mehrere Filamente in einem Hotend." -#: src/slic3r/GUI/BedShapeDialog.cpp:342 +#: 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 "Die ausgewählte 3mf-Datei wurde mit einer neueren Version von %1% gespeichert und ist nicht kompatibel." + +#: 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 "Die ausgewählte amf-Datei wurde mit einer neueren Version von %1% gespeichert und ist nicht kompatibel." + +#: src/slic3r/GUI/BedShapeDialog.cpp:513 msgid "The selected file contains no geometry." msgstr "Die ausgewählte Datei enthält keine Geometrie." -#: src/slic3r/GUI/BedShapeDialog.cpp:346 +#: src/slic3r/GUI/BedShapeDialog.cpp:517 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:2271 +#: src/slic3r/GUI/Plater.cpp:2970 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:1737 src/slic3r/GUI/Plater.cpp:2279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2270 src/slic3r/GUI/Plater.cpp:2978 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:410 -msgid "The selected project is no more available" -msgstr "Das ausgewählte Projekt ist nicht mehr verfügbar" +#: 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/libslic3r/PrintConfig.cpp:2570 +#: 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/libslic3r/PrintConfig.cpp:2846 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 Bettebene. 90 Grad bedeutet gerade Wände." +msgstr "Die Neigung der Grundschichtwand in Bezug auf die Druckbettebene. 90 Grad bedeutet gerade Wände." -#: src/libslic3r/PrintConfig.cpp:1544 +#: src/libslic3r/PrintConfig.cpp:1614 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." +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:1536 +#: src/libslic3r/PrintConfig.cpp:1606 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "Die Einzugsgeschwindigkeit (sie betrifft nur den Extruderantrieb)." -#: src/libslic3r/Print.cpp:1187 +#: 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:1189 +#: src/libslic3r/Print.cpp:1244 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:2900 +#: src/slic3r/GUI/Tab.cpp:3068 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:3287 +#: src/slic3r/GUI/Tab.cpp:3465 msgid "The supplied name is not available." msgstr "Der angegebene Name ist nicht verfügbar." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2725 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2812 src/slic3r/GUI/Tab.cpp:3278 -#: src/slic3r/GUI/Tab.cpp:3282 +#: 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 msgid "The supplied name is not valid;" msgstr "Der angegebene Name ist ungültig;" -#: src/libslic3r/Print.cpp:1268 +#: src/libslic3r/Print.cpp:1222 msgid "The supplied settings will cause an empty print." msgstr "Die vorgenommenen Einstellungen führen zu einem leeren Druck." -#: src/libslic3r/PrintConfig.cpp:2524 +#: src/libslic3r/PrintConfig.cpp:2789 msgid "The thickness of the pad and its optional cavity walls." -msgstr "Die Dicke der Grundschicht und seine optionalen Hohlraumwände." +msgstr "Die Stärke der Grundschicht und seine optionalen Hohlraumwände." -#: src/libslic3r/PrintConfig.cpp:1825 +#: src/libslic3r/PrintConfig.cpp:1911 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 Slic3r auch verhindern, dass Bridge-Flow und -Geschwindigkeit für die erste Objektschicht verwendet werden." +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:2429 -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/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/libslic3r/Print.cpp:1306 +#: src/libslic3r/Print.cpp:1268 +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/libslic3r/Print.cpp:1400 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)." +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:1200 +#: src/libslic3r/Print.cpp:1270 +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:1202 +#: src/libslic3r/Print.cpp:1264 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:1225 +#: src/libslic3r/Print.cpp:1293 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 Raft-Schichten gedruckt werden" +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:1227 +#: src/libslic3r/Print.cpp:1295 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:1229 +#: src/libslic3r/Print.cpp:1297 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:1223 +#: src/libslic3r/Print.cpp:1291 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:1155 +#: src/libslic3r/Print.cpp:1257 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:1258 -msgid "The Wipe tower is only supported if all objects have the same layer height profile" -msgstr "Der Wischturm wird nur für mehrere Objekte unterstützt, wenn diese das gleiche Schichthöhenprofil haben" +#: src/libslic3r/Print.cpp:1339 +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/slic3r/GUI/UpdateDialogs.cpp:127 -#, possible-c-format +#: src/libslic3r/SLAPrintSteps.cpp:621 +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: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: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/UpdateDialogs.cpp:225 +#, c-format msgid "This %s version: %s" msgstr "Diese %s Version: %s" -#: src/libslic3r/PrintConfig.cpp:140 +#: 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/libslic3r/PrintConfig.cpp:165 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 Slic3r-Einstellungen verwenden können, so dass Sie einen \"M109 S[first_layer_temperature]\"-Befehl an beliebiger Stelle platzieren können." +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:2057 -msgid "This custom code is inserted at every extruder change. If you don't leave this empty, you are expected to take care of the toolchange yourself - PrusaSlicer will not output any other G-code to change the filament. You can use placeholder variables for all Slic3r settings as well as [previous_extruder] and [next_extruder], so e.g. the standard toolchange command can be scripted as T[next_extruder]." -msgstr "Dieser benutzerdefinierte Code wird bei jedem Extruderwechsel eingefügt. Wenn Sie dieses Feld nicht leer lassen, müssen Sie sich selbst um den Werkzeugwechsel kümmern - PrusaSlicer gibt keinen anderen G-Code zum Wechseln des Filaments aus. Sie können Platzhaltervariablen für alle Slic3r-Einstellungen sowie [previous_extruder] und [next_extruder] verwenden, so dass z.B. der Standard-Toolchange-Befehl als T[next_extruder] skriptiert werden kann." - -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1081 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:129 +#: src/libslic3r/PrintConfig.cpp:154 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 Slic3r-Einstellungen sowie [layer_num] und [layer_z] verwenden können." +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:2057 +#: src/libslic3r/PrintConfig.cpp:2094 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:380 +#: src/libslic3r/PrintConfig.cpp:396 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:370 +#: src/libslic3r/PrintConfig.cpp:386 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:1193 src/libslic3r/PrintConfig.cpp:1204 +#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269 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:1183 +#: src/libslic3r/PrintConfig.cpp:1248 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:2061 +#: src/libslic3r/PrintConfig.cpp:2162 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:2075 +#: src/libslic3r/PrintConfig.cpp:2176 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 Slic3r angegebenen Filamentdurchmesser zu benutzen. Dies wird nur von neueren Marlin-Versionen unterstützt." +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:2848 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3972 msgid "This extruder will be set for selected items" msgstr "Dieser Extruder wird den gewählten Elementen zugeordnet" -#: src/libslic3r/PrintConfig.cpp:188 +#: src/libslic3r/PrintConfig.cpp:224 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:514 +#: src/libslic3r/PrintConfig.cpp:546 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üllendicken zu erhalten. Die üblichen Werte bewegen sich zwischen 0,9 und 1,1. Falls Sie grössere Anpassungen eingeben müssen, kontrollieren Sie auch den Filamentdurchmesser und die E-Schritte in Ihrer Firmware." +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:178 +#: src/libslic3r/PrintConfig.cpp:214 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:944 +#: src/libslic3r/PrintConfig.cpp:992 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 dickere Infill-Schichten gedruckt werden, während gleichzeitig dünne Aussenschichten und damit die Genauigkeit erhalten bleiben." +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:1677 +#: src/libslic3r/PrintConfig.cpp:1746 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 stabile Schicht nach einer vorgegebenen Anzahl von Schichten. Null deaktiviert diese Einstellung. Sie können jeden Wert eingeben (z.B. 9999); Slic3r wird automatisch die grösstmögliche Anzahl von Schichten wählen, die in Abhängigkeit von Düsendurchmesser und Schichthöhe kombiniert werden können." +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:1718 +#: 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 Aussenschicht, keinen Infill, keine stabilen 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." +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/slic3r/GUI/Plater.cpp:1712 -msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?\n" -msgstr "Diese Datei kann nicht im einfachen Modus geladen werden. Möchten Sie in den fortgeschrittenen Modus wechseln?\n" +#: src/slic3r/GUI/Plater.cpp:2367 +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:1658 -msgid "This file contains several objects positioned at multiple heights. Instead of considering them as multiple objects, should I consider\nthis file as a single object having multiple parts?\n" -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?\n" +#: 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 "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:313 -#, 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/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:278 +#: src/libslic3r/PrintConfig.cpp:314 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:448 +#: src/slic3r/GUI/Plater.cpp:536 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:1468 +#: src/libslic3r/PrintConfig.cpp:1538 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:2093 +#: src/libslic3r/PrintConfig.cpp:2194 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:921 +#: src/slic3r/GUI/Tab.cpp:953 msgid "This is a default preset." msgstr "Dies ist eine Standard-Voreinstellung." -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2766 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:2528 +#: src/slic3r/GUI/Tab.cpp:2338 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:923 +#: src/slic3r/GUI/Tab.cpp:955 msgid "This is a system preset." msgstr "Dies ist eine Systemvoreinstellung." -#: src/libslic3r/PrintConfig.cpp:491 src/libslic3r/PrintConfig.cpp:551 +#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583 msgid "This is only used in the Slic3r interface as a visual help." -msgstr "Dies wird nur als visuelles Hilfsmittel in der Slic3r-Benutzeroberfläche verwendet." +msgstr "Dies wird nur als visuelles Hilfsmittel in der PrusaSlicer-Benutzeroberfläche verwendet." -#: src/libslic3r/PrintConfig.cpp:300 +#: src/libslic3r/PrintConfig.cpp:336 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 (Aussenschichten/Infill) verwendet wurden. Setzen Sie dies auf Null, um ein Zurückstellen der Beschleunigungswerte zu deaktivieren." +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:158 +#: src/libslic3r/PrintConfig.cpp:194 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." +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:813 +#: src/libslic3r/PrintConfig.cpp:860 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." +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:934 +#: src/libslic3r/PrintConfig.cpp:982 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 Infill zu deaktivieren." +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:1331 +#: 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 Aussenschichten 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 Aussenschichten zu deaktivieren." +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:1262 +#: src/libslic3r/PrintConfig.cpp:1327 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:1162 +#: src/libslic3r/PrintConfig.cpp:1227 #, no-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:1225 +#: src/libslic3r/PrintConfig.cpp:1290 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/PrintConfig.cpp:2139 +#: 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 "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 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:643 -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/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/libslic3r/PrintConfig.cpp:1372 +#: src/libslic3r/PrintConfig.cpp:1442 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 Aussenschichten, die für jede Schicht erzeugt werden. Slic3r kann diese Zahl automatisch vergrössern, wenn es schräge Oberflächen erkennt, die sich mit einer höheren Zahl von Aussenschichten besser drucken lassen, wenn die \"Zusätzliche Aussenschichten falls notwendig\" Option aktiviert ist." +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:1287 +#: src/libslic3r/PrintConfig.cpp:1356 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 ausserhalb dieser Schürze." +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:980 +#: src/libslic3r/PrintConfig.cpp:1029 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 internes Stützmaterial). 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 interne Stützstruktur). Falls aktiviert, kann dies die Erstellung des G-Codes wegen zusätzlichen Kontrollschritten verlangsamen." -#: src/libslic3r/PrintConfig.cpp:973 +#: src/libslic3r/PrintConfig.cpp:1022 msgid "This option will switch the print order of perimeters and infill, making the latter first." -msgstr "Diese Einstellungen kehrt die Druckreihenfolge von Aussenschichten und Infill um, sodass der Infill zuerst gedruckt wird." +msgstr "Diese Einstellungen kehrt die Druckreihenfolge von Außenkonturen und Infill um, sodass der Infill zuerst gedruckt wird." -#: src/libslic3r/PrintConfig.cpp:427 +#: src/libslic3r/PrintConfig.cpp:459 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 äusseren (sichtbaren) Aussenschichten aus. Als Prozentwert eingegeben (z.B. 80%), wird sie ausgehend von der obigen Geschwindigkeitseinstellung für Aussenschichten berechnet. Für die automatische Berechnung auf Null setzen." +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:1648 +#: src/libslic3r/PrintConfig.cpp:1717 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 Aussenschichten mit einem Radius <= 6,5 mm (üblicherweise Bohrungen) aus. Als Prozentwert eingegeben (z.B. 80%), wird sie ausgehend von der obigen Geschwindigkeitseinstellung für Aussenschichten berechnet. Für eine automatische Berechnung setzen Sie dies auf Null." +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:989 +#: src/libslic3r/PrintConfig.cpp:1038 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 Aussenschichten 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 Aussenschicht ausgerechnet." +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." -#: src/libslic3r/PrintConfig.cpp:57 +#: 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 "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." +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:1153 +#: src/libslic3r/PrintConfig.cpp:1218 msgid "This setting represents the maximum speed of your fan." msgstr "Diese Einstellung bestimmt die maximale Geschwindigkeit Ihres Lüfters." -#: src/libslic3r/PrintConfig.cpp:1216 +#: src/libslic3r/PrintConfig.cpp:1281 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:1801 +#: src/libslic3r/PrintConfig.cpp:1829 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:1786 +#: src/libslic3r/PrintConfig.cpp:1814 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:664 +#: src/libslic3r/PrintConfig.cpp:695 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:2185 +#: src/libslic3r/PrintConfig.cpp:2286 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:2132 +#: src/libslic3r/PrintConfig.cpp:2208 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:118 -#, 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.\n" -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.\n" +#: 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." -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2458 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." +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:1994 +#: src/libslic3r/PrintConfig.cpp:2081 msgid "Threads" msgstr "Threads" -#: src/libslic3r/PrintConfig.cpp:1995 +#: src/libslic3r/PrintConfig.cpp:2082 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:2052 +#: src/slic3r/GUI/Tab.cpp:2093 msgid "Tilt" msgstr "Kippen" -#: src/slic3r/GUI/Tab.cpp:2053 +#: src/slic3r/GUI/Tab.cpp:2094 msgid "Tilt time" msgstr "Kippzeit" @@ -6887,148 +8287,179 @@ msgstr "Kippzeit" msgid "Time" msgstr "Zeit" -#: src/libslic3r/PrintConfig.cpp:655 +#: src/libslic3r/PrintConfig.cpp:687 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) einen anderen Filament lädt. Diese Zeit wird vom G-Code Zeitschätzer zur Gesamtdruckzeit addiert." +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:670 +#: src/libslic3r/PrintConfig.cpp:702 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:2242 +#: src/libslic3r/PrintConfig.cpp:2407 msgid "Time of the fast tilt" msgstr "Dauer des schnellen Kippens" -#: src/libslic3r/PrintConfig.cpp:2251 +#: src/libslic3r/PrintConfig.cpp:2416 msgid "Time of the slow tilt" msgstr "Dauer des langsamen Kippens" -#: src/libslic3r/PrintConfig.cpp:610 +#: src/libslic3r/PrintConfig.cpp:641 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össe brauchen." +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:916 +#: src/slic3r/GUI/Tab.cpp:966 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:2966 +#: src/slic3r/GUI/Plater.cpp:4014 msgid "To objects" msgstr "Zu Objekten" -#: src/slic3r/GUI/Plater.cpp:2968 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "To parts" msgstr "Zu Teilen" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:212 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:1756 +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 msgid "Toggle %c axis mirroring" msgstr "Umschalten der Spiegelung der %c-Achse" -#: src/libslic3r/Zipper.cpp:37 +#: src/libslic3r/Zipper.cpp:34 msgid "too many files" msgstr "zu viele Dateien" -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:315 -#: src/slic3r/GUI/GUI_Preview.cpp:481 src/slic3r/GUI/GUI_Preview.cpp:537 -#: src/slic3r/GUI/GUI_Preview.cpp:713 src/libslic3r/GCode/PreviewData.cpp:404 +#: src/libslic3r/SLAPrintSteps.cpp:190 +msgid "Too much 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 msgid "Tool" msgstr "Werkzeug" -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" msgstr "Werkzeug #" -#: src/slic3r/GUI/Tab.cpp:1973 src/libslic3r/PrintConfig.cpp:2006 +#: src/slic3r/GUI/Tab.cpp:2000 src/libslic3r/PrintConfig.cpp:2093 msgid "Tool change G-code" msgstr "G-Code für Werkzeugwechsel" -#: src/slic3r/GUI/Tab.cpp:1530 +#: src/slic3r/GUI/Tab.cpp:1491 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 -#: src/slic3r/GUI/MainFrame.cpp:522 +#. 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 msgid "Top" msgstr "Decke" -#: src/libslic3r/PrintConfig.cpp:388 +#: src/slic3r/GUI/PresetHints.cpp:304 +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 msgid "Top fill pattern" msgstr "Deckenfüllmuster" -#: src/slic3r/GUI/PresetHints.cpp:189 +#: src/slic3r/GUI/PresetHints.cpp:323 +msgid "Top is open." +msgstr "Oben ist offen." + +#: src/slic3r/GUI/PresetHints.cpp:317 +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 msgid "top solid infill" -msgstr "Oberes stabiles Infill" +msgstr "Oberes massives Infill" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/PrintConfig.cpp:2017 -#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/GCode/PreviewData.cpp:168 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117 msgid "Top solid infill" -msgstr "Oberes stabiles Infill" +msgstr "Oberes massives Infill" -#: src/libslic3r/PrintConfig.cpp:2046 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Top solid layers" -msgstr "Obere stabile Schichten" +msgstr "Obere massive Schichten" -#: src/slic3r/GUI/MainFrame.cpp:522 +#: src/slic3r/GUI/MainFrame.cpp:662 msgid "Top View" msgstr "Ansicht von oben" -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +#: src/slic3r/GUI/WipeTowerDialog.cpp:285 msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded." msgstr "Das gesamte Reinigungsvolumen wird durch die Addition folgender zwei Werte berechnet, je nachdem welche Werkzeuge geladen/entladen sind." -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 msgid "Total rammed volume" msgstr "Gesamtes Rammvolumen" -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" msgstr "Gesamte Rammdauer" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:252 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 msgid "Translate" msgstr "Übersetzen" -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/PrintConfig.cpp:2051 +#: src/slic3r/GUI/Mouse3DController.cpp:300 +#: src/slic3r/GUI/Mouse3DController.cpp:317 +msgid "Translation" +msgstr "Übersetzung" + +#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152 msgid "Travel" msgstr "Eilgang" -#: src/libslic3r/PrintConfig.cpp:798 +#: src/libslic3r/PrintConfig.cpp:845 msgid "Triangles" msgstr "Dreiecke" -#: src/libslic3r/PrintConfig.cpp:3059 +#: src/libslic3r/PrintConfig.cpp:3448 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:1397 +#: src/libslic3r/PrintConfig.cpp:1467 msgid "Type of the printer." msgstr "Druckertyp." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2549 +#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3553 msgid "Type:" msgstr "Typ:" -#: src/libslic3r/Zipper.cpp:35 +#: src/slic3r/GUI/Plater.cpp:3428 +msgid "Unable to reload:" +msgstr "Kann nicht nachgeladen werden:" + +#: src/libslic3r/Zipper.cpp:32 msgid "undefined error" msgstr "unbekannter Fehler" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3609 -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/MainFrame.cpp:581 msgid "Undo" msgstr "Undo" -#: src/slic3r/GUI/GLCanvas3D.cpp:3497 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 +#, 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:3479 +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 msgid "Undo History" msgstr "Undo Verlauf" -#: src/libslic3r/Zipper.cpp:59 +#: src/libslic3r/Zipper.cpp:56 msgid "unexpected decompressed size" msgstr "unerwartete dekomprimierte Größe" @@ -7036,96 +8467,111 @@ msgstr "unerwartete dekomprimierte Größe" msgid "Unknown" msgstr "Unbekannt" -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 +#: 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 msgid "Unknown error occured" msgstr "Unbekannter Fehler aufgetreten" -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 msgid "unloaded" msgstr "entladen wird" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:623 msgid "Unloading speed" msgstr "Entladegeschwindigkeit" -#: src/libslic3r/PrintConfig.cpp:600 +#: src/libslic3r/PrintConfig.cpp:632 msgid "Unloading speed at the start" msgstr "Entladegeschwindigkeit zu Beginn" -#: src/slic3r/GUI/Tab.cpp:3069 +#: src/slic3r/GUI/Tab.cpp:3256 msgid "UNLOCKED LOCK" msgstr "OFFENES SCHLOSS" -#: src/slic3r/GUI/Tab.cpp:3362 -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: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:3377 -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: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/GUI_Preview.cpp:245 +#: 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:2785 +#: src/slic3r/GUI/Tab.cpp:2947 msgid "Unsaved Changes" msgstr "Nicht abgespeicherte Änderungen" -#: src/slic3r/GUI/GUI_App.cpp:790 +#: src/slic3r/GUI/GUI_App.cpp:935 msgid "Unsaved Presets" msgstr "Nicht abgespeicherte Voreinstellungen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -msgid "Unselect gizmo / Clear selection" -msgstr "Gizmo abwählen / Auswahl löschen" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Unselect gizmo or clear selection" +msgstr "Gizmo abwählen oder Auswahl löschen" -#: src/libslic3r/Zipper.cpp:63 +#: src/libslic3r/Zipper.cpp:60 msgid "unsupported central directory size" msgstr "nicht unterstützte zentrale Verzeichnisgröße" -#: src/libslic3r/Zipper.cpp:43 +#: src/libslic3r/Zipper.cpp:40 msgid "unsupported encryption" msgstr "nicht unterstützte Verschlüsselung" -#: src/libslic3r/Zipper.cpp:45 +#: src/libslic3r/Zipper.cpp:42 msgid "unsupported feature" msgstr "nicht unterstützte Funktion" -#: src/libslic3r/Zipper.cpp:41 +#: src/libslic3r/Zipper.cpp:38 msgid "unsupported method" msgstr "nicht unterstützte Methode" -#: src/libslic3r/Zipper.cpp:53 +#: src/libslic3r/Zipper.cpp:50 msgid "unsupported multidisk archive" msgstr "nicht unterstütztes Multidisk-Archiv" -#: src/slic3r/GUI/GUI_App.cpp:305 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:292 msgid "Unsupported OpenGL version" msgstr "Nicht unterstützte OpenGL Version" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2414 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3420 msgid "Unsupported selection" msgstr "Nicht unterstützte Auswahl" -#: src/libslic3r/GCode/PreviewData.cpp:495 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:955 +#, c-format msgid "up to %.2f mm" msgstr "bis zu %.2f mm" -#: src/slic3r/GUI/UpdateDialogs.cpp:30 +#: src/slic3r/GUI/UpdateDialogs.cpp:38 msgid "Update available" msgstr "Ein Update ist verfügbar" -#: src/slic3r/GUI/ConfigWizard.cpp:419 src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:779 src/slic3r/GUI/Preferences.cpp:80 msgid "Update built-in Presets automatically" msgstr "Eingebaute Voreinstellungen automatisch aktualisieren" -#: src/slic3r/GUI/ConfigWizard.cpp:401 +#: src/slic3r/GUI/ConfigWizard.cpp:761 msgid "Updates" msgstr "Updates" -#: src/slic3r/GUI/ConfigWizard.cpp:426 +#: src/slic3r/GUI/ConfigWizard.cpp:786 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." @@ -7133,36 +8579,44 @@ msgstr "Updates werden niemals ohne das Einverständnis des Benutzers ausgeführ msgid "Upgrade" msgstr "Aktualisieren" -#: src/slic3r/GUI/GUI_App.cpp:685 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Upload a firmware image into an Arduino based printer" -msgstr "Lade ein Firmware Image zu einem Arduino basierten Drucker hoch" +msgstr "Lade ein Firmware Image zu einem Arduino-basierten Drucker hoch" + +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "Hochladen nicht auf der FlashAir-Karte aktiviert." #: src/slic3r/GUI/PrintHostDialogs.cpp:33 msgid "Upload to Printer Host with the following filename:" msgstr "Transferiere zum Druckerhost mit dem Dateinamen:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:229 +#: src/slic3r/GUI/PrintHostDialogs.cpp:230 msgid "Uploading" msgstr "Lade hoch" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 msgid "Upper Layer" msgstr "Obere Schicht" -#: src/slic3r/GUI/Tab.cpp:1873 +#: src/slic3r/GUI/Tab.cpp:1900 msgid "USB/Serial connection" msgstr "USB/Serielle Verbindung" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1662 msgid "USB/serial port for printer connection." msgstr "USB-/serielle Schnittstelle für den Druckeranschluss." -#: src/slic3r/GUI/Preferences.cpp:117 +#: src/slic3r/GUI/DoubleSlider.cpp:1147 +msgid "Use another extruder" +msgstr "Einen anderen Extruder verwenden" + +#: src/slic3r/GUI/Preferences.cpp:143 msgid "Use custom size for toolbar icons" msgstr "Benutzerdefinierte Größe für Symbolleistensymbole verwenden" -#: src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Use firmware retraction" msgstr "Firmware-Einzug aktivieren" @@ -7170,51 +8624,59 @@ msgstr "Firmware-Einzug aktivieren" msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "Benutzen Sie den Schrägstrich (/) als Verzeichnistrenner falls nötig." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/slic3r/GUI/Preferences.cpp:126 +msgid "Use free camera" +msgstr "Benutze freie Kamera" + +#: src/libslic3r/PrintConfig.cpp:2780 msgid "Use pad" msgstr "Grundschicht benutzen" -#: src/slic3r/GUI/Preferences.cpp:110 +#: src/slic3r/GUI/Preferences.cpp:119 msgid "Use perspective camera" msgstr "Benutze perspektivische Kamera" -#: src/libslic3r/PrintConfig.cpp:2067 +#: src/libslic3r/PrintConfig.cpp:2168 msgid "Use relative E distances" msgstr "Relative Abstände für Extrusion benutzen" -#: src/slic3r/GUI/Preferences.cpp:103 +#: src/slic3r/GUI/Preferences.cpp:104 msgid "Use Retina resolution for the 3D scene" msgstr "Verwende Retina Auflösung für die 3D Anzeige" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:540 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:1807 +#: src/libslic3r/PrintConfig.cpp:1893 msgid "Use this setting to rotate the support material pattern on the horizontal plane." -msgstr "Verwenden Sie diese Einstellung, um das Muster für das Stützmaterial auf der horizontalen Ebene zu drehen." +msgstr "Verwenden Sie diese Einstellung, um das Muster für die Stützstrukturen auf der horizontalen Ebene zu drehen." -#: src/libslic3r/PrintConfig.cpp:2074 +#: src/libslic3r/PrintConfig.cpp:2175 msgid "Use volumetric E" msgstr "Volumetrisches E benutzen" -#: src/slic3r/GUI/Plater.cpp:214 +#: src/slic3r/GUI/DoubleSlider.cpp:1171 +msgid "used" +msgstr "genutzt" + +#: src/slic3r/GUI/Plater.cpp:237 msgid "Used Filament (g)" msgstr "Filamentbedarf (g)" -#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:1041 +#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1229 msgid "Used Filament (m)" msgstr "Filamentbedarf (Meter)" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:236 msgid "Used Filament (mm³)" msgstr "Filamentbedarf (mm³)" -#: src/slic3r/GUI/Plater.cpp:1015 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "Used Material (ml)" msgstr "Benutztes Material (ml)" -#: src/slic3r/GUI/Plater.cpp:215 +#: src/slic3r/GUI/Plater.cpp:238 msgid "Used Material (unit)" msgstr "Benutztes Material (Einheit)" @@ -7222,409 +8684,495 @@ msgstr "Benutztes Material (Einheit)" msgid "User" msgstr "Benutzer" -#: src/slic3r/GUI/Preset.cpp:974 src/slic3r/GUI/Preset.cpp:1071 -#: src/slic3r/GUI/PresetBundle.cpp:1558 +#: src/slic3r/GUI/Preset.cpp:1168 src/slic3r/GUI/Preset.cpp:1288 +#: src/slic3r/GUI/PresetBundle.cpp:1677 msgid "User presets" msgstr "Benutzerdefinierte Voreinstellungen" -#: src/libslic3r/Zipper.cpp:93 +#: src/libslic3r/Zipper.cpp:90 msgid "validation failed" msgstr "Überprüfung fehlgeschlagen" -#: src/slic3r/GUI/ButtonsDescription.cpp:41 +#: src/slic3r/GUI/ButtonsDescription.cpp:36 msgid "Value is the same as the system value" msgstr "Der Wert ist gleich wie die Systemeinstellung" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:53 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:2151 +#: src/slic3r/GUI/Tab.cpp:2202 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:2157 +#: src/slic3r/GUI/Tab.cpp:2208 msgid "Values in this column are for Stealth mode" msgstr "Werte in dieser Spalte sind für den Stealth Modus" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4573 +msgid "Variable layer height" +msgstr "Variable Schichthöhe" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1709 +msgid "Variable layer height - Adaptive" +msgstr "Variable Schichthöhe - Adaptiv" + +#: src/slic3r/GUI/GLCanvas3D.cpp:599 +msgid "Variable layer height - Manual edit" +msgstr "Variable Schichthöhe - Manuell bearbeiten" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1701 +msgid "Variable layer height - Reset" +msgstr "Variable Schichthöhe - Zurücksetzen" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1717 +msgid "Variable layer height - Smooth all" +msgstr "Variable Schichthöhe - Alles glätten" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "variants" msgstr "Varianten" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 src/slic3r/GUI/Tab.cpp:921 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:971 msgid "vendor" msgstr "Hersteller" -#: src/libslic3r/PrintConfig.cpp:880 +#: src/slic3r/GUI/ConfigWizard.cpp:565 +msgid "Vendor:" +msgstr "Hersteller:" + +#: src/libslic3r/PrintConfig.cpp:928 msgid "Verbose G-code" msgstr "Ausführlicher G-Code" -#: src/slic3r/GUI/AboutDialog.cpp:67 src/slic3r/GUI/MainFrame.cpp:53 +#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64 msgid "Version" msgstr "Version" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 msgid "version" msgstr "Version" -#: src/slic3r/GUI/Tab.cpp:1002 +#: src/slic3r/GUI/Tab.cpp:1053 msgid "Vertical shells" msgstr "Vertikale Konturhüllen" -#: src/slic3r/GUI/GUI_Preview.cpp:209 +#: src/slic3r/GUI/GUI_Preview.cpp:218 msgid "View" msgstr "Ansicht" -#: src/libslic3r/SLAPrint.cpp:857 src/libslic3r/SLAPrint.cpp:867 -#: src/libslic3r/SLAPrint.cpp:915 +#: src/slic3r/GUI/ConfigWizard.cpp:813 +msgid "View mode" +msgstr "Anzeigemodus" + +#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422 +#: src/libslic3r/SLAPrintSteps.cpp:461 msgid "Visualizing supports" msgstr "Anzeigen der Stützstrukturen" -#: src/slic3r/GUI/Plater.cpp:138 +#: src/slic3r/GUI/Plater.cpp:161 msgid "Volume" msgstr "Volumen" -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 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:1010 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 msgid "Volumes in Object reordered" msgstr "Volumen in Objekt neu angeordnet" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Volumetric" msgstr "Volumetrisch" -#: src/slic3r/GUI/Tab.cpp:1800 +#: src/slic3r/GUI/Tab.cpp:1591 msgid "Volumetric flow hints not available" msgstr "Hinweise zum Volumenstrom nicht verfügbar" -#: src/slic3r/GUI/GUI_Preview.cpp:216 +#: src/slic3r/GUI/GUI_Preview.cpp:226 msgid "Volumetric flow rate" msgstr "Volumetrische Flussrate" -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "Volumetrische Flussrate (mm3/s)" +#: src/libslic3r/GCode/PreviewData.cpp:355 +msgid "Volumetric flow rate (mm³/s)" +msgstr "Volumetrische Flussrate (mm³/s)" #: src/slic3r/GUI/RammingChart.cpp:81 msgid "Volumetric speed" msgstr "Volumengeschwindigkeit" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1168 src/slic3r/GUI/GUI.cpp:283 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 +#: src/libslic3r/PrintConfig.cpp:2915 +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 msgid "Warning" msgstr "Warnung" -#: src/slic3r/GUI/ConfigWizard.cpp:294 +#: src/slic3r/GUI/ConfigWizard.cpp:431 msgid "Welcome" msgstr "Willkommen" -#: src/slic3r/GUI/ConfigWizard.cpp:296 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:427 +#, c-format msgid "Welcome to the %s Configuration Assistant" msgstr "Willkommen zum %s Konfigurations-Assistent" -#: src/slic3r/GUI/ConfigWizard.cpp:298 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:429 +#, c-format msgid "Welcome to the %s Configuration Wizard" msgstr "Willkommen zum %s Konfigurations-Assistent" -#: src/slic3r/GUI/Preferences.cpp:86 +#: src/slic3r/GUI/Preferences.cpp:97 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:223 +#: src/slic3r/GUI/PresetHints.cpp:224 msgid "when printing" msgstr "während dem Druck" -#: src/libslic3r/PrintConfig.cpp:217 +#: src/libslic3r/PrintConfig.cpp:253 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:269 +#: src/libslic3r/PrintConfig.cpp:305 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. Slic3r sollte vor Extruderkollisionen warnen und diese verhindern, aber seien Sie trotzdem aufmerksam." +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:843 +#: src/libslic3r/PrintConfig.cpp:891 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 dickere 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." +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:1483 +#: src/libslic3r/PrintConfig.cpp:1553 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:1475 +#: src/libslic3r/PrintConfig.cpp:1545 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:1347 +#: src/libslic3r/PrintConfig.cpp:1391 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." +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:1173 +#: src/libslic3r/PrintConfig.cpp:1238 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 Slic3r die optimale Geschwindigkeit automatisch berechnen, um den Extruderdruck konstant zu halten. Diese experimentelle Einstellung erlaubt Ihnen, die höchste zulässige Druckgeschwindigkeit anzugeben." +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:1527 +#: src/libslic3r/PrintConfig.cpp:1597 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:1519 +#: src/libslic3r/PrintConfig.cpp:1589 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:3076 +#: src/slic3r/GUI/Tab.cpp:3263 msgid "WHITE BULLET" msgstr "WEISSER PUNKT" -#: src/slic3r/GUI/Tab.cpp:3365 +#: src/slic3r/GUI/Tab.cpp:3285 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:3111 +#: src/slic3r/GUI/Tab.cpp:3288 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:3126 +#: src/slic3r/GUI/Tab.cpp:3303 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:214 src/libslic3r/PrintConfig.cpp:2137 +#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238 msgid "Width" msgstr "Breite" -#: src/libslic3r/GCode/PreviewData.cpp:398 +#: src/libslic3r/GCode/PreviewData.cpp:349 msgid "Width (mm)" msgstr "Breite (mm)" -#: src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2640 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:2138 +#: src/libslic3r/PrintConfig.cpp:2239 msgid "Width of a wipe tower" msgstr "Breite des Reinigungsturms" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2891 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:2203 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Width of the display" msgstr "Displaybreite" -#: src/slic3r/GUI/PresetHints.cpp:47 +#: src/slic3r/GUI/PresetHints.cpp:48 msgid "will always run at %1%%%" msgstr "wird immer mit %1%%% laufen" -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:55 msgid "will be turned off." msgstr "wird abgeschaltet." -#: src/libslic3r/PrintConfig.cpp:2276 +#: src/libslic3r/PrintConfig.cpp:2441 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:2160 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "Wipe into this object" msgstr "Dieses Objekt zum Reinigen verwenden" -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2253 msgid "Wipe into this object's infill" msgstr "Das Infill dieses Objekts zum Reinigen verwenden" -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:90 -#: src/slic3r/GUI/GUI_ObjectList.cpp:564 src/libslic3r/PrintConfig.cpp:2202 -#: src/libslic3r/PrintConfig.cpp:2210 +#: 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 msgid "Wipe options" msgstr "Wischoptionen" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/slic3r/GUI/Tab.cpp:1130 -#: src/libslic3r/GCode/PreviewData.cpp:174 +#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1191 +#: src/libslic3r/ExtrusionEntity.cpp:321 msgid "Wipe tower" msgstr "Reinigungsturm" -#: src/slic3r/GUI/Plater.cpp:1043 src/slic3r/GUI/Plater.cpp:1058 +#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245 msgid "wipe tower" msgstr "Reinigungsturm" -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +#: src/slic3r/GUI/ConfigManipulation.cpp:120 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 +msgid "Wipe Tower" +msgstr "Reinigungsturm" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" msgstr "Reinigungsturm - Anpassung des Reinigungsvolumens" -#: src/slic3r/GUI/Tab.cpp:1664 +#: src/slic3r/GUI/Tab.cpp:1488 msgid "Wipe tower parameters" msgstr "Reinigungsturm Parameter" -#: src/libslic3r/PrintConfig.cpp:2144 +#: src/libslic3r/PrintConfig.cpp:2245 msgid "Wipe tower rotation angle" msgstr "Rotationswinkel des Reinigungsturms" -#: src/libslic3r/PrintConfig.cpp:2170 +#: src/libslic3r/PrintConfig.cpp:2246 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "Rotationswinkel des Reinigungsturms bezogen auf die X-Achse." -#: src/libslic3r/PrintConfig.cpp:2092 +#: src/libslic3r/PrintConfig.cpp:2193 msgid "Wipe while retracting" msgstr "Während Einzug reinigen" -#: src/slic3r/GUI/PresetHints.cpp:224 +#: src/slic3r/GUI/PresetHints.cpp:225 msgid "with a volumetric rate" msgstr "mit einer Volumenrate von" -#: src/libslic3r/PrintConfig.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1530 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:1969 +#: src/libslic3r/PrintConfig.cpp:2056 msgid "With sheath around the support" msgstr "Mit Umhüllung der Stützen" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:40 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:83 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 msgid "World coordinates" msgstr "Weltkoordinaten" -#: src/slic3r/GUI/UpdateDialogs.cpp:76 -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/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:" -#: src/libslic3r/Zipper.cpp:95 +#: src/libslic3r/Zipper.cpp:92 msgid "write calledback failed" msgstr "Schreibabruf fehlgeschlagen" -#: src/libslic3r/PrintConfig.cpp:2993 +#: src/libslic3r/PrintConfig.cpp:3382 msgid "Write information about the model to the console." msgstr "Schreibt Informationen über das Modell auf die Konsole." -#: src/slic3r/Utils/Duet.cpp:148 +#: src/slic3r/Utils/Duet.cpp:131 msgid "Wrong password" msgstr "Ungültiges Kennwort" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2225 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:1793 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "XY separation between an object and its support" msgstr "XY-Abstand zwischen einem Objekt und seinen Stützen" -#: src/libslic3r/PrintConfig.cpp:1795 +#: src/libslic3r/PrintConfig.cpp:1881 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 Aussenschicht ausgehend berechnet." +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:2174 +#: src/libslic3r/PrintConfig.cpp:2275 msgid "XY Size Compensation" -msgstr "XY-Grössenausgleich" +msgstr "XY-Größenausgleich" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2232 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:992 +#: src/slic3r/GUI/Plater.cpp:1170 msgid "Yes" msgstr "Ja" -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1317 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:557 +#: src/libslic3r/PrintConfig.cpp:589 msgid "You can put your notes regarding the filament here." msgstr "Sie können Ihre Notizen zum Filament hier eingeben." -#: src/libslic3r/PrintConfig.cpp:1403 +#: src/libslic3r/PrintConfig.cpp:1473 msgid "You can put your notes regarding the printer here." msgstr "Sie können Ihre Bemerkungen zum Drucker hier eingeben." -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2579 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:324 +#: src/libslic3r/PrintConfig.cpp:360 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:1295 +#: src/libslic3r/PrintConfig.cpp:1364 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:2538 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3546 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:2243 -msgid "You can't load SLA project if there is at least one multi-part object on the bed" -msgstr "Sie können kein SLA-Projekt laden, wenn sich zumindest ein mehrteiliges Objekt auf dem Bett befindet" - -#: src/slic3r/GUI/Plater.cpp:1746 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:2390 +#, 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/GUI_ObjectManipulation.cpp:565 +#: src/slic3r/GUI/Plater.cpp:2311 +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 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/GUI_App.cpp:300 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:287 msgid "You may need to update your graphics card driver." msgstr "Möglicherweise müssen Sie Ihren Grafikkartentreiber aktualisieren." -#: src/slic3r/GUI/Preferences.cpp:130 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +msgid "You must install a configuration update." +msgstr "Ein Konfigurations-Update muss installiert werden." + +#: src/slic3r/GUI/Preferences.cpp:172 +#, 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:2415 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectList.cpp:3421 +#, c-format msgid "You started your selection with %s Item." msgstr "Sie haben Ihre Auswahl mit %s Elementen begonnen." -#: src/slic3r/GUI/MainFrame.cpp:772 +#: src/slic3r/GUI/DoubleSlider.cpp:1902 +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 +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 msgid "Your file was repaired." msgstr "Ihre Datei wurde repariert." -#: src/slic3r/GUI/Plater.cpp:1874 +#: src/slic3r/GUI/Plater.cpp:2528 msgid "Your object appears to be too large, so it was automatically scaled down to fit your print bed." -msgstr "Ihr Objekt scheint zu gross zu sein. Es wurde deshalb automatisch verkleinert, um auf Ihre Druckplatte zu passen." +msgstr "Ihr Objekt scheint zu groß zu sein. Es wurde deshalb automatisch verkleinert, um auf Ihre Druckplatte zu passen." -#: src/libslic3r/PrintConfig.cpp:2184 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "Z offset" msgstr "Z-Abstand" -#: src/libslic3r/PrintConfig.cpp:2416 +#: 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: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/libslic3r/PrintConfig.cpp:2667 msgid "Zig-Zag" msgstr "Zickzack" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/Mouse3DController.cpp:308 +#: src/slic3r/GUI/Mouse3DController.cpp:317 +msgid "Zoom" +msgstr "Zoom" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 msgid "Zoom in" msgstr "Heranzoomen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 msgid "Zoom out" msgstr "Herauszoomen" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -msgid "Zoom to all objects in scene, if none selected" -msgstr "Auf alle Objekte zoomen, falls keines ausgewählt ist" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 msgid "Zoom to Bed" -msgstr "Zoom aufs Bett" +msgstr "Zoom aufs Druckbett" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 -msgid "Zoom to selected object" -msgstr "Auf das gewählte Objekt zoomen" +#: 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:171 src/libslic3r/PrintConfig.cpp:733 -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:1580 -#: src/libslic3r/PrintConfig.cpp:1808 src/libslic3r/PrintConfig.cpp:1962 -#: src/libslic3r/PrintConfig.cpp:2146 src/libslic3r/PrintConfig.cpp:2463 +#: 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 msgid "°" msgstr "°" -#: src/slic3r/GUI/ConfigWizard.cpp:613 src/slic3r/GUI/ConfigWizard.cpp:627 +#: src/slic3r/GUI/ConfigWizard.cpp:1038 src/slic3r/GUI/ConfigWizard.cpp:1052 msgid "°C" msgstr "°C" diff --git a/resources/localization/en/PrusaSlicer.mo b/resources/localization/en/PrusaSlicer.mo new file mode 100644 index 0000000000..423ec166fc Binary files /dev/null and b/resources/localization/en/PrusaSlicer.mo differ diff --git a/resources/localization/en/PrusaSlicer_en.po b/resources/localization/en/PrusaSlicer_en.po new file mode 100644 index 0000000000..909c52319f --- /dev/null +++ b/resources/localization/en/PrusaSlicer_en.po @@ -0,0 +1,155 @@ +msgid "" +msgstr "" +"Language: en\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" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"X-Generator: Poedit 2.3\n" + +#: src/slic3r/GUI/UpdateDialogs.cpp:71 +msgid "Don't notify about new releases any more" +msgstr "Don't notify about new releases anymore" + +#: src/libslic3r/PrintConfig.cpp:287 +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 "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." + +#: src/libslic3r/PrintConfig.cpp:272 +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 "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." + +#: src/libslic3r/PrintConfig.cpp:409 +msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)." +msgstr "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top + bottom solid layers)." + +#: src/slic3r/GUI/ConfigWizard.cpp:791 +msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied." +msgstr "Additionally, a backup snapshot of the whole configuration is created before an update is applied." + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 +msgid "Autogeneration will erase all manually edited points." +msgstr "Auto Generation will erase all manually edited points." + +#: src/slic3r/GUI/Tab.cpp:1171 +msgid "Autospeed (advanced)" +msgstr "Auto Speed (advanced)" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 +msgid "Before roll back" +msgstr "Before rollback" + +#: src/slic3r/GUI/ButtonsDescription.cpp:16 +msgid "Buttons And Text Colors Description" +msgstr "Buttons and Text Colors Description" + +#: src/libslic3r/PrintConfig.cpp:791 +msgid "Density of internal infill, expressed in the range 0% - 100%." +msgstr "Density of internal infill, expressed in the range 0 % - 100 %." + +#: src/slic3r/GUI/ConfigWizard.cpp:773 +#, 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 "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 mechanism, no automatic installation is done." + +#: src/slic3r/GUI/ConfigWizard.cpp:783 +#, 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 "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." + +#: src/slic3r/GUI/Preferences.cpp:66 +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 "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 mechanism, no automatic installation is done." + +#: src/libslic3r/PrintConfig.cpp:1858 +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 "If enabled, the wipe tower will not be printed on layers with no tool changes. On layers with a tool change, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print." + +#: src/libslic3r/PrintConfig.cpp:2262 +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 "Object will be used to purge the nozzle after a tool change 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." + +#: src/libslic3r/Print.cpp:1365 +msgid "One or more object were assigned an extruder that the printer does not have." +msgstr "One or more objects were assigned an extruder that the printer does not have." + +#: src/libslic3r/PrintConfig.cpp:2254 +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 "Purging after tool change 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." + +#: src/libslic3r/PrintConfig.cpp:1552 +msgid "Retraction Length (Toolchange)" +msgstr "Retraction Length (Tool change)" + +#: src/libslic3r/PrintConfig.cpp:556 +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 "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." + +#: src/libslic3r/PrintConfig.cpp:2824 +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 "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 they are closer, they will get merged into one pad." + +#: src/libslic3r/PrintConfig.cpp:624 +msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)." +msgstr "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)." + +#: src/libslic3r/PrintConfig.cpp:2044 +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 "Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given threshold. In other words, this value represents the most horizontal slope (measured from the horizontal plane) that you can print without support material. Set to zero for automatic detection (recommended)." + +#: 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 "" +"The sequential print is on.\n" +"It's impossible to apply any custom G-code for objects printing sequentially.\n" +"This code won't be processed during G-code generation." + +#: src/libslic3r/PrintConfig.cpp:2094 +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 "This custom code is inserted before every tool change. 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 tool change." + +#: src/libslic3r/PrintConfig.cpp:396 +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 "This end procedure is inserted at the end of the output file, before the printer end gcode (and before any tool change 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." + +#: src/libslic3r/PrintConfig.cpp:2215 +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 "This matrix describes volumes (in cubic millimetres) required to purge the new filament on the wipe tower for any given pair of tools." + +#: src/libslic3r/PrintConfig.cpp:1829 +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 "This start procedure is inserted at the beginning, after any printer start gcode (and after any tool change 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." + +#: src/libslic3r/PrintConfig.cpp:641 +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 "Time to wait after the filament is unloaded. May help to get reliable tool changes with flexible materials that may need more time to shrink to original dimensions." + +#: src/slic3r/GUI/Tab.cpp:1491 +msgid "Toolchange parameters with single extruder MM printers" +msgstr "Toolchange parameters with single extruder MM printers" + +#: 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 +msgid "Unknown error occured" +msgstr "Unknown error occurred" + +#: src/libslic3r/PrintConfig.cpp:253 +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 "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.)." + +#: src/libslic3r/PrintConfig.cpp:1391 +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 "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." + +#: src/slic3r/GUI/Tab.cpp:3285 +msgid "WHITE BULLET icon indicates a non system (or non default) preset." +msgstr "WHITE BULLET icon indicates a non-system (or non-default) preset." diff --git a/resources/localization/es/PrusaSlicer.mo b/resources/localization/es/PrusaSlicer.mo index d5c9bf25dd..0da47d5b62 100644 Binary files a/resources/localization/es/PrusaSlicer.mo and b/resources/localization/es/PrusaSlicer.mo differ diff --git a/resources/localization/es/PrusaSlicer_es.po b/resources/localization/es/PrusaSlicer_es.po index c69e55b8d0..0e69f373c4 100644 --- a/resources/localization/es/PrusaSlicer_es.po +++ b/resources/localization/es/PrusaSlicer_es.po @@ -5,360 +5,468 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: PhraseApp (phraseapp.com)\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/PresetHints.cpp:39 -msgid "\nDuring the other layers, fan" -msgstr "\nDurante las otras capas, el ventilador" - -#: src/slic3r/GUI/PresetHints.cpp:35 -msgid "\nIf estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%." -msgstr "\nSi 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/slic3r/GUI/MainFrame.cpp:61 +#: 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:727 +#: src/slic3r/GUI/MainFrame.cpp:872 msgid " was successfully sliced." msgstr " fue laminado con éxito." -#: src/libslic3r/PrintConfig.cpp:179 src/libslic3r/PrintConfig.cpp:745 -#: src/libslic3r/PrintConfig.cpp:1154 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2260 -#: src/libslic3r/PrintConfig.cpp:2502 +#: 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 msgid "%" msgstr "%" -#: src/libslic3r/GCode/PreviewData.cpp:504 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:963 +#, c-format msgid "%.2f - %.2f mm" msgstr "%.2f - %.2f mm" -#: src/slic3r/GUI/Tab.cpp:2895 -msgid "%1% - Copy" -msgstr "%1% - Copiar" - #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:2958 +#: src/slic3r/GUI/Tab.cpp:3126 msgid "%1% Preset" msgstr "%1% Preset" -#: src/slic3r/GUI/Plater.cpp:3831 +#: src/slic3r/GUI/Plater.cpp:4400 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%." -#: src/libslic3r/Print.cpp:1282 +#: src/libslic3r/Print.cpp:1374 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:228 -#, possible-c-format +#: src/slic3r/GUI/PresetHints.cpp:229 +#, 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:974 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1152 +#, c-format msgid "%d (%d shells)" msgstr "%d (%d pieles)" -#: src/slic3r/GUI/Plater.cpp:982 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1160 +#, 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" -#: src/slic3r/GUI/PresetHints.cpp:268 -#, possible-c-format +#: src/slic3r/GUI/PresetHints.cpp:270 +#, c-format msgid "%d lines: %.2f mm" msgstr "%d líneas: %.2f mm" -#: src/slic3r/GUI/MainFrame.cpp:894 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:1027 +#, c-format msgid "%d presets successfully imported." msgstr "%d ajustes iniciales importados con éxito." -#: src/slic3r/GUI/MainFrame.cpp:550 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:692 +#, c-format msgid "%s &Website" -msgstr "%s &Sitio Web" +msgstr "%s Sitio &Web" -#: src/slic3r/GUI/UpdateDialogs.cpp:113 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:211 +#, c-format msgid "%s configuration is incompatible" msgstr "%s la configuración es incompatible" -#: src/slic3r/GUI/Field.cpp:136 -#, possible-c-format +#: src/slic3r/GUI/Field.cpp:175 +#, c-format msgid "%s doesn't support percentage" msgstr "%s no permite porcentajes" #: src/slic3r/GUI/MsgDialog.cpp:73 -#, possible-c-format +#, c-format msgid "%s error" msgstr "%s error" -#: src/slic3r/GUI/ConfigWizard.cpp:336 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:481 +#, c-format msgid "%s Family" msgstr "%s Familia" #: src/slic3r/GUI/MsgDialog.cpp:74 -#, possible-c-format +#, c-format msgid "%s has encountered an error" msgstr "%s ha ocurrido un error" -#: src/slic3r/GUI/GUI_App.cpp:132 -#, 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/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/BackgroundSlicingProcess.cpp:155 -#, possible-c-format +#: 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 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:112 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:308 +#, 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 msgid "%s incompatibility" msgstr "%s incompatibilidad" -#: src/slic3r/GUI/UpdateDialogs.cpp:172 -#, 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/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:681 -#, possible-c-format +#: src/slic3r/GUI/GUI_App.cpp:820 +#, c-format msgid "%s View Mode" msgstr "%s Tipo de vista" -#: src/slic3r/GUI/MainFrame.cpp:563 -#, possible-c-format +#: 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 msgid "&About %s" msgstr "&Acerca de %s" -#: src/slic3r/GUI/GUI_App.cpp:769 +#: src/slic3r/GUI/GUI_App.cpp:908 msgid "&Configuration" msgstr "&Configuración" -#: src/slic3r/GUI/GUI_App.cpp:661 +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "&Configuration Snapshots" msgstr "Instantáneas de la &Configuración" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:588 msgid "&Copy" msgstr "&Copiar" -#: src/slic3r/GUI/MainFrame.cpp:447 +#: src/slic3r/GUI/MainFrame.cpp:572 msgid "&Delete selected" -msgstr "&Eliminar selección" +msgstr "Eli&minar selección" -#: src/slic3r/GUI/MainFrame.cpp:575 +#: src/slic3r/GUI/MainFrame.cpp:722 msgid "&Edit" msgstr "&Editar" -#: src/slic3r/GUI/MainFrame.cpp:377 +#: src/slic3r/GUI/MainFrame.cpp:506 msgid "&Export" msgstr "&Exportar" -#: src/slic3r/GUI/MainFrame.cpp:480 src/slic3r/GUI/MainFrame.cpp:604 +#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:752 msgid "&Filament Settings Tab" -msgstr "Pestaña de &Ajustes de filamento" +msgstr "Pestaña de Ajustes de &filamento" -#: src/slic3r/GUI/MainFrame.cpp:574 +#: src/slic3r/GUI/MainFrame.cpp:721 msgid "&File" msgstr "&Archivo" -#: src/slic3r/GUI/ConfigWizard.cpp:1094 +#: src/slic3r/GUI/ConfigWizard.cpp:1981 msgid "&Finish" msgstr "&Terminar" -#: src/slic3r/GUI/MainFrame.cpp:580 +#: src/slic3r/GUI/MainFrame.cpp:727 msgid "&Help" -msgstr "&Ayuda" +msgstr "Ayu&da" -#: src/slic3r/GUI/MainFrame.cpp:359 +#: src/slic3r/GUI/MainFrame.cpp:474 msgid "&Import" msgstr "&Importar" -#: src/slic3r/GUI/MainFrame.cpp:376 +#: src/slic3r/GUI/GUI_App.cpp:822 +msgid "&Language" +msgstr "&Idioma" + +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "&New Project" msgstr "&Nuevo proyecto" -#: src/slic3r/GUI/ConfigWizard.cpp:1093 +#: src/slic3r/GUI/ConfigWizard.cpp:1980 msgid "&Next >" msgstr "&Siguiente >" -#: src/slic3r/GUI/MainFrame.cpp:339 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "&Open Project" -msgstr "&Abrir proyecto" +msgstr "Abrir pr&oyecto" -#: src/slic3r/GUI/MainFrame.cpp:456 +#: src/slic3r/GUI/MainFrame.cpp:591 msgid "&Paste" msgstr "&Pegar" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "&Plater Tab" -msgstr "Pestaña &Base de impresión" +msgstr "&Pestaña Base de impresión" -#: src/slic3r/GUI/GUI_App.cpp:665 +#: src/slic3r/GUI/GUI_App.cpp:804 msgid "&Preferences" msgstr "&Preferencias" -#: src/slic3r/GUI/MainFrame.cpp:409 +#: src/slic3r/GUI/MainFrame.cpp:540 msgid "&Quit" -msgstr "&Salir" +msgstr "Sa&lir" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/MainFrame.cpp:583 msgid "&Redo" msgstr "&Rehacer" -#: src/slic3r/GUI/MainFrame.cpp:406 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "&Repair STL file" msgstr "&Reparar archivo STL" -#: src/slic3r/GUI/MainFrame.cpp:341 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "&Save Project" -msgstr "&Guardar proyecto" +msgstr "G&uardar proyecto" -#: src/slic3r/GUI/MainFrame.cpp:444 +#: src/slic3r/GUI/MainFrame.cpp:565 msgid "&Select all" msgstr "&Seleccionar todo" -#: src/slic3r/GUI/MainFrame.cpp:558 +#: src/slic3r/GUI/MainFrame.cpp:580 msgid "&Undo" -msgstr "&Deshacer" +msgstr "Des&hacer" -#: src/slic3r/GUI/MainFrame.cpp:577 +#: src/slic3r/GUI/MainFrame.cpp:724 msgid "&View" -msgstr "&Ver" +msgstr "Ve&r" -#: src/slic3r/GUI/MainFrame.cpp:576 +#: src/slic3r/GUI/MainFrame.cpp:723 msgid "&Window" msgstr "&Ventana" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631 +msgid "(All)" +msgstr "(Todo)" + +#: src/libslic3r/PrintConfig.cpp:1446 msgid "(minimum)" msgstr "(mínimo)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 msgid "(Re)slice" msgstr "(Re)laminar" -#: src/slic3r/GUI/MainFrame.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "(Re)Slice No&w" -msgstr "(Re)Laminar Aho&ra" +msgstr "(Re)Laminar A&hora" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587 +msgid "(Unknown)" +msgstr "(Desconocido)" + +#: src/slic3r/GUI/MainFrame.cpp:790 msgid ") not found." msgstr ") no encontrado." -#: src/libslic3r/PrintConfig.cpp:1857 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "0 (soluble)" msgstr "0 (soluble)" -#: src/libslic3r/PrintConfig.cpp:1858 +#: src/libslic3r/PrintConfig.cpp:1919 msgid "0.2 (detachable)" msgstr "0.2 (despegable)" -#: src/slic3r/GUI/MainFrame.cpp:487 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/Plater.cpp:3074 +#: src/slic3r/GUI/Plater.cpp:4097 msgid "3D editor view" msgstr "Vista editor 3D" -#: src/libslic3r/PrintConfig.cpp:804 +#: src/libslic3r/PrintConfig.cpp:851 msgid "3D Honeycomb" msgstr "Panal de abeja 3D" -#: src/slic3r/GUI/Plater.cpp:3590 -#, possible-c-format +#: src/slic3r/GUI/Mouse3DController.cpp:274 +msgid "3Dconnexion settings" +msgstr "Ajustes 3Dconnexion" + +#: src/slic3r/GUI/Plater.cpp:5038 +#, c-format msgid "3MF file exported to %s" msgstr "Archivo 3MF exportado a %s" -#: src/slic3r/GUI/ConfigWizard.cpp:1092 +#: src/slic3r/GUI/ConfigWizard.cpp:1979 msgid "< &Back" msgstr "< &Anterior" -#: src/libslic3r/PrintConfig.cpp:251 +#: src/libslic3r/PrintConfig.cpp:287 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:236 +#: src/libslic3r/PrintConfig.cpp:272 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/ConfigWizard.cpp:609 +#: src/slic3r/GUI/Tab.cpp:975 +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 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:623 +#: src/slic3r/GUI/ConfigWizard.cpp:1048 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." -#: src/slic3r/GUI/GLCanvas3D.cpp:721 +#: 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/AboutDialog.cpp:35 -#, possible-c-format +#: src/slic3r/GUI/AboutDialog.cpp:199 +#, c-format msgid "About %s" msgstr "Acerca de %s" -#: src/libslic3r/GCode/PreviewData.cpp:499 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:959 +#, c-format msgid "above %.2f mm" msgstr "sobre %.2f mm" -#: src/libslic3r/PrintConfig.cpp:1499 +#: src/libslic3r/PrintConfig.cpp:1569 msgid "Above Z" msgstr "Encima de Z" -#: src/slic3r/GUI/Tab.cpp:1103 +#: src/slic3r/GUI/Tab.cpp:1164 msgid "Acceleration control (advanced)" msgstr "Control de aceleración (avanzado)" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:73 +#: src/libslic3r/PrintConfig.cpp:2925 +msgid "Accuracy" +msgstr "Precisión" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 msgid "Activate" msgstr "Activar" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:39 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 msgid "Active" msgstr "Activo" -#: src/slic3r/GUI/Preset.cpp:1003 src/slic3r/GUI/Tab.cpp:237 +#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1705 +msgid "active" +msgstr "activo" + +#: src/slic3r/GUI/GLCanvas3D.cpp:267 +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:2517 +#: src/libslic3r/PrintConfig.cpp:2782 msgid "Add a pad underneath the supported model" msgstr "Añade un pad debajo del modelo compatible" -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2058 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/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/DoubleSlider.cpp:991 +msgid "Add another code - Ctrl + Left click" +msgstr "Añadir otro código - Ctrl + Click izquierdo" + +#: src/slic3r/GUI/DoubleSlider.cpp:992 +msgid "Add another code - Right click" +msgstr "Añadir otro código - Click derecho" + +#: src/slic3r/GUI/DoubleSlider.cpp:1477 +msgid "Add color change" +msgstr "Añadir cambio de color" + +#: src/slic3r/GUI/DoubleSlider.cpp:1180 +msgid "Add color change (%1%) for:" +msgstr "Añadir cambio de color (%1%) para:" + +#: src/slic3r/GUI/DoubleSlider.cpp:988 +msgid "Add color change - Left click" +msgstr "Añadir cambio de color - Click izquierdo" + +#: src/slic3r/GUI/DoubleSlider.cpp:986 +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" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 msgid "Add color change marker for current layer" msgstr "Añadir marcador de cambio de color para la capa actual" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1662 +#: src/slic3r/GUI/DoubleSlider.cpp:1490 +msgid "Add custom G-code" +msgstr "Añadir código G personalizado" + +#: src/slic3r/GUI/GLCanvas3D.cpp:240 +msgid "Add detail" +msgstr "Añadir detalle" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:421 +msgid "Add drainage hole" +msgstr "Añadir orificio de drenaje" + +#: src/slic3r/GUI/DoubleSlider.cpp:984 +msgid "Add extruder change - Left click" +msgstr "Añadir cambio de extrusor - Click 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 msgid "Add Generic Subobject" msgstr "Añadir Subobjeto Genérico" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2584 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2613 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2896 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2925 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 msgid "Add Height Range" msgstr "Añadir Rango de Alturas" -#: src/slic3r/GUI/GLCanvas3D.cpp:3463 +#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3788 +#: src/slic3r/GUI/Plater.cpp:3800 src/slic3r/GUI/Plater.cpp:3940 msgid "Add instance" msgstr "Añadir instancia" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Add Instance of the selected object" msgstr "Añadir instancia del objeto seleccionado" @@ -366,99 +474,113 @@ msgstr "Añadir instancia del objeto seleccionado" msgid "Add layer range" msgstr "Añadir rango de capas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1950 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2328 msgid "Add Layers" msgstr "Añadir Capas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 msgid "Add modifier" msgstr "Añadir modificador" -#: src/libslic3r/PrintConfig.cpp:447 +#: src/libslic3r/PrintConfig.cpp:479 #, no-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:3516 +#: src/slic3r/GUI/Plater.cpp:3940 msgid "Add one more instance of the selected object" msgstr "Añadir una instancia más del objeto seleccionado" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1066 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1082 +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 msgid "Add part" msgstr "Añadir pieza" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/DoubleSlider.cpp:1487 +msgid "Add pause print" +msgstr "Añadir pausa de impresión" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 msgid "Add point" msgstr "Añadir punto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1232 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 msgid "Add point to selection" msgstr "Añadir punto a selección" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1118 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 msgid "Add settings" msgstr "Añadir ajustes" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1252 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 msgid "Add Settings Bundle for Height range" msgstr "Añadir Conjunto de Ajustes para Rango de Alturas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1191 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1388 msgid "Add Settings Bundle for Object" msgstr "Añadir Conjunto de Ajustes para Objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1190 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1387 msgid "Add Settings Bundle for Sub-object" msgstr "Añadir Conjunto de Ajustes para Sub-objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1126 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1314 msgid "Add Settings for Layers" msgstr "Añadir Ajustes para Capas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1128 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 msgid "Add Settings for Object" msgstr "Agregar Ajustes para Objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1315 msgid "Add Settings for Sub-object" msgstr "Agregar Ajustes para Sub-objeto" -#: src/libslic3r/PrintConfig.cpp:382 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1793 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2051 +msgid "Add Shape" +msgstr "Añadir forma" + +#: src/libslic3r/PrintConfig.cpp:409 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)." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1069 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1089 +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 msgid "Add support blocker" msgstr "Añadir bloqueo soportes" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1068 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1086 +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 msgid "Add support enforcer" msgstr "Añadir refuerzo soportes" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:531 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:494 msgid "Add support point" msgstr "Añadir punto de soporte" -#: src/slic3r/GUI/GLCanvas3D.cpp:3392 +#: src/slic3r/GUI/GLCanvas3D.cpp:4467 msgid "Add..." msgstr "Añadir..." -#: src/slic3r/GUI/wxExtensions.cpp:2571 -msgid "Add/Del color change" -msgstr "Añadir/Eliminar cambio de color" +#: src/slic3r/GUI/PresetBundle.cpp:1704 +msgid "Add/Remove filaments" +msgstr "Añadir/Retirar filamentos" -#: src/slic3r/GUI/Tab.cpp:920 +#: src/slic3r/GUI/Preset.cpp:1201 +msgid "Add/Remove materials" +msgstr "Añadir/Retirar materiales" + +#: src/slic3r/GUI/Preset.cpp:1203 +msgid "Add/Remove printers" +msgstr "Añade/Quita impresoras" + +#: src/slic3r/GUI/Tab.cpp:970 msgid "Additional information:" msgstr "Información adicional:" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59 msgid "Additional Settings" msgstr "Ajustes adiccionales" -#: src/slic3r/GUI/ConfigWizard.cpp:431 +#: src/slic3r/GUI/ConfigWizard.cpp:791 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." @@ -466,279 +588,319 @@ 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:675 src/slic3r/GUI/GUI_ObjectList.cpp:76 -#: src/slic3r/GUI/GUI_ObjectList.cpp:517 src/slic3r/GUI/Tab.cpp:1026 -#: src/slic3r/GUI/Tab.cpp:1041 src/slic3r/GUI/Tab.cpp:1139 -#: src/slic3r/GUI/Tab.cpp:1142 src/slic3r/GUI/Tab.cpp:1515 -#: src/slic3r/GUI/Tab.cpp:1940 src/slic3r/GUI/Tab.cpp:3435 -#: src/slic3r/GUI/wxExtensions.cpp:2460 src/libslic3r/PrintConfig.cpp:72 -#: src/libslic3r/PrintConfig.cpp:187 src/libslic3r/PrintConfig.cpp:350 -#: src/libslic3r/PrintConfig.cpp:988 src/libslic3r/PrintConfig.cpp:2175 +#: 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 msgid "Advanced" msgstr "Avanzado" -#: src/slic3r/GUI/GUI_App.cpp:675 +#: src/slic3r/GUI/ConfigWizard.cpp:821 +msgid "Advanced mode" +msgstr "Modo avanzado" + +#: src/slic3r/GUI/GUI_App.cpp:814 msgid "Advanced View Mode" msgstr "Modo vista avanzada" -#: src/slic3r/GUI/FirmwareDialog.cpp:803 +#: src/slic3r/GUI/FirmwareDialog.cpp:841 msgid "Advanced: Output log" msgstr "Avanzado: Registro de salida" -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:668 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:1967 src/libslic3r/PrintConfig.cpp:1031 +#: src/slic3r/GUI/Tab.cpp:1994 src/libslic3r/PrintConfig.cpp:1080 msgid "After layer change G-code" msgstr "Código G tras un cambio de capa" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3398 msgid "Align the model to the given point." msgstr "Alinear el modelo a un punto dado." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3397 msgid "Align XY" msgstr "Alinear XY" -#: src/libslic3r/PrintConfig.cpp:1561 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "Aligned" msgstr "Alineado" -#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:2986 +#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573 +#: src/slic3r/GUI/Tab.cpp:3174 msgid "All" msgstr "Todo" -#: src/libslic3r/Print.cpp:1135 +#: src/libslic3r/Print.cpp:1219 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:3298 -msgid "All objects will be removed, continue ?" +#: src/slic3r/GUI/Plater.cpp:4669 +msgid "All objects will be removed, continue?" msgstr "Todos los objetos serán eliminados, deseas continuar?" -#: src/slic3r/GUI/ConfigWizard.cpp:188 +#: src/slic3r/GUI/ConfigWizard.cpp:289 msgid "All standard" msgstr "Todo estandar" -#: src/libslic3r/Zipper.cpp:65 +#: src/libslic3r/Zipper.cpp:62 msgid "allocation failed" msgstr "asignación fallida" -#: src/slic3r/GUI/Plater.cpp:2939 +#: src/slic3r/GUI/Plater.cpp:3995 msgid "Along X axis" msgstr "A lo largo del eje X" -#: src/slic3r/GUI/Plater.cpp:2941 +#: src/slic3r/GUI/Plater.cpp:3997 msgid "Along Y axis" msgstr "A lo largo del eje Y" -#: src/slic3r/GUI/Plater.cpp:2943 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Along Z axis" msgstr "A lo largo del eje Z" -#: src/slic3r/GUI/ConfigWizard.cpp:122 +#: src/slic3r/GUI/ConfigWizard.cpp:222 msgid "Alternate nozzles:" msgstr "Alternar nozzles:" -#: src/slic3r/GUI/Plater.cpp:3561 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:5002 +#, c-format msgid "AMF file exported to %s" msgstr "Archivo AMF exportado a %s" -#: src/slic3r/GUI/GLCanvas3D.cpp:725 -msgid "An object outside the print area was detected\nResolve the current problem to continue slicing" -msgstr "Se ha detectado una pieza fuera del área de impresión\nSoluciona el problema actual para continuar el laminado" +#: 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:720 +#: 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/Tab.cpp:2781 +#: 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/Plater.cpp:2461 +#: src/slic3r/GUI/Plater.cpp:3170 msgid "Another export job is currently running." msgstr "Otro trabajo de exportación está aún en marcha." -#: src/slic3r/GUI/Tab.cpp:926 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Any arrow" +msgstr "Cualquier flecha" + +#: src/slic3r/GUI/Tab.cpp:965 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:88 +#: src/libslic3r/PrintConfig.cpp:104 msgid "API Key / Password" msgstr "Clave API / Contraseña" -#: src/slic3r/GUI/GUI_App.cpp:671 +#: src/slic3r/GUI/GUI_App.cpp:810 msgid "Application preferences" msgstr "Preferencias de la aplicación" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:864 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1240 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1374 msgid "Apply changes" msgstr "Aplicar cambios" -#: src/libslic3r/PrintConfig.cpp:542 src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708 msgid "approximate seconds" msgstr "segundos aproximadamente" -#: src/libslic3r/PrintConfig.cpp:401 src/libslic3r/PrintConfig.cpp:807 +#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854 msgid "Archimedean Chords" msgstr "Acordes de Arquímedes" -#: src/libslic3r/Zipper.cpp:91 +#: src/libslic3r/Zipper.cpp:88 msgid "archive is too large" msgstr "el archivo es demasiado grande" #. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:2955 +#: src/slic3r/GUI/Tab.cpp:3123 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:862 -msgid "Are you sure you want to cancel firmware flashing?\nThis 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!" +#: 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!" -#: src/libslic3r/PrintConfig.cpp:2258 +#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924 +msgid "Are you sure you want to continue?" +msgstr "¿Estás seguro de que quieres continuar?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 +msgid "Are you sure you want to do it?" +msgstr "¿Estás seguro de que quieres hacerlo?" + +#: src/libslic3r/PrintConfig.cpp:2423 msgid "Area fill" msgstr "Área de relleno" -#: src/slic3r/GUI/Plater.cpp:609 +#: src/slic3r/GUI/Plater.cpp:641 msgid "Around object" msgstr "Alrededor de objeto" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/Plater.cpp:2754 msgid "Arrange" msgstr "Organiza" -#: src/slic3r/GUI/GLCanvas3D.cpp:3486 +#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Arrange selection" msgstr "Ordenar selección" -#: src/libslic3r/PrintConfig.cpp:3054 +#: src/libslic3r/PrintConfig.cpp:3443 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." -#: src/slic3r/GUI/Plater.cpp:2106 +#: src/slic3r/GUI/Plater.cpp:2813 msgid "Arranging" msgstr "Organizando" -#: src/slic3r/GUI/Plater.cpp:2718 +#: src/slic3r/GUI/Plater.cpp:2841 msgid "Arranging canceled." msgstr "Ordenamiento cancelado." -#: src/slic3r/GUI/Plater.cpp:2144 +#: src/slic3r/GUI/Plater.cpp:2842 msgid "Arranging done." msgstr "Organización terminada." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Arrow Down" msgstr "Flecha hacia abajo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 msgid "Arrow Left" msgstr "Flecha hacia izquierda" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 msgid "Arrow Right" msgstr "Flecha hacia derecha" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 msgid "Arrow Up" msgstr "Flecha hacia arriba" -#: src/slic3r/GUI/GUI_App.cpp:303 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:290 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.cpp:144 src/slic3r/GUI/GUI_App.cpp:743 -#: src/slic3r/GUI/Tab.cpp:2798 +#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2313 +#: src/slic3r/GUI/Tab.cpp:2960 msgid "Attention!" msgstr "¡Atención!" -#: src/libslic3r/PrintConfig.cpp:1785 +#: src/libslic3r/PrintConfig.cpp:1871 msgid "Auto generated supports" msgstr "Soportes generados automáticamente" -#: src/slic3r/GUI/Preferences.cpp:44 +#: src/slic3r/GUI/Preferences.cpp:47 msgid "Auto-center parts" msgstr "Piezas auto-centradas" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:902 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1243 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1377 msgid "Auto-generate points" msgstr "Auto-generar puntos" -#: src/slic3r/GUI/Plater.cpp:979 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1157 +#, c-format msgid "Auto-repaired (%d errors)" msgstr "Reparados automáticamente (%d errores)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:230 -#, possible-c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "Reparado automáticamente (%d errores):\n" +#: src/slic3r/GUI/GUI_ObjectList.cpp:339 +#, c-format +msgid "Auto-repaired (%d errors):" +msgstr "Reparado automáticamente (%d errores):" -#: src/slic3r/GUI/FirmwareDialog.cpp:771 +#: src/slic3r/GUI/FirmwareDialog.cpp:809 msgid "Autodetected" msgstr "Detectado automáticamente" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1338 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Autogenerate support points" msgstr "Genera los puntos de apoyo automáticamente" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1166 -msgid "Autogeneration will erase all manually edited points.\n\nAre you sure you want to do it?\n" -msgstr "La autogeneración borrará todos los puntos editados manualmente. \n\n¿Estás seguro de que deseas hacerlo?\n" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 +msgid "Autogeneration will erase all manually edited points." +msgstr "La autogeneración borrará todos los puntos editados manualmente." -#: src/slic3r/GUI/Tab.cpp:3421 +#: src/slic3r/GUI/Tab.cpp:3632 msgid "Automatic generation" msgstr "Generación automática" -#: src/slic3r/GUI/ConfigWizard.cpp:401 +#: src/slic3r/GUI/ConfigWizard.cpp:761 msgid "Automatic updates" msgstr "Actualizaciones automáticas" -#: src/slic3r/GUI/MainFrame.cpp:406 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "Automatically repair an STL file" msgstr "Archivo STL reparado automáticamente" -#: src/slic3r/GUI/Tab.cpp:1110 +#: src/slic3r/GUI/Tab.cpp:1171 msgid "Autospeed (advanced)" msgstr "Velocidad automática (avanzado)" -#: src/libslic3r/PrintConfig.cpp:111 +#: src/libslic3r/PrintConfig.cpp:136 msgid "Avoid crossing perimeters" msgstr "Evita cruzar perímetros" -#: src/slic3r/GUI/Tab.cpp:3081 +#: src/slic3r/GUI/Tab.cpp:3268 msgid "BACK ARROW" msgstr "FLECHA HACIA ATRÁS" -#: src/slic3r/GUI/Tab.cpp:3113 -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: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:3127 -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/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/Preferences.cpp:52 +#: src/slic3r/GUI/Preferences.cpp:55 msgid "Background processing" msgstr "Procesamiento en segundo plano" -#: src/slic3r/GUI/GUI_ObjectList.cpp:242 +#: src/slic3r/GUI/GUI_ObjectList.cpp:351 msgid "backwards edges" msgstr "bordes hacia atrás" -#: src/slic3r/GUI/MainFrame.cpp:152 +#: src/slic3r/GUI/MainFrame.cpp:174 msgid "based on Slic3r" msgstr "basado en Slic3r" -#: src/slic3r/GUI/Tab.cpp:1484 +#: src/slic3r/GUI/Tab.cpp:1439 msgid "Bed" msgstr "Base" @@ -750,31 +912,31 @@ msgstr "Modelo de base personalizado" msgid "Bed custom texture" msgstr "Textura personalizada de la base" -#: src/slic3r/GUI/BedShapeDialog.hpp:45 src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:929 msgid "Bed Shape" msgstr "Forma de la base de impresión" -#: src/libslic3r/PrintConfig.cpp:50 +#: src/libslic3r/PrintConfig.cpp:51 msgid "Bed shape" msgstr "Forma de la base de impresión" -#: src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/ConfigWizard.cpp:929 msgid "Bed Shape and Size" msgstr "Tamaño y forma de la base" -#: src/libslic3r/PrintConfig.cpp:122 +#: src/libslic3r/PrintConfig.cpp:147 msgid "Bed temperature" msgstr "Temperatura de la base" -#: src/libslic3r/PrintConfig.cpp:120 +#: src/libslic3r/PrintConfig.cpp:145 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." -#: src/slic3r/GUI/ConfigWizard.cpp:626 +#: src/slic3r/GUI/ConfigWizard.cpp:1051 msgid "Bed Temperature:" msgstr "Temperatura de la base:" -#: src/slic3r/GUI/Tab.cpp:1961 src/libslic3r/PrintConfig.cpp:128 +#: src/slic3r/GUI/Tab.cpp:1988 src/libslic3r/PrintConfig.cpp:153 msgid "Before layer change G-code" msgstr "Código G para antes del cambio de capa" @@ -782,90 +944,110 @@ 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:608 +#: src/slic3r/GUI/Plater.cpp:640 msgid "Below object" msgstr "Por debajo del objeto" -#: src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Below Z" msgstr "Por debajo de Z" -#: src/libslic3r/PrintConfig.cpp:139 +#: src/libslic3r/PrintConfig.cpp:164 msgid "Between objects G-code" msgstr "Código G para entre objetos" -#: src/slic3r/GUI/Tab.cpp:1979 +#: src/slic3r/GUI/Tab.cpp:2006 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 +msgid "Bottle volume" +msgstr "Volumen de la botella" + +#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497 +msgid "Bottle weight" +msgstr "Peso botella" + #. TRN To be shown in the main menu View->Bottom -#: src/slic3r/GUI/MainFrame.cpp:524 +#. 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 msgid "Bottom" msgstr "Inferior" -#: src/libslic3r/PrintConfig.cpp:409 +#: src/libslic3r/PrintConfig.cpp:435 msgid "Bottom fill pattern" msgstr "Patrón de relleno inferior" -#: src/libslic3r/PrintConfig.cpp:152 +#: src/slic3r/GUI/PresetHints.cpp:342 +msgid "Bottom is open." +msgstr "La parte inferior está abierta." + +#: src/slic3r/GUI/PresetHints.cpp:336 +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." + +#: src/libslic3r/PrintConfig.cpp:177 msgid "Bottom solid layers" msgstr "Capas sólidas inferiores" -#: src/slic3r/GUI/MainFrame.cpp:524 +#: src/slic3r/GUI/MainFrame.cpp:665 msgid "Bottom View" msgstr "Vista inferior" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1087 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1090 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1464 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1468 msgid "Box" msgstr "Caja" -#: src/libslic3r/PrintConfig.cpp:157 +#: src/libslic3r/PrintConfig.cpp:193 msgid "Bridge" msgstr "Puente" -#: src/libslic3r/PrintConfig.cpp:186 +#: src/libslic3r/PrintConfig.cpp:222 msgid "Bridge flow ratio" msgstr "Relación de flujo del puente" -#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/GCode/PreviewData.cpp:169 +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316 msgid "Bridge infill" msgstr "Relleno de puente" -#: src/libslic3r/PrintConfig.cpp:198 +#: src/libslic3r/PrintConfig.cpp:234 msgid "Bridges" msgstr "Puentes" -#: src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:213 msgid "Bridges fan speed" msgstr "Velocidad del ventilador para puentes" -#: src/libslic3r/PrintConfig.cpp:166 +#: src/libslic3r/PrintConfig.cpp:202 msgid "Bridging angle" msgstr "Ángulo de puente" -#: src/libslic3r/PrintConfig.cpp:168 +#: src/libslic3r/PrintConfig.cpp:204 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." -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Bridging volumetric" msgstr "Puente volumétrico" -#: src/slic3r/GUI/Plater.cpp:446 src/slic3r/GUI/Tab.cpp:1056 +#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117 msgid "Brim" msgstr "Balsa" -#: src/libslic3r/PrintConfig.cpp:208 +#: src/libslic3r/PrintConfig.cpp:244 msgid "Brim width" msgstr "Ancho de la balsa" -#: src/slic3r/GUI/Tab.cpp:1681 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1658 +#: src/slic3r/GUI/Tab.cpp:1721 msgid "Browse" msgstr "Buscar" -#: src/libslic3r/Zipper.cpp:85 +#: src/libslic3r/Zipper.cpp:82 msgid "buffer too small" msgstr "buffer demasiado pequeño" @@ -873,850 +1055,1044 @@ msgstr "buffer demasiado pequeño" msgid "Buttons And Text Colors Description" msgstr "Descripción de los botones y de los colores del texto" -#: src/slic3r/GUI/PresetHints.cpp:220 +#: src/slic3r/GUI/PresetHints.cpp:223 msgid "by the print profile maximum" msgstr "por el máximo perfil de impresión" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:113 +msgid "Camera" +msgstr "Cámara" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Camera view" msgstr "Vista de cámara" -#: src/slic3r/GUI/ConfigWizard.cpp:1095 src/slic3r/GUI/FirmwareDialog.cpp:147 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:37 -#: src/slic3r/GUI/ProgressStatusBar.cpp:28 +#: src/slic3r/GUI/ConfigWizard.cpp:1982 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 msgid "Cancel" msgstr "Cancelar" -#: src/slic3r/GUI/PrintHostDialogs.cpp:156 +#: src/slic3r/GUI/PrintHostDialogs.cpp:157 msgid "Cancel selected" msgstr "Cancelar selección" -#: src/slic3r/GUI/Plater.cpp:2727 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3669 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "Cancelado" -#: src/slic3r/GUI/Plater.cpp:2444 src/slic3r/GUI/PrintHostDialogs.cpp:231 +#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "Cancelando" -#: src/slic3r/GUI/FirmwareDialog.cpp:866 +#: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." msgstr "Cancelando..." -#: src/slic3r/GUI/Tab.cpp:2905 +#: src/libslic3r/Flow.cpp:61 +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: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: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/Tab.cpp:3073 msgid "Cannot overwrite a system profile." msgstr "No se puede sobre-escribir un perfil del sistema." -#: src/slic3r/GUI/Tab.cpp:2909 +#: src/slic3r/GUI/Tab.cpp:3077 msgid "Cannot overwrite an external profile." msgstr "No puedo sobre-escribir un valor externo." -#: src/libslic3r/SLAPrint.cpp:612 +#: src/libslic3r/SLAPrint.cpp:613 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:1840 +#: src/slic3r/GUI/Tab.cpp:1834 msgid "Capabilities" msgstr "Capacidades" -#: src/slic3r/GUI/GUI_App.cpp:662 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Capture a configuration snapshot" msgstr "Captura una instantánea de configuración" -#: src/libslic3r/PrintConfig.cpp:3035 +#: src/libslic3r/PrintConfig.cpp:3424 msgid "Center" msgstr "Centro" -#: src/libslic3r/PrintConfig.cpp:3036 +#: src/libslic3r/PrintConfig.cpp:3425 msgid "Center the print around the given center." msgstr "Centrar la impresión alrededor del centro dado." -#: src/slic3r/GUI/Tab.cpp:1744 +#: src/slic3r/GUI/Tab.cpp:1728 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Archivos de certificados (*.crt, *.pem)|*.crt;*.pem|Todos|*.*" -#: src/slic3r/GUI/GUI_App.cpp:683 -msgid "Change Application &Language" -msgstr "Cambiar &Idioma de la aplicación" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Change camera type (perspective, orthographic)" msgstr "Cambiar tipo de cámara (perspectiva, ortográfica)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:885 +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 msgid "Change extruder" msgstr "Cambiar extrusor" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:144 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectList.cpp:536 +msgid "Change Extruder" +msgstr "Cambiar Extrusor" + +#: src/slic3r/GUI/DoubleSlider.cpp:1145 +msgid "Change extruder (N/A)" +msgstr "Cambiar extrusor (N/A)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3997 +msgid "Change Extruders" +msgstr "Cambiar Extrusores" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 +#, c-format msgid "Change Option %s" msgstr "Cambiar opción %s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3134 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3558 msgid "Change Part Type" msgstr "Cambiar Tipo de Pieza" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:925 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820 msgid "Change point head diameter" msgstr "Cambiar diámetro de la cabeza de punta" -#: src/slic3r/GUI/Plater.cpp:3520 +#: src/slic3r/GUI/Plater.cpp:3944 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:1185 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1589 msgid "Change type" msgstr "Cambiar tipo" -#: src/slic3r/GUI/UpdateDialogs.cpp:56 +#: src/slic3r/GUI/UpdateDialogs.cpp:53 msgid "Changelog && Download" msgstr "Registro de cambios && Descargar" -#: src/slic3r/GUI/GUI_App.cpp:378 +#: src/slic3r/GUI/GUI_App.cpp:442 msgid "Changing of an application language" msgstr "Cambio de idioma de una aplicación" -#: src/slic3r/GUI/ConfigWizard.cpp:409 src/slic3r/GUI/Preferences.cpp:61 +#: src/slic3r/GUI/ConfigWizard.cpp:769 src/slic3r/GUI/Preferences.cpp:64 msgid "Check for application updates" msgstr "Comprueba si hay actualizaciones de la aplicación" -#: src/slic3r/GUI/BedShapeDialog.cpp:509 +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for configuration updates" +msgstr "Comprueba si hay actualizaciones de configuración" + +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for updates" +msgstr "Comprueba si hay act&ualizaciones" + +#: src/slic3r/GUI/BedShapeDialog.cpp:532 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:621 +#: src/slic3r/GUI/MainFrame.cpp:773 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Elija un archivo para laminar (STL / OBJ / AMF / 3MF / PRUSA):" -#: src/slic3r/GUI/BedShapeDialog.cpp:532 +#: src/slic3r/GUI/BedShapeDialog.cpp:555 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:464 +#: src/slic3r/GUI/BedShapeDialog.cpp:487 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:510 +#: src/slic3r/GUI/GUI_App.cpp:555 msgid "Choose one file (3MF/AMF):" msgstr "Selecciona un archivo (3MF/AMF):" -#: src/slic3r/GUI/GUI_App.cpp:501 +#: src/slic3r/GUI/GUI_App.cpp:567 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "Escoja uno o mas archivos (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/ConfigWizard.cpp:490 +#: src/slic3r/GUI/ConfigWizard.cpp:895 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:84 +#: src/slic3r/GUI/BedShapeDialog.cpp:89 msgid "Circular" msgstr "Circular" -#: src/slic3r/GUI/GLCanvas3D.cpp:3701 src/slic3r/GUI/GLCanvas3D.cpp:3734 +#: 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/GUI_ObjectList.cpp:383 +#: src/slic3r/GUI/GUI_ObjectList.cpp:404 msgid "Click the icon to change the object printable property" msgstr "Click en el icono para cambiar las propiedades del objeto imprimible" -#: src/slic3r/GUI/GUI_ObjectList.cpp:377 +#: src/slic3r/GUI/GUI_ObjectList.cpp:398 msgid "Click the icon to change the object settings" msgstr "Click en el icono para cambiar los ajustes del objeto" -#: src/slic3r/GUI/Plater.cpp:292 +#: src/slic3r/GUI/Plater.cpp:343 msgid "Click to edit preset" msgstr "Clic para cambiar el ajuste inicial" -#: src/libslic3r/PrintConfig.cpp:216 +#: src/libslic3r/PrintConfig.cpp:252 msgid "Clip multi-part objects" msgstr "Enlazaar objetos de varias partes" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:928 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 msgid "Clipping of view" msgstr "Recorte de la vista" -#: src/slic3r/GUI/FirmwareDialog.cpp:814 -#: src/slic3r/GUI/PrintHostDialogs.cpp:160 +#: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/Mouse3DController.cpp:364 +#: src/slic3r/GUI/PrintHostDialogs.cpp:161 msgid "Close" msgstr "Cerrar" -#: src/libslic3r/PrintConfig.cpp:550 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +#: src/libslic3r/PrintConfig.cpp:2934 +msgid "Closing distance" +msgstr "Distancia de cierre" + +#: src/slic3r/GUI/Plater.cpp:1260 src/libslic3r/PrintConfig.cpp:582 msgid "Color" msgstr "Color" -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/GUI_Preview.cpp:535 -#: src/libslic3r/GCode/PreviewData.cpp:406 +#: src/slic3r/GUI/DoubleSlider.cpp:1005 +msgid "Color change (\"%1%\")" +msgstr "Cambio de color (\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:1006 +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/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572 +#: src/libslic3r/GCode/PreviewData.cpp:359 msgid "Color Print" msgstr "Color Print" -#: src/libslic3r/PrintConfig.cpp:224 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Colorprint height" msgstr "Altura de Colorprint" -#: src/libslic3r/PrintConfig.cpp:942 +#: src/libslic3r/PrintConfig.cpp:990 msgid "Combine infill every" msgstr "Combinar el relleno cada" -#: src/libslic3r/PrintConfig.cpp:947 +#: src/libslic3r/PrintConfig.cpp:995 msgid "Combine infill every n layers" msgstr "Combinar el relleno cada n capas" -#: src/slic3r/GUI/UpdateDialogs.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Commands" +msgstr "Comandos" + +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 msgid "Comment:" msgstr "Comentario:" -#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:244 +#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280 msgid "Compatible print profiles" msgstr "Perfiles de impresión compatibles" -#: src/libslic3r/PrintConfig.cpp:250 +#: src/libslic3r/PrintConfig.cpp:286 msgid "Compatible print profiles condition" msgstr "Condición de perfiles de impresión compatibles" -#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:229 +#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265 msgid "Compatible printers" msgstr "Impresoras compatibles" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:271 msgid "Compatible printers condition" msgstr "Condición de impresoras compatibles" -#: src/libslic3r/PrintConfig.cpp:268 +#: src/libslic3r/PrintConfig.cpp:304 msgid "Complete individual objects" msgstr "Completar objetos individuales" -#: src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/PrintHostDialogs.cpp:234 msgid "Completed" msgstr "Completado" -#: src/libslic3r/Zipper.cpp:57 +#: src/libslic3r/Zipper.cpp:54 msgid "compression failed" msgstr "compresión fallida" -#: src/libslic3r/PrintConfig.cpp:399 src/libslic3r/PrintConfig.cpp:802 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849 msgid "Concentric" msgstr "Concentrico" -#: src/slic3r/GUI/ConfigWizard.cpp:1185 +#: src/slic3r/GUI/ConfigWizard.cpp:2110 msgid "Configuration &Assistant" msgstr "&Asistente de configuración" -#: src/slic3r/GUI/ConfigWizard.cpp:1182 +#: src/slic3r/GUI/ConfigWizard.cpp:2113 msgid "Configuration &Wizard" -msgstr "&Ayudante de configuración" +msgstr "Ayudante de co&nfiguración" -#: src/slic3r/GUI/ConfigWizard.cpp:1184 +#: src/slic3r/GUI/ConfigWizard.cpp:2109 msgid "Configuration Assistant" msgstr "Asistente de Configuración" -#: src/libslic3r/PrintConfig.cpp:1251 +#: src/libslic3r/PrintConfig.cpp:1316 msgid "Configuration notes" msgstr "Notas de configuración" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:99 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104 msgid "Configuration Snapshots" msgstr "Instantáneas de la Configuración" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 src/slic3r/GUI/UpdateDialogs.cpp:168 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" msgstr "Actualización de configuración" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 msgid "Configuration update is available" msgstr "Hay disponible una actualización de la Configuración" -#: src/slic3r/GUI/ConfigWizard.cpp:1181 +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "Configuration updates" +msgstr "Actualizaciones de la configuración" + +#: src/slic3r/GUI/ConfigWizard.cpp:2112 msgid "Configuration Wizard" msgstr "Asistente de configuración" -#: src/slic3r/GUI/FirmwareDialog.cpp:863 +#: src/slic3r/GUI/FirmwareDialog.cpp:903 msgid "Confirmation" msgstr "Confirmación" -#: src/slic3r/GUI/Tab.cpp:1904 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Connection failed." msgstr "Conexión fallida." -#: src/slic3r/GUI/Tab.cpp:3416 +#: src/slic3r/GUI/Tab.cpp:3627 msgid "Connection of the support sticks and junctions" msgstr "Conexión de las varillas de soporte y uniones" -#: src/slic3r/Utils/Duet.cpp:51 +#: src/slic3r/Utils/AstroBox.cpp:83 +msgid "Connection to AstroBox works correctly." +msgstr "La conexión a Astrobox funciona correctamente." + +#: src/slic3r/Utils/Duet.cpp:49 msgid "Connection to Duet works correctly." msgstr "La conexión con la Duet funciona correctamente." -#: src/slic3r/Utils/OctoPrint.cpp:84 +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "La conexión a FlashAir funciona correctamente y la carga está habilitada." + +#: src/slic3r/Utils/OctoPrint.cpp:83 msgid "Connection to OctoPrint works correctly." msgstr "La conexión a OctoPrint funciona correctamente." -#: src/slic3r/GUI/Tab.cpp:1901 +#: src/slic3r/GUI/Tab.cpp:1928 msgid "Connection to printer works correctly." msgstr "La conexión con la impresora funciona correctamente." -#: src/slic3r/Utils/OctoPrint.cpp:195 +#: src/slic3r/Utils/OctoPrint.cpp:176 msgid "Connection to Prusa SL1 works correctly." msgstr "La conexión con la Prusa SL1 funciona correctamente." -#: src/libslic3r/PrintConfig.cpp:1823 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Contact Z distance" msgstr "Distancia Z de contacto" -#: src/slic3r/GUI/AboutDialog.cpp:96 +#: src/slic3r/GUI/AboutDialog.cpp:261 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:2433 +#: src/libslic3r/PrintConfig.cpp:2659 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." -#: src/slic3r/GUI/Tab.cpp:1489 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Cooling" msgstr "Enfriamiento" -#: src/libslic3r/PrintConfig.cpp:629 +#: src/libslic3r/PrintConfig.cpp:660 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:648 +#: src/libslic3r/PrintConfig.cpp:679 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:1510 +#: src/slic3r/GUI/Tab.cpp:1465 msgid "Cooling thresholds" msgstr "Umbrales de enfriamiento" -#: src/libslic3r/PrintConfig.cpp:291 +#: src/libslic3r/PrintConfig.cpp:327 msgid "Cooling tube length" msgstr "Longitud del tubo de enfriamiento" -#: src/libslic3r/PrintConfig.cpp:283 +#: src/libslic3r/PrintConfig.cpp:319 msgid "Cooling tube position" msgstr "Posición del tubo de refrigeración" -#: src/slic3r/GUI/Tab.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:4752 +msgid "Copies of the selected object" +msgstr "Copias del objeto seleccionado" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4505 msgid "Copy" msgstr "Copiar" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:589 msgid "Copy selection to clipboard" msgstr "Copiar selección al portapapeles" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 msgid "Copy to clipboard" msgstr "Copiar al portapapeles" -#: src/slic3r/GUI/SysInfoDialog.cpp:120 +#: src/slic3r/GUI/SysInfoDialog.cpp:154 msgid "Copy to Clipboard" msgstr "Copiar al portapapeles" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:84 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:400 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121 +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 +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." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:480 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:92 +#: 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/AboutDialog.cpp:92 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112 +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 msgid "Copyright" msgstr "Copyright" -#: src/libslic3r/PrintConfig.cpp:2324 src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572 msgid "Correction for expansion" msgstr "Corrección para la expansión" -#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:3310 +#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:3519 msgid "Corrections" msgstr "Correcciones" -#: src/slic3r/GUI/Plater.cpp:216 src/slic3r/GUI/Plater.cpp:1056 -#: src/libslic3r/PrintConfig.cpp:717 +#: src/slic3r/GUI/Plater.cpp:1243 src/libslic3r/PrintConfig.cpp:760 +#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511 msgid "Cost" msgstr "Coste" -#: src/slic3r/GUI/Plater.cpp:2140 +#: src/slic3r/GUI/Plater.cpp:239 +msgid "Cost (money)" +msgstr "Coste (dinero)" + +#: src/slic3r/GUI/Plater.cpp:2835 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/Duet.cpp:56 +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Could not connect to AstroBox" +msgstr "No se pudo conectar con Astrobox" + +#: src/slic3r/Utils/Duet.cpp:54 msgid "Could not connect to Duet" msgstr "No se pudo conectar con la Duet" -#: src/slic3r/Utils/OctoPrint.cpp:90 +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "Could not connect to FlashAir" +msgstr "No puedo conectar con FlashAir" + +#: src/slic3r/Utils/OctoPrint.cpp:89 msgid "Could not connect to OctoPrint" msgstr "No puedo conectar con OctoPrint" -#: src/slic3r/Utils/OctoPrint.cpp:200 +#: src/slic3r/Utils/OctoPrint.cpp:181 msgid "Could not connect to Prusa SLA" msgstr "No se pudo conectar con la Prusa SLA" -#: src/slic3r/GUI/Tab.cpp:1710 +#: src/slic3r/GUI/Tab.cpp:1687 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:151 +#: src/slic3r/Utils/Duet.cpp:134 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:1872 +#: src/libslic3r/PrintConfig.cpp:1959 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:73 +#: src/libslic3r/PrintConfig.cpp:89 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:61 +#: src/libslic3r/Zipper.cpp:58 msgid "CRC-32 check failed" msgstr "Comprobación con CRC-32 fallida" -#: src/libslic3r/PrintConfig.cpp:2734 +#: src/libslic3r/PrintConfig.cpp:2857 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:2460 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Critical angle" msgstr "Ángulo crítico" -#: src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2668 msgid "Cross" msgstr "Cruzado" -#: src/libslic3r/PrintConfig.cpp:800 +#: src/libslic3r/PrintConfig.cpp:847 msgid "Cubic" msgstr "Cúbico" -#: src/slic3r/GUI/wxExtensions.cpp:2413 -#, possible-c-format +#: src/slic3r/GUI/wxExtensions.cpp:704 +#, c-format msgid "Current mode is %s" msgstr "El modo actual es %s" -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" +msgstr "El preajuste fue heredado de" + +#: src/slic3r/GUI/Tab.cpp:957 msgid "Current preset is inherited from the default preset." msgstr "El preajuste fue heredado del preajuste predeterminado." -#: src/slic3r/GUI/Tab.cpp:928 -#, possible-c-format -msgid "Current preset is inherited from:\n\t%s" -msgstr "El preajuste fue heredado de:\n%s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:45 +#: src/slic3r/GUI/UpdateDialogs.cpp:43 msgid "Current version:" msgstr "Versión actual:" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/slic3r/GUI/GUI_Preview.cpp:239 -#: src/libslic3r/GCode/PreviewData.cpp:175 +#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249 +#: src/libslic3r/ExtrusionEntity.cpp:322 msgid "Custom" msgstr "Personalizado" -#: src/libslic3r/PrintConfig.cpp:96 +#: src/libslic3r/PrintConfig.cpp:112 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." -#: src/slic3r/GUI/Tab.cpp:1563 src/slic3r/GUI/Tab.cpp:1948 +#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1975 msgid "Custom G-code" msgstr "Código G personalizado" -#: src/slic3r/GUI/ConfigWizard.cpp:373 +#: src/slic3r/GUI/DoubleSlider.cpp:1619 +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 msgid "Custom Printer" msgstr "Impresora customizada" -#: src/slic3r/GUI/ConfigWizard.cpp:373 +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer Setup" msgstr "Configuración personalizada de impresora" -#: src/slic3r/GUI/ConfigWizard.cpp:377 +#: src/slic3r/GUI/ConfigWizard.cpp:736 msgid "Custom profile name:" msgstr "Nombre impresora customizada:" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3013 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3402 msgid "Cut" msgstr "Cortar" -#: src/slic3r/GUI/Plater.cpp:4193 +#: src/slic3r/GUI/Plater.cpp:4786 msgid "Cut by Plane" msgstr "Cortar por el Plano" -#: src/libslic3r/PrintConfig.cpp:3014 +#: src/libslic3r/PrintConfig.cpp:3403 msgid "Cut model at the given Z." msgstr "Cortar modelo a una Z dada." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Cylinder" msgstr "Cilindro" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:568 msgid "D&eselect all" msgstr "D&eseleccionar todo" -#: src/libslic3r/PrintConfig.cpp:3115 +#: src/libslic3r/PrintConfig.cpp:3504 msgid "Data directory" msgstr "Directorio de datos" -#: src/libslic3r/Zipper.cpp:55 +#: src/slic3r/GUI/Mouse3DController.cpp:313 +msgid "Deadzone:" +msgstr "Zona muerta:" + +#: src/libslic3r/Zipper.cpp:52 msgid "decompression failed or archive is corrupted" msgstr "descompresión fallida o archivo está dañado" -#: src/slic3r/GUI/Plater.cpp:4127 +#: src/slic3r/GUI/Plater.cpp:4720 msgid "Decrease Instances" msgstr "Reducir Instancias" -#: src/slic3r/GUI/GUI_App.cpp:594 src/slic3r/GUI/GUI_ObjectList.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1704 src/libslic3r/PrintConfig.cpp:335 msgid "Default" msgstr "Por defecto" -#: xs/src/slic3r/GUI/Field.cpp:98 +#: 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 msgid "default" msgstr "por defecto" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:777 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:522 +#: src/libslic3r/PrintConfig.cpp:554 msgid "Default extrusion width" msgstr "Ancho de extrusión por defecto" -#: src/slic3r/GUI/Tab.cpp:937 +#: src/slic3r/GUI/Tab.cpp:987 msgid "default filament profile" msgstr "perfil de filamento por defecto" -#: src/libslic3r/PrintConfig.cpp:309 +#: src/libslic3r/PrintConfig.cpp:345 msgid "Default filament profile" msgstr "Perfil de filamento por defecto" -#: src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:346 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:2757 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:2919 +#, c-format msgid "Default preset (%s)" msgstr "Ajustes por defecto (%s)" -#: src/libslic3r/GCode/PreviewData.cpp:491 +#: 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:934 +#: src/slic3r/GUI/Tab.cpp:984 msgid "default print profile" msgstr "perfil de impresión por defecto" -#: src/libslic3r/PrintConfig.cpp:316 +#: src/libslic3r/PrintConfig.cpp:352 msgid "Default print profile" msgstr "Perfil de impresión por defecto" -#: src/libslic3r/PrintConfig.cpp:317 src/libslic3r/PrintConfig.cpp:2341 -#: src/libslic3r/PrintConfig.cpp:2352 +#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592 +#: src/libslic3r/PrintConfig.cpp:2603 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:951 +#: src/slic3r/GUI/Tab.cpp:1001 msgid "default SLA material profile" msgstr "perfil de material de SLA por defecto" -#: src/libslic3r/PrintConfig.cpp:2340 src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602 msgid "Default SLA material profile" msgstr "Perfil de material de SLA predeterminado" -#: src/slic3r/GUI/Tab.cpp:955 +#: src/slic3r/GUI/Tab.cpp:1005 msgid "default SLA print profile" msgstr "perfil de impresión de SLA por defecto" -#: src/slic3r/GUI/Field.cpp:105 +#: src/slic3r/GUI/Field.cpp:136 msgid "default value" msgstr "valor por defecto" -#: src/slic3r/GUI/ConfigWizard.cpp:375 +#: src/slic3r/GUI/ConfigWizard.cpp:734 msgid "Define a custom printer profile" msgstr "Definir un perfil de impresora personalizado" -#: src/libslic3r/PrintConfig.cpp:2558 +#: src/libslic3r/PrintConfig.cpp:2798 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." -#: src/slic3r/GUI/GUI_ObjectList.cpp:237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:346 msgid "degenerate facets" msgstr "facetas degeneradas" -#: src/libslic3r/PrintConfig.cpp:608 +#: src/libslic3r/PrintConfig.cpp:640 msgid "Delay after unloading" msgstr "Retardo tras la descarga" -#: src/slic3r/GUI/Tab.cpp:2935 +#: src/slic3r/GUI/Tab.cpp:3121 msgid "delete" msgstr "borra" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1257 src/slic3r/GUI/Plater.cpp:2891 -#: src/slic3r/GUI/Plater.cpp:2909 src/slic3r/GUI/Tab.cpp:2937 +#: 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 msgid "Delete" msgstr "Borra" -#: src/slic3r/GUI/MainFrame.cpp:449 +#: src/slic3r/GUI/MainFrame.cpp:575 msgid "Delete &all" -msgstr "Borrar &todo" +msgstr "Borr&ar todo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 -msgid "Delete All" -msgstr "Borrar todo" - -#: src/slic3r/GUI/Plater.cpp:3298 +#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129 +#: src/slic3r/GUI/Plater.cpp:4669 msgid "Delete all" msgstr "Eliminar todo" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1806 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2176 msgid "Delete All Instances from Object" msgstr "Eliminar todas las instancias del Objeto" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/DoubleSlider.cpp:1516 +msgid "Delete color change" +msgstr "Eliminar cambio de color" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Delete color change marker for current layer" msgstr "Eliminar marcador de cambio de color para la capa actual" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1898 +#: src/slic3r/GUI/DoubleSlider.cpp:1519 +msgid "Delete custom G-code" +msgstr "Eliminar código G personalizado" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:539 +msgid "Delete drainage hole" +msgstr "Eliminar orificio de drenaje" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2192 msgid "Delete Height Range" msgstr "Eliminar Rango de Alturas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2246 msgid "Delete Instance" msgstr "Eliminar Instancia" -#: src/slic3r/GUI/Plater.cpp:2592 +#: src/slic3r/GUI/Plater.cpp:2712 msgid "Delete Object" msgstr "Eliminar Objeto" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:100 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 +#, c-format msgid "Delete Option %s" msgstr "Eliminar Opción %s" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/DoubleSlider.cpp:1518 +msgid "Delete pause print" +msgstr "Eliminar pausa de impresión" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 msgid "Delete selected" msgstr "Eliminar selección" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2830 msgid "Delete Selected" msgstr "Eliminar Selección" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2303 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2693 msgid "Delete Selected Item" msgstr "Eliminar Objeto Seleccionado" -#: src/slic3r/GUI/Plater.cpp:4083 +#: src/slic3r/GUI/Plater.cpp:4677 msgid "Delete Selected Objects" msgstr "Eliminar Objetos Seleccionados" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2152 msgid "Delete Settings" msgstr "Eliminar Ajustes" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1857 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2227 msgid "Delete Subobject" msgstr "Eliminar Subobjeto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:720 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631 msgid "Delete support point" msgstr "Borra punto de apoyo" -#: src/slic3r/GUI/Tab.cpp:131 +#: src/slic3r/GUI/Tab.cpp:134 msgid "Delete this preset" msgstr "Borra este ajuste" -#: src/slic3r/GUI/MainFrame.cpp:449 +#: src/slic3r/GUI/DoubleSlider.cpp:1035 +msgid "Delete tick mark - Left click or press \"-\" key" +msgstr "Eliminar marca de verificación - Click izquierdo o presionar tecla \"-\"" + +#: src/slic3r/GUI/DoubleSlider.cpp:1517 +msgid "Delete tool change" +msgstr "Eliminar cambio de herramienta" + +#: src/slic3r/GUI/MainFrame.cpp:576 msgid "Deletes all objects" msgstr "Borra todos los objetos" -#: src/slic3r/GUI/MainFrame.cpp:447 +#: src/slic3r/GUI/MainFrame.cpp:573 msgid "Deletes the current selection" msgstr "Borrar la selección actual" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:2504 msgid "Density" msgstr "Densidad" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:791 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:1200 src/slic3r/GUI/Tab.cpp:1584 -#: src/slic3r/GUI/Tab.cpp:1992 src/slic3r/GUI/Tab.cpp:2086 -#: src/slic3r/GUI/Tab.cpp:3336 src/slic3r/GUI/Tab.cpp:3445 +#: 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 msgid "Dependencies" msgstr "Dependencias" -#: src/libslic3r/PrintConfig.cpp:1542 src/libslic3r/PrintConfig.cpp:1543 +#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613 msgid "Deretraction Speed" msgstr "Velocidad de deretracción" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +msgid "Deselect all" +msgstr "Deseleccionar todo" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369 msgid "Deselect by rectangle" msgstr "Deseleccionar mediante rectángulo" -#: src/slic3r/GUI/MainFrame.cpp:492 +#: src/slic3r/GUI/MainFrame.cpp:569 msgid "Deselects all objects" msgstr "Deseleccionar todos los objetos" -#: src/libslic3r/PrintConfig.cpp:1304 +#: src/slic3r/GUI/Tab.cpp:963 +msgid "Detach from system preset" +msgstr "Separar del preajuste del sistema" + +#: src/slic3r/GUI/Tab.cpp:984 +msgid "Detach preset" +msgstr "Separar preajuste" + +#: src/slic3r/GUI/Tab.cpp:3029 +msgid "Detached" +msgstr "Separado" + +#: src/libslic3r/PrintConfig.cpp:1373 msgid "Detect bridging perimeters" msgstr "Detectar perímetros con puentes" -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:2075 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:1986 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "Detect thin walls" msgstr "Detecta paredes delgadas" -#: src/libslic3r/PrintConfig.cpp:3083 +#: src/libslic3r/PrintConfig.cpp:3472 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:1713 +#: src/slic3r/GUI/Plater.cpp:2368 msgid "Detected advanced data" msgstr "Datos avanzados detectados" -#: src/slic3r/GUI/BedShapeDialog.cpp:88 src/libslic3r/PrintConfig.cpp:677 +#: src/slic3r/GUI/Mouse3DController.cpp:289 +msgid "Device:" +msgstr "Dispositivo:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709 msgid "Diameter" msgstr "Diámetro" -#: src/libslic3r/PrintConfig.cpp:2443 +#: src/libslic3r/PrintConfig.cpp:2694 msgid "Diameter in mm of the pillar base" msgstr "Diámetro en mm del pilar de la base" -#: src/libslic3r/PrintConfig.cpp:2399 +#: src/libslic3r/PrintConfig.cpp:2650 msgid "Diameter in mm of the support pillars" msgstr "Diámetro en mm de los pilares de soporte" -#: src/libslic3r/PrintConfig.cpp:2371 +#: src/libslic3r/PrintConfig.cpp:2622 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:89 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 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:1569 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Direction" msgstr "Dirección" -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:359 msgid "Disable fan for the first" msgstr "Desactivar ventilador para la primera" -#: src/libslic3r/PrintConfig.cpp:1280 +#: src/libslic3r/PrintConfig.cpp:1349 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/wxExtensions.cpp:2572 -msgid "Discard all color changes" -msgstr "Descartar los cambios de color" +#: src/slic3r/GUI/DoubleSlider.cpp:952 +msgid "Discard all custom changes" +msgstr "Descartar todos los cambios personalizados" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1241 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1375 msgid "Discard changes" msgstr "Descartar los cambios" -#: src/slic3r/GUI/Tab.cpp:2784 +#: 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/Gizmos/GLGizmoMove.cpp:177 -msgid "Displacement (mm)" -msgstr "Desplazamiento (mm)" - -#: src/slic3r/GUI/Tab.cpp:2041 +#: src/slic3r/GUI/Tab.cpp:2078 msgid "Display" msgstr "Pantalla" -#: src/libslic3r/PrintConfig.cpp:2208 +#: src/libslic3r/PrintConfig.cpp:2359 msgid "Display height" msgstr "Altura de la pantalla" -#: src/libslic3r/PrintConfig.cpp:2319 +#: src/libslic3r/PrintConfig.cpp:2378 msgid "Display horizontal mirroring" msgstr "Espejo horizontal de la pantalla" -#: src/libslic3r/PrintConfig.cpp:2227 +#: src/libslic3r/PrintConfig.cpp:2392 msgid "Display orientation" msgstr "Orientación de la pantalla" -#: src/slic3r/GUI/MainFrame.cpp:510 +#: src/slic3r/GUI/MainFrame.cpp:648 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:2326 +#: src/libslic3r/PrintConfig.cpp:2385 msgid "Display vertical mirroring" msgstr "Espejo vertical de la pantalla" -#: src/libslic3r/PrintConfig.cpp:2202 +#: src/libslic3r/PrintConfig.cpp:2353 msgid "Display width" msgstr "Anchura de la pantalla" -#: src/libslic3r/PrintConfig.cpp:341 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Distance between copies" msgstr "Distancia entre copias" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1680 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:2752 +#: src/libslic3r/PrintConfig.cpp:2882 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:1609 +#: src/libslic3r/PrintConfig.cpp:1679 msgid "Distance from object" msgstr "Distancia del objeto" -#: src/slic3r/GUI/BedShapeDialog.cpp:80 +#: src/slic3r/GUI/BedShapeDialog.cpp:85 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:285 +#: src/libslic3r/PrintConfig.cpp:320 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:1338 +#: src/libslic3r/PrintConfig.cpp:1382 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:342 +#: src/libslic3r/PrintConfig.cpp:378 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:3097 +#: src/libslic3r/PrintConfig.cpp:3486 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:3041 +#: src/libslic3r/PrintConfig.cpp:3430 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:206 -#, 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/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/GUI_App.cpp:754 +#: src/slic3r/GUI/DoubleSlider.cpp:1920 +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 msgid "Do you want to proceed?" msgstr "¿Deseas continuar?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1024 +#: src/slic3r/GUI/Plater.cpp:3321 +msgid "Do you want to retry" +msgstr "Quieres volver a intentarlo" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1045 msgid "Do you want to save your manually edited support points?" msgstr "¿Deseas guardar tus puntos de soporte editados manualmente?" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:1834 +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 +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 msgid "Don't arrange" msgstr "No organizar" -#: src/slic3r/GUI/UpdateDialogs.cpp:55 +#: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" msgstr "No quiero recibir avisos de nuevas versiones" -#: src/libslic3r/PrintConfig.cpp:333 +#: src/libslic3r/PrintConfig.cpp:369 msgid "Don't support bridges" msgstr "No soportar puentes" @@ -1724,316 +2100,426 @@ msgstr "No soportar puentes" msgid "Downgrade" msgstr "Volver a una versión anterior" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1233 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1236 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1237 +#: src/libslic3r/PrintConfig.cpp:1695 +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 msgid "Drag" msgstr "Arrastra" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:340 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:355 +#: src/libslic3r/SLAPrintSteps.cpp:44 +msgid "Drilling holes into model." +msgstr "Taladrando agujeros en el modelo." + +#: src/libslic3r/SLAPrintSteps.cpp:199 +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 msgid "Drop to bed" msgstr "Colocar en la Cama" -#: src/libslic3r/PrintConfig.cpp:3044 +#: src/libslic3r/PrintConfig.cpp:3433 msgid "Duplicate" msgstr "Duplicar" -#: src/libslic3r/PrintConfig.cpp:3049 +#: src/libslic3r/PrintConfig.cpp:3438 msgid "Duplicate by grid" msgstr "Duplicar por cuadrícula" -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/slic3r/GUI/PresetHints.cpp:40 +msgid "During the other layers, fan" +msgstr "Durante las otras capas, el ventilador" + +#: src/libslic3r/PrintConfig.cpp:2669 msgid "Dynamic" msgstr "Dinámico" -#: src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/MainFrame.cpp:749 msgid "E&xport" msgstr "E&xportar" -#: src/slic3r/GUI/GUI_ObjectList.cpp:238 +#: src/slic3r/GUI/GUI_ObjectList.cpp:347 msgid "edges fixed" msgstr "esquimas reparadas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2690 +#: src/slic3r/GUI/DoubleSlider.cpp:1508 +msgid "Edit color" +msgstr "Editar color" + +#: src/slic3r/GUI/DoubleSlider.cpp:960 +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 +msgid "Edit custom G-code" +msgstr "Editar código G personalizado" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3003 msgid "Edit Height Range" msgstr "Editar Rango de Alturas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:373 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 +msgid "Edit pause print message" +msgstr "Editar mensaje de pausa de impresión" + +#: src/slic3r/GUI/DoubleSlider.cpp:1037 +msgid "Edit tick mark - Ctrl + Left click" +msgstr "Editar la marca - Ctrl+ Click izquierdo" + +#: src/slic3r/GUI/DoubleSlider.cpp:1038 +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 msgid "Editing" msgstr "Edición" -#: src/libslic3r/PrintConfig.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:547 +msgid "Ejec&t SD card / Flash drive" +msgstr "Expul&sa tarjeta SD / disco USB" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Eject SD card / Flash drive" +msgstr "Expulsa la tarjeta SD / disco USB" + +#: src/slic3r/GUI/MainFrame.cpp:547 +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 +msgid "Ejecting of device %s(%s) has failed." +msgstr "La expulsión del dispositivo %s(%s) ha fallado." + +#: src/libslic3r/PrintConfig.cpp:118 msgid "Elephant foot compensation" msgstr "Compensación del pie de elefante" -#: src/libslic3r/SLAPrint.cpp:681 -msgid "Elevation is too low for object. Use the \"Pad around obect\" feature to print the object without elevation." -msgstr "La elevación es demasiado baja para el objeto. Utiliza la función \"Pad alrededor del objeto\" para imprimir el objeto sin elevación." +#: src/libslic3r/PrintConfig.cpp:2447 +msgid "Elephant foot minimum width" +msgstr "Ancho mínimo del pie de elefante" -#: src/libslic3r/SLAPrint.cpp:678 +#: src/libslic3r/SLAPrint.cpp:625 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:1044 +#: src/libslic3r/PrintConfig.cpp:1093 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/slic3r/GUI/Tab.cpp:1490 src/libslic3r/PrintConfig.cpp:1286 -#: src/libslic3r/PrintConfig.cpp:2099 +#: src/libslic3r/GCode.cpp:637 +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 msgid "Enable" msgstr "Habilitar" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:313 msgid "Enable auto cooling" msgstr "Habilitar el enfriamiento automático" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:572 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:2321 +#: src/libslic3r/PrintConfig.cpp:2908 +msgid "Enable hollowing" +msgstr "Habilitar vaciado" + +#: src/libslic3r/PrintConfig.cpp:2380 msgid "Enable horizontal mirroring of output images" msgstr "Activar espejo horizontal de salida de imágenes" -#: src/libslic3r/PrintConfig.cpp:1781 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Enable support material generation." msgstr "Habilite la generación de material de soporte." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:966 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:881 +#: src/libslic3r/PrintConfig.cpp:929 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:2085 +#: src/libslic3r/PrintConfig.cpp:2186 msgid "Enable variable layer height feature" msgstr "Habilitar la función de altura de capa variable" -#: src/libslic3r/PrintConfig.cpp:2328 +#: src/libslic3r/PrintConfig.cpp:2387 msgid "Enable vertical mirroring of output images" msgstr "Activar espejo vertical de salida de imágenes" -#: src/slic3r/GUI/Tab.cpp:1570 src/slic3r/GUI/Tab.cpp:1955 -#: src/libslic3r/PrintConfig.cpp:359 src/libslic3r/PrintConfig.cpp:369 +#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:1982 +#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 msgid "End G-code" msgstr "Código G final" -#: src/libslic3r/PrintConfig.cpp:1838 +#: src/libslic3r/PrintConfig.cpp:1924 msgid "Enforce support for the first" msgstr "Forzar soportes para la primera" -#: src/libslic3r/PrintConfig.cpp:1845 +#: src/libslic3r/PrintConfig.cpp:1931 msgid "Enforce support for the first n layers" msgstr "Aplicar soportes para las primeras n capas" -#: src/slic3r/GUI/PrintHostDialogs.cpp:197 -#: src/slic3r/GUI/PrintHostDialogs.cpp:228 +#: src/slic3r/GUI/PrintHostDialogs.cpp:198 +#: src/slic3r/GUI/PrintHostDialogs.cpp:229 msgid "Enqueued" msgstr "En cola" -#: src/libslic3r/PrintConfig.cpp:380 +#: src/libslic3r/PrintConfig.cpp:407 msgid "Ensure vertical shell thickness" msgstr "Asegurar el espesor de la carcasa vertical" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 +#: src/slic3r/GUI/DoubleSlider.cpp:1618 +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 msgid "Enter new name" msgstr "Introduce un nuevo nombre" -#: src/slic3r/GUI/ConfigWizard.cpp:622 +#: src/slic3r/GUI/DoubleSlider.cpp:1634 +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 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:570 +#: src/slic3r/GUI/ConfigWizard.cpp:979 msgid "Enter the diameter of your filament." msgstr "Introduce el diámetro de tu filamento." -#: src/slic3r/GUI/ConfigWizard.cpp:557 +#: src/slic3r/GUI/ConfigWizard.cpp:966 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/ConfigWizard.cpp:608 +#: src/slic3r/GUI/DoubleSlider.cpp:1650 +msgid "Enter the height you want to jump to" +msgstr "Introduce la altura a la que deseas saltar" + +#: src/slic3r/GUI/Plater.cpp:4751 +msgid "Enter the number of copies:" +msgstr "Introduce el número de copias:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1033 msgid "Enter the temperature needed for extruding your filament." msgstr "Introduce la temperatura necesaria para extruir tu filamento." -#: src/libslic3r/PrintConfig.cpp:718 +#: src/libslic3r/PrintConfig.cpp:761 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:686 +#: src/libslic3r/PrintConfig.cpp:718 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:678 +#: src/libslic3r/PrintConfig.cpp:710 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:636 src/slic3r/GUI/PrintHostDialogs.cpp:230 +#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:785 +#: src/slic3r/GUI/PrintHostDialogs.cpp:231 msgid "Error" msgstr "Error" -#: src/slic3r/GUI/FirmwareDialog.cpp:608 -#, possible-c-format +#: src/slic3r/GUI/FirmwareDialog.cpp:645 +#, c-format msgid "Error accessing port at %s: %s" msgstr "Error al acceder al puerto en %s: %s" -#: src/slic3r/GUI/Plater.cpp:3593 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:3433 +msgid "Error during reload" +msgstr "Error al recargar" + +#: src/slic3r/GUI/Plater.cpp:5043 +#, c-format msgid "Error exporting 3MF file %s" msgstr "Error al exportar archivo 3MF %s" -#: src/slic3r/GUI/Plater.cpp:3564 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:5005 +#, c-format msgid "Error exporting AMF file %s" msgstr "Error exportando archivo AMF %s" -#: src/slic3r/GUI/PrintHostDialogs.cpp:153 +#: src/slic3r/GUI/PrintHostDialogs.cpp:154 msgid "Error Message" msgstr "Mensaje de Error" -#: src/slic3r/GUI/PrintHostDialogs.cpp:271 +#: src/slic3r/GUI/AppConfig.cpp:114 +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." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:272 msgid "Error uploading to print host:" msgstr "Error al cargar a la impresora:" -#: src/libslic3r/Zipper.cpp:105 +#: src/libslic3r/Zipper.cpp:102 msgid "Error with zip archive" msgstr "Error con el archivo ZIP" -#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/GUI_ObjectList.cpp:1443 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1918 msgid "Error!" msgstr "¡Error!" -#: src/slic3r/GUI/BedShapeDialog.cpp:482 +#: src/slic3r/GUI/BedShapeDialog.cpp:505 msgid "Error! Invalid model" msgstr "Error! Modelo inválido" -#: src/slic3r/GUI/FirmwareDialog.cpp:610 -#, possible-c-format +#: src/slic3r/GUI/FirmwareDialog.cpp:647 +#, c-format msgid "Error: %s" msgstr "Error: %s" -#: src/slic3r/GUI/Plater.cpp:1503 +#: src/slic3r/GUI/Job.hpp:123 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:217 src/slic3r/GUI/Plater.cpp:1028 -#: src/slic3r/GUI/Plater.cpp:1070 +#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1216 +#: src/slic3r/GUI/Plater.cpp:1258 msgid "Estimated printing time" msgstr "Tiempo estimado de impresión" -#: src/slic3r/GUI/Plater.cpp:424 +#: src/slic3r/GUI/Plater.cpp:502 msgid "Everywhere" msgstr "En todos los sitios" -#: src/slic3r/GUI/PresetHints.cpp:50 +#: src/slic3r/GUI/PresetHints.cpp:51 msgid "except for the first %1% layers." msgstr "a excepción de las %1% primeras capas." -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:53 msgid "except for the first layer." msgstr "a excepción de la primera capa." -#: src/libslic3r/Print.cpp:1285 +#: src/libslic3r/Print.cpp:1377 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:148 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 +#, c-format msgid "Exit %s" msgstr "Salir %s" -#: src/libslic3r/PrintConfig.cpp:335 +#: src/libslic3r/PrintConfig.cpp:371 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:1306 +#: src/libslic3r/PrintConfig.cpp:1375 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:676 src/slic3r/GUI/wxExtensions.cpp:2461 +#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755 msgid "Expert" msgstr "Experto" -#: src/slic3r/GUI/GUI_App.cpp:676 +#: src/slic3r/GUI/ConfigWizard.cpp:822 +msgid "Expert mode" +msgstr "Modo experto" + +#: src/slic3r/GUI/GUI_App.cpp:815 msgid "Expert View Mode" msgstr "Modo de visualización experto" -#: src/slic3r/GUI/MainFrame.cpp:602 src/slic3r/GUI/Plater.cpp:3821 +#: src/slic3r/GUI/Plater.cpp:5521 msgid "Export" msgstr "Exportar" -#: src/slic3r/GUI/MainFrame.cpp:373 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export &Config" msgstr "Exportar &Configuración" -#: src/slic3r/GUI/MainFrame.cpp:362 src/slic3r/GUI/MainFrame.cpp:602 +#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:749 msgid "Export &G-code" -msgstr "Exportar &código G" +msgstr "Exportar código &G" -#: src/slic3r/GUI/MainFrame.cpp:488 +#: src/slic3r/GUI/MainFrame.cpp:496 msgid "Export &toolpaths as OBJ" msgstr "Exportar &trayectorias de herramientas como OBJ" -#: src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Export 3MF" msgstr "Exportar 3MF" -#: src/slic3r/GUI/MainFrame.cpp:375 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export all presets to file" msgstr "Exportar todos los preajustes al archivo" -#: src/libslic3r/PrintConfig.cpp:2954 +#: src/libslic3r/PrintConfig.cpp:3343 msgid "Export AMF" msgstr "Exportar AMF" -#: src/slic3r/GUI/Plater.cpp:1932 +#: src/slic3r/GUI/Plater.cpp:2598 msgid "Export AMF file:" msgstr "Exportar archivo AMF:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1219 src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1657 src/slic3r/GUI/Plater.cpp:3966 msgid "Export as STL" msgstr "Exportar como STL" -#: src/slic3r/GUI/MainFrame.cpp:375 -msgid "Export Config &Bundle" -msgstr "Exportar &Conjunto de Ajustes" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +msgid "Export config" +msgstr "Exportar configuración" -#: src/slic3r/GUI/MainFrame.cpp:373 +#: src/slic3r/GUI/MainFrame.cpp:503 +msgid "Export Config &Bundle" +msgstr "Exportar Conjunto de A&justes" + +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export current configuration to file" msgstr "Exportar la configuración actual al archivo" -#: src/slic3r/GUI/MainFrame.cpp:370 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export current plate as AMF" msgstr "Exportar plataforma actual como AMF" -#: src/slic3r/GUI/MainFrame.cpp:362 +#: src/slic3r/GUI/MainFrame.cpp:477 msgid "Export current plate as G-code" msgstr "Exportar plataforma actual como código G" -#: src/slic3r/GUI/MainFrame.cpp:366 +#: src/slic3r/GUI/MainFrame.cpp:521 +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 msgid "Export current plate as STL" msgstr "Exportar plataforma actual como STL" -#: src/slic3r/GUI/MainFrame.cpp:368 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export current plate as STL including supports" msgstr "Exportar la plataforma actual como STL incluyendo soportes" -#: src/slic3r/GUI/Plater.cpp:2722 +#: src/slic3r/GUI/Plater.cpp:3664 msgid "Export failed" msgstr "Error al exportar" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/Plater.cpp:733 -#: src/slic3r/GUI/Plater.cpp:3821 src/libslic3r/PrintConfig.cpp:2964 +#: src/slic3r/GUI/ConfigWizard.cpp:801 +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 msgid "Export G-code" msgstr "Exportar código G" -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/slic3r/GUI/MainFrame.cpp:521 +msgid "Export G-code to SD card / Flash drive" +msgstr "Exporta G-code a la tarjeta SD / disco USB" + +#: src/libslic3r/PrintConfig.cpp:3320 msgid "Export OBJ" msgstr "Exportar OBJ" -#: src/slic3r/GUI/Plater.cpp:2531 +#: src/slic3r/GUI/Plater.cpp:2610 msgid "Export OBJ file:" msgstr "Exportar archivo OBJ:" @@ -2041,55 +2527,63 @@ 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:370 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export plate as &AMF" msgstr "Exportar plataforma como &AMF" -#: src/slic3r/GUI/MainFrame.cpp:366 +#: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export plate as &STL" msgstr "Exportar plataforma como &STL" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export plate as STL &including supports" msgstr "Exportar plataforma como STL &incluyendo soportes" -#: src/libslic3r/PrintConfig.cpp:2943 +#: src/libslic3r/PrintConfig.cpp:3332 msgid "Export SLA" msgstr "Exportar SLA" -#: src/libslic3r/PrintConfig.cpp:2959 +#: src/slic3r/GUI/Preferences.cpp:72 +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 msgid "Export STL" msgstr "Exportar STL" -#: src/slic3r/GUI/Plater.cpp:1925 +#: src/slic3r/GUI/Plater.cpp:2591 msgid "Export STL file:" msgstr "Exportar archivo STL:" -#: src/libslic3r/PrintConfig.cpp:2950 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "Export the model(s) as 3MF." msgstr "Exportar el(los) objeto(s) como 3MF." -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3344 msgid "Export the model(s) as AMF." msgstr "Exportar el(los) objeto(s) como AMF." -#: src/libslic3r/PrintConfig.cpp:2932 +#: src/libslic3r/PrintConfig.cpp:3321 msgid "Export the model(s) as OBJ." msgstr "Exportar el(los) objeto(s) como OBJ." -#: src/libslic3r/PrintConfig.cpp:2960 +#: src/libslic3r/PrintConfig.cpp:3349 msgid "Export the model(s) as STL." msgstr "Exportar el(los) objeto(s) como STL." -#: src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/Plater.cpp:3966 msgid "Export the selected object as STL file" msgstr "Exportar el objeto seleccionado como archivo STL" -#: src/slic3r/GUI/MainFrame.cpp:488 +#: src/slic3r/GUI/Plater.cpp:880 +msgid "Export to SD card / Flash drive" +msgstr "Exportar a tarjeta SD / tarjeta Flash" + +#: src/slic3r/GUI/MainFrame.cpp:496 msgid "Export toolpaths as OBJ" msgstr "Exportar trayectorias de herramientas como OBJ" -#: src/libslic3r/Print.cpp:1517 +#: src/libslic3r/Print.cpp:1638 msgid "Exporting G-code" msgstr "Exportando código G" @@ -2102,139 +2596,143 @@ msgstr "Exportando el modelo..." msgid "Exporting source model" msgstr "Exportando el modelo original" -#: src/libslic3r/SLAPrint.cpp:700 +#: src/libslic3r/SLAPrint.cpp:646 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:3306 +#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:3515 msgid "Exposure" msgstr "Exposición" -#: src/libslic3r/PrintConfig.cpp:2310 src/libslic3r/PrintConfig.cpp:2311 +#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542 msgid "Exposure time" msgstr "Tiempo de exposición" -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/GCode/PreviewData.cpp:164 +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311 msgid "External perimeter" msgstr "Perímetro externo" -#: src/slic3r/GUI/PresetHints.cpp:153 +#: src/slic3r/GUI/PresetHints.cpp:156 msgid "external perimeters" msgstr "perímetros externos" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:425 +#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457 msgid "External perimeters" msgstr "Perímetros externos" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:469 msgid "External perimeters first" msgstr "Perímetros externos primero" -#: src/libslic3r/PrintConfig.cpp:1518 src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596 msgid "Extra length on restart" msgstr "Longitud adicional en el reinicio" -#: src/libslic3r/PrintConfig.cpp:1321 +#: src/libslic3r/PrintConfig.cpp:1390 msgid "Extra loading distance" msgstr "Distancia de carga adicional" -#: src/libslic3r/PrintConfig.cpp:445 +#: src/libslic3r/PrintConfig.cpp:477 msgid "Extra perimeters if needed" msgstr "Perímetros adicionales si es necesario" -#: src/slic3r/GUI/GUI_ObjectList.cpp:335 src/slic3r/GUI/Tab.cpp:1479 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1434 +#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487 msgid "Extruder" msgstr "Extrusor" -#: src/slic3r/GUI/Tab.cpp:2253 src/libslic3r/GCode/PreviewData.cpp:475 -#, possible-c-format +#: 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 msgid "Extruder %d" msgstr "Extrusor %d" -#: src/slic3r/GUI/ConfigWizard.cpp:592 +#: src/slic3r/GUI/DoubleSlider.cpp:1011 +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:226 +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" msgstr "El extrusor cambia a" -#: src/slic3r/GUI/Tab.cpp:1171 +#: src/slic3r/GUI/Tab.cpp:1233 msgid "Extruder clearance (mm)" msgstr "Distancia libre del extrusor (mm)" -#: src/libslic3r/PrintConfig.cpp:490 +#: src/libslic3r/PrintConfig.cpp:522 msgid "Extruder Color" msgstr "Color del extrusor" -#: src/libslic3r/PrintConfig.cpp:497 +#: src/libslic3r/PrintConfig.cpp:529 msgid "Extruder offset" msgstr "Offset del extrusor" -#: src/libslic3r/PrintConfig.cpp:863 +#: 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:1978 +#: 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:33 src/slic3r/GUI/GUI_ObjectList.cpp:72 -#: src/slic3r/GUI/GUI_ObjectList.cpp:513 src/slic3r/GUI/Tab.cpp:1119 -#: src/slic3r/GUI/Tab.cpp:1844 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:954 src/libslic3r/PrintConfig.cpp:1340 -#: src/libslic3r/PrintConfig.cpp:1668 src/libslic3r/PrintConfig.cpp:1852 -#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:2151 -#: src/libslic3r/PrintConfig.cpp:2159 +#: 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 msgid "Extruders" msgstr "Extrusores" -#: src/libslic3r/PrintConfig.cpp:507 +#: src/libslic3r/PrintConfig.cpp:539 msgid "Extrusion axis" msgstr "Eje de extrusión" -#: src/libslic3r/PrintConfig.cpp:513 +#: src/libslic3r/PrintConfig.cpp:545 msgid "Extrusion multiplier" msgstr "Multiplicador de extrusión" -#: src/slic3r/GUI/ConfigWizard.cpp:612 +#: src/slic3r/GUI/ConfigWizard.cpp:1037 msgid "Extrusion Temperature:" msgstr "Temperatura de Extrusión:" -#: src/slic3r/GUI/Tab.cpp:1143 +#: src/slic3r/GUI/Tab.cpp:1205 msgid "Extrusion width" msgstr "Ancho de extrusión" -#: src/slic3r/GUI/GUI_ObjectList.cpp:73 src/slic3r/GUI/GUI_ObjectList.cpp:514 -#: src/libslic3r/PrintConfig.cpp:416 src/libslic3r/PrintConfig.cpp:523 -#: src/libslic3r/PrintConfig.cpp:830 src/libslic3r/PrintConfig.cpp:962 -#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1688 -#: src/libslic3r/PrintConfig.cpp:1861 src/libslic3r/PrintConfig.cpp:2018 +#: 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 msgid "Extrusion Width" msgstr "Ancho de Extrusión" -#: src/slic3r/GUI/Plater.cpp:139 +#: src/slic3r/GUI/Plater.cpp:162 msgid "Facets" msgstr "Facetas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:240 +#: src/slic3r/GUI/GUI_ObjectList.cpp:349 msgid "facets added" msgstr "facetas añadidas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:239 +#: src/slic3r/GUI/GUI_ObjectList.cpp:348 msgid "facets removed" msgstr "facetas retiradas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:241 +#: src/slic3r/GUI/GUI_ObjectList.cpp:350 msgid "facets reversed" msgstr "facetas invertidas" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2517 msgid "Faded layers" msgstr "Capas descoloridas" -#: src/libslic3r/Zipper.cpp:47 +#: src/libslic3r/Zipper.cpp:44 msgid "failed finding central directory" msgstr "búsqueda de directorio central fallida" @@ -2242,165 +2740,181 @@ 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:65 +#: src/libslic3r/PrintBase.cpp:71 msgid "Failed processing of the output_filename_format template." msgstr "Error al procesar la plantilla output_filename_format." -#: src/slic3r/GUI/PresetHints.cpp:41 +#: src/slic3r/GUI/PresetHints.cpp:42 msgid "Fan" msgstr "Ventilador" -#: src/slic3r/GUI/Tab.cpp:1501 +#: src/slic3r/GUI/Tab.cpp:1456 msgid "Fan settings" msgstr "Configuración del ventilador" -#: src/slic3r/GUI/Tab.cpp:1502 +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1457 msgid "Fan speed" msgstr "Velocidad del ventilador" -#: src/libslic3r/PrintConfig.cpp:2240 +#: src/libslic3r/GCode/PreviewData.cpp:353 +msgid "Fan Speed (%)" +msgstr "Velocidad Ventilador (%)" + +#: src/libslic3r/PrintConfig.cpp:2405 msgid "Fast" msgstr "Rápida" -#: src/libslic3r/PrintConfig.cpp:2241 +#: src/libslic3r/PrintConfig.cpp:2406 msgid "Fast tilt" msgstr "Inclinación rápida" -#: src/slic3r/GUI/GUI_App.cpp:135 +#: src/slic3r/GUI/GUI_App.cpp:141 msgid "Fatal error" msgstr "Error fatal" -#: src/slic3r/GUI/GUI_Preview.cpp:212 src/slic3r/GUI/GUI_Preview.cpp:537 -#: src/libslic3r/GCode/PreviewData.cpp:394 +#: 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 función" -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:225 +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235 msgid "Feature types" msgstr "Tipos de funciones" -#: src/slic3r/GUI/Plater.cpp:682 src/slic3r/GUI/Tab.cpp:1470 -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/ConfigWizard.cpp:1525 +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 msgid "Filament" msgstr "Filamento" -#: src/slic3r/GUI/Preset.cpp:1275 +#: src/slic3r/GUI/Preset.cpp:1522 msgid "filament" msgstr "filamento" -#: src/slic3r/GUI/ConfigWizard.cpp:541 +#: src/slic3r/GUI/ConfigWizard.cpp:952 msgid "Filament and Nozzle Diameters" msgstr "Filamento y diámetros de boquilla" -#: src/slic3r/GUI/ConfigWizard.cpp:574 +#: src/slic3r/GUI/ConfigWizard.cpp:983 msgid "Filament Diameter:" msgstr "Diámetro del filamento:" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:651 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:654 +#: src/libslic3r/PrintConfig.cpp:686 msgid "Filament load time" msgstr "Tiempo de carga de filamento" -#: src/libslic3r/PrintConfig.cpp:556 +#: src/libslic3r/PrintConfig.cpp:588 msgid "Filament notes" msgstr "Notas del filamento" -#: src/slic3r/GUI/Tab.cpp:1502 src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1378 msgid "Filament Overrides" msgstr "Anulaciones de filamentos" -#: src/libslic3r/PrintConfig.cpp:1312 +#: src/libslic3r/PrintConfig.cpp:1381 msgid "Filament parking position" msgstr "Posición de aparcar el filamento" -#: src/slic3r/GUI/Tab.cpp:1516 +#: src/slic3r/GUI/ConfigWizard.cpp:2013 +msgid "Filament Profiles Selection" +msgstr "Selección Perfiles de Filamento" + +#: src/slic3r/GUI/Tab.cpp:1471 msgid "Filament properties" msgstr "Propiedades del filamento" -#: src/slic3r/GUI/Tab.hpp:335 +#: src/slic3r/GUI/Tab.hpp:355 msgid "Filament Settings" msgstr "Configuración del filamento" -#: src/libslic3r/PrintConfig.cpp:694 +#: src/libslic3r/PrintConfig.cpp:726 msgid "Filament type" msgstr "Tipo de filamento" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:701 msgid "Filament unload time" msgstr "Tiempo de descarga del filamento" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "filaments" msgstr "filamentos" -#: src/libslic3r/Zipper.cpp:75 +#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2013 +msgid "Filaments" +msgstr "Filamentos" + +#: src/libslic3r/Zipper.cpp:72 msgid "file close failed" msgstr "cierre del archivo fallido" -#: src/libslic3r/Zipper.cpp:69 +#: src/libslic3r/Zipper.cpp:66 msgid "file create failed" msgstr "creación del archivo fallida" -#: src/slic3r/GUI/MainFrame.cpp:642 +#: src/slic3r/GUI/MainFrame.cpp:791 msgid "File Not Found" msgstr "Archivo no encontrado" -#: src/libslic3r/Zipper.cpp:89 +#: src/libslic3r/Zipper.cpp:86 msgid "file not found" msgstr "archivo no encontrado" -#: src/libslic3r/Zipper.cpp:67 +#: src/libslic3r/Zipper.cpp:64 msgid "file open failed" msgstr "apertura de archivo fallida" -#: src/libslic3r/Zipper.cpp:73 +#: src/libslic3r/Zipper.cpp:70 msgid "file read failed" msgstr "lectura del archivo fallida" -#: src/libslic3r/Zipper.cpp:77 +#: src/libslic3r/Zipper.cpp:74 msgid "file seek failed" msgstr "búsqueda de archivo fallida" -#: src/libslic3r/Zipper.cpp:79 +#: src/libslic3r/Zipper.cpp:76 msgid "file stat failed" msgstr "estadística de archivos fallida" -#: src/libslic3r/Zipper.cpp:39 +#: src/libslic3r/Zipper.cpp:36 msgid "file too large" msgstr "archivo demasiado grande" -#: src/libslic3r/Zipper.cpp:71 +#: src/libslic3r/Zipper.cpp:68 msgid "file write failed" msgstr "escritura del archivo fallida" -#: src/slic3r/GUI/PrintHostDialogs.cpp:152 +#: src/slic3r/GUI/PrintHostDialogs.cpp:153 msgid "Filename" msgstr "Nombre de archivo" -#: src/libslic3r/PrintConfig.cpp:728 +#: src/libslic3r/PrintConfig.cpp:775 msgid "Fill angle" msgstr "Ángulo de relleno" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:789 msgid "Fill density" msgstr "Densidad de relleno" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:826 msgid "Fill pattern" msgstr "Patrón de relleno" -#: src/libslic3r/PrintConfig.cpp:410 +#: src/libslic3r/PrintConfig.cpp:437 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:781 +#: src/libslic3r/PrintConfig.cpp:828 msgid "Fill pattern for general low-density infill." msgstr "Patrón de relleno para el relleno general de baja densidad." -#: src/libslic3r/PrintConfig.cpp:390 +#: src/libslic3r/PrintConfig.cpp:417 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." @@ -2408,364 +2922,475 @@ msgstr "Patrón de relleno para el relleno superior. Esto solo afecta a la capa msgid "Finished" msgstr "Terminado" -#: src/slic3r/GUI/ConfigWizard.cpp:486 src/slic3r/GUI/Tab.cpp:1920 +#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1947 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/FirmwareDialog.cpp:740 +#: src/slic3r/GUI/FirmwareDialog.cpp:777 msgid "Firmware flasher" msgstr "Flasheador de firmware" -#: src/slic3r/GUI/FirmwareDialog.cpp:765 +#: src/slic3r/GUI/FirmwareDialog.cpp:802 msgid "Firmware image:" msgstr "Imagen del firmware:" -#: src/slic3r/GUI/Tab.cpp:2431 +#: src/slic3r/GUI/Tab.cpp:2577 msgid "Firmware Retraction" msgstr "Retracción del firmware" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:891 msgid "Firmware Type" msgstr "Tipo de Firmware" -#: src/libslic3r/PrintConfig.cpp:812 src/libslic3r/PrintConfig.cpp:821 -#: src/libslic3r/PrintConfig.cpp:829 src/libslic3r/PrintConfig.cpp:862 +#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868 +#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910 msgid "First layer" msgstr "Primera capa" -#: src/libslic3r/PrintConfig.cpp:841 +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889 msgid "First layer height" msgstr "Altura de la primera capa" -#: src/libslic3r/Print.cpp:1328 +#: src/libslic3r/Print.cpp:1422 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:852 +#: src/libslic3r/PrintConfig.cpp:900 msgid "First layer speed" msgstr "Velocidad de la primera capa" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "First layer volumetric" msgstr "Primera capa volumétrica" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1210 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 msgid "Fix through the Netfabb" msgstr "Reparar mediante Netfabb" -#: src/slic3r/GUI/Plater.cpp:3072 +#: src/slic3r/GUI/Plater.cpp:3473 msgid "Fix Throught NetFabb" msgstr "Reparar mediante NetFabb" -#: src/slic3r/GUI/GUI_App.cpp:685 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Flash printer &firmware" msgstr "Grabar &firmware en la impresora" -#: src/slic3r/GUI/FirmwareDialog.cpp:146 +#: src/slic3r/GUI/FirmwareDialog.cpp:150 msgid "Flash!" msgstr "Flash!" -#: src/slic3r/GUI/FirmwareDialog.cpp:275 +#: src/slic3r/GUI/FirmwareDialog.cpp:284 msgid "Flashing cancelled." msgstr "Flasheo cancelado." -#: src/slic3r/GUI/FirmwareDialog.cpp:192 +#: src/slic3r/GUI/FirmwareDialog.cpp:199 msgid "Flashing failed" msgstr "Falló el flasheo" -#: src/slic3r/GUI/FirmwareDialog.cpp:274 +#: src/slic3r/GUI/FirmwareDialog.cpp:283 msgid "Flashing failed. Please see the avrdude log below." msgstr "Flasheo fallido. Por favor comprueba el log de avrdude." -#: src/slic3r/GUI/FirmwareDialog.cpp:148 +#: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flashing in progress. Please do not disconnect the printer!" msgstr "Flasheo en curso. ¡Por favor no desconecte la impresora!" -#: src/slic3r/GUI/FirmwareDialog.cpp:273 +#: src/slic3r/GUI/FirmwareDialog.cpp:282 msgid "Flashing succeeded!" msgstr "¡Exito al flashear!" -#: src/slic3r/GUI/Tab.cpp:1156 +#: src/slic3r/GUI/Tab.cpp:1218 msgid "Flow" msgstr "Flujo" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:220 msgid "flow rate is maximized" msgstr "se maximiza el flujo de material" -#: src/slic3r/GUI/UpdateDialogs.cpp:188 +#: src/slic3r/GUI/UpdateDialogs.cpp:286 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:435 src/slic3r/GUI/Plater.cpp:528 +#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Plater.cpp:624 msgid "For support enforcers only" msgstr "Sólo para modificadores de soportes" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3345 -msgid "for the left button: \tindicates a non-system (or non-default) preset,\nfor the right button: \tindicates 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/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/libslic3r/Print.cpp:1302 +#: 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/libslic3r/Print.cpp:1396 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:1660 +#: src/libslic3r/PrintConfig.cpp:2864 +msgid "Force pad around object everywhere" +msgstr "Forzar el pad alrededor del objeto en todas partes" + +#: src/libslic3r/PrintConfig.cpp:1729 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:1023 +#: src/libslic3r/PrintConfig.cpp:1072 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." -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 msgid "From" msgstr "Desde" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1853 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2223 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:525 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front" msgstr "Frontal" -#: src/slic3r/GUI/MainFrame.cpp:525 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front View" msgstr "Vista frontal" -#: src/slic3r/GUI/MainFrame.cpp:677 +#: src/slic3r/GUI/Tab.cpp:1013 +msgid "full profile name" +msgstr "nombre completo perfil" + +#: src/slic3r/GUI/MainFrame.cpp:826 msgid "G-code" msgstr "Código G" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:87 +#: 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/BackgroundSlicingProcess.cpp:130 msgid "G-code file exported to %1%" msgstr "Archivo de código G exportado a %1%" -#: src/libslic3r/PrintConfig.cpp:888 +#: src/libslic3r/PrintConfig.cpp:936 msgid "G-code flavor" msgstr "Tipo de código G" -#: src/libslic3r/PrintConfig.cpp:689 +#: src/libslic3r/PrintConfig.cpp:721 msgid "g/cm³" msgstr "g/cm³" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/PrintConfig.cpp:870 -#: src/libslic3r/GCode/PreviewData.cpp:170 +#: src/libslic3r/PrintConfig.cpp:2505 +msgid "g/ml" +msgstr "g/ml" + +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/PrintConfig.cpp:918 msgid "Gap fill" msgstr "Relleno" -#: src/slic3r/GUI/Preferences.cpp:19 src/slic3r/GUI/Tab.cpp:1812 -#: src/slic3r/GUI/Tab.cpp:2013 +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1796 +#: src/slic3r/GUI/Tab.cpp:2040 msgid "General" msgstr "General" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1307 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:1779 +#: src/libslic3r/PrintConfig.cpp:1865 msgid "Generate support material" msgstr "Generar material de soporte" -#: src/libslic3r/PrintConfig.cpp:1840 +#: src/libslic3r/PrintConfig.cpp:1926 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:2362 +#: src/libslic3r/PrintConfig.cpp:2613 msgid "Generate supports" msgstr "Generar soportes" -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2615 msgid "Generate supports for the models" msgstr "Generar soportes para los modelos" -#: src/libslic3r/Print.cpp:1492 +#: src/libslic3r/Print.cpp:1614 msgid "Generating brim" msgstr "Generando balsa" -#: src/libslic3r/Print.cpp:1524 +#: src/libslic3r/Print.cpp:1642 msgid "Generating G-code" msgstr "Generando G-code" -#: src/libslic3r/SLAPrint.cpp:58 +#: src/libslic3r/SLAPrintSteps.cpp:48 msgid "Generating pad" msgstr "Generando pad" -#: src/libslic3r/PrintObject.cpp:141 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "Generando perímetros" -#: src/libslic3r/Print.cpp:1484 +#: src/libslic3r/Print.cpp:1606 msgid "Generating skirt" msgstr "Generando falda" -#: src/libslic3r/PrintObject.cpp:391 +#: src/libslic3r/PrintObject.cpp:395 msgid "Generating support material" msgstr "Generando material de soporte" -#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:809 +#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356 msgid "Generating support points" msgstr "Generando puntos de soporte" -#: src/libslic3r/SLAPrint.cpp:57 +#: src/libslic3r/SLAPrintSteps.cpp:47 msgid "Generating support tree" msgstr "Generando soporte tipo árbol" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2022 msgid "Generic" msgstr "Genérico" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 msgid "Gizmo cut" msgstr "Corte Gizmo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Gizmo move" msgstr "Movimiento Gizmo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Gizmo Place face on bed" msgstr "Gizmo Colocar cara en la base" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Gizmo rotate" msgstr "Rotación Gizmo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Gizmo scale" msgstr "Escala Gizmo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +msgid "Gizmo SLA hollow" +msgstr "Gizmo SLA vaciado" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 msgid "Gizmo SLA support points" msgstr "Puntos de soporte SLA Gizmo" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:641 +#: src/slic3r/GUI/GLCanvas3D.cpp:2921 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 msgid "Gizmo-Move" msgstr "Gizmo-Mover" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:569 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:489 msgid "Gizmo-Place on Face" msgstr "Gizmo-Colocar en Cara" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:651 +#: src/slic3r/GUI/GLCanvas3D.cpp:3001 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:564 msgid "Gizmo-Rotate" msgstr "Gizmo-Rotar" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:646 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:563 msgid "Gizmo-Scale" msgstr "Gizmo-Escalar" -#: src/slic3r/GUI/AboutDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +msgid "Gizmos" +msgstr "Gizmos" + +#: src/slic3r/GUI/AboutDialog.cpp:259 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, versión 3" -#: src/slic3r/GUI/ConfigWizard.cpp:571 +#: src/slic3r/GUI/ConfigWizard.cpp:980 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:797 +#: src/libslic3r/PrintConfig.cpp:844 msgid "Grid" msgstr "Rejilla" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1846 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2454 msgid "Group manipulation" msgstr "Manipulación de grupos" -#: src/libslic3r/PrintConfig.cpp:805 +#: src/slic3r/GUI/Preferences.cpp:133 +msgid "GUI" +msgstr "IU" + +#: src/libslic3r/PrintConfig.cpp:852 msgid "Gyroid" msgstr "Giroide" -#: src/slic3r/GUI/Tab.cpp:2775 +#: 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:840 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 msgid "Head diameter" msgstr "Diámetro de la cabeza" -#: src/libslic3r/PrintConfig.cpp:822 +#: src/slic3r/GUI/ConfigManipulation.cpp:317 +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 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." -#: src/slic3r/GUI/GUI_Preview.cpp:213 src/libslic3r/PrintConfig.cpp:468 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500 msgid "Height" msgstr "Altura" -#: src/libslic3r/GCode/PreviewData.cpp:396 +#: src/libslic3r/GCode/PreviewData.cpp:347 msgid "Height (mm)" msgstr "Altura (mm)" -#: src/libslic3r/PrintConfig.cpp:1618 +#: src/libslic3r/PrintConfig.cpp:1688 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:2209 +#: src/libslic3r/PrintConfig.cpp:2360 msgid "Height of the display" msgstr "Altura de la pantalla" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1350 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1500 msgid "Height range Modifier" msgstr "Modificador Rango de Alturas" -#: src/slic3r/GUI/GLCanvas3D.cpp:3650 src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 msgid "Height ranges" msgstr "Rango de alturas" -#: src/libslic3r/PrintConfig.cpp:226 +#: src/libslic3r/PrintConfig.cpp:261 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:300 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:433 +#, 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:2976 +#: src/libslic3r/PrintConfig.cpp:3365 msgid "Help" msgstr "Ayuda" -#: src/libslic3r/PrintConfig.cpp:2982 +#: src/libslic3r/PrintConfig.cpp:3371 msgid "Help (FFF options)" msgstr "Ayuda (opciones FFF)" -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3376 msgid "Help (SLA options)" msgstr "Ayuda (opciones SLA)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." msgstr "Aquí puedes ajustar el volumende purga requerida (mm³) para cualquier par de herramientas." -#: src/libslic3r/PrintConfig.cpp:925 +#: src/libslic3r/PrintConfig.cpp:973 msgid "High extruder current on filament swap" msgstr "Alta intensidad en el extrusor durante el cambio de filamento" -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:806 +#: src/slic3r/GUI/GLCanvas3D.cpp:277 +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 msgid "Hilbert Curve" msgstr "Curva de Hilbert" -#: src/slic3r/GUI/Plater.cpp:873 +#: src/slic3r/GUI/Plater.cpp:1042 msgid "Hold Shift to Slice & Export G-code" msgstr "Mantén presionada la tecla Shift para laminar y exportar el código G" -#: src/libslic3r/PrintConfig.cpp:803 src/libslic3r/PrintConfig.cpp:1924 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Hole depth" +msgstr "Profundidad del orificio" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +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 +msgid "Hollow and drill" +msgstr "Vaciado y taladrado" + +#: src/libslic3r/PrintConfig.cpp:2910 +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 +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 +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 +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 +msgid "Hollowing model" +msgstr "Vaciando modelo" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:813 +msgid "Hollowing parameter change" +msgstr "Cambio del parámetro de vaciar el interior" + +#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011 msgid "Honeycomb" msgstr "Panal de abeja" -#: src/slic3r/GUI/Tab.cpp:1013 +#: src/slic3r/GUI/Tab.cpp:1064 msgid "Horizontal shells" msgstr "Carcasas horizontales" -#: src/libslic3r/PrintConfig.cpp:209 +#: src/libslic3r/PrintConfig.cpp:245 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:151 +#: src/slic3r/GUI/PrintHostDialogs.cpp:152 msgid "Host" msgstr "Equipo" -#: src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Host Type" msgstr "Tipo de host" @@ -2773,162 +3398,195 @@ msgstr "Tipo de host" msgid "Hostname" msgstr "Nombre del equipo" -#: src/libslic3r/PrintConfig.cpp:81 +#: src/libslic3r/PrintConfig.cpp:97 msgid "Hostname, IP or URL" msgstr "Nombre de equipo, IP o URL" -#: src/slic3r/GUI/Tab.cpp:136 -msgid "Hover the cursor over buttons to find more information \nor click this button." +#: src/slic3r/GUI/Tab.cpp:139 +msgid "" +"Hover the cursor over buttons to find more information \n" +"or 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:2734 +#: src/libslic3r/PrintConfig.cpp:2812 +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 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:2380 +#: src/libslic3r/PrintConfig.cpp:2631 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:2642 +#: src/libslic3r/PrintConfig.cpp:2755 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:95 +#: src/libslic3r/PrintConfig.cpp:111 msgid "HTTPS CA File" msgstr "Archivo HTTPS CA" -#: src/slic3r/GUI/Tab.cpp:1731 +#: src/slic3r/GUI/Tab.cpp:1713 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/Tab.cpp:1773 -#, possible-c-format -msgid "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." -msgstr "Archivo CA HTTPS:\nEn este sistema,%s usa certificados HTTPS del almacén de certificados o llavero. \nPara usar un archivo CA personalizado, importa tu archivo CA al Almacén de Certificados/Llavero." - -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:222 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:148 +#: src/slic3r/GUI/PrintHostDialogs.cpp:149 msgid "ID" msgstr "ID" -#: src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1873 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:413 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:773 +#, 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:423 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:783 +#, 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:1774 +#: src/libslic3r/PrintConfig.cpp:1852 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/Preferences.cpp:63 +#: 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/Preferences.cpp:74 +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 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:71 +#: src/slic3r/GUI/Preferences.cpp:82 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:105 +#: src/slic3r/GUI/Preferences.cpp:106 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/slic3r/GUI/Preferences.cpp:112 +#: src/libslic3r/PrintConfig.cpp:1696 +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 +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 +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 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:119 +#: src/slic3r/GUI/Preferences.cpp:145 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:28 +#: src/slic3r/GUI/PresetHints.cpp:29 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/libslic3r/PrintConfig.cpp:853 +#: src/slic3r/GUI/PresetHints.cpp:36 +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 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:540 +#: src/libslic3r/PrintConfig.cpp:573 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:1636 +#: src/libslic3r/PrintConfig.cpp:1706 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:534 +#: src/libslic3r/PrintConfig.cpp:567 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:46 +#: src/slic3r/GUI/Preferences.cpp:49 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:54 +#: src/slic3r/GUI/Preferences.cpp:57 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:38 +#: src/slic3r/GUI/Preferences.cpp:41 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:1492 +#: src/libslic3r/PrintConfig.cpp:1562 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:1501 +#: src/libslic3r/PrintConfig.cpp:1571 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:1510 +#: src/libslic3r/PrintConfig.cpp:1580 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:1384 +#: src/libslic3r/PrintConfig.cpp:1454 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:498 +#: src/libslic3r/PrintConfig.cpp:530 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:2068 +#: src/libslic3r/PrintConfig.cpp:2169 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:3096 +#: src/libslic3r/PrintConfig.cpp:3485 msgid "Ignore non-existent config files" msgstr "Ignorar archivos de configuración inexistentes" -#: src/slic3r/GUI/MainFrame.cpp:352 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Import &Config" msgstr "Importar &Configuración" -#: src/slic3r/GUI/MainFrame.cpp:357 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Import Config &Bundle" msgstr "Importar &Conjunto de Ajustes" -#: src/slic3r/GUI/MainFrame.cpp:354 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Import Config from &project" msgstr "Importar configuración desde un &proyecto" -#: src/slic3r/GUI/Plater.cpp:4016 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +msgid "Import Config from ini/amf/3mf/gcode" +msgstr "Importar Configuración desde ini/amf/3mf/gcode" + +#: src/slic3r/GUI/Plater.cpp:4603 msgid "Import Object" msgstr "Importar Objeto" -#: src/slic3r/GUI/Plater.cpp:4020 +#: src/slic3r/GUI/Plater.cpp:4607 msgid "Import Objects" msgstr "Importar Objetos" @@ -2936,439 +3594,496 @@ 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:349 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Import STL/OBJ/AM&F/3MF" -msgstr "Importar STL/OBJ/AMF/3MF" +msgstr "Importar STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "Importar STL/OBJ/AMF/3MF sin config,manteniendo contenido base" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +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:2416 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectList.cpp:3422 +#, 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/UpdateDialogs.cpp:132 +#: src/slic3r/GUI/UpdateDialogs.cpp:230 msgid "Incompatible bundles:" msgstr "Grupos incompatibles:" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 -#, possible-c-format +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#, c-format msgid "Incompatible with this %s" msgstr "Incompatible con este %s" -#: src/slic3r/GUI/Plater.cpp:4091 +#: src/slic3r/GUI/Plater.cpp:4685 msgid "Increase Instances" msgstr "Aumentar Instancias" +#: src/slic3r/GUI/GLCanvas3D.cpp:264 +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:3338 -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)." +#: 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)." #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3334 +#: src/slic3r/GUI/Tab.cpp:3254 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:3083 -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. 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/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/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:69 -#: src/slic3r/GUI/GUI_ObjectList.cpp:510 src/slic3r/GUI/Plater.cpp:439 -#: src/slic3r/GUI/Tab.cpp:1030 src/slic3r/GUI/Tab.cpp:1031 -#: src/slic3r/GUI/Tab.cpp:1360 src/libslic3r/PrintConfig.cpp:167 -#: src/libslic3r/PrintConfig.cpp:389 src/libslic3r/PrintConfig.cpp:729 -#: src/libslic3r/PrintConfig.cpp:743 src/libslic3r/PrintConfig.cpp:780 -#: src/libslic3r/PrintConfig.cpp:933 src/libslic3r/PrintConfig.cpp:943 -#: src/libslic3r/PrintConfig.cpp:961 src/libslic3r/PrintConfig.cpp:979 -#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1659 -#: src/libslic3r/PrintConfig.cpp:1676 +#: 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 msgid "Infill" msgstr "Relleno" -#: src/slic3r/GUI/PresetHints.cpp:171 +#: src/slic3r/GUI/PresetHints.cpp:174 msgid "infill" msgstr "relleno" -#: src/libslic3r/PrintConfig.cpp:972 +#: src/libslic3r/PrintConfig.cpp:1021 msgid "Infill before perimeters" msgstr "Rellenar antes que los perímetros" -#: src/libslic3r/PrintConfig.cpp:953 +#: src/libslic3r/PrintConfig.cpp:1001 msgid "Infill extruder" msgstr "Extrusor para el relleno" -#: src/libslic3r/PrintConfig.cpp:987 +#: src/libslic3r/PrintConfig.cpp:1036 msgid "Infill/perimeters overlap" msgstr "Superposición de relleno/perímetros" -#: src/libslic3r/Print.cpp:1476 +#: src/libslic3r/Print.cpp:1584 msgid "Infilling layers" msgstr "Rellenando capas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:118 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3430 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 src/slic3r/GUI/Plater.cpp:141 msgid "Info" msgstr "Info" -#: src/libslic3r/PrintConfig.cpp:1008 +#: src/libslic3r/PrintConfig.cpp:1057 msgid "Inherits profile" msgstr "Hereda el perfil" -#: src/libslic3r/SLAPrint.cpp:707 +#: src/libslic3r/SLAPrint.cpp:653 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:2317 src/libslic3r/PrintConfig.cpp:2318 +#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565 msgid "Initial exposure time" msgstr "Tiempo de exposición inicial" -#: src/libslic3r/PrintConfig.cpp:2295 src/libslic3r/PrintConfig.cpp:2296 +#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483 msgid "Initial layer height" msgstr "Altura de la capa inicial" -#: src/slic3r/GUI/Field.cpp:155 +#: src/slic3r/GUI/Field.cpp:204 msgid "Input value is out of range" msgstr "El valor introducido está fuera de rango" -#: src/slic3r/GUI/GUI_App.cpp:661 +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "Inspect / activate configuration snapshots" msgstr "Inspeccionar / activar instantáneas de configuración" -#: src/slic3r/GUI/wxExtensions.cpp:407 src/slic3r/GUI/wxExtensions.cpp:474 -#, possible-c-format +#: src/slic3r/GUI/ObjectDataViewModel.cpp:60 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:216 +#, c-format msgid "Instance %d" msgstr "Instancia %d" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1887 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2500 msgid "Instance manipulation" msgstr "Manipulación de instancias" -#: src/slic3r/GUI/wxExtensions.cpp:358 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:56 msgid "Instances" msgstr "Instancias" -#: src/slic3r/GUI/GUI_ObjectList.cpp:934 src/slic3r/GUI/GUI_ObjectList.cpp:3346 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3781 msgid "Instances to Separated Objects" msgstr "Instancias para Separar Objetos" -#: src/libslic3r/PrintConfig.cpp:1886 +#: src/libslic3r/PrintConfig.cpp:1973 msgid "Interface layers" msgstr "Capas de interfaz" -#: src/libslic3r/PrintConfig.cpp:1870 +#: src/libslic3r/PrintConfig.cpp:1957 msgid "Interface loops" msgstr "Bucles de interfaz" -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:1982 msgid "Interface pattern spacing" msgstr "Espaciado de patrón de interfaz" -#: src/libslic3r/PrintConfig.cpp:1022 +#: src/libslic3r/PrintConfig.cpp:1071 msgid "Interface shells" msgstr "Carcasas de interfaz" -#: src/libslic3r/Zipper.cpp:87 +#: src/libslic3r/Zipper.cpp:84 msgid "internal error" msgstr "error interno" -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/GCode/PreviewData.cpp:166 +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313 msgid "Internal infill" msgstr "Relleno interno" -#: src/slic3r/GUI/Plater.cpp:2397 +#: src/slic3r/GUI/Plater.cpp:3106 msgid "Invalid data" msgstr "Datos inválidos" -#: src/slic3r/GUI/BedShapeDialog.cpp:471 src/slic3r/GUI/BedShapeDialog.cpp:520 -#: src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:566 msgid "Invalid file format." msgstr "Formato inválido de archivo." -#: src/libslic3r/Zipper.cpp:83 +#: src/libslic3r/Zipper.cpp:80 msgid "invalid filename" msgstr "nombre de archivo inválido" -#: src/libslic3r/Zipper.cpp:51 +#: src/slic3r/GUI/ConfigManipulation.cpp:319 +msgid "Invalid Head penetration" +msgstr "Penetración inválida de la cabeza" + +#: src/libslic3r/Zipper.cpp:48 msgid "invalid header or archive is corrupted" msgstr "encabezado inválido o archivo está dañado" -#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/Field.cpp:173 +#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376 msgid "Invalid numeric input." msgstr "Entrada numérica no válida." -#: src/libslic3r/Zipper.cpp:81 +#: src/libslic3r/Zipper.cpp:78 msgid "invalid parameter" msgstr "parámetro inválido" +#: src/slic3r/GUI/ConfigManipulation.cpp:332 +msgid "Invalid pinhead diameter" +msgstr "Diámetro de la cabeza del pin inválido" + #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:94 +#: src/slic3r/GUI/AboutDialog.cpp:258 msgid "is licensed under the" msgstr "está licenciado bajo el/los" -#: src/slic3r/GUI/Tab.cpp:2779 +#: 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:2778 +#: src/slic3r/GUI/Tab.cpp:2940 msgid "is not compatible with printer" msgstr "no es compatible con esta impresora" -#: src/slic3r/GUI/MainFrame.cpp:519 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso" msgstr "Iso" -#: src/slic3r/GUI/MainFrame.cpp:519 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso View" msgstr "Vista Iso" -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:964 msgid "It can't be deleted or modified." msgstr "No puede ser borrado o modificado." -#: src/libslic3r/PrintConfig.cpp:926 +#: src/slic3r/GUI/Plater.cpp:3321 +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 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.cpp:142 src/slic3r/GUI/Tab.cpp:2796 +#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2958 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:2177 +#: src/slic3r/GUI/Tab.cpp:2229 msgid "Jerk limits" msgstr "Límites del jerk" -#: src/libslic3r/PrintConfig.cpp:1579 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Jitter" msgstr "Jitter" -#: src/libslic3r/PrintConfig.cpp:533 +#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529 +#: src/slic3r/GUI/DoubleSlider.cpp:1651 +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/libslic3r/PrintConfig.cpp:566 msgid "Keep fan always on" msgstr "Mantener el ventilador siempre encendido" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 msgid "Keep lower part" msgstr "Mantener la parte inferior" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:193 +#: src/slic3r/GUI/GLCanvas3D.cpp:304 +msgid "Keep min" +msgstr "Mantener mínimo" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168 msgid "Keep upper part" msgstr "Mantener la parte superior" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:566 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:708 msgid "Keyboard Shortcuts" msgstr "Atajos de teclado" -#: src/libslic3r/PrintConfig.cpp:917 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +msgid "Keyboard shortcuts" +msgstr "Atajos de teclado" + +#: src/libslic3r/PrintConfig.cpp:2498 +msgid "kg" +msgstr "kg" + +#: src/libslic3r/PrintConfig.cpp:965 msgid "Label objects" msgstr "Etiquetar objetos" -#: src/libslic3r/PrintConfig.cpp:2234 +#: src/libslic3r/PrintConfig.cpp:2399 msgid "Landscape" msgstr "Paisaje" -#: src/slic3r/GUI/GUI_App.cpp:524 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Language" msgstr "Idioma" -#: src/slic3r/GUI/GUI_App.cpp:755 +#: src/slic3r/GUI/GUI_App.cpp:885 msgid "Language selection" msgstr "Selección de idiomas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1770 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2140 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2242 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:2994 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 msgid "Layer" msgstr "Capa" -#: src/slic3r/GUI/Tab.cpp:998 src/libslic3r/PrintConfig.cpp:55 +#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:71 msgid "Layer height" msgstr "Altura de la capa" -#: src/libslic3r/Print.cpp:1332 +#: src/libslic3r/Print.cpp:1427 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:2260 +#: src/slic3r/GUI/Tab.cpp:2362 msgid "Layer height limits" msgstr "Límites de altura de la capa" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2109 +#: src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "Layer height:" +msgstr "Altura de la capa:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2488 msgid "Layer range Settings to modify" msgstr "Ajustes del Rango de capas a modificar" -#: src/libslic3r/PrintConfig.cpp:326 src/libslic3r/PrintConfig.cpp:946 -#: src/libslic3r/PrintConfig.cpp:1435 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1844 -#: src/libslic3r/PrintConfig.cpp:1889 +#: 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 msgid "layers" msgstr "capas" -#: src/slic3r/GUI/Tab.cpp:3302 src/slic3r/GUI/Tab.cpp:3393 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3512 +#: src/slic3r/GUI/Tab.cpp:3600 msgid "Layers" msgstr "Capas" -#: src/slic3r/GUI/Tab.cpp:997 src/slic3r/GUI/Tab.cpp:3391 +#: src/slic3r/GUI/Tab.cpp:1048 src/slic3r/GUI/Tab.cpp:3598 msgid "Layers and perimeters" msgstr "Capas y perímetros" -#: src/slic3r/GUI/GUI_ObjectList.cpp:28 src/slic3r/GUI/GUI_ObjectList.cpp:68 -#: src/slic3r/GUI/GUI_ObjectList.cpp:509 src/libslic3r/PrintConfig.cpp:56 -#: src/libslic3r/PrintConfig.cpp:150 src/libslic3r/PrintConfig.cpp:381 -#: src/libslic3r/PrintConfig.cpp:438 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1026 -#: src/libslic3r/PrintConfig.cpp:1305 src/libslic3r/PrintConfig.cpp:1371 -#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1987 -#: src/libslic3r/PrintConfig.cpp:2044 +#: 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 msgid "Layers and Perimeters" msgstr "Capas y Perímetros" -#: src/slic3r/GUI/GLCanvas3D.cpp:526 -msgid "Layers heights" -msgstr "Alturas de capa" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +msgid "Layers Slider" +msgstr "Deslizador de Capas" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 -msgid "Layers Slider Shortcuts" -msgstr "Atajo rápidos al deslizador de capas" - -#. TRN To be shown in Print Settings "Bottom solid layers" -#: rc/libslic3r/PrintConfig.cpp:149 +#: src/slic3r/GUI/OptionsGroup.cpp:258 msgctxt "Layers" msgid "Bottom" msgstr "Inferior" -#. TRN To be shown in Print Settings "Top solid layers" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/slic3r/GUI/OptionsGroup.cpp:258 msgctxt "Layers" msgid "Top" msgstr "Superior" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left" msgstr "Izquierda" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1234 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1235 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 msgid "Left click" msgstr "Clic izquierdo" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/GLCanvas3D.cpp:237 +msgid "Left mouse button:" +msgstr "Botón izquierdo del ratón:" + +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left View" msgstr "Vista izquierda" -#: src/slic3r/GUI/GUI_Preview.cpp:255 +#: src/slic3r/GUI/GUI_Preview.cpp:257 msgid "Legend" msgstr "Leyenda" -#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551 msgid "Length" msgstr "Largo" -#: src/libslic3r/PrintConfig.cpp:293 +#: src/libslic3r/PrintConfig.cpp:328 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." #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:124 +#: src/slic3r/GUI/AboutDialog.cpp:129 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:1491 +#: src/libslic3r/PrintConfig.cpp:1561 msgid "Lift Z" msgstr "Levantar Z" -#: src/libslic3r/PrintConfig.cpp:801 +#: src/libslic3r/PrintConfig.cpp:848 msgid "Line" msgstr "Lineal" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1050 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1427 msgid "Load" msgstr "Cargar" -#: src/slic3r/GUI/MainFrame.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Load a model" msgstr "Cargar un modelo" -#: src/libslic3r/PrintConfig.cpp:3116 +#: src/libslic3r/PrintConfig.cpp:3505 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:3100 +#: src/libslic3r/PrintConfig.cpp:3489 msgid "Load config file" msgstr "Cargar archivo de configuración" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 -msgid "Load Config from .ini/amf/3mf/gcode" -msgstr "Cargar configuración desde .ini/amf/3mf/gcode" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +msgid "Load Config from ini/amf/3mf/gcode and merge" +msgstr "Carga Configuración desde ini/amf/3mf/gcode y mezcla" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 -msgid "Load Config from .ini/amf/3mf/gcode and merge" -msgstr "Cargar configuración desde .ini/amf/3mf/gcode y fusionar" - -#: src/slic3r/GUI/MainFrame.cpp:354 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Load configuration from project file" msgstr "Cargar configuración desde archivo de proyecto" -#: src/libslic3r/PrintConfig.cpp:3101 +#: src/libslic3r/PrintConfig.cpp:3490 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:352 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Load exported configuration file" msgstr "Cargar archivo de configuración exportado" -#: src/slic3r/GUI/Plater.cpp:1271 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Load File" msgstr "Cargar Archivo" -#: src/slic3r/GUI/Plater.cpp:1275 +#: src/slic3r/GUI/Plater.cpp:1399 msgid "Load Files" msgstr "Cargar Archivos" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1585 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1879 msgid "Load Part" msgstr "Cargar pieza" -#: src/slic3r/GUI/MainFrame.cpp:357 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Load presets from a bundle" msgstr "Cargar preajustes de un paquete" -#: src/slic3r/GUI/Plater.cpp:3992 +#: src/slic3r/GUI/Plater.cpp:4575 msgid "Load Project" msgstr "Cargar Proyecto" -#: src/slic3r/GUI/BedShapeDialog.cpp:97 +#: src/slic3r/GUI/BedShapeDialog.cpp:102 msgid "Load shape from STL..." msgstr "Cargar forma desde STL..." -#: src/slic3r/GUI/BedShapeDialog.cpp:181 src/slic3r/GUI/BedShapeDialog.cpp:249 +#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261 msgid "Load..." msgstr "Cargar..." -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" msgstr "cargado" -#: src/slic3r/GUI/Plater.cpp:1782 +#: src/slic3r/GUI/Plater.cpp:2426 msgid "Loaded" msgstr "Cargado" -#: src/slic3r/GUI/Plater.cpp:1590 +#: src/slic3r/GUI/Plater.cpp:2273 msgid "Loading" msgstr "Carga" -#: src/slic3r/GUI/GUI_App.cpp:407 +#: src/slic3r/GUI/GUI_App.cpp:474 msgid "Loading of a mode view" msgstr "Carga de modo de vista" -#: src/slic3r/GUI/GUI_App.cpp:399 +#: src/slic3r/GUI/GUI_App.cpp:466 msgid "Loading of current presets" msgstr "Cargando los preajustes actuales" @@ -3377,277 +4092,281 @@ msgstr "Cargando los preajustes actuales" msgid "Loading repaired model" msgstr "Cargando modelo reparado" -#: src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:607 msgid "Loading speed" msgstr "Velocidad de carga" -#: src/libslic3r/PrintConfig.cpp:583 +#: src/libslic3r/PrintConfig.cpp:615 msgid "Loading speed at the start" msgstr "Velocidad de carga al inicio" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:41 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106 msgid "Local coordinates" msgstr "Coordenadas locales" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:851 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 msgid "Lock supports under new islands" msgstr "Bloquear soportes bajo nuevas islas" -#: src/slic3r/GUI/Tab.cpp:3065 +#: src/slic3r/GUI/Tab.cpp:3252 msgid "LOCKED LOCK" msgstr "CANDADO CERRADO" -#: src/slic3r/GUI/Tab.cpp:3360 +#: src/slic3r/GUI/Tab.cpp:3280 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:3376 +#: src/slic3r/GUI/Tab.cpp:3296 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:3119 +#: src/libslic3r/PrintConfig.cpp:3508 msgid "Logging level" msgstr "Nivel de registro" -#: src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "Loops (minimum)" msgstr "Bucles (mínimo)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Lower Layer" msgstr "Capa inferior" -#: src/slic3r/GUI/Tab.cpp:2136 src/slic3r/GUI/Tab.cpp:2209 -#: src/libslic3r/PrintConfig.cpp:1077 src/libslic3r/PrintConfig.cpp:1087 -#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1110 -#: src/libslic3r/PrintConfig.cpp:1121 src/libslic3r/PrintConfig.cpp:1132 -#: src/libslic3r/PrintConfig.cpp:1143 +#: 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 msgid "Machine limits" msgstr "Límites de la máquina" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -msgid "Main Shortcuts" -msgstr "Atajos principales" - -#: src/slic3r/GUI/Plater.cpp:143 +#: src/slic3r/GUI/Plater.cpp:166 msgid "Manifold" msgstr "Manifold" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:908 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 msgid "Manual editing" msgstr "Edición manual" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:105 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180 msgid "Masked SLA file exported to %1%" msgstr "Archivo SLA enmascarado exportado a %1%" -#: src/slic3r/GUI/MainFrame.cpp:604 +#: src/slic3r/GUI/MainFrame.cpp:752 msgid "Mate&rial Settings Tab" msgstr "Pestaña Ajustes de Mate&rial" -#: src/slic3r/GUI/Tab.cpp:3300 +#: src/slic3r/GUI/Tab.cpp:3478 src/slic3r/GUI/Tab.cpp:3480 msgid "Material" msgstr "Material" -#: src/slic3r/GUI/Tab.hpp:391 +#: src/slic3r/GUI/Tab.hpp:416 msgid "Material Settings" msgstr "Configuraciones del material" -#: src/slic3r/GUI/Plater.cpp:140 +#: src/slic3r/GUI/Plater.cpp:163 msgid "Materials" msgstr "Materiales" -#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226 msgid "Max" msgstr "Max" -#: src/libslic3r/PrintConfig.cpp:2470 +#: src/libslic3r/PrintConfig.cpp:2734 msgid "Max bridge length" msgstr "Distancia máxima de puentes" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "Puentes maximos en un pilar" + +#: src/libslic3r/PrintConfig.cpp:2822 msgid "Max merge distance" msgstr "Distancia máxima de combinación" -#: src/libslic3r/PrintConfig.cpp:2479 +#: src/libslic3r/PrintConfig.cpp:2743 msgid "Max pillar linking distance" msgstr "Distancia máxima de enlace del pilar" -#: src/libslic3r/PrintConfig.cpp:64 +#: src/libslic3r/PrintConfig.cpp:80 msgid "Max print height" msgstr "Máxima altura de impresión" -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "Max print speed" msgstr "Velocidad máxima de impresión" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 -msgid "max slic3r version" -msgstr "versión máxima de slic3r" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +msgid "max PrusaSlicer version" +msgstr "máxima versión PrusaSlicer" -#: src/libslic3r/PrintConfig.cpp:1203 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "Max volumetric slope negative" msgstr "Máx. Pendiente volumétrica negativa" -#: src/libslic3r/PrintConfig.cpp:1192 +#: src/libslic3r/PrintConfig.cpp:1257 msgid "Max volumetric slope positive" msgstr "Máx. Pendiente volumétrica positiva" -#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247 msgid "Max volumetric speed" msgstr "Velocidad volumétrica máxima" -#: src/libslic3r/PrintConfig.cpp:2167 +#: src/libslic3r/PrintConfig.cpp:2268 msgid "Maximal bridging distance" msgstr "Distancia máxima de puentes" -#: src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2269 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:1099 +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Maximum acceleration E" msgstr "Máxima aceleración E" -#: src/libslic3r/PrintConfig.cpp:1105 +#: src/libslic3r/PrintConfig.cpp:1151 msgid "Maximum acceleration of the E axis" msgstr "Máxima aceleración en el eje E" -#: src/libslic3r/PrintConfig.cpp:1102 +#: src/libslic3r/PrintConfig.cpp:1148 msgid "Maximum acceleration of the X axis" msgstr "Máxima aceleración en el eje X" -#: src/libslic3r/PrintConfig.cpp:1103 +#: src/libslic3r/PrintConfig.cpp:1149 msgid "Maximum acceleration of the Y axis" msgstr "Máxima aceleración en el eje Y" -#: src/libslic3r/PrintConfig.cpp:1104 +#: src/libslic3r/PrintConfig.cpp:1150 msgid "Maximum acceleration of the Z axis" msgstr "Máxima aceleración en el eje Z" -#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133 +#: src/libslic3r/PrintConfig.cpp:1198 msgid "Maximum acceleration when extruding" msgstr "Aceleración máxima al extruir" -#: src/libslic3r/PrintConfig.cpp:1158 +#: src/libslic3r/PrintConfig.cpp:1200 msgid "Maximum acceleration when extruding (M204 S)" msgstr "Aceleración máxima con extrusión (M204 S)" -#: src/libslic3r/PrintConfig.cpp:1142 src/libslic3r/PrintConfig.cpp:1144 +#: src/libslic3r/PrintConfig.cpp:1208 msgid "Maximum acceleration when retracting" msgstr "Aceleración máxima al retraer" -#: src/libslic3r/PrintConfig.cpp:1169 +#: src/libslic3r/PrintConfig.cpp:1210 msgid "Maximum acceleration when retracting (M204 T)" msgstr "Aceleración máxima al retraer (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1096 +#: src/libslic3r/PrintConfig.cpp:1142 msgid "Maximum acceleration X" msgstr "Máxima aceleración X" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1143 msgid "Maximum acceleration Y" msgstr "Máxima aceleración Y" -#: src/libslic3r/PrintConfig.cpp:1098 +#: src/libslic3r/PrintConfig.cpp:1144 msgid "Maximum acceleration Z" msgstr "Máxima aceleración Z" -#: src/slic3r/GUI/Tab.cpp:2170 +#: src/slic3r/GUI/Tab.cpp:2222 msgid "Maximum accelerations" msgstr "Aceleraciones máximas" -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534 msgid "Maximum exposure time" msgstr "Tiempo de exposición máximo" -#: src/libslic3r/PrintConfig.cpp:1081 +#: src/libslic3r/PrintConfig.cpp:1128 msgid "Maximum feedrate E" msgstr "Máximo avance E" -#: src/libslic3r/PrintConfig.cpp:1087 +#: src/libslic3r/PrintConfig.cpp:1134 msgid "Maximum feedrate of the E axis" msgstr "Máximo avance del eje E" -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1131 msgid "Maximum feedrate of the X axis" msgstr "Máximo avance en el eje X" -#: src/libslic3r/PrintConfig.cpp:1085 +#: src/libslic3r/PrintConfig.cpp:1132 msgid "Maximum feedrate of the Y axis" msgstr "Máximo avance del eje Y" -#: src/libslic3r/PrintConfig.cpp:1086 +#: src/libslic3r/PrintConfig.cpp:1133 msgid "Maximum feedrate of the Z axis" msgstr "Máximo avance del eje Z" -#: src/libslic3r/PrintConfig.cpp:1078 +#: src/libslic3r/PrintConfig.cpp:1125 msgid "Maximum feedrate X" msgstr "Máxima velocidad en X" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Maximum feedrate Y" msgstr "Máxima velocidad en Y" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "Maximum feedrate Z" msgstr "Máximo avance en Z" -#: src/slic3r/GUI/Tab.cpp:2165 +#: src/slic3r/GUI/Tab.cpp:2217 msgid "Maximum feedrates" msgstr "Avance máximo" -#: src/libslic3r/PrintConfig.cpp:2447 src/libslic3r/PrintConfig.cpp:2448 +#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557 msgid "Maximum initial exposure time" msgstr "Tiempo de exposición inicial máximo" -#: src/libslic3r/PrintConfig.cpp:1117 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "Maximum jerk E" msgstr "Máximo jerk E" -#: src/libslic3r/PrintConfig.cpp:1123 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Maximum jerk of the E axis" msgstr "Maximo jerk del eje E" -#: src/libslic3r/PrintConfig.cpp:1120 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Maximum jerk of the X axis" msgstr "Maximo jerk del eje Y" -#: src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "Maximum jerk of the Y axis" msgstr "Maximo jerk del eje Y" -#: src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1167 msgid "Maximum jerk of the Z axis" msgstr "Maximo jerk del eje Z" -#: src/libslic3r/PrintConfig.cpp:1114 +#: src/libslic3r/PrintConfig.cpp:1159 msgid "Maximum jerk X" msgstr "Máximo jerk X" -#: src/libslic3r/PrintConfig.cpp:1115 +#: src/libslic3r/PrintConfig.cpp:1160 msgid "Maximum jerk Y" msgstr "Máximo jerk Y" -#: src/libslic3r/PrintConfig.cpp:1116 +#: src/libslic3r/PrintConfig.cpp:1161 msgid "Maximum jerk Z" msgstr "Máximo jerk Z" -#: src/libslic3r/PrintConfig.cpp:566 +#: src/libslic3r/PrintConfig.cpp:2660 +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 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:3053 +#: src/libslic3r/PrintConfig.cpp:3442 msgid "Merge" msgstr "Combinar" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2683 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/SLAPrint.cpp:71 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Merging slices and calculating statistics" msgstr "Mezclando rebanadas y calculando estadísticas" @@ -3655,207 +4374,256 @@ msgstr "Mezclando rebanadas y calculando estadísticas" msgid "Mesh repair failed." msgstr "Reparación de la malla fallida." -#: src/libslic3r/PrintConfig.cpp:3120 -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" -msgstr "Los mensajes con una gravedad inferior o igual al nivel de registro se imprimirán. 0:rastreo, 1:depuración, 2:información, 3:advertencia, 4:error, 5:fatal" +#: src/slic3r/GUI/DoubleSlider.cpp:1635 +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:1215 src/libslic3r/PrintConfig.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289 msgid "Min" msgstr "Min" -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1298 msgid "Min print speed" msgstr "Velocidad de impresión mínima" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 -msgid "min slic3r version" -msgstr "mínima versión de Slic3r" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "min PrusaSlicer version" +msgstr "mínima versión PrusaSlicer" -#: src/libslic3r/PrintConfig.cpp:2507 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Minimal distance of the support points" msgstr "Distancia mínima de los puntos de apoyo" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1306 msgid "Minimal filament extrusion length" msgstr "Longitud mínima de filamento extruido" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:879 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 msgid "Minimal points distance" msgstr "Distancia mínima de puntos" -#: src/libslic3r/PrintConfig.cpp:635 +#: src/libslic3r/PrintConfig.cpp:667 msgid "Minimal purge on wipe tower" msgstr "Purga mínima en la torre de limpieza" -#: src/libslic3r/PrintConfig.cpp:1442 +#: src/libslic3r/PrintConfig.cpp:187 +msgid "Minimum bottom shell thickness" +msgstr "Espesor mínimo de la tapa inferior" + +#: src/slic3r/GUI/PresetHints.cpp:339 +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 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:2416 src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526 msgid "Minimum exposure time" msgstr "Tiempo de exposición mínimo" -#: src/libslic3r/PrintConfig.cpp:1109 src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1178 msgid "Minimum feedrate when extruding" msgstr "Avance mínimo al extruir" -#: src/libslic3r/PrintConfig.cpp:1136 +#: src/libslic3r/PrintConfig.cpp:1180 msgid "Minimum feedrate when extruding (M205 S)" msgstr "Avance mínimo al extruir (M205 S)" -#: src/slic3r/GUI/Tab.cpp:2182 +#: src/slic3r/GUI/Tab.cpp:2234 msgid "Minimum feedrates" msgstr "Avances míninos" -#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549 msgid "Minimum initial exposure time" msgstr "Tiempo de exposición inicial mínimo" -#: src/libslic3r/PrintConfig.cpp:1452 +#: src/slic3r/GUI/Tab.cpp:1069 +msgid "Minimum shell thickness" +msgstr "Espesor mínimo de pared" + +#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788 +msgid "Minimum thickness of a top / bottom shell" +msgstr "Espesor mínimo de una carcasa superior / inferior" + +#: src/libslic3r/PrintConfig.cpp:2146 +msgid "Minimum top shell thickness" +msgstr "Espesor mínimo de la carcasa superior" + +#: src/slic3r/GUI/PresetHints.cpp:320 +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 msgid "Minimum travel after retraction" msgstr "Distancia mínima después de la retracción" -#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "Minimum travel feedrate" msgstr "Avance mínimo de movimiento" -#: src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1190 msgid "Minimum travel feedrate (M205 T)" msgstr "Velocidad mínima sin extrusión (M205 T)" -#: src/slic3r/GUI/Plater.cpp:2946 -msgid "Mirror" -msgstr "Duplicar" +#: src/libslic3r/PrintConfig.cpp:2917 +msgid "Minimum wall thickness of a hollowed model." +msgstr "Mínimo de espesor de la pared de un modelo vaciado." -#: src/libslic3r/PrintConfig.cpp:2320 +#: src/libslic3r/PrintConfig.cpp:2449 +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 +msgid "Mirror" +msgstr "Reflejar" + +#: src/libslic3r/PrintConfig.cpp:2379 msgid "Mirror horizontally" msgstr "Reflejar horizontalmente" -#: src/slic3r/GUI/GLCanvas3D.cpp:1711 +#: src/slic3r/GUI/GLCanvas3D.cpp:2053 msgid "Mirror Object" msgstr "Reflejar objeto" -#: src/slic3r/GUI/Plater.cpp:2946 +#: src/slic3r/GUI/Plater.cpp:4002 msgid "Mirror the selected object" msgstr "Duplicar el objeto seleccionado" -#: src/slic3r/GUI/Plater.cpp:2939 +#: src/slic3r/GUI/Plater.cpp:3995 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:2941 +#: src/slic3r/GUI/Plater.cpp:3997 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:2943 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Mirror the selected object along the Z axis" msgstr "Duplicar el objeto seleccionado a lo largo del eje Z" -#: src/libslic3r/PrintConfig.cpp:2327 +#: src/libslic3r/PrintConfig.cpp:2386 msgid "Mirror vertically" msgstr "Reflejar verticalmente" -#: src/slic3r/Utils/OctoPrint.cpp:69 -#, possible-c-format +#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68 +#, c-format msgid "Mismatched type of print host: %s" msgstr "Tipo de host de impresión no coincidente: %s" -#: src/libslic3r/GCode/PreviewData.cpp:176 +#: src/libslic3r/ExtrusionEntity.cpp:323 msgid "Mixed" msgstr "Mezclado" -#: src/slic3r/GUI/BedShapeDialog.cpp:87 src/slic3r/GUI/ConfigWizard.cpp:118 -#: src/slic3r/GUI/ConfigWizard.cpp:561 src/slic3r/GUI/ConfigWizard.cpp:575 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 -#: src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:84 -#: src/libslic3r/PrintConfig.cpp:59 src/libslic3r/PrintConfig.cpp:66 -#: src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:210 -#: src/libslic3r/PrintConfig.cpp:285 src/libslic3r/PrintConfig.cpp:293 -#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:353 -#: src/libslic3r/PrintConfig.cpp:473 src/libslic3r/PrintConfig.cpp:484 -#: src/libslic3r/PrintConfig.cpp:502 src/libslic3r/PrintConfig.cpp:680 -#: src/libslic3r/PrintConfig.cpp:1166 src/libslic3r/PrintConfig.cpp:1227 -#: src/libslic3r/PrintConfig.cpp:1245 src/libslic3r/PrintConfig.cpp:1263 -#: src/libslic3r/PrintConfig.cpp:1315 src/libslic3r/PrintConfig.cpp:1325 -#: src/libslic3r/PrintConfig.cpp:1446 src/libslic3r/PrintConfig.cpp:1454 -#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 -#: src/libslic3r/PrintConfig.cpp:1513 src/libslic3r/PrintConfig.cpp:1521 -#: src/libslic3r/PrintConfig.cpp:1529 src/libslic3r/PrintConfig.cpp:1612 -#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1898 -#: src/libslic3r/PrintConfig.cpp:1932 src/libslic3r/PrintConfig.cpp:2125 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2139 -#: src/libslic3r/PrintConfig.cpp:2169 src/libslic3r/PrintConfig.cpp:2179 -#: src/libslic3r/PrintConfig.cpp:2189 src/libslic3r/PrintConfig.cpp:2297 -#: src/libslic3r/PrintConfig.cpp:2372 src/libslic3r/PrintConfig.cpp:2381 -#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2400 -#: src/libslic3r/PrintConfig.cpp:2444 src/libslic3r/PrintConfig.cpp:2454 -#: src/libslic3r/PrintConfig.cpp:2473 src/libslic3r/PrintConfig.cpp:2483 -#: src/libslic3r/PrintConfig.cpp:2492 src/libslic3r/PrintConfig.cpp:2510 -#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2539 -#: src/libslic3r/PrintConfig.cpp:2552 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2491 +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/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: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 msgid "mm" msgstr "mm" -#: src/libslic3r/PrintConfig.cpp:1477 src/libslic3r/PrintConfig.cpp:1486 +#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556 msgid "mm (zero to disable)" msgstr "mm (cero para deshabilitar)" -#: src/libslic3r/PrintConfig.cpp:847 src/libslic3r/PrintConfig.cpp:992 -#: src/libslic3r/PrintConfig.cpp:1797 +#: 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 msgid "mm or %" msgstr "mm o %" -#: src/libslic3r/PrintConfig.cpp:201 src/libslic3r/PrintConfig.cpp:577 -#: src/libslic3r/PrintConfig.cpp:585 src/libslic3r/PrintConfig.cpp:594 -#: src/libslic3r/PrintConfig.cpp:602 src/libslic3r/PrintConfig.cpp:629 -#: src/libslic3r/PrintConfig.cpp:648 src/libslic3r/PrintConfig.cpp:874 -#: src/libslic3r/PrintConfig.cpp:1001 src/libslic3r/PrintConfig.cpp:1079 -#: src/libslic3r/PrintConfig.cpp:1099 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1123 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1363 -#: src/libslic3r/PrintConfig.cpp:1537 src/libslic3r/PrintConfig.cpp:1546 -#: src/libslic3r/PrintConfig.cpp:1941 src/libslic3r/PrintConfig.cpp:2053 +#: 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 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:430 src/libslic3r/PrintConfig.cpp:856 -#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1702 -#: src/libslic3r/PrintConfig.cpp:1908 src/libslic3r/PrintConfig.cpp:2035 +#: 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 msgid "mm/s or %" msgstr "mm/s o %" -#: src/libslic3r/PrintConfig.cpp:160 src/libslic3r/PrintConfig.cpp:303 -#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:936 -#: src/libslic3r/PrintConfig.cpp:1089 src/libslic3r/PrintConfig.cpp:1134 -#: src/libslic3r/PrintConfig.cpp:1145 src/libslic3r/PrintConfig.cpp:1334 +#: 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 msgid "mm/s²" msgstr "mm/s²" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:640 +#: src/libslic3r/PrintConfig.cpp:672 msgid "mm³" msgstr "mm³" -#: src/libslic3r/PrintConfig.cpp:569 src/libslic3r/PrintConfig.cpp:1185 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "mm³/s" msgstr "mm³/s" -#: src/libslic3r/PrintConfig.cpp:1197 src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273 msgid "mm³/s²" msgstr "mm³/s²" -#: src/slic3r/GUI/GUI_App.cpp:681 +#: src/slic3r/GUI/GUI_App.cpp:820 msgid "Mode" -msgstr "Modo" +msgstr "&Modo" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "model" msgstr "modelo" -#: src/slic3r/GUI/BedShapeDialog.cpp:239 +#: src/slic3r/GUI/BedShapeDialog.cpp:251 msgid "Model" msgstr "Modelo" @@ -3873,8 +4641,8 @@ msgid "Model repair canceled" msgstr "Reparación del modelo cancelada" #: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" -msgstr "Reparación del modelo fallida:\n" +msgid "Model repair failed:" +msgstr "Reparación del modelo fallida:" #: src/slic3r/Utils/FixModelByWin10.cpp:400 msgid "Model repair finished" @@ -3884,104 +4652,151 @@ msgstr "Reparación del modelo terminada" msgid "Model repaired successfully" msgstr "Modelo reparado exitosamente" -#: src/slic3r/GUI/Preset.cpp:207 +#: src/slic3r/GUI/Tab.cpp:979 +msgid "Modifications to the current profile will be saved." +msgstr "Se guardarán las modificaciones al perfil actual." + +#: src/slic3r/GUI/Preset.cpp:247 msgid "modified" msgstr "modificado" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Modifier" msgstr "Modificador" -#: src/slic3r/GUI/Tab.cpp:1100 +#: src/slic3r/GUI/Tab.cpp:1161 msgid "Modifiers" msgstr "Modificadores" -#: src/libslic3r/PrintConfig.cpp:719 +#: src/libslic3r/PrintConfig.cpp:2512 +msgid "money/bottle" +msgstr "dinero/botella" + +#: src/libslic3r/PrintConfig.cpp:762 msgid "money/kg" msgstr "dinero/kg" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1240 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 msgid "Mouse wheel" msgstr "Rueda del ratón" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:51 +#: src/slic3r/GUI/GLCanvas3D.cpp:261 +msgid "Mouse wheel:" +msgstr "Rueda del ratón:" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 msgid "Move" msgstr "Mover" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1238 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 msgid "Move clipping plane" msgstr "Mover plano de recorte" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Move current slider thumb Down" msgstr "Mover el control deslizante actual hacia abajo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 msgid "Move current slider thumb Up" msgstr "Mover el control deslizante actual hacia arriba" -#: src/slic3r/GUI/GLCanvas3D.cpp:2872 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1059 +msgid "Move drainage hole" +msgstr "Mover orificio de drenaje" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3505 msgid "Move Object" msgstr "Mover Objeto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365 msgid "Move point" msgstr "Mover punto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +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 +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 +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 +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 msgid "Move support point" msgstr "Mover punto de soporte" -#: src/libslic3r/PrintConfig.cpp:2100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Movement in camera space" +msgstr "Movimiento en el espacio de la cámara" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +msgid "Movement step set to 1 mm" +msgstr "Paso de movimiento configurado a 1 mm" + +#: src/libslic3r/PrintConfig.cpp:2201 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:1661 src/slic3r/GUI/Plater.cpp:1769 +#: src/slic3r/GUI/Plater.cpp:2360 src/slic3r/GUI/Plater.cpp:2413 msgid "Multi-part object detected" msgstr "Objeto de piezas múltiples detectado" -#: src/slic3r/GUI/FirmwareDialog.cpp:400 src/slic3r/GUI/FirmwareDialog.cpp:436 -#, possible-c-format +#: 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 "Se encontraron múltiples dispositivos %s. Por favor, conecta solo uno a la vez para flashear." -#: src/slic3r/GUI/Tab.cpp:1118 +#: src/slic3r/GUI/Tab.cpp:1179 msgid "Multiple Extruders" msgstr "Múltiples Extrusores" -#: src/slic3r/GUI/Plater.cpp:1766 -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?\n" -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?\n" +#: 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/libslic3r/PrintConfig.cpp:3050 +#: src/libslic3r/PrintConfig.cpp:3439 msgid "Multiply copies by creating a grid." msgstr "Multiplicar copias creando una rejilla." -#: src/libslic3r/PrintConfig.cpp:3045 +#: src/libslic3r/PrintConfig.cpp:3434 msgid "Multiply copies by this factor." msgstr "Multiplicar las copias por este factor." -#: src/slic3r/GUI/Field.cpp:139 +#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:580 msgid "N/A" msgstr "N/A" -#: src/slic3r/GUI/GUI_ObjectList.cpp:176 +#: src/slic3r/GUI/GUI_ObjectList.cpp:270 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 msgid "Name" msgstr "Nombre" -#: src/libslic3r/PrintConfig.cpp:1418 +#: src/libslic3r/PrintConfig.cpp:1488 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:1412 +#: src/libslic3r/PrintConfig.cpp:1482 msgid "Name of the printer vendor." msgstr "Nombre del fabricante de la impresora." -#: src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1058 msgid "Name of the profile, from which this profile inherits." msgstr "Nombre del perfil desde que éste hereda." -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Nearest" msgstr "Más cercano" @@ -3989,32 +4804,40 @@ msgstr "Más cercano" msgid "Network lookup" msgstr "Búsqueda en la red" -#: src/slic3r/GUI/Plater.cpp:2056 +#: src/slic3r/GUI/Plater.cpp:2151 msgid "New Project" msgstr "Nuevo proyecto" -#: src/slic3r/GUI/UpdateDialogs.cpp:30 -#, possible-c-format +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +msgid "New project, clear plater" +msgstr "Nuevo proyecto, limpiar plataforma" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +#, c-format msgid "New version of %s is available" msgstr "Nueva versión de %s disponible" -#: src/slic3r/GUI/UpdateDialogs.cpp:47 +#: src/slic3r/GUI/UpdateDialogs.cpp:45 msgid "New version:" msgstr "Nueva versión:" -#: src/slic3r/GUI/GLCanvas3D.cpp:3750 +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 msgid "Next Redo action: %1%" msgstr "Siguiente acción de Rehacer: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:3718 +#: src/slic3r/GUI/GLCanvas3D.cpp:4641 msgid "Next Undo action: %1%" msgstr "Siguiente acción de Deshacer: %1%" -#: src/libslic3r/PrintConfig.cpp:912 +#: src/libslic3r/PrintConfig.cpp:960 msgid "No extrusion" msgstr "Sin extrusión" -#: src/slic3r/GUI/MainFrame.cpp:635 +#: src/libslic3r/SLAPrintSteps.cpp:453 +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 msgid "No previously sliced file." msgstr "Ningún archivo previamente laminado." @@ -4022,152 +4845,175 @@ msgstr "Ningún archivo previamente laminado." msgid "NO RAMMING AT ALL" msgstr "NO EMPUJAR EN ABSOLUTO" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:1857 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "Sin capas dispersas (EXPERIMENTAL)" + +#: src/libslic3r/PrintConfig.cpp:2774 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/ConfigWizard.cpp:190 src/slic3r/GUI/Plater.cpp:422 -#: src/libslic3r/GCode/PreviewData.cpp:162 +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +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 msgid "None" msgstr "Ninguno" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2203 msgid "Normal" msgstr "Normal" -#: src/slic3r/GUI/Plater.cpp:1073 +#: src/slic3r/GUI/Plater.cpp:1286 msgid "normal mode" msgstr "modo normal" -#: src/libslic3r/Zipper.cpp:49 +#: src/libslic3r/Zipper.cpp:46 msgid "not a ZIP archive" msgstr "no es un archivo ZIP" -#: src/slic3r/Utils/OctoPrint.cpp:90 +#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302 +msgid "Not found:" +msgstr "No encontrado:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1019 +msgid "Note" +msgstr "Nota" + +#: src/slic3r/Utils/AstroBox.cpp:89 +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 +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 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:1213 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 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:1193 src/slic3r/GUI/Tab.cpp:1194 -#: src/slic3r/GUI/Tab.cpp:1576 src/slic3r/GUI/Tab.cpp:1577 -#: src/slic3r/GUI/Tab.cpp:1985 src/slic3r/GUI/Tab.cpp:1986 -#: src/slic3r/GUI/Tab.cpp:2079 src/slic3r/GUI/Tab.cpp:2080 -#: src/slic3r/GUI/Tab.cpp:3328 src/slic3r/GUI/Tab.cpp:3329 +#: 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 msgid "Notes" msgstr "Notas" -#: src/slic3r/GUI/GUI.cpp:277 +#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905 +#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:245 msgid "Notice" msgstr "Date cuenta" -#: src/slic3r/GUI/ConfigWizard.cpp:118 +#: src/slic3r/GUI/ConfigWizard.cpp:218 msgid "nozzle" msgstr "boquilla" -#: src/libslic3r/PrintConfig.cpp:1261 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2340 +#: src/libslic3r/PrintConfig.cpp:1326 msgid "Nozzle diameter" msgstr "Diámetro de la boquilla" -#: src/slic3r/GUI/ConfigWizard.cpp:560 +#: src/slic3r/GUI/ConfigWizard.cpp:969 msgid "Nozzle Diameter:" msgstr "Diámetro de la boquilla:" -#: src/libslic3r/PrintConfig.cpp:618 +#: src/libslic3r/PrintConfig.cpp:650 msgid "Number of cooling moves" msgstr "Número de movimientos de enfriamiento" -#: src/slic3r/GUI/Tab.cpp:1845 +#: src/slic3r/GUI/Tab.cpp:1839 msgid "Number of extruders of the printer." msgstr "Número de extrusores de la impresora." -#: src/libslic3r/PrintConfig.cpp:1888 +#: src/libslic3r/PrintConfig.cpp:1975 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:1627 +#: src/libslic3r/PrintConfig.cpp:1697 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:2214 +#: src/libslic3r/PrintConfig.cpp:2365 msgid "Number of pixels in" msgstr "Número de píxeles en" -#: src/libslic3r/PrintConfig.cpp:2216 +#: src/libslic3r/PrintConfig.cpp:2367 msgid "Number of pixels in X" msgstr "Número de píxeles en X" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "Number of pixels in Y" msgstr "Número de píxeles en Y" -#: src/libslic3r/PrintConfig.cpp:151 +#: src/libslic3r/PrintConfig.cpp:176 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:1711 +#: src/libslic3r/PrintConfig.cpp:1781 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:2045 +#: src/libslic3r/PrintConfig.cpp:2134 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:2303 +#: src/libslic3r/PrintConfig.cpp:2518 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:218 +#: src/slic3r/GUI/Plater.cpp:241 msgid "Number of tool changes" msgstr "Número de cambios de herramienta" -#: src/libslic3r/PrintConfig.cpp:2489 +#: src/libslic3r/PrintConfig.cpp:2753 msgid "Object elevation" msgstr "Elevación del objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2466 msgid "Object manipulation" msgstr "Manipulación de objetos" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:27 -msgid "Object Manipulation" -msgstr "Manipulación del objeto" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:78 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638 msgid "Object name" msgstr "Nombre del objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3417 msgid "Object or Instance" msgstr "Objeto o instancia" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1010 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 msgid "Object reordered" msgstr "Objetos reordenados" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1868 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2479 msgid "Object Settings to modify" msgstr "Configuraciones de objetos para modificar" -#: src/slic3r/GUI/Plater.cpp:1875 +#: src/slic3r/GUI/Plater.cpp:2529 msgid "Object too large?" msgstr "Objeto demasiado grande?" -#: src/libslic3r/PrintConfig.cpp:2161 +#: src/libslic3r/PrintConfig.cpp:2262 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:1018 +#: src/slic3r/GUI/Plater.cpp:1194 msgid "object(s)" msgstr "objeto(s)" -#: src/slic3r/GUI/Plater.cpp:1043 src/slic3r/GUI/Plater.cpp:1058 +#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245 msgid "objects" msgstr "objetos" -#: src/libslic3r/PrintConfig.cpp:402 src/libslic3r/PrintConfig.cpp:808 +#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 msgid "Octagram Spiral" msgstr "Octagram Spiral" @@ -4175,745 +5021,926 @@ msgstr "Octagram Spiral" msgid "OctoPrint version" msgstr "Versión de OctoPrint" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3425 msgid "of a current Object" msgstr "del Objeto actual" -#: src/slic3r/GUI/wxExtensions.cpp:2570 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +msgid "Offset" +msgstr "Desplazamiento" + +#: src/slic3r/GUI/Tab.cpp:1755 +#, 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 msgid "One layer mode" msgstr "Modo de capa única" -#: src/libslic3r/Print.cpp:1285 +#: src/libslic3r/Print.cpp:1365 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:1817 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2676 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:978 +#: src/libslic3r/PrintConfig.cpp:1027 msgid "Only infill where needed" msgstr "Solo rellenar cuando sea necesario" -#: src/slic3r/GUI/Tab.cpp:2271 +#: src/slic3r/GUI/Tab.cpp:2373 msgid "Only lift Z" msgstr "Solo levantar Z" -#: src/libslic3r/PrintConfig.cpp:1500 +#: src/libslic3r/PrintConfig.cpp:1570 msgid "Only lift Z above" msgstr "Solo levantar Z mayor que" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1579 msgid "Only lift Z below" msgstr "Solo levantar Z menor que" -#: src/libslic3r/PrintConfig.cpp:1279 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Only retract when crossing perimeters" msgstr "Solo retraer al cruzar perímetros" -#: src/slic3r/GUI/Tab.cpp:1126 +#: src/slic3r/GUI/Tab.cpp:1187 msgid "Ooze prevention" msgstr "Prevención de goteo" -#: src/libslic3r/Print.cpp:1193 +#: src/libslic3r/Print.cpp:1266 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:339 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "Open a project file" msgstr "Abrir un archivo de proyecto" -#: src/slic3r/GUI/Tab.cpp:1745 +#: src/slic3r/GUI/Tab.cpp:1729 msgid "Open CA certificate file" msgstr "Abrir archivo de certificado CA" -#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:126 +#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:183 msgid "Open changelog page" msgstr "Abrir la página del registro de cambios" -#: src/slic3r/GUI/UpdateDialogs.cpp:68 +#: src/slic3r/GUI/UpdateDialogs.cpp:65 msgid "Open download page" msgstr "Abrir página de descarga" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 -msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "Abrir el proyecto STL/OBJ/AMF/3MF con config, borrar contenido base" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +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:551 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:693 +#, 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:542 +#: src/slic3r/GUI/MainFrame.cpp:684 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:549 +#: src/slic3r/GUI/MainFrame.cpp:686 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:2994 +#: src/slic3r/GUI/Plater.cpp:4040 msgid "Optimize orientation" msgstr "Optimizar la orientación" -#: src/slic3r/GUI/Plater.cpp:2643 +#: src/slic3r/GUI/Plater.cpp:2767 msgid "Optimize Rotation" msgstr "Optimizar Rotación" -#: src/slic3r/GUI/Plater.cpp:2994 +#: src/slic3r/GUI/Plater.cpp:4040 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:112 +#: src/libslic3r/PrintConfig.cpp:137 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:1070 +#: src/slic3r/GUI/Tab.cpp:1131 msgid "Options for support material and raft" msgstr "Opciones de material de soporte y balsa" -#: src/slic3r/GUI/Plater.cpp:2251 +#: src/slic3r/GUI/DoubleSlider.cpp:989 +msgid "or press \"+\" key" +msgstr "o presiona la tecla \"+\"" + +#: src/slic3r/GUI/Plater.cpp:2892 msgid "Orientation found." msgstr "Orientación encontrada." -#: src/slic3r/GUI/Plater.cpp:2768 +#: src/slic3r/GUI/Plater.cpp:2891 msgid "Orientation search canceled." msgstr "Búsqueda de orientación cancelada." -#: src/slic3r/GUI/BedShapeDialog.cpp:79 +#: src/slic3r/GUI/BedShapeDialog.cpp:84 msgid "Origin" msgstr "Origen" -#: src/slic3r/GUI/Tab.cpp:1165 +#: src/slic3r/GUI/Tab.cpp:1227 msgid "Other" msgstr "Otro" -#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:1977 +#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064 msgid "Other layers" msgstr "Otras capas" -#: src/slic3r/GUI/ConfigWizard.cpp:438 +#: src/slic3r/GUI/ConfigWizard.cpp:856 msgid "Other Vendors" msgstr "Otras Marcas" -#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:3440 +#: src/slic3r/GUI/Tab.cpp:1238 src/slic3r/GUI/Tab.cpp:3666 msgid "Output file" msgstr "Archivo de salida" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3493 msgid "Output File" msgstr "Archivo de salida" -#: src/libslic3r/PrintConfig.cpp:1294 +#: src/libslic3r/PrintConfig.cpp:1363 msgid "Output filename format" msgstr "Formato de nombre de salida" -#: src/libslic3r/PrintConfig.cpp:2992 +#: src/libslic3r/PrintConfig.cpp:3381 msgid "Output Model Info" msgstr "Información del modelo de salida" -#: src/slic3r/GUI/Tab.cpp:1168 src/slic3r/GUI/Tab.cpp:3439 +#: src/slic3r/GUI/Tab.cpp:1230 src/slic3r/GUI/Tab.cpp:3665 msgid "Output options" msgstr "Opciones de salida" -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/GCode/PreviewData.cpp:165 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312 msgid "Overhang perimeter" msgstr "Perímetro de voladizos" -#: src/libslic3r/PrintConfig.cpp:1955 +#: src/libslic3r/PrintConfig.cpp:2042 msgid "Overhang threshold" msgstr "Umbral de voladizos" -#: src/slic3r/GUI/Tab.cpp:1153 +#: src/slic3r/GUI/Tab.cpp:1215 msgid "Overlap" msgstr "Superposición" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "P&rint Settings Tab" -msgstr "C&onfiguración de Impresión" +msgstr "Configu&ración de Impresión" -#: src/slic3r/GUI/GUI_ObjectList.cpp:79 src/slic3r/GUI/GUI_ObjectList.cpp:520 -#: src/slic3r/GUI/Tab.cpp:3425 src/slic3r/GUI/Tab.cpp:3426 -#: src/libslic3r/PrintConfig.cpp:2516 src/libslic3r/PrintConfig.cpp:2523 -#: src/libslic3r/PrintConfig.cpp:2537 src/libslic3r/PrintConfig.cpp:2547 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2569 +#: 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 msgid "Pad" msgstr "Pad" -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 msgid "Pad and Support" msgstr "Pad y soportes" -#: src/libslic3r/PrintConfig.cpp:2732 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "Pad around object" msgstr "Pad alrededor del objeto" -#: src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:2862 +msgid "Pad around object everywhere" +msgstr "Pad alrededor del objeto en todos lados" + +#: src/libslic3r/PrintConfig.cpp:2811 +msgid "Pad brim size" +msgstr "Tamaño del borde del pad" + +#: src/libslic3r/SLA/Pad.cpp:691 +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 msgid "Pad object connector penetration" msgstr "Penetración del conector del objeto al Pad" -#: src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2880 msgid "Pad object connector stride" msgstr "Paso del conector del objeto al Pad" -#: src/libslic3r/PrintConfig.cpp:2721 +#: src/libslic3r/PrintConfig.cpp:2889 msgid "Pad object connector width" msgstr "Anchura del conector del pad al objeto" -#: src/libslic3r/PrintConfig.cpp:2700 +#: src/libslic3r/PrintConfig.cpp:2869 msgid "Pad object gap" msgstr "Espacio del pad con el objeto" -#: src/libslic3r/PrintConfig.cpp:2532 +#: src/libslic3r/PrintConfig.cpp:2797 msgid "Pad wall height" msgstr "Altura de la pared del pad" -#: src/libslic3r/PrintConfig.cpp:2568 +#: src/libslic3r/PrintConfig.cpp:2844 msgid "Pad wall slope" msgstr "Pendiente de la pared del pad" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2787 msgid "Pad wall thickness" msgstr "Espesor de la pared del pad" -#: src/slic3r/GUI/Field.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +msgid "Page Down" +msgstr "Page Down" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Page Up" +msgstr "Page Up" + +#: src/slic3r/GUI/Field.cpp:139 msgid "parameter name" msgstr "nombre del parámetro" -#: src/slic3r/GUI/Field.cpp:184 +#: src/slic3r/GUI/Field.cpp:243 msgid "Parameter validation" msgstr "Validación de parámetros" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Part" msgstr "Pieza" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1881 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2494 msgid "Part manipulation" msgstr "Manipulación de piezas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2483 msgid "Part Settings to modify" msgstr "Configuraciones de piezas para modificar" -#: src/slic3r/GUI/GLCanvas3D.cpp:3449 +#: src/slic3r/GUI/GLCanvas3D.cpp:4514 msgid "Paste" msgstr "Pegar" -#: src/slic3r/GUI/MainFrame.cpp:456 +#: src/slic3r/GUI/MainFrame.cpp:592 msgid "Paste clipboard" msgstr "Pegar portapapeles" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 msgid "Paste from clipboard" msgstr "Pegar desde el portapapeles" -#: src/slic3r/GUI/Plater.cpp:4772 +#: src/slic3r/GUI/Plater.cpp:5606 msgid "Paste From Clipboard" msgstr "Pegar Desde Portapapeles" -#: src/libslic3r/PrintConfig.cpp:1915 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "Pattern" msgstr "Patrón" -#: src/libslic3r/PrintConfig.cpp:1805 +#: src/libslic3r/PrintConfig.cpp:1891 msgid "Pattern angle" msgstr "Ángulo del patrón" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:2016 msgid "Pattern spacing" msgstr "Espaciado entre patrones" -#: src/libslic3r/PrintConfig.cpp:1917 +#: src/libslic3r/PrintConfig.cpp:2004 msgid "Pattern used to generate support material." msgstr "Patrón utilizado para generar material de soporte." -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:198 +#: src/slic3r/GUI/Plater.cpp:1261 +msgid "Pause" +msgstr "Pausa" + +#: src/slic3r/GUI/DoubleSlider.cpp:1009 +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/Gizmos/GLGizmoCut.cpp:175 msgid "Perform cut" msgstr "Realizar corte" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/GCode/PreviewData.cpp:163 +#: src/libslic3r/PrintConfig.cpp:2927 +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 msgid "Perimeter" msgstr "Perímetro" -#: src/libslic3r/PrintConfig.cpp:1339 +#: src/libslic3r/PrintConfig.cpp:1408 msgid "Perimeter extruder" msgstr "Extrusor para perímetros" -#: src/slic3r/GUI/PresetHints.cpp:162 +#: src/slic3r/GUI/PresetHints.cpp:165 msgid "perimeters" msgstr "perímetros" -#: src/libslic3r/PrintConfig.cpp:1330 src/libslic3r/PrintConfig.cpp:1348 -#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1370 +#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440 msgid "Perimeters" msgstr "Perímetros" -#: src/slic3r/GUI/ConfigWizard.cpp:440 -#, possible-c-format -msgid "Pick another vendor supported by %s:" -msgstr "Escoge otro fabricante soportado por %s:" +#: src/slic3r/GUI/ConfigWizard.cpp:860 +#, c-format +msgid "Pick another vendor supported by %s" +msgstr "Elije otro proveedor compatible con% s" -#: src/libslic3r/PrintConfig.cpp:2430 +#: 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:2681 msgid "Pillar widening factor" msgstr "Factor de ensanchamiento del pilar" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:32 +#: src/slic3r/GUI/ConfigManipulation.cpp:330 +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 +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 msgid "Place on face" msgstr "Colocar en la cara" -#: src/slic3r/GUI/MainFrame.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:204 msgid "Plater" msgstr "Plataforma" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 -msgid "Plater Shortcuts" -msgstr "Atajos para la base" - -#: src/slic3r/GUI/GUI.cpp:143 +#: src/slic3r/GUI/GUI_App.cpp:1085 msgid "Please check and fix your object list." msgstr "Por favor comprueba y soluciona tu lista de objetos." -#: src/slic3r/GUI/Tab.cpp:2797 +#: src/slic3r/GUI/Plater.cpp:2312 src/slic3r/GUI/Tab.cpp:2959 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/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:286 +#: src/slic3r/GUI/Plater.cpp:3286 +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 msgid "Portions copyright" msgstr "Porciones del copyright" -#: src/libslic3r/PrintConfig.cpp:2235 +#: src/libslic3r/PrintConfig.cpp:2400 msgid "Portrait" msgstr "Retrato" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:193 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457 msgid "Position" msgstr "Posición" -#: src/slic3r/GUI/Tab.cpp:2265 +#: src/slic3r/GUI/Tab.cpp:2367 msgid "Position (for multi-extruder printers)" msgstr "Posición (para impresoras con múltiples extrusores )" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Position (mm)" -msgstr "Posición (mm)" - -#: src/libslic3r/PrintConfig.cpp:1553 +#: src/libslic3r/PrintConfig.cpp:1623 msgid "Position of perimeters starting points." msgstr "Posición de los puntos de inicio del perímetro." -#: src/libslic3r/PrintConfig.cpp:2123 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Position X" msgstr "Posición X" -#: src/libslic3r/PrintConfig.cpp:2130 +#: src/libslic3r/PrintConfig.cpp:2231 msgid "Position Y" msgstr "Posición Y" -#: src/slic3r/GUI/Tab.cpp:1187 src/libslic3r/PrintConfig.cpp:1383 +#: src/slic3r/GUI/Tab.cpp:1245 src/libslic3r/PrintConfig.cpp:1453 msgid "Post-processing scripts" msgstr "Scripts de postprocesamiento" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Pre&view" msgstr "Pre&visualizar" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 src/slic3r/GUI/Preferences.cpp:10 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10 msgid "Preferences" msgstr "Preferencias" -#: src/libslic3r/PrintConfig.cpp:1571 +#: src/libslic3r/PrintConfig.cpp:1641 msgid "Preferred direction of the seam" msgstr "Dirección preferida de la costura" -#: src/libslic3r/PrintConfig.cpp:1582 +#: src/libslic3r/PrintConfig.cpp:1652 msgid "Preferred direction of the seam - jitter" msgstr "Dirección preferida de la unión - jitter" -#: src/libslic3r/PrintObject.cpp:251 +#: src/libslic3r/PrintObject.cpp:255 msgid "Preparing infill" msgstr "Preparando relleno" -#: src/slic3r/GUI/Tab.cpp:2758 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:2920 +#, c-format msgid "Preset (%s)" msgstr "Ajuste inicial (%s)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Press to activate deselection rectangle\nor to scale or rotate selected objects\naround their own center" -msgstr "Presiona para activar el rectángulo de deselección \no para escalar o rotar los objetos seleccionados \nen torno a su propio centro" +#: src/slic3r/GUI/Tab.cpp:3082 +msgid "Preset with name \"%1%\" already exists." +msgstr "Ya existe un preset con el nombre \"% 1%\"." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/Tab.cpp:3029 +msgctxt "PresetName" +msgid "Copy" +msgstr "Copiar" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +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:146 -#, possible-c-format -msgid "Press to activate selection rectangle\nor to snap by 5% in Gizmo scale\nor to snap by 1mm in Gizmo move" -msgstr "Presiona para activar el rectángulo de selección\n o para ajustar un 5% en la escala Gizmo\n o para ajustar un 1 mm en el movimiento Gizmo" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +msgid "Press to activate selection rectangle" +msgstr "Presionar para activar el rectángulo de selección" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Press to scale selection to fit print volume\nin Gizmo scale" -msgstr "Presiona para escalar la selección para cuadrar en el volumen de impresión\nen escala Gizmo" +#: 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:127 -msgid "Press to select multiple object or move multiple object with mouse" -msgstr "Presiona para seleccionar objetos múltiples o mover objetos múltiples con el ratón" +#: 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/Tab.cpp:2288 +#: 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:211 src/slic3r/GUI/Plater.cpp:4105 +#: src/slic3r/GUI/Tab.cpp:2390 msgid "Preview" msgstr "Previsualización" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -msgid "Preview Shortcuts" -msgstr "Vista previa de accesos rápidos" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Preview hollowed and drilled model" +msgstr "Vista preliminar del modelo con su interior vaciado y taladrado" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:790 msgid "Previously sliced file (" msgstr "Archivo anterior laminado (" -#: src/libslic3r/PrintConfig.cpp:1773 +#: src/libslic3r/PrintConfig.cpp:1851 msgid "Prime all printing extruders" msgstr "Cebar todos los extrusores de impresión" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1274 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1521 msgid "print" msgstr "imprimir" -#: src/slic3r/GUI/MainFrame.cpp:510 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Print &Host Upload Queue" msgstr "Cola de subida al &host de impresión" -#: src/libslic3r/PrintConfig.cpp:439 +#: src/libslic3r/PrintConfig.cpp:471 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:541 +#: src/slic3r/GUI/ConfigWizard.cpp:952 msgid "Print Diameters" msgstr "Diámetros de impresión" -#: src/slic3r/GUI/Tab.cpp:1917 src/slic3r/GUI/Tab.cpp:2074 +#: src/slic3r/GUI/Tab.cpp:1944 src/slic3r/GUI/Tab.cpp:2123 msgid "Print Host upload" msgstr "Subida al host de impresión" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 -#: src/slic3r/GUI/PrintHostDialogs.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/PrintHostDialogs.cpp:136 msgid "Print host upload queue" msgstr "Cola de subida al host de impresión" -#: src/slic3r/GUI/Tab.hpp:317 src/slic3r/GUI/Tab.hpp:405 +#: src/slic3r/GUI/DoubleSlider.cpp:970 +msgid "Print mode" +msgstr "Modo de impresión" + +#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:431 msgid "Print Settings" msgstr "Configuración de Impresión" -#: src/slic3r/GUI/Plater.cpp:681 +#: src/slic3r/GUI/Plater.cpp:815 msgid "Print settings" msgstr "Configuración de impresión" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1478 msgid "Print speed override" msgstr "Anular la velocidad de impresión" -#: src/slic3r/GUI/MainFrame.cpp:483 -msgid "Print&er Settings Tab" -msgstr "Configura&ción de Impresión" +#: src/libslic3r/GCode.cpp:638 +msgid "Print z" +msgstr "Imprimir z" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1438 +#: src/slic3r/GUI/MainFrame.cpp:621 +msgid "Print&er Settings Tab" +msgstr "Configuración de Impr&esión" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1621 msgid "Printable" msgstr "Imprimible" -#: src/slic3r/GUI/Plater.cpp:685 +#: src/slic3r/GUI/Plater.cpp:819 msgid "Printer" msgstr "Impresora" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:48 src/slic3r/GUI/Preset.cpp:1278 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1525 msgid "printer" msgstr "impresora" -#: src/libslic3r/PrintConfig.cpp:2274 src/libslic3r/PrintConfig.cpp:2275 +#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 msgid "Printer absolute correction" msgstr "Corrección absoluta de la impresora" -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457 msgid "Printer gamma correction" msgstr "Corrección gamma de la impresora" -#: src/slic3r/GUI/Tab.cpp:926 +#: src/slic3r/GUI/Tab.cpp:976 msgid "printer model" msgstr "modelo de impresora" -#: src/libslic3r/PrintConfig.cpp:1402 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Printer notes" msgstr "Notas de la impresora" -#: src/libslic3r/PrintConfig.cpp:2266 src/libslic3r/PrintConfig.cpp:2267 -#: src/libslic3r/PrintConfig.cpp:2268 +#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2433 msgid "Printer scaling correction" msgstr "Corrección de escala de la impresora" -#: src/slic3r/GUI/Tab.hpp:368 +#: src/slic3r/GUI/Tab.hpp:391 msgid "Printer Settings" msgstr "Configuración de la Impresora" -#: src/libslic3r/PrintConfig.cpp:42 src/libslic3r/PrintConfig.cpp:43 +#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 msgid "Printer technology" msgstr "Tecnología de la impresora" -#: src/libslic3r/PrintConfig.cpp:1396 +#: src/libslic3r/PrintConfig.cpp:1466 msgid "Printer type" msgstr "Tipo de impresora" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1487 msgid "Printer variant" msgstr "Modelo de impresora" -#: src/libslic3r/PrintConfig.cpp:1411 +#: src/libslic3r/PrintConfig.cpp:1481 msgid "Printer vendor" msgstr "Fabricante de la impresora" -#: src/libslic3r/Print.cpp:1294 +#: src/libslic3r/Print.cpp:1388 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:715 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:849 +#, c-format msgid "Processing %s" msgstr "Procesando %s" -#: src/slic3r/GUI/Plater.cpp:1600 -#, possible-c-format -msgid "Processing input file %s\n" -msgstr "Procesando el archivo de entrada %s\n" +#: src/slic3r/GUI/Plater.cpp:2283 +#, c-format +msgid "Processing input file %s" +msgstr "Procesando el archivo de entrada %s" -#: src/libslic3r/PrintObject.cpp:110 +#: src/libslic3r/PrintObject.cpp:108 msgid "Processing triangulated mesh" msgstr "Procesando malla triangulada" -#: src/slic3r/GUI/Tab.cpp:1201 src/slic3r/GUI/Tab.cpp:1585 -#: src/slic3r/GUI/Tab.cpp:1993 src/slic3r/GUI/Tab.cpp:2087 -#: src/slic3r/GUI/Tab.cpp:3337 src/slic3r/GUI/Tab.cpp:3446 +#: 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 msgid "Profile dependencies" msgstr "Dependencias de perfil" -#: src/slic3r/GUI/PrintHostDialogs.cpp:149 +#: src/slic3r/GUI/ConfigWizard.cpp:566 +msgid "Profile:" +msgstr "Perfil:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:150 msgid "Progress" msgstr "Progreso" -#: src/slic3r/GUI/FirmwareDialog.cpp:779 +#: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Progress:" msgstr "Progreso:" -#: src/slic3r/GUI/MainFrame.cpp:542 +#: src/slic3r/GUI/MainFrame.cpp:684 msgid "Prusa 3D &Drivers" -msgstr "&Controladores de Prusa 3D" +msgstr "Controladores de Prusa 3&D" -#: src/slic3r/GUI/ConfigWizard.cpp:1109 +#: src/slic3r/GUI/ConfigWizard.cpp:1995 msgid "Prusa FFF Technology Printers" msgstr "Impresoras Prusa de tecnología FFF" -#: src/slic3r/GUI/ConfigWizard.cpp:1112 +#: src/slic3r/GUI/ConfigWizard.cpp:1998 msgid "Prusa MSLA Technology Printers" msgstr "Impresoras Prusa de tecnología MSLA" -#: src/slic3r/GUI/AboutDialog.cpp:255 +#: src/slic3r/GUI/AboutDialog.cpp:260 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/GUI_App.cpp:297 -#, 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/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/libslic3r/PrintConfig.cpp:2153 +#: 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/libslic3r/PrintConfig.cpp:2254 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:456 +#: src/slic3r/GUI/Plater.cpp:544 msgid "Purging volumes" msgstr "Volúmenes de purga" -#: src/libslic3r/PrintConfig.cpp:2106 +#: src/libslic3r/PrintConfig.cpp:2207 msgid "Purging volumes - load/unload volumes" msgstr "Volumen de purga - volumen de carga/descarga" -#: src/libslic3r/PrintConfig.cpp:2113 +#: src/libslic3r/PrintConfig.cpp:2214 msgid "Purging volumes - matrix" msgstr "Volúmenes de purga - matriz" -#: src/slic3r/GUI/Tab.cpp:1019 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +msgid "Quality" +msgstr "Calidad" + +#: src/slic3r/GUI/Tab.cpp:1080 msgid "Quality (slower slicing)" msgstr "Calidad (laminado más lento)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:854 src/slic3r/GUI/GUI_ObjectList.cpp:1139 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1145 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1377 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:273 +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 msgid "Quick Add Settings (%s)" msgstr "Añadir ajustes rápidos (%s)" -#: src/slic3r/GUI/MainFrame.cpp:383 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Quick Slice" msgstr "Laminado rápido" -#: src/slic3r/GUI/MainFrame.cpp:389 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Quick Slice and Save As" msgstr "Laminado rápido y Guardar como" -#: src/slic3r/GUI/MainFrame.cpp:409 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:540 +#, c-format msgid "Quit %s" msgstr "Cerrar %s" -#: src/libslic3r/PrintConfig.cpp:479 +#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511 msgid "Radius" msgstr "Radio" -#: src/slic3r/GUI/Tab.cpp:1066 +#: src/slic3r/GUI/Tab.cpp:1127 msgid "Raft" msgstr "Balsa" -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1501 msgid "Raft layers" msgstr "Capas de balsa" -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" msgstr "Configuración de empuje" -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 -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: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." -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 msgid "Ramming line spacing" msgstr "Espaciado de la linea de empuje" -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 msgid "Ramming line width" msgstr "Ancho de la linea de empuje" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Ramming parameters" msgstr "Parámetros de empuje" -#: src/slic3r/GUI/Tab.cpp:1545 +#: src/slic3r/GUI/Tab.cpp:1505 msgid "Ramming settings" msgstr "Ajustes de empuje" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "Random" msgstr "Aleatorio" -#: src/slic3r/GUI/wxExtensions.cpp:486 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 msgid "Range" msgstr "Rango" -#: src/libslic3r/SLAPrint.cpp:72 +#: src/libslic3r/SLAPrintSteps.cpp:65 msgid "Rasterizing layers" msgstr "Rastrerizando capas" -#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#: src/slic3r/GUI/MainFrame.cpp:596 +msgid "Re&load from disk" +msgstr "Recargar desde e&l disco" + +#: src/slic3r/GUI/UpdateDialogs.cpp:249 msgid "Re-configure" msgstr "Reconfigurar" -#: src/slic3r/GUI/FirmwareDialog.cpp:783 +#: src/slic3r/GUI/FirmwareDialog.cpp:821 msgid "Ready" msgstr "Listo" -#: src/slic3r/GUI/Plater.cpp:2406 +#: src/slic3r/GUI/Plater.cpp:3115 msgid "Ready to slice" msgstr "Preparado para laminar" -#: src/slic3r/GUI/MainFrame.cpp:526 src/libslic3r/PrintConfig.cpp:1562 +#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632 msgid "Rear" msgstr "Trasera" -#: src/slic3r/GUI/MainFrame.cpp:526 +#: src/slic3r/GUI/MainFrame.cpp:669 msgid "Rear View" msgstr "Vista trasera" -#: src/slic3r/GUI/MainFrame.cpp:401 +#: src/slic3r/GUI/MainFrame.cpp:413 msgid "Recent projects" -msgstr "Proyectos recientes" +msgstr "Proy&ectos recientes" -#: src/slic3r/GUI/PresetHints.cpp:262 -#, possible-c-format +#: src/slic3r/GUI/PresetHints.cpp:263 +#, 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 +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 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:386 src/slic3r/GUI/GUI_App.cpp:395 +#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459 msgid "Recreating" msgstr "Recreando" -#: src/slic3r/GUI/BedShapeDialog.cpp:68 +#: src/slic3r/GUI/BedShapeDialog.cpp:73 msgid "Rectangular" msgstr "Rectangular" -#: src/libslic3r/PrintConfig.cpp:398 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1922 +#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843 +#: src/libslic3r/PrintConfig.cpp:2009 msgid "Rectilinear" msgstr "Rectilíneo" -#: src/libslic3r/PrintConfig.cpp:1923 +#: src/libslic3r/PrintConfig.cpp:2010 msgid "Rectilinear grid" msgstr "Rejilla rectilínea" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3639 -#: src/slic3r/GUI/MainFrame.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131 +#: src/slic3r/GUI/MainFrame.cpp:584 msgid "Redo" msgstr "Rehacer" -#: src/slic3r/GUI/GLCanvas3D.cpp:3497 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 +#, 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:3479 +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 msgid "Redo History" msgstr "Rehacer Historia" -#: src/slic3r/GUI/Tab.cpp:1037 +#: src/slic3r/GUI/Tab.cpp:1098 msgid "Reducing printing time" msgstr "Reduciendo el tiempo de impresión" -#: src/slic3r/GUI/Plater.cpp:2924 -msgid "Reload from Disk" +#: src/slic3r/GUI/Plater.cpp:3452 +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 +msgid "Reload from disk" msgstr "Recargar desde el disco" -#: src/slic3r/GUI/Plater.cpp:2924 -msgid "Reload the selected file from Disk" -msgstr "Recargar el archivo seleccionado del disco" +#: src/slic3r/GUI/Plater.cpp:3339 +msgid "Reload from:" +msgstr "Recargar desde:" -#: src/slic3r/GUI/Preferences.cpp:36 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +msgid "Reload plater from disk" +msgstr "Recargar la base desde el disco" + +#: src/slic3r/GUI/MainFrame.cpp:597 +msgid "Reload the plater from disk" +msgstr "Cargar la base del disco" + +#: src/slic3r/GUI/Plater.cpp:3963 +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 +msgid "Reload the selected volumes from disk" +msgstr "Vuelve a cargar los volúmenes seleccionados desde el disco" + +#: src/slic3r/GUI/Preferences.cpp:39 msgid "Remember output directory" msgstr "Recordar el directorio de salida" -#: src/slic3r/GUI/Tab.cpp:2935 +#: src/slic3r/GUI/Tab.cpp:3121 msgid "remove" msgstr "eliminar" -#: src/slic3r/GUI/Tab.cpp:2937 +#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 +#: src/slic3r/GUI/Tab.cpp:3124 msgid "Remove" msgstr "Eliminar" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:859 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +msgid "Remove all holes" +msgstr "Elimina todos los huecos" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 msgid "Remove all points" msgstr "Eliminar todos los puntos" -#: src/slic3r/GUI/GLCanvas3D.cpp:3475 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 +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 msgid "Remove instance" msgstr "Retirar una copia" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Remove Instance of the selected object" msgstr "Retirar instancia del objeto seleccionado" @@ -4921,60 +5948,68 @@ msgstr "Retirar instancia del objeto seleccionado" msgid "Remove layer range" msgstr "Retirar rango de capas" -#: src/slic3r/GUI/Plater.cpp:3518 +#: src/slic3r/GUI/Plater.cpp:3942 msgid "Remove one instance of the selected object" msgstr "Eliminar una instancia del objeto seleccionado" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:83 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95 msgid "Remove parameter" msgstr "Eliminar parámetro" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1230 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 msgid "Remove point" msgstr "Retirar punto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1233 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 msgid "Remove point from selection" msgstr "Retirar punto de selección" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:855 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1237 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +msgid "Remove selected holes" +msgstr "Elimina huecos seleccionados" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1371 msgid "Remove selected points" msgstr "Eliminar puntos seleccionados" -#: src/slic3r/GUI/Plater.cpp:2891 src/slic3r/GUI/Plater.cpp:2909 +#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953 msgid "Remove the selected object" msgstr "Eliminar el objeto seleccionado" -#: src/slic3r/GUI/ConfigWizard.cpp:305 -msgid "Remove user profiles - install from scratch (a snapshot will be taken beforehand)" -msgstr "Eliminar perfiles de usuario - instalar desde cero (se realizará una instantánea con anterioridad)" +#: src/slic3r/GUI/ConfigWizard.cpp:453 +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:1200 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1636 msgid "Rename" msgstr "Renombrar" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:551 msgid "Rename Object" msgstr "Renombrar Objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:551 msgid "Rename Sub-object" msgstr "Renombrar Sub-Objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3803 msgid "Renaming" msgstr "Renombrar" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115 +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 msgid "Render with a software renderer" msgstr "Renderizar con un software renderizador" -#: src/libslic3r/PrintConfig.cpp:3126 +#: src/libslic3r/PrintConfig.cpp:3516 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:772 src/libslic3r/PrintConfig.cpp:3058 +#: src/slic3r/GUI/MainFrame.cpp:911 src/libslic3r/PrintConfig.cpp:3447 msgid "Repair" msgstr "Reparar" @@ -4998,279 +6033,310 @@ 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/KBShortcutsDialog.cpp:113 src/slic3r/GUI/MainFrame.cpp:395 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat last quick slice" msgstr "Repetir el último laminado rápido" -#: src/slic3r/GUI/MainFrame.cpp:395 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat Last Quick Slice" msgstr "Repetir el último laminado rápido" -#: src/slic3r/GUI/MainFrame.cpp:561 -msgid "Report an I&ssue" -msgstr "I&nformar de un problema" +#: src/slic3r/GUI/Tab.cpp:3083 +msgid "Replace?" +msgstr "¿Reemplazar?" -#: src/slic3r/GUI/MainFrame.cpp:561 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:703 +msgid "Report an I&ssue" +msgstr "Informar de un &problema" + +#: src/slic3r/GUI/MainFrame.cpp:703 +#, c-format msgid "Report an issue on %s" msgstr "Reportar un problema a %s" -#: src/slic3r/Utils/PresetUpdater.cpp:590 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:713 +#, c-format msgid "requires max. %s" msgstr "requiere max. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:588 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:710 +#, c-format msgid "requires min. %s" msgstr "requiere min. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:583 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:705 +#, c-format msgid "requires min. %s and max. %s" msgstr "requiere un min. %s y un max. %s" -#: src/slic3r/GUI/FirmwareDialog.cpp:772 +#: src/slic3r/GUI/FirmwareDialog.cpp:810 msgid "Rescan" msgstr "Rescanear" -#: src/slic3r/GUI/Tab.cpp:1879 +#: src/slic3r/GUI/Tab.cpp:1906 msgid "Rescan serial ports" msgstr "Vuelver a examinar los puertos serie" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1239 +#: src/slic3r/GUI/GLCanvas3D.cpp:313 +msgid "Reset" +msgstr "Reset" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1373 msgid "Reset clipping plane" msgstr "Restablecer plano de recorte" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:928 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 msgid "Reset direction" msgstr "Restablecer dirección" -#: src/slic3r/GUI/Plater.cpp:2603 +#: src/slic3r/GUI/Plater.cpp:2723 msgid "Reset Project" msgstr "Reiniciar Proyecto" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:303 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 msgid "Reset rotation" msgstr "Reiniciar rotación" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:328 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 msgid "Reset Rotation" msgstr "Reiniciar rotación" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:290 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 msgid "Reset scale" msgstr "Reiniciar escala" -#: src/slic3r/GUI/Tab.cpp:2584 +#: src/slic3r/GUI/GLCanvas3D.cpp:252 +msgid "Reset to base" +msgstr "Reiniciar a la base" + +#: src/slic3r/GUI/Tab.cpp:2394 msgid "Reset to Filament Color" msgstr "Reiniciar Filament Color" -#: src/libslic3r/PrintConfig.cpp:1441 +#: src/libslic3r/PrintConfig.cpp:1511 msgid "Resolution" msgstr "Resolución" -#: src/libslic3r/PrintConfig.cpp:1459 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Retract amount before wipe" msgstr "Retracta cantidad antes de limpiar" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1537 msgid "Retract on layer change" msgstr "Retraer en el cambio de capa" -#: src/slic3r/GUI/Tab.cpp:2268 +#: src/slic3r/GUI/Tab.cpp:1324 src/slic3r/GUI/Tab.cpp:1383 +#: src/slic3r/GUI/Tab.cpp:2370 msgid "Retraction" msgstr "Retracción" -#: src/libslic3r/PrintConfig.cpp:1453 +#: src/libslic3r/PrintConfig.cpp:1523 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:1474 +#: src/libslic3r/PrintConfig.cpp:1544 msgid "Retraction Length" msgstr "Longitud de retracción" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1552 msgid "Retraction Length (Toolchange)" msgstr "Longitud de retracción (cambio de herramienta)" -#: src/libslic3r/PrintConfig.cpp:1534 src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605 msgid "Retraction Speed" msgstr "Velocidad de retracción" -#: src/slic3r/GUI/Tab.cpp:2284 +#: src/slic3r/GUI/Tab.cpp:2386 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:244 +#: src/slic3r/GUI/GUI_Preview.cpp:254 msgid "Retractions" msgstr "Retracciones" -#: src/slic3r/GUI/MainFrame.cpp:528 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right" msgstr "Derecha" -#: src/slic3r/GUI/GUI_ObjectList.cpp:381 +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 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:279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 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:250 +#: src/slic3r/GUI/GUI_ObjectList.cpp:359 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:1232 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 msgid "Right click" msgstr "Click derecho" -#: src/slic3r/GUI/MainFrame.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:243 +msgid "Right mouse button:" +msgstr "Botón derecho del ratón:" + +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right View" msgstr "Vista derecha" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:233 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:253 -#: src/libslic3r/PrintConfig.cpp:3062 +#: 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 msgid "Rotate" msgstr "Girar" -#: src/libslic3r/PrintConfig.cpp:3067 +#: src/libslic3r/PrintConfig.cpp:3456 msgid "Rotate around X" msgstr "Rotar alrededor del eje X" -#: src/libslic3r/PrintConfig.cpp:3072 +#: src/libslic3r/PrintConfig.cpp:3461 msgid "Rotate around Y" msgstr "Rotar alrededor del eje Y" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:35 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 msgid "Rotate lower part upwards" msgstr "Poner patas arriba" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:151 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:194 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Rotate selection 45 degrees CCW" +msgstr "Gira la selección 45 grados en sentido antihorario" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +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 msgid "Rotation" msgstr "Rotación" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:491 -msgid "Rotation (deg)" -msgstr "Rotación (grados)" - -#: src/libslic3r/PrintConfig.cpp:3068 +#: src/libslic3r/PrintConfig.cpp:3457 msgid "Rotation angle around the X axis in degrees." msgstr "Ángulo de rotación alrededor del eje X en grados." -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3462 msgid "Rotation angle around the Y axis in degrees." msgstr "Ángulo de rotación alrededor del eje Y en grados." -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3452 msgid "Rotation angle around the Z axis in degrees." msgstr "Ángulo de rotación alrededor del eje Z en grados." -#: src/slic3r/GUI/ConfigWizard.cpp:298 src/slic3r/GUI/GUI_App.cpp:658 -#, possible-c-format +#: src/slic3r/GUI/GUI_App.cpp:797 +#, c-format msgid "Run %s" msgstr "Ejecutar %s" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:85 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:398 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478 msgid "Running post-processing scripts" msgstr "Ejecutando scripts de post-procesamiento" -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/RammingChart.cpp:81 -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 src/libslic3r/PrintConfig.cpp:612 -#: src/libslic3r/PrintConfig.cpp:656 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:2243 src/libslic3r/PrintConfig.cpp:2252 -#: src/libslic3r/PrintConfig.cpp:2312 src/libslic3r/PrintConfig.cpp:2319 +#: 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 msgid "s" msgstr "$" -#: src/slic3r/GUI/MainFrame.cpp:466 src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:750 msgid "S&end G-code" -msgstr "E&nviar código G" +msgstr "&Enviar código G" -#: src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:750 msgid "S&end to print" msgstr "E&nviar para imprimir" #. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3264 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:3417 +#, c-format msgid "Save %s as:" msgstr "Guardar %s como:" -#: src/slic3r/GUI/MainFrame.cpp:686 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:826 +#, c-format msgid "Save %s file as:" msgstr "Guardar archivo %s como:" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1023 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046 msgid "Save changes?" msgstr "¿Guardar cambios?" -#: src/libslic3r/PrintConfig.cpp:2997 +#: src/libslic3r/PrintConfig.cpp:3386 msgid "Save config file" msgstr "Guardar archivo de configuración" -#: src/slic3r/GUI/MainFrame.cpp:786 +#: src/slic3r/GUI/MainFrame.cpp:925 msgid "Save configuration as:" msgstr "Guardar la configuración como:" -#: src/libslic3r/PrintConfig.cpp:2998 +#: src/libslic3r/PrintConfig.cpp:3387 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 -#, possible-c-format +#, c-format msgid "Save current %s" msgstr "Guardar lo actual %s" -#: src/slic3r/GUI/MainFrame.cpp:341 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "Save current project file" msgstr "Guardar el proyecto actual como" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save current project file as" msgstr "Guardar archivo de proyecto actual como" -#: src/slic3r/GUI/Plater.cpp:1938 +#: src/slic3r/GUI/Plater.cpp:2604 msgid "Save file as:" msgstr "Guardar archivo como:" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/Plater.cpp:4839 msgid "Save G-code file as:" msgstr "Guardar archivo Código G como:" -#: src/slic3r/GUI/MainFrame.cpp:757 +#: src/slic3r/GUI/MainFrame.cpp:899 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:417 +#: src/slic3r/GUI/Tab.hpp:443 msgid "Save preset" msgstr "Guardar ajuste inicial" -#: src/slic3r/GUI/MainFrame.cpp:843 +#: src/slic3r/GUI/MainFrame.cpp:980 msgid "Save presets bundle as:" msgstr "Guarde el conjunto de ajustes iniciales como:" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save Project &as" -msgstr "Guardar proyecto &como" +msgstr "Gu&ardar proyecto como" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 -msgid "Save project (3MF)" -msgstr "Guardar proyecto (3MF)" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +msgid "Save project (3mf)" +msgstr "Guardar proyecto (3mf)" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +msgid "Save project as (3mf)" +msgstr "Guarda el proyecto como (3mf)" + +#: src/slic3r/GUI/Plater.cpp:4839 msgid "Save SL1 file as:" msgstr "Guardar archivo SL1 como:" -#: src/slic3r/GUI/MainFrame.cpp:692 +#: src/slic3r/GUI/MainFrame.cpp:838 msgid "Save zip file as:" msgstr "Guardar archivo zip como:" @@ -5280,58 +6346,63 @@ 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/GUI_ObjectManipulation.cpp:152 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:234 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:254 -#: src/libslic3r/PrintConfig.cpp:3077 +#: 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 msgid "Scale" msgstr "Escalar" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:276 -msgid "Scale (%)" -msgstr "Escalar (%)" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:195 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 msgid "Scale factors" msgstr "Factores de escala" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: 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 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:3086 +#: src/libslic3r/PrintConfig.cpp:3475 msgid "Scale to Fit" msgstr "Escalar para Adaptarse" -#: src/slic3r/GUI/Selection.cpp:947 +#: src/slic3r/GUI/Selection.cpp:939 msgid "Scale To Fit" msgstr "Escalar para Adaptarse" -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3476 msgid "Scale to fit the given volume." msgstr "Escalar para ajustarse al volumen dado." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1724 msgid "Scale to print volume" msgstr "Escalar al volumen de impresión" -#: src/libslic3r/PrintConfig.cpp:3078 +#: src/libslic3r/PrintConfig.cpp:3467 msgid "Scaling factor or percentage." msgstr "Factor de escalado o porcentaje." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:409 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505 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:1551 +#: src/libslic3r/PrintConfig.cpp:1621 msgid "Seam position" msgstr "Posición de la costura" -#: src/libslic3r/PrintConfig.cpp:1572 +#: src/libslic3r/PrintConfig.cpp:1642 msgid "Seam preferred direction" msgstr "Dirección de la costura" -#: src/libslic3r/PrintConfig.cpp:1581 +#: src/libslic3r/PrintConfig.cpp:1651 msgid "Seam preferred direction jitter" msgstr "Dirección preferida de unión jitter" @@ -5339,67 +6410,63 @@ msgstr "Dirección preferida de unión jitter" msgid "Searching for devices" msgstr "Buscando dispositivos" -#: src/slic3r/GUI/Plater.cpp:2190 +#: src/slic3r/GUI/Plater.cpp:2858 msgid "Searching for optimal orientation" msgstr "Buscando la orientación óptima" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 -msgid "Select All objects" +#: src/slic3r/GUI/GUI_App.cpp:1103 +msgid "Select a gcode file:" +msgstr "Seleccione un archivo gcode:" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Select all objects" msgstr "Seleccionar todos los objetos" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1236 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1370 msgid "Select all points" msgstr "Seleccionar todos los puntos" -#: src/slic3r/GUI/ConfigWizard.cpp:1089 +#: src/slic3r/GUI/ConfigWizard.cpp:1976 msgid "Select all standard printers" msgstr "Selecciona todas las impresoras estándar" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1234 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368 msgid "Select by rectangle" msgstr "Seleccionar mediante rectángulo" -#: src/slic3r/GUI/MainFrame.cpp:806 src/slic3r/GUI/MainFrame.cpp:870 +#: src/slic3r/GUI/MainFrame.cpp:944 src/slic3r/GUI/MainFrame.cpp:1006 msgid "Select configuration to load:" msgstr "Seleccione la configuración para cargar:" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82 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:2834 -msgid "Select extruder number for selected objects and/or parts" -msgstr "Selecciona el número de extrusor para los objetos y/o piezas seleccionados" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2847 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3971 msgid "Select extruder number:" msgstr "Selecciona el número de extrusores:" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 msgid "Select Filament Settings Tab" msgstr "Seleccionar pestaña de configuración de filamento" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1251 -msgid "Select new extruder for the object/part" -msgstr "Selecciona el nuevo extrusor para el objeto/pieza" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 msgid "Select Plater Tab" msgstr "Seleccionar pestaña de la Base de impresión" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 msgid "Select Print Settings Tab" msgstr "Seleccione la pestaña Configuración de impresión" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 msgid "Select Printer Settings Tab" msgstr "Selecciona pestaña de ajustes de impresora" -#: src/slic3r/GUI/GUI_ObjectList.cpp:917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1265 msgid "Select showing settings" msgstr "Seleccionar los ajustes mostrados" -#: src/slic3r/GUI/GUI_App.cpp:524 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Select the language" msgstr "Seleccione el idioma" @@ -5411,39 +6478,49 @@ msgstr "Seleccione los perfiles de impresión con las que este perfil es compati 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:744 +#: src/slic3r/GUI/MainFrame.cpp:889 msgid "Select the STL file to repair:" msgstr "Seleccione el archivo STL para reparar:" -#: src/slic3r/GUI/Preferences.cpp:207 +#: src/slic3r/GUI/Preferences.cpp:237 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:2545 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3553 msgid "Select type of part" msgstr "Selecciona el tipo de pieza" -#: src/slic3r/GUI/Plater.cpp:606 +#: src/slic3r/GUI/Plater.cpp:638 msgid "Select what kind of pad do you need" msgstr "Selecciona que tipo de pad necesitas" -#: src/slic3r/GUI/Plater.cpp:421 +#: src/slic3r/GUI/Plater.cpp:498 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/Selection.cpp:146 msgid "Selection-Add" msgstr "Selección-Añadir" -#: src/slic3r/GUI/Selection.cpp:384 +#: src/slic3r/GUI/Selection.cpp:376 msgid "Selection-Add All" msgstr "Selección-Añadir todos" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3299 msgid "Selection-Add from list" msgstr "Selección-Añadir de la lista" -#: src/slic3r/GUI/GLCanvas3D.cpp:5623 +#: src/slic3r/GUI/GLCanvas3D.cpp:6598 msgid "Selection-Add from rectangle" msgstr "Selección-Añadir del rectángulo" @@ -5459,15 +6536,15 @@ msgstr "Selección-Añadir Objeto" msgid "Selection-Remove" msgstr "Selección-Retirar" -#: src/slic3r/GUI/Selection.cpp:410 +#: src/slic3r/GUI/Selection.cpp:402 msgid "Selection-Remove All" msgstr "Selección-Retirar todo" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2867 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3291 msgid "Selection-Remove from list" msgstr "Selección-Retirar de la lista" -#: src/slic3r/GUI/GLCanvas3D.cpp:5642 +#: src/slic3r/GUI/GLCanvas3D.cpp:6617 msgid "Selection-Remove from rectangle" msgstr "Selección-Retirar del rectángulo" @@ -5479,11 +6556,11 @@ msgstr "Selección-Retirar Instancia" msgid "Selection-Remove Object" msgstr "Selección-Retirar Objeto" -#: src/slic3r/GUI/MainFrame.cpp:444 +#: src/slic3r/GUI/MainFrame.cpp:566 msgid "Selects all objects" msgstr "Seleccionar todos los objetos" -#: src/slic3r/GUI/Plater.cpp:3822 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5522 msgid "Send G-code" msgstr "Enviar código G" @@ -5491,27 +6568,31 @@ 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:466 +#: src/slic3r/GUI/MainFrame.cpp:481 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:731 src/slic3r/GUI/Plater.cpp:3822 +#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5522 msgid "Send to printer" msgstr "Enviar a la impresora" -#: src/slic3r/GUI/Tab.cpp:1169 +#: src/slic3r/GUI/GLCanvas3D.cpp:1305 +msgid "Seq." +msgstr "Sec." + +#: src/slic3r/GUI/Tab.cpp:1231 msgid "Sequential printing" msgstr "Impresión secuencial" -#: src/slic3r/GUI/Tab.cpp:1874 src/libslic3r/PrintConfig.cpp:1591 +#: src/slic3r/GUI/Tab.cpp:1901 src/libslic3r/PrintConfig.cpp:1661 msgid "Serial port" msgstr "Puerto serial" -#: src/libslic3r/PrintConfig.cpp:1599 +#: src/libslic3r/PrintConfig.cpp:1669 msgid "Serial port speed" msgstr "Velocidad del puerto serial" -#: src/slic3r/GUI/FirmwareDialog.cpp:769 +#: src/slic3r/GUI/FirmwareDialog.cpp:807 msgid "Serial port:" msgstr "Puerto serie:" @@ -5519,629 +6600,743 @@ msgstr "Puerto serie:" msgid "Service name" msgstr "Nombre del servicio" -#: src/slic3r/GUI/Tab.cpp:1824 src/slic3r/GUI/Tab.cpp:2025 -#: src/slic3r/GUI/Tab.cpp:3008 +#: src/slic3r/GUI/Tab.cpp:1802 src/slic3r/GUI/Tab.cpp:2046 +#: src/slic3r/GUI/Tab.cpp:3176 msgid "Set" msgstr "Ajuste" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1192 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1599 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 msgid "Set as a Separated Object" msgstr "Establecer como Objeto Separado" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 msgid "Set as a Separated Objects" msgstr "Establecer como Objetos Separados" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +msgid "Set extruder change for every" +msgstr "Establecer cambio de extrusor para cada" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1671 msgid "Set extruder for selected items" msgstr "Establecer el extrusor para elementos seleccionados" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 +msgid "Set extruder sequence" +msgstr "Establecer secuencia extrusor" + +#: src/slic3r/GUI/DoubleSlider.cpp:1532 +msgid "Set extruder sequence for the entire print" +msgstr "Fija la secuencia del extrusor para toda la impresión" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "Establecer secuencia extrusor(herramienta)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 msgid "Set lower thumb to current slider thumb" msgstr "Coloca el pulgar inferior en el control deslizante actual" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:245 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297 msgid "Set Mirror" msgstr "Establecer Reflejo" -#: src/slic3r/GUI/Plater.cpp:3520 +#: src/slic3r/GUI/Plater.cpp:3944 msgid "Set number of instances" msgstr "Establecer número de instancias" -#: src/slic3r/GUI/Plater.cpp:4163 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:4756 +#, c-format msgid "Set numbers of copies to %d" msgstr "Establecer el número de copias a %d" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:746 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781 msgid "Set Orientation" msgstr "Establecer Orientación" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:715 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750 msgid "Set Position" msgstr "Establecer Posición" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3759 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Printable" msgstr "Establecer Imprimible" -#: src/slic3r/GUI/Selection.cpp:1482 +#: src/slic3r/GUI/Selection.cpp:1475 msgid "Set Printable Instance" msgstr "Establecer Instancia imprimible" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846 msgid "Set Scale" msgstr "Establecer Escala" -#: src/libslic3r/PrintConfig.cpp:2228 +#: src/libslic3r/PrintConfig.cpp:2393 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:527 +#: src/slic3r/GUI/ConfigWizard.cpp:932 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:524 +#: src/libslic3r/PrintConfig.cpp:556 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:417 +#: src/libslic3r/PrintConfig.cpp:448 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:831 +#: src/libslic3r/PrintConfig.cpp:878 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:1689 +#: src/libslic3r/PrintConfig.cpp:1758 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:2019 +#: src/libslic3r/PrintConfig.cpp:2107 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:963 +#: src/libslic3r/PrintConfig.cpp:1011 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:1350 +#: src/libslic3r/PrintConfig.cpp:1419 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:1862 +#: src/libslic3r/PrintConfig.cpp:1948 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:480 +#: src/libslic3r/PrintConfig.cpp:512 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." -#: src/libslic3r/PrintConfig.cpp:65 +#: src/libslic3r/PrintConfig.cpp:81 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:469 +#: src/libslic3r/PrintConfig.cpp:501 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:3759 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Unprintable" msgstr "Establecer No imprimible" -#: src/slic3r/GUI/Selection.cpp:1482 +#: src/slic3r/GUI/Selection.cpp:1475 msgid "Set Unprintable Instance" msgstr "Establecer Instancia No Imprimible" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 msgid "Set upper thumb to current slider thumb" msgstr "Coloca el pulgar superior en el control deslizante actual" -#: src/slic3r/GUI/BedShapeDialog.cpp:143 +#: 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/slic3r/GUI/BedShapeDialog.cpp:155 msgid "Settings" msgstr "Ajustes" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 msgid "Settings for height range" msgstr "Ajustes para rango de alturas" -#: src/slic3r/GUI/BedShapeDialog.cpp:60 +#: src/slic3r/GUI/ConfigManipulation.cpp:162 +msgid "Shall I adjust those settings for supports?" +msgstr "¿Debo ajustar esa configuración para los soportes?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:89 +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 +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 +msgid "Shall I switch to rectilinear fill pattern?" +msgstr "¿Debo cambiar al patrón de relleno rectilíneo?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:139 +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 msgid "Shape" msgstr "Aspecto" -#: src/slic3r/GUI/GUI_Preview.cpp:246 +#: src/slic3r/GUI/GUI_Preview.cpp:256 msgid "Shells" msgstr "Carcasas" -#: src/slic3r/GUI/GUI_Preview.cpp:221 +#: src/slic3r/GUI/GLCanvas3D.cpp:249 +msgid "Shift + Left mouse button:" +msgstr "Mayús + botón izquierdo del ratón:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:255 +msgid "Shift + Right mouse button:" +msgstr "Mayús + botón derecho del ratón:" + +#: src/slic3r/GUI/GUI_Preview.cpp:231 msgid "Show" msgstr "Mostrar" -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show &Configuration Folder" msgstr "Mostrar carpeta &Configuración" -#: src/slic3r/GUI/MainFrame.cpp:563 +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Show &labels" +msgstr "Muestra &etiquetas" + +#: src/slic3r/GUI/MainFrame.cpp:705 msgid "Show about dialog" msgstr "Mostrar Acerca de" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show advanced settings" msgstr "Mostrar ajustes avanzados" -#: src/slic3r/GUI/PrintHostDialogs.cpp:158 +#: src/slic3r/GUI/PrintHostDialogs.cpp:159 msgid "Show error message" msgstr "Muestra mensaje de error" -#: src/slic3r/GUI/Preferences.cpp:84 +#: src/slic3r/GUI/Preferences.cpp:95 msgid "Show incompatible print and filament presets" msgstr "Mostrar impresiones incompatibles y ajustes iniciales de filamentos" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Show keyboard shortcuts list" msgstr "Muestra lista de atajos de teclado" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Show object/instance labels in 3D scene" +msgstr "Muestra etiquetas de pieza/repetición en vista 3D" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show simplified settings" msgstr "Muestra los ajustes simplificados" -#: src/slic3r/GUI/MainFrame.cpp:557 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52 +msgid "Show supports" +msgstr "Muestra soportes" + +#: src/slic3r/GUI/MainFrame.cpp:699 msgid "Show system information" msgstr "Mostrar la información del sistema" -#: src/slic3r/GUI/MainFrame.cpp:487 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "Show the 3D editing view" msgstr "Muestra la vista de edición 3D" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Show the 3D slices preview" msgstr "Muestra la vista 3D preliminar de las rebanadas" -#: src/slic3r/GUI/MainFrame.cpp:480 +#: src/slic3r/GUI/MainFrame.cpp:617 msgid "Show the filament settings" msgstr "Mostrar los ajustes de filamento" -#: src/libslic3r/PrintConfig.cpp:2983 +#: src/libslic3r/PrintConfig.cpp:3372 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:2988 +#: src/libslic3r/PrintConfig.cpp:3377 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:566 +#: src/slic3r/GUI/MainFrame.cpp:708 msgid "Show the list of the keyboard shortcuts" msgstr "Mostrar la lista de los atajos de teclado" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "Show the plater" msgstr "Mostrar la base" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "Show the print settings" msgstr "Mostrar los ajustes de impresión" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Show the printer settings" msgstr "Mostrar la configuración de la impresora" -#: src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:3366 msgid "Show this help." msgstr "Mostrar esta ayuda." -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show user configuration folder (datadir)" msgstr "Mostrar carpeta de configuración de usuario (datadir)" #: src/slic3r/GUI/KBShortcutsDialog.cpp:185 -msgid "Show/Hide (L)egend" -msgstr "Mostrar/Ocultar (L)eyenda" +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Mostrar/Ocultar cuadro de ajustes dispositivos 3Dconnexion" -#: src/slic3r/GUI/GUI_App.cpp:674 src/slic3r/GUI/wxExtensions.cpp:2459 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +msgid "Show/Hide Legend" +msgstr "Muestra/Oculta Leyenda" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +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 msgid "Simple" msgstr "Sencillo" -#: src/slic3r/GUI/GUI_App.cpp:674 +#: src/slic3r/GUI/ConfigWizard.cpp:820 +msgid "Simple mode" +msgstr "Modo Simple" + +#: src/slic3r/GUI/GUI_App.cpp:813 msgid "Simple View Mode" msgstr "Modo de visualización sencillo" -#: src/slic3r/GUI/Tab.cpp:2231 src/slic3r/GUI/Tab.cpp:2239 +#: src/slic3r/GUI/Tab.cpp:2298 src/slic3r/GUI/Tab.cpp:2306 msgid "Single extruder MM setup" msgstr "Ajuste para MM con un solo extrusor" -#: src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1845 msgid "Single Extruder Multi Material" msgstr "Extrusor único de múltiples materiales" -#: src/slic3r/GUI/Tab.cpp:2023 -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: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:2240 +#: src/slic3r/GUI/Tab.cpp:2307 msgid "Single extruder multimaterial parameters" msgstr "Parámetros multimaterial para un sólo extrusor" -#: src/slic3r/GUI/BedShapeDialog.cpp:72 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 src/slic3r/GUI/Plater.cpp:137 -#: src/slic3r/GUI/Tab.cpp:2257 +#: 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 msgid "Size" msgstr "Tamaño" -#: src/slic3r/GUI/Tab.cpp:1813 src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:1797 src/slic3r/GUI/Tab.cpp:2041 msgid "Size and coordinates" msgstr "Tamaño y coordenadas" -#: src/slic3r/GUI/BedShapeDialog.cpp:73 +#: src/slic3r/GUI/BedShapeDialog.cpp:78 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:235 src/slic3r/GUI/Tab.cpp:1050 -#: src/libslic3r/GCode/PreviewData.cpp:171 +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1111 +#: src/libslic3r/ExtrusionEntity.cpp:318 msgid "Skirt" msgstr "Falda" -#: src/slic3r/GUI/Tab.cpp:1049 +#: src/slic3r/GUI/Tab.cpp:1110 msgid "Skirt and brim" msgstr "Falda y balsa" -#: src/libslic3r/PrintConfig.cpp:1617 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "Skirt height" msgstr "Altura de la falda" -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Skirt Loops" msgstr "Vueltas de la falda" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1200 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1334 msgid "SLA gizmo keyboard shortcuts" msgstr "SLA gizmo atajos de teclado" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1150 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1058 msgid "SLA gizmo turned off" msgstr "Gizmo SLA apagado" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1115 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1017 msgid "SLA gizmo turned on" msgstr "Gizmo SLA encendido" -#: src/slic3r/GUI/Plater.cpp:684 src/slic3r/GUI/Preset.cpp:1277 +#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1524 msgid "SLA material" msgstr "Material SLA" -#: src/slic3r/GUI/Plater.cpp:683 src/slic3r/GUI/Preset.cpp:1276 +#: src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "SLA Material Profiles Selection" +msgstr "Selección Perfiles de Material SLA" + +#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471 +msgid "SLA material type" +msgstr "Tipo Material SLA" + +#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "SLA Materials" +msgstr "Materiales SLA" + +#: src/slic3r/GUI/Preset.cpp:1523 msgid "SLA print" msgstr "Impresión SLA" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2578 msgid "SLA print material notes" msgstr "Notas del material de impresión de SLA" -#: src/slic3r/GUI/Plater.cpp:690 +#: src/slic3r/GUI/Plater.cpp:817 msgid "SLA print settings" msgstr "Ajustes de impresión SLA" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:997 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:996 msgid "SLA Support Points" msgstr "Puntos de soporte SLA" -#: src/slic3r/GUI/GLCanvas3D.cpp:722 +#: 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/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/ConfigWizard.cpp:1530 +msgid "SLA Technology Printers" +msgstr "Impresoras de tecnología SLA" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Slab" msgstr "Rebanada" -#: src/libslic3r/PrintConfig.cpp:1268 +#: src/libslic3r/PrintConfig.cpp:1333 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:89 +#: src/libslic3r/PrintConfig.cpp:105 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:82 +#: 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/slic3r/GUI/ConfigSnapshotDialog.cpp:45 -msgid "slic3r version" -msgstr "versión de Slic3r" - -#: src/libslic3r/PrintConfig.cpp:1234 +#: src/libslic3r/PrintConfig.cpp:1299 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:2970 +#: src/libslic3r/PrintConfig.cpp:3359 msgid "Slice" msgstr "Laminar" -#: src/slic3r/GUI/MainFrame.cpp:383 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Slice a file into a G-code" msgstr "Laminar un archivo en un código G" -#: src/slic3r/GUI/MainFrame.cpp:389 +#: src/slic3r/GUI/MainFrame.cpp:518 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:71 +#: src/libslic3r/PrintConfig.cpp:87 msgid "Slice gap closing radius" msgstr "Radio de cierre de los huecos al laminar" -#: src/slic3r/GUI/Plater.cpp:734 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3618 +#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3121 +#: src/slic3r/GUI/Plater.cpp:5110 msgid "Slice now" msgstr "Laminar ahora" -#: src/libslic3r/PrintConfig.cpp:2944 +#: src/libslic3r/PrintConfig.cpp:3333 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:2965 +#: src/libslic3r/PrintConfig.cpp:3354 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:2971 +#: src/libslic3r/PrintConfig.cpp:3360 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:193 +#: src/slic3r/GUI/Plater.cpp:216 msgid "Sliced Info" msgstr "Información del laminado" -#: src/slic3r/GUI/MainFrame.cpp:704 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3615 src/slic3r/GUI/Tab.cpp:1159 -#: src/slic3r/GUI/Tab.cpp:3436 +#: 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 msgid "Slicing" msgstr "Rebanando" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:91 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184 msgid "Slicing complete" msgstr "Laminado terminado" -#: src/libslic3r/SLAPrint.cpp:1459 +#: src/libslic3r/SLAPrint.cpp:760 msgid "Slicing done" msgstr "Laminado terminado" -#: src/slic3r/GUI/MainFrame.cpp:729 +#: src/slic3r/GUI/MainFrame.cpp:874 msgid "Slicing Done!" msgstr "¡Laminado realizado!" -#: src/libslic3r/SLAPrint.cpp:759 +#: src/libslic3r/SLAPrintSteps.cpp:245 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/SLAPrint.cpp:55 +#: src/libslic3r/SLAPrintSteps.cpp:45 msgid "Slicing model" msgstr "Rebanando modelo" -#: src/libslic3r/SLAPrint.cpp:59 +#: src/libslic3r/SLAPrintSteps.cpp:49 msgid "Slicing supports" msgstr "Soportes para el laminado" -#: src/libslic3r/PrintConfig.cpp:2249 +#: src/libslic3r/PrintConfig.cpp:2414 msgid "Slow" msgstr "Lenta" -#: src/libslic3r/PrintConfig.cpp:1635 +#: src/libslic3r/PrintConfig.cpp:1705 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:2250 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "Slow tilt" msgstr "Inclinación lenta" -#: src/libslic3r/PrintConfig.cpp:1646 +#: src/libslic3r/PrintConfig.cpp:1715 msgid "Small perimeters" msgstr "Perímetros pequeños" -#: src/slic3r/GUI/GUI_App.cpp:697 +#: src/slic3r/GUI/GLCanvas3D.cpp:288 +msgid "Smooth" +msgstr "Suave" + +#: src/slic3r/GUI/GLCanvas3D.cpp:258 +msgid "Smoothing" +msgstr "Suavizado" + +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Snapshot name" msgstr "Nombre de la instantánea" -#: src/slic3r/GUI/MainFrame.cpp:549 +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Software &Releases" -msgstr "&Lanzamientos de Software" +msgstr "Lanzamientos de Softwa&re" -#: src/slic3r/GUI/PresetHints.cpp:181 +#: src/slic3r/GUI/PresetHints.cpp:184 msgid "solid infill" msgstr "relleno sólido" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/PrintConfig.cpp:1687 -#: src/libslic3r/PrintConfig.cpp:1697 src/libslic3r/GCode/PreviewData.cpp:167 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767 msgid "Solid infill" msgstr "Relleno sólido" -#: src/libslic3r/PrintConfig.cpp:1675 +#: src/libslic3r/PrintConfig.cpp:1744 msgid "Solid infill every" msgstr "Relleno sólido cada" -#: src/libslic3r/PrintConfig.cpp:1667 +#: src/libslic3r/PrintConfig.cpp:1736 msgid "Solid infill extruder" msgstr "Extrusor para el relleno sólido" -#: src/libslic3r/PrintConfig.cpp:1658 +#: src/libslic3r/PrintConfig.cpp:1727 msgid "Solid infill threshold area" msgstr "Área del umbral de relleno sólido" -#: src/slic3r/GUI/Tab.cpp:1014 src/libslic3r/PrintConfig.cpp:1710 +#: src/slic3r/GUI/Tab.cpp:1065 src/libslic3r/PrintConfig.cpp:1780 msgid "Solid layers" msgstr "Capas sólidas" -#: src/libslic3r/PrintConfig.cpp:711 +#: src/libslic3r/PrintConfig.cpp:754 msgid "Soluble material" msgstr "Material soluble" -#: src/libslic3r/PrintConfig.cpp:712 +#: src/libslic3r/PrintConfig.cpp:755 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:914 +#: src/libslic3r/PrintConfig.cpp:937 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:721 -msgid "Some objects are not visible when editing supports" -msgstr "Algunos objetos no son visibles cuando al editar soportes" +#: src/slic3r/GUI/GLCanvas3D.cpp:688 +msgid "Some objects are not visible" +msgstr "Algunas piezas no son visibles" -#: src/libslic3r/Print.cpp:1162 +#: src/libslic3r/Print.cpp:1226 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:1177 +#: src/libslic3r/Print.cpp:1228 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:2548 +#: src/libslic3r/PrintConfig.cpp:2824 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:2086 +#: src/libslic3r/PrintConfig.cpp:2187 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:1897 +#: src/libslic3r/PrintConfig.cpp:1984 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." -#: src/libslic3r/PrintConfig.cpp:1931 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "Spacing between support material lines." msgstr "Espaciado entre las líneas de material de soporte." -#: src/slic3r/GUI/GUI_ObjectList.cpp:71 src/slic3r/GUI/GUI_ObjectList.cpp:512 -#: src/slic3r/GUI/GUI_Preview.cpp:215 src/slic3r/GUI/Tab.cpp:1084 -#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:426 -#: src/libslic3r/PrintConfig.cpp:871 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1361 src/libslic3r/PrintConfig.cpp:1598 -#: src/libslic3r/PrintConfig.cpp:1647 src/libslic3r/PrintConfig.cpp:1698 -#: src/libslic3r/PrintConfig.cpp:2029 +#: 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 msgid "Speed" msgstr "Velocidad" -#: src/libslic3r/PrintConfig.cpp:1600 +#: 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:400 +#: src/libslic3r/GCode/PreviewData.cpp:351 msgid "Speed (mm/s)" msgstr "Velocidad (mm/s)" -#: src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:920 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:1097 +#: src/slic3r/GUI/Tab.cpp:1158 msgid "Speed for non-print moves" msgstr "Velocidad para movimientos sin impresión" -#: src/libslic3r/PrintConfig.cpp:1362 +#: src/libslic3r/PrintConfig.cpp:1432 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:1085 +#: src/slic3r/GUI/Tab.cpp:1146 msgid "Speed for print moves" msgstr "Velocidad para movimientos de impresión" -#: src/libslic3r/PrintConfig.cpp:200 +#: src/libslic3r/PrintConfig.cpp:236 msgid "Speed for printing bridges." msgstr "Velocidad para imprimir puentes." -#: src/libslic3r/PrintConfig.cpp:1699 +#: src/libslic3r/PrintConfig.cpp:1769 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:1906 +#: src/libslic3r/PrintConfig.cpp:1993 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:1940 +#: src/libslic3r/PrintConfig.cpp:2027 msgid "Speed for printing support material." msgstr "Velocidad para imprimir material de soporte." -#: src/libslic3r/PrintConfig.cpp:1000 +#: src/libslic3r/PrintConfig.cpp:1049 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:2030 +#: src/libslic3r/PrintConfig.cpp:2119 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:2052 +#: src/libslic3r/PrintConfig.cpp:2153 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:627 +#: src/libslic3r/PrintConfig.cpp:659 msgid "Speed of the first cooling move" msgstr "Velocidad del primer movimiento de enfriamiento" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:678 msgid "Speed of the last cooling move" msgstr "Velocidad del último movimiento de enfriamiento" -#: src/libslic3r/PrintConfig.cpp:585 +#: src/libslic3r/PrintConfig.cpp:616 msgid "Speed used at the very beginning of loading phase." msgstr "Velocidad utilizada al inicio de la fase de carga." -#: src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:608 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:593 +#: src/libslic3r/PrintConfig.cpp:624 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:602 +#: src/libslic3r/PrintConfig.cpp:633 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/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/Mouse3DController.cpp:296 +msgid "Speed:" +msgstr "Velocidad:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Sphere" msgstr "Esfera" -#: src/libslic3r/PrintConfig.cpp:1717 +#: src/libslic3r/PrintConfig.cpp:1794 msgid "Spiral vase" msgstr "Modo vaso" -#: src/slic3r/GUI/Plater.cpp:2971 src/slic3r/GUI/Plater.cpp:2988 -#: src/slic3r/GUI/Plater.cpp:3008 src/libslic3r/PrintConfig.cpp:3082 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 +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 msgid "Split" msgstr "Dividir" -#: src/slic3r/GUI/Plater.cpp:2971 +#: src/slic3r/GUI/Plater.cpp:4019 msgid "Split the selected object" msgstr "Dividir el objeto seleccionado" -#: src/slic3r/GUI/Plater.cpp:2966 src/slic3r/GUI/Plater.cpp:2988 +#: src/slic3r/GUI/Plater.cpp:4014 src/slic3r/GUI/Plater.cpp:4034 msgid "Split the selected object into individual objects" msgstr "Dividir el objeto seleccionado en objetos individuales" -#: src/slic3r/GUI/Plater.cpp:2968 src/slic3r/GUI/Plater.cpp:3008 +#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4048 msgid "Split the selected object into individual sub-parts" msgstr "Dividir el objeto seleccionado en subpartes individuales" -#: src/slic3r/GUI/GLCanvas3D.cpp:3490 +#: src/slic3r/GUI/GLCanvas3D.cpp:4550 msgid "Split to objects" msgstr "Partir en varias piezas" -#: src/slic3r/GUI/Plater.cpp:2796 +#: src/slic3r/GUI/Plater.cpp:2981 msgid "Split to Objects" msgstr "Partir en Varias Piezas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1110 +#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1487 msgid "Split to parts" msgstr "Separar en piezas" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1904 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2274 msgid "Split to Parts" msgstr "Separar en Piezas" -#: src/libslic3r/PrintConfig.cpp:799 +#: src/slic3r/GUI/ConfigWizard.cpp:289 +msgid "Standard" +msgstr "Estándar" + +#: src/libslic3r/PrintConfig.cpp:846 msgid "Stars" msgstr "Estrellas" -#: src/slic3r/GUI/MainFrame.cpp:376 +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "Start a new project" msgstr "Empezar un nuevo proyecto" @@ -6149,12 +7344,12 @@ msgstr "Empezar un nuevo proyecto" msgid "Start at height" msgstr "Comenzar en altura" -#: src/slic3r/GUI/Tab.cpp:1564 src/slic3r/GUI/Tab.cpp:1949 -#: src/libslic3r/PrintConfig.cpp:1736 src/libslic3r/PrintConfig.cpp:1751 +#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1976 +#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828 msgid "Start G-code" msgstr "Comenzar el código G" -#: src/slic3r/GUI/MainFrame.cpp:403 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "Start new slicing process" msgstr "Comenzar un nuevo proceso de laminado" @@ -6162,24 +7357,24 @@ 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:150 +#: src/slic3r/GUI/PrintHostDialogs.cpp:151 msgid "Status" msgstr "Estado" -#: src/slic3r/GUI/FirmwareDialog.cpp:782 +#: src/slic3r/GUI/FirmwareDialog.cpp:820 msgid "Status:" msgstr "Estado:" -#: src/slic3r/GUI/Tab.cpp:2158 +#: src/slic3r/GUI/Tab.cpp:2209 msgid "Stealth" msgstr "Silencio" -#: src/slic3r/GUI/Plater.cpp:1084 +#: src/slic3r/GUI/Plater.cpp:1291 msgid "stealth mode" msgstr "modo silencioso" -#: src/slic3r/GUI/Plater.cpp:3545 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:4985 +#, c-format msgid "STL file exported to %s" msgstr "Archivo STL exportado a %s" @@ -6187,699 +7382,906 @@ msgstr "Archivo STL exportado a %s" msgid "Stop at height" msgstr "Parar en altura" -#: src/slic3r/GUI/Tab.cpp:1716 src/slic3r/GUI/Tab.cpp:1901 +#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:1928 msgid "Success!" msgstr "¡Éxito!" -#: src/slic3r/GUI/PresetHints.cpp:200 +#: src/slic3r/GUI/PresetHints.cpp:203 msgid "support" msgstr "soporte" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2692 msgid "Support base diameter" msgstr "Diámetro de la base del soporte" -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "Support base height" msgstr "Altura de la base del soporte" -#: src/libslic3r/PrintConfig.cpp:2566 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "Support base safety distance" msgstr "Distancia de seguridad de la base de soportes" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Support Blocker" msgstr "Bloqueo de soporte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Support Enforcer" msgstr "Refuerzo de soporte" -#: src/slic3r/GUI/Tab.cpp:3401 +#: src/slic3r/GUI/ConfigManipulation.cpp:163 +msgid "Support Generator" +msgstr "Generador de Soportes" + +#: src/slic3r/GUI/Tab.cpp:3608 msgid "Support head" msgstr "Cabeza del soporte" -#: src/libslic3r/PrintConfig.cpp:2369 +#: src/libslic3r/PrintConfig.cpp:2620 msgid "Support head front diameter" msgstr "Diámetro del frontal de la cabeza del soporte" -#: src/libslic3r/PrintConfig.cpp:2378 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "Support head penetration" msgstr "Penetración de la cabeza del soporte" -#: src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2638 msgid "Support head width" msgstr "Ancho de la cabeza del soporte" -#: src/slic3r/GUI/PresetHints.cpp:210 +#: src/slic3r/GUI/PresetHints.cpp:213 msgid "support interface" msgstr "interfaz de soporte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:70 -#: src/slic3r/GUI/GUI_ObjectList.cpp:511 src/slic3r/GUI/GUI_Preview.cpp:236 -#: src/slic3r/GUI/Tab.cpp:1059 src/slic3r/GUI/Tab.cpp:1060 -#: src/libslic3r/PrintConfig.cpp:334 src/libslic3r/PrintConfig.cpp:1432 -#: src/libslic3r/PrintConfig.cpp:1780 src/libslic3r/PrintConfig.cpp:1786 -#: src/libslic3r/PrintConfig.cpp:1794 src/libslic3r/PrintConfig.cpp:1806 -#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:1824 -#: src/libslic3r/PrintConfig.cpp:1839 src/libslic3r/PrintConfig.cpp:1860 -#: src/libslic3r/PrintConfig.cpp:1871 src/libslic3r/PrintConfig.cpp:1887 -#: src/libslic3r/PrintConfig.cpp:1896 src/libslic3r/PrintConfig.cpp:1905 -#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1930 -#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1939 -#: src/libslic3r/PrintConfig.cpp:1948 src/libslic3r/PrintConfig.cpp:1956 -#: src/libslic3r/PrintConfig.cpp:1970 src/libslic3r/GCode/PreviewData.cpp:172 +#: 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 msgid "Support material" msgstr "Material de soporte" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/PrintConfig.cpp:1904 -#: src/libslic3r/GCode/PreviewData.cpp:173 +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/libslic3r/PrintConfig.cpp:1991 msgid "Support material interface" msgstr "Interfaz del material de soporte" -#: src/libslic3r/PrintConfig.cpp:1957 +#: src/libslic3r/PrintConfig.cpp:2044 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:1877 +#: src/libslic3r/PrintConfig.cpp:1964 msgid "Support material/raft interface extruder" msgstr "Extrusor para el material de soporte o balsa" -#: src/libslic3r/PrintConfig.cpp:1851 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Support material/raft/skirt extruder" msgstr "Extrusor para el material de soporte/falda/balsa" -#: src/slic3r/GUI/Plater.cpp:423 src/libslic3r/PrintConfig.cpp:1815 -#: src/libslic3r/PrintConfig.cpp:2423 +#: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "Support on build plate only" msgstr "Soporte en la base solamente" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:991 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888 msgid "Support parameter change" msgstr "Cambio de parámetros de soporte" -#: src/slic3r/GUI/Tab.cpp:3406 +#: src/slic3r/GUI/Tab.cpp:3613 msgid "Support pillar" msgstr "Pilares de soporte" -#: src/libslic3r/PrintConfig.cpp:2407 +#: src/libslic3r/PrintConfig.cpp:2658 msgid "Support pillar connection mode" msgstr "Modo de conexión de los pilares de soporte" -#: src/libslic3r/PrintConfig.cpp:2397 +#: src/libslic3r/PrintConfig.cpp:2648 msgid "Support pillar diameter" msgstr "Diámetro de los puntos de soporte" -#: src/libslic3r/PrintConfig.cpp:2499 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/libslic3r/PrintConfig.cpp:2764 msgid "Support points density" msgstr "Densidad de los puntos de soporte" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1196 msgid "Support points edit" msgstr "Edición de puntos de soporte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:78 src/slic3r/GUI/GUI_ObjectList.cpp:519 -#: src/slic3r/GUI/Plater.cpp:418 src/slic3r/GUI/Tab.cpp:3397 -#: src/slic3r/GUI/Tab.cpp:3398 src/libslic3r/PrintConfig.cpp:2363 -#: src/libslic3r/PrintConfig.cpp:2370 src/libslic3r/PrintConfig.cpp:2379 -#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2398 -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2431 -#: src/libslic3r/PrintConfig.cpp:2442 src/libslic3r/PrintConfig.cpp:2452 -#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2471 -#: src/libslic3r/PrintConfig.cpp:2480 src/libslic3r/PrintConfig.cpp:2490 -#: src/libslic3r/PrintConfig.cpp:2500 src/libslic3r/PrintConfig.cpp:2508 +#: 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 msgid "Supports" msgstr "Soportes" -#: src/slic3r/GUI/Plater.cpp:1018 +#: src/slic3r/GUI/Plater.cpp:1194 msgid "supports and pad" msgstr "soportes y pad" -#: src/libslic3r/PrintConfig.cpp:1043 +#: src/libslic3r/PrintConfig.cpp:1092 msgid "Supports remaining times" msgstr "Compatible con tiempos restantes" -#: src/libslic3r/PrintConfig.cpp:1053 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Supports stealth mode" msgstr "Soporta modo silencioso" -#: src/slic3r/GUI/Preferences.cpp:76 +#: 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/Preferences.cpp:87 msgid "Suppress \" - default - \" presets" msgstr "Suprima los ajustes iniciales \"- predeterminado -\"" -#: src/slic3r/GUI/Preferences.cpp:78 +#: src/slic3r/GUI/Preferences.cpp:89 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:677 +#: src/slic3r/GUI/MainFrame.cpp:826 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +#: src/slic3r/GUI/DoubleSlider.cpp:1144 +msgid "Switch code to Change extruder" +msgstr "Cambiar código para cambiar extrusor" + +#: src/slic3r/GUI/DoubleSlider.cpp:1179 +msgid "Switch code to Color change (%1%) for:" +msgstr "Código para cambiar de color (%1%) para:" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Switch to 3D" msgstr "Cambiar a 3D" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1376 msgid "Switch to editing mode" msgstr "Cambiar al modo edición" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Switch to Preview" msgstr "Cambiar a Previsualización" -#: src/slic3r/GUI/wxExtensions.cpp:2412 -#, possible-c-format +#: src/slic3r/GUI/wxExtensions.cpp:703 +#, c-format msgid "Switch to the %s mode" msgstr "Cambiar al modo %s" -#: src/slic3r/GUI/GUI_App.cpp:752 -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/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/WipeTowerDialog.cpp:327 -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/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?" -#: src/libslic3r/PrintConfig.cpp:1949 +#: src/slic3r/GUI/Tab.cpp:1014 +msgid "symbolic profile name" +msgstr "nombre perfil simbólico" + +#: src/libslic3r/PrintConfig.cpp:2036 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:1947 +#: src/libslic3r/PrintConfig.cpp:2034 msgid "Synchronize with object layers" msgstr "Sincronizar con capas las del objeto" -#: src/slic3r/GUI/MainFrame.cpp:557 +#: src/slic3r/GUI/MainFrame.cpp:699 msgid "System &Info" msgstr "&Información del Sistema" -#: src/slic3r/GUI/SysInfoDialog.cpp:44 +#: src/slic3r/GUI/SysInfoDialog.cpp:78 msgid "System Information" msgstr "Información del sistema" -#: src/slic3r/GUI/Preset.cpp:930 src/slic3r/GUI/Preset.cpp:970 -#: src/slic3r/GUI/Preset.cpp:1035 src/slic3r/GUI/Preset.cpp:1067 -#: src/slic3r/GUI/PresetBundle.cpp:1488 src/slic3r/GUI/PresetBundle.cpp:1553 +#: 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 msgid "System presets" msgstr "Ajustes del sistema" -#: src/slic3r/GUI/GUI_App.cpp:662 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Take Configuration &Snapshot" -msgstr "Tomar una &Captura de la configuración" +msgstr "&Tomar una Captura de la configuración" -#: src/slic3r/GUI/GUI_App.cpp:697 +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Taking configuration snapshot" msgstr "Haciendo una instantánea de la configuración" -#: src/libslic3r/PrintConfig.cpp:1980 +#: src/slic3r/GUI/Tab.cpp:1433 src/libslic3r/PrintConfig.cpp:2067 msgid "Temperature" msgstr "Temperatura" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1804 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:1726 +#: src/libslic3r/PrintConfig.cpp:1803 msgid "Temperature variation" msgstr "Variación de temperatura" -#: src/slic3r/GUI/ConfigWizard.cpp:592 +#: src/slic3r/GUI/ConfigWizard.cpp:1017 msgid "Temperatures" msgstr "Temperaturas" -#: src/slic3r/GUI/Tab.cpp:1700 src/slic3r/GUI/Tab.cpp:1888 +#: src/slic3r/GUI/Tab.cpp:1677 src/slic3r/GUI/Tab.cpp:1915 msgid "Test" msgstr "Test" -#: src/slic3r/GUI/BedShapeDialog.cpp:171 +#: src/slic3r/GUI/BedShapeDialog.cpp:172 msgid "Texture" msgstr "Textura" -#: src/slic3r/GUI/FirmwareDialog.cpp:530 -#, possible-c-format +#: src/slic3r/GUI/ConfigManipulation.cpp:208 +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 msgid "The %s device could not have been found" msgstr "El dispositivo %s no se pudo encontrar" -#: src/slic3r/GUI/FirmwareDialog.cpp:417 -#, 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/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 ..." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 -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." +#: src/slic3r/GUI/Tab.cpp:976 +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." 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:2462 +#: src/libslic3r/PrintConfig.cpp:2726 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:670 +#: src/libslic3r/SLAPrint.cpp:631 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:457 +#: src/libslic3r/PrintConfig.cpp:489 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:955 +#: src/libslic3r/PrintConfig.cpp:1003 msgid "The extruder to use when printing infill." msgstr "El extrusor que se usa cuando se imprime relleno." -#: src/libslic3r/PrintConfig.cpp:1341 +#: src/libslic3r/PrintConfig.cpp:1410 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:1669 +#: src/libslic3r/PrintConfig.cpp:1738 msgid "The extruder to use when printing solid infill." msgstr "El extrusor que se usa al imprimir relleno sólido." -#: src/libslic3r/PrintConfig.cpp:1879 +#: src/libslic3r/PrintConfig.cpp:1966 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:1853 +#: src/libslic3r/PrintConfig.cpp:1939 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:695 +#: src/libslic3r/PrintConfig.cpp:727 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:3105 +#: src/libslic3r/PrintConfig.cpp:3494 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:1054 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "The firmware supports stealth mode" msgstr "El firmware soporta el modo silencioso" -#: src/libslic3r/PrintConfig.cpp:351 +#: src/libslic3r/PrintConfig.cpp:120 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:2726 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2813 src/slic3r/GUI/Tab.cpp:3279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3820 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3457 msgid "the following characters are not allowed:" msgstr "los siguientes caracteres no están permitidos:" -#: src/slic3r/GUI/Tab.cpp:3311 +#: src/slic3r/GUI/ConfigWizard.cpp:1830 +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 +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 msgid "the following suffix is not allowed:" msgstr "el siguiente sufijo no está permitido:" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2871 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:2453 +#: src/libslic3r/PrintConfig.cpp:2704 msgid "The height of the pillar base cone" msgstr "La altura del cono de la base de un pilar" -#: src/libslic3r/PrintConfig.cpp:2481 +#: src/slic3r/GUI/DoubleSlider.cpp:1922 +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 +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 +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 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:2472 +#: src/libslic3r/PrintConfig.cpp:2736 msgid "The max length of a bridge" msgstr "La longitud máxima de un puente" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2714 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:2176 +#: src/libslic3r/PrintConfig.cpp:185 +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 +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 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:1433 +#: src/libslic3r/PrintConfig.cpp:1503 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:2259 -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/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/slic3r/GUI/GUI_App.cpp:831 +#: 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/libslic3r/PrintConfig.cpp:1768 +#: src/libslic3r/PrintConfig.cpp:1846 msgid "The printer multiplexes filaments into a single hot end." msgstr "La impresora multiplexa los filamentos en un solo fusor." -#: src/slic3r/GUI/BedShapeDialog.cpp:342 +#: 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 "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 +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 msgid "The selected file contains no geometry." msgstr "El archivo seleccionado no contiene geometría." -#: src/slic3r/GUI/BedShapeDialog.cpp:346 +#: src/slic3r/GUI/BedShapeDialog.cpp:517 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:2271 +#: src/slic3r/GUI/Plater.cpp:2970 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:1737 src/slic3r/GUI/Plater.cpp:2279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2270 src/slic3r/GUI/Plater.cpp:2978 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:410 -msgid "The selected project is no more available" -msgstr "El proyecto seleccionado no está diponible" +#: 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/libslic3r/PrintConfig.cpp:2570 +#: 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/libslic3r/PrintConfig.cpp:2846 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:1544 +#: src/libslic3r/PrintConfig.cpp:1614 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:1536 +#: src/libslic3r/PrintConfig.cpp:1606 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/libslic3r/Print.cpp:1187 +#: 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:1189 +#: src/libslic3r/Print.cpp:1244 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:2900 +#: src/slic3r/GUI/Tab.cpp:3068 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:3287 +#: src/slic3r/GUI/Tab.cpp:3465 msgid "The supplied name is not available." msgstr "El nombre proporcionado no está disponible." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2725 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2812 src/slic3r/GUI/Tab.cpp:3278 -#: src/slic3r/GUI/Tab.cpp:3282 +#: 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 msgid "The supplied name is not valid;" msgstr "El nombre proporcionado no es válido;" -#: src/libslic3r/Print.cpp:1268 +#: src/libslic3r/Print.cpp:1222 msgid "The supplied settings will cause an empty print." msgstr "Los ajustes proporcionados causarán una impresión vacía." -#: src/libslic3r/PrintConfig.cpp:2524 +#: src/libslic3r/PrintConfig.cpp:2789 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:1825 +#: src/libslic3r/PrintConfig.cpp:1911 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:2429 -msgid "The Wipe option is not available when using the Firmware Retraction mode.\n\nShall I disable it in order to enable Firmware Retraction?" +#: 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 "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:1306 +#: src/libslic3r/Print.cpp:1268 +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/libslic3r/Print.cpp:1400 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:1200 +#: src/libslic3r/Print.cpp:1270 +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:1202 +#: src/libslic3r/Print.cpp:1264 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:1225 +#: src/libslic3r/Print.cpp:1293 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:1227 +#: src/libslic3r/Print.cpp:1295 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:1229 +#: src/libslic3r/Print.cpp:1297 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:1223 +#: src/libslic3r/Print.cpp:1291 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:1155 +#: src/libslic3r/Print.cpp:1257 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:1258 -msgid "The Wipe tower is only supported if all objects have the same layer height profile" -msgstr "La torre de limpieza sólo se permite si todos los objetos tienen el mismo perfil de altura de capa" +#: src/libslic3r/Print.cpp:1339 +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/slic3r/GUI/UpdateDialogs.cpp:127 -#, possible-c-format +#: src/libslic3r/SLAPrintSteps.cpp:621 +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: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 "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/UpdateDialogs.cpp:225 +#, c-format msgid "This %s version: %s" msgstr "Esta %s versión: %s" -#: src/libslic3r/PrintConfig.cpp:140 +#: 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/libslic3r/PrintConfig.cpp:165 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:2057 -msgid "This custom code is inserted at every extruder change. If you don't leave this empty, you are expected to take care of the toolchange yourself - PrusaSlicer will not output any other G-code to change the filament. You can use placeholder variables for all Slic3r settings as well as [previous_extruder] and [next_extruder], so e.g. the standard toolchange command can be scripted as T[next_extruder]." -msgstr "Este código personalizado se inserta en cada cambio de extrusor. Si no lo dejas vacío, se espera que usted mismo te encarges del cambio de herramienta: PrusaSlicer no generará ningún otro código G para cambiar el filamento. Puedes usar variables de marcador de posición para todas las configuraciones de Slic3r, así como [previous_extruder] y[next_extruder], por ejemplo el comando de cambio de herramienta estándar se puede escribir como T[next_extruder]." - -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1081 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:129 +#: src/libslic3r/PrintConfig.cpp:154 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:2057 +#: src/libslic3r/PrintConfig.cpp:2094 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:380 +#: src/libslic3r/PrintConfig.cpp:396 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:370 +#: src/libslic3r/PrintConfig.cpp:386 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:1193 src/libslic3r/PrintConfig.cpp:1204 +#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269 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:1183 +#: src/libslic3r/PrintConfig.cpp:1248 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:2061 +#: src/libslic3r/PrintConfig.cpp:2162 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:2075 +#: src/libslic3r/PrintConfig.cpp:2176 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:2848 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3972 msgid "This extruder will be set for selected items" msgstr "Este extrusor se aplicará a los objetos seleccionados" -#: src/libslic3r/PrintConfig.cpp:188 +#: src/libslic3r/PrintConfig.cpp:224 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:514 +#: src/libslic3r/PrintConfig.cpp:546 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:178 +#: src/libslic3r/PrintConfig.cpp:214 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:944 +#: src/libslic3r/PrintConfig.cpp:992 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:1677 +#: src/libslic3r/PrintConfig.cpp:1746 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:1718 +#: 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/slic3r/GUI/Plater.cpp:1712 -msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?\n" -msgstr "Este archivo no puede ser cargado en un modo sencillo. ¿Quieres cambiar al modo experto?\n" +#: src/slic3r/GUI/Plater.cpp:2367 +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:1658 -msgid "This file contains several objects positioned at multiple heights. Instead of considering them as multiple objects, should I consider\nthis file as a single object having multiple parts?\n" -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?\n" +#: 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/FirmwareDialog.cpp:313 -#, 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/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." -#: src/libslic3r/PrintConfig.cpp:278 +#: src/libslic3r/PrintConfig.cpp:314 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:448 +#: src/slic3r/GUI/Plater.cpp:536 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:1468 +#: src/libslic3r/PrintConfig.cpp:1538 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:2093 +#: src/libslic3r/PrintConfig.cpp:2194 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:921 +#: src/slic3r/GUI/Tab.cpp:953 msgid "This is a default preset." msgstr "Este es un preajuste preestablecido." -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2766 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:2528 +#: src/slic3r/GUI/Tab.cpp:2338 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:923 +#: src/slic3r/GUI/Tab.cpp:955 msgid "This is a system preset." msgstr "Este es un preajuste del sistema." -#: src/libslic3r/PrintConfig.cpp:491 src/libslic3r/PrintConfig.cpp:551 +#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583 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:300 +#: src/libslic3r/PrintConfig.cpp:336 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:158 +#: src/libslic3r/PrintConfig.cpp:194 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." -#: src/libslic3r/PrintConfig.cpp:813 +#: src/libslic3r/PrintConfig.cpp:860 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." -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:982 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." -#: src/libslic3r/PrintConfig.cpp:1331 +#: 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:1262 +#: src/libslic3r/PrintConfig.cpp:1327 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:1162 +#: src/libslic3r/PrintConfig.cpp:1227 #, no-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:1225 +#: src/libslic3r/PrintConfig.cpp:1290 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/PrintConfig.cpp:2139 +#: 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 "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 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:643 -msgid "This operation is irreversible.\nDo you want to proceed?" -msgstr "Esta operación es irreversible. \n¿Deseas continuar?" +#: 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/libslic3r/PrintConfig.cpp:1372 +#: src/libslic3r/PrintConfig.cpp:1442 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:1287 +#: src/libslic3r/PrintConfig.cpp:1356 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:980 +#: src/libslic3r/PrintConfig.cpp:1029 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:973 +#: src/libslic3r/PrintConfig.cpp:1022 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:427 +#: src/libslic3r/PrintConfig.cpp:459 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:1648 +#: src/libslic3r/PrintConfig.cpp:1717 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:989 +#: src/libslic3r/PrintConfig.cpp:1038 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." -#: src/libslic3r/PrintConfig.cpp:57 +#: 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 "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:1153 +#: src/libslic3r/PrintConfig.cpp:1218 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:1216 +#: src/libslic3r/PrintConfig.cpp:1281 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:1801 +#: src/libslic3r/PrintConfig.cpp:1829 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:1786 +#: src/libslic3r/PrintConfig.cpp:1814 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." -#: src/libslic3r/PrintConfig.cpp:664 +#: src/libslic3r/PrintConfig.cpp:695 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:2185 +#: src/libslic3r/PrintConfig.cpp:2286 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:2132 +#: src/libslic3r/PrintConfig.cpp:2208 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:118 -#, 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.\n" -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.\n" +#: 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." -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2458 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:1994 +#: src/libslic3r/PrintConfig.cpp:2081 msgid "Threads" msgstr "Núcleos" -#: src/libslic3r/PrintConfig.cpp:1995 +#: src/libslic3r/PrintConfig.cpp:2082 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:2052 +#: src/slic3r/GUI/Tab.cpp:2093 msgid "Tilt" msgstr "Inclinación" -#: src/slic3r/GUI/Tab.cpp:2053 +#: src/slic3r/GUI/Tab.cpp:2094 msgid "Tilt time" msgstr "Tiempo de inclinación" @@ -6887,148 +8289,179 @@ msgstr "Tiempo de inclinación" msgid "Time" msgstr "Tiempo" -#: src/libslic3r/PrintConfig.cpp:655 +#: src/libslic3r/PrintConfig.cpp:687 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:670 +#: src/libslic3r/PrintConfig.cpp:702 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:2242 +#: src/libslic3r/PrintConfig.cpp:2407 msgid "Time of the fast tilt" msgstr "Tiempo de la inclinación rápida" -#: src/libslic3r/PrintConfig.cpp:2251 +#: src/libslic3r/PrintConfig.cpp:2416 msgid "Time of the slow tilt" msgstr "Tiempo de la inclinación lenta" -#: src/libslic3r/PrintConfig.cpp:610 +#: src/libslic3r/PrintConfig.cpp:641 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:916 +#: src/slic3r/GUI/Tab.cpp:966 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:2966 +#: src/slic3r/GUI/Plater.cpp:4014 msgid "To objects" msgstr "A los objetos" -#: src/slic3r/GUI/Plater.cpp:2968 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "To parts" msgstr "A las piezas" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:212 -#, possible-c-format +#: 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 un archivo CA personalizado, importa tu archivo CA al Almacén de Certificados/Llavero." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 +#, c-format msgid "Toggle %c axis mirroring" msgstr "Activar reflejo del eje %c" -#: src/libslic3r/Zipper.cpp:37 +#: src/libslic3r/Zipper.cpp:34 msgid "too many files" msgstr "demasiados archivos" -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:315 -#: src/slic3r/GUI/GUI_Preview.cpp:481 src/slic3r/GUI/GUI_Preview.cpp:537 -#: src/slic3r/GUI/GUI_Preview.cpp:713 src/libslic3r/GCode/PreviewData.cpp:404 +#: src/libslic3r/SLAPrintSteps.cpp:190 +msgid "Too much 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 msgid "Tool" msgstr "Herramienta" -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" msgstr "Herramienta nº" -#: src/slic3r/GUI/Tab.cpp:1973 src/libslic3r/PrintConfig.cpp:2006 +#: src/slic3r/GUI/Tab.cpp:2000 src/libslic3r/PrintConfig.cpp:2093 msgid "Tool change G-code" msgstr "Código G de cambio de herramienta" -#: src/slic3r/GUI/Tab.cpp:1530 +#: src/slic3r/GUI/Tab.cpp:1491 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 -#: src/slic3r/GUI/MainFrame.cpp:522 +#. 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 msgid "Top" msgstr "Superior" -#: src/libslic3r/PrintConfig.cpp:388 +#: src/slic3r/GUI/PresetHints.cpp:304 +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 msgid "Top fill pattern" msgstr "Patrón de relleno superior" -#: src/slic3r/GUI/PresetHints.cpp:189 +#: src/slic3r/GUI/PresetHints.cpp:323 +msgid "Top is open." +msgstr "La parte superior está abierta." + +#: src/slic3r/GUI/PresetHints.cpp:317 +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 msgid "top solid infill" msgstr "relleno sólido superior" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/PrintConfig.cpp:2017 -#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/GCode/PreviewData.cpp:168 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117 msgid "Top solid infill" msgstr "Relleno sólido superior" -#: src/libslic3r/PrintConfig.cpp:2046 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Top solid layers" msgstr "Capas solidas superiores" -#: src/slic3r/GUI/MainFrame.cpp:522 +#: src/slic3r/GUI/MainFrame.cpp:662 msgid "Top View" msgstr "Vista superior" -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +#: src/slic3r/GUI/WipeTowerDialog.cpp:285 msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded." msgstr "El volumen total de purga se calcula sumando dos valors más abajo, dependiendo de qué filamentos se carguen/descarguen." -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 msgid "Total rammed volume" msgstr "Volumen total empujado" -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" msgstr "Tiempo de empuje total" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:252 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 msgid "Translate" msgstr "Traducir" -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/PrintConfig.cpp:2051 +#: src/slic3r/GUI/Mouse3DController.cpp:300 +#: src/slic3r/GUI/Mouse3DController.cpp:317 +msgid "Translation" +msgstr "Translación" + +#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152 msgid "Travel" msgstr "Recorrido" -#: src/libslic3r/PrintConfig.cpp:798 +#: src/libslic3r/PrintConfig.cpp:845 msgid "Triangles" msgstr "Triángulos" -#: src/libslic3r/PrintConfig.cpp:3059 +#: src/libslic3r/PrintConfig.cpp:3448 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:1397 +#: src/libslic3r/PrintConfig.cpp:1467 msgid "Type of the printer." msgstr "Tipo de impresora." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2549 +#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3553 msgid "Type:" msgstr "Tipo:" -#: src/libslic3r/Zipper.cpp:35 +#: src/slic3r/GUI/Plater.cpp:3428 +msgid "Unable to reload:" +msgstr "Incapaz de recargar:" + +#: src/libslic3r/Zipper.cpp:32 msgid "undefined error" msgstr "error no definido" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3609 -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/MainFrame.cpp:581 msgid "Undo" msgstr "Deshacer" -#: src/slic3r/GUI/GLCanvas3D.cpp:3497 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 +#, 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:3479 +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 msgid "Undo History" msgstr "Deshacer Historia" -#: src/libslic3r/Zipper.cpp:59 +#: src/libslic3r/Zipper.cpp:56 msgid "unexpected decompressed size" msgstr "tamaño de descompresión inesperado" @@ -7036,96 +8469,111 @@ msgstr "tamaño de descompresión inesperado" msgid "Unknown" msgstr "Desconocido" -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 +#: 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 msgid "Unknown error occured" msgstr "Ha ocurrido un error desconocido" -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 msgid "unloaded" msgstr "descargado" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:623 msgid "Unloading speed" msgstr "Velocidad de descarga" -#: src/libslic3r/PrintConfig.cpp:600 +#: src/libslic3r/PrintConfig.cpp:632 msgid "Unloading speed at the start" msgstr "Velocidad de descarga al inicio" -#: src/slic3r/GUI/Tab.cpp:3069 +#: src/slic3r/GUI/Tab.cpp:3256 msgid "UNLOCKED LOCK" msgstr "CANDADO ABIERTO" -#: src/slic3r/GUI/Tab.cpp:3362 -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: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:3377 -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: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/GUI_Preview.cpp:245 +#: 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:2785 +#: src/slic3r/GUI/Tab.cpp:2947 msgid "Unsaved Changes" msgstr "Cambios no guardados" -#: src/slic3r/GUI/GUI_App.cpp:790 +#: src/slic3r/GUI/GUI_App.cpp:935 msgid "Unsaved Presets" msgstr "Ajustes iniciales no guardados" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -msgid "Unselect gizmo / Clear selection" -msgstr "Deseleccionar gizmo / eliminar selección" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Unselect gizmo or clear selection" +msgstr "Deseleccionar gizmo o borrar selección" -#: src/libslic3r/Zipper.cpp:63 +#: src/libslic3r/Zipper.cpp:60 msgid "unsupported central directory size" msgstr "tamaño del directorio central no compatible" -#: src/libslic3r/Zipper.cpp:43 +#: src/libslic3r/Zipper.cpp:40 msgid "unsupported encryption" msgstr "encriptación no compatible" -#: src/libslic3r/Zipper.cpp:45 +#: src/libslic3r/Zipper.cpp:42 msgid "unsupported feature" msgstr "característica no compatible" -#: src/libslic3r/Zipper.cpp:41 +#: src/libslic3r/Zipper.cpp:38 msgid "unsupported method" msgstr "método no compatible" -#: src/libslic3r/Zipper.cpp:53 +#: src/libslic3r/Zipper.cpp:50 msgid "unsupported multidisk archive" msgstr "archivo multidisk no compatible" -#: src/slic3r/GUI/GUI_App.cpp:305 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:292 msgid "Unsupported OpenGL version" msgstr "Versión de OpenGL no soportada" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2414 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3420 msgid "Unsupported selection" msgstr "Selección no soportada" -#: src/libslic3r/GCode/PreviewData.cpp:495 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:955 +#, c-format msgid "up to %.2f mm" msgstr "hasta %.2f mm" -#: src/slic3r/GUI/UpdateDialogs.cpp:30 +#: src/slic3r/GUI/UpdateDialogs.cpp:38 msgid "Update available" msgstr "Actualización disponible" -#: src/slic3r/GUI/ConfigWizard.cpp:419 src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:779 src/slic3r/GUI/Preferences.cpp:80 msgid "Update built-in Presets automatically" msgstr "Actualiza los ajustes de fábrica automáticamente" -#: src/slic3r/GUI/ConfigWizard.cpp:401 +#: src/slic3r/GUI/ConfigWizard.cpp:761 msgid "Updates" msgstr "Actualizaciones" -#: src/slic3r/GUI/ConfigWizard.cpp:426 +#: src/slic3r/GUI/ConfigWizard.cpp:786 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." @@ -7133,36 +8581,44 @@ msgstr "Las actualizaciones nunca se realizan sin el consentimiento del usuario msgid "Upgrade" msgstr "Actualización" -#: src/slic3r/GUI/GUI_App.cpp:685 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Upload a firmware image into an Arduino based printer" msgstr "Cargar una imagen de firmware a una impresora basada en Arduino" +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "Subida no activada a tarjeta FlashAir." + #: src/slic3r/GUI/PrintHostDialogs.cpp:33 msgid "Upload to Printer Host with the following filename:" msgstr "Cargar el host de impresión con el siguiente nombre de archivo:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:229 +#: src/slic3r/GUI/PrintHostDialogs.cpp:230 msgid "Uploading" msgstr "Subiendo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 msgid "Upper Layer" msgstr "Capa superior" -#: src/slic3r/GUI/Tab.cpp:1873 +#: src/slic3r/GUI/Tab.cpp:1900 msgid "USB/Serial connection" msgstr "Conexión USB/Serial" -#: src/libslic3r/PrintConfig.cpp:1592 +#: 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/Preferences.cpp:117 +#: src/slic3r/GUI/DoubleSlider.cpp:1147 +msgid "Use another extruder" +msgstr "Usar otro extrusor" + +#: src/slic3r/GUI/Preferences.cpp:143 msgid "Use custom size for toolbar icons" msgstr "Usar tamaño personalizado para los iconos de la barra de herramientas" -#: src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Use firmware retraction" msgstr "Usar la retracción del firmware" @@ -7170,51 +8626,59 @@ msgstr "Usar la retracción del firmware" msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "Use barras diagonales ( / ) como separadores de directorios si fuese necesario." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/slic3r/GUI/Preferences.cpp:126 +msgid "Use free camera" +msgstr "Usar la cámara libre" + +#: src/libslic3r/PrintConfig.cpp:2780 msgid "Use pad" msgstr "Usar pad" -#: src/slic3r/GUI/Preferences.cpp:110 +#: src/slic3r/GUI/Preferences.cpp:119 msgid "Use perspective camera" msgstr "Usar cámara en perspectiva" -#: src/libslic3r/PrintConfig.cpp:2067 +#: src/libslic3r/PrintConfig.cpp:2168 msgid "Use relative E distances" msgstr "Usar las distancias relativas en E" -#: src/slic3r/GUI/Preferences.cpp:103 +#: src/slic3r/GUI/Preferences.cpp:104 msgid "Use Retina resolution for the 3D scene" msgstr "Usa la resolución de Retina para la escena 3D" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:540 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:1807 +#: src/libslic3r/PrintConfig.cpp:1893 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:2074 +#: src/libslic3r/PrintConfig.cpp:2175 msgid "Use volumetric E" msgstr "Usar E volumétrico" -#: src/slic3r/GUI/Plater.cpp:214 +#: src/slic3r/GUI/DoubleSlider.cpp:1171 +msgid "used" +msgstr "usado" + +#: src/slic3r/GUI/Plater.cpp:237 msgid "Used Filament (g)" msgstr "Filamento usado (g)" -#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:1041 +#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1229 msgid "Used Filament (m)" msgstr "Filamento usado (m)" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:236 msgid "Used Filament (mm³)" msgstr "Filamento usado (mm³)" -#: src/slic3r/GUI/Plater.cpp:1015 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "Used Material (ml)" msgstr "Material usado (ml)" -#: src/slic3r/GUI/Plater.cpp:215 +#: src/slic3r/GUI/Plater.cpp:238 msgid "Used Material (unit)" msgstr "Material usado (unidades)" @@ -7222,409 +8686,494 @@ msgstr "Material usado (unidades)" msgid "User" msgstr "Usuario" -#: src/slic3r/GUI/Preset.cpp:974 src/slic3r/GUI/Preset.cpp:1071 -#: src/slic3r/GUI/PresetBundle.cpp:1558 +#: src/slic3r/GUI/Preset.cpp:1168 src/slic3r/GUI/Preset.cpp:1288 +#: src/slic3r/GUI/PresetBundle.cpp:1677 msgid "User presets" msgstr "Ajustes de usuario" -#: src/libslic3r/Zipper.cpp:93 +#: src/libslic3r/Zipper.cpp:90 msgid "validation failed" msgstr "validación fallida" -#: src/slic3r/GUI/ButtonsDescription.cpp:41 +#: src/slic3r/GUI/ButtonsDescription.cpp:36 msgid "Value is the same as the system value" msgstr "El valor es el mismo que el del sistema" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:53 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:2151 +#: src/slic3r/GUI/Tab.cpp:2202 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:2157 +#: src/slic3r/GUI/Tab.cpp:2208 msgid "Values in this column are for Stealth mode" msgstr "Los valores en esta columna son para el modo Silencioso" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4573 +msgid "Variable layer height" +msgstr "Altura de capa variable" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1709 +msgid "Variable layer height - Adaptive" +msgstr "Altura de capa variable - Adaptativa" + +#: src/slic3r/GUI/GLCanvas3D.cpp:599 +msgid "Variable layer height - Manual edit" +msgstr "Altura de capa variable - Edicción manual" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1701 +msgid "Variable layer height - Reset" +msgstr "Altura de capa variable - Reiniciar" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1717 +msgid "Variable layer height - Smooth all" +msgstr "Altura de capa variable - Suavizar todo" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "variants" msgstr "variantes" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 src/slic3r/GUI/Tab.cpp:921 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:971 msgid "vendor" msgstr "fabricante" -#: src/libslic3r/PrintConfig.cpp:880 +#: src/slic3r/GUI/ConfigWizard.cpp:565 +msgid "Vendor:" +msgstr "Vendedor:" + +#: src/libslic3r/PrintConfig.cpp:928 msgid "Verbose G-code" msgstr "Código G detallado" -#: src/slic3r/GUI/AboutDialog.cpp:67 src/slic3r/GUI/MainFrame.cpp:53 +#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64 msgid "Version" msgstr "Versión" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 msgid "version" msgstr "versión" -#: src/slic3r/GUI/Tab.cpp:1002 +#: src/slic3r/GUI/Tab.cpp:1053 msgid "Vertical shells" msgstr "Carcasas verticales" -#: src/slic3r/GUI/GUI_Preview.cpp:209 +#: src/slic3r/GUI/GUI_Preview.cpp:218 msgid "View" msgstr "Vista" -#: src/libslic3r/SLAPrint.cpp:857 src/libslic3r/SLAPrint.cpp:867 -#: src/libslic3r/SLAPrint.cpp:915 +#: src/slic3r/GUI/ConfigWizard.cpp:813 +msgid "View mode" +msgstr "Modo de vista" + +#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422 +#: src/libslic3r/SLAPrintSteps.cpp:461 msgid "Visualizing supports" msgstr "Visualizar soportes" -#: src/slic3r/GUI/Plater.cpp:138 +#: src/slic3r/GUI/Plater.cpp:161 msgid "Volume" msgstr "Volumen" -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 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:1010 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 msgid "Volumes in Object reordered" msgstr "Volúmenes en Objetos reordenados" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Volumetric" msgstr "Volumétrico" -#: src/slic3r/GUI/Tab.cpp:1800 +#: src/slic3r/GUI/Tab.cpp:1591 msgid "Volumetric flow hints not available" msgstr "Sugerencias de flujo volumétrico no disponibles" -#: src/slic3r/GUI/GUI_Preview.cpp:216 +#: src/slic3r/GUI/GUI_Preview.cpp:226 msgid "Volumetric flow rate" msgstr "Tasa de caudal volumétrico" -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "Tasa de flujo volumétrico (mm3/seg)" +#: src/libslic3r/GCode/PreviewData.cpp:355 +msgid "Volumetric flow rate (mm³/s)" +msgstr "Tasa de flujo volumétrico (mm³/seg)" #: src/slic3r/GUI/RammingChart.cpp:81 msgid "Volumetric speed" msgstr "Velocidad volumétrica" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1168 src/slic3r/GUI/GUI.cpp:283 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 +#: src/libslic3r/PrintConfig.cpp:2915 +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 msgid "Warning" msgstr "Peligro" -#: src/slic3r/GUI/ConfigWizard.cpp:294 +#: src/slic3r/GUI/ConfigWizard.cpp:431 msgid "Welcome" msgstr "Bienvenido" -#: src/slic3r/GUI/ConfigWizard.cpp:296 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:427 +#, c-format msgid "Welcome to the %s Configuration Assistant" msgstr "Bienvenido al %s Asistente de Configuración" -#: src/slic3r/GUI/ConfigWizard.cpp:298 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:429 +#, c-format msgid "Welcome to the %s Configuration Wizard" msgstr "Bienvenido al %s Ayudante de Configuración" -#: src/slic3r/GUI/Preferences.cpp:86 +#: src/slic3r/GUI/Preferences.cpp:97 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:223 +#: src/slic3r/GUI/PresetHints.cpp:224 msgid "when printing" msgstr "al imprimir" -#: src/libslic3r/PrintConfig.cpp:217 +#: src/libslic3r/PrintConfig.cpp:253 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:269 +#: src/libslic3r/PrintConfig.cpp:305 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:843 +#: src/libslic3r/PrintConfig.cpp:891 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:1483 +#: src/libslic3r/PrintConfig.cpp:1553 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:1475 +#: src/libslic3r/PrintConfig.cpp:1545 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:1347 +#: src/libslic3r/PrintConfig.cpp:1391 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:1173 +#: src/libslic3r/PrintConfig.cpp:1238 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:1527 +#: src/libslic3r/PrintConfig.cpp:1597 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:1519 +#: src/libslic3r/PrintConfig.cpp:1589 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:3076 +#: src/slic3r/GUI/Tab.cpp:3263 msgid "WHITE BULLET" msgstr "VIÑETA BLANCA" -#: src/slic3r/GUI/Tab.cpp:3365 +#: src/slic3r/GUI/Tab.cpp:3285 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:3111 +#: src/slic3r/GUI/Tab.cpp:3288 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:3126 +#: src/slic3r/GUI/Tab.cpp:3303 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:214 src/libslic3r/PrintConfig.cpp:2137 +#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238 msgid "Width" msgstr "Ancho" -#: src/libslic3r/GCode/PreviewData.cpp:398 +#: src/libslic3r/GCode/PreviewData.cpp:349 msgid "Width (mm)" msgstr "Ancho (mm)" -#: src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2640 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:2138 +#: src/libslic3r/PrintConfig.cpp:2239 msgid "Width of a wipe tower" msgstr "Ancho de la torre de limpieza" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2891 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:2203 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Width of the display" msgstr "Ancho de la pantalla" -#: src/slic3r/GUI/PresetHints.cpp:47 +#: src/slic3r/GUI/PresetHints.cpp:48 msgid "will always run at %1%%%" msgstr "siempre funcionará al %1%%%" -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:55 msgid "will be turned off." msgstr "será apagada." -#: src/libslic3r/PrintConfig.cpp:2276 +#: src/libslic3r/PrintConfig.cpp:2441 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:2160 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "Wipe into this object" msgstr "Limpiar en el objeto" -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2253 msgid "Wipe into this object's infill" msgstr "Limpiar en el relleno del objeto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:90 -#: src/slic3r/GUI/GUI_ObjectList.cpp:564 src/libslic3r/PrintConfig.cpp:2202 -#: src/libslic3r/PrintConfig.cpp:2210 +#: 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 msgid "Wipe options" msgstr "Opciones de limpieza" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/slic3r/GUI/Tab.cpp:1130 -#: src/libslic3r/GCode/PreviewData.cpp:174 +#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1191 +#: src/libslic3r/ExtrusionEntity.cpp:321 msgid "Wipe tower" msgstr "Torre de limpieza" -#: src/slic3r/GUI/Plater.cpp:1043 src/slic3r/GUI/Plater.cpp:1058 +#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245 msgid "wipe tower" msgstr "torre de limpieza" -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +#: src/slic3r/GUI/ConfigManipulation.cpp:120 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 +msgid "Wipe Tower" +msgstr "Torre de limpieza" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" msgstr "Torre de limpieza - Ajuste del volumen de purga" -#: src/slic3r/GUI/Tab.cpp:1664 +#: src/slic3r/GUI/Tab.cpp:1488 msgid "Wipe tower parameters" msgstr "Parámetros de la torre de limpieza" -#: src/libslic3r/PrintConfig.cpp:2144 +#: src/libslic3r/PrintConfig.cpp:2245 msgid "Wipe tower rotation angle" msgstr "Ángulo de rotación de la torre de limpieza" -#: src/libslic3r/PrintConfig.cpp:2170 +#: src/libslic3r/PrintConfig.cpp:2246 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:2092 +#: src/libslic3r/PrintConfig.cpp:2193 msgid "Wipe while retracting" msgstr "Limpiar mientras se retrae" -#: src/slic3r/GUI/PresetHints.cpp:224 +#: src/slic3r/GUI/PresetHints.cpp:225 msgid "with a volumetric rate" msgstr "con una tasa volumétrica" -#: src/libslic3r/PrintConfig.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1530 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:1969 +#: src/libslic3r/PrintConfig.cpp:2056 msgid "With sheath around the support" msgstr "Con protección alrededor del soporte" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:40 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:83 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 msgid "World coordinates" msgstr "Coordenadas mundiales" -#: src/slic3r/GUI/UpdateDialogs.cpp:76 -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/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:" -#: src/libslic3r/Zipper.cpp:95 +#: src/libslic3r/Zipper.cpp:92 msgid "write calledback failed" msgstr "fallo write calledback" -#: src/libslic3r/PrintConfig.cpp:2993 +#: src/libslic3r/PrintConfig.cpp:3382 msgid "Write information about the model to the console." msgstr "Escribir información sobre el modelo en la consola." -#: src/slic3r/Utils/Duet.cpp:148 +#: src/slic3r/Utils/Duet.cpp:131 msgid "Wrong password" msgstr "Contraseña incorrecta" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2225 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:1793 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "XY separation between an object and its support" msgstr "Separación XY entre un objeto y su soporte" -#: src/libslic3r/PrintConfig.cpp:1795 +#: src/libslic3r/PrintConfig.cpp:1881 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:2174 +#: src/libslic3r/PrintConfig.cpp:2275 msgid "XY Size Compensation" msgstr "Compensación de tamaño XY" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2232 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:992 +#: src/slic3r/GUI/Plater.cpp:1170 msgid "Yes" msgstr "Sí" -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1317 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:557 +#: src/libslic3r/PrintConfig.cpp:589 msgid "You can put your notes regarding the filament here." msgstr "Puede poner sus notas con respecto al filamento aquí." -#: src/libslic3r/PrintConfig.cpp:1403 +#: src/libslic3r/PrintConfig.cpp:1473 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:2332 +#: src/libslic3r/PrintConfig.cpp:2579 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:324 +#: src/libslic3r/PrintConfig.cpp:360 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:1295 +#: src/libslic3r/PrintConfig.cpp:1364 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:2538 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3546 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:2243 -msgid "You can't load SLA project if there is at least one multi-part object on the bed" -msgstr "No puede cargar el proyecto SLA si hay al menos un objeto de varias partes en la base" - -#: src/slic3r/GUI/Plater.cpp:1746 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:2390 +#, 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/GUI_ObjectManipulation.cpp:565 +#: src/slic3r/GUI/Plater.cpp:2311 +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 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/GUI_App.cpp:300 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:287 msgid "You may need to update your graphics card driver." msgstr "Puede que necesites actualizar tu tarjeta de gráficos." -#: src/slic3r/GUI/Preferences.cpp:130 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +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 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:2415 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectList.cpp:3421 +#, c-format msgid "You started your selection with %s Item." msgstr "Has empezado la selección con %s Items." -#: src/slic3r/GUI/MainFrame.cpp:772 +#: src/slic3r/GUI/DoubleSlider.cpp:1902 +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 +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 msgid "Your file was repaired." msgstr "Tu fichero fue reparado." -#: src/slic3r/GUI/Plater.cpp:1874 +#: src/slic3r/GUI/Plater.cpp:2528 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:2184 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "Z offset" msgstr "Ajuste en altura Z" -#: src/libslic3r/PrintConfig.cpp:2416 +#: 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: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/libslic3r/PrintConfig.cpp:2667 msgid "Zig-Zag" msgstr "Zig-Zag" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/Mouse3DController.cpp:308 +#: src/slic3r/GUI/Mouse3DController.cpp:317 +msgid "Zoom" +msgstr "Zoom" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 msgid "Zoom in" msgstr "Aumentar zoom" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 msgid "Zoom out" msgstr "Reducir zoom" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -msgid "Zoom to all objects in scene, if none selected" -msgstr "Zoom a todos los objetos en la escena, si ninguno es seleccionado" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 msgid "Zoom to Bed" msgstr "Zoom a la Cama" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 -msgid "Zoom to selected object" -msgstr "Zoom al objeto seleccionado" +#: 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:171 src/libslic3r/PrintConfig.cpp:733 -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:1580 -#: src/libslic3r/PrintConfig.cpp:1808 src/libslic3r/PrintConfig.cpp:1962 -#: src/libslic3r/PrintConfig.cpp:2146 src/libslic3r/PrintConfig.cpp:2463 +#: 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 msgid "°" msgstr "°" -#: src/slic3r/GUI/ConfigWizard.cpp:613 src/slic3r/GUI/ConfigWizard.cpp:627 +#: src/slic3r/GUI/ConfigWizard.cpp:1038 src/slic3r/GUI/ConfigWizard.cpp:1052 msgid "°C" msgstr "°C" diff --git a/resources/localization/fr/PrusaSlicer.mo b/resources/localization/fr/PrusaSlicer.mo index 8301932918..5a4620fca1 100644 Binary files a/resources/localization/fr/PrusaSlicer.mo and b/resources/localization/fr/PrusaSlicer.mo differ diff --git a/resources/localization/fr/PrusaSlicer_fr.po b/resources/localization/fr/PrusaSlicer_fr.po index 9a4d5c8a82..e6b8515f39 100644 --- a/resources/localization/fr/PrusaSlicer_fr.po +++ b/resources/localization/fr/PrusaSlicer_fr.po @@ -5,360 +5,468 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: PhraseApp (phraseapp.com)\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/PresetHints.cpp:39 -msgid "\nDuring the other layers, fan" -msgstr "\nPendant les autres couches, le ventilateur" - -#: src/slic3r/GUI/PresetHints.cpp:35 -msgid "\nIf estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%." -msgstr "\nSi 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/slic3r/GUI/MainFrame.cpp:61 +#: 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:727 +#: src/slic3r/GUI/MainFrame.cpp:872 msgid " was successfully sliced." msgstr " a été découpé avec succès." -#: src/libslic3r/PrintConfig.cpp:179 src/libslic3r/PrintConfig.cpp:745 -#: src/libslic3r/PrintConfig.cpp:1154 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2260 -#: src/libslic3r/PrintConfig.cpp:2502 +#: 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 msgid "%" msgstr "%" -#: src/libslic3r/GCode/PreviewData.cpp:504 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:963 +#, c-format msgid "%.2f - %.2f mm" msgstr "%.2f - %.2f mm" -#: src/slic3r/GUI/Tab.cpp:2895 -msgid "%1% - Copy" -msgstr "%1% - Copier" - #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:2958 +#: src/slic3r/GUI/Tab.cpp:3126 msgid "%1% Preset" msgstr "%1% Préréglage" -#: src/slic3r/GUI/Plater.cpp:3831 +#: src/slic3r/GUI/Plater.cpp:4400 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:1282 +#: src/libslic3r/Print.cpp:1374 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:228 -#, possible-c-format +#: src/slic3r/GUI/PresetHints.cpp:229 +#, 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:974 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1152 +#, c-format msgid "%d (%d shells)" msgstr "%d (%d coques)" -#: src/slic3r/GUI/Plater.cpp:982 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1160 +#, 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:268 -#, possible-c-format +#: src/slic3r/GUI/PresetHints.cpp:270 +#, c-format msgid "%d lines: %.2f mm" msgstr "%d lignes : %.2f mm" -#: src/slic3r/GUI/MainFrame.cpp:894 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:1027 +#, c-format msgid "%d presets successfully imported." msgstr "%d préréglages importés avec succès." -#: src/slic3r/GUI/MainFrame.cpp:550 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:692 +#, c-format msgid "%s &Website" msgstr "Site &Web de %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:113 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:211 +#, c-format msgid "%s configuration is incompatible" msgstr "La configuration de %s n'est pas compatible" -#: src/slic3r/GUI/Field.cpp:136 -#, possible-c-format +#: src/slic3r/GUI/Field.cpp:175 +#, c-format msgid "%s doesn't support percentage" msgstr "%s ne supporte pas un pourcentage" #: src/slic3r/GUI/MsgDialog.cpp:73 -#, possible-c-format +#, c-format msgid "%s error" msgstr "Erreur %s" -#: src/slic3r/GUI/ConfigWizard.cpp:336 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:481 +#, c-format msgid "%s Family" msgstr "%s Famille" #: src/slic3r/GUI/MsgDialog.cpp:74 -#, possible-c-format +#, c-format msgid "%s has encountered an error" msgstr "%s a rencontré une erreur" -#: src/slic3r/GUI/GUI_App.cpp:132 -#, 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/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/BackgroundSlicingProcess.cpp:155 -#, possible-c-format +#: 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 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:112 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:308 +#, 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 msgid "%s incompatibility" msgstr "Incompatibilité de %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:172 -#, 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/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:681 -#, possible-c-format +#: src/slic3r/GUI/GUI_App.cpp:820 +#, c-format msgid "%s View Mode" msgstr "Mode de Vue de %s" -#: src/slic3r/GUI/MainFrame.cpp:563 -#, possible-c-format +#: 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 msgid "&About %s" msgstr "&Au sujet de %s" -#: src/slic3r/GUI/GUI_App.cpp:769 +#: src/slic3r/GUI/GUI_App.cpp:908 msgid "&Configuration" msgstr "&Configuration" -#: src/slic3r/GUI/GUI_App.cpp:661 +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "&Configuration Snapshots" msgstr "Instantanés de &Configuration" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:588 msgid "&Copy" msgstr "&Copier" -#: src/slic3r/GUI/MainFrame.cpp:447 +#: src/slic3r/GUI/MainFrame.cpp:572 msgid "&Delete selected" -msgstr "&Supprimer la sélection" +msgstr "Suppri&mer la sélection" -#: src/slic3r/GUI/MainFrame.cpp:575 +#: src/slic3r/GUI/MainFrame.cpp:722 msgid "&Edit" msgstr "&Editer" -#: src/slic3r/GUI/MainFrame.cpp:377 +#: src/slic3r/GUI/MainFrame.cpp:506 msgid "&Export" msgstr "&Exporter" -#: src/slic3r/GUI/MainFrame.cpp:480 src/slic3r/GUI/MainFrame.cpp:604 +#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:752 msgid "&Filament Settings Tab" msgstr "Onglet des Réglages du &Filament" -#: src/slic3r/GUI/MainFrame.cpp:574 +#: src/slic3r/GUI/MainFrame.cpp:721 msgid "&File" msgstr "&Fichier" -#: src/slic3r/GUI/ConfigWizard.cpp:1094 +#: src/slic3r/GUI/ConfigWizard.cpp:1981 msgid "&Finish" msgstr "&Fin" -#: src/slic3r/GUI/MainFrame.cpp:580 +#: src/slic3r/GUI/MainFrame.cpp:727 msgid "&Help" msgstr "&Aide" -#: src/slic3r/GUI/MainFrame.cpp:359 +#: src/slic3r/GUI/MainFrame.cpp:474 msgid "&Import" msgstr "&Importer" -#: src/slic3r/GUI/MainFrame.cpp:376 +#: src/slic3r/GUI/GUI_App.cpp:822 +msgid "&Language" +msgstr "&Langue" + +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "&New Project" msgstr "&Nouveau Projet" -#: src/slic3r/GUI/ConfigWizard.cpp:1093 +#: src/slic3r/GUI/ConfigWizard.cpp:1980 msgid "&Next >" msgstr "&Suivant >" -#: src/slic3r/GUI/MainFrame.cpp:339 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "&Open Project" msgstr "&Ouvrir Projet" -#: src/slic3r/GUI/MainFrame.cpp:456 +#: src/slic3r/GUI/MainFrame.cpp:591 msgid "&Paste" -msgstr "&Coller" +msgstr "C&oller" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "&Plater Tab" msgstr "Onglet du &Plateau" -#: src/slic3r/GUI/GUI_App.cpp:665 +#: src/slic3r/GUI/GUI_App.cpp:804 msgid "&Preferences" msgstr "&Préférences" -#: src/slic3r/GUI/MainFrame.cpp:409 +#: src/slic3r/GUI/MainFrame.cpp:540 msgid "&Quit" msgstr "&Quitter" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/MainFrame.cpp:583 msgid "&Redo" msgstr "&Refaire" -#: src/slic3r/GUI/MainFrame.cpp:406 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "&Repair STL file" msgstr "&Réparer le fichier STL" -#: src/slic3r/GUI/MainFrame.cpp:341 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "&Save Project" msgstr "&Sauvegarder Projet" -#: src/slic3r/GUI/MainFrame.cpp:444 +#: src/slic3r/GUI/MainFrame.cpp:565 msgid "&Select all" msgstr "Tout &Sélectionner" -#: src/slic3r/GUI/MainFrame.cpp:558 +#: src/slic3r/GUI/MainFrame.cpp:580 msgid "&Undo" msgstr "Ann&uler" -#: src/slic3r/GUI/MainFrame.cpp:577 +#: src/slic3r/GUI/MainFrame.cpp:724 msgid "&View" msgstr "&Vue" -#: src/slic3r/GUI/MainFrame.cpp:576 +#: src/slic3r/GUI/MainFrame.cpp:723 msgid "&Window" -msgstr "&Fenêtre" +msgstr "Fenê&tre" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631 +msgid "(All)" +msgstr "(Tout)" + +#: src/libslic3r/PrintConfig.cpp:1446 msgid "(minimum)" msgstr "(minimum)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 msgid "(Re)slice" msgstr "(Re)découper" -#: src/slic3r/GUI/MainFrame.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "(Re)Slice No&w" -msgstr "(Re)Découper Maintenant" +msgstr "(Re)Découper Main&tenant" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587 +msgid "(Unknown)" +msgstr "(Inconnu)" + +#: src/slic3r/GUI/MainFrame.cpp:790 msgid ") not found." msgstr ") non trouvé." -#: src/libslic3r/PrintConfig.cpp:1857 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "0 (soluble)" msgstr "0 (soluble)" -#: src/libslic3r/PrintConfig.cpp:1858 +#: src/libslic3r/PrintConfig.cpp:1919 msgid "0.2 (detachable)" msgstr "0.2 (détachable)" -#: src/slic3r/GUI/MainFrame.cpp:487 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/Plater.cpp:3074 +#: src/slic3r/GUI/Plater.cpp:4097 msgid "3D editor view" msgstr "Vue d'éditeur 3D" -#: src/libslic3r/PrintConfig.cpp:804 +#: src/libslic3r/PrintConfig.cpp:851 msgid "3D Honeycomb" msgstr "Nid d'abeille 3D" -#: src/slic3r/GUI/Plater.cpp:3590 -#, possible-c-format +#: src/slic3r/GUI/Mouse3DController.cpp:274 +msgid "3Dconnexion settings" +msgstr "Paramètres 3Dconnexion" + +#: src/slic3r/GUI/Plater.cpp:5038 +#, c-format msgid "3MF file exported to %s" msgstr "Fichier 3MF exporté vers %s" -#: src/slic3r/GUI/ConfigWizard.cpp:1092 +#: src/slic3r/GUI/ConfigWizard.cpp:1979 msgid "< &Back" msgstr "< &Précédent" -#: src/libslic3r/PrintConfig.cpp:251 +#: src/libslic3r/PrintConfig.cpp:287 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:236 +#: src/libslic3r/PrintConfig.cpp:272 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/ConfigWizard.cpp:609 +#: src/slic3r/GUI/Tab.cpp:975 +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 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:623 +#: src/slic3r/GUI/ConfigWizard.cpp:1048 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:721 +#: 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/AboutDialog.cpp:35 -#, possible-c-format +#: src/slic3r/GUI/AboutDialog.cpp:199 +#, c-format msgid "About %s" msgstr "Au sujet de %s" -#: src/libslic3r/GCode/PreviewData.cpp:499 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:959 +#, c-format msgid "above %.2f mm" msgstr "au dessus de %.2f mm" -#: src/libslic3r/PrintConfig.cpp:1499 +#: src/libslic3r/PrintConfig.cpp:1569 msgid "Above Z" msgstr "Au-delà de Z" -#: src/slic3r/GUI/Tab.cpp:1103 +#: src/slic3r/GUI/Tab.cpp:1164 msgid "Acceleration control (advanced)" msgstr "Contrôle de l'accélération (avancé)" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:73 +#: src/libslic3r/PrintConfig.cpp:2925 +msgid "Accuracy" +msgstr "Précision" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 msgid "Activate" msgstr "Activer" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:39 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 msgid "Active" msgstr "Actif" -#: src/slic3r/GUI/Preset.cpp:1003 src/slic3r/GUI/Tab.cpp:237 +#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1705 +msgid "active" +msgstr "actif" + +#: src/slic3r/GUI/GLCanvas3D.cpp:267 +msgid "Adaptive" +msgstr "Adaptatif" + +#: src/slic3r/GUI/Tab.cpp:241 msgid "Add a new printer" msgstr "Ajouter une nouvelle imprimante" -#: src/libslic3r/PrintConfig.cpp:2517 +#: src/libslic3r/PrintConfig.cpp:2782 msgid "Add a pad underneath the supported model" msgstr "Ajouter une base sous le modèle supporté" -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2058 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/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/DoubleSlider.cpp:991 +msgid "Add another code - Ctrl + Left click" +msgstr "Ajouter un autre code - Ctr + Clic gauche" + +#: src/slic3r/GUI/DoubleSlider.cpp:992 +msgid "Add another code - Right click" +msgstr "Ajouter un autre code - Clic droit" + +#: src/slic3r/GUI/DoubleSlider.cpp:1477 +msgid "Add color change" +msgstr "Ajouter un changement de couleur" + +#: src/slic3r/GUI/DoubleSlider.cpp:1180 +msgid "Add color change (%1%) for:" +msgstr "Ajouter le changement de couleur (%1%) pour :" + +#: src/slic3r/GUI/DoubleSlider.cpp:988 +msgid "Add color change - Left click" +msgstr "Ajouter un changement de couleur - Clic gauche" + +#: src/slic3r/GUI/DoubleSlider.cpp:986 +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 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/GUI_ObjectList.cpp:1662 +#: src/slic3r/GUI/DoubleSlider.cpp:1490 +msgid "Add custom G-code" +msgstr "Ajouter un G-code personnalisé" + +#: src/slic3r/GUI/GLCanvas3D.cpp:240 +msgid "Add detail" +msgstr "Ajouter des détails" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:421 +msgid "Add drainage hole" +msgstr "Ajouter un trou de drainage" + +#: src/slic3r/GUI/DoubleSlider.cpp:984 +msgid "Add extruder change - Left click" +msgstr "Ajouter un changement d'extrudeur - Clic gauche" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 +msgid "Add extruder to sequence" +msgstr "Ajouter l'extrudeur à la séquence" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1993 msgid "Add Generic Subobject" msgstr "Ajouter un Sous-objet Générique" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2584 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2613 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2896 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2925 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 msgid "Add Height Range" msgstr "Ajouter une Zone de Hauteur" -#: src/slic3r/GUI/GLCanvas3D.cpp:3463 +#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3788 +#: src/slic3r/GUI/Plater.cpp:3800 src/slic3r/GUI/Plater.cpp:3940 msgid "Add instance" msgstr "Ajouter l'instance" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Add Instance of the selected object" msgstr "Ajouter une Instance à l'objet sélectionné" @@ -366,99 +474,113 @@ msgstr "Ajouter une Instance à l'objet sélectionné" msgid "Add layer range" msgstr "Ajouter une zone de couche" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1950 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2328 msgid "Add Layers" msgstr "Ajouter des couches" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 msgid "Add modifier" msgstr "Ajouter un modificateur" -#: src/libslic3r/PrintConfig.cpp:447 +#: src/libslic3r/PrintConfig.cpp:479 #, no-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:3516 +#: src/slic3r/GUI/Plater.cpp:3940 msgid "Add one more instance of the selected object" msgstr "Ajouter une instance supplémentaire de l'objet sélectionné" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1066 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1082 +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 msgid "Add part" msgstr "Ajouter une pièce" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/DoubleSlider.cpp:1487 +msgid "Add pause print" +msgstr "Ajouter une pause d'impression" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 msgid "Add point" msgstr "Ajouter un point" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1232 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 msgid "Add point to selection" msgstr "Ajouter un point à la sélection" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1118 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 msgid "Add settings" msgstr "Ajouter des réglages" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1252 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 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:1191 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1388 msgid "Add Settings Bundle for Object" msgstr "Ajouter une Combinaison de Réglages pour l'Objet" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1190 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1387 msgid "Add Settings Bundle for Sub-object" msgstr "Ajouter une Combinaison de Réglages pour le Sous-objet" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1126 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1314 msgid "Add Settings for Layers" msgstr "Ajouter des Réglages pour les Couches" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1128 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 msgid "Add Settings for Object" msgstr "Ajouter des Réglages pour un Objet" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1315 msgid "Add Settings for Sub-object" msgstr "Ajouter des Réglages pour un Sous-objet" -#: src/libslic3r/PrintConfig.cpp:382 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1793 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2051 +msgid "Add Shape" +msgstr "Ajouter une Forme" + +#: src/libslic3r/PrintConfig.cpp:409 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)." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1069 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1089 +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 msgid "Add support blocker" msgstr "Ajouter un bloqueur de support" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1068 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1086 +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 msgid "Add support enforcer" msgstr "Ajouter un générateur de supports" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:531 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:494 msgid "Add support point" msgstr "Ajouter un point de support" -#: src/slic3r/GUI/GLCanvas3D.cpp:3392 +#: src/slic3r/GUI/GLCanvas3D.cpp:4467 msgid "Add..." msgstr "Ajouter..." -#: src/slic3r/GUI/wxExtensions.cpp:2571 -msgid "Add/Del color change" -msgstr "Ajouter/Supprimer un changement de couleur" +#: src/slic3r/GUI/PresetBundle.cpp:1704 +msgid "Add/Remove filaments" +msgstr "Ajouter/Enlever des filaments" -#: src/slic3r/GUI/Tab.cpp:920 +#: src/slic3r/GUI/Preset.cpp:1201 +msgid "Add/Remove materials" +msgstr "Ajouter/Enlever des matériaux" + +#: src/slic3r/GUI/Preset.cpp:1203 +msgid "Add/Remove printers" +msgstr "Ajouter/Supprimer des imprimantes" + +#: src/slic3r/GUI/Tab.cpp:970 msgid "Additional information:" msgstr "Informations complémentaires :" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59 msgid "Additional Settings" msgstr "Réglages Additionnels" -#: src/slic3r/GUI/ConfigWizard.cpp:431 +#: src/slic3r/GUI/ConfigWizard.cpp:791 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." @@ -466,279 +588,319 @@ msgstr "De plus, un instantané de sauvegarde de l'ensemble de la configuration msgid "Address" msgstr "Adresse" -#: src/slic3r/GUI/GUI_App.cpp:675 src/slic3r/GUI/GUI_ObjectList.cpp:76 -#: src/slic3r/GUI/GUI_ObjectList.cpp:517 src/slic3r/GUI/Tab.cpp:1026 -#: src/slic3r/GUI/Tab.cpp:1041 src/slic3r/GUI/Tab.cpp:1139 -#: src/slic3r/GUI/Tab.cpp:1142 src/slic3r/GUI/Tab.cpp:1515 -#: src/slic3r/GUI/Tab.cpp:1940 src/slic3r/GUI/Tab.cpp:3435 -#: src/slic3r/GUI/wxExtensions.cpp:2460 src/libslic3r/PrintConfig.cpp:72 -#: src/libslic3r/PrintConfig.cpp:187 src/libslic3r/PrintConfig.cpp:350 -#: src/libslic3r/PrintConfig.cpp:988 src/libslic3r/PrintConfig.cpp:2175 +#: 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 msgid "Advanced" msgstr "Avancé" -#: src/slic3r/GUI/GUI_App.cpp:675 +#: src/slic3r/GUI/ConfigWizard.cpp:821 +msgid "Advanced mode" +msgstr "Mode avancé" + +#: src/slic3r/GUI/GUI_App.cpp:814 msgid "Advanced View Mode" msgstr "Vue en Mode Avancé" -#: src/slic3r/GUI/FirmwareDialog.cpp:803 +#: src/slic3r/GUI/FirmwareDialog.cpp:841 msgid "Advanced: Output log" msgstr "Avancé : journal de Sortie" -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:668 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:1967 src/libslic3r/PrintConfig.cpp:1031 +#: src/slic3r/GUI/Tab.cpp:1994 src/libslic3r/PrintConfig.cpp:1080 msgid "After layer change G-code" msgstr "G-Code après changement de couche" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3398 msgid "Align the model to the given point." msgstr "Aligner le modèle sur le point défini." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3397 msgid "Align XY" msgstr "Aligner XY" -#: src/libslic3r/PrintConfig.cpp:1561 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "Aligned" msgstr "Aligné" -#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:2986 +#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573 +#: src/slic3r/GUI/Tab.cpp:3174 msgid "All" msgstr "Tous" -#: src/libslic3r/Print.cpp:1135 +#: src/libslic3r/Print.cpp:1219 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:3298 -msgid "All objects will be removed, continue ?" -msgstr "Tous les objets seront supprimés, continuer?" +#: src/slic3r/GUI/Plater.cpp:4669 +msgid "All objects will be removed, continue?" +msgstr "Tous les objets seront supprimés, continuer ?" -#: src/slic3r/GUI/ConfigWizard.cpp:188 +#: src/slic3r/GUI/ConfigWizard.cpp:289 msgid "All standard" msgstr "Tout en standard" -#: src/libslic3r/Zipper.cpp:65 +#: src/libslic3r/Zipper.cpp:62 msgid "allocation failed" msgstr "échec de l'allocation" -#: src/slic3r/GUI/Plater.cpp:2939 +#: src/slic3r/GUI/Plater.cpp:3995 msgid "Along X axis" msgstr "Le long de l'axe X" -#: src/slic3r/GUI/Plater.cpp:2941 +#: src/slic3r/GUI/Plater.cpp:3997 msgid "Along Y axis" msgstr "Le long de l'axe Y" -#: src/slic3r/GUI/Plater.cpp:2943 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Along Z axis" msgstr "Le long de l'axe Z" -#: src/slic3r/GUI/ConfigWizard.cpp:122 +#: src/slic3r/GUI/ConfigWizard.cpp:222 msgid "Alternate nozzles:" msgstr "Buses alternatives :" -#: src/slic3r/GUI/Plater.cpp:3561 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:5002 +#, c-format msgid "AMF file exported to %s" msgstr "Fichier AMF exporté vers %s" -#: src/slic3r/GUI/GLCanvas3D.cpp:725 -msgid "An object outside the print area was detected\nResolve the current problem to continue slicing" -msgstr "Objet détecté en dehors de la zone d'impression\nRésolvez ce problème pour poursuivre le processus de découpage" +#: 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:720 +#: 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/Tab.cpp:2781 +#: 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/Plater.cpp:2461 +#: src/slic3r/GUI/Plater.cpp:3170 msgid "Another export job is currently running." msgstr "Une autre tâche d'export est actuellement en cours." -#: src/slic3r/GUI/Tab.cpp:926 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Any arrow" +msgstr "N'importe quelle flèche" + +#: src/slic3r/GUI/Tab.cpp:965 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:88 +#: src/libslic3r/PrintConfig.cpp:104 msgid "API Key / Password" msgstr "Clé API / Mot de Passe" -#: src/slic3r/GUI/GUI_App.cpp:671 +#: src/slic3r/GUI/GUI_App.cpp:810 msgid "Application preferences" msgstr "Préférences de l'application" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:864 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1240 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1374 msgid "Apply changes" msgstr "Appliquer les modifications" -#: src/libslic3r/PrintConfig.cpp:542 src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708 msgid "approximate seconds" msgstr "secondes approximatives" -#: src/libslic3r/PrintConfig.cpp:401 src/libslic3r/PrintConfig.cpp:807 +#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854 msgid "Archimedean Chords" msgstr "Accords archimédiens" -#: src/libslic3r/Zipper.cpp:91 +#: src/libslic3r/Zipper.cpp:88 msgid "archive is too large" msgstr "l'archive est trop volumineuse" #. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:2955 +#: src/slic3r/GUI/Tab.cpp:3123 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:862 -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/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 !" -#: src/libslic3r/PrintConfig.cpp:2258 +#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924 +msgid "Are you sure you want to continue?" +msgstr "Êtes-vous sûr de vouloir continuer ?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 +msgid "Are you sure you want to do it?" +msgstr "Êtes-vous certain de vouloir le faire ?" + +#: src/libslic3r/PrintConfig.cpp:2423 msgid "Area fill" msgstr "Remplissage de zone" -#: src/slic3r/GUI/Plater.cpp:609 +#: src/slic3r/GUI/Plater.cpp:641 msgid "Around object" msgstr "Autour de l'objet" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/Plater.cpp:2754 msgid "Arrange" msgstr "Agencer" -#: src/slic3r/GUI/GLCanvas3D.cpp:3486 +#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Arrange selection" msgstr "Agencer la sélection" -#: src/libslic3r/PrintConfig.cpp:3054 +#: src/libslic3r/PrintConfig.cpp:3443 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:2106 +#: src/slic3r/GUI/Plater.cpp:2813 msgid "Arranging" msgstr "Agencement en cours" -#: src/slic3r/GUI/Plater.cpp:2718 +#: src/slic3r/GUI/Plater.cpp:2841 msgid "Arranging canceled." msgstr "Agencement annulé." -#: src/slic3r/GUI/Plater.cpp:2144 +#: src/slic3r/GUI/Plater.cpp:2842 msgid "Arranging done." msgstr "Agencement terminé." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Arrow Down" msgstr "Flèche Bas" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 msgid "Arrow Left" msgstr "Flèche Gauche" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 msgid "Arrow Right" msgstr "Flèche Droite" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 msgid "Arrow Up" msgstr "Flèche Haut" -#: src/slic3r/GUI/GUI_App.cpp:303 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:290 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.cpp:144 src/slic3r/GUI/GUI_App.cpp:743 -#: src/slic3r/GUI/Tab.cpp:2798 +#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2313 +#: src/slic3r/GUI/Tab.cpp:2960 msgid "Attention!" msgstr "Attention !" -#: src/libslic3r/PrintConfig.cpp:1785 +#: src/libslic3r/PrintConfig.cpp:1871 msgid "Auto generated supports" msgstr "Supports générés automatiquement" -#: src/slic3r/GUI/Preferences.cpp:44 +#: src/slic3r/GUI/Preferences.cpp:47 msgid "Auto-center parts" msgstr "Centrer automatiquement les pièces" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:902 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1243 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1377 msgid "Auto-generate points" msgstr "Générer automatiquement les points" -#: src/slic3r/GUI/Plater.cpp:979 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1157 +#, c-format msgid "Auto-repaired (%d errors)" msgstr "Réparé automatiquement (%d erreurs)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:230 -#, possible-c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "Réparé automatiquement (%d erreurs):\n" +#: src/slic3r/GUI/GUI_ObjectList.cpp:339 +#, c-format +msgid "Auto-repaired (%d errors):" +msgstr "Réparé automatiquement (%d erreurs):" -#: src/slic3r/GUI/FirmwareDialog.cpp:771 +#: src/slic3r/GUI/FirmwareDialog.cpp:809 msgid "Autodetected" msgstr "Autodétecté" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1338 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Autogenerate support points" msgstr "Autogénérer les points de support" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1166 -msgid "Autogeneration will erase all manually edited points.\n\nAre you sure you want to do it?\n" -msgstr "L'autogénération va effacer tous les points édités manuellement.\n\nVoulez-vous vraiment le faire ?\n" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 +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:3421 +#: src/slic3r/GUI/Tab.cpp:3632 msgid "Automatic generation" msgstr "Génération automatique" -#: src/slic3r/GUI/ConfigWizard.cpp:401 +#: src/slic3r/GUI/ConfigWizard.cpp:761 msgid "Automatic updates" msgstr "Mises à jour automatiques" -#: src/slic3r/GUI/MainFrame.cpp:406 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "Automatically repair an STL file" msgstr "Réparer automatiquement un fichier STL" -#: src/slic3r/GUI/Tab.cpp:1110 +#: src/slic3r/GUI/Tab.cpp:1171 msgid "Autospeed (advanced)" msgstr "Vitesse automatique (avancé)" -#: src/libslic3r/PrintConfig.cpp:111 +#: src/libslic3r/PrintConfig.cpp:136 msgid "Avoid crossing perimeters" msgstr "Éviter de traverser les périmètres" -#: src/slic3r/GUI/Tab.cpp:3081 +#: src/slic3r/GUI/Tab.cpp:3268 msgid "BACK ARROW" msgstr "FLÈCHE ARRIÈRE" -#: src/slic3r/GUI/Tab.cpp:3113 -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: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:3127 -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/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/Preferences.cpp:52 +#: src/slic3r/GUI/Preferences.cpp:55 msgid "Background processing" msgstr "Tâche en arrière plan" -#: src/slic3r/GUI/GUI_ObjectList.cpp:242 +#: src/slic3r/GUI/GUI_ObjectList.cpp:351 msgid "backwards edges" msgstr "arrêtes à l'envers" -#: src/slic3r/GUI/MainFrame.cpp:152 +#: src/slic3r/GUI/MainFrame.cpp:174 msgid "based on Slic3r" msgstr "basé sur Slic3r" -#: src/slic3r/GUI/Tab.cpp:1484 +#: src/slic3r/GUI/Tab.cpp:1439 msgid "Bed" msgstr "Plateau" @@ -750,31 +912,31 @@ msgstr "Modèle personnalisé de lit" msgid "Bed custom texture" msgstr "Texture du plateau personnalisée" -#: src/slic3r/GUI/BedShapeDialog.hpp:45 src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:929 msgid "Bed Shape" msgstr "Forme du plateau" -#: src/libslic3r/PrintConfig.cpp:50 +#: src/libslic3r/PrintConfig.cpp:51 msgid "Bed shape" msgstr "Forme du plateau" -#: src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/ConfigWizard.cpp:929 msgid "Bed Shape and Size" msgstr "Forme du Plateau et Taille" -#: src/libslic3r/PrintConfig.cpp:122 +#: src/libslic3r/PrintConfig.cpp:147 msgid "Bed temperature" msgstr "Température du plateau" -#: src/libslic3r/PrintConfig.cpp:120 +#: src/libslic3r/PrintConfig.cpp:145 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:626 +#: src/slic3r/GUI/ConfigWizard.cpp:1051 msgid "Bed Temperature:" msgstr "Température du Plateau :" -#: src/slic3r/GUI/Tab.cpp:1961 src/libslic3r/PrintConfig.cpp:128 +#: src/slic3r/GUI/Tab.cpp:1988 src/libslic3r/PrintConfig.cpp:153 msgid "Before layer change G-code" msgstr "G-Code avant changement de couche" @@ -782,90 +944,110 @@ msgstr "G-Code avant changement de couche" msgid "Before roll back" msgstr "Avant le retour en arrière" -#: src/slic3r/GUI/Plater.cpp:608 +#: src/slic3r/GUI/Plater.cpp:640 msgid "Below object" msgstr "Sous l'objet" -#: src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Below Z" msgstr "En-deçà de Z" -#: src/libslic3r/PrintConfig.cpp:139 +#: src/libslic3r/PrintConfig.cpp:164 msgid "Between objects G-code" msgstr "Entre le G-code des objets" -#: src/slic3r/GUI/Tab.cpp:1979 +#: src/slic3r/GUI/Tab.cpp:2006 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 +msgid "Bottle volume" +msgstr "Volume de la bouteille" + +#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497 +msgid "Bottle weight" +msgstr "Poids de la bouteille" + #. TRN To be shown in the main menu View->Bottom -#: src/slic3r/GUI/MainFrame.cpp:524 +#. 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 msgid "Bottom" msgstr "Dessous" -#: src/libslic3r/PrintConfig.cpp:409 +#: src/libslic3r/PrintConfig.cpp:435 msgid "Bottom fill pattern" msgstr "Motif de remplissage du dessous" -#: src/libslic3r/PrintConfig.cpp:152 +#: src/slic3r/GUI/PresetHints.cpp:342 +msgid "Bottom is open." +msgstr "Le fond est ouvert." + +#: src/slic3r/GUI/PresetHints.cpp:336 +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 msgid "Bottom solid layers" msgstr "Couches solides inférieures" -#: src/slic3r/GUI/MainFrame.cpp:524 +#: src/slic3r/GUI/MainFrame.cpp:665 msgid "Bottom View" msgstr "Vue du Dessous" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1087 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1090 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1464 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1468 msgid "Box" msgstr "Case" -#: src/libslic3r/PrintConfig.cpp:157 +#: src/libslic3r/PrintConfig.cpp:193 msgid "Bridge" msgstr "Pont" -#: src/libslic3r/PrintConfig.cpp:186 +#: src/libslic3r/PrintConfig.cpp:222 msgid "Bridge flow ratio" msgstr "Ratio de flux pour les ponts" -#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/GCode/PreviewData.cpp:169 +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316 msgid "Bridge infill" msgstr "Remplissage du pont" -#: src/libslic3r/PrintConfig.cpp:198 +#: src/libslic3r/PrintConfig.cpp:234 msgid "Bridges" msgstr "Ponts" -#: src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:213 msgid "Bridges fan speed" msgstr "Vitesse du ventilateur pour les ponts" -#: src/libslic3r/PrintConfig.cpp:166 +#: src/libslic3r/PrintConfig.cpp:202 msgid "Bridging angle" msgstr "Angle du pont" -#: src/libslic3r/PrintConfig.cpp:168 +#: src/libslic3r/PrintConfig.cpp:204 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:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Bridging volumetric" msgstr "Volumétrie des ponts" -#: src/slic3r/GUI/Plater.cpp:446 src/slic3r/GUI/Tab.cpp:1056 +#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117 msgid "Brim" msgstr "Bordure" -#: src/libslic3r/PrintConfig.cpp:208 +#: src/libslic3r/PrintConfig.cpp:244 msgid "Brim width" msgstr "Largeur de la bordure" -#: src/slic3r/GUI/Tab.cpp:1681 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1658 +#: src/slic3r/GUI/Tab.cpp:1721 msgid "Browse" msgstr "Parcourir" -#: src/libslic3r/Zipper.cpp:85 +#: src/libslic3r/Zipper.cpp:82 msgid "buffer too small" msgstr "buffer trop petit" @@ -873,850 +1055,1042 @@ msgstr "buffer trop petit" msgid "Buttons And Text Colors Description" msgstr "Description des Boutons et des Couleurs de Texte" -#: src/slic3r/GUI/PresetHints.cpp:220 +#: src/slic3r/GUI/PresetHints.cpp:223 msgid "by the print profile maximum" msgstr "par le maximum du profil de l'imprimante" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:113 +msgid "Camera" +msgstr "Caméra" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Camera view" msgstr "Vue caméra" -#: src/slic3r/GUI/ConfigWizard.cpp:1095 src/slic3r/GUI/FirmwareDialog.cpp:147 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:37 -#: src/slic3r/GUI/ProgressStatusBar.cpp:28 +#: src/slic3r/GUI/ConfigWizard.cpp:1982 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 msgid "Cancel" msgstr "Annuler" -#: src/slic3r/GUI/PrintHostDialogs.cpp:156 +#: src/slic3r/GUI/PrintHostDialogs.cpp:157 msgid "Cancel selected" msgstr "Annuler la sélection" -#: src/slic3r/GUI/Plater.cpp:2727 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3669 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "Annulé" -#: src/slic3r/GUI/Plater.cpp:2444 src/slic3r/GUI/PrintHostDialogs.cpp:231 +#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "Annulation" -#: src/slic3r/GUI/FirmwareDialog.cpp:866 +#: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." msgstr "Annulation..." -#: src/slic3r/GUI/Tab.cpp:2905 +#: src/libslic3r/Flow.cpp:61 +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: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: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/Tab.cpp:3073 msgid "Cannot overwrite a system profile." msgstr "Impossible d'écraser un profil système." -#: src/slic3r/GUI/Tab.cpp:2909 +#: src/slic3r/GUI/Tab.cpp:3077 msgid "Cannot overwrite an external profile." msgstr "Impossible d'écraser un profil externe." -#: src/libslic3r/SLAPrint.cpp:612 +#: src/libslic3r/SLAPrint.cpp:613 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:1840 +#: src/slic3r/GUI/Tab.cpp:1834 msgid "Capabilities" msgstr "Fonctionnalités" -#: src/slic3r/GUI/GUI_App.cpp:662 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Capture a configuration snapshot" msgstr "Capturer un instantané de la configuration" -#: src/libslic3r/PrintConfig.cpp:3035 +#: src/libslic3r/PrintConfig.cpp:3424 msgid "Center" msgstr "Centrer" -#: src/libslic3r/PrintConfig.cpp:3036 +#: src/libslic3r/PrintConfig.cpp:3425 msgid "Center the print around the given center." msgstr "Centrer l'impression autour d'un point donné." -#: src/slic3r/GUI/Tab.cpp:1744 +#: src/slic3r/GUI/Tab.cpp:1728 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Fichiers de certificat (*.crt, *.pem)|*.crt;*.pem|Tous les fichiers|*.*" -#: src/slic3r/GUI/GUI_App.cpp:683 -msgid "Change Application &Language" -msgstr "Changer la &Langue de l'Application" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Change camera type (perspective, orthographic)" msgstr "Changer le type d'appareil photo (perspective, orthographique)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:885 +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 msgid "Change extruder" msgstr "Changer l'extrudeur" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:144 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectList.cpp:536 +msgid "Change Extruder" +msgstr "Changer d'Extrudeur" + +#: src/slic3r/GUI/DoubleSlider.cpp:1145 +msgid "Change extruder (N/A)" +msgstr "Changer l'extrudeur (N/A)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3997 +msgid "Change Extruders" +msgstr "Changer les Extrudeurs" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 +#, c-format msgid "Change Option %s" msgstr "Modifier l'Option %s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3134 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3558 msgid "Change Part Type" msgstr "Changer le Type de Partie" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:925 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820 msgid "Change point head diameter" msgstr "Changer le diamètre de la tête de la pointe" -#: src/slic3r/GUI/Plater.cpp:3520 +#: src/slic3r/GUI/Plater.cpp:3944 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:1185 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1589 msgid "Change type" msgstr "Changer le type" -#: src/slic3r/GUI/UpdateDialogs.cpp:56 +#: src/slic3r/GUI/UpdateDialogs.cpp:53 msgid "Changelog && Download" msgstr "Téléchargement du Journal des Modifications" -#: src/slic3r/GUI/GUI_App.cpp:378 +#: src/slic3r/GUI/GUI_App.cpp:442 msgid "Changing of an application language" msgstr "Changer la langue d'une application" -#: src/slic3r/GUI/ConfigWizard.cpp:409 src/slic3r/GUI/Preferences.cpp:61 +#: src/slic3r/GUI/ConfigWizard.cpp:769 src/slic3r/GUI/Preferences.cpp:64 msgid "Check for application updates" msgstr "Vérifier les mises à jour de l'application" -#: src/slic3r/GUI/BedShapeDialog.cpp:509 +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for configuration updates" +msgstr "Vérifier les mises à jour de configuration" + +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for updates" +msgstr "Vérifier les mises à jo&ur" + +#: src/slic3r/GUI/BedShapeDialog.cpp:532 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:621 +#: src/slic3r/GUI/MainFrame.cpp:773 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:532 +#: src/slic3r/GUI/BedShapeDialog.cpp:555 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:464 +#: src/slic3r/GUI/BedShapeDialog.cpp:487 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:510 +#: src/slic3r/GUI/GUI_App.cpp:555 msgid "Choose one file (3MF/AMF):" msgstr "Choisir un fichier (3MF/AMF) :" -#: src/slic3r/GUI/GUI_App.cpp:501 +#: src/slic3r/GUI/GUI_App.cpp:567 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:490 +#: src/slic3r/GUI/ConfigWizard.cpp:895 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:84 +#: src/slic3r/GUI/BedShapeDialog.cpp:89 msgid "Circular" msgstr "Circulaire" -#: src/slic3r/GUI/GLCanvas3D.cpp:3701 src/slic3r/GUI/GLCanvas3D.cpp:3734 +#: 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/GUI_ObjectList.cpp:383 +#: src/slic3r/GUI/GUI_ObjectList.cpp:404 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:377 +#: src/slic3r/GUI/GUI_ObjectList.cpp:398 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:292 +#: src/slic3r/GUI/Plater.cpp:343 msgid "Click to edit preset" msgstr "Cliquez pour éditer le préréglage" -#: src/libslic3r/PrintConfig.cpp:216 +#: src/libslic3r/PrintConfig.cpp:252 msgid "Clip multi-part objects" msgstr "Dissocier les objets multi-pièces" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:928 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 msgid "Clipping of view" msgstr "Le plan de découpage" -#: src/slic3r/GUI/FirmwareDialog.cpp:814 -#: src/slic3r/GUI/PrintHostDialogs.cpp:160 +#: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/Mouse3DController.cpp:364 +#: src/slic3r/GUI/PrintHostDialogs.cpp:161 msgid "Close" msgstr "Fermer" -#: src/libslic3r/PrintConfig.cpp:550 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +#: src/libslic3r/PrintConfig.cpp:2934 +msgid "Closing distance" +msgstr "Distance de fermeture" + +#: src/slic3r/GUI/Plater.cpp:1260 src/libslic3r/PrintConfig.cpp:582 msgid "Color" msgstr "Couleur" -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/GUI_Preview.cpp:535 -#: src/libslic3r/GCode/PreviewData.cpp:406 +#: src/slic3r/GUI/DoubleSlider.cpp:1005 +msgid "Color change (\"%1%\")" +msgstr "Changement de couleur (\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:1006 +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/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572 +#: src/libslic3r/GCode/PreviewData.cpp:359 msgid "Color Print" msgstr "Couleur d'Impression" -#: src/libslic3r/PrintConfig.cpp:224 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Colorprint height" msgstr "Hauteur du Colorprint" -#: src/libslic3r/PrintConfig.cpp:942 +#: src/libslic3r/PrintConfig.cpp:990 msgid "Combine infill every" msgstr "Combiner le remplissage toutes les" -#: src/libslic3r/PrintConfig.cpp:947 +#: src/libslic3r/PrintConfig.cpp:995 msgid "Combine infill every n layers" msgstr "Combiner le remplissage toutes les n couches" -#: src/slic3r/GUI/UpdateDialogs.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Commands" +msgstr "Commandes" + +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 msgid "Comment:" msgstr "Commentaire :" -#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:244 +#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280 msgid "Compatible print profiles" msgstr "Profils d'impression compatibles" -#: src/libslic3r/PrintConfig.cpp:250 +#: src/libslic3r/PrintConfig.cpp:286 msgid "Compatible print profiles condition" msgstr "Condition des profils d'impression compatibles" -#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:229 +#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265 msgid "Compatible printers" msgstr "Imprimantes compatibles" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:271 msgid "Compatible printers condition" msgstr "Condition de compatibilité des imprimantes" -#: src/libslic3r/PrintConfig.cpp:268 +#: src/libslic3r/PrintConfig.cpp:304 msgid "Complete individual objects" msgstr "Compléter les objets individuels" -#: src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/PrintHostDialogs.cpp:234 msgid "Completed" msgstr "Terminé" -#: src/libslic3r/Zipper.cpp:57 +#: src/libslic3r/Zipper.cpp:54 msgid "compression failed" msgstr "échec de la compression" -#: src/libslic3r/PrintConfig.cpp:399 src/libslic3r/PrintConfig.cpp:802 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849 msgid "Concentric" msgstr "Concentrique" -#: src/slic3r/GUI/ConfigWizard.cpp:1185 +#: src/slic3r/GUI/ConfigWizard.cpp:2110 msgid "Configuration &Assistant" msgstr "&Assistant de Configuration" -#: src/slic3r/GUI/ConfigWizard.cpp:1182 +#: src/slic3r/GUI/ConfigWizard.cpp:2113 msgid "Configuration &Wizard" -msgstr "&Assistant de Configuration" +msgstr "Assistant de Co&nfiguration" -#: src/slic3r/GUI/ConfigWizard.cpp:1184 +#: src/slic3r/GUI/ConfigWizard.cpp:2109 msgid "Configuration Assistant" msgstr "Assistant de Configuration" -#: src/libslic3r/PrintConfig.cpp:1251 +#: src/libslic3r/PrintConfig.cpp:1316 msgid "Configuration notes" msgstr "Notes de configuration" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:99 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104 msgid "Configuration Snapshots" msgstr "Instantanés de Configuration capturés" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 src/slic3r/GUI/UpdateDialogs.cpp:168 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" msgstr "Mise à jour de la configuration" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 msgid "Configuration update is available" msgstr "Une mise à jour de la configuration est disponible" -#: src/slic3r/GUI/ConfigWizard.cpp:1181 +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "Configuration updates" +msgstr "Mises à jour de la configuration" + +#: src/slic3r/GUI/ConfigWizard.cpp:2112 msgid "Configuration Wizard" msgstr "Assistant de Configuration" -#: src/slic3r/GUI/FirmwareDialog.cpp:863 +#: src/slic3r/GUI/FirmwareDialog.cpp:903 msgid "Confirmation" msgstr "Confirmation" -#: src/slic3r/GUI/Tab.cpp:1904 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Connection failed." msgstr "La connexion a échoué." -#: src/slic3r/GUI/Tab.cpp:3416 +#: src/slic3r/GUI/Tab.cpp:3627 msgid "Connection of the support sticks and junctions" msgstr "Connexion des tiges de support et jonctions" -#: src/slic3r/Utils/Duet.cpp:51 +#: src/slic3r/Utils/AstroBox.cpp:83 +msgid "Connection to AstroBox works correctly." +msgstr "La connexion à AstroBox fonctionne correctement." + +#: src/slic3r/Utils/Duet.cpp:49 msgid "Connection to Duet works correctly." msgstr "La connexion avec Duet fonctionne correctement." -#: src/slic3r/Utils/OctoPrint.cpp:84 +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "La connexion à FlashAir fonctionne correctement et le téléchargement est activé." + +#: src/slic3r/Utils/OctoPrint.cpp:83 msgid "Connection to OctoPrint works correctly." msgstr "La connexion avec OctoPrint fonctionne correctement." -#: src/slic3r/GUI/Tab.cpp:1901 +#: src/slic3r/GUI/Tab.cpp:1928 msgid "Connection to printer works correctly." msgstr "La connexion avec l'imprimante fonctionne correctement." -#: src/slic3r/Utils/OctoPrint.cpp:195 +#: src/slic3r/Utils/OctoPrint.cpp:176 msgid "Connection to Prusa SL1 works correctly." msgstr "La connexion avec Prusa SL1 fonctionne correctement." -#: src/libslic3r/PrintConfig.cpp:1823 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Contact Z distance" msgstr "Distance de contact Z" -#: src/slic3r/GUI/AboutDialog.cpp:96 +#: src/slic3r/GUI/AboutDialog.cpp:261 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:2433 +#: src/libslic3r/PrintConfig.cpp:2659 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:1489 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Cooling" msgstr "Refroidissement" -#: src/libslic3r/PrintConfig.cpp:629 +#: src/libslic3r/PrintConfig.cpp:660 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:648 +#: src/libslic3r/PrintConfig.cpp:679 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:1510 +#: src/slic3r/GUI/Tab.cpp:1465 msgid "Cooling thresholds" msgstr "Seuils de refroidissement" -#: src/libslic3r/PrintConfig.cpp:291 +#: src/libslic3r/PrintConfig.cpp:327 msgid "Cooling tube length" msgstr "Longueur du tube de refroidissement" -#: src/libslic3r/PrintConfig.cpp:283 +#: src/libslic3r/PrintConfig.cpp:319 msgid "Cooling tube position" msgstr "Position du tube de refroidissement" -#: src/slic3r/GUI/Tab.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:4752 +msgid "Copies of the selected object" +msgstr "Copies de l'objet sélectionné" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4505 msgid "Copy" msgstr "Copier" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:589 msgid "Copy selection to clipboard" msgstr "Copier la sélection dans le presse-papier" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 msgid "Copy to clipboard" msgstr "Copier dans le presse-papier" -#: src/slic3r/GUI/SysInfoDialog.cpp:120 +#: src/slic3r/GUI/SysInfoDialog.cpp:154 msgid "Copy to Clipboard" msgstr "Copier dans le Presse-Papier" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:84 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:400 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121 +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 +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 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:92 +#: 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/AboutDialog.cpp:92 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112 +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 msgid "Copyright" msgstr "Droits d'auteur" -#: src/libslic3r/PrintConfig.cpp:2324 src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572 msgid "Correction for expansion" msgstr "Correction avant expansion" -#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:3310 +#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:3519 msgid "Corrections" msgstr "Corrections" -#: src/slic3r/GUI/Plater.cpp:216 src/slic3r/GUI/Plater.cpp:1056 -#: src/libslic3r/PrintConfig.cpp:717 +#: src/slic3r/GUI/Plater.cpp:1243 src/libslic3r/PrintConfig.cpp:760 +#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511 msgid "Cost" msgstr "Coût" -#: src/slic3r/GUI/Plater.cpp:2140 +#: src/slic3r/GUI/Plater.cpp:239 +msgid "Cost (money)" +msgstr "Coût (argent)" + +#: src/slic3r/GUI/Plater.cpp:2835 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/Duet.cpp:56 +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Could not connect to AstroBox" +msgstr "Impossible de se connecter à AstroBox" + +#: src/slic3r/Utils/Duet.cpp:54 msgid "Could not connect to Duet" msgstr "Impossible de se connecter à Duet" -#: src/slic3r/Utils/OctoPrint.cpp:90 +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "Could not connect to FlashAir" +msgstr "Impossible de se connecter à FlashAir" + +#: src/slic3r/Utils/OctoPrint.cpp:89 msgid "Could not connect to OctoPrint" msgstr "Impossible de se connecter à OctoPrint" -#: src/slic3r/Utils/OctoPrint.cpp:200 +#: src/slic3r/Utils/OctoPrint.cpp:181 msgid "Could not connect to Prusa SLA" msgstr "Impossible de se connecter à Prusa SLA" -#: src/slic3r/GUI/Tab.cpp:1710 +#: src/slic3r/GUI/Tab.cpp:1687 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:151 +#: src/slic3r/Utils/Duet.cpp:134 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:1872 +#: src/libslic3r/PrintConfig.cpp:1959 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:73 +#: src/libslic3r/PrintConfig.cpp:89 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." -#: src/libslic3r/Zipper.cpp:61 +#: src/libslic3r/Zipper.cpp:58 msgid "CRC-32 check failed" msgstr "Échec du test CRC-32" -#: src/libslic3r/PrintConfig.cpp:2734 +#: src/libslic3r/PrintConfig.cpp:2857 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:2460 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Critical angle" msgstr "Angle critique" -#: src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2668 msgid "Cross" msgstr "Croiser" -#: src/libslic3r/PrintConfig.cpp:800 +#: src/libslic3r/PrintConfig.cpp:847 msgid "Cubic" msgstr "Cubique" -#: src/slic3r/GUI/wxExtensions.cpp:2413 -#, possible-c-format +#: src/slic3r/GUI/wxExtensions.cpp:704 +#, c-format msgid "Current mode is %s" msgstr "Le mode actuel est %s" -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" +msgstr "Le préréglage actuel est hérité de" + +#: src/slic3r/GUI/Tab.cpp:957 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." -#: src/slic3r/GUI/Tab.cpp:928 -#, possible-c-format -msgid "Current preset is inherited from:\n\t%s" -msgstr "Le préréglage actuel est hérité de :\n%s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:45 +#: src/slic3r/GUI/UpdateDialogs.cpp:43 msgid "Current version:" msgstr "Version actuelle :" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/slic3r/GUI/GUI_Preview.cpp:239 -#: src/libslic3r/GCode/PreviewData.cpp:175 +#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249 +#: src/libslic3r/ExtrusionEntity.cpp:322 msgid "Custom" msgstr "Personnalisé" -#: src/libslic3r/PrintConfig.cpp:96 +#: src/libslic3r/PrintConfig.cpp:112 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:1563 src/slic3r/GUI/Tab.cpp:1948 +#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1975 msgid "Custom G-code" msgstr "G-code personnalisé" -#: src/slic3r/GUI/ConfigWizard.cpp:373 +#: src/slic3r/GUI/DoubleSlider.cpp:1619 +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 msgid "Custom Printer" msgstr "Imprimante Personnalisée" -#: src/slic3r/GUI/ConfigWizard.cpp:373 +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer Setup" msgstr "Configuration d'une Imprimante Personnalisée" -#: src/slic3r/GUI/ConfigWizard.cpp:377 +#: src/slic3r/GUI/ConfigWizard.cpp:736 msgid "Custom profile name:" msgstr "Nom de profil personnalisé :" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3013 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3402 msgid "Cut" msgstr "Couper" -#: src/slic3r/GUI/Plater.cpp:4193 +#: src/slic3r/GUI/Plater.cpp:4786 msgid "Cut by Plane" msgstr "Couper selon un Plan" -#: src/libslic3r/PrintConfig.cpp:3014 +#: src/libslic3r/PrintConfig.cpp:3403 msgid "Cut model at the given Z." msgstr "Couper le modèle au Z donné." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Cylinder" msgstr "Cylindre" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:568 msgid "D&eselect all" msgstr "Tout désél&ectionner" -#: src/libslic3r/PrintConfig.cpp:3115 +#: src/libslic3r/PrintConfig.cpp:3504 msgid "Data directory" msgstr "Répertoire de données" -#: src/libslic3r/Zipper.cpp:55 +#: src/slic3r/GUI/Mouse3DController.cpp:313 +msgid "Deadzone:" +msgstr "Zone morte :" + +#: src/libslic3r/Zipper.cpp:52 msgid "decompression failed or archive is corrupted" msgstr "la décompression a échoué ou l'archive est corrompue" -#: src/slic3r/GUI/Plater.cpp:4127 +#: src/slic3r/GUI/Plater.cpp:4720 msgid "Decrease Instances" msgstr "Diminuer les Instances" -#: src/slic3r/GUI/GUI_App.cpp:594 src/slic3r/GUI/GUI_ObjectList.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1704 src/libslic3r/PrintConfig.cpp:335 msgid "Default" msgstr "Défaut" -#: xs/src/slic3r/GUI/Field.cpp:98 +#: 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 msgid "default" msgstr "défaut" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:777 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." -#: src/libslic3r/PrintConfig.cpp:522 +#: src/libslic3r/PrintConfig.cpp:554 msgid "Default extrusion width" msgstr "Largeur d'extrusion par défaut" -#: src/slic3r/GUI/Tab.cpp:937 +#: src/slic3r/GUI/Tab.cpp:987 msgid "default filament profile" msgstr "profil du filament par défaut" -#: src/libslic3r/PrintConfig.cpp:309 +#: src/libslic3r/PrintConfig.cpp:345 msgid "Default filament profile" msgstr "Profil de filament par défaut" -#: src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:346 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:2757 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:2919 +#, c-format msgid "Default preset (%s)" msgstr "Préréglage par défaut (%s)" -#: src/libslic3r/GCode/PreviewData.cpp:491 +#: 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:934 +#: src/slic3r/GUI/Tab.cpp:984 msgid "default print profile" msgstr "profil d'impression par défaut" -#: src/libslic3r/PrintConfig.cpp:316 +#: src/libslic3r/PrintConfig.cpp:352 msgid "Default print profile" msgstr "Profil de filament par défaut" -#: src/libslic3r/PrintConfig.cpp:317 src/libslic3r/PrintConfig.cpp:2341 -#: src/libslic3r/PrintConfig.cpp:2352 +#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592 +#: src/libslic3r/PrintConfig.cpp:2603 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:951 +#: src/slic3r/GUI/Tab.cpp:1001 msgid "default SLA material profile" msgstr "profil par défaut du matériau SLA" -#: src/libslic3r/PrintConfig.cpp:2340 src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602 msgid "Default SLA material profile" msgstr "Profil par défaut du matériau SLA" -#: src/slic3r/GUI/Tab.cpp:955 +#: src/slic3r/GUI/Tab.cpp:1005 msgid "default SLA print profile" msgstr "profil d'impression SLA par défaut" -#: src/slic3r/GUI/Field.cpp:105 +#: src/slic3r/GUI/Field.cpp:136 msgid "default value" msgstr "valeur par défaut" -#: src/slic3r/GUI/ConfigWizard.cpp:375 +#: src/slic3r/GUI/ConfigWizard.cpp:734 msgid "Define a custom printer profile" msgstr "Définissez un profil d'imprimante personnalisée" -#: src/libslic3r/PrintConfig.cpp:2558 +#: src/libslic3r/PrintConfig.cpp:2798 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:237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:346 msgid "degenerate facets" msgstr "faces défectueuses" -#: src/libslic3r/PrintConfig.cpp:608 +#: src/libslic3r/PrintConfig.cpp:640 msgid "Delay after unloading" msgstr "Délai après le déchargement" -#: src/slic3r/GUI/Tab.cpp:2935 +#: src/slic3r/GUI/Tab.cpp:3121 msgid "delete" msgstr "supprimer" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1257 src/slic3r/GUI/Plater.cpp:2891 -#: src/slic3r/GUI/Plater.cpp:2909 src/slic3r/GUI/Tab.cpp:2937 +#: 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 msgid "Delete" msgstr "Supprimer" -#: src/slic3r/GUI/MainFrame.cpp:449 +#: src/slic3r/GUI/MainFrame.cpp:575 msgid "Delete &all" msgstr "Tout eff&acer" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 -msgid "Delete All" -msgstr "Tout Supprimer" - -#: src/slic3r/GUI/Plater.cpp:3298 +#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129 +#: src/slic3r/GUI/Plater.cpp:4669 msgid "Delete all" msgstr "Tout Supprimer" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1806 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2176 msgid "Delete All Instances from Object" msgstr "Supprimer Toutes les Instances depuis l'Objet" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/DoubleSlider.cpp:1516 +msgid "Delete color change" +msgstr "Supprimer le changement de couleur" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 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/GUI_ObjectList.cpp:1898 +#: src/slic3r/GUI/DoubleSlider.cpp:1519 +msgid "Delete custom G-code" +msgstr "Supprimer le G-code personnalisé" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:539 +msgid "Delete drainage hole" +msgstr "Supprimer le trou de drainage" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2192 msgid "Delete Height Range" msgstr "Supprimer la Zone de Hauteur" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2246 msgid "Delete Instance" msgstr "Supprimer l'Instance" -#: src/slic3r/GUI/Plater.cpp:2592 +#: src/slic3r/GUI/Plater.cpp:2712 msgid "Delete Object" msgstr "Supprimer l'Objet" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:100 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 +#, c-format msgid "Delete Option %s" msgstr "Supprimer l'Option %s" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/DoubleSlider.cpp:1518 +msgid "Delete pause print" +msgstr "Supprimer la pause d'impression" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 msgid "Delete selected" msgstr "Supprimer la sélection" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2830 msgid "Delete Selected" msgstr "Supprimer la Sélection" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2303 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2693 msgid "Delete Selected Item" msgstr "Supprimer l'Item Sélectionné" -#: src/slic3r/GUI/Plater.cpp:4083 +#: src/slic3r/GUI/Plater.cpp:4677 msgid "Delete Selected Objects" msgstr "Supprimer les Objets Sélectionnés" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2152 msgid "Delete Settings" msgstr "Supprimer les Réglages" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1857 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2227 msgid "Delete Subobject" msgstr "Supprimer le sous-objet" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:720 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631 msgid "Delete support point" msgstr "Supprimer un point de support" -#: src/slic3r/GUI/Tab.cpp:131 +#: src/slic3r/GUI/Tab.cpp:134 msgid "Delete this preset" msgstr "Supprimer ce préréglage" -#: src/slic3r/GUI/MainFrame.cpp:449 +#: src/slic3r/GUI/DoubleSlider.cpp:1035 +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 +msgid "Delete tool change" +msgstr "Supprimer le changement d'outil" + +#: src/slic3r/GUI/MainFrame.cpp:576 msgid "Deletes all objects" msgstr "Supprimer tous les objets" -#: src/slic3r/GUI/MainFrame.cpp:447 +#: src/slic3r/GUI/MainFrame.cpp:573 msgid "Deletes the current selection" msgstr "Supprime la sélection en cours" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:2504 msgid "Density" msgstr "Densité" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:791 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:1200 src/slic3r/GUI/Tab.cpp:1584 -#: src/slic3r/GUI/Tab.cpp:1992 src/slic3r/GUI/Tab.cpp:2086 -#: src/slic3r/GUI/Tab.cpp:3336 src/slic3r/GUI/Tab.cpp:3445 +#: 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 msgid "Dependencies" msgstr "Dépendances" -#: src/libslic3r/PrintConfig.cpp:1542 src/libslic3r/PrintConfig.cpp:1543 +#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613 msgid "Deretraction Speed" msgstr "Vitesse de réinsertion" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +msgid "Deselect all" +msgstr "Désélectionner tout" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369 msgid "Deselect by rectangle" msgstr "Désélectionner par rectangle" -#: src/slic3r/GUI/MainFrame.cpp:492 +#: src/slic3r/GUI/MainFrame.cpp:569 msgid "Deselects all objects" msgstr "Désélectionner tous les objets" -#: src/libslic3r/PrintConfig.cpp:1304 +#: src/slic3r/GUI/Tab.cpp:963 +msgid "Detach from system preset" +msgstr "Détacher du préréglage système" + +#: src/slic3r/GUI/Tab.cpp:984 +msgid "Detach preset" +msgstr "Détacher le préréglage" + +#: src/slic3r/GUI/Tab.cpp:3029 +msgid "Detached" +msgstr "Détaché" + +#: src/libslic3r/PrintConfig.cpp:1373 msgid "Detect bridging perimeters" msgstr "Détecter les périmètres faisant des ponts" -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:2075 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:1986 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "Detect thin walls" msgstr "Détecter les parois fines" -#: src/libslic3r/PrintConfig.cpp:3083 +#: src/libslic3r/PrintConfig.cpp:3472 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." -#: src/slic3r/GUI/Plater.cpp:1713 +#: src/slic3r/GUI/Plater.cpp:2368 msgid "Detected advanced data" msgstr "Données avancées détectées" -#: src/slic3r/GUI/BedShapeDialog.cpp:88 src/libslic3r/PrintConfig.cpp:677 +#: src/slic3r/GUI/Mouse3DController.cpp:289 +msgid "Device:" +msgstr "Appareil :" + +#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709 msgid "Diameter" msgstr "Diamètre" -#: src/libslic3r/PrintConfig.cpp:2443 +#: src/libslic3r/PrintConfig.cpp:2694 msgid "Diameter in mm of the pillar base" msgstr "Diamètre en mm de la base du pilier" -#: src/libslic3r/PrintConfig.cpp:2399 +#: src/libslic3r/PrintConfig.cpp:2650 msgid "Diameter in mm of the support pillars" msgstr "Diamètre en mm des piliers de support" -#: src/libslic3r/PrintConfig.cpp:2371 +#: src/libslic3r/PrintConfig.cpp:2622 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:89 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 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:1569 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Direction" msgstr "Direction" -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:359 msgid "Disable fan for the first" msgstr "Désactiver le ventilateur pour le(s) première(s)" -#: src/libslic3r/PrintConfig.cpp:1280 +#: src/libslic3r/PrintConfig.cpp:1349 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/wxExtensions.cpp:2572 -msgid "Discard all color changes" -msgstr "Annuler tous les changements de couleur" +#: src/slic3r/GUI/DoubleSlider.cpp:952 +msgid "Discard all custom changes" +msgstr "Éliminer toutes les modifications personnalisées" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1241 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1375 msgid "Discard changes" msgstr "Annuler les modifications" -#: src/slic3r/GUI/Tab.cpp:2784 +#: 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/Gizmos/GLGizmoMove.cpp:177 -msgid "Displacement (mm)" -msgstr "Déplacement (mm)" - -#: src/slic3r/GUI/Tab.cpp:2041 +#: src/slic3r/GUI/Tab.cpp:2078 msgid "Display" msgstr "Afficher" -#: src/libslic3r/PrintConfig.cpp:2208 +#: src/libslic3r/PrintConfig.cpp:2359 msgid "Display height" msgstr "Hauteur de l'affichage" -#: src/libslic3r/PrintConfig.cpp:2319 +#: src/libslic3r/PrintConfig.cpp:2378 msgid "Display horizontal mirroring" msgstr "Afficher la symétrie horizontale" -#: src/libslic3r/PrintConfig.cpp:2227 +#: src/libslic3r/PrintConfig.cpp:2392 msgid "Display orientation" msgstr "Orientation de l'affichage" -#: src/slic3r/GUI/MainFrame.cpp:510 +#: src/slic3r/GUI/MainFrame.cpp:648 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:2326 +#: src/libslic3r/PrintConfig.cpp:2385 msgid "Display vertical mirroring" msgstr "Afficher la symétrie verticale" -#: src/libslic3r/PrintConfig.cpp:2202 +#: src/libslic3r/PrintConfig.cpp:2353 msgid "Display width" msgstr "Largeur de l'affichage" -#: src/libslic3r/PrintConfig.cpp:341 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Distance between copies" msgstr "Distance entre les copies" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1680 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:2752 +#: src/libslic3r/PrintConfig.cpp:2882 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:1609 +#: src/libslic3r/PrintConfig.cpp:1679 msgid "Distance from object" msgstr "Distance de l'objet" -#: src/slic3r/GUI/BedShapeDialog.cpp:80 +#: src/slic3r/GUI/BedShapeDialog.cpp:85 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:285 +#: src/libslic3r/PrintConfig.cpp:320 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:1338 +#: src/libslic3r/PrintConfig.cpp:1382 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:342 +#: src/libslic3r/PrintConfig.cpp:378 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:3097 +#: src/libslic3r/PrintConfig.cpp:3486 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:3041 +#: src/libslic3r/PrintConfig.cpp:3430 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:206 -#, 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/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/GUI_App.cpp:754 +#: src/slic3r/GUI/DoubleSlider.cpp:1920 +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 msgid "Do you want to proceed?" msgstr "Voulez-vous poursuivre?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1024 +#: src/slic3r/GUI/Plater.cpp:3321 +msgid "Do you want to retry" +msgstr "Voulez-vous réessayer" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1045 msgid "Do you want to save your manually edited support points?" msgstr "Voulez-vous sauvegarder vos points de support édités manuellement ?" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:1834 +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 +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 msgid "Don't arrange" msgstr "Ne pas agencer" -#: src/slic3r/GUI/UpdateDialogs.cpp:55 +#: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" msgstr "Ne plus me notifier au sujet des nouvelles publications" -#: src/libslic3r/PrintConfig.cpp:333 +#: src/libslic3r/PrintConfig.cpp:369 msgid "Don't support bridges" msgstr "Ne pas supporter les ponts" @@ -1724,316 +2098,426 @@ msgstr "Ne pas supporter les ponts" msgid "Downgrade" msgstr "Rétrograder" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1233 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1236 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1237 +#: src/libslic3r/PrintConfig.cpp:1695 +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 msgid "Drag" msgstr "Faites glisser" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:340 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:355 +#: src/libslic3r/SLAPrintSteps.cpp:44 +msgid "Drilling holes into model." +msgstr "Perçage de trous dans le modèle." + +#: src/libslic3r/SLAPrintSteps.cpp:199 +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 msgid "Drop to bed" msgstr "Déposer sur le lit" -#: src/libslic3r/PrintConfig.cpp:3044 +#: src/libslic3r/PrintConfig.cpp:3433 msgid "Duplicate" msgstr "Dupliquer" -#: src/libslic3r/PrintConfig.cpp:3049 +#: src/libslic3r/PrintConfig.cpp:3438 msgid "Duplicate by grid" msgstr "Dupliquer par grille" -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/slic3r/GUI/PresetHints.cpp:40 +msgid "During the other layers, fan" +msgstr "Pendant les autres couches, le ventilateur" + +#: src/libslic3r/PrintConfig.cpp:2669 msgid "Dynamic" msgstr "Dynamique" -#: src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/MainFrame.cpp:749 msgid "E&xport" msgstr "E&xporter" -#: src/slic3r/GUI/GUI_ObjectList.cpp:238 +#: src/slic3r/GUI/GUI_ObjectList.cpp:347 msgid "edges fixed" msgstr "arrêtes corrigées" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2690 +#: src/slic3r/GUI/DoubleSlider.cpp:1508 +msgid "Edit color" +msgstr "Éditer la couleur" + +#: src/slic3r/GUI/DoubleSlider.cpp:960 +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" + +#: src/slic3r/GUI/DoubleSlider.cpp:1510 +msgid "Edit custom G-code" +msgstr "Éditer un G-code personnalisé" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3003 msgid "Edit Height Range" msgstr "Éditer la Zone de Hauteur" -#: src/slic3r/GUI/GUI_ObjectList.cpp:373 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 +msgid "Edit pause print message" +msgstr "Modifier le message de pause d'impression" + +#: src/slic3r/GUI/DoubleSlider.cpp:1037 +msgid "Edit tick mark - Ctrl + Left click" +msgstr "Modifier la coche - Ctrl + Clic gauche" + +#: src/slic3r/GUI/DoubleSlider.cpp:1038 +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 msgid "Editing" msgstr "Édition" -#: src/libslic3r/PrintConfig.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:547 +msgid "Ejec&t SD card / Flash drive" +msgstr "Éjec&ter la carte SD / la clef USB" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Eject SD card / Flash drive" +msgstr "Éjecter la carte SD / la clef USB" + +#: src/slic3r/GUI/MainFrame.cpp:547 +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 +msgid "Ejecting of device %s(%s) has failed." +msgstr "L'éjection de l'appareil %s(%s) a échoué." + +#: src/libslic3r/PrintConfig.cpp:118 msgid "Elephant foot compensation" msgstr "Compensation de l'effet patte d'éléphant" -#: src/libslic3r/SLAPrint.cpp:681 -msgid "Elevation is too low for object. Use the \"Pad around obect\" feature to print the object without elevation." -msgstr "L'élévation est trop basse pour l'objet. Utilisez la fonction \"Socle autour de l'objet\" pour imprimer l'objet sans élévation." +#: src/libslic3r/PrintConfig.cpp:2447 +msgid "Elephant foot minimum width" +msgstr "Largeur minimum du pied d'éléphant" -#: src/libslic3r/SLAPrint.cpp:678 +#: src/libslic3r/SLAPrint.cpp:625 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:1044 +#: src/libslic3r/PrintConfig.cpp:1093 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/slic3r/GUI/Tab.cpp:1490 src/libslic3r/PrintConfig.cpp:1286 -#: src/libslic3r/PrintConfig.cpp:2099 +#: src/libslic3r/GCode.cpp:637 +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 msgid "Enable" msgstr "Activer" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:313 msgid "Enable auto cooling" msgstr "Activer le refroidissement automatique" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:572 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:2321 +#: src/libslic3r/PrintConfig.cpp:2908 +msgid "Enable hollowing" +msgstr "Activer l'évidement" + +#: src/libslic3r/PrintConfig.cpp:2380 msgid "Enable horizontal mirroring of output images" msgstr "Active la symétrie horizontale des images de sortie" -#: src/libslic3r/PrintConfig.cpp:1781 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Enable support material generation." msgstr "Activer la génération des supports." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:966 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:881 +#: src/libslic3r/PrintConfig.cpp:929 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:2085 +#: src/libslic3r/PrintConfig.cpp:2186 msgid "Enable variable layer height feature" msgstr "Activer la fonction de hauteur de couche variable" -#: src/libslic3r/PrintConfig.cpp:2328 +#: src/libslic3r/PrintConfig.cpp:2387 msgid "Enable vertical mirroring of output images" msgstr "Activer la symétrie verticale des images de sortie" -#: src/slic3r/GUI/Tab.cpp:1570 src/slic3r/GUI/Tab.cpp:1955 -#: src/libslic3r/PrintConfig.cpp:359 src/libslic3r/PrintConfig.cpp:369 +#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:1982 +#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 msgid "End G-code" msgstr "G-code de fin" -#: src/libslic3r/PrintConfig.cpp:1838 +#: src/libslic3r/PrintConfig.cpp:1924 msgid "Enforce support for the first" -msgstr "Forcer les supports sur le(s) première(s)" +msgstr "Générer des supports sur le(s) première(s)" -#: src/libslic3r/PrintConfig.cpp:1845 +#: src/libslic3r/PrintConfig.cpp:1931 msgid "Enforce support for the first n layers" -msgstr "Forcer le support pour les n premières couches" +msgstr "Générer des supports sur les n premières couches" -#: src/slic3r/GUI/PrintHostDialogs.cpp:197 -#: src/slic3r/GUI/PrintHostDialogs.cpp:228 +#: 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:380 +#: src/libslic3r/PrintConfig.cpp:407 msgid "Ensure vertical shell thickness" msgstr "S'assurer de l'épaisseur de la coque verticale" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 +#: src/slic3r/GUI/DoubleSlider.cpp:1618 +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 msgid "Enter new name" msgstr "Entrer de nouveaux noms" -#: src/slic3r/GUI/ConfigWizard.cpp:622 +#: src/slic3r/GUI/DoubleSlider.cpp:1634 +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 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:570 +#: src/slic3r/GUI/ConfigWizard.cpp:979 msgid "Enter the diameter of your filament." msgstr "Entrez le diamètre de votre filament." -#: src/slic3r/GUI/ConfigWizard.cpp:557 +#: src/slic3r/GUI/ConfigWizard.cpp:966 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/ConfigWizard.cpp:608 +#: src/slic3r/GUI/DoubleSlider.cpp:1650 +msgid "Enter the height you want to jump to" +msgstr "Entrez la hauteur à laquelle vous souhaitez sauter" + +#: src/slic3r/GUI/Plater.cpp:4751 +msgid "Enter the number of copies:" +msgstr "Saisissez le nombre de copies :" + +#: src/slic3r/GUI/ConfigWizard.cpp:1033 msgid "Enter the temperature needed for extruding your filament." msgstr "Entrez la température nécessaire pour extruder votre filament." -#: src/libslic3r/PrintConfig.cpp:718 +#: src/libslic3r/PrintConfig.cpp:761 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:686 +#: src/libslic3r/PrintConfig.cpp:718 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:678 +#: src/libslic3r/PrintConfig.cpp:710 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:636 src/slic3r/GUI/PrintHostDialogs.cpp:230 +#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:785 +#: src/slic3r/GUI/PrintHostDialogs.cpp:231 msgid "Error" msgstr "Erreur" -#: src/slic3r/GUI/FirmwareDialog.cpp:608 -#, possible-c-format +#: src/slic3r/GUI/FirmwareDialog.cpp:645 +#, c-format msgid "Error accessing port at %s: %s" msgstr "Erreur d'accès au port sur %s : %s" -#: src/slic3r/GUI/Plater.cpp:3593 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:3433 +msgid "Error during reload" +msgstr "Erreur lors du rechargement" + +#: src/slic3r/GUI/Plater.cpp:5043 +#, c-format msgid "Error exporting 3MF file %s" msgstr "Erreur d'export du fichier 3MF %s" -#: src/slic3r/GUI/Plater.cpp:3564 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:5005 +#, c-format msgid "Error exporting AMF file %s" msgstr "Erreur d'export du fichier AMF %s" -#: src/slic3r/GUI/PrintHostDialogs.cpp:153 +#: src/slic3r/GUI/PrintHostDialogs.cpp:154 msgid "Error Message" msgstr "Message d'erreur" -#: src/slic3r/GUI/PrintHostDialogs.cpp:271 +#: src/slic3r/GUI/AppConfig.cpp:114 +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." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:272 msgid "Error uploading to print host:" msgstr "Erreur lors du téléchargement vers l'hôte d'impression :" -#: src/libslic3r/Zipper.cpp:105 +#: src/libslic3r/Zipper.cpp:102 msgid "Error with zip archive" msgstr "Erreur liée à l'archive zip" -#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/GUI_ObjectList.cpp:1443 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1918 msgid "Error!" msgstr "Erreur!" -#: src/slic3r/GUI/BedShapeDialog.cpp:482 +#: src/slic3r/GUI/BedShapeDialog.cpp:505 msgid "Error! Invalid model" msgstr "Erreur ! Modèle invalide" -#: src/slic3r/GUI/FirmwareDialog.cpp:610 -#, possible-c-format +#: src/slic3r/GUI/FirmwareDialog.cpp:647 +#, c-format msgid "Error: %s" msgstr "Erreur : %s" -#: src/slic3r/GUI/Plater.cpp:1503 +#: src/slic3r/GUI/Job.hpp:123 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:217 src/slic3r/GUI/Plater.cpp:1028 -#: src/slic3r/GUI/Plater.cpp:1070 +#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1216 +#: src/slic3r/GUI/Plater.cpp:1258 msgid "Estimated printing time" msgstr "Temps d'impression estimé" -#: src/slic3r/GUI/Plater.cpp:424 +#: src/slic3r/GUI/Plater.cpp:502 msgid "Everywhere" msgstr "Partout" -#: src/slic3r/GUI/PresetHints.cpp:50 +#: src/slic3r/GUI/PresetHints.cpp:51 msgid "except for the first %1% layers." msgstr "sauf pour les %1% première couches." -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:53 msgid "except for the first layer." msgstr "sauf pour la première couche." -#: src/libslic3r/Print.cpp:1285 +#: src/libslic3r/Print.cpp:1377 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:148 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 +#, c-format msgid "Exit %s" msgstr "Sortir de %s" -#: src/libslic3r/PrintConfig.cpp:335 +#: src/libslic3r/PrintConfig.cpp:371 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:1306 +#: src/libslic3r/PrintConfig.cpp:1375 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:676 src/slic3r/GUI/wxExtensions.cpp:2461 +#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755 msgid "Expert" msgstr "Expert" -#: src/slic3r/GUI/GUI_App.cpp:676 +#: src/slic3r/GUI/ConfigWizard.cpp:822 +msgid "Expert mode" +msgstr "Mode expert" + +#: src/slic3r/GUI/GUI_App.cpp:815 msgid "Expert View Mode" msgstr "Mode de Vue Expert" -#: src/slic3r/GUI/MainFrame.cpp:602 src/slic3r/GUI/Plater.cpp:3821 +#: src/slic3r/GUI/Plater.cpp:5521 msgid "Export" msgstr "Exporter" -#: src/slic3r/GUI/MainFrame.cpp:373 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export &Config" msgstr "Exporter la &Configuration" -#: src/slic3r/GUI/MainFrame.cpp:362 src/slic3r/GUI/MainFrame.cpp:602 +#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:749 msgid "Export &G-code" msgstr "Exporter le &G-code" -#: src/slic3r/GUI/MainFrame.cpp:488 +#: src/slic3r/GUI/MainFrame.cpp:496 msgid "Export &toolpaths as OBJ" -msgstr "Exporter les parcours en tant que OBJ" +msgstr "Exporter les parcours en &tant que OBJ" -#: src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Export 3MF" msgstr "Exporter 3MF" -#: src/slic3r/GUI/MainFrame.cpp:375 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export all presets to file" msgstr "Exporter tous les préréglage vers un fichier" -#: src/libslic3r/PrintConfig.cpp:2954 +#: src/libslic3r/PrintConfig.cpp:3343 msgid "Export AMF" msgstr "Exporter AMF" -#: src/slic3r/GUI/Plater.cpp:1932 +#: src/slic3r/GUI/Plater.cpp:2598 msgid "Export AMF file:" msgstr "Exporter le fichier AMF :" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1219 src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1657 src/slic3r/GUI/Plater.cpp:3966 msgid "Export as STL" msgstr "Exporter en tant que STL" -#: src/slic3r/GUI/MainFrame.cpp:375 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +msgid "Export config" +msgstr "Exporter la configuration" + +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export Config &Bundle" msgstr "Exporter le &Lot de Configuration" -#: src/slic3r/GUI/MainFrame.cpp:373 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export current configuration to file" msgstr "Exporter la configuration actuelle vers un fichier" -#: src/slic3r/GUI/MainFrame.cpp:370 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export current plate as AMF" msgstr "Exporter le plateau courant en AMF" -#: src/slic3r/GUI/MainFrame.cpp:362 +#: src/slic3r/GUI/MainFrame.cpp:477 msgid "Export current plate as G-code" msgstr "Exporter le plateau courant en G-code" -#: src/slic3r/GUI/MainFrame.cpp:366 +#: src/slic3r/GUI/MainFrame.cpp:521 +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 msgid "Export current plate as STL" msgstr "Exporter le plateau courant en STL" -#: src/slic3r/GUI/MainFrame.cpp:368 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export current plate as STL including supports" msgstr "Exporter le contenu du plateau en STL, supports inclus" -#: src/slic3r/GUI/Plater.cpp:2722 +#: src/slic3r/GUI/Plater.cpp:3664 msgid "Export failed" msgstr "L'export a échoué" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/Plater.cpp:733 -#: src/slic3r/GUI/Plater.cpp:3821 src/libslic3r/PrintConfig.cpp:2964 +#: src/slic3r/GUI/ConfigWizard.cpp:801 +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 msgid "Export G-code" msgstr "Exporter le G-code" -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/slic3r/GUI/MainFrame.cpp:521 +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 msgid "Export OBJ" msgstr "Exporter OBJ" -#: src/slic3r/GUI/Plater.cpp:2531 +#: src/slic3r/GUI/Plater.cpp:2610 msgid "Export OBJ file:" msgstr "Exporter le fichier OBJ :" @@ -2041,55 +2525,63 @@ 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:370 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export plate as &AMF" msgstr "Exporter le plateau en tant que &AMF" -#: src/slic3r/GUI/MainFrame.cpp:366 +#: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export plate as &STL" msgstr "Exporter le plateau en tant que &STL" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export plate as STL &including supports" msgstr "Exporter le plateau en STL en &incluant les supports" -#: src/libslic3r/PrintConfig.cpp:2943 +#: src/libslic3r/PrintConfig.cpp:3332 msgid "Export SLA" msgstr "Exporter SLA" -#: src/libslic3r/PrintConfig.cpp:2959 +#: src/slic3r/GUI/Preferences.cpp:72 +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 msgid "Export STL" msgstr "Exporter STL" -#: src/slic3r/GUI/Plater.cpp:1925 +#: src/slic3r/GUI/Plater.cpp:2591 msgid "Export STL file:" msgstr "Exporter le fichier STL :" -#: src/libslic3r/PrintConfig.cpp:2950 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "Export the model(s) as 3MF." msgstr "Exporter le(s) modèle(s) en tant que 3MF." -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3344 msgid "Export the model(s) as AMF." msgstr "Exporter le(s) modèle(s) en tant que AMF." -#: src/libslic3r/PrintConfig.cpp:2932 +#: src/libslic3r/PrintConfig.cpp:3321 msgid "Export the model(s) as OBJ." msgstr "Exporter le(s) modèle(s) en tant que OBJ." -#: src/libslic3r/PrintConfig.cpp:2960 +#: src/libslic3r/PrintConfig.cpp:3349 msgid "Export the model(s) as STL." msgstr "Exporter le(s) modèle(s) en tant que STL." -#: src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/Plater.cpp:3966 msgid "Export the selected object as STL file" msgstr "Exporter l'objet sélectionné en tant que fichier STL" -#: src/slic3r/GUI/MainFrame.cpp:488 +#: src/slic3r/GUI/Plater.cpp:880 +msgid "Export to SD card / Flash drive" +msgstr "Exporter vers une carte SD / une clé USB" + +#: src/slic3r/GUI/MainFrame.cpp:496 msgid "Export toolpaths as OBJ" msgstr "Exporter le parcours en tant que OBJ" -#: src/libslic3r/Print.cpp:1517 +#: src/libslic3r/Print.cpp:1638 msgid "Exporting G-code" msgstr "Exportation du G-code" @@ -2102,139 +2594,143 @@ msgstr "Exportation du modèle ..." msgid "Exporting source model" msgstr "Exportation du modèle source" -#: src/libslic3r/SLAPrint.cpp:700 +#: src/libslic3r/SLAPrint.cpp:646 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:3306 +#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:3515 msgid "Exposure" msgstr "Exposition" -#: src/libslic3r/PrintConfig.cpp:2310 src/libslic3r/PrintConfig.cpp:2311 +#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542 msgid "Exposure time" msgstr "Temps d'exposition" -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/GCode/PreviewData.cpp:164 +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311 msgid "External perimeter" msgstr "Périmètre externe" -#: src/slic3r/GUI/PresetHints.cpp:153 +#: src/slic3r/GUI/PresetHints.cpp:156 msgid "external perimeters" msgstr "périmètres externes" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:425 +#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457 msgid "External perimeters" msgstr "Périmètres externes" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:469 msgid "External perimeters first" msgstr "Périmètres externes en premier" -#: src/libslic3r/PrintConfig.cpp:1518 src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596 msgid "Extra length on restart" msgstr "Longueur supplémentaire à la reprise" -#: src/libslic3r/PrintConfig.cpp:1321 +#: src/libslic3r/PrintConfig.cpp:1390 msgid "Extra loading distance" msgstr "Distance de chargement supplémentaire" -#: src/libslic3r/PrintConfig.cpp:445 +#: src/libslic3r/PrintConfig.cpp:477 msgid "Extra perimeters if needed" msgstr "Périmètres supplémentaires si nécessaire" -#: src/slic3r/GUI/GUI_ObjectList.cpp:335 src/slic3r/GUI/Tab.cpp:1479 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1434 +#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487 msgid "Extruder" msgstr "Extrudeur" -#: src/slic3r/GUI/Tab.cpp:2253 src/libslic3r/GCode/PreviewData.cpp:475 -#, possible-c-format +#: 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 msgid "Extruder %d" msgstr "Extrudeur %d" -#: src/slic3r/GUI/ConfigWizard.cpp:592 +#: src/slic3r/GUI/DoubleSlider.cpp:1011 +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:226 +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" msgstr "Extrudeur changé à" -#: src/slic3r/GUI/Tab.cpp:1171 +#: src/slic3r/GUI/Tab.cpp:1233 msgid "Extruder clearance (mm)" msgstr "Dégagement de l'extrudeur (mm)" -#: src/libslic3r/PrintConfig.cpp:490 +#: src/libslic3r/PrintConfig.cpp:522 msgid "Extruder Color" msgstr "Couleur de l'extrudeur" -#: src/libslic3r/PrintConfig.cpp:497 +#: src/libslic3r/PrintConfig.cpp:529 msgid "Extruder offset" msgstr "Décalage de l'extrudeur" -#: src/libslic3r/PrintConfig.cpp:863 +#: 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:1978 +#: 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:33 src/slic3r/GUI/GUI_ObjectList.cpp:72 -#: src/slic3r/GUI/GUI_ObjectList.cpp:513 src/slic3r/GUI/Tab.cpp:1119 -#: src/slic3r/GUI/Tab.cpp:1844 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:954 src/libslic3r/PrintConfig.cpp:1340 -#: src/libslic3r/PrintConfig.cpp:1668 src/libslic3r/PrintConfig.cpp:1852 -#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:2151 -#: src/libslic3r/PrintConfig.cpp:2159 +#: 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 msgid "Extruders" msgstr "Extrudeurs" -#: src/libslic3r/PrintConfig.cpp:507 +#: src/libslic3r/PrintConfig.cpp:539 msgid "Extrusion axis" msgstr "Axe d'extrusion" -#: src/libslic3r/PrintConfig.cpp:513 +#: src/libslic3r/PrintConfig.cpp:545 msgid "Extrusion multiplier" msgstr "Multiplicateur d'extrusion" -#: src/slic3r/GUI/ConfigWizard.cpp:612 +#: src/slic3r/GUI/ConfigWizard.cpp:1037 msgid "Extrusion Temperature:" msgstr "Température d'Extrusion :" -#: src/slic3r/GUI/Tab.cpp:1143 +#: src/slic3r/GUI/Tab.cpp:1205 msgid "Extrusion width" msgstr "Largeur d'extrusion" -#: src/slic3r/GUI/GUI_ObjectList.cpp:73 src/slic3r/GUI/GUI_ObjectList.cpp:514 -#: src/libslic3r/PrintConfig.cpp:416 src/libslic3r/PrintConfig.cpp:523 -#: src/libslic3r/PrintConfig.cpp:830 src/libslic3r/PrintConfig.cpp:962 -#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1688 -#: src/libslic3r/PrintConfig.cpp:1861 src/libslic3r/PrintConfig.cpp:2018 +#: 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 msgid "Extrusion Width" msgstr "Largeur d'Extrusion" -#: src/slic3r/GUI/Plater.cpp:139 +#: src/slic3r/GUI/Plater.cpp:162 msgid "Facets" msgstr "Faces" -#: src/slic3r/GUI/GUI_ObjectList.cpp:240 +#: src/slic3r/GUI/GUI_ObjectList.cpp:349 msgid "facets added" msgstr "faces ajoutées" -#: src/slic3r/GUI/GUI_ObjectList.cpp:239 +#: src/slic3r/GUI/GUI_ObjectList.cpp:348 msgid "facets removed" msgstr "faces supprimées" -#: src/slic3r/GUI/GUI_ObjectList.cpp:241 +#: src/slic3r/GUI/GUI_ObjectList.cpp:350 msgid "facets reversed" msgstr "faces inversées" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2517 msgid "Faded layers" msgstr "Couches estompées" -#: src/libslic3r/Zipper.cpp:47 +#: src/libslic3r/Zipper.cpp:44 msgid "failed finding central directory" msgstr "impossible de trouver le répertoire central" @@ -2242,165 +2738,181 @@ 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:65 +#: src/libslic3r/PrintBase.cpp:71 msgid "Failed processing of the output_filename_format template." msgstr "Échec du traitement du modèle output_filename_format." -#: src/slic3r/GUI/PresetHints.cpp:41 +#: src/slic3r/GUI/PresetHints.cpp:42 msgid "Fan" msgstr "Ventilateur" -#: src/slic3r/GUI/Tab.cpp:1501 +#: src/slic3r/GUI/Tab.cpp:1456 msgid "Fan settings" msgstr "Réglages du ventilateur" -#: src/slic3r/GUI/Tab.cpp:1502 +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1457 msgid "Fan speed" msgstr "Vitesse du ventilateur" -#: src/libslic3r/PrintConfig.cpp:2240 +#: src/libslic3r/GCode/PreviewData.cpp:353 +msgid "Fan Speed (%)" +msgstr "Vitesse du ventilateur (%)" + +#: src/libslic3r/PrintConfig.cpp:2405 msgid "Fast" msgstr "Rapide" -#: src/libslic3r/PrintConfig.cpp:2241 +#: src/libslic3r/PrintConfig.cpp:2406 msgid "Fast tilt" msgstr "Inclinaison rapide" -#: src/slic3r/GUI/GUI_App.cpp:135 +#: src/slic3r/GUI/GUI_App.cpp:141 msgid "Fatal error" msgstr "Erreur fatale" -#: src/slic3r/GUI/GUI_Preview.cpp:212 src/slic3r/GUI/GUI_Preview.cpp:537 -#: src/libslic3r/GCode/PreviewData.cpp:394 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/GUI_Preview.cpp:575 +#: src/libslic3r/GCode/PreviewData.cpp:345 msgid "Feature type" msgstr "Type de fonctionnalité" -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:225 +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235 msgid "Feature types" msgstr "Types de fonctionnalité" -#: src/slic3r/GUI/Plater.cpp:682 src/slic3r/GUI/Tab.cpp:1470 -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/ConfigWizard.cpp:1525 +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 msgid "Filament" msgstr "Filament" -#: src/slic3r/GUI/Preset.cpp:1275 +#: src/slic3r/GUI/Preset.cpp:1522 msgid "filament" msgstr "filament" -#: src/slic3r/GUI/ConfigWizard.cpp:541 +#: src/slic3r/GUI/ConfigWizard.cpp:952 msgid "Filament and Nozzle Diameters" msgstr "Diamètres du Filament et de la Buse" -#: src/slic3r/GUI/ConfigWizard.cpp:574 +#: src/slic3r/GUI/ConfigWizard.cpp:983 msgid "Filament Diameter:" msgstr "Diamètre du Filament :" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:651 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:654 +#: src/libslic3r/PrintConfig.cpp:686 msgid "Filament load time" msgstr "Temps de chargement du filament" -#: src/libslic3r/PrintConfig.cpp:556 +#: src/libslic3r/PrintConfig.cpp:588 msgid "Filament notes" msgstr "Notes du filament" -#: src/slic3r/GUI/Tab.cpp:1502 src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1378 msgid "Filament Overrides" msgstr "Annulations de Filament" -#: src/libslic3r/PrintConfig.cpp:1312 +#: src/libslic3r/PrintConfig.cpp:1381 msgid "Filament parking position" msgstr "Position d'attente du filament" -#: src/slic3r/GUI/Tab.cpp:1516 +#: src/slic3r/GUI/ConfigWizard.cpp:2013 +msgid "Filament Profiles Selection" +msgstr "Sélection des Profils de Filament" + +#: src/slic3r/GUI/Tab.cpp:1471 msgid "Filament properties" msgstr "Propriétés du filament" -#: src/slic3r/GUI/Tab.hpp:335 +#: src/slic3r/GUI/Tab.hpp:355 msgid "Filament Settings" msgstr "Réglages du filament" -#: src/libslic3r/PrintConfig.cpp:694 +#: src/libslic3r/PrintConfig.cpp:726 msgid "Filament type" msgstr "Type de filament" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:701 msgid "Filament unload time" msgstr "Temps de déchargement du filament" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "filaments" msgstr "filaments" -#: src/libslic3r/Zipper.cpp:75 +#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2013 +msgid "Filaments" +msgstr "Filaments" + +#: src/libslic3r/Zipper.cpp:72 msgid "file close failed" msgstr "échec de la fermeture du fichier" -#: src/libslic3r/Zipper.cpp:69 +#: src/libslic3r/Zipper.cpp:66 msgid "file create failed" msgstr "échec de création du fichier" -#: src/slic3r/GUI/MainFrame.cpp:642 +#: src/slic3r/GUI/MainFrame.cpp:791 msgid "File Not Found" msgstr "Fichier non trouvé" -#: src/libslic3r/Zipper.cpp:89 +#: src/libslic3r/Zipper.cpp:86 msgid "file not found" msgstr "fichier non trouvé" -#: src/libslic3r/Zipper.cpp:67 +#: src/libslic3r/Zipper.cpp:64 msgid "file open failed" msgstr "échec de l'ouverture du fichier" -#: src/libslic3r/Zipper.cpp:73 +#: src/libslic3r/Zipper.cpp:70 msgid "file read failed" msgstr "échec de lecture du fichier" -#: src/libslic3r/Zipper.cpp:77 +#: src/libslic3r/Zipper.cpp:74 msgid "file seek failed" msgstr "impossible de trouver le fichier" -#: src/libslic3r/Zipper.cpp:79 +#: src/libslic3r/Zipper.cpp:76 msgid "file stat failed" msgstr "impossible d'établir des statistiques pour ce fichier" -#: src/libslic3r/Zipper.cpp:39 +#: src/libslic3r/Zipper.cpp:36 msgid "file too large" msgstr "fichier trop volumineux" -#: src/libslic3r/Zipper.cpp:71 +#: src/libslic3r/Zipper.cpp:68 msgid "file write failed" msgstr "échec d'écriture du fichier" -#: src/slic3r/GUI/PrintHostDialogs.cpp:152 +#: src/slic3r/GUI/PrintHostDialogs.cpp:153 msgid "Filename" msgstr "Nom de fichier" -#: src/libslic3r/PrintConfig.cpp:728 +#: src/libslic3r/PrintConfig.cpp:775 msgid "Fill angle" msgstr "Angle du remplissage" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:789 msgid "Fill density" msgstr "Densité de remplissage" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:826 msgid "Fill pattern" msgstr "Motif de remplissage" -#: src/libslic3r/PrintConfig.cpp:410 +#: src/libslic3r/PrintConfig.cpp:437 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:781 +#: src/libslic3r/PrintConfig.cpp:828 msgid "Fill pattern for general low-density infill." msgstr "Motif pour les remplissages de faible densité." -#: src/libslic3r/PrintConfig.cpp:390 +#: src/libslic3r/PrintConfig.cpp:417 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." @@ -2408,364 +2920,477 @@ msgstr "Motif pour les remplissages pour le remplissage du haut. Ceci affecte se msgid "Finished" msgstr "Terminé" -#: src/slic3r/GUI/ConfigWizard.cpp:486 src/slic3r/GUI/Tab.cpp:1920 +#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1947 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/FirmwareDialog.cpp:740 +#: src/slic3r/GUI/FirmwareDialog.cpp:777 msgid "Firmware flasher" msgstr "Outil de flash du firmware" -#: src/slic3r/GUI/FirmwareDialog.cpp:765 +#: src/slic3r/GUI/FirmwareDialog.cpp:802 msgid "Firmware image:" msgstr "Image du firmware :" -#: src/slic3r/GUI/Tab.cpp:2431 +#: src/slic3r/GUI/Tab.cpp:2577 msgid "Firmware Retraction" msgstr "Rétraction du Firmware" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:891 msgid "Firmware Type" msgstr "Type de Firmware" -#: src/libslic3r/PrintConfig.cpp:812 src/libslic3r/PrintConfig.cpp:821 -#: src/libslic3r/PrintConfig.cpp:829 src/libslic3r/PrintConfig.cpp:862 +#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868 +#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910 msgid "First layer" msgstr "Première couche" -#: src/libslic3r/PrintConfig.cpp:841 +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889 msgid "First layer height" msgstr "Hauteur de la première couche" -#: src/libslic3r/Print.cpp:1328 +#: src/libslic3r/Print.cpp:1422 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:852 +#: src/libslic3r/PrintConfig.cpp:900 msgid "First layer speed" msgstr "Vitesse de la première couche" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "First layer volumetric" msgstr "Volume de la première couche" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1210 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 msgid "Fix through the Netfabb" msgstr "Corriger avec Netfabb" -#: src/slic3r/GUI/Plater.cpp:3072 +#: src/slic3r/GUI/Plater.cpp:3473 msgid "Fix Throught NetFabb" msgstr "Corriger Avec NetFabb" -#: src/slic3r/GUI/GUI_App.cpp:685 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Flash printer &firmware" msgstr "Flasher le &firmware de l'imprimante" -#: src/slic3r/GUI/FirmwareDialog.cpp:146 +#: src/slic3r/GUI/FirmwareDialog.cpp:150 msgid "Flash!" msgstr "Flash !" -#: src/slic3r/GUI/FirmwareDialog.cpp:275 +#: src/slic3r/GUI/FirmwareDialog.cpp:284 msgid "Flashing cancelled." msgstr "Processus de flash annulé." -#: src/slic3r/GUI/FirmwareDialog.cpp:192 +#: src/slic3r/GUI/FirmwareDialog.cpp:199 msgid "Flashing failed" msgstr "Échec du processus de flash" -#: src/slic3r/GUI/FirmwareDialog.cpp:274 +#: src/slic3r/GUI/FirmwareDialog.cpp:283 msgid "Flashing failed. Please see the avrdude log below." msgstr "Le processus de flash a échoué. Veuillez consulter le journal avrdude ci-dessous." -#: src/slic3r/GUI/FirmwareDialog.cpp:148 +#: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flashing in progress. Please do not disconnect the printer!" msgstr "Processus de flash en cours. Veuillez ne pas déconnecter l'imprimante !" -#: src/slic3r/GUI/FirmwareDialog.cpp:273 +#: src/slic3r/GUI/FirmwareDialog.cpp:282 msgid "Flashing succeeded!" msgstr "Flash effectué avec succès !" -#: src/slic3r/GUI/Tab.cpp:1156 +#: src/slic3r/GUI/Tab.cpp:1218 msgid "Flow" msgstr "Flux" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:220 msgid "flow rate is maximized" msgstr "le débit est maximisé" -#: src/slic3r/GUI/UpdateDialogs.cpp:188 +#: src/slic3r/GUI/UpdateDialogs.cpp:286 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:435 src/slic3r/GUI/Plater.cpp:528 +#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Plater.cpp:624 msgid "For support enforcers only" msgstr "Seulement pour les générateur de supports" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3345 -msgid "for the left button: \tindicates a non-system (or non-default) preset,\nfor the right button: \tindicates 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/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/libslic3r/Print.cpp:1302 +#: 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/libslic3r/Print.cpp:1396 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\ndoivent ê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\n" +"doivent être synchronisées avec les couches de l'objet." -#: src/libslic3r/PrintConfig.cpp:1660 +#: src/libslic3r/PrintConfig.cpp:2864 +msgid "Force pad around object everywhere" +msgstr "Forcer le socle partout autour de l'objet" + +#: src/libslic3r/PrintConfig.cpp:1729 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:1023 +#: src/libslic3r/PrintConfig.cpp:1072 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." -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 msgid "From" msgstr "De" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1853 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2223 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:525 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front" msgstr "Avant" -#: src/slic3r/GUI/MainFrame.cpp:525 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front View" msgstr "Vue Avant" -#: src/slic3r/GUI/MainFrame.cpp:677 +#: src/slic3r/GUI/Tab.cpp:1013 +msgid "full profile name" +msgstr "nom de profil complet" + +#: src/slic3r/GUI/MainFrame.cpp:826 msgid "G-code" msgstr "G-code" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:87 +#: 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/BackgroundSlicingProcess.cpp:130 msgid "G-code file exported to %1%" msgstr "Fichier G-code exporté vers %1%" -#: src/libslic3r/PrintConfig.cpp:888 +#: src/libslic3r/PrintConfig.cpp:936 msgid "G-code flavor" msgstr "Version du G-code" -#: src/libslic3r/PrintConfig.cpp:689 +#: src/libslic3r/PrintConfig.cpp:721 msgid "g/cm³" msgstr "g/cm³" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/PrintConfig.cpp:870 -#: src/libslic3r/GCode/PreviewData.cpp:170 +#: src/libslic3r/PrintConfig.cpp:2505 +msgid "g/ml" +msgstr "g/ml" + +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/PrintConfig.cpp:918 msgid "Gap fill" msgstr "Remplissage des trous" -#: src/slic3r/GUI/Preferences.cpp:19 src/slic3r/GUI/Tab.cpp:1812 -#: src/slic3r/GUI/Tab.cpp:2013 +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1796 +#: src/slic3r/GUI/Tab.cpp:2040 msgid "General" msgstr "Général" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1307 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:1779 +#: src/libslic3r/PrintConfig.cpp:1865 msgid "Generate support material" msgstr "Générer des supports" -#: src/libslic3r/PrintConfig.cpp:1840 +#: src/libslic3r/PrintConfig.cpp:1926 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 de seuils d'inclinaison. Ceci est utile pour obtenir une meilleure adhésion pour des objets ayant une surface de contact très fine ou limitée sur le plateau." +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:2362 +#: src/libslic3r/PrintConfig.cpp:2613 msgid "Generate supports" msgstr "Générer des supports" -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2615 msgid "Generate supports for the models" msgstr "Générer des supports pour les modèles" -#: src/libslic3r/Print.cpp:1492 +#: src/libslic3r/Print.cpp:1614 msgid "Generating brim" msgstr "Génération de la bordure" -#: src/libslic3r/Print.cpp:1524 +#: src/libslic3r/Print.cpp:1642 msgid "Generating G-code" msgstr "Génération du G-code" -#: src/libslic3r/SLAPrint.cpp:58 +#: src/libslic3r/SLAPrintSteps.cpp:48 msgid "Generating pad" msgstr "Génération du socle" -#: src/libslic3r/PrintObject.cpp:141 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "Génération des périmètres" -#: src/libslic3r/Print.cpp:1484 +#: src/libslic3r/Print.cpp:1606 msgid "Generating skirt" msgstr "Génération de la jupe" -#: src/libslic3r/PrintObject.cpp:391 +#: src/libslic3r/PrintObject.cpp:395 msgid "Generating support material" msgstr "Génération des supports" -#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:809 +#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356 msgid "Generating support points" msgstr "Génération des points de support" -#: src/libslic3r/SLAPrint.cpp:57 +#: src/libslic3r/SLAPrintSteps.cpp:47 msgid "Generating support tree" msgstr "Génération de l'arbre de support" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2022 msgid "Generic" msgstr "Générique" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 msgid "Gizmo cut" msgstr "Couper le Gizmo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Gizmo move" msgstr "Déplacer le Gizmo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Gizmo Place face on bed" msgstr "Emplacement du Gizmo face au lit" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Gizmo rotate" msgstr "Pivoter le Gizmo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Gizmo scale" msgstr "Échelle du Gizmo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +msgid "Gizmo SLA hollow" +msgstr "Gizmo SLA évidé" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 msgid "Gizmo SLA support points" msgstr "Points de support SLA du Gizmo" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:641 +#: src/slic3r/GUI/GLCanvas3D.cpp:2921 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 msgid "Gizmo-Move" msgstr "Gizmo-Déplacement" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:569 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:489 msgid "Gizmo-Place on Face" msgstr "Gizmo-Positionner sur la surface" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:651 +#: src/slic3r/GUI/GLCanvas3D.cpp:3001 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:564 msgid "Gizmo-Rotate" msgstr "Gizmo-Rotation" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:646 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:563 msgid "Gizmo-Scale" msgstr "Gizmo-Échelle" -#: src/slic3r/GUI/AboutDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +msgid "Gizmos" +msgstr "Gizmos" + +#: src/slic3r/GUI/AboutDialog.cpp:259 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero Licence Publique Générale, version 3" -#: src/slic3r/GUI/ConfigWizard.cpp:571 +#: src/slic3r/GUI/ConfigWizard.cpp:980 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:797 +#: src/libslic3r/PrintConfig.cpp:844 msgid "Grid" msgstr "Grille" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1846 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2454 msgid "Group manipulation" msgstr "Manipulation d'un groupe" -#: src/libslic3r/PrintConfig.cpp:805 +#: src/slic3r/GUI/Preferences.cpp:133 +msgid "GUI" +msgstr "GUI" + +#: src/libslic3r/PrintConfig.cpp:852 msgid "Gyroid" msgstr "Gyroïde" -#: src/slic3r/GUI/Tab.cpp:2775 +#: 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:840 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 msgid "Head diameter" msgstr "Diamètre de la tête" -#: src/libslic3r/PrintConfig.cpp:822 +#: src/slic3r/GUI/ConfigManipulation.cpp:317 +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 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:213 src/libslic3r/PrintConfig.cpp:468 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500 msgid "Height" msgstr "Hauteur" -#: src/libslic3r/GCode/PreviewData.cpp:396 +#: src/libslic3r/GCode/PreviewData.cpp:347 msgid "Height (mm)" msgstr "Hauteur (mm)" -#: src/libslic3r/PrintConfig.cpp:1618 +#: src/libslic3r/PrintConfig.cpp:1688 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:2209 +#: src/libslic3r/PrintConfig.cpp:2360 msgid "Height of the display" msgstr "Hauteur de l'affichage" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1350 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1500 msgid "Height range Modifier" msgstr "Modificateur de la zone de hauteur" -#: src/slic3r/GUI/GLCanvas3D.cpp:3650 src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 msgid "Height ranges" msgstr "Zones de hauteur" -#: src/libslic3r/PrintConfig.cpp:226 +#: src/libslic3r/PrintConfig.cpp:261 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:300 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:433 +#, 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." -#: src/libslic3r/PrintConfig.cpp:2976 +#: src/libslic3r/PrintConfig.cpp:3365 msgid "Help" msgstr "Aide" -#: src/libslic3r/PrintConfig.cpp:2982 +#: src/libslic3r/PrintConfig.cpp:3371 msgid "Help (FFF options)" msgstr "Aide (options FFF)" -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3376 msgid "Help (SLA options)" msgstr "Aide (options SLA)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." msgstr "Ici vous pouvez ajuster le volume de purge nécessaire (mm³) pour une paire d'outils donnée." -#: src/libslic3r/PrintConfig.cpp:925 +#: src/libslic3r/PrintConfig.cpp:973 msgid "High extruder current on filament swap" msgstr "Courant de l'extrudeur élevé lors du changement de filament" -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:806 +#: src/slic3r/GUI/GLCanvas3D.cpp:277 +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 msgid "Hilbert Curve" msgstr "Courbe de Hilbert" -#: src/slic3r/GUI/Plater.cpp:873 +#: src/slic3r/GUI/Plater.cpp:1042 msgid "Hold Shift to Slice & Export G-code" msgstr "Maintenez la touche Majuscule pour Trancher et Exporter le G-code" -#: src/libslic3r/PrintConfig.cpp:803 src/libslic3r/PrintConfig.cpp:1924 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Hole depth" +msgstr "Profondeur du trou" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +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 +msgid "Hollow and drill" +msgstr "Évider et percer" + +#: src/libslic3r/PrintConfig.cpp:2910 +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 +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 +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 +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." + +#: src/libslic3r/SLAPrintSteps.cpp:43 +msgid "Hollowing model" +msgstr "Évidement du modèle" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:813 +msgid "Hollowing parameter change" +msgstr "Modification des paramètres d'évidement" + +#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011 msgid "Honeycomb" msgstr "Nid d'abeille" -#: src/slic3r/GUI/Tab.cpp:1013 +#: src/slic3r/GUI/Tab.cpp:1064 msgid "Horizontal shells" msgstr "Coques horizontales" -#: src/libslic3r/PrintConfig.cpp:209 +#: src/libslic3r/PrintConfig.cpp:245 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:151 +#: src/slic3r/GUI/PrintHostDialogs.cpp:152 msgid "Host" msgstr "L'Hôte" -#: src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Host Type" msgstr "Type d'hôte" @@ -2773,162 +3398,197 @@ msgstr "Type d'hôte" msgid "Hostname" msgstr "Nom d'hôte" -#: src/libslic3r/PrintConfig.cpp:81 +#: src/libslic3r/PrintConfig.cpp:97 msgid "Hostname, IP or URL" msgstr "Nom d'hôte, IP ou URL" -#: src/slic3r/GUI/Tab.cpp:136 -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/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/libslic3r/PrintConfig.cpp:2734 +#: src/libslic3r/PrintConfig.cpp:2812 +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 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:2380 +#: src/libslic3r/PrintConfig.cpp:2631 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:2642 +#: src/libslic3r/PrintConfig.cpp:2755 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:95 +#: src/libslic3r/PrintConfig.cpp:111 msgid "HTTPS CA File" msgstr "HTTPS CA Fichier" -#: src/slic3r/GUI/Tab.cpp:1731 +#: src/slic3r/GUI/Tab.cpp:1713 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/Tab.cpp:1773 -#, possible-c-format -msgid "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." -msgstr "Fichier HTTPS CA :\n\tDans ce système, %s utilise des certificats HTTPS issus du système Magasin de Certificats ou Trousseau.\n\tPour utiliser un fichier CA personnalisé, veuillez importer votre fichier CA dans le Magasin de Certificats / Trousseau." - -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:222 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:148 +#: src/slic3r/GUI/PrintHostDialogs.cpp:149 msgid "ID" msgstr "ID" -#: src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1873 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:413 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:773 +#, 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:423 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:783 +#, 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:1774 +#: src/libslic3r/PrintConfig.cpp:1852 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/Preferences.cpp:63 +#: 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/Preferences.cpp:74 +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 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:71 +#: src/slic3r/GUI/Preferences.cpp:82 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:105 +#: src/slic3r/GUI/Preferences.cpp:106 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/slic3r/GUI/Preferences.cpp:112 +#: src/libslic3r/PrintConfig.cpp:1696 +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 +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 +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 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:119 +#: src/slic3r/GUI/Preferences.cpp:145 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:28 +#: src/slic3r/GUI/PresetHints.cpp:29 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/libslic3r/PrintConfig.cpp:853 +#: src/slic3r/GUI/PresetHints.cpp:36 +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 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:540 +#: src/libslic3r/PrintConfig.cpp:573 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:1636 +#: src/libslic3r/PrintConfig.cpp:1706 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:534 +#: src/libslic3r/PrintConfig.cpp:567 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:46 +#: src/slic3r/GUI/Preferences.cpp:49 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:54 +#: src/slic3r/GUI/Preferences.cpp:57 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:38 +#: src/slic3r/GUI/Preferences.cpp:41 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:1492 +#: src/libslic3r/PrintConfig.cpp:1562 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:1501 +#: src/libslic3r/PrintConfig.cpp:1571 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:1510 +#: src/libslic3r/PrintConfig.cpp:1580 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:1384 +#: src/libslic3r/PrintConfig.cpp:1454 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:498 +#: src/libslic3r/PrintConfig.cpp:530 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:2068 +#: src/libslic3r/PrintConfig.cpp:2169 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:3096 +#: src/libslic3r/PrintConfig.cpp:3485 msgid "Ignore non-existent config files" msgstr "Ignorer les fichiers de configuration non-existants" -#: src/slic3r/GUI/MainFrame.cpp:352 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Import &Config" msgstr "Importer la &Configuration" -#: src/slic3r/GUI/MainFrame.cpp:357 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Import Config &Bundle" msgstr "Importer le &Lot de Configuration" -#: src/slic3r/GUI/MainFrame.cpp:354 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Import Config from &project" msgstr "Importer la Configuration depuis le &projet" -#: src/slic3r/GUI/Plater.cpp:4016 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +msgid "Import Config from ini/amf/3mf/gcode" +msgstr "Importer une Configuration depuis ini/amf/3mf/gcode" + +#: src/slic3r/GUI/Plater.cpp:4603 msgid "Import Object" msgstr "Importer l'Objet" -#: src/slic3r/GUI/Plater.cpp:4020 +#: src/slic3r/GUI/Plater.cpp:4607 msgid "Import Objects" msgstr "Importer les Objets" @@ -2936,439 +3596,496 @@ 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:349 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Importer STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "Importer STL/OBJ/AMF/3MF sans la configuration, garder le lit" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +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:2416 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectList.cpp:3422 +#, 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/UpdateDialogs.cpp:132 +#: src/slic3r/GUI/UpdateDialogs.cpp:230 msgid "Incompatible bundles:" msgstr "Lots incompatibles :" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 -#, possible-c-format +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#, c-format msgid "Incompatible with this %s" msgstr "Incompatible avec ce %s" -#: src/slic3r/GUI/Plater.cpp:4091 +#: src/slic3r/GUI/Plater.cpp:4685 msgid "Increase Instances" msgstr "Augmenter les Instances" +#: src/slic3r/GUI/GLCanvas3D.cpp:264 +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:3338 -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.\n\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)." +#: 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)." #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3334 +#: src/slic3r/GUI/Tab.cpp:3254 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:3083 -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/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/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:69 -#: src/slic3r/GUI/GUI_ObjectList.cpp:510 src/slic3r/GUI/Plater.cpp:439 -#: src/slic3r/GUI/Tab.cpp:1030 src/slic3r/GUI/Tab.cpp:1031 -#: src/slic3r/GUI/Tab.cpp:1360 src/libslic3r/PrintConfig.cpp:167 -#: src/libslic3r/PrintConfig.cpp:389 src/libslic3r/PrintConfig.cpp:729 -#: src/libslic3r/PrintConfig.cpp:743 src/libslic3r/PrintConfig.cpp:780 -#: src/libslic3r/PrintConfig.cpp:933 src/libslic3r/PrintConfig.cpp:943 -#: src/libslic3r/PrintConfig.cpp:961 src/libslic3r/PrintConfig.cpp:979 -#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1659 -#: src/libslic3r/PrintConfig.cpp:1676 +#: 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 msgid "Infill" msgstr "Remplissage" -#: src/slic3r/GUI/PresetHints.cpp:171 +#: src/slic3r/GUI/PresetHints.cpp:174 msgid "infill" msgstr "remplissage" -#: src/libslic3r/PrintConfig.cpp:972 +#: src/libslic3r/PrintConfig.cpp:1021 msgid "Infill before perimeters" msgstr "Remplissage avant les périmètres" -#: src/libslic3r/PrintConfig.cpp:953 +#: src/libslic3r/PrintConfig.cpp:1001 msgid "Infill extruder" msgstr "Extrudeur pour le remplissage" -#: src/libslic3r/PrintConfig.cpp:987 +#: src/libslic3r/PrintConfig.cpp:1036 msgid "Infill/perimeters overlap" msgstr "Chevauchement remplissage/périmètres" -#: src/libslic3r/Print.cpp:1476 +#: src/libslic3r/Print.cpp:1584 msgid "Infilling layers" msgstr "Remplissage des couches" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:118 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3430 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 src/slic3r/GUI/Plater.cpp:141 msgid "Info" msgstr "Info" -#: src/libslic3r/PrintConfig.cpp:1008 +#: src/libslic3r/PrintConfig.cpp:1057 msgid "Inherits profile" msgstr "Hérite du profil" -#: src/libslic3r/SLAPrint.cpp:707 +#: src/libslic3r/SLAPrint.cpp:653 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:2317 src/libslic3r/PrintConfig.cpp:2318 +#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565 msgid "Initial exposure time" msgstr "Temps d'exposition initial" -#: src/libslic3r/PrintConfig.cpp:2295 src/libslic3r/PrintConfig.cpp:2296 +#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483 msgid "Initial layer height" msgstr "Hauteur de couche initiale" -#: src/slic3r/GUI/Field.cpp:155 +#: src/slic3r/GUI/Field.cpp:204 msgid "Input value is out of range" msgstr "La valeur entrée est hors plage" -#: src/slic3r/GUI/GUI_App.cpp:661 +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "Inspect / activate configuration snapshots" msgstr "Inspecter / activer les instantanés de configuration" -#: src/slic3r/GUI/wxExtensions.cpp:407 src/slic3r/GUI/wxExtensions.cpp:474 -#, possible-c-format +#: src/slic3r/GUI/ObjectDataViewModel.cpp:60 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:216 +#, c-format msgid "Instance %d" msgstr "Instance %d" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1887 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2500 msgid "Instance manipulation" msgstr "Manipulation d'instance" -#: src/slic3r/GUI/wxExtensions.cpp:358 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:56 msgid "Instances" msgstr "Instances" -#: src/slic3r/GUI/GUI_ObjectList.cpp:934 src/slic3r/GUI/GUI_ObjectList.cpp:3346 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3781 msgid "Instances to Separated Objects" msgstr "Instances vers les Objets Séparés" -#: src/libslic3r/PrintConfig.cpp:1886 +#: src/libslic3r/PrintConfig.cpp:1973 msgid "Interface layers" msgstr "Couches d'interface" -#: src/libslic3r/PrintConfig.cpp:1870 +#: src/libslic3r/PrintConfig.cpp:1957 msgid "Interface loops" msgstr "Boucles d'interface" -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:1982 msgid "Interface pattern spacing" msgstr "Espacement du motif d'interface" -#: src/libslic3r/PrintConfig.cpp:1022 +#: src/libslic3r/PrintConfig.cpp:1071 msgid "Interface shells" msgstr "Coques d'interface" -#: src/libslic3r/Zipper.cpp:87 +#: src/libslic3r/Zipper.cpp:84 msgid "internal error" msgstr "erreur interne" -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/GCode/PreviewData.cpp:166 +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313 msgid "Internal infill" msgstr "Remplissage interne" -#: src/slic3r/GUI/Plater.cpp:2397 +#: src/slic3r/GUI/Plater.cpp:3106 msgid "Invalid data" msgstr "Donnée non valide" -#: src/slic3r/GUI/BedShapeDialog.cpp:471 src/slic3r/GUI/BedShapeDialog.cpp:520 -#: src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:566 msgid "Invalid file format." msgstr "Format de fichier non valide." -#: src/libslic3r/Zipper.cpp:83 +#: src/libslic3r/Zipper.cpp:80 msgid "invalid filename" msgstr "nom de fichier non valide" -#: src/libslic3r/Zipper.cpp:51 +#: src/slic3r/GUI/ConfigManipulation.cpp:319 +msgid "Invalid Head penetration" +msgstr "Pénétration de Tête invalide" + +#: src/libslic3r/Zipper.cpp:48 msgid "invalid header or archive is corrupted" msgstr "entête non valide ou archive corrompue" -#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/Field.cpp:173 +#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376 msgid "Invalid numeric input." msgstr "Entrée numérique non valide." -#: src/libslic3r/Zipper.cpp:81 +#: src/libslic3r/Zipper.cpp:78 msgid "invalid parameter" msgstr "paramètre non valide" +#: src/slic3r/GUI/ConfigManipulation.cpp:332 +msgid "Invalid pinhead diameter" +msgstr "Diamètre de tête d'épingle non valide" + #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:94 +#: src/slic3r/GUI/AboutDialog.cpp:258 msgid "is licensed under the" msgstr "est sous licence" -#: src/slic3r/GUI/Tab.cpp:2779 +#: 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:2778 +#: 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:519 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso" msgstr "Isométrique" -#: src/slic3r/GUI/MainFrame.cpp:519 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso View" msgstr "Vue Isométrique" -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:964 msgid "It can't be deleted or modified." msgstr "Il ne peut être supprimé ou modifié." -#: src/libslic3r/PrintConfig.cpp:926 +#: src/slic3r/GUI/Plater.cpp:3321 +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 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.cpp:142 src/slic3r/GUI/Tab.cpp:2796 +#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2958 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:2177 +#: src/slic3r/GUI/Tab.cpp:2229 msgid "Jerk limits" msgstr "Limites de mouvements brusques" -#: src/libslic3r/PrintConfig.cpp:1579 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Jitter" msgstr "Gigue" -#: src/libslic3r/PrintConfig.cpp:533 +#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529 +#: src/slic3r/GUI/DoubleSlider.cpp:1651 +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/libslic3r/PrintConfig.cpp:566 msgid "Keep fan always on" msgstr "Garder le ventilateur toujours actif" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 msgid "Keep lower part" msgstr "Garder la partie du bas" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:193 +#: src/slic3r/GUI/GLCanvas3D.cpp:304 +msgid "Keep min" +msgstr "Garder au minimum" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168 msgid "Keep upper part" msgstr "Garder la partie du haut" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:566 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:708 msgid "Keyboard Shortcuts" msgstr "Raccourcis Clavier" -#: src/libslic3r/PrintConfig.cpp:917 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +msgid "Keyboard shortcuts" +msgstr "Raccourcis clavier" + +#: src/libslic3r/PrintConfig.cpp:2498 +msgid "kg" +msgstr "kg" + +#: src/libslic3r/PrintConfig.cpp:965 msgid "Label objects" msgstr "Marquer les objets" -#: src/libslic3r/PrintConfig.cpp:2234 +#: src/libslic3r/PrintConfig.cpp:2399 msgid "Landscape" msgstr "Paysage" -#: src/slic3r/GUI/GUI_App.cpp:524 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Language" msgstr "Langue" -#: src/slic3r/GUI/GUI_App.cpp:755 +#: src/slic3r/GUI/GUI_App.cpp:885 msgid "Language selection" msgstr "Sélection de la langue" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1770 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2140 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2242 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:2994 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 msgid "Layer" msgstr "Couche" -#: src/slic3r/GUI/Tab.cpp:998 src/libslic3r/PrintConfig.cpp:55 +#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:71 msgid "Layer height" msgstr "Hauteur de couche" -#: src/libslic3r/Print.cpp:1332 +#: src/libslic3r/Print.cpp:1427 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:2260 +#: src/slic3r/GUI/Tab.cpp:2362 msgid "Layer height limits" msgstr "Limites de hauteur de couche" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2109 +#: src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "Layer height:" +msgstr "Hauteur de couche :" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2488 msgid "Layer range Settings to modify" msgstr "Réglages de zone de Couche à modifier" -#: src/libslic3r/PrintConfig.cpp:326 src/libslic3r/PrintConfig.cpp:946 -#: src/libslic3r/PrintConfig.cpp:1435 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1844 -#: src/libslic3r/PrintConfig.cpp:1889 +#: 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 msgid "layers" msgstr "couches" -#: src/slic3r/GUI/Tab.cpp:3302 src/slic3r/GUI/Tab.cpp:3393 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3512 +#: src/slic3r/GUI/Tab.cpp:3600 msgid "Layers" msgstr "Couches" -#: src/slic3r/GUI/Tab.cpp:997 src/slic3r/GUI/Tab.cpp:3391 +#: src/slic3r/GUI/Tab.cpp:1048 src/slic3r/GUI/Tab.cpp:3598 msgid "Layers and perimeters" msgstr "Couches et périmètres" -#: src/slic3r/GUI/GUI_ObjectList.cpp:28 src/slic3r/GUI/GUI_ObjectList.cpp:68 -#: src/slic3r/GUI/GUI_ObjectList.cpp:509 src/libslic3r/PrintConfig.cpp:56 -#: src/libslic3r/PrintConfig.cpp:150 src/libslic3r/PrintConfig.cpp:381 -#: src/libslic3r/PrintConfig.cpp:438 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1026 -#: src/libslic3r/PrintConfig.cpp:1305 src/libslic3r/PrintConfig.cpp:1371 -#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1987 -#: src/libslic3r/PrintConfig.cpp:2044 +#: 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 msgid "Layers and Perimeters" msgstr "Couches et Périmètres" -#: src/slic3r/GUI/GLCanvas3D.cpp:526 -msgid "Layers heights" -msgstr "Hauteurs des couches" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +msgid "Layers Slider" +msgstr "Barre de défilement des couches" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 -msgid "Layers Slider Shortcuts" -msgstr "Raccourcis du Curseur de Couches" - -#. TRN To be shown in Print Settings "Bottom solid layers" -#: rc/libslic3r/PrintConfig.cpp:149 +#: src/slic3r/GUI/OptionsGroup.cpp:258 msgctxt "Layers" msgid "Bottom" msgstr "Du bas" -#. TRN To be shown in Print Settings "Top solid layers" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/slic3r/GUI/OptionsGroup.cpp:258 msgctxt "Layers" msgid "Top" msgstr "Du haut" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left" msgstr "Gauche" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1234 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1235 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 msgid "Left click" msgstr "Clic gauche" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/GLCanvas3D.cpp:237 +msgid "Left mouse button:" +msgstr "Bouton gauche de souris :" + +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left View" msgstr "Vue Gauche" -#: src/slic3r/GUI/GUI_Preview.cpp:255 +#: src/slic3r/GUI/GUI_Preview.cpp:257 msgid "Legend" msgstr "Légende" -#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551 msgid "Length" msgstr "Longueur" -#: src/libslic3r/PrintConfig.cpp:293 +#: src/libslic3r/PrintConfig.cpp:328 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." #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:124 +#: src/slic3r/GUI/AboutDialog.cpp:129 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:1491 +#: src/libslic3r/PrintConfig.cpp:1561 msgid "Lift Z" msgstr "Levage de l'axe Z" -#: src/libslic3r/PrintConfig.cpp:801 +#: src/libslic3r/PrintConfig.cpp:848 msgid "Line" msgstr "Ligne" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1050 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1427 msgid "Load" msgstr "Charger" -#: src/slic3r/GUI/MainFrame.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Load a model" msgstr "Charger un modèle" -#: src/libslic3r/PrintConfig.cpp:3116 +#: src/libslic3r/PrintConfig.cpp:3505 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:3100 +#: src/libslic3r/PrintConfig.cpp:3489 msgid "Load config file" msgstr "Charger le fichier de configuration" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 -msgid "Load Config from .ini/amf/3mf/gcode" -msgstr "Charger la Configuration depuis .ini/amf/3mf/gcode" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +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/KBShortcutsDialog.cpp:110 -msgid "Load Config from .ini/amf/3mf/gcode and merge" -msgstr "Charger la Configuration depuis .ini/amf/3mf/gcode et fusionner" - -#: src/slic3r/GUI/MainFrame.cpp:354 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Load configuration from project file" msgstr "Charger la configuration depuis le fichier du projet" -#: src/libslic3r/PrintConfig.cpp:3101 +#: src/libslic3r/PrintConfig.cpp:3490 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:352 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Load exported configuration file" msgstr "Charger le fichier de configuration exporté" -#: src/slic3r/GUI/Plater.cpp:1271 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Load File" msgstr "Charger le Fichier" -#: src/slic3r/GUI/Plater.cpp:1275 +#: src/slic3r/GUI/Plater.cpp:1399 msgid "Load Files" msgstr "Charger les Fichiers" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1585 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1879 msgid "Load Part" msgstr "Charger une Partie" -#: src/slic3r/GUI/MainFrame.cpp:357 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Load presets from a bundle" msgstr "Charger les préréglages à partir d'un lot" -#: src/slic3r/GUI/Plater.cpp:3992 +#: src/slic3r/GUI/Plater.cpp:4575 msgid "Load Project" msgstr "Charger le Projet" -#: src/slic3r/GUI/BedShapeDialog.cpp:97 +#: src/slic3r/GUI/BedShapeDialog.cpp:102 msgid "Load shape from STL..." msgstr "Charger une forme depuis un STL..." -#: src/slic3r/GUI/BedShapeDialog.cpp:181 src/slic3r/GUI/BedShapeDialog.cpp:249 +#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261 msgid "Load..." msgstr "Charger..." -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" msgstr "chargé" -#: src/slic3r/GUI/Plater.cpp:1782 +#: src/slic3r/GUI/Plater.cpp:2426 msgid "Loaded" msgstr "Chargé" -#: src/slic3r/GUI/Plater.cpp:1590 +#: src/slic3r/GUI/Plater.cpp:2273 msgid "Loading" msgstr "Chargement" -#: src/slic3r/GUI/GUI_App.cpp:407 +#: src/slic3r/GUI/GUI_App.cpp:474 msgid "Loading of a mode view" msgstr "Chargement d'un mode de vue" -#: src/slic3r/GUI/GUI_App.cpp:399 +#: src/slic3r/GUI/GUI_App.cpp:466 msgid "Loading of current presets" msgstr "Chargement de préréglages actuels" @@ -3377,277 +4094,281 @@ msgstr "Chargement de préréglages actuels" msgid "Loading repaired model" msgstr "Chargement du modèle réparé" -#: src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:607 msgid "Loading speed" msgstr "Vitesse de chargement" -#: src/libslic3r/PrintConfig.cpp:583 +#: src/libslic3r/PrintConfig.cpp:615 msgid "Loading speed at the start" msgstr "Vitesse de chargement au départ" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:41 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106 msgid "Local coordinates" msgstr "Coordonnées locaux" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:851 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 msgid "Lock supports under new islands" msgstr "Verrouiller les supports sous de nouveaux îlots" -#: src/slic3r/GUI/Tab.cpp:3065 +#: src/slic3r/GUI/Tab.cpp:3252 msgid "LOCKED LOCK" -msgstr "VERROU VERROUILLE" +msgstr "CADENAS FERMÉ" -#: src/slic3r/GUI/Tab.cpp:3360 +#: src/slic3r/GUI/Tab.cpp:3280 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 VERROU VERROUILLE indique que les réglages sont les mêmes que les valeurs système (ou par défaut) pour le groupe d'options actuel" +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:3376 +#: src/slic3r/GUI/Tab.cpp:3296 msgid "LOCKED LOCK icon indicates that the value is the same as the system (or default) value." -msgstr "L'icône VERROU VERROUILLÉ indique que la valeur est la même que la valeur système (ou par défaut)." +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:3119 +#: src/libslic3r/PrintConfig.cpp:3508 msgid "Logging level" msgstr "Niveau d'enregistrement" -#: src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "Loops (minimum)" msgstr "Boucles (minimum)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Lower Layer" msgstr "Couche Inférieure" -#: src/slic3r/GUI/Tab.cpp:2136 src/slic3r/GUI/Tab.cpp:2209 -#: src/libslic3r/PrintConfig.cpp:1077 src/libslic3r/PrintConfig.cpp:1087 -#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1110 -#: src/libslic3r/PrintConfig.cpp:1121 src/libslic3r/PrintConfig.cpp:1132 -#: src/libslic3r/PrintConfig.cpp:1143 +#: 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 msgid "Machine limits" msgstr "Limites de la machine" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -msgid "Main Shortcuts" -msgstr "Principaux Raccourcis" - -#: src/slic3r/GUI/Plater.cpp:143 +#: src/slic3r/GUI/Plater.cpp:166 msgid "Manifold" msgstr "Variété" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:908 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 msgid "Manual editing" msgstr "Édition manuelle" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:105 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180 msgid "Masked SLA file exported to %1%" msgstr "Fichier SLA masqué exporté vers %1%" -#: src/slic3r/GUI/MainFrame.cpp:604 +#: src/slic3r/GUI/MainFrame.cpp:752 msgid "Mate&rial Settings Tab" msgstr "Onglet Réglage&s Matériau" -#: src/slic3r/GUI/Tab.cpp:3300 +#: src/slic3r/GUI/Tab.cpp:3478 src/slic3r/GUI/Tab.cpp:3480 msgid "Material" msgstr "Matériau" -#: src/slic3r/GUI/Tab.hpp:391 +#: src/slic3r/GUI/Tab.hpp:416 msgid "Material Settings" msgstr "Réglages Matériau" -#: src/slic3r/GUI/Plater.cpp:140 +#: src/slic3r/GUI/Plater.cpp:163 msgid "Materials" msgstr "Matériaux" -#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226 msgid "Max" msgstr "Maximum" -#: src/libslic3r/PrintConfig.cpp:2470 +#: src/libslic3r/PrintConfig.cpp:2734 msgid "Max bridge length" msgstr "Longueur maximum de pont" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "Nombre de ponts maximum par pilier" + +#: src/libslic3r/PrintConfig.cpp:2822 msgid "Max merge distance" msgstr "Distance maximum de fusion" -#: src/libslic3r/PrintConfig.cpp:2479 +#: src/libslic3r/PrintConfig.cpp:2743 msgid "Max pillar linking distance" msgstr "Distance maximum de jonction de pilier" -#: src/libslic3r/PrintConfig.cpp:64 +#: src/libslic3r/PrintConfig.cpp:80 msgid "Max print height" msgstr "Hauteur maximale d'impression" -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "Max print speed" msgstr "Vitesse d'impression maximale" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 -msgid "max slic3r version" -msgstr "version maximale de slic3r" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +msgid "max PrusaSlicer version" +msgstr "Version maximum de PrusaSlicer" -#: src/libslic3r/PrintConfig.cpp:1203 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "Max volumetric slope negative" msgstr "Pente volumétrique négative maximum" -#: src/libslic3r/PrintConfig.cpp:1192 +#: src/libslic3r/PrintConfig.cpp:1257 msgid "Max volumetric slope positive" msgstr "Pente volumétrique positive maximum" -#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247 msgid "Max volumetric speed" msgstr "Vitesse volumétrique maximale" -#: src/libslic3r/PrintConfig.cpp:2167 +#: src/libslic3r/PrintConfig.cpp:2268 msgid "Maximal bridging distance" msgstr "Distance maximale de pont" -#: src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2269 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:1099 +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Maximum acceleration E" msgstr "Accélérations maximum E" -#: src/libslic3r/PrintConfig.cpp:1105 +#: src/libslic3r/PrintConfig.cpp:1151 msgid "Maximum acceleration of the E axis" msgstr "Accélération maximum de l'axe E" -#: src/libslic3r/PrintConfig.cpp:1102 +#: src/libslic3r/PrintConfig.cpp:1148 msgid "Maximum acceleration of the X axis" msgstr "Accélération maximum de l'axe X" -#: src/libslic3r/PrintConfig.cpp:1103 +#: src/libslic3r/PrintConfig.cpp:1149 msgid "Maximum acceleration of the Y axis" msgstr "Accélération maximum de l'axe Y" -#: src/libslic3r/PrintConfig.cpp:1104 +#: src/libslic3r/PrintConfig.cpp:1150 msgid "Maximum acceleration of the Z axis" msgstr "Accélération maximum de l'axe Z" -#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133 +#: src/libslic3r/PrintConfig.cpp:1198 msgid "Maximum acceleration when extruding" msgstr "Accélération maximum lors de l'extrusion" -#: src/libslic3r/PrintConfig.cpp:1158 +#: src/libslic3r/PrintConfig.cpp:1200 msgid "Maximum acceleration when extruding (M204 S)" msgstr "Accélération maximum lors de l'extrusion (M204 S)" -#: src/libslic3r/PrintConfig.cpp:1142 src/libslic3r/PrintConfig.cpp:1144 +#: src/libslic3r/PrintConfig.cpp:1208 msgid "Maximum acceleration when retracting" msgstr "Accélération maximum lors de la rétraction" -#: src/libslic3r/PrintConfig.cpp:1169 +#: src/libslic3r/PrintConfig.cpp:1210 msgid "Maximum acceleration when retracting (M204 T)" msgstr "Accélération maximum lors de la rétraction (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1096 +#: src/libslic3r/PrintConfig.cpp:1142 msgid "Maximum acceleration X" msgstr "Accélérations maximum X" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1143 msgid "Maximum acceleration Y" msgstr "Accélérations maximum Y" -#: src/libslic3r/PrintConfig.cpp:1098 +#: src/libslic3r/PrintConfig.cpp:1144 msgid "Maximum acceleration Z" msgstr "Accélérations maximum Z" -#: src/slic3r/GUI/Tab.cpp:2170 +#: src/slic3r/GUI/Tab.cpp:2222 msgid "Maximum accelerations" msgstr "Accélérations maximum" -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534 msgid "Maximum exposure time" msgstr "Temps d'exposition maximum" -#: src/libslic3r/PrintConfig.cpp:1081 +#: src/libslic3r/PrintConfig.cpp:1128 msgid "Maximum feedrate E" -msgstr "Alimentation maximum E" +msgstr "Vitesse d'avance maximum en E" -#: src/libslic3r/PrintConfig.cpp:1087 +#: src/libslic3r/PrintConfig.cpp:1134 msgid "Maximum feedrate of the E axis" -msgstr "Alimentation maximum de l'axe E" +msgstr "Vitesse d'avance maximum de l'axe E" -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1131 msgid "Maximum feedrate of the X axis" -msgstr "Alimentation maximum de l'axe X" +msgstr "Vitesse d'avance maximum de l'axe X" -#: src/libslic3r/PrintConfig.cpp:1085 +#: src/libslic3r/PrintConfig.cpp:1132 msgid "Maximum feedrate of the Y axis" -msgstr "Alimentation maximum de l'axe Y" +msgstr "Vitesse d'avance maximum de l'axe Y" -#: src/libslic3r/PrintConfig.cpp:1086 +#: src/libslic3r/PrintConfig.cpp:1133 msgid "Maximum feedrate of the Z axis" -msgstr "Alimentation maximum de l'axe Z" +msgstr "Vitesse d'avance maximum de l'axe Z" -#: src/libslic3r/PrintConfig.cpp:1078 +#: src/libslic3r/PrintConfig.cpp:1125 msgid "Maximum feedrate X" -msgstr "Alimentation maximum X" +msgstr "Vitesse d'avance maximum en X" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Maximum feedrate Y" -msgstr "Alimentation maximum Y" +msgstr "Vitesse d'avance maximum en Y" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "Maximum feedrate Z" -msgstr "Alimentation maximum Z" +msgstr "Vitesse d'avance maximum en Z" -#: src/slic3r/GUI/Tab.cpp:2165 +#: src/slic3r/GUI/Tab.cpp:2217 msgid "Maximum feedrates" -msgstr "Alimentations maximum" +msgstr "Vitesses d'avance maximum" -#: src/libslic3r/PrintConfig.cpp:2447 src/libslic3r/PrintConfig.cpp:2448 +#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557 msgid "Maximum initial exposure time" msgstr "Temps d'exposition initiale Maximum" -#: src/libslic3r/PrintConfig.cpp:1117 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "Maximum jerk E" msgstr "Mouvement brusque maximum E" -#: src/libslic3r/PrintConfig.cpp:1123 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Maximum jerk of the E axis" msgstr "Mouvement brusque maximum de l'axe E" -#: src/libslic3r/PrintConfig.cpp:1120 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Maximum jerk of the X axis" msgstr "Mouvement brusque maximum de l'axe X" -#: src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "Maximum jerk of the Y axis" msgstr "Mouvement brusque maximum de l'axe Y" -#: src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1167 msgid "Maximum jerk of the Z axis" msgstr "Mouvement brusque maximum de l'axe Z" -#: src/libslic3r/PrintConfig.cpp:1114 +#: src/libslic3r/PrintConfig.cpp:1159 msgid "Maximum jerk X" msgstr "Mouvement brusque maximum X" -#: src/libslic3r/PrintConfig.cpp:1115 +#: src/libslic3r/PrintConfig.cpp:1160 msgid "Maximum jerk Y" msgstr "Mouvement brusque maximum Y" -#: src/libslic3r/PrintConfig.cpp:1116 +#: src/libslic3r/PrintConfig.cpp:1161 msgid "Maximum jerk Z" msgstr "Mouvement brusque maximum Z" -#: src/libslic3r/PrintConfig.cpp:566 +#: src/libslic3r/PrintConfig.cpp:2660 +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 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:3053 +#: src/libslic3r/PrintConfig.cpp:3442 msgid "Merge" msgstr "Fusionner" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2683 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/SLAPrint.cpp:71 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Merging slices and calculating statistics" msgstr "Fusion des tranches et calcul des statistiques" @@ -3655,207 +4376,256 @@ msgstr "Fusion des tranches et calcul des statistiques" msgid "Mesh repair failed." msgstr "Échec de la réparation du maillage." -#: src/libslic3r/PrintConfig.cpp:3120 -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" -msgstr "Les messages avec une sévérité inférieure ou égale au loglevel seront imprimés. 0 : identification, 1 : débogage, 3 : avertissement , 4 : erreur, 5 : fatal" +#: src/slic3r/GUI/DoubleSlider.cpp:1635 +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:1215 src/libslic3r/PrintConfig.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289 msgid "Min" msgstr "Minimum" -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1298 msgid "Min print speed" msgstr "Vitesse d'impression minimale" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 -msgid "min slic3r version" -msgstr "version minimale de slic3r" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "min PrusaSlicer version" +msgstr "Version minimum de PrusaSlicer" -#: src/libslic3r/PrintConfig.cpp:2507 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Minimal distance of the support points" msgstr "Distance minimale des points de support" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1306 msgid "Minimal filament extrusion length" msgstr "Longueur minimale d'extrusion de filament" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:879 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 msgid "Minimal points distance" msgstr "Distance minimale des points" -#: src/libslic3r/PrintConfig.cpp:635 +#: src/libslic3r/PrintConfig.cpp:667 msgid "Minimal purge on wipe tower" msgstr "Purge minimale sur la tour de nettoyage" -#: src/libslic3r/PrintConfig.cpp:1442 +#: src/libslic3r/PrintConfig.cpp:187 +msgid "Minimum bottom shell thickness" +msgstr "Épaisseur minimale de la coque inférieure" + +#: src/slic3r/GUI/PresetHints.cpp:339 +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 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:2416 src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526 msgid "Minimum exposure time" msgstr "Temps d'exposition minimum" -#: src/libslic3r/PrintConfig.cpp:1109 src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1178 msgid "Minimum feedrate when extruding" -msgstr "Alimentation minimum lors de l'extrusion" +msgstr "Vitesse d'avance minimum lors de l'extrusion" -#: src/libslic3r/PrintConfig.cpp:1136 +#: src/libslic3r/PrintConfig.cpp:1180 msgid "Minimum feedrate when extruding (M205 S)" -msgstr "Alimentation minimum lors de l'extrusion (M205 S)" +msgstr "Vitesse d'avance minimum lors de l'extrusion (M205 S)" -#: src/slic3r/GUI/Tab.cpp:2182 +#: src/slic3r/GUI/Tab.cpp:2234 msgid "Minimum feedrates" -msgstr "Alimentations minimum" +msgstr "Vitesses d'avance minimum" -#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549 msgid "Minimum initial exposure time" msgstr "Temps d'exposition initiale minimum" -#: src/libslic3r/PrintConfig.cpp:1452 +#: src/slic3r/GUI/Tab.cpp:1069 +msgid "Minimum shell thickness" +msgstr "Épaisseur de coque minimale" + +#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788 +msgid "Minimum thickness of a top / bottom shell" +msgstr "Épaisseur minimale d'une coque supérieure/inférieure" + +#: src/libslic3r/PrintConfig.cpp:2146 +msgid "Minimum top shell thickness" +msgstr "Épaisseur minimale de la coque supérieure" + +#: src/slic3r/GUI/PresetHints.cpp:320 +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 msgid "Minimum travel after retraction" msgstr "Trajet minimal après une rétraction" -#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "Minimum travel feedrate" -msgstr "Alimentation minimum en déplacement" +msgstr "Vitesse d'avance minimum en déplacement" -#: src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1190 msgid "Minimum travel feedrate (M205 T)" -msgstr "Alimentation minimum en déplacement (M205 T)" +msgstr "Vitesse d'avance minimum en déplacement (M205 T)" -#: src/slic3r/GUI/Plater.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:2917 +msgid "Minimum wall thickness of a hollowed model." +msgstr "Épaisseur de paroi minimale d'un modèle évidé." + +#: src/libslic3r/PrintConfig.cpp:2449 +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 msgid "Mirror" msgstr "Symétrie" -#: src/libslic3r/PrintConfig.cpp:2320 +#: src/libslic3r/PrintConfig.cpp:2379 msgid "Mirror horizontally" msgstr "Symétriser horizontalement" -#: src/slic3r/GUI/GLCanvas3D.cpp:1711 +#: src/slic3r/GUI/GLCanvas3D.cpp:2053 msgid "Mirror Object" msgstr "Symétriser l'Objet" -#: src/slic3r/GUI/Plater.cpp:2946 +#: src/slic3r/GUI/Plater.cpp:4002 msgid "Mirror the selected object" msgstr "Symétriser l'objet sélectionné" -#: src/slic3r/GUI/Plater.cpp:2939 +#: src/slic3r/GUI/Plater.cpp:3995 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:2941 +#: src/slic3r/GUI/Plater.cpp:3997 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:2943 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Mirror the selected object along the Z axis" msgstr "Symétriser l'objet sélectionné selon l'axe Z" -#: src/libslic3r/PrintConfig.cpp:2327 +#: src/libslic3r/PrintConfig.cpp:2386 msgid "Mirror vertically" msgstr "Symétriser verticalement" -#: src/slic3r/Utils/OctoPrint.cpp:69 -#, possible-c-format +#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68 +#, c-format msgid "Mismatched type of print host: %s" msgstr "Mauvais appariement de l'hôte d'impression : %s" -#: src/libslic3r/GCode/PreviewData.cpp:176 +#: src/libslic3r/ExtrusionEntity.cpp:323 msgid "Mixed" msgstr "Mélangé" -#: src/slic3r/GUI/BedShapeDialog.cpp:87 src/slic3r/GUI/ConfigWizard.cpp:118 -#: src/slic3r/GUI/ConfigWizard.cpp:561 src/slic3r/GUI/ConfigWizard.cpp:575 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 -#: src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:84 -#: src/libslic3r/PrintConfig.cpp:59 src/libslic3r/PrintConfig.cpp:66 -#: src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:210 -#: src/libslic3r/PrintConfig.cpp:285 src/libslic3r/PrintConfig.cpp:293 -#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:353 -#: src/libslic3r/PrintConfig.cpp:473 src/libslic3r/PrintConfig.cpp:484 -#: src/libslic3r/PrintConfig.cpp:502 src/libslic3r/PrintConfig.cpp:680 -#: src/libslic3r/PrintConfig.cpp:1166 src/libslic3r/PrintConfig.cpp:1227 -#: src/libslic3r/PrintConfig.cpp:1245 src/libslic3r/PrintConfig.cpp:1263 -#: src/libslic3r/PrintConfig.cpp:1315 src/libslic3r/PrintConfig.cpp:1325 -#: src/libslic3r/PrintConfig.cpp:1446 src/libslic3r/PrintConfig.cpp:1454 -#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 -#: src/libslic3r/PrintConfig.cpp:1513 src/libslic3r/PrintConfig.cpp:1521 -#: src/libslic3r/PrintConfig.cpp:1529 src/libslic3r/PrintConfig.cpp:1612 -#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1898 -#: src/libslic3r/PrintConfig.cpp:1932 src/libslic3r/PrintConfig.cpp:2125 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2139 -#: src/libslic3r/PrintConfig.cpp:2169 src/libslic3r/PrintConfig.cpp:2179 -#: src/libslic3r/PrintConfig.cpp:2189 src/libslic3r/PrintConfig.cpp:2297 -#: src/libslic3r/PrintConfig.cpp:2372 src/libslic3r/PrintConfig.cpp:2381 -#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2400 -#: src/libslic3r/PrintConfig.cpp:2444 src/libslic3r/PrintConfig.cpp:2454 -#: src/libslic3r/PrintConfig.cpp:2473 src/libslic3r/PrintConfig.cpp:2483 -#: src/libslic3r/PrintConfig.cpp:2492 src/libslic3r/PrintConfig.cpp:2510 -#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2539 -#: src/libslic3r/PrintConfig.cpp:2552 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2491 +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/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: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 msgid "mm" msgstr "mm" -#: src/libslic3r/PrintConfig.cpp:1477 src/libslic3r/PrintConfig.cpp:1486 +#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556 msgid "mm (zero to disable)" msgstr "mm (zéro pour désactiver)" -#: src/libslic3r/PrintConfig.cpp:847 src/libslic3r/PrintConfig.cpp:992 -#: src/libslic3r/PrintConfig.cpp:1797 +#: 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 msgid "mm or %" msgstr "mm ou %" -#: src/libslic3r/PrintConfig.cpp:201 src/libslic3r/PrintConfig.cpp:577 -#: src/libslic3r/PrintConfig.cpp:585 src/libslic3r/PrintConfig.cpp:594 -#: src/libslic3r/PrintConfig.cpp:602 src/libslic3r/PrintConfig.cpp:629 -#: src/libslic3r/PrintConfig.cpp:648 src/libslic3r/PrintConfig.cpp:874 -#: src/libslic3r/PrintConfig.cpp:1001 src/libslic3r/PrintConfig.cpp:1079 -#: src/libslic3r/PrintConfig.cpp:1099 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1123 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1363 -#: src/libslic3r/PrintConfig.cpp:1537 src/libslic3r/PrintConfig.cpp:1546 -#: src/libslic3r/PrintConfig.cpp:1941 src/libslic3r/PrintConfig.cpp:2053 +#: 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 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:430 src/libslic3r/PrintConfig.cpp:856 -#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1702 -#: src/libslic3r/PrintConfig.cpp:1908 src/libslic3r/PrintConfig.cpp:2035 +#: 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 msgid "mm/s or %" msgstr "mm/s ou %" -#: src/libslic3r/PrintConfig.cpp:160 src/libslic3r/PrintConfig.cpp:303 -#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:936 -#: src/libslic3r/PrintConfig.cpp:1089 src/libslic3r/PrintConfig.cpp:1134 -#: src/libslic3r/PrintConfig.cpp:1145 src/libslic3r/PrintConfig.cpp:1334 +#: 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 msgid "mm/s²" msgstr "mm/s²" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:640 +#: src/libslic3r/PrintConfig.cpp:672 msgid "mm³" msgstr "mm³" -#: src/libslic3r/PrintConfig.cpp:569 src/libslic3r/PrintConfig.cpp:1185 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "mm³/s" msgstr "mm³/s" -#: src/libslic3r/PrintConfig.cpp:1197 src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273 msgid "mm³/s²" msgstr "mm³/s²" -#: src/slic3r/GUI/GUI_App.cpp:681 +#: src/slic3r/GUI/GUI_App.cpp:820 msgid "Mode" -msgstr "Mode" +msgstr "&Mode" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "model" msgstr "modèle" -#: src/slic3r/GUI/BedShapeDialog.cpp:239 +#: src/slic3r/GUI/BedShapeDialog.cpp:251 msgid "Model" msgstr "Modèle" @@ -3873,8 +4643,8 @@ msgid "Model repair canceled" msgstr "Réparation du modèle annulée" #: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" -msgstr "Échec de la réparation du modèle:\n" +msgid "Model repair failed:" +msgstr "Échec de la réparation du modèle:" #: src/slic3r/Utils/FixModelByWin10.cpp:400 msgid "Model repair finished" @@ -3884,104 +4654,151 @@ msgstr "Réparation du modèle terminée" msgid "Model repaired successfully" msgstr "Réparation du modèle réussie" -#: src/slic3r/GUI/Preset.cpp:207 +#: src/slic3r/GUI/Tab.cpp:979 +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 msgid "modified" msgstr "modifié" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Modifier" msgstr "Modificateur" -#: src/slic3r/GUI/Tab.cpp:1100 +#: src/slic3r/GUI/Tab.cpp:1161 msgid "Modifiers" msgstr "Modificateurs" -#: src/libslic3r/PrintConfig.cpp:719 +#: src/libslic3r/PrintConfig.cpp:2512 +msgid "money/bottle" +msgstr "prix/bouteille" + +#: src/libslic3r/PrintConfig.cpp:762 msgid "money/kg" msgstr "€/kg" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1240 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 msgid "Mouse wheel" msgstr "Roulette de la souris" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:51 +#: src/slic3r/GUI/GLCanvas3D.cpp:261 +msgid "Mouse wheel:" +msgstr "Roulette de la souris:" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 msgid "Move" msgstr "Déplacer" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1238 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 msgid "Move clipping plane" msgstr "Déplacer le plan de coupe" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Move current slider thumb Down" msgstr "Déplacer le curseur actuel vers le bas" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 msgid "Move current slider thumb Up" msgstr "Déplacer le curseur actuel vers le haut" -#: src/slic3r/GUI/GLCanvas3D.cpp:2872 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1059 +msgid "Move drainage hole" +msgstr "Déplacer le trou de drainage" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3505 msgid "Move Object" msgstr "Déplacer l'Objet" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365 msgid "Move point" msgstr "Déplacer le point" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +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 +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 +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 +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 msgid "Move support point" msgstr "Déplacer un point de support" -#: src/libslic3r/PrintConfig.cpp:2100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Movement in camera space" +msgstr "Mouvement dans l'espace de la caméra" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +msgid "Movement step set to 1 mm" +msgstr "Pas du mouvement réglé sur 1 mm" + +#: src/libslic3r/PrintConfig.cpp:2201 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:1661 src/slic3r/GUI/Plater.cpp:1769 +#: src/slic3r/GUI/Plater.cpp:2360 src/slic3r/GUI/Plater.cpp:2413 msgid "Multi-part object detected" msgstr "Objet multi-pièces détecté" -#: src/slic3r/GUI/FirmwareDialog.cpp:400 src/slic3r/GUI/FirmwareDialog.cpp:436 -#, possible-c-format +#: 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 "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:1118 +#: src/slic3r/GUI/Tab.cpp:1179 msgid "Multiple Extruders" msgstr "Extrudeurs Multiples" -#: src/slic3r/GUI/Plater.cpp:1766 -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?\n" -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 ?\n" +#: 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/libslic3r/PrintConfig.cpp:3050 +#: src/libslic3r/PrintConfig.cpp:3439 msgid "Multiply copies by creating a grid." msgstr "Multiplier les copies en créant une grille." -#: src/libslic3r/PrintConfig.cpp:3045 +#: src/libslic3r/PrintConfig.cpp:3434 msgid "Multiply copies by this factor." msgstr "Multiplier les copies par ce facteur." -#: src/slic3r/GUI/Field.cpp:139 +#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:580 msgid "N/A" msgstr "N/A" -#: src/slic3r/GUI/GUI_ObjectList.cpp:176 +#: src/slic3r/GUI/GUI_ObjectList.cpp:270 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 msgid "Name" msgstr "Nom" -#: src/libslic3r/PrintConfig.cpp:1418 +#: src/libslic3r/PrintConfig.cpp:1488 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:1412 +#: src/libslic3r/PrintConfig.cpp:1482 msgid "Name of the printer vendor." msgstr "Nom du fabriquant de l'imprimante." -#: src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1058 msgid "Name of the profile, from which this profile inherits." msgstr "Nom du profil, duquel hérite ce profil." -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Nearest" msgstr "Le plus proche" @@ -3989,32 +4806,40 @@ msgstr "Le plus proche" msgid "Network lookup" msgstr "Recherche réseau" -#: src/slic3r/GUI/Plater.cpp:2056 +#: src/slic3r/GUI/Plater.cpp:2151 msgid "New Project" msgstr "Nouveau Projet" -#: src/slic3r/GUI/UpdateDialogs.cpp:30 -#, possible-c-format +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +msgid "New project, clear plater" +msgstr "Nouveau projet, libérer le plateau" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +#, c-format msgid "New version of %s is available" msgstr "Une nouvelle version de %s est disponible" -#: src/slic3r/GUI/UpdateDialogs.cpp:47 +#: src/slic3r/GUI/UpdateDialogs.cpp:45 msgid "New version:" msgstr "Nouvelle version :" -#: src/slic3r/GUI/GLCanvas3D.cpp:3750 +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 msgid "Next Redo action: %1%" msgstr "Prochaine action Répéter : %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:3718 +#: src/slic3r/GUI/GLCanvas3D.cpp:4641 msgid "Next Undo action: %1%" msgstr "Prochaine action Annuler : %1%" -#: src/libslic3r/PrintConfig.cpp:912 +#: src/libslic3r/PrintConfig.cpp:960 msgid "No extrusion" msgstr "Aucune extrusion" -#: src/slic3r/GUI/MainFrame.cpp:635 +#: src/libslic3r/SLAPrintSteps.cpp:453 +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 msgid "No previously sliced file." msgstr "Aucun fichier précédemment découpé." @@ -4022,152 +4847,175 @@ msgstr "Aucun fichier précédemment découpé." msgid "NO RAMMING AT ALL" msgstr "PAS D'EXPULSION DU TOUT" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:1857 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "Sans couches dispersées (EXPERIMENTAL)" + +#: src/libslic3r/PrintConfig.cpp:2774 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/ConfigWizard.cpp:190 src/slic3r/GUI/Plater.cpp:422 -#: src/libslic3r/GCode/PreviewData.cpp:162 +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +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 msgid "None" msgstr "Aucun" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2203 msgid "Normal" msgstr "Normal" -#: src/slic3r/GUI/Plater.cpp:1073 +#: src/slic3r/GUI/Plater.cpp:1286 msgid "normal mode" msgstr "mode normal" -#: src/libslic3r/Zipper.cpp:49 +#: src/libslic3r/Zipper.cpp:46 msgid "not a ZIP archive" msgstr "n'est pas une archive ZIP" -#: src/slic3r/Utils/OctoPrint.cpp:90 +#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302 +msgid "Not found:" +msgstr "Introuvable:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1019 +msgid "Note" +msgstr "Remarque" + +#: src/slic3r/Utils/AstroBox.cpp:89 +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 +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 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:1213 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 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:1193 src/slic3r/GUI/Tab.cpp:1194 -#: src/slic3r/GUI/Tab.cpp:1576 src/slic3r/GUI/Tab.cpp:1577 -#: src/slic3r/GUI/Tab.cpp:1985 src/slic3r/GUI/Tab.cpp:1986 -#: src/slic3r/GUI/Tab.cpp:2079 src/slic3r/GUI/Tab.cpp:2080 -#: src/slic3r/GUI/Tab.cpp:3328 src/slic3r/GUI/Tab.cpp:3329 +#: 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 msgid "Notes" msgstr "Notes" -#: src/slic3r/GUI/GUI.cpp:277 +#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905 +#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:245 msgid "Notice" msgstr "Remarque" -#: src/slic3r/GUI/ConfigWizard.cpp:118 +#: src/slic3r/GUI/ConfigWizard.cpp:218 msgid "nozzle" msgstr "buse" -#: src/libslic3r/PrintConfig.cpp:1261 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2340 +#: src/libslic3r/PrintConfig.cpp:1326 msgid "Nozzle diameter" msgstr "Diamètre de la buse" -#: src/slic3r/GUI/ConfigWizard.cpp:560 +#: src/slic3r/GUI/ConfigWizard.cpp:969 msgid "Nozzle Diameter:" msgstr "Diamètre de la Buse :" -#: src/libslic3r/PrintConfig.cpp:618 +#: src/libslic3r/PrintConfig.cpp:650 msgid "Number of cooling moves" msgstr "Nombres de mouvements de refroidissement" -#: src/slic3r/GUI/Tab.cpp:1845 +#: src/slic3r/GUI/Tab.cpp:1839 msgid "Number of extruders of the printer." msgstr "Nombre d'extrudeurs de l'imprimante." -#: src/libslic3r/PrintConfig.cpp:1888 +#: src/libslic3r/PrintConfig.cpp:1975 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:1627 +#: src/libslic3r/PrintConfig.cpp:1697 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:2214 +#: src/libslic3r/PrintConfig.cpp:2365 msgid "Number of pixels in" msgstr "Nombre de pixels présents" -#: src/libslic3r/PrintConfig.cpp:2216 +#: src/libslic3r/PrintConfig.cpp:2367 msgid "Number of pixels in X" msgstr "Nombre de pixels présents dans X" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "Number of pixels in Y" msgstr "Nombre de pixels présents dans Y" -#: src/libslic3r/PrintConfig.cpp:151 +#: src/libslic3r/PrintConfig.cpp:176 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:1711 +#: src/libslic3r/PrintConfig.cpp:1781 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:2045 +#: src/libslic3r/PrintConfig.cpp:2134 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:2303 +#: src/libslic3r/PrintConfig.cpp:2518 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:218 +#: src/slic3r/GUI/Plater.cpp:241 msgid "Number of tool changes" msgstr "Nombre de changements d'outil" -#: src/libslic3r/PrintConfig.cpp:2489 +#: src/libslic3r/PrintConfig.cpp:2753 msgid "Object elevation" msgstr "Élévation de l'objet" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2466 msgid "Object manipulation" msgstr "Manipulation de l'Objet" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:27 -msgid "Object Manipulation" -msgstr "Manipulation de l'Objet" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:78 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638 msgid "Object name" msgstr "Nom de l'objet" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3417 msgid "Object or Instance" msgstr "Objet ou Instance" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1010 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 msgid "Object reordered" msgstr "Objet réorganisé" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1868 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2479 msgid "Object Settings to modify" msgstr "Réglages de l'Objet à modifier" -#: src/slic3r/GUI/Plater.cpp:1875 +#: src/slic3r/GUI/Plater.cpp:2529 msgid "Object too large?" msgstr "Objet trop grand ?" -#: src/libslic3r/PrintConfig.cpp:2161 +#: src/libslic3r/PrintConfig.cpp:2262 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:1018 +#: src/slic3r/GUI/Plater.cpp:1194 msgid "object(s)" msgstr "objet(s)" -#: src/slic3r/GUI/Plater.cpp:1043 src/slic3r/GUI/Plater.cpp:1058 +#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245 msgid "objects" msgstr "objets" -#: src/libslic3r/PrintConfig.cpp:402 src/libslic3r/PrintConfig.cpp:808 +#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 msgid "Octagram Spiral" msgstr "Spirale Octagramme" @@ -4175,745 +5023,928 @@ msgstr "Spirale Octagramme" msgid "OctoPrint version" msgstr "Version d'OctoPrint" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3425 msgid "of a current Object" msgstr "d'un Objet en cours" -#: src/slic3r/GUI/wxExtensions.cpp:2570 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +msgid "Offset" +msgstr "Décalage" + +#: src/slic3r/GUI/Tab.cpp:1755 +#, 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 msgid "One layer mode" msgstr "Mode couche unique" -#: src/libslic3r/Print.cpp:1285 +#: src/libslic3r/Print.cpp:1365 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:1817 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2676 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:978 +#: src/libslic3r/PrintConfig.cpp:1027 msgid "Only infill where needed" msgstr "Faire remplissage seulement où cela est nécessaire" -#: src/slic3r/GUI/Tab.cpp:2271 +#: src/slic3r/GUI/Tab.cpp:2373 msgid "Only lift Z" msgstr "Lever Z seulement" -#: src/libslic3r/PrintConfig.cpp:1500 +#: src/libslic3r/PrintConfig.cpp:1570 msgid "Only lift Z above" msgstr "Lever Z seulement au-dessus de" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1579 msgid "Only lift Z below" msgstr "Lever Z seulement en-dessous de" -#: src/libslic3r/PrintConfig.cpp:1279 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Only retract when crossing perimeters" msgstr "Rétracter uniquement lors du franchissement de périmètres" -#: src/slic3r/GUI/Tab.cpp:1126 +#: src/slic3r/GUI/Tab.cpp:1187 msgid "Ooze prevention" msgstr "Prévention des coulures" -#: src/libslic3r/Print.cpp:1193 +#: src/libslic3r/Print.cpp:1266 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:339 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "Open a project file" msgstr "Ouvrir un fichier de projet" -#: src/slic3r/GUI/Tab.cpp:1745 +#: src/slic3r/GUI/Tab.cpp:1729 msgid "Open CA certificate file" msgstr "Ouvrir le fichier de certificat CA" -#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:126 +#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:183 msgid "Open changelog page" msgstr "Ouvrir la page du journal des modifications" -#: src/slic3r/GUI/UpdateDialogs.cpp:68 +#: src/slic3r/GUI/UpdateDialogs.cpp:65 msgid "Open download page" msgstr "Ouvrir la page de téléchargement" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 -msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "Ouvrir un projet STL/OBJ/AMF/3MF avec la configuration, effacer le lit" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +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:551 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:693 +#, 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:542 +#: src/slic3r/GUI/MainFrame.cpp:684 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:549 +#: src/slic3r/GUI/MainFrame.cpp:686 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:2994 +#: src/slic3r/GUI/Plater.cpp:4040 msgid "Optimize orientation" msgstr "Optimiser l'orientation" -#: src/slic3r/GUI/Plater.cpp:2643 +#: src/slic3r/GUI/Plater.cpp:2767 msgid "Optimize Rotation" msgstr "Optimiser la Rotation" -#: src/slic3r/GUI/Plater.cpp:2994 +#: src/slic3r/GUI/Plater.cpp:4040 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:112 +#: src/libslic3r/PrintConfig.cpp:137 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:1070 +#: src/slic3r/GUI/Tab.cpp:1131 msgid "Options for support material and raft" msgstr "Options pour le matériau de support et le radeau" -#: src/slic3r/GUI/Plater.cpp:2251 +#: src/slic3r/GUI/DoubleSlider.cpp:989 +msgid "or press \"+\" key" +msgstr "ou appuyez sur la touche \"+\"" + +#: src/slic3r/GUI/Plater.cpp:2892 msgid "Orientation found." msgstr "Orientation trouvée." -#: src/slic3r/GUI/Plater.cpp:2768 +#: src/slic3r/GUI/Plater.cpp:2891 msgid "Orientation search canceled." msgstr "Recherche de l'orientation annulée." -#: src/slic3r/GUI/BedShapeDialog.cpp:79 +#: src/slic3r/GUI/BedShapeDialog.cpp:84 msgid "Origin" msgstr "Origine" -#: src/slic3r/GUI/Tab.cpp:1165 +#: src/slic3r/GUI/Tab.cpp:1227 msgid "Other" msgstr "Autre" -#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:1977 +#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064 msgid "Other layers" msgstr "Autres couches" -#: src/slic3r/GUI/ConfigWizard.cpp:438 +#: src/slic3r/GUI/ConfigWizard.cpp:856 msgid "Other Vendors" msgstr "Autres Fabriquants" -#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:3440 +#: src/slic3r/GUI/Tab.cpp:1238 src/slic3r/GUI/Tab.cpp:3666 msgid "Output file" msgstr "Fichier de sortie" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3493 msgid "Output File" msgstr "Fichier de Sortie" -#: src/libslic3r/PrintConfig.cpp:1294 +#: src/libslic3r/PrintConfig.cpp:1363 msgid "Output filename format" msgstr "Format du nom de fichier de sortie" -#: src/libslic3r/PrintConfig.cpp:2992 +#: src/libslic3r/PrintConfig.cpp:3381 msgid "Output Model Info" msgstr "Information du Modèle de Sortie" -#: src/slic3r/GUI/Tab.cpp:1168 src/slic3r/GUI/Tab.cpp:3439 +#: src/slic3r/GUI/Tab.cpp:1230 src/slic3r/GUI/Tab.cpp:3665 msgid "Output options" msgstr "Options de sortie" -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/GCode/PreviewData.cpp:165 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312 msgid "Overhang perimeter" msgstr "Périmètre en surplomb" -#: src/libslic3r/PrintConfig.cpp:1955 +#: src/libslic3r/PrintConfig.cpp:2042 msgid "Overhang threshold" msgstr "Seuil de surplomb" -#: src/slic3r/GUI/Tab.cpp:1153 +#: src/slic3r/GUI/Tab.cpp:1215 msgid "Overlap" msgstr "Chevauchement" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "P&rint Settings Tab" -msgstr "Onglet des Réglages d'Imp&ression" +msgstr "Onglet des &Réglages d'Impression" -#: src/slic3r/GUI/GUI_ObjectList.cpp:79 src/slic3r/GUI/GUI_ObjectList.cpp:520 -#: src/slic3r/GUI/Tab.cpp:3425 src/slic3r/GUI/Tab.cpp:3426 -#: src/libslic3r/PrintConfig.cpp:2516 src/libslic3r/PrintConfig.cpp:2523 -#: src/libslic3r/PrintConfig.cpp:2537 src/libslic3r/PrintConfig.cpp:2547 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2569 +#: 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 msgid "Pad" msgstr "Socle" -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 msgid "Pad and Support" msgstr "Socle et Support" -#: src/libslic3r/PrintConfig.cpp:2732 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "Pad around object" msgstr "Socle autour de l'objet" -#: src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:2862 +msgid "Pad around object everywhere" +msgstr "Socle partout autour de l'objet" + +#: src/libslic3r/PrintConfig.cpp:2811 +msgid "Pad brim size" +msgstr "Taille du bord de socle" + +#: src/libslic3r/SLA/Pad.cpp:691 +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 msgid "Pad object connector penetration" msgstr "Pénétration du connecteur de l'objet socle" -#: src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2880 msgid "Pad object connector stride" msgstr "Pas du connecteur de l'objet socle" -#: src/libslic3r/PrintConfig.cpp:2721 +#: src/libslic3r/PrintConfig.cpp:2889 msgid "Pad object connector width" msgstr "Largeur du connecteur de l'objet socle" -#: src/libslic3r/PrintConfig.cpp:2700 +#: src/libslic3r/PrintConfig.cpp:2869 msgid "Pad object gap" msgstr "Espace entre l'objet et le socle" -#: src/libslic3r/PrintConfig.cpp:2532 +#: src/libslic3r/PrintConfig.cpp:2797 msgid "Pad wall height" msgstr "Hauteur de la paroi du socle" -#: src/libslic3r/PrintConfig.cpp:2568 +#: src/libslic3r/PrintConfig.cpp:2844 msgid "Pad wall slope" msgstr "Inclinaison de la paroi du socle" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2787 msgid "Pad wall thickness" msgstr "Épaisseur de la paroi du socle" -#: src/slic3r/GUI/Field.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +msgid "Page Down" +msgstr "Page Down" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Page Up" +msgstr "Page Up" + +#: src/slic3r/GUI/Field.cpp:139 msgid "parameter name" msgstr "nom du paramètre" -#: src/slic3r/GUI/Field.cpp:184 +#: src/slic3r/GUI/Field.cpp:243 msgid "Parameter validation" msgstr "Validation du paramètre" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Part" msgstr "Pièce" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1881 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2494 msgid "Part manipulation" msgstr "Manipulation d'une pièce" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2483 msgid "Part Settings to modify" msgstr "Réglages de la pièce à modifier" -#: src/slic3r/GUI/GLCanvas3D.cpp:3449 +#: src/slic3r/GUI/GLCanvas3D.cpp:4514 msgid "Paste" msgstr "Coller" -#: src/slic3r/GUI/MainFrame.cpp:456 +#: src/slic3r/GUI/MainFrame.cpp:592 msgid "Paste clipboard" msgstr "Coller le presse-papier" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 msgid "Paste from clipboard" msgstr "Coller depuis le presse-papier" -#: src/slic3r/GUI/Plater.cpp:4772 +#: src/slic3r/GUI/Plater.cpp:5606 msgid "Paste From Clipboard" msgstr "Coller Depuis le Presse-Papier" -#: src/libslic3r/PrintConfig.cpp:1915 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "Pattern" msgstr "Motif" -#: src/libslic3r/PrintConfig.cpp:1805 +#: src/libslic3r/PrintConfig.cpp:1891 msgid "Pattern angle" msgstr "Angle du motif" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:2016 msgid "Pattern spacing" msgstr "Espacement du motif" -#: src/libslic3r/PrintConfig.cpp:1917 +#: src/libslic3r/PrintConfig.cpp:2004 msgid "Pattern used to generate support material." msgstr "Motif utilisé pour générer les supports." -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:198 +#: src/slic3r/GUI/Plater.cpp:1261 +msgid "Pause" +msgstr "Pause" + +#: src/slic3r/GUI/DoubleSlider.cpp:1009 +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/Gizmos/GLGizmoCut.cpp:175 msgid "Perform cut" msgstr "Effectuer la coupe" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/GCode/PreviewData.cpp:163 +#: src/libslic3r/PrintConfig.cpp:2927 +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 msgid "Perimeter" msgstr "Périmètre" -#: src/libslic3r/PrintConfig.cpp:1339 +#: src/libslic3r/PrintConfig.cpp:1408 msgid "Perimeter extruder" msgstr "Extrudeur pour les périmètres" -#: src/slic3r/GUI/PresetHints.cpp:162 +#: src/slic3r/GUI/PresetHints.cpp:165 msgid "perimeters" msgstr "périmètres" -#: src/libslic3r/PrintConfig.cpp:1330 src/libslic3r/PrintConfig.cpp:1348 -#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1370 +#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440 msgid "Perimeters" msgstr "Périmètres" -#: src/slic3r/GUI/ConfigWizard.cpp:440 -#, possible-c-format -msgid "Pick another vendor supported by %s:" -msgstr "Choisissez un autre fabriquant supporté par %s :" +#: src/slic3r/GUI/ConfigWizard.cpp:860 +#, c-format +msgid "Pick another vendor supported by %s" +msgstr "Choisissez un autre fournisseur pris en charge par %s" -#: src/libslic3r/PrintConfig.cpp:2430 +#: 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:2681 msgid "Pillar widening factor" msgstr "Facteur d'élargissement du pilier" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:32 +#: src/slic3r/GUI/ConfigManipulation.cpp:330 +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 +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 msgid "Place on face" msgstr "Positionner sur la surface" -#: src/slic3r/GUI/MainFrame.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:204 msgid "Plater" msgstr "Plateau" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 -msgid "Plater Shortcuts" -msgstr "Raccourcis du Plateau" - -#: src/slic3r/GUI/GUI.cpp:143 +#: src/slic3r/GUI/GUI_App.cpp:1085 msgid "Please check and fix your object list." msgstr "Veuillez vérifier et réparer votre liste d'objet." -#: src/slic3r/GUI/Tab.cpp:2797 +#: src/slic3r/GUI/Plater.cpp:2312 src/slic3r/GUI/Tab.cpp:2959 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/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:286 +#: src/slic3r/GUI/Plater.cpp:3286 +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 msgid "Portions copyright" msgstr "Copyright des sections" -#: src/libslic3r/PrintConfig.cpp:2235 +#: src/libslic3r/PrintConfig.cpp:2400 msgid "Portrait" msgstr "Portrait" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:193 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457 msgid "Position" msgstr "Position" -#: src/slic3r/GUI/Tab.cpp:2265 +#: src/slic3r/GUI/Tab.cpp:2367 msgid "Position (for multi-extruder printers)" msgstr "Position (pour les imprimantes multi-extrudeurs)" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Position (mm)" -msgstr "Position (en mm)" - -#: src/libslic3r/PrintConfig.cpp:1553 +#: src/libslic3r/PrintConfig.cpp:1623 msgid "Position of perimeters starting points." msgstr "Position des points de départ des périmètres." -#: src/libslic3r/PrintConfig.cpp:2123 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Position X" msgstr "Position X" -#: src/libslic3r/PrintConfig.cpp:2130 +#: src/libslic3r/PrintConfig.cpp:2231 msgid "Position Y" msgstr "Position Y" -#: src/slic3r/GUI/Tab.cpp:1187 src/libslic3r/PrintConfig.cpp:1383 +#: src/slic3r/GUI/Tab.cpp:1245 src/libslic3r/PrintConfig.cpp:1453 msgid "Post-processing scripts" msgstr "Scripts de post-traitement" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Pre&view" msgstr "Pré&visualisation" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 src/slic3r/GUI/Preferences.cpp:10 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10 msgid "Preferences" msgstr "Préférences" -#: src/libslic3r/PrintConfig.cpp:1571 +#: src/libslic3r/PrintConfig.cpp:1641 msgid "Preferred direction of the seam" msgstr "Direction préférée de la jointure" -#: src/libslic3r/PrintConfig.cpp:1582 +#: src/libslic3r/PrintConfig.cpp:1652 msgid "Preferred direction of the seam - jitter" msgstr "Direction préférée de la jointure - gigue" -#: src/libslic3r/PrintObject.cpp:251 +#: src/libslic3r/PrintObject.cpp:255 msgid "Preparing infill" msgstr "Préparation du remplissage" -#: src/slic3r/GUI/Tab.cpp:2758 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:2920 +#, c-format msgid "Preset (%s)" msgstr "Préréglage (%s)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Press to activate deselection rectangle\nor to scale or rotate selected objects\naround their own center" -msgstr "Appuyez pour activer le rectangle de\ndésélection ou pour redimensionner\nou faire pivoter les objets sélectionnés\nautour de leur propre centre" +#: src/slic3r/GUI/Tab.cpp:3082 +msgid "Preset with name \"%1%\" already exists." +msgstr "Un préréglage avec le nom \"%1%\" existe déjà." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/Tab.cpp:3029 +msgctxt "PresetName" +msgid "Copy" +msgstr "Copie" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +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\ndans une direction pour le Gizmo" +msgstr "" +"Appuyez pour activer le redimensionnement\n" +"dans une direction pour le Gizmo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 -#, possible-c-format -msgid "Press to activate selection rectangle\nor to snap by 5% in Gizmo scale\nor to snap by 1mm in Gizmo move" -msgstr "Appuyez pour activer le rectangle\nde sélection ou pour modifier de 5%\nla dimension du Gizmo ou pour\nmodifier d'1 mm le déplacement du\nGizmo" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +msgid "Press to activate selection rectangle" +msgstr "Appuyer pour activer le rectangle de sélection" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Press to scale selection to fit print volume\nin Gizmo scale" -msgstr "Appuyez pour redimensionner la sélection afin\nqu'elle s'ajuste aux dimensions du Gizmo" +#: 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:127 -msgid "Press to select multiple object or move multiple object with mouse" -msgstr "Clicquez pour sélectionner plusieurs objets ou 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/Tab.cpp:2288 +#: 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:211 src/slic3r/GUI/Plater.cpp:4105 +#: src/slic3r/GUI/Tab.cpp:2390 msgid "Preview" msgstr "Aperçu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -msgid "Preview Shortcuts" -msgstr "Prévisualisation des Raccourcis" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Preview hollowed and drilled model" +msgstr "Aperçu du modèle évidé et percé" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:790 msgid "Previously sliced file (" msgstr "Fichier précédemment découpé (" -#: src/libslic3r/PrintConfig.cpp:1773 +#: src/libslic3r/PrintConfig.cpp:1851 msgid "Prime all printing extruders" msgstr "Préparer tous les extrudeurs d'impression" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1274 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1521 msgid "print" msgstr "imprimer" -#: src/slic3r/GUI/MainFrame.cpp:510 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Print &Host Upload Queue" msgstr "File d'Attente de Téléchargement de l'&Hôte d'Impression" -#: src/libslic3r/PrintConfig.cpp:439 +#: src/libslic3r/PrintConfig.cpp:471 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:541 +#: src/slic3r/GUI/ConfigWizard.cpp:952 msgid "Print Diameters" msgstr "Diamètres d'Impression" -#: src/slic3r/GUI/Tab.cpp:1917 src/slic3r/GUI/Tab.cpp:2074 +#: src/slic3r/GUI/Tab.cpp:1944 src/slic3r/GUI/Tab.cpp:2123 msgid "Print Host upload" msgstr "Téléchargement de l'Hôte d'Impression" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 -#: src/slic3r/GUI/PrintHostDialogs.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: 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/Tab.hpp:317 src/slic3r/GUI/Tab.hpp:405 +#: src/slic3r/GUI/DoubleSlider.cpp:970 +msgid "Print mode" +msgstr "Mode d'impression" + +#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:431 msgid "Print Settings" msgstr "Réglages d'Impression" -#: src/slic3r/GUI/Plater.cpp:681 +#: src/slic3r/GUI/Plater.cpp:815 msgid "Print settings" msgstr "Réglages d'impression" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1478 msgid "Print speed override" msgstr "Contournement de la vitesse d'impression" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/libslic3r/GCode.cpp:638 +msgid "Print z" +msgstr "Imprimer z" + +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Print&er Settings Tab" msgstr "Onglet des Réglages de l'Imprimant&e" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1438 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1621 msgid "Printable" msgstr "Imprimable" -#: src/slic3r/GUI/Plater.cpp:685 +#: src/slic3r/GUI/Plater.cpp:819 msgid "Printer" msgstr "Imprimante" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:48 src/slic3r/GUI/Preset.cpp:1278 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1525 msgid "printer" msgstr "imprimer" -#: src/libslic3r/PrintConfig.cpp:2274 src/libslic3r/PrintConfig.cpp:2275 +#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 msgid "Printer absolute correction" msgstr "Correction absolue de l'imprimante" -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457 msgid "Printer gamma correction" msgstr "Correction gamma de l'imprimante" -#: src/slic3r/GUI/Tab.cpp:926 +#: src/slic3r/GUI/Tab.cpp:976 msgid "printer model" msgstr "modèle de l'imprimante" -#: src/libslic3r/PrintConfig.cpp:1402 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Printer notes" msgstr "Notes de l'imprimante" -#: src/libslic3r/PrintConfig.cpp:2266 src/libslic3r/PrintConfig.cpp:2267 -#: src/libslic3r/PrintConfig.cpp:2268 +#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2433 msgid "Printer scaling correction" msgstr "Correction de redimensionnement de l'imprimante" -#: src/slic3r/GUI/Tab.hpp:368 +#: src/slic3r/GUI/Tab.hpp:391 msgid "Printer Settings" msgstr "Réglages de l'Imprimante" -#: src/libslic3r/PrintConfig.cpp:42 src/libslic3r/PrintConfig.cpp:43 +#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 msgid "Printer technology" msgstr "Technologie de l'imprimante" -#: src/libslic3r/PrintConfig.cpp:1396 +#: src/libslic3r/PrintConfig.cpp:1466 msgid "Printer type" msgstr "Type d'imprimante" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1487 msgid "Printer variant" msgstr "Variante d'imprimante" -#: src/libslic3r/PrintConfig.cpp:1411 +#: src/libslic3r/PrintConfig.cpp:1481 msgid "Printer vendor" msgstr "Fabriquant de l'imprimante" -#: src/libslic3r/Print.cpp:1294 +#: src/libslic3r/Print.cpp:1388 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:715 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:849 +#, c-format msgid "Processing %s" msgstr "Traitement %s" -#: src/slic3r/GUI/Plater.cpp:1600 -#, possible-c-format -msgid "Processing input file %s\n" -msgstr "Traitement du fichier d'entrée %s\n" +#: 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:110 +#: src/libslic3r/PrintObject.cpp:108 msgid "Processing triangulated mesh" msgstr "Traitement de maillage triangulé" -#: src/slic3r/GUI/Tab.cpp:1201 src/slic3r/GUI/Tab.cpp:1585 -#: src/slic3r/GUI/Tab.cpp:1993 src/slic3r/GUI/Tab.cpp:2087 -#: src/slic3r/GUI/Tab.cpp:3337 src/slic3r/GUI/Tab.cpp:3446 +#: 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 msgid "Profile dependencies" msgstr "Dépendances du profil" -#: src/slic3r/GUI/PrintHostDialogs.cpp:149 +#: src/slic3r/GUI/ConfigWizard.cpp:566 +msgid "Profile:" +msgstr "Profil :" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:150 msgid "Progress" msgstr "Progression" -#: src/slic3r/GUI/FirmwareDialog.cpp:779 +#: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Progress:" msgstr "Progression :" -#: src/slic3r/GUI/MainFrame.cpp:542 +#: src/slic3r/GUI/MainFrame.cpp:684 msgid "Prusa 3D &Drivers" msgstr "&Drivers Prusa 3D" -#: src/slic3r/GUI/ConfigWizard.cpp:1109 +#: src/slic3r/GUI/ConfigWizard.cpp:1995 msgid "Prusa FFF Technology Printers" msgstr "Imprimantes à Technologie FFF Prusa" -#: src/slic3r/GUI/ConfigWizard.cpp:1112 +#: src/slic3r/GUI/ConfigWizard.cpp:1998 msgid "Prusa MSLA Technology Printers" msgstr "Imprimantes à Technologie MSLA Prusa" -#: src/slic3r/GUI/AboutDialog.cpp:255 +#: src/slic3r/GUI/AboutDialog.cpp:260 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/GUI_App.cpp:297 -#, 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/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/libslic3r/PrintConfig.cpp:2153 +#: 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/libslic3r/PrintConfig.cpp:2254 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:456 +#: src/slic3r/GUI/Plater.cpp:544 msgid "Purging volumes" msgstr "Volumes de purge" -#: src/libslic3r/PrintConfig.cpp:2106 +#: src/libslic3r/PrintConfig.cpp:2207 msgid "Purging volumes - load/unload volumes" msgstr "Volumes de purge - volumes de chargement/déchargement" -#: src/libslic3r/PrintConfig.cpp:2113 +#: src/libslic3r/PrintConfig.cpp:2214 msgid "Purging volumes - matrix" msgstr "Volumes de purge - matrice" -#: src/slic3r/GUI/Tab.cpp:1019 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +msgid "Quality" +msgstr "Qualité" + +#: src/slic3r/GUI/Tab.cpp:1080 msgid "Quality (slower slicing)" msgstr "Qualité (découpage plus lent)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:854 src/slic3r/GUI/GUI_ObjectList.cpp:1139 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1145 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1377 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:273 +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 msgid "Quick Add Settings (%s)" msgstr "Ajout de Réglages Rapide (%s)" -#: src/slic3r/GUI/MainFrame.cpp:383 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Quick Slice" msgstr "Découpage Rapide" -#: src/slic3r/GUI/MainFrame.cpp:389 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Quick Slice and Save As" msgstr "Découpage Rapide et Enregistrer Sous" -#: src/slic3r/GUI/MainFrame.cpp:409 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:540 +#, c-format msgid "Quit %s" msgstr "Quitter %s" -#: src/libslic3r/PrintConfig.cpp:479 +#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511 msgid "Radius" msgstr "Rayon" -#: src/slic3r/GUI/Tab.cpp:1066 +#: src/slic3r/GUI/Tab.cpp:1127 msgid "Raft" msgstr "Radeau" -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1501 msgid "Raft layers" msgstr "Couches du radeau" -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" msgstr "Personnalisation de l'expulsion" -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 -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: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 ..." -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 msgid "Ramming line spacing" msgstr "Espacement de la ligne de ramming" -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 msgid "Ramming line width" msgstr "Largeur de la ligne d'expulsion" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Ramming parameters" msgstr "Paramètres de l'expulsion" -#: src/slic3r/GUI/Tab.cpp:1545 +#: src/slic3r/GUI/Tab.cpp:1505 msgid "Ramming settings" msgstr "Réglages de l'expulsion" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "Random" msgstr "Aléatoire" -#: src/slic3r/GUI/wxExtensions.cpp:486 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 msgid "Range" msgstr "Zone" -#: src/libslic3r/SLAPrint.cpp:72 +#: src/libslic3r/SLAPrintSteps.cpp:65 msgid "Rasterizing layers" msgstr "Tramage des couches" -#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#: src/slic3r/GUI/MainFrame.cpp:596 +msgid "Re&load from disk" +msgstr "Recharger à partir du dis&que" + +#: src/slic3r/GUI/UpdateDialogs.cpp:249 msgid "Re-configure" msgstr "Reconfigurer" -#: src/slic3r/GUI/FirmwareDialog.cpp:783 +#: src/slic3r/GUI/FirmwareDialog.cpp:821 msgid "Ready" msgstr "Prêt" -#: src/slic3r/GUI/Plater.cpp:2406 +#: src/slic3r/GUI/Plater.cpp:3115 msgid "Ready to slice" msgstr "Prêt à découper" -#: src/slic3r/GUI/MainFrame.cpp:526 src/libslic3r/PrintConfig.cpp:1562 +#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632 msgid "Rear" msgstr "Arrière" -#: src/slic3r/GUI/MainFrame.cpp:526 +#: src/slic3r/GUI/MainFrame.cpp:669 msgid "Rear View" msgstr "Vue Arrière" -#: src/slic3r/GUI/MainFrame.cpp:401 +#: src/slic3r/GUI/MainFrame.cpp:413 msgid "Recent projects" -msgstr "Projets récents" +msgstr "Proj&ets récents" -#: src/slic3r/GUI/PresetHints.cpp:262 -#, possible-c-format +#: src/slic3r/GUI/PresetHints.cpp:263 +#, 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 +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 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:386 src/slic3r/GUI/GUI_App.cpp:395 +#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459 msgid "Recreating" msgstr "Re-création" -#: src/slic3r/GUI/BedShapeDialog.cpp:68 +#: src/slic3r/GUI/BedShapeDialog.cpp:73 msgid "Rectangular" msgstr "Rectangle" -#: src/libslic3r/PrintConfig.cpp:398 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1922 +#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843 +#: src/libslic3r/PrintConfig.cpp:2009 msgid "Rectilinear" msgstr "Rectiligne" -#: src/libslic3r/PrintConfig.cpp:1923 +#: src/libslic3r/PrintConfig.cpp:2010 msgid "Rectilinear grid" msgstr "Grille rectiligne" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3639 -#: src/slic3r/GUI/MainFrame.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131 +#: src/slic3r/GUI/MainFrame.cpp:584 msgid "Redo" msgstr "Recommencer" -#: src/slic3r/GUI/GLCanvas3D.cpp:3497 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 +#, c-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Répéter %1$d Action" +msgstr[1] "Répéter %1$d Actions" -#: src/slic3r/GUI/GLCanvas3D.cpp:3479 +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 msgid "Redo History" msgstr "Répéter Historique" -#: src/slic3r/GUI/Tab.cpp:1037 +#: src/slic3r/GUI/Tab.cpp:1098 msgid "Reducing printing time" msgstr "Réduction du temps d'impression" -#: src/slic3r/GUI/Plater.cpp:2924 -msgid "Reload from Disk" -msgstr "Recharger depuis le Disque" +#: src/slic3r/GUI/Plater.cpp:3452 +msgid "Reload all from disk" +msgstr "Tout recharger à partir du disque" -#: src/slic3r/GUI/Plater.cpp:2924 -msgid "Reload the selected file from Disk" -msgstr "Recharger le fichier sélectionné depuis le 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 +msgid "Reload from disk" +msgstr "Recharger à partir du disque" -#: src/slic3r/GUI/Preferences.cpp:36 +#: src/slic3r/GUI/Plater.cpp:3339 +msgid "Reload from:" +msgstr "Recharger depuis :" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +msgid "Reload plater from disk" +msgstr "Recharger le plateau depuis le disque" + +#: src/slic3r/GUI/MainFrame.cpp:597 +msgid "Reload the plater from disk" +msgstr "Recharger le plateau à partir du disque" + +#: src/slic3r/GUI/Plater.cpp:3963 +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 +msgid "Reload the selected volumes from disk" +msgstr "Recharger les volumes sélectionnés à partir du disque" + +#: src/slic3r/GUI/Preferences.cpp:39 msgid "Remember output directory" msgstr "Se souvenir du répertoire de sortie" -#: src/slic3r/GUI/Tab.cpp:2935 +#: src/slic3r/GUI/Tab.cpp:3121 msgid "remove" msgstr "retirer" -#: src/slic3r/GUI/Tab.cpp:2937 +#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 +#: src/slic3r/GUI/Tab.cpp:3124 msgid "Remove" msgstr "Retirer" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:859 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +msgid "Remove all holes" +msgstr "Supprimer tous les trous" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 msgid "Remove all points" msgstr "Retirer tous les points" -#: src/slic3r/GUI/GLCanvas3D.cpp:3475 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 +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 msgid "Remove instance" msgstr "Supprimer l'instance" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Remove Instance of the selected object" msgstr "Supprimer l'instance de l'objet sélectionné" @@ -4921,60 +5952,68 @@ msgstr "Supprimer l'instance de l'objet sélectionné" msgid "Remove layer range" msgstr "Supprimer la zone de couche" -#: src/slic3r/GUI/Plater.cpp:3518 +#: src/slic3r/GUI/Plater.cpp:3942 msgid "Remove one instance of the selected object" msgstr "Supprime une instance de l'objet sélectionné" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:83 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95 msgid "Remove parameter" msgstr "Supprimer le paramètre" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1230 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 msgid "Remove point" msgstr "Supprimer le point" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1233 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 msgid "Remove point from selection" msgstr "Supprimer le point de la sélection" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:855 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1237 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +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 msgid "Remove selected points" msgstr "Retirer les points sélectionnés" -#: src/slic3r/GUI/Plater.cpp:2891 src/slic3r/GUI/Plater.cpp:2909 +#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953 msgid "Remove the selected object" msgstr "Retirer l'objet sélectionné" -#: src/slic3r/GUI/ConfigWizard.cpp:305 -msgid "Remove user profiles - install from scratch (a snapshot will be taken beforehand)" -msgstr "Supprimer les profils d'utilisateur - installation à partir de zéro (un instantané des réglages sera pris)" +#: src/slic3r/GUI/ConfigWizard.cpp:453 +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:1200 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1636 msgid "Rename" msgstr "Renommer" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:551 msgid "Rename Object" msgstr "Renommer l'Objet" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:551 msgid "Rename Sub-object" msgstr "Renommer le Sous-objet" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3803 msgid "Renaming" msgstr "Renommage" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115 +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 msgid "Render with a software renderer" msgstr "Rendu avec avec un logiciel de rendu" -#: src/libslic3r/PrintConfig.cpp:3126 +#: src/libslic3r/PrintConfig.cpp:3516 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:772 src/libslic3r/PrintConfig.cpp:3058 +#: src/slic3r/GUI/MainFrame.cpp:911 src/libslic3r/PrintConfig.cpp:3447 msgid "Repair" msgstr "Réparer" @@ -4998,279 +6037,310 @@ 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/KBShortcutsDialog.cpp:113 src/slic3r/GUI/MainFrame.cpp:395 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat last quick slice" msgstr "Répéter le dernier découpage rapide" -#: src/slic3r/GUI/MainFrame.cpp:395 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat Last Quick Slice" msgstr "Répéter le Dernier Découpage Rapide" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/Tab.cpp:3083 +msgid "Replace?" +msgstr "Remplacer ?" + +#: src/slic3r/GUI/MainFrame.cpp:703 msgid "Report an I&ssue" msgstr "S&ignaler un Problème" -#: src/slic3r/GUI/MainFrame.cpp:561 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:703 +#, c-format msgid "Report an issue on %s" msgstr "Signaler un problème sur %s" -#: src/slic3r/Utils/PresetUpdater.cpp:590 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:713 +#, c-format msgid "requires max. %s" msgstr "nécessite max. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:588 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:710 +#, c-format msgid "requires min. %s" msgstr "nécessite min. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:583 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:705 +#, c-format msgid "requires min. %s and max. %s" msgstr "nécessite min. %s et max. %s" -#: src/slic3r/GUI/FirmwareDialog.cpp:772 +#: src/slic3r/GUI/FirmwareDialog.cpp:810 msgid "Rescan" msgstr "Scanner à nouveau" -#: src/slic3r/GUI/Tab.cpp:1879 +#: src/slic3r/GUI/Tab.cpp:1906 msgid "Rescan serial ports" msgstr "Rescanner les ports série" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1239 +#: src/slic3r/GUI/GLCanvas3D.cpp:313 +msgid "Reset" +msgstr "Réinitialiser" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1373 msgid "Reset clipping plane" msgstr "Réinitialiser le plan de coupe" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:928 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 msgid "Reset direction" msgstr "Réinitialiser la direction" -#: src/slic3r/GUI/Plater.cpp:2603 +#: src/slic3r/GUI/Plater.cpp:2723 msgid "Reset Project" msgstr "Réinitialiser le Projet" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:303 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 msgid "Reset rotation" msgstr "Réinitialiser la rotation" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:328 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 msgid "Reset Rotation" msgstr "Réinitialiser la Rotation" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:290 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 msgid "Reset scale" msgstr "Réinitialiser l'échelle" -#: src/slic3r/GUI/Tab.cpp:2584 +#: src/slic3r/GUI/GLCanvas3D.cpp:252 +msgid "Reset to base" +msgstr "Réinitialiser à la base" + +#: src/slic3r/GUI/Tab.cpp:2394 msgid "Reset to Filament Color" msgstr "Réinitialiser la Couleur du Filament" -#: src/libslic3r/PrintConfig.cpp:1441 +#: src/libslic3r/PrintConfig.cpp:1511 msgid "Resolution" msgstr "Résolution" -#: src/libslic3r/PrintConfig.cpp:1459 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Retract amount before wipe" msgstr "Quantité de rétractation avant essuyage" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1537 msgid "Retract on layer change" msgstr "Rétracter lors des changements de couche" -#: src/slic3r/GUI/Tab.cpp:2268 +#: src/slic3r/GUI/Tab.cpp:1324 src/slic3r/GUI/Tab.cpp:1383 +#: src/slic3r/GUI/Tab.cpp:2370 msgid "Retraction" msgstr "Rétraction" -#: src/libslic3r/PrintConfig.cpp:1453 +#: src/libslic3r/PrintConfig.cpp:1523 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:1474 +#: src/libslic3r/PrintConfig.cpp:1544 msgid "Retraction Length" msgstr "Longueur de Rétractation" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1552 msgid "Retraction Length (Toolchange)" msgstr "Longueur de Rétractation (changement d'outil)" -#: src/libslic3r/PrintConfig.cpp:1534 src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605 msgid "Retraction Speed" msgstr "Vitesse de Rétractation" -#: src/slic3r/GUI/Tab.cpp:2284 +#: src/slic3r/GUI/Tab.cpp:2386 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:244 +#: src/slic3r/GUI/GUI_Preview.cpp:254 msgid "Retractions" msgstr "Rétractions" -#: src/slic3r/GUI/MainFrame.cpp:528 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right" msgstr "Droite" -#: src/slic3r/GUI/GUI_ObjectList.cpp:381 +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 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:279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 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:250 +#: src/slic3r/GUI/GUI_ObjectList.cpp:359 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:1232 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 msgid "Right click" msgstr "Clic droit" -#: src/slic3r/GUI/MainFrame.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:243 +msgid "Right mouse button:" +msgstr "Clic droit souris :" + +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right View" msgstr "Vue Droite" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:233 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:253 -#: src/libslic3r/PrintConfig.cpp:3062 +#: 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 msgid "Rotate" msgstr "Pivoter" -#: src/libslic3r/PrintConfig.cpp:3067 +#: src/libslic3r/PrintConfig.cpp:3456 msgid "Rotate around X" msgstr "Pivoter autour de X" -#: src/libslic3r/PrintConfig.cpp:3072 +#: src/libslic3r/PrintConfig.cpp:3461 msgid "Rotate around Y" msgstr "Pivoter autour de Y" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:35 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 msgid "Rotate lower part upwards" msgstr "Pivoter la partie basse vers le haut" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:151 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:194 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +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 +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 msgid "Rotation" msgstr "Rotation" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:491 -msgid "Rotation (deg)" -msgstr "Rotation (deg)" - -#: src/libslic3r/PrintConfig.cpp:3068 +#: src/libslic3r/PrintConfig.cpp:3457 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:3073 +#: src/libslic3r/PrintConfig.cpp:3462 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:3063 +#: src/libslic3r/PrintConfig.cpp:3452 msgid "Rotation angle around the Z axis in degrees." msgstr "Angle de rotation autour de l'axe Z en degrés." -#: src/slic3r/GUI/ConfigWizard.cpp:298 src/slic3r/GUI/GUI_App.cpp:658 -#, possible-c-format +#: src/slic3r/GUI/GUI_App.cpp:797 +#, c-format msgid "Run %s" msgstr "Run %s" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:85 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:398 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478 msgid "Running post-processing scripts" msgstr "Exécuter des scripts de post-traitement" -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/RammingChart.cpp:81 -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 src/libslic3r/PrintConfig.cpp:612 -#: src/libslic3r/PrintConfig.cpp:656 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:2243 src/libslic3r/PrintConfig.cpp:2252 -#: src/libslic3r/PrintConfig.cpp:2312 src/libslic3r/PrintConfig.cpp:2319 +#: 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 msgid "s" msgstr "s" -#: src/slic3r/GUI/MainFrame.cpp:466 src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:750 msgid "S&end G-code" -msgstr "Envoyer le G-code" +msgstr "&Envoyer le G-code" -#: src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:750 msgid "S&end to print" msgstr "Envoyer pour imprimer" #. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3264 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:3417 +#, c-format msgid "Save %s as:" msgstr "Enregistrer %s sous :" -#: src/slic3r/GUI/MainFrame.cpp:686 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:826 +#, c-format msgid "Save %s file as:" msgstr "Enregistrer le fichier %s sous :" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1023 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046 msgid "Save changes?" msgstr "Enregistrer les modifications ?" -#: src/libslic3r/PrintConfig.cpp:2997 +#: src/libslic3r/PrintConfig.cpp:3386 msgid "Save config file" msgstr "Sauvegarder le fichier de configuration" -#: src/slic3r/GUI/MainFrame.cpp:786 +#: src/slic3r/GUI/MainFrame.cpp:925 msgid "Save configuration as:" msgstr "Enregistrer la configuration sous :" -#: src/libslic3r/PrintConfig.cpp:2998 +#: src/libslic3r/PrintConfig.cpp:3387 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 -#, possible-c-format +#, c-format msgid "Save current %s" msgstr "Enregistrer l'état actuel %s" -#: src/slic3r/GUI/MainFrame.cpp:341 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "Save current project file" msgstr "Sauvegarder le fichier du projet en cours" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save current project file as" msgstr "Sauvegarder le fichier du projet en cours sous" -#: src/slic3r/GUI/Plater.cpp:1938 +#: src/slic3r/GUI/Plater.cpp:2604 msgid "Save file as:" msgstr "Enregistrer le fichier sous :" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/Plater.cpp:4839 msgid "Save G-code file as:" msgstr "Sauvegarder le fichier G-code en tant que :" -#: src/slic3r/GUI/MainFrame.cpp:757 +#: src/slic3r/GUI/MainFrame.cpp:899 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:417 +#: src/slic3r/GUI/Tab.hpp:443 msgid "Save preset" msgstr "Enregistrer le préréglage" -#: src/slic3r/GUI/MainFrame.cpp:843 +#: src/slic3r/GUI/MainFrame.cpp:980 msgid "Save presets bundle as:" msgstr "Enregistrer le lot de préréglages sous :" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save Project &as" msgstr "Sauveg&arder le Projet &sous" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 -msgid "Save project (3MF)" -msgstr "Sauvegarder le projet (3MF)" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +msgid "Save project (3mf)" +msgstr "Sauvegarder le projet (3mf)" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +msgid "Save project as (3mf)" +msgstr "Sauvegarder le projet en tant que (3mf)" + +#: src/slic3r/GUI/Plater.cpp:4839 msgid "Save SL1 file as:" msgstr "Sauvegarder le fichier SL1 sous :" -#: src/slic3r/GUI/MainFrame.cpp:692 +#: src/slic3r/GUI/MainFrame.cpp:838 msgid "Save zip file as:" msgstr "Sauvegarder le fichier zip sous :" @@ -5280,58 +6350,63 @@ 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/GUI_ObjectManipulation.cpp:152 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:234 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:254 -#: src/libslic3r/PrintConfig.cpp:3077 +#: 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 msgid "Scale" msgstr "Redimensionner" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:276 -msgid "Scale (%)" -msgstr "Redimensionner (%)" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:195 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 msgid "Scale factors" -msgstr "Facteurs de redimensionnement" +msgstr "Échelle" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: 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" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1724 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:3086 +#: src/libslic3r/PrintConfig.cpp:3475 msgid "Scale to Fit" msgstr "Redimensionner pour Ajuster" -#: src/slic3r/GUI/Selection.cpp:947 +#: src/slic3r/GUI/Selection.cpp:939 msgid "Scale To Fit" msgstr "Redimensionner pour Ajuster" -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3476 msgid "Scale to fit the given volume." msgstr "Redimensionner pour ajuster à un volume donné." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1724 msgid "Scale to print volume" msgstr "Redimensionner pour ajuster au volume d'impression" -#: src/libslic3r/PrintConfig.cpp:3078 +#: src/libslic3r/PrintConfig.cpp:3467 msgid "Scaling factor or percentage." msgstr "Facteur ou pourcentage de redimensionnement." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:409 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505 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:1551 +#: src/libslic3r/PrintConfig.cpp:1621 msgid "Seam position" msgstr "Position de la jointure" -#: src/libslic3r/PrintConfig.cpp:1572 +#: src/libslic3r/PrintConfig.cpp:1642 msgid "Seam preferred direction" msgstr "Direction préférée de la jointure" -#: src/libslic3r/PrintConfig.cpp:1581 +#: src/libslic3r/PrintConfig.cpp:1651 msgid "Seam preferred direction jitter" msgstr "Gigue de la direction préférée de la jointure" @@ -5339,67 +6414,63 @@ msgstr "Gigue de la direction préférée de la jointure" msgid "Searching for devices" msgstr "Recherche des dispositifs" -#: src/slic3r/GUI/Plater.cpp:2190 +#: src/slic3r/GUI/Plater.cpp:2858 msgid "Searching for optimal orientation" msgstr "Recherche de l'orientation optimale" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 -msgid "Select All objects" -msgstr "Sélectionner Tous les objets" +#: src/slic3r/GUI/GUI_App.cpp:1103 +msgid "Select a gcode file:" +msgstr "Sélectionnez un fichier gcode :" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Select all objects" +msgstr "Sélectionner tous les objets" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1370 msgid "Select all points" msgstr "Sélectionner tous les points" -#: src/slic3r/GUI/ConfigWizard.cpp:1089 +#: src/slic3r/GUI/ConfigWizard.cpp:1976 msgid "Select all standard printers" msgstr "Sélectionner toutes les imprimantes standard" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1234 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368 msgid "Select by rectangle" msgstr "Sélectionner par rectangle" -#: src/slic3r/GUI/MainFrame.cpp:806 src/slic3r/GUI/MainFrame.cpp:870 +#: src/slic3r/GUI/MainFrame.cpp:944 src/slic3r/GUI/MainFrame.cpp:1006 msgid "Select configuration to load:" msgstr "Sélectionner la configuration à charger :" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82 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:2834 -msgid "Select extruder number for selected objects and/or parts" -msgstr "Sélectionner le numéro d'extrudeur pour les objets et/ou pièces sélectionnés" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2847 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3971 msgid "Select extruder number:" msgstr "Sélectionner le numéro de l'extrudeur :" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 msgid "Select Filament Settings Tab" msgstr "Sélectionner l'Onglet des Réglages du Filament" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1251 -msgid "Select new extruder for the object/part" -msgstr "Sélectionner un nouvel extrudeur pour l'objet/la pièce" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 msgid "Select Plater Tab" msgstr "Sélectionner l'Onglet du Plateau" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 msgid "Select Print Settings Tab" msgstr "Sélectionner l'Onglet des Réglages d'Impression" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 msgid "Select Printer Settings Tab" msgstr "Sélectionner l'Onglet des Réglages de l'Imprimante" -#: src/slic3r/GUI/GUI_ObjectList.cpp:917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1265 msgid "Select showing settings" msgstr "Sélectionner les réglages d'affichage" -#: src/slic3r/GUI/GUI_App.cpp:524 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Select the language" msgstr "Sélectionner la langue" @@ -5411,39 +6482,49 @@ msgstr "Sélectionner les profils d'impression avec lesquels ce profil est compa 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:744 +#: src/slic3r/GUI/MainFrame.cpp:889 msgid "Select the STL file to repair:" msgstr "Sélectionner le fichier STL à réparer :" -#: src/slic3r/GUI/Preferences.cpp:207 +#: src/slic3r/GUI/Preferences.cpp:237 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:2545 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3553 msgid "Select type of part" msgstr "Sélectionner le type de pièce" -#: src/slic3r/GUI/Plater.cpp:606 +#: src/slic3r/GUI/Plater.cpp:638 msgid "Select what kind of pad do you need" msgstr "Choisissez le type de socle dont vous avez besoin" -#: src/slic3r/GUI/Plater.cpp:421 +#: src/slic3r/GUI/Plater.cpp:498 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/Selection.cpp:146 msgid "Selection-Add" msgstr "Sélection-Ajouter" -#: src/slic3r/GUI/Selection.cpp:384 +#: src/slic3r/GUI/Selection.cpp:376 msgid "Selection-Add All" msgstr "Sélection-Ajouter Tout" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3299 msgid "Selection-Add from list" msgstr "Sélection-Ajouter depuis la liste" -#: src/slic3r/GUI/GLCanvas3D.cpp:5623 +#: src/slic3r/GUI/GLCanvas3D.cpp:6598 msgid "Selection-Add from rectangle" msgstr "Sélection-Ajouter depuis le rectangle" @@ -5459,15 +6540,15 @@ msgstr "Sélection-Ajouter Objet" msgid "Selection-Remove" msgstr "Sélection-Retirer" -#: src/slic3r/GUI/Selection.cpp:410 +#: src/slic3r/GUI/Selection.cpp:402 msgid "Selection-Remove All" msgstr "Sélection-Retirer Tout" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2867 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3291 msgid "Selection-Remove from list" msgstr "Sélection-Retirer de la liste" -#: src/slic3r/GUI/GLCanvas3D.cpp:5642 +#: src/slic3r/GUI/GLCanvas3D.cpp:6617 msgid "Selection-Remove from rectangle" msgstr "Sélection-Retirer du rectangle" @@ -5479,11 +6560,11 @@ msgstr "Sélection-Supprimer l'Instance" msgid "Selection-Remove Object" msgstr "Sélection-Supprimer l'Objet" -#: src/slic3r/GUI/MainFrame.cpp:444 +#: src/slic3r/GUI/MainFrame.cpp:566 msgid "Selects all objects" msgstr "Sélectionner tous les objets" -#: src/slic3r/GUI/Plater.cpp:3822 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5522 msgid "Send G-code" msgstr "Envoyer le G-code" @@ -5491,27 +6572,31 @@ 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:466 +#: src/slic3r/GUI/MainFrame.cpp:481 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:731 src/slic3r/GUI/Plater.cpp:3822 +#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5522 msgid "Send to printer" msgstr "Envoyer à l'imprimante" -#: src/slic3r/GUI/Tab.cpp:1169 +#: src/slic3r/GUI/GLCanvas3D.cpp:1305 +msgid "Seq." +msgstr "Seq." + +#: src/slic3r/GUI/Tab.cpp:1231 msgid "Sequential printing" msgstr "Impression séquentielle" -#: src/slic3r/GUI/Tab.cpp:1874 src/libslic3r/PrintConfig.cpp:1591 +#: src/slic3r/GUI/Tab.cpp:1901 src/libslic3r/PrintConfig.cpp:1661 msgid "Serial port" msgstr "Port série" -#: src/libslic3r/PrintConfig.cpp:1599 +#: src/libslic3r/PrintConfig.cpp:1669 msgid "Serial port speed" msgstr "Vitesse du port série" -#: src/slic3r/GUI/FirmwareDialog.cpp:769 +#: src/slic3r/GUI/FirmwareDialog.cpp:807 msgid "Serial port:" msgstr "Port série :" @@ -5519,642 +6604,757 @@ msgstr "Port série :" msgid "Service name" msgstr "Nom du service" -#: src/slic3r/GUI/Tab.cpp:1824 src/slic3r/GUI/Tab.cpp:2025 -#: src/slic3r/GUI/Tab.cpp:3008 +#: src/slic3r/GUI/Tab.cpp:1802 src/slic3r/GUI/Tab.cpp:2046 +#: src/slic3r/GUI/Tab.cpp:3176 msgid "Set" msgstr "Appliquer" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1192 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1599 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 msgid "Set as a Separated Object" msgstr "Définir comme Objet Séparé" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 msgid "Set as a Separated Objects" msgstr "Définir comme Objets Séparés" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +msgid "Set extruder change for every" +msgstr "Définir le changement d'extrudeur pour chaque" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1671 msgid "Set extruder for selected items" msgstr "Définir l'extrudeur pour les items sélectionnés" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 +msgid "Set extruder sequence" +msgstr "Définir la séquence d'extrudeur" + +#: src/slic3r/GUI/DoubleSlider.cpp:1532 +msgid "Set extruder sequence for the entire print" +msgstr "Définir la séquence d'extrusion pour l'ensemble de l'impression" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "Définir la séquence d'extrudeur (outil)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 msgid "Set lower thumb to current slider thumb" msgstr "Définir le curseur inférieur sur le curseur actuel" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:245 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297 msgid "Set Mirror" msgstr "Appliquer la Symétrie" -#: src/slic3r/GUI/Plater.cpp:3520 +#: src/slic3r/GUI/Plater.cpp:3944 msgid "Set number of instances" msgstr "Définir le nombre d'instances" -#: src/slic3r/GUI/Plater.cpp:4163 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:4756 +#, c-format msgid "Set numbers of copies to %d" msgstr "Régler le nombre de copies sur %d" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:746 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781 msgid "Set Orientation" msgstr "Définir l'Orientation" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:715 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750 msgid "Set Position" msgstr "Définir la Position" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3759 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Printable" msgstr "Définir Imprimable" -#: src/slic3r/GUI/Selection.cpp:1482 +#: src/slic3r/GUI/Selection.cpp:1475 msgid "Set Printable Instance" msgstr "Définir une Instance Imprimable" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846 msgid "Set Scale" msgstr "Définir l'Échelle" -#: src/libslic3r/PrintConfig.cpp:2228 +#: src/libslic3r/PrintConfig.cpp:2393 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:527 +#: src/slic3r/GUI/ConfigWizard.cpp:932 msgid "Set the shape of your printer's bed." msgstr "Réglez la forme du plateau de votre imprimante." -#: src/libslic3r/PrintConfig.cpp:524 +#: src/libslic3r/PrintConfig.cpp:556 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:417 +#: src/libslic3r/PrintConfig.cpp:448 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:831 +#: src/libslic3r/PrintConfig.cpp:878 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:1689 +#: src/libslic3r/PrintConfig.cpp:1758 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:2019 +#: src/libslic3r/PrintConfig.cpp:2107 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:963 +#: src/libslic3r/PrintConfig.cpp:1011 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:1350 +#: src/libslic3r/PrintConfig.cpp:1419 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:1862 +#: src/libslic3r/PrintConfig.cpp:1948 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:480 +#: src/libslic3r/PrintConfig.cpp:512 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." -#: src/libslic3r/PrintConfig.cpp:65 +#: src/libslic3r/PrintConfig.cpp:81 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:469 +#: src/libslic3r/PrintConfig.cpp:501 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:3759 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Unprintable" msgstr "Définir non-Imprimable" -#: src/slic3r/GUI/Selection.cpp:1482 +#: src/slic3r/GUI/Selection.cpp:1475 msgid "Set Unprintable Instance" msgstr "Définir une Instance non-Imprimable" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 msgid "Set upper thumb to current slider thumb" msgstr "Définir le curseur supérieur sur le curseur actuel" -#: src/slic3r/GUI/BedShapeDialog.cpp:143 +#: 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/slic3r/GUI/BedShapeDialog.cpp:155 msgid "Settings" msgstr "Réglages" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 msgid "Settings for height range" msgstr "Réglages pour la zone de hauteur" -#: src/slic3r/GUI/BedShapeDialog.cpp:60 +#: src/slic3r/GUI/ConfigManipulation.cpp:162 +msgid "Shall I adjust those settings for supports?" +msgstr "Dois-je ajuster ces paramètres pour les supports ?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:89 +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 +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 +msgid "Shall I switch to rectilinear fill pattern?" +msgstr "Dois-je passer au motif de remplissage rectiligne?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:139 +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 msgid "Shape" msgstr "Forme" -#: src/slic3r/GUI/GUI_Preview.cpp:246 +#: src/slic3r/GUI/GUI_Preview.cpp:256 msgid "Shells" msgstr "Coques" -#: src/slic3r/GUI/GUI_Preview.cpp:221 +#: src/slic3r/GUI/GLCanvas3D.cpp:249 +msgid "Shift + Left mouse button:" +msgstr "Maj + Clic gauche souris :" + +#: src/slic3r/GUI/GLCanvas3D.cpp:255 +msgid "Shift + Right mouse button:" +msgstr "Maj + Clic droit souris :" + +#: src/slic3r/GUI/GUI_Preview.cpp:231 msgid "Show" msgstr "Afficher" -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show &Configuration Folder" msgstr "Afficher le Répertoire de &Configuration" -#: src/slic3r/GUI/MainFrame.cpp:563 +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Show &labels" +msgstr "Afficher les &labels" + +#: src/slic3r/GUI/MainFrame.cpp:705 msgid "Show about dialog" msgstr "Afficher la boîte de dialogue à propos" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show advanced settings" msgstr "Afficher les réglages avancés" -#: src/slic3r/GUI/PrintHostDialogs.cpp:158 +#: src/slic3r/GUI/PrintHostDialogs.cpp:159 msgid "Show error message" msgstr "Afficher le message d'erreur" -#: src/slic3r/GUI/Preferences.cpp:84 +#: src/slic3r/GUI/Preferences.cpp:95 msgid "Show incompatible print and filament presets" msgstr "Afficher les préréglages d'impression et de filament incompatibles" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Show keyboard shortcuts list" msgstr "Afficher la liste des raccourcis clavier" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Show object/instance labels in 3D scene" +msgstr "Afficher les labels de l'objet /instance dans la scène 3D" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show simplified settings" msgstr "Afficher les réglages simplifiés" -#: src/slic3r/GUI/MainFrame.cpp:557 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52 +msgid "Show supports" +msgstr "Afficher les supports" + +#: src/slic3r/GUI/MainFrame.cpp:699 msgid "Show system information" msgstr "Afficher les informations système" -#: src/slic3r/GUI/MainFrame.cpp:487 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "Show the 3D editing view" msgstr "Afficher la vue d'édition 3D" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Show the 3D slices preview" msgstr "Afficher la prévisualisation des tranches 3D" -#: src/slic3r/GUI/MainFrame.cpp:480 +#: src/slic3r/GUI/MainFrame.cpp:617 msgid "Show the filament settings" msgstr "Afficher les réglages de filament" -#: src/libslic3r/PrintConfig.cpp:2983 +#: src/libslic3r/PrintConfig.cpp:3372 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:2988 +#: src/libslic3r/PrintConfig.cpp:3377 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:566 +#: src/slic3r/GUI/MainFrame.cpp:708 msgid "Show the list of the keyboard shortcuts" msgstr "Afficher la liste des raccourcis clavier" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "Show the plater" msgstr "Afficher le plateau" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "Show the print settings" msgstr "Afficher les réglages d'impression" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Show the printer settings" msgstr "Afficher les réglages de l'imprimante" -#: src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:3366 msgid "Show this help." msgstr "Afficher cette aide." -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show user configuration folder (datadir)" msgstr "Afficher le répertoire de configuration utilisateur (datadir)" #: src/slic3r/GUI/KBShortcutsDialog.cpp:185 -msgid "Show/Hide (L)egend" -msgstr "Afficher/Masquer la (L)égende" +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Afficher/Masquer le dialogue des paramètres des périphériques 3Dconnexion" -#: src/slic3r/GUI/GUI_App.cpp:674 src/slic3r/GUI/wxExtensions.cpp:2459 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +msgid "Show/Hide Legend" +msgstr "Afficher/Cacher la Légende" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +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 msgid "Simple" msgstr "Simple" -#: src/slic3r/GUI/GUI_App.cpp:674 +#: src/slic3r/GUI/ConfigWizard.cpp:820 +msgid "Simple mode" +msgstr "Mode simple" + +#: src/slic3r/GUI/GUI_App.cpp:813 msgid "Simple View Mode" msgstr "Mode de Vue Simple" -#: src/slic3r/GUI/Tab.cpp:2231 src/slic3r/GUI/Tab.cpp:2239 +#: src/slic3r/GUI/Tab.cpp:2298 src/slic3r/GUI/Tab.cpp:2306 msgid "Single extruder MM setup" msgstr "Réglage MM pour extrudeur unique" -#: src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1845 msgid "Single Extruder Multi Material" msgstr "Multi Material à extrudeur unique" -#: src/slic3r/GUI/Tab.cpp:2023 -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: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:2240 +#: src/slic3r/GUI/Tab.cpp:2307 msgid "Single extruder multimaterial parameters" msgstr "Paramètres multimatériaux pour extrudeur unique" -#: src/slic3r/GUI/BedShapeDialog.cpp:72 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 src/slic3r/GUI/Plater.cpp:137 -#: src/slic3r/GUI/Tab.cpp:2257 +#: 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 msgid "Size" msgstr "Taille" -#: src/slic3r/GUI/Tab.cpp:1813 src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:1797 src/slic3r/GUI/Tab.cpp:2041 msgid "Size and coordinates" msgstr "Taille et coordonnées" -#: src/slic3r/GUI/BedShapeDialog.cpp:73 +#: src/slic3r/GUI/BedShapeDialog.cpp:78 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:235 src/slic3r/GUI/Tab.cpp:1050 -#: src/libslic3r/GCode/PreviewData.cpp:171 +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1111 +#: src/libslic3r/ExtrusionEntity.cpp:318 msgid "Skirt" msgstr "Jupe" -#: src/slic3r/GUI/Tab.cpp:1049 +#: src/slic3r/GUI/Tab.cpp:1110 msgid "Skirt and brim" msgstr "Jupe et bordure" -#: src/libslic3r/PrintConfig.cpp:1617 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "Skirt height" msgstr "Hauteur de la jupe" -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Skirt Loops" msgstr "Boucles de la Jupe" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1200 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1334 msgid "SLA gizmo keyboard shortcuts" msgstr "Raccourcis clavier pour le gizmo SLA" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1150 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1058 msgid "SLA gizmo turned off" msgstr "Gizmo SLA désactivé" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1115 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1017 msgid "SLA gizmo turned on" msgstr "Gizmo SLA activé" -#: src/slic3r/GUI/Plater.cpp:684 src/slic3r/GUI/Preset.cpp:1277 +#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1524 msgid "SLA material" msgstr "Matériau SLA" -#: src/slic3r/GUI/Plater.cpp:683 src/slic3r/GUI/Preset.cpp:1276 +#: src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "SLA Material Profiles Selection" +msgstr "Sélection des Profils Matériaux SLA" + +#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471 +msgid "SLA material type" +msgstr "Type de matériau SLA" + +#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "SLA Materials" +msgstr "Matériaux SLA" + +#: src/slic3r/GUI/Preset.cpp:1523 msgid "SLA print" msgstr "Impression SLA" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2578 msgid "SLA print material notes" msgstr "Notes concernant le matériau d'impression SLA" -#: src/slic3r/GUI/Plater.cpp:690 +#: src/slic3r/GUI/Plater.cpp:817 msgid "SLA print settings" msgstr "Réglages d'impression SLA" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:997 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:996 msgid "SLA Support Points" msgstr "Points de Support SLA" -#: src/slic3r/GUI/GLCanvas3D.cpp:722 +#: 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/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/ConfigWizard.cpp:1530 +msgid "SLA Technology Printers" +msgstr "Imprimantes Technologie SLA" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Slab" msgstr "Slab" -#: src/libslic3r/PrintConfig.cpp:1268 +#: src/libslic3r/PrintConfig.cpp:1333 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:89 +#: src/libslic3r/PrintConfig.cpp:105 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:82 +#: 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/slic3r/GUI/ConfigSnapshotDialog.cpp:45 -msgid "slic3r version" -msgstr "version de slic3r" - -#: src/libslic3r/PrintConfig.cpp:1234 +#: src/libslic3r/PrintConfig.cpp:1299 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r ne descendra pas en-dessous de cette vitesse." -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3359 msgid "Slice" msgstr "Découper" -#: src/slic3r/GUI/MainFrame.cpp:383 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Slice a file into a G-code" msgstr "Découper un fichier en G-code" -#: src/slic3r/GUI/MainFrame.cpp:389 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Slice a file into a G-code, save as" msgstr "Découper un fichier en G-code, enregistrer sous" -#: src/libslic3r/PrintConfig.cpp:71 +#: src/libslic3r/PrintConfig.cpp:87 msgid "Slice gap closing radius" msgstr "Découper le rayon de fermeture de l'espacement" -#: src/slic3r/GUI/Plater.cpp:734 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3618 +#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3121 +#: src/slic3r/GUI/Plater.cpp:5110 msgid "Slice now" msgstr "Découper maintenant" -#: src/libslic3r/PrintConfig.cpp:2944 +#: src/libslic3r/PrintConfig.cpp:3333 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:2965 +#: src/libslic3r/PrintConfig.cpp:3354 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:2971 +#: src/libslic3r/PrintConfig.cpp:3360 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:193 +#: src/slic3r/GUI/Plater.cpp:216 msgid "Sliced Info" msgstr "Informations de découpage" -#: src/slic3r/GUI/MainFrame.cpp:704 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3615 src/slic3r/GUI/Tab.cpp:1159 -#: src/slic3r/GUI/Tab.cpp:3436 +#: 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 msgid "Slicing" msgstr "Découpe" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:91 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184 msgid "Slicing complete" msgstr "Découpe annulée" -#: src/libslic3r/SLAPrint.cpp:1459 +#: src/libslic3r/SLAPrint.cpp:760 msgid "Slicing done" msgstr "Découpe effectuée" -#: src/slic3r/GUI/MainFrame.cpp:729 +#: src/slic3r/GUI/MainFrame.cpp:874 msgid "Slicing Done!" msgstr "Découpe Effectuée !" -#: src/libslic3r/SLAPrint.cpp:759 +#: src/libslic3r/SLAPrintSteps.cpp:245 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/SLAPrint.cpp:55 +#: src/libslic3r/SLAPrintSteps.cpp:45 msgid "Slicing model" msgstr "Découpe du modèle" -#: src/libslic3r/SLAPrint.cpp:59 +#: src/libslic3r/SLAPrintSteps.cpp:49 msgid "Slicing supports" msgstr "Découpe des supports" -#: src/libslic3r/PrintConfig.cpp:2249 +#: src/libslic3r/PrintConfig.cpp:2414 msgid "Slow" msgstr "Lent" -#: src/libslic3r/PrintConfig.cpp:1635 +#: src/libslic3r/PrintConfig.cpp:1705 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:2250 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "Slow tilt" msgstr "Inclinaison lente" -#: src/libslic3r/PrintConfig.cpp:1646 +#: src/libslic3r/PrintConfig.cpp:1715 msgid "Small perimeters" msgstr "Périmètres courts" -#: src/slic3r/GUI/GUI_App.cpp:697 +#: src/slic3r/GUI/GLCanvas3D.cpp:288 +msgid "Smooth" +msgstr "Lisse" + +#: src/slic3r/GUI/GLCanvas3D.cpp:258 +msgid "Smoothing" +msgstr "Lissage" + +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Snapshot name" msgstr "Nom de l'instantané" -#: src/slic3r/GUI/MainFrame.cpp:549 +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Software &Releases" -msgstr "Software & Publications" +msgstr "Softwa&re Publications" -#: src/slic3r/GUI/PresetHints.cpp:181 +#: src/slic3r/GUI/PresetHints.cpp:184 msgid "solid infill" msgstr "remplissage solide" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/PrintConfig.cpp:1687 -#: src/libslic3r/PrintConfig.cpp:1697 src/libslic3r/GCode/PreviewData.cpp:167 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767 msgid "Solid infill" msgstr "Remplissage solide" -#: src/libslic3r/PrintConfig.cpp:1675 +#: src/libslic3r/PrintConfig.cpp:1744 msgid "Solid infill every" msgstr "Remplissage solide toutes les" -#: src/libslic3r/PrintConfig.cpp:1667 +#: src/libslic3r/PrintConfig.cpp:1736 msgid "Solid infill extruder" msgstr "Extrudeur pour le remplissage solide" -#: src/libslic3r/PrintConfig.cpp:1658 +#: src/libslic3r/PrintConfig.cpp:1727 msgid "Solid infill threshold area" msgstr "Surface de seuil pour le remplissage solide" -#: src/slic3r/GUI/Tab.cpp:1014 src/libslic3r/PrintConfig.cpp:1710 +#: src/slic3r/GUI/Tab.cpp:1065 src/libslic3r/PrintConfig.cpp:1780 msgid "Solid layers" msgstr "Couches solides" -#: src/libslic3r/PrintConfig.cpp:711 +#: src/libslic3r/PrintConfig.cpp:754 msgid "Soluble material" msgstr "Matériau soluble" -#: src/libslic3r/PrintConfig.cpp:712 +#: src/libslic3r/PrintConfig.cpp:755 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:914 +#: src/libslic3r/PrintConfig.cpp:937 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:721 -msgid "Some objects are not visible when editing supports" -msgstr "Certains objets ne sont pas visibles lorsque les supports sont édités" +#: src/slic3r/GUI/GLCanvas3D.cpp:688 +msgid "Some objects are not visible" +msgstr "Certains objets ne sont pas visibles" -#: src/libslic3r/Print.cpp:1162 +#: src/libslic3r/Print.cpp:1226 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:1177 +#: src/libslic3r/Print.cpp:1228 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:2548 +#: src/libslic3r/PrintConfig.cpp:2824 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:2086 +#: src/libslic3r/PrintConfig.cpp:2187 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:1897 +#: src/libslic3r/PrintConfig.cpp:1984 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:1931 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "Spacing between support material lines." msgstr "Espacement entre les lignes des supports." -#: src/slic3r/GUI/GUI_ObjectList.cpp:71 src/slic3r/GUI/GUI_ObjectList.cpp:512 -#: src/slic3r/GUI/GUI_Preview.cpp:215 src/slic3r/GUI/Tab.cpp:1084 -#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:426 -#: src/libslic3r/PrintConfig.cpp:871 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1361 src/libslic3r/PrintConfig.cpp:1598 -#: src/libslic3r/PrintConfig.cpp:1647 src/libslic3r/PrintConfig.cpp:1698 -#: src/libslic3r/PrintConfig.cpp:2029 +#: 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 msgid "Speed" msgstr "Vitesse" -#: src/libslic3r/PrintConfig.cpp:1600 +#: 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:400 +#: src/libslic3r/GCode/PreviewData.cpp:351 msgid "Speed (mm/s)" msgstr "Vitesse (mm/s)" -#: src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:920 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:1097 +#: src/slic3r/GUI/Tab.cpp:1158 msgid "Speed for non-print moves" msgstr "Vitesse pour les déplacements sans impression" -#: src/libslic3r/PrintConfig.cpp:1362 +#: src/libslic3r/PrintConfig.cpp:1432 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:1085 +#: src/slic3r/GUI/Tab.cpp:1146 msgid "Speed for print moves" msgstr "Vitesse pour les déplacements d'impression" -#: src/libslic3r/PrintConfig.cpp:200 +#: src/libslic3r/PrintConfig.cpp:236 msgid "Speed for printing bridges." msgstr "Vitesse d'impression des ponts." -#: src/libslic3r/PrintConfig.cpp:1699 +#: src/libslic3r/PrintConfig.cpp:1769 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:1906 +#: src/libslic3r/PrintConfig.cpp:1993 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:1940 +#: src/libslic3r/PrintConfig.cpp:2027 msgid "Speed for printing support material." msgstr "Vitesse d'impression du support." -#: src/libslic3r/PrintConfig.cpp:1000 +#: src/libslic3r/PrintConfig.cpp:1049 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:2030 +#: src/libslic3r/PrintConfig.cpp:2119 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:2052 +#: src/libslic3r/PrintConfig.cpp:2153 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:627 +#: src/libslic3r/PrintConfig.cpp:659 msgid "Speed of the first cooling move" msgstr "Vitesse du premier mouvement de refroidissement" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:678 msgid "Speed of the last cooling move" msgstr "Vitesse du dernier mouvement de refroidissement" -#: src/libslic3r/PrintConfig.cpp:585 +#: src/libslic3r/PrintConfig.cpp:616 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:577 +#: src/libslic3r/PrintConfig.cpp:608 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:593 +#: src/libslic3r/PrintConfig.cpp:624 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:602 +#: src/libslic3r/PrintConfig.cpp:633 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/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/Mouse3DController.cpp:296 +msgid "Speed:" +msgstr "Vitesse:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Sphere" msgstr "Sphère" -#: src/libslic3r/PrintConfig.cpp:1717 +#: src/libslic3r/PrintConfig.cpp:1794 msgid "Spiral vase" msgstr "Mode de vase spirale" -#: src/slic3r/GUI/Plater.cpp:2971 src/slic3r/GUI/Plater.cpp:2988 -#: src/slic3r/GUI/Plater.cpp:3008 src/libslic3r/PrintConfig.cpp:3082 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 +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 msgid "Split" msgstr "Scinder" -#: src/slic3r/GUI/Plater.cpp:2971 +#: src/slic3r/GUI/Plater.cpp:4019 msgid "Split the selected object" msgstr "Scinder l'objet sélectionné" -#: src/slic3r/GUI/Plater.cpp:2966 src/slic3r/GUI/Plater.cpp:2988 +#: src/slic3r/GUI/Plater.cpp:4014 src/slic3r/GUI/Plater.cpp:4034 msgid "Split the selected object into individual objects" msgstr "Scinder l'objet sélectionné en objets individuels" -#: src/slic3r/GUI/Plater.cpp:2968 src/slic3r/GUI/Plater.cpp:3008 +#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4048 msgid "Split the selected object into individual sub-parts" msgstr "Scinder l'objet sélectionné en sous-parties individuelles" -#: src/slic3r/GUI/GLCanvas3D.cpp:3490 +#: src/slic3r/GUI/GLCanvas3D.cpp:4550 msgid "Split to objects" msgstr "Diviser en objets individuels" -#: src/slic3r/GUI/Plater.cpp:2796 +#: src/slic3r/GUI/Plater.cpp:2981 msgid "Split to Objects" msgstr "Diviser en Objets" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1110 +#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1487 msgid "Split to parts" msgstr "Scinder en parties" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1904 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2274 msgid "Split to Parts" msgstr "Scinder en Parties" -#: src/libslic3r/PrintConfig.cpp:799 +#: src/slic3r/GUI/ConfigWizard.cpp:289 +msgid "Standard" +msgstr "Standard" + +#: src/libslic3r/PrintConfig.cpp:846 msgid "Stars" msgstr "Étoiles" -#: src/slic3r/GUI/MainFrame.cpp:376 +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "Start a new project" msgstr "Démarrer un nouveau projet" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 msgid "Start at height" -msgstr "Commencer à cette hauteur" +msgstr "Hauteur de début" -#: src/slic3r/GUI/Tab.cpp:1564 src/slic3r/GUI/Tab.cpp:1949 -#: src/libslic3r/PrintConfig.cpp:1736 src/libslic3r/PrintConfig.cpp:1751 +#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1976 +#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828 msgid "Start G-code" msgstr "G-code de début" -#: src/slic3r/GUI/MainFrame.cpp:403 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "Start new slicing process" msgstr "Démarrer un nouveau processus de découpe" @@ -6162,724 +7362,937 @@ 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:150 +#: src/slic3r/GUI/PrintHostDialogs.cpp:151 msgid "Status" msgstr "État" -#: src/slic3r/GUI/FirmwareDialog.cpp:782 +#: src/slic3r/GUI/FirmwareDialog.cpp:820 msgid "Status:" msgstr "État :" -#: src/slic3r/GUI/Tab.cpp:2158 +#: src/slic3r/GUI/Tab.cpp:2209 msgid "Stealth" msgstr "Mode silencieux" -#: src/slic3r/GUI/Plater.cpp:1084 +#: src/slic3r/GUI/Plater.cpp:1291 msgid "stealth mode" msgstr "mode silencieux" -#: src/slic3r/GUI/Plater.cpp:3545 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:4985 +#, c-format msgid "STL file exported to %s" msgstr "Fichier STL exporté vers %s" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 msgid "Stop at height" -msgstr "Arrêter à cette hauteur" +msgstr "Hauteur d'arrêt" -#: src/slic3r/GUI/Tab.cpp:1716 src/slic3r/GUI/Tab.cpp:1901 +#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:1928 msgid "Success!" msgstr "Réussi !" -#: src/slic3r/GUI/PresetHints.cpp:200 +#: src/slic3r/GUI/PresetHints.cpp:203 msgid "support" msgstr "support" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2692 msgid "Support base diameter" msgstr "Diamètre de la base du support" -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "Support base height" msgstr "Hauteur de la base du support" -#: src/libslic3r/PrintConfig.cpp:2566 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "Support base safety distance" msgstr "Distance de sécurité de la base du support" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Support Blocker" msgstr "Bloqueur de Support" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Support Enforcer" msgstr "Générateur de Support" -#: src/slic3r/GUI/Tab.cpp:3401 +#: src/slic3r/GUI/ConfigManipulation.cpp:163 +msgid "Support Generator" +msgstr "Générateur de support" + +#: src/slic3r/GUI/Tab.cpp:3608 msgid "Support head" msgstr "Tête du support" -#: src/libslic3r/PrintConfig.cpp:2369 +#: src/libslic3r/PrintConfig.cpp:2620 msgid "Support head front diameter" msgstr "Diamètre avant de la tête du support" -#: src/libslic3r/PrintConfig.cpp:2378 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "Support head penetration" msgstr "Pénétration de la tête du support" -#: src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2638 msgid "Support head width" msgstr "Largeur de la tête du support" -#: src/slic3r/GUI/PresetHints.cpp:210 +#: src/slic3r/GUI/PresetHints.cpp:213 msgid "support interface" msgstr "interface du support" -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:70 -#: src/slic3r/GUI/GUI_ObjectList.cpp:511 src/slic3r/GUI/GUI_Preview.cpp:236 -#: src/slic3r/GUI/Tab.cpp:1059 src/slic3r/GUI/Tab.cpp:1060 -#: src/libslic3r/PrintConfig.cpp:334 src/libslic3r/PrintConfig.cpp:1432 -#: src/libslic3r/PrintConfig.cpp:1780 src/libslic3r/PrintConfig.cpp:1786 -#: src/libslic3r/PrintConfig.cpp:1794 src/libslic3r/PrintConfig.cpp:1806 -#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:1824 -#: src/libslic3r/PrintConfig.cpp:1839 src/libslic3r/PrintConfig.cpp:1860 -#: src/libslic3r/PrintConfig.cpp:1871 src/libslic3r/PrintConfig.cpp:1887 -#: src/libslic3r/PrintConfig.cpp:1896 src/libslic3r/PrintConfig.cpp:1905 -#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1930 -#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1939 -#: src/libslic3r/PrintConfig.cpp:1948 src/libslic3r/PrintConfig.cpp:1956 -#: src/libslic3r/PrintConfig.cpp:1970 src/libslic3r/GCode/PreviewData.cpp:172 +#: 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 msgid "Support material" -msgstr "Support" +msgstr "Supports" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/PrintConfig.cpp:1904 -#: src/libslic3r/GCode/PreviewData.cpp:173 +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/libslic3r/PrintConfig.cpp:1991 msgid "Support material interface" msgstr "Interface des supports" -#: src/libslic3r/PrintConfig.cpp:1957 +#: src/libslic3r/PrintConfig.cpp:2044 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:1877 +#: src/libslic3r/PrintConfig.cpp:1964 msgid "Support material/raft interface extruder" msgstr "Extrudeur pour l'interface des supports/du radeau" -#: src/libslic3r/PrintConfig.cpp:1851 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Support material/raft/skirt extruder" msgstr "Extrudeur pour support/raft/jupe" -#: src/slic3r/GUI/Plater.cpp:423 src/libslic3r/PrintConfig.cpp:1815 -#: src/libslic3r/PrintConfig.cpp:2423 +#: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "Support on build plate only" msgstr "Support sur le plateau uniquement" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:991 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888 msgid "Support parameter change" msgstr "Changement des paramètres de support" -#: src/slic3r/GUI/Tab.cpp:3406 +#: src/slic3r/GUI/Tab.cpp:3613 msgid "Support pillar" msgstr "Pilier de support" -#: src/libslic3r/PrintConfig.cpp:2407 +#: src/libslic3r/PrintConfig.cpp:2658 msgid "Support pillar connection mode" msgstr "Mode de connexion du pilier de support" -#: src/libslic3r/PrintConfig.cpp:2397 +#: src/libslic3r/PrintConfig.cpp:2648 msgid "Support pillar diameter" msgstr "Diamètre du pilier de support" -#: src/libslic3r/PrintConfig.cpp:2499 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/libslic3r/PrintConfig.cpp:2764 msgid "Support points density" msgstr "Densité des points de support" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1196 msgid "Support points edit" msgstr "Éditer les points de support" -#: src/slic3r/GUI/GUI_ObjectList.cpp:78 src/slic3r/GUI/GUI_ObjectList.cpp:519 -#: src/slic3r/GUI/Plater.cpp:418 src/slic3r/GUI/Tab.cpp:3397 -#: src/slic3r/GUI/Tab.cpp:3398 src/libslic3r/PrintConfig.cpp:2363 -#: src/libslic3r/PrintConfig.cpp:2370 src/libslic3r/PrintConfig.cpp:2379 -#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2398 -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2431 -#: src/libslic3r/PrintConfig.cpp:2442 src/libslic3r/PrintConfig.cpp:2452 -#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2471 -#: src/libslic3r/PrintConfig.cpp:2480 src/libslic3r/PrintConfig.cpp:2490 -#: src/libslic3r/PrintConfig.cpp:2500 src/libslic3r/PrintConfig.cpp:2508 +#: 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 msgid "Supports" msgstr "Supports" -#: src/slic3r/GUI/Plater.cpp:1018 +#: src/slic3r/GUI/Plater.cpp:1194 msgid "supports and pad" msgstr "supports et socle" -#: src/libslic3r/PrintConfig.cpp:1043 +#: src/libslic3r/PrintConfig.cpp:1092 msgid "Supports remaining times" msgstr "Temps de support restant" -#: src/libslic3r/PrintConfig.cpp:1053 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Supports stealth mode" msgstr "Supporte le mode silencieux" -#: src/slic3r/GUI/Preferences.cpp:76 +#: 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/Preferences.cpp:87 msgid "Suppress \" - default - \" presets" msgstr "Supprimer les préréglages \" - par défaut - \"" -#: src/slic3r/GUI/Preferences.cpp:78 +#: src/slic3r/GUI/Preferences.cpp:89 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:677 +#: src/slic3r/GUI/MainFrame.cpp:826 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +#: src/slic3r/GUI/DoubleSlider.cpp:1144 +msgid "Switch code to Change extruder" +msgstr "Code de changement pour Changer l'extrudeur" + +#: src/slic3r/GUI/DoubleSlider.cpp:1179 +msgid "Switch code to Color change (%1%) for:" +msgstr "Code de changement pour Changer de couleur (%1%) pour :" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Switch to 3D" msgstr "Basculer vers la 3D" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1376 msgid "Switch to editing mode" msgstr "Basculer vers le mode édition" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Switch to Preview" msgstr "Basculer vers la Prévisualisation" -#: src/slic3r/GUI/wxExtensions.cpp:2412 -#, possible-c-format +#: src/slic3r/GUI/wxExtensions.cpp:703 +#, c-format msgid "Switch to the %s mode" msgstr "Basculer vers le mode %s" -#: src/slic3r/GUI/GUI_App.cpp:752 -msgid "Switching the language will trigger application restart.\nYou will lose content of the plater." +#: src/slic3r/GUI/GUI_App.cpp:882 +msgid "" +"Switching the language will trigger application restart.\n" +"You 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:327 -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/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 ?" -#: src/libslic3r/PrintConfig.cpp:1949 +#: src/slic3r/GUI/Tab.cpp:1014 +msgid "symbolic profile name" +msgstr "nom de profil symbolique" + +#: src/libslic3r/PrintConfig.cpp:2036 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:1947 +#: src/libslic3r/PrintConfig.cpp:2034 msgid "Synchronize with object layers" msgstr "Synchroniser avec les couches de l'objet" -#: src/slic3r/GUI/MainFrame.cpp:557 +#: src/slic3r/GUI/MainFrame.cpp:699 msgid "System &Info" msgstr "&Informations sur le Système" -#: src/slic3r/GUI/SysInfoDialog.cpp:44 +#: src/slic3r/GUI/SysInfoDialog.cpp:78 msgid "System Information" msgstr "Informations sur le Système" -#: src/slic3r/GUI/Preset.cpp:930 src/slic3r/GUI/Preset.cpp:970 -#: src/slic3r/GUI/Preset.cpp:1035 src/slic3r/GUI/Preset.cpp:1067 -#: src/slic3r/GUI/PresetBundle.cpp:1488 src/slic3r/GUI/PresetBundle.cpp:1553 +#: 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 msgid "System presets" msgstr "Préréglages système" -#: src/slic3r/GUI/GUI_App.cpp:662 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Take Configuration &Snapshot" msgstr "Capturer un in&stantané de la configuration" -#: src/slic3r/GUI/GUI_App.cpp:697 +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Taking configuration snapshot" msgstr "Instantané de la configuration en cours" -#: src/libslic3r/PrintConfig.cpp:1980 +#: src/slic3r/GUI/Tab.cpp:1433 src/libslic3r/PrintConfig.cpp:2067 msgid "Temperature" msgstr "Température" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1804 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:1726 +#: src/libslic3r/PrintConfig.cpp:1803 msgid "Temperature variation" msgstr "Variation de température" -#: src/slic3r/GUI/ConfigWizard.cpp:592 +#: src/slic3r/GUI/ConfigWizard.cpp:1017 msgid "Temperatures" msgstr "Températures" -#: src/slic3r/GUI/Tab.cpp:1700 src/slic3r/GUI/Tab.cpp:1888 +#: src/slic3r/GUI/Tab.cpp:1677 src/slic3r/GUI/Tab.cpp:1915 msgid "Test" msgstr "Test" -#: src/slic3r/GUI/BedShapeDialog.cpp:171 +#: src/slic3r/GUI/BedShapeDialog.cpp:172 msgid "Texture" msgstr "Texture" -#: src/slic3r/GUI/FirmwareDialog.cpp:530 -#, possible-c-format +#: src/slic3r/GUI/ConfigManipulation.cpp:208 +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 msgid "The %s device could not have been found" msgstr "L'équipement %s n'a pas pu être trouvé" -#: src/slic3r/GUI/FirmwareDialog.cpp:417 -#, 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/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 ..." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 -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." +#: src/slic3r/GUI/Tab.cpp:976 +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." 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:2462 +#: src/libslic3r/PrintConfig.cpp:2726 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:670 +#: src/libslic3r/SLAPrint.cpp:631 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:457 +#: src/libslic3r/PrintConfig.cpp:489 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:955 +#: src/libslic3r/PrintConfig.cpp:1003 msgid "The extruder to use when printing infill." msgstr "L'extrudeur à utiliser pour imprimer le remplissage." -#: src/libslic3r/PrintConfig.cpp:1341 +#: src/libslic3r/PrintConfig.cpp:1410 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:1669 +#: src/libslic3r/PrintConfig.cpp:1738 msgid "The extruder to use when printing solid infill." msgstr "L'extrudeur à utiliser pour imprimer les remplissages solides." -#: src/libslic3r/PrintConfig.cpp:1879 +#: src/libslic3r/PrintConfig.cpp:1966 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:1853 +#: src/libslic3r/PrintConfig.cpp:1939 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:695 +#: src/libslic3r/PrintConfig.cpp:727 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:3105 +#: src/libslic3r/PrintConfig.cpp:3494 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:1054 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "The firmware supports stealth mode" msgstr "Le firmware est compatible avec le mode silencieux" -#: src/libslic3r/PrintConfig.cpp:351 +#: src/libslic3r/PrintConfig.cpp:120 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:2726 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2813 src/slic3r/GUI/Tab.cpp:3279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3820 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3457 msgid "the following characters are not allowed:" msgstr "les caractères suivant ne sont pas autorisés :" -#: src/slic3r/GUI/Tab.cpp:3311 +#: src/slic3r/GUI/ConfigWizard.cpp:1830 +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 +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 msgid "the following suffix is not allowed:" msgstr "le suffixe suivant n'est pas autorisé :" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2871 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:2453 +#: src/libslic3r/PrintConfig.cpp:2704 msgid "The height of the pillar base cone" msgstr "La hauteur du cône de la base du pilier" -#: src/libslic3r/PrintConfig.cpp:2481 +#: src/slic3r/GUI/DoubleSlider.cpp:1922 +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 +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 +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 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:2472 +#: src/libslic3r/PrintConfig.cpp:2736 msgid "The max length of a bridge" msgstr "La longueur maximum d'un pont" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2714 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:2176 +#: src/libslic3r/PrintConfig.cpp:185 +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 +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 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:1433 +#: src/libslic3r/PrintConfig.cpp:1503 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:2259 -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: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/slic3r/GUI/GUI_App.cpp:831 +#: 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:1768 +#: src/libslic3r/PrintConfig.cpp:1846 msgid "The printer multiplexes filaments into a single hot end." msgstr "L'imprimante multiplexe les filaments vers une seule tête d'extrusion." -#: src/slic3r/GUI/BedShapeDialog.cpp:342 +#: 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 "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 +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 msgid "The selected file contains no geometry." msgstr "Le fichier sélectionné ne contient aucune géométrie." -#: src/slic3r/GUI/BedShapeDialog.cpp:346 +#: src/slic3r/GUI/BedShapeDialog.cpp:517 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:2271 +#: src/slic3r/GUI/Plater.cpp:2970 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:1737 src/slic3r/GUI/Plater.cpp:2279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2270 src/slic3r/GUI/Plater.cpp:2978 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:410 -msgid "The selected project is no more available" -msgstr "Le projet sélectionné n'est plus disponible" +#: 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/libslic3r/PrintConfig.cpp:2570 +#: 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/libslic3r/PrintConfig.cpp:2846 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:1544 +#: src/libslic3r/PrintConfig.cpp:1614 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:1536 +#: src/libslic3r/PrintConfig.cpp:1606 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/libslic3r/Print.cpp:1187 +#: 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:1189 +#: src/libslic3r/Print.cpp:1244 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:2900 +#: src/slic3r/GUI/Tab.cpp:3068 msgid "The supplied name is empty. It can't be saved." msgstr "Le nom proposé est vide. Sauvegarde impossible." -#: src/slic3r/GUI/Tab.cpp:3287 +#: src/slic3r/GUI/Tab.cpp:3465 msgid "The supplied name is not available." msgstr "Le nom proposé n'est pas disponible." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2725 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2812 src/slic3r/GUI/Tab.cpp:3278 -#: src/slic3r/GUI/Tab.cpp:3282 +#: 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 msgid "The supplied name is not valid;" msgstr "Le nom fourni n'est pas valide ;" -#: src/libslic3r/Print.cpp:1268 +#: src/libslic3r/Print.cpp:1222 msgid "The supplied settings will cause an empty print." msgstr "Les réglages fournis vont entraîner une impression vide." -#: src/libslic3r/PrintConfig.cpp:2524 +#: src/libslic3r/PrintConfig.cpp:2789 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:1825 +#: src/libslic3r/PrintConfig.cpp:1911 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:2429 -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/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/libslic3r/Print.cpp:1306 +#: src/libslic3r/Print.cpp:1268 +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/libslic3r/Print.cpp:1400 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:1200 +#: src/libslic3r/Print.cpp:1270 +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:1202 +#: src/libslic3r/Print.cpp:1264 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:1225 +#: src/libslic3r/Print.cpp:1293 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:1227 +#: src/libslic3r/Print.cpp:1295 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:1229 +#: src/libslic3r/Print.cpp:1297 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:1223 +#: src/libslic3r/Print.cpp:1291 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:1155 +#: src/libslic3r/Print.cpp:1257 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:1258 -msgid "The Wipe tower is only supported if all objects have the same layer height profile" -msgstr "La tour de nettoyage est uniquement supportée si tous les objets ont le même profil de hauteur de couche" +#: src/libslic3r/Print.cpp:1339 +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/slic3r/GUI/UpdateDialogs.cpp:127 -#, possible-c-format +#: src/libslic3r/SLAPrintSteps.cpp:621 +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: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: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/UpdateDialogs.cpp:225 +#, c-format msgid "This %s version: %s" msgstr "Version de ce %s : %s" -#: src/libslic3r/PrintConfig.cpp:140 +#: 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/libslic3r/PrintConfig.cpp:165 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:2057 -msgid "This custom code is inserted at every extruder change. If you don't leave this empty, you are expected to take care of the toolchange yourself - PrusaSlicer will not output any other G-code to change the filament. You can use placeholder variables for all Slic3r settings as well as [previous_extruder] and [next_extruder], so e.g. the standard toolchange command can be scripted as T[next_extruder]." -msgstr "Ce code personnalisé est inséré à chaque changement d'extrudeur. Si vous ne laissez pas ce champ vide, il sera nécessaire de faire le changement d'outil vous-même - PrusaSlicer n'ajoutera pas d'autre G-code pour changer le filament. Vous pouvez utiliser des variables génériques pour tous les réglages Slic3r de même que [previous_extruder] et [next_extruder], ainsi par exemple la commande standard de changement d'outil peut être rédigée comme T[next_extruder]." - -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1081 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:129 +#: src/libslic3r/PrintConfig.cpp:154 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:2057 +#: src/libslic3r/PrintConfig.cpp:2094 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:380 +#: src/libslic3r/PrintConfig.cpp:396 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:370 +#: src/libslic3r/PrintConfig.cpp:386 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:1193 src/libslic3r/PrintConfig.cpp:1204 +#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269 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, alimentation 20 mm/s) à 5.4 mm³/s (alimentation 60 mm/s) prendra au moins 2 secondes." +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:1183 +#: src/libslic3r/PrintConfig.cpp:1248 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:2061 +#: src/libslic3r/PrintConfig.cpp:2162 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:2075 +#: src/libslic3r/PrintConfig.cpp:2176 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:2848 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3972 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:188 +#: src/libslic3r/PrintConfig.cpp:224 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:514 +#: src/libslic3r/PrintConfig.cpp:546 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:178 +#: src/libslic3r/PrintConfig.cpp:214 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:944 +#: src/libslic3r/PrintConfig.cpp:992 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:1677 +#: src/libslic3r/PrintConfig.cpp:1746 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:1718 +#: 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/slic3r/GUI/Plater.cpp:1712 -msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?\n" -msgstr "Ce fichier ne peut être chargé en mode simple. Voulez-vous basculer en mode avancé ?\n" +#: src/slic3r/GUI/Plater.cpp:2367 +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:1658 -msgid "This file contains several objects positioned at multiple heights. Instead of considering them as multiple objects, should I consider\nthis file as a single object having multiple parts?\n" -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?\n" +#: 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/FirmwareDialog.cpp:313 -#, 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/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:278 +#: src/libslic3r/PrintConfig.cpp:314 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:448 +#: src/slic3r/GUI/Plater.cpp:536 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:1468 +#: src/libslic3r/PrintConfig.cpp:1538 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:2093 +#: src/libslic3r/PrintConfig.cpp:2194 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:921 +#: src/slic3r/GUI/Tab.cpp:953 msgid "This is a default preset." msgstr "Ceci est un préréglage par défaut." -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2766 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:2528 +#: src/slic3r/GUI/Tab.cpp:2338 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:923 +#: src/slic3r/GUI/Tab.cpp:955 msgid "This is a system preset." msgstr "Ceci est un préréglage système." -#: src/libslic3r/PrintConfig.cpp:491 src/libslic3r/PrintConfig.cpp:551 +#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583 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:300 +#: src/libslic3r/PrintConfig.cpp:336 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:158 +#: src/libslic3r/PrintConfig.cpp:194 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:813 +#: src/libslic3r/PrintConfig.cpp:860 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:934 +#: src/libslic3r/PrintConfig.cpp:982 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:1331 +#: 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:1262 +#: src/libslic3r/PrintConfig.cpp:1327 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:1162 +#: src/libslic3r/PrintConfig.cpp:1227 #, no-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:1225 +#: src/libslic3r/PrintConfig.cpp:1290 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/PrintConfig.cpp:2139 +#: 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 "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 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:643 -msgid "This operation is irreversible.\nDo you want to proceed?" -msgstr "Cette opération est irréversible.\nVoulez-vous continuer?" +#: 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/libslic3r/PrintConfig.cpp:1372 +#: src/libslic3r/PrintConfig.cpp:1442 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:1287 +#: src/libslic3r/PrintConfig.cpp:1356 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:980 +#: src/libslic3r/PrintConfig.cpp:1029 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:973 +#: src/libslic3r/PrintConfig.cpp:1022 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:427 +#: src/libslic3r/PrintConfig.cpp:459 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:1648 +#: src/libslic3r/PrintConfig.cpp:1717 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:989 +#: src/libslic3r/PrintConfig.cpp:1038 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." -#: src/libslic3r/PrintConfig.cpp:57 +#: 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 "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:1153 +#: src/libslic3r/PrintConfig.cpp:1218 msgid "This setting represents the maximum speed of your fan." msgstr "Cette option représente la vitesse maximum du ventilateur." -#: src/libslic3r/PrintConfig.cpp:1216 +#: src/libslic3r/PrintConfig.cpp:1281 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:1801 +#: src/libslic3r/PrintConfig.cpp:1829 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:1786 +#: src/libslic3r/PrintConfig.cpp:1814 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:664 +#: src/libslic3r/PrintConfig.cpp:695 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:2185 +#: src/libslic3r/PrintConfig.cpp:2286 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:2132 +#: src/libslic3r/PrintConfig.cpp:2208 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:118 -#, 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.\n" -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.\n" +#: 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." -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2458 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:1994 +#: src/libslic3r/PrintConfig.cpp:2081 msgid "Threads" msgstr "Threads" -#: src/libslic3r/PrintConfig.cpp:1995 +#: src/libslic3r/PrintConfig.cpp:2082 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:2052 +#: src/slic3r/GUI/Tab.cpp:2093 msgid "Tilt" msgstr "Incliner" -#: src/slic3r/GUI/Tab.cpp:2053 +#: src/slic3r/GUI/Tab.cpp:2094 msgid "Tilt time" msgstr "Durée de l'inclinaison" @@ -6887,148 +8300,179 @@ msgstr "Durée de l'inclinaison" msgid "Time" msgstr "Durée" -#: src/libslic3r/PrintConfig.cpp:655 +#: src/libslic3r/PrintConfig.cpp:687 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:670 +#: src/libslic3r/PrintConfig.cpp:702 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:2242 +#: src/libslic3r/PrintConfig.cpp:2407 msgid "Time of the fast tilt" msgstr "Durée de l'inclinaison rapide" -#: src/libslic3r/PrintConfig.cpp:2251 +#: src/libslic3r/PrintConfig.cpp:2416 msgid "Time of the slow tilt" msgstr "Durée de l'inclinaison lente" -#: src/libslic3r/PrintConfig.cpp:610 +#: src/libslic3r/PrintConfig.cpp:641 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:916 +#: src/slic3r/GUI/Tab.cpp:966 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:2966 +#: src/slic3r/GUI/Plater.cpp:4014 msgid "To objects" msgstr "Vers les objets" -#: src/slic3r/GUI/Plater.cpp:2968 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "To parts" msgstr "Vers les parties" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:212 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:1756 +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 msgid "Toggle %c axis mirroring" msgstr "Activer la symétrie sur l'axe %c" -#: src/libslic3r/Zipper.cpp:37 +#: src/libslic3r/Zipper.cpp:34 msgid "too many files" msgstr "trop de fichiers" -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:315 -#: src/slic3r/GUI/GUI_Preview.cpp:481 src/slic3r/GUI/GUI_Preview.cpp:537 -#: src/slic3r/GUI/GUI_Preview.cpp:713 src/libslic3r/GCode/PreviewData.cpp:404 +#: src/libslic3r/SLAPrintSteps.cpp:190 +msgid "Too much 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 msgid "Tool" msgstr "Outil" -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" msgstr "Outil #" -#: src/slic3r/GUI/Tab.cpp:1973 src/libslic3r/PrintConfig.cpp:2006 +#: src/slic3r/GUI/Tab.cpp:2000 src/libslic3r/PrintConfig.cpp:2093 msgid "Tool change G-code" msgstr "G-code de changement d'outil" -#: src/slic3r/GUI/Tab.cpp:1530 +#: src/slic3r/GUI/Tab.cpp:1491 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 -#: src/slic3r/GUI/MainFrame.cpp:522 +#. 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 msgid "Top" msgstr "Haut" -#: src/libslic3r/PrintConfig.cpp:388 +#: src/slic3r/GUI/PresetHints.cpp:304 +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 msgid "Top fill pattern" msgstr "Motif de remplissage du dessus" -#: src/slic3r/GUI/PresetHints.cpp:189 +#: src/slic3r/GUI/PresetHints.cpp:323 +msgid "Top is open." +msgstr "Le haut est ouvert." + +#: src/slic3r/GUI/PresetHints.cpp:317 +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 msgid "top solid infill" msgstr "remplissage solide supérieur" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/PrintConfig.cpp:2017 -#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/GCode/PreviewData.cpp:168 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117 msgid "Top solid infill" msgstr "Remplissage solide supérieur" -#: src/libslic3r/PrintConfig.cpp:2046 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Top solid layers" msgstr "Couches supérieures solides" -#: src/slic3r/GUI/MainFrame.cpp:522 +#: src/slic3r/GUI/MainFrame.cpp:662 msgid "Top View" msgstr "Vue du Dessus" -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +#: src/slic3r/GUI/WipeTowerDialog.cpp:285 msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded." msgstr "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." -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 msgid "Total rammed volume" msgstr "Volume total expulsé" -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" msgstr "Durée totale de l'expulsion" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:252 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 msgid "Translate" msgstr "Traduire" -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/PrintConfig.cpp:2051 +#: src/slic3r/GUI/Mouse3DController.cpp:300 +#: src/slic3r/GUI/Mouse3DController.cpp:317 +msgid "Translation" +msgstr "Translation" + +#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152 msgid "Travel" msgstr "Déplacement" -#: src/libslic3r/PrintConfig.cpp:798 +#: src/libslic3r/PrintConfig.cpp:845 msgid "Triangles" msgstr "Triangles" -#: src/libslic3r/PrintConfig.cpp:3059 +#: src/libslic3r/PrintConfig.cpp:3448 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:1397 +#: src/libslic3r/PrintConfig.cpp:1467 msgid "Type of the printer." msgstr "Type d'imprimante." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2549 +#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3553 msgid "Type:" msgstr "Type :" -#: src/libslic3r/Zipper.cpp:35 +#: src/slic3r/GUI/Plater.cpp:3428 +msgid "Unable to reload:" +msgstr "Impossible de recharger :" + +#: src/libslic3r/Zipper.cpp:32 msgid "undefined error" msgstr "erreur non définie" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3609 -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/MainFrame.cpp:581 msgid "Undo" msgstr "Annuler" -#: src/slic3r/GUI/GLCanvas3D.cpp:3497 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 +#, c-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Annuler %1$d Action" +msgstr[1] "Annuler %1$d Actions" -#: src/slic3r/GUI/GLCanvas3D.cpp:3479 +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 msgid "Undo History" msgstr "Annuler Historique" -#: src/libslic3r/Zipper.cpp:59 +#: src/libslic3r/Zipper.cpp:56 msgid "unexpected decompressed size" msgstr "volume de décompression inattendu" @@ -7036,96 +8480,111 @@ msgstr "volume de décompression inattendu" msgid "Unknown" msgstr "Inconnu" -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 +#: 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 msgid "Unknown error occured" msgstr "Une erreur inconnue s'est produite" -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 msgid "unloaded" msgstr "déchargé" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:623 msgid "Unloading speed" msgstr "Vitesse de déchargement" -#: src/libslic3r/PrintConfig.cpp:600 +#: src/libslic3r/PrintConfig.cpp:632 msgid "Unloading speed at the start" msgstr "Vitesse de déchargement au démarrage" -#: src/slic3r/GUI/Tab.cpp:3069 +#: src/slic3r/GUI/Tab.cpp:3256 msgid "UNLOCKED LOCK" msgstr "CADENAS OUVERT" -#: src/slic3r/GUI/Tab.cpp:3362 -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/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:3377 -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/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/GUI_Preview.cpp:245 +#: 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/GUI_Preview.cpp:255 msgid "Unretractions" msgstr "Dérétractation" -#: src/slic3r/GUI/Tab.cpp:2785 +#: src/slic3r/GUI/Tab.cpp:2947 msgid "Unsaved Changes" msgstr "Modifications Non Sauvegardés" -#: src/slic3r/GUI/GUI_App.cpp:790 +#: src/slic3r/GUI/GUI_App.cpp:935 msgid "Unsaved Presets" msgstr "Préréglages Non Sauvegardés" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -msgid "Unselect gizmo / Clear selection" -msgstr "Désélectionner le gizmo / Effacer la sélection" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Unselect gizmo or clear selection" +msgstr "Désélectionner le Gizmo ou supprimer la sélection" -#: src/libslic3r/Zipper.cpp:63 +#: src/libslic3r/Zipper.cpp:60 msgid "unsupported central directory size" msgstr "volume du répertoire central non supporté" -#: src/libslic3r/Zipper.cpp:43 +#: src/libslic3r/Zipper.cpp:40 msgid "unsupported encryption" msgstr "cryptage non supporté" -#: src/libslic3r/Zipper.cpp:45 +#: src/libslic3r/Zipper.cpp:42 msgid "unsupported feature" msgstr "fonction non supportée" -#: src/libslic3r/Zipper.cpp:41 +#: src/libslic3r/Zipper.cpp:38 msgid "unsupported method" msgstr "méthode non supportée" -#: src/libslic3r/Zipper.cpp:53 +#: src/libslic3r/Zipper.cpp:50 msgid "unsupported multidisk archive" msgstr "archive multidisque non supportée" -#: src/slic3r/GUI/GUI_App.cpp:305 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:292 msgid "Unsupported OpenGL version" msgstr "Version d'OpenGL non supportée" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2414 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3420 msgid "Unsupported selection" msgstr "Sélection non supportée" -#: src/libslic3r/GCode/PreviewData.cpp:495 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:955 +#, c-format msgid "up to %.2f mm" msgstr "jusqu'à %.2f mm" -#: src/slic3r/GUI/UpdateDialogs.cpp:30 +#: src/slic3r/GUI/UpdateDialogs.cpp:38 msgid "Update available" msgstr "Mise à jour disponible" -#: src/slic3r/GUI/ConfigWizard.cpp:419 src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:779 src/slic3r/GUI/Preferences.cpp:80 msgid "Update built-in Presets automatically" msgstr "Mettre à jour automatiquement les Préréglages intégrés" -#: src/slic3r/GUI/ConfigWizard.cpp:401 +#: src/slic3r/GUI/ConfigWizard.cpp:761 msgid "Updates" msgstr "Mises à jour" -#: src/slic3r/GUI/ConfigWizard.cpp:426 +#: src/slic3r/GUI/ConfigWizard.cpp:786 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." @@ -7133,36 +8592,44 @@ 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:685 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Upload a firmware image into an Arduino based printer" msgstr "Charger un firmware dans une imprimante basée sur un Arduino" +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "Téléchargement non activé sur la carte FlashAir." + #: src/slic3r/GUI/PrintHostDialogs.cpp:33 msgid "Upload to Printer Host with the following filename:" msgstr "Envoyer vers l'Hôte d'Imprimante avec le nom de fichier suivant :" -#: src/slic3r/GUI/PrintHostDialogs.cpp:229 +#: src/slic3r/GUI/PrintHostDialogs.cpp:230 msgid "Uploading" msgstr "Téléchargement" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 msgid "Upper Layer" msgstr "Couche du Haut" -#: src/slic3r/GUI/Tab.cpp:1873 +#: src/slic3r/GUI/Tab.cpp:1900 msgid "USB/Serial connection" msgstr "Connexion USB/Série" -#: src/libslic3r/PrintConfig.cpp:1592 +#: 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/Preferences.cpp:117 +#: src/slic3r/GUI/DoubleSlider.cpp:1147 +msgid "Use another extruder" +msgstr "Utiliser un autre extrudeur" + +#: src/slic3r/GUI/Preferences.cpp:143 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:2060 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Use firmware retraction" msgstr "Utiliser la rétraction du firmware" @@ -7170,51 +8637,59 @@ msgstr "Utiliser la rétraction du firmware" 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/libslic3r/PrintConfig.cpp:2515 +#: src/slic3r/GUI/Preferences.cpp:126 +msgid "Use free camera" +msgstr "Utiliser la caméra libre" + +#: src/libslic3r/PrintConfig.cpp:2780 msgid "Use pad" msgstr "Utiliser un socle" -#: src/slic3r/GUI/Preferences.cpp:110 +#: src/slic3r/GUI/Preferences.cpp:119 msgid "Use perspective camera" msgstr "Utiliser l'appareil photo en perspective" -#: src/libslic3r/PrintConfig.cpp:2067 +#: src/libslic3r/PrintConfig.cpp:2168 msgid "Use relative E distances" msgstr "Utiliser des valeurs E relatives" -#: src/slic3r/GUI/Preferences.cpp:103 +#: src/slic3r/GUI/Preferences.cpp:104 msgid "Use Retina resolution for the 3D scene" msgstr "Utiliser la résolution Retina pour la scène 3D" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:540 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:1807 +#: src/libslic3r/PrintConfig.cpp:1893 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:2074 +#: src/libslic3r/PrintConfig.cpp:2175 msgid "Use volumetric E" msgstr "E Volumétrique" -#: src/slic3r/GUI/Plater.cpp:214 +#: src/slic3r/GUI/DoubleSlider.cpp:1171 +msgid "used" +msgstr "utilisé" + +#: src/slic3r/GUI/Plater.cpp:237 msgid "Used Filament (g)" msgstr "Filament Utilisé (g)" -#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:1041 +#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1229 msgid "Used Filament (m)" msgstr "Filament Utilisé (m)" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:236 msgid "Used Filament (mm³)" msgstr "Filament Utilisé (mm³)" -#: src/slic3r/GUI/Plater.cpp:1015 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "Used Material (ml)" msgstr "Matériau Utilisé (ml)" -#: src/slic3r/GUI/Plater.cpp:215 +#: src/slic3r/GUI/Plater.cpp:238 msgid "Used Material (unit)" msgstr "Matériau Utilisé (unité)" @@ -7222,409 +8697,495 @@ msgstr "Matériau Utilisé (unité)" msgid "User" msgstr "Utilisateur" -#: src/slic3r/GUI/Preset.cpp:974 src/slic3r/GUI/Preset.cpp:1071 -#: src/slic3r/GUI/PresetBundle.cpp:1558 +#: src/slic3r/GUI/Preset.cpp:1168 src/slic3r/GUI/Preset.cpp:1288 +#: src/slic3r/GUI/PresetBundle.cpp:1677 msgid "User presets" msgstr "Préréglages utilisateur" -#: src/libslic3r/Zipper.cpp:93 +#: src/libslic3r/Zipper.cpp:90 msgid "validation failed" msgstr "échec de la validation" -#: src/slic3r/GUI/ButtonsDescription.cpp:41 +#: src/slic3r/GUI/ButtonsDescription.cpp:36 msgid "Value is the same as the system value" msgstr "La valeur est identique à la valeur du système" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:53 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:2151 +#: src/slic3r/GUI/Tab.cpp:2202 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:2157 +#: src/slic3r/GUI/Tab.cpp:2208 msgid "Values in this column are for Stealth mode" msgstr "Les valeurs de cette colonne sont pour le mode Silencieux" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4573 +msgid "Variable layer height" +msgstr "Hauteur de couche variable" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1709 +msgid "Variable layer height - Adaptive" +msgstr "Hauteur de couche variable - Adaptatif" + +#: src/slic3r/GUI/GLCanvas3D.cpp:599 +msgid "Variable layer height - Manual edit" +msgstr "Hauteur de couche variable - Modification manuelle" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1701 +msgid "Variable layer height - Reset" +msgstr "Hauteur de couche variable - Réinitialisation" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1717 +msgid "Variable layer height - Smooth all" +msgstr "Hauteur de couche variable - Tout lisser" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "variants" msgstr "variantes" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 src/slic3r/GUI/Tab.cpp:921 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:971 msgid "vendor" msgstr "fabriquant" -#: src/libslic3r/PrintConfig.cpp:880 +#: src/slic3r/GUI/ConfigWizard.cpp:565 +msgid "Vendor:" +msgstr "Fournisseur :" + +#: src/libslic3r/PrintConfig.cpp:928 msgid "Verbose G-code" msgstr "G-code commenté" -#: src/slic3r/GUI/AboutDialog.cpp:67 src/slic3r/GUI/MainFrame.cpp:53 +#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64 msgid "Version" msgstr "Version" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 msgid "version" msgstr "version" -#: src/slic3r/GUI/Tab.cpp:1002 +#: src/slic3r/GUI/Tab.cpp:1053 msgid "Vertical shells" msgstr "Parois verticales" -#: src/slic3r/GUI/GUI_Preview.cpp:209 +#: src/slic3r/GUI/GUI_Preview.cpp:218 msgid "View" msgstr "Vue" -#: src/libslic3r/SLAPrint.cpp:857 src/libslic3r/SLAPrint.cpp:867 -#: src/libslic3r/SLAPrint.cpp:915 +#: src/slic3r/GUI/ConfigWizard.cpp:813 +msgid "View mode" +msgstr "Mode de vue" + +#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422 +#: src/libslic3r/SLAPrintSteps.cpp:461 msgid "Visualizing supports" msgstr "Visualisation des supports" -#: src/slic3r/GUI/Plater.cpp:138 +#: src/slic3r/GUI/Plater.cpp:161 msgid "Volume" msgstr "Volume" -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 msgid "Volume to purge (mm³) when the filament is being" msgstr "Volume à purger (mm³) lorsque le filament est" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1010 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 msgid "Volumes in Object reordered" msgstr "Volumes dans l'Objet réorganisés" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Volumetric" msgstr "Volumétrique" -#: src/slic3r/GUI/Tab.cpp:1800 +#: src/slic3r/GUI/Tab.cpp:1591 msgid "Volumetric flow hints not available" msgstr "Indications du débit volumétrique non disponible" -#: src/slic3r/GUI/GUI_Preview.cpp:216 +#: src/slic3r/GUI/GUI_Preview.cpp:226 msgid "Volumetric flow rate" msgstr "Débit volumétrique" -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "Débit volumétrique (mm3/s)" +#: src/libslic3r/GCode/PreviewData.cpp:355 +msgid "Volumetric flow rate (mm³/s)" +msgstr "Débit volumétrique (mm³/s)" #: src/slic3r/GUI/RammingChart.cpp:81 msgid "Volumetric speed" msgstr "Vitesse volumétrique" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1168 src/slic3r/GUI/GUI.cpp:283 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 +#: src/libslic3r/PrintConfig.cpp:2915 +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 msgid "Warning" msgstr "Alerte" -#: src/slic3r/GUI/ConfigWizard.cpp:294 +#: src/slic3r/GUI/ConfigWizard.cpp:431 msgid "Welcome" msgstr "Bienvenue" -#: src/slic3r/GUI/ConfigWizard.cpp:296 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:427 +#, c-format msgid "Welcome to the %s Configuration Assistant" msgstr "Bienvenue dans l'Assistant de Configuration de %s" -#: src/slic3r/GUI/ConfigWizard.cpp:298 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:429 +#, c-format msgid "Welcome to the %s Configuration Wizard" msgstr "Bienvenue dans l'Assistant de Configuration de %s" -#: src/slic3r/GUI/Preferences.cpp:86 +#: src/slic3r/GUI/Preferences.cpp:97 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:223 +#: src/slic3r/GUI/PresetHints.cpp:224 msgid "when printing" msgstr "pendant l'impression des" -#: src/libslic3r/PrintConfig.cpp:217 +#: src/libslic3r/PrintConfig.cpp:253 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:269 +#: src/libslic3r/PrintConfig.cpp:305 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:843 +#: src/libslic3r/PrintConfig.cpp:891 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:1483 +#: src/libslic3r/PrintConfig.cpp:1553 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:1475 +#: src/libslic3r/PrintConfig.cpp:1545 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:1347 +#: src/libslic3r/PrintConfig.cpp:1391 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:1173 +#: src/libslic3r/PrintConfig.cpp:1238 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:1527 +#: src/libslic3r/PrintConfig.cpp:1597 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:1519 +#: src/libslic3r/PrintConfig.cpp:1589 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:3076 +#: src/slic3r/GUI/Tab.cpp:3263 msgid "WHITE BULLET" msgstr "PUCE BLANCHE" -#: src/slic3r/GUI/Tab.cpp:3365 +#: src/slic3r/GUI/Tab.cpp:3285 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:3111 +#: src/slic3r/GUI/Tab.cpp:3288 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:3126 +#: src/slic3r/GUI/Tab.cpp:3303 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:214 src/libslic3r/PrintConfig.cpp:2137 +#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238 msgid "Width" msgstr "Largeur" -#: src/libslic3r/GCode/PreviewData.cpp:398 +#: src/libslic3r/GCode/PreviewData.cpp:349 msgid "Width (mm)" msgstr "Largeur (mm)" -#: src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2640 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:2138 +#: src/libslic3r/PrintConfig.cpp:2239 msgid "Width of a wipe tower" msgstr "Largeur d'une tour de nettoyage" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2891 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:2203 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Width of the display" msgstr "Largeur de l'affichage" -#: src/slic3r/GUI/PresetHints.cpp:47 +#: src/slic3r/GUI/PresetHints.cpp:48 msgid "will always run at %1%%%" msgstr "fonctionnera toujours à %1%%%" -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:55 msgid "will be turned off." msgstr "sera désactivé." -#: src/libslic3r/PrintConfig.cpp:2276 +#: src/libslic3r/PrintConfig.cpp:2441 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:2160 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "Wipe into this object" msgstr "Nettoyer dans cet objet" -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2253 msgid "Wipe into this object's infill" msgstr "Nettoyer dans le remplissage de cet objet" -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:90 -#: src/slic3r/GUI/GUI_ObjectList.cpp:564 src/libslic3r/PrintConfig.cpp:2202 -#: src/libslic3r/PrintConfig.cpp:2210 +#: 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 msgid "Wipe options" msgstr "Options de nettoyage" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/slic3r/GUI/Tab.cpp:1130 -#: src/libslic3r/GCode/PreviewData.cpp:174 +#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1191 +#: src/libslic3r/ExtrusionEntity.cpp:321 msgid "Wipe tower" msgstr "Tour de nettoyage" -#: src/slic3r/GUI/Plater.cpp:1043 src/slic3r/GUI/Plater.cpp:1058 +#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245 msgid "wipe tower" msgstr "tour de nettoyage" -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +#: src/slic3r/GUI/ConfigManipulation.cpp:120 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 +msgid "Wipe Tower" +msgstr "Tour de Nettoyage" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" msgstr "Tour de nettoyage - Ajustement du volume de purge" -#: src/slic3r/GUI/Tab.cpp:1664 +#: src/slic3r/GUI/Tab.cpp:1488 msgid "Wipe tower parameters" msgstr "Paramètres de la tour de nettoyage" -#: src/libslic3r/PrintConfig.cpp:2144 +#: src/libslic3r/PrintConfig.cpp:2245 msgid "Wipe tower rotation angle" msgstr "Angle de rotation de la tour de nettoyage" -#: src/libslic3r/PrintConfig.cpp:2170 +#: src/libslic3r/PrintConfig.cpp:2246 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:2092 +#: src/libslic3r/PrintConfig.cpp:2193 msgid "Wipe while retracting" msgstr "Nettoyer lors des rétractions" -#: src/slic3r/GUI/PresetHints.cpp:224 +#: src/slic3r/GUI/PresetHints.cpp:225 msgid "with a volumetric rate" msgstr "avec un débit volumétrique" -#: src/libslic3r/PrintConfig.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1530 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:1969 +#: src/libslic3r/PrintConfig.cpp:2056 msgid "With sheath around the support" msgstr "Avec une enveloppe autour du support" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:40 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:83 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 msgid "World coordinates" msgstr "Les coordonnées mondiales" -#: src/slic3r/GUI/UpdateDialogs.cpp:76 -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/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 :" -#: src/libslic3r/Zipper.cpp:95 +#: src/libslic3r/Zipper.cpp:92 msgid "write calledback failed" msgstr "échec de l'écriture du rappel" -#: src/libslic3r/PrintConfig.cpp:2993 +#: src/libslic3r/PrintConfig.cpp:3382 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:148 +#: src/slic3r/Utils/Duet.cpp:131 msgid "Wrong password" msgstr "Mauvais mot de passe" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2225 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:1793 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "XY separation between an object and its support" -msgstr "Séparation XY entre un objet et son support" +msgstr "Séparation XY entre un objet et ses supports" -#: src/libslic3r/PrintConfig.cpp:1795 +#: src/libslic3r/PrintConfig.cpp:1881 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 son support. 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." +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:2174 +#: src/libslic3r/PrintConfig.cpp:2275 msgid "XY Size Compensation" msgstr "Compensation de Taille XY" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2232 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:992 +#: src/slic3r/GUI/Plater.cpp:1170 msgid "Yes" msgstr "Oui" -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1317 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:557 +#: src/libslic3r/PrintConfig.cpp:589 msgid "You can put your notes regarding the filament here." msgstr "Vous pouvez saisir vos remarques concernant le filament ici." -#: src/libslic3r/PrintConfig.cpp:1403 +#: src/libslic3r/PrintConfig.cpp:1473 msgid "You can put your notes regarding the printer here." msgstr "Vous pouvez saisir ici vos observations concernant l'imprimante." -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2579 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:324 +#: src/libslic3r/PrintConfig.cpp:360 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:1295 +#: src/libslic3r/PrintConfig.cpp:1364 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:2538 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3546 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:2243 -msgid "You can't load SLA project if there is at least one multi-part object on the bed" -msgstr "Vous le pouvez pas charger le projet SLA s'il y a au moins un objet multi-parties sur le lit" - -#: src/slic3r/GUI/Plater.cpp:1746 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:2390 +#, 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/GUI_ObjectManipulation.cpp:565 +#: src/slic3r/GUI/Plater.cpp:2311 +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 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/GUI_App.cpp:300 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:287 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." -#: src/slic3r/GUI/Preferences.cpp:130 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +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 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:2415 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectList.cpp:3421 +#, c-format msgid "You started your selection with %s Item." msgstr "Vous avez commencé votre sélection avec l'item %s." -#: src/slic3r/GUI/MainFrame.cpp:772 +#: src/slic3r/GUI/DoubleSlider.cpp:1902 +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 +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 msgid "Your file was repaired." msgstr "Votre fichier a été réparé." -#: src/slic3r/GUI/Plater.cpp:1874 +#: src/slic3r/GUI/Plater.cpp:2528 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:2184 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "Z offset" msgstr "Décalage Z" -#: src/libslic3r/PrintConfig.cpp:2416 +#: 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: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/libslic3r/PrintConfig.cpp:2667 msgid "Zig-Zag" msgstr "Zig-Zag" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/Mouse3DController.cpp:308 +#: src/slic3r/GUI/Mouse3DController.cpp:317 +msgid "Zoom" +msgstr "Zoom" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 msgid "Zoom in" msgstr "Zoom avant" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 msgid "Zoom out" msgstr "Zoom arrière" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -msgid "Zoom to all objects in scene, if none selected" -msgstr "Zoomer sur tous les objets sur la scène, si aucun n'est sélectionné" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 msgid "Zoom to Bed" msgstr "Zoomer sur le Lit" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 -msgid "Zoom to selected object" -msgstr "Zoomer sur l'objet sélectionné" +#: 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:171 src/libslic3r/PrintConfig.cpp:733 -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:1580 -#: src/libslic3r/PrintConfig.cpp:1808 src/libslic3r/PrintConfig.cpp:1962 -#: src/libslic3r/PrintConfig.cpp:2146 src/libslic3r/PrintConfig.cpp:2463 +#: 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 msgid "°" msgstr "°" -#: src/slic3r/GUI/ConfigWizard.cpp:613 src/slic3r/GUI/ConfigWizard.cpp:627 +#: src/slic3r/GUI/ConfigWizard.cpp:1038 src/slic3r/GUI/ConfigWizard.cpp:1052 msgid "°C" msgstr "°C" diff --git a/resources/localization/it/PrusaSlicer.mo b/resources/localization/it/PrusaSlicer.mo index b8a205ca8c..cb07f0949b 100644 Binary files a/resources/localization/it/PrusaSlicer.mo and b/resources/localization/it/PrusaSlicer.mo differ diff --git a/resources/localization/it/PrusaSlicer_it.po b/resources/localization/it/PrusaSlicer_it.po index 3d0d1706db..9cb5960b97 100644 --- a/resources/localization/it/PrusaSlicer_it.po +++ b/resources/localization/it/PrusaSlicer_it.po @@ -7,87 +7,75 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: PhraseApp (phraseapp.com)\n" -#: src/slic3r/GUI/PresetHints.cpp:39 -msgid "\nDuring the other layers, fan" -msgstr "\nDurante gli altri layer, la ventola" - -#: src/slic3r/GUI/PresetHints.cpp:35 -msgid "\nIf estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%." -msgstr "\nSe 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/slic3r/GUI/MainFrame.cpp:61 +#: 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:727 +#: src/slic3r/GUI/MainFrame.cpp:872 msgid " was successfully sliced." msgstr " generato con successo." -#: src/libslic3r/PrintConfig.cpp:179 src/libslic3r/PrintConfig.cpp:745 -#: src/libslic3r/PrintConfig.cpp:1154 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2260 -#: src/libslic3r/PrintConfig.cpp:2502 +#: 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 msgid "%" msgstr "%" -#: src/libslic3r/GCode/PreviewData.cpp:504 +#: src/slic3r/GUI/GLCanvas3D.cpp:963 #, possible-c-format msgid "%.2f - %.2f mm" msgstr "%.2f - %.2f mm" -#: src/slic3r/GUI/Tab.cpp:2895 -msgid "%1% - Copy" -msgstr "%1% - Copia" - #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:2958 +#: src/slic3r/GUI/Tab.cpp:3126 msgid "%1% Preset" msgstr "%1% Preset" -#: src/slic3r/GUI/Plater.cpp:3831 +#: src/slic3r/GUI/Plater.cpp:4400 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:1282 +#: src/libslic3r/Print.cpp:1374 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:228 +#: src/slic3r/GUI/PresetHints.cpp:229 #, 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:974 +#: src/slic3r/GUI/Plater.cpp:1152 #, possible-c-format msgid "%d (%d shells)" msgstr "%d (%d di perimetri)" -#: src/slic3r/GUI/Plater.cpp:982 +#: src/slic3r/GUI/Plater.cpp:1160 #, 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:268 +#: src/slic3r/GUI/PresetHints.cpp:270 #, possible-c-format msgid "%d lines: %.2f mm" msgstr "%d linee: %.2f mm" -#: src/slic3r/GUI/MainFrame.cpp:894 +#: src/slic3r/GUI/MainFrame.cpp:1027 #, possible-c-format msgid "%d presets successfully imported." msgstr "%d preset importati correttamente." -#: src/slic3r/GUI/MainFrame.cpp:550 +#: src/slic3r/GUI/MainFrame.cpp:692 #, possible-c-format msgid "%s &Website" msgstr "%s Sito &Web" -#: src/slic3r/GUI/UpdateDialogs.cpp:113 +#: src/slic3r/GUI/UpdateDialogs.cpp:211 #, possible-c-format msgid "%s configuration is incompatible" msgstr "configurazione %s non compatibile" -#: src/slic3r/GUI/Field.cpp:136 +#: src/slic3r/GUI/Field.cpp:175 #, possible-c-format msgid "%s doesn't support percentage" msgstr "%s non supporta la percentuale" @@ -97,7 +85,7 @@ msgstr "%s non supporta la percentuale" msgid "%s error" msgstr "errore %s" -#: src/slic3r/GUI/ConfigWizard.cpp:336 +#: src/slic3r/GUI/ConfigWizard.cpp:481 #, possible-c-format msgid "%s Family" msgstr "Famiglia %s" @@ -107,258 +95,345 @@ msgstr "Famiglia %s" msgid "%s has encountered an error" msgstr "%s ha riscontrato un errore" -#: src/slic3r/GUI/GUI_App.cpp:132 +#: src/slic3r/GUI/GUI_App.cpp:138 #, 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:155 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:222 #, 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:112 +#: src/slic3r/GUI/UpdateDialogs.cpp:308 +#, possible-c-format +msgid "%s has no configuration updates available." +msgstr "Non sono disponibili aggiornamenti di configurazione per %s." + +#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 #, possible-c-format msgid "%s incompatibility" msgstr "incompatibilità %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:172 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 #, 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 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:681 +#: src/slic3r/GUI/GUI_App.cpp:820 #, possible-c-format msgid "%s View Mode" msgstr "%s Modalità Visualizzazione" -#: src/slic3r/GUI/MainFrame.cpp:563 +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#, 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 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 #, possible-c-format msgid "&About %s" msgstr "Inform&azioni su %s" -#: src/slic3r/GUI/GUI_App.cpp:769 +#: src/slic3r/GUI/GUI_App.cpp:908 msgid "&Configuration" msgstr "&Configurazione" -#: src/slic3r/GUI/GUI_App.cpp:661 +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "&Configuration Snapshots" msgstr "Istantanee di &Configurazione" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:588 msgid "&Copy" msgstr "&Copia" -#: src/slic3r/GUI/MainFrame.cpp:447 +#: src/slic3r/GUI/MainFrame.cpp:572 msgid "&Delete selected" -msgstr "&Elimina selezionati" +msgstr "Eli&mina selezionati" -#: src/slic3r/GUI/MainFrame.cpp:575 +#: src/slic3r/GUI/MainFrame.cpp:722 msgid "&Edit" -msgstr "Modifich&e" +msgstr "&Modifiche" -#: src/slic3r/GUI/MainFrame.cpp:377 +#: src/slic3r/GUI/MainFrame.cpp:506 msgid "&Export" msgstr "&Esporta" -#: src/slic3r/GUI/MainFrame.cpp:480 src/slic3r/GUI/MainFrame.cpp:604 +#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:752 msgid "&Filament Settings Tab" msgstr "Impostazioni &Filamento" -#: src/slic3r/GUI/MainFrame.cpp:574 +#: src/slic3r/GUI/MainFrame.cpp:721 msgid "&File" msgstr "&File" -#: src/slic3r/GUI/ConfigWizard.cpp:1094 +#: src/slic3r/GUI/ConfigWizard.cpp:1981 msgid "&Finish" msgstr "&Completa" -#: src/slic3r/GUI/MainFrame.cpp:580 +#: src/slic3r/GUI/MainFrame.cpp:727 msgid "&Help" msgstr "&Aiuto" -#: src/slic3r/GUI/MainFrame.cpp:359 +#: src/slic3r/GUI/MainFrame.cpp:474 msgid "&Import" msgstr "&Importa" -#: src/slic3r/GUI/MainFrame.cpp:376 +#: src/slic3r/GUI/GUI_App.cpp:822 +msgid "&Language" +msgstr "&Lingua" + +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "&New Project" msgstr "&Nuovo progetto" -#: src/slic3r/GUI/ConfigWizard.cpp:1093 +#: src/slic3r/GUI/ConfigWizard.cpp:1980 msgid "&Next >" msgstr "&Successivo>" -#: src/slic3r/GUI/MainFrame.cpp:339 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "&Open Project" msgstr "Apri Pr&ogetto" -#: src/slic3r/GUI/MainFrame.cpp:456 +#: src/slic3r/GUI/MainFrame.cpp:591 msgid "&Paste" -msgstr "Incolla" +msgstr "I&ncolla" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "&Plater Tab" msgstr "&Piano" -#: src/slic3r/GUI/GUI_App.cpp:665 +#: src/slic3r/GUI/GUI_App.cpp:804 msgid "&Preferences" msgstr "&Preferenze" -#: src/slic3r/GUI/MainFrame.cpp:409 +#: src/slic3r/GUI/MainFrame.cpp:540 msgid "&Quit" -msgstr "&Esci" +msgstr "Es&ci" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/MainFrame.cpp:583 msgid "&Redo" msgstr "&Ripeti" -#: src/slic3r/GUI/MainFrame.cpp:406 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "&Repair STL file" msgstr "&Ripara file STL" -#: src/slic3r/GUI/MainFrame.cpp:341 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "&Save Project" msgstr "&Salva Progetto" -#: src/slic3r/GUI/MainFrame.cpp:444 +#: src/slic3r/GUI/MainFrame.cpp:565 msgid "&Select all" msgstr "&Seleziona tutto" -#: src/slic3r/GUI/MainFrame.cpp:558 +#: src/slic3r/GUI/MainFrame.cpp:580 msgid "&Undo" msgstr "Ann&ulla" -#: src/slic3r/GUI/MainFrame.cpp:577 +#: src/slic3r/GUI/MainFrame.cpp:724 msgid "&View" msgstr "&Vista" -#: src/slic3r/GUI/MainFrame.cpp:576 +#: src/slic3r/GUI/MainFrame.cpp:723 msgid "&Window" -msgstr "&Finestra" +msgstr "Fines&tra" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631 +msgid "(All)" +msgstr "(Tutto)" + +#: src/libslic3r/PrintConfig.cpp:1446 msgid "(minimum)" msgstr "(minimo)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 msgid "(Re)slice" msgstr "(Ri)processa" -#: src/slic3r/GUI/MainFrame.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "(Re)Slice No&w" -msgstr "(Re)Slice Ora" +msgstr "(Re)Sli&ce Ora" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587 +msgid "(Unknown)" +msgstr "(Sconosciuto)" + +#: src/slic3r/GUI/MainFrame.cpp:790 msgid ") not found." msgstr ") non trovato." -#: src/libslic3r/PrintConfig.cpp:1857 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "0 (soluble)" msgstr "0 (solubile)" -#: src/libslic3r/PrintConfig.cpp:1858 +#: src/libslic3r/PrintConfig.cpp:1919 msgid "0.2 (detachable)" msgstr "0.2 (rimovibile)" -#: src/slic3r/GUI/MainFrame.cpp:487 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/Plater.cpp:3074 +#: src/slic3r/GUI/Plater.cpp:4097 msgid "3D editor view" -msgstr "Vista editing 3D" +msgstr "Vista modifica 3D" -#: src/libslic3r/PrintConfig.cpp:804 +#: src/libslic3r/PrintConfig.cpp:851 msgid "3D Honeycomb" msgstr "Nido d'ape 3D" -#: src/slic3r/GUI/Plater.cpp:3590 +#: src/slic3r/GUI/Mouse3DController.cpp:274 +msgid "3Dconnexion settings" +msgstr "Impostazioni 3Dconnexion" + +#: src/slic3r/GUI/Plater.cpp:5038 #, possible-c-format msgid "3MF file exported to %s" msgstr "File 3MF esportato in %s" -#: src/slic3r/GUI/ConfigWizard.cpp:1092 +#: src/slic3r/GUI/ConfigWizard.cpp:1979 msgid "< &Back" msgstr "< &Precedente" -#: src/libslic3r/PrintConfig.cpp:251 +#: src/libslic3r/PrintConfig.cpp:287 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:236 +#: src/libslic3r/PrintConfig.cpp:272 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/ConfigWizard.cpp:609 +#: src/slic3r/GUI/Tab.cpp:975 +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 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:623 +#: src/slic3r/GUI/ConfigWizard.cpp:1048 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:721 +#: 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/AboutDialog.cpp:35 +#: src/slic3r/GUI/AboutDialog.cpp:199 #, possible-c-format msgid "About %s" msgstr "Informazioni su %s" -#: src/libslic3r/GCode/PreviewData.cpp:499 +#: src/slic3r/GUI/GLCanvas3D.cpp:959 #, possible-c-format msgid "above %.2f mm" msgstr "sopra %.2f mm" -#: src/libslic3r/PrintConfig.cpp:1499 +#: src/libslic3r/PrintConfig.cpp:1569 msgid "Above Z" -msgstr "Sopra Z" +msgstr "Z Sopra" -#: src/slic3r/GUI/Tab.cpp:1103 +#: src/slic3r/GUI/Tab.cpp:1164 msgid "Acceleration control (advanced)" msgstr "Controllo Accelerazione (avanzato)" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:73 +#: src/libslic3r/PrintConfig.cpp:2925 +msgid "Accuracy" +msgstr "Precisione" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 msgid "Activate" msgstr "Attiva" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:39 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 msgid "Active" msgstr "Attivo" -#: src/slic3r/GUI/Preset.cpp:1003 src/slic3r/GUI/Tab.cpp:237 +#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1705 +msgid "active" +msgstr "attivo" + +#: src/slic3r/GUI/GLCanvas3D.cpp:267 +msgid "Adaptive" +msgstr "Adattivo" + +#: src/slic3r/GUI/Tab.cpp:241 msgid "Add a new printer" msgstr "Aggiungi una nuova stampante" -#: src/libslic3r/PrintConfig.cpp:2517 +#: src/libslic3r/PrintConfig.cpp:2782 msgid "Add a pad underneath the supported model" msgstr "Aggiungi un pad sotto il modello supportato" -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2058 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/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/DoubleSlider.cpp:991 +msgid "Add another code - Ctrl + Left click" +msgstr "Aggiungi altro codice - Ctrl + Clic sinistro" + +#: src/slic3r/GUI/DoubleSlider.cpp:992 +msgid "Add another code - Right click" +msgstr "Aggiungi un altro codice - Clic destro" + +#: src/slic3r/GUI/DoubleSlider.cpp:1477 +msgid "Add color change" +msgstr "Aggiungi cambio colore" + +#: src/slic3r/GUI/DoubleSlider.cpp:1180 +msgid "Add color change (%1%) for:" +msgstr "Aggiungi cambio colore (%1%) per:" + +#: src/slic3r/GUI/DoubleSlider.cpp:988 +msgid "Add color change - Left click" +msgstr "Aggiungi cambio colore - Clic sinistro" + +#: src/slic3r/GUI/DoubleSlider.cpp:986 +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 msgid "Add color change marker for current layer" msgstr "Aggiungi un segnale di cambio colore al layer corrente" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1662 +#: src/slic3r/GUI/DoubleSlider.cpp:1490 +msgid "Add custom G-code" +msgstr "Aggiungi un G-code personalizzato" + +#: src/slic3r/GUI/GLCanvas3D.cpp:240 +msgid "Add detail" +msgstr "Aggiungi dettagli" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:421 +msgid "Add drainage hole" +msgstr "Aggiungi foro di drenaggio" + +#: src/slic3r/GUI/DoubleSlider.cpp:984 +msgid "Add extruder change - Left click" +msgstr "Aggiungi cambio estrusore - Clic sinistro" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 +msgid "Add extruder to sequence" +msgstr "Aggiungi estrusore alla sequenza" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1993 msgid "Add Generic Subobject" msgstr "Aggiungi sotto-oggetto generico" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2584 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2613 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2896 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2925 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 msgid "Add Height Range" msgstr "Aggiungi Intervallo Altezza" -#: src/slic3r/GUI/GLCanvas3D.cpp:3463 +#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3788 +#: src/slic3r/GUI/Plater.cpp:3800 src/slic3r/GUI/Plater.cpp:3940 msgid "Add instance" msgstr "Aggiungi istanza" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Add Instance of the selected object" msgstr "Aggiungi istanza all'oggetto selezionato" @@ -366,379 +441,417 @@ msgstr "Aggiungi istanza all'oggetto selezionato" msgid "Add layer range" msgstr "Aggiungi intervallo layer" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1950 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2328 msgid "Add Layers" msgstr "Aggiungi layer" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 msgid "Add modifier" msgstr "Aggiungi modificatore" -#: src/libslic3r/PrintConfig.cpp:447 +#: src/libslic3r/PrintConfig.cpp:479 #, no-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:3516 +#: src/slic3r/GUI/Plater.cpp:3940 msgid "Add one more instance of the selected object" msgstr "Aggiungi un'altra istanza dell'oggetto selezionato" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1066 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1082 +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 msgid "Add part" msgstr "Aggiungi parte" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/DoubleSlider.cpp:1487 +msgid "Add pause print" +msgstr "Aggiungi pausa di stampa" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 msgid "Add point" msgstr "Aggiungi punto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1232 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 msgid "Add point to selection" msgstr "Aggiungi punto alla selezione" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1118 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 msgid "Add settings" msgstr "Aggiungi impostazioni" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1252 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 msgid "Add Settings Bundle for Height range" msgstr "Aggiungi Gruppo impostazioni per intervallo Altezza" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1191 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1388 msgid "Add Settings Bundle for Object" msgstr "Aggiungi gruppo di impostazioni per l'oggetto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1190 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1387 msgid "Add Settings Bundle for Sub-object" msgstr "Aggiungi Gruppi di Impostazioni per il sotto-progetto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1126 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1314 msgid "Add Settings for Layers" msgstr "Aggiungi impostazioni per i layer" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1128 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 msgid "Add Settings for Object" msgstr "Aggiungi impostazioni per l'oggetto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1315 msgid "Add Settings for Sub-object" msgstr "Aggiungi impostazioni per il sotto-oggetto" -#: src/libslic3r/PrintConfig.cpp:382 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1793 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2051 +msgid "Add Shape" +msgstr "Aggiungi Forma" + +#: src/libslic3r/PrintConfig.cpp:409 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)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1069 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1089 +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 msgid "Add support blocker" msgstr "Aggiungi blocco supporto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1068 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1086 +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 msgid "Add support enforcer" msgstr "Aggiungi rinforzo supporto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:531 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:494 msgid "Add support point" msgstr "Aggiungi punto di supporto" -#: src/slic3r/GUI/GLCanvas3D.cpp:3392 +#: src/slic3r/GUI/GLCanvas3D.cpp:4467 msgid "Add..." msgstr "Aggiungi..." -#: src/slic3r/GUI/wxExtensions.cpp:2571 -msgid "Add/Del color change" -msgstr "Aggiungi/Elimina cambio colore" +#: src/slic3r/GUI/PresetBundle.cpp:1704 +msgid "Add/Remove filaments" +msgstr "Aggiungi/Rimuovi filamenti" -#: src/slic3r/GUI/Tab.cpp:920 +#: src/slic3r/GUI/Preset.cpp:1201 +msgid "Add/Remove materials" +msgstr "Aggiungi/Rimuovi materiali" + +#: src/slic3r/GUI/Preset.cpp:1203 +msgid "Add/Remove printers" +msgstr "Aggiungi/Rimuovi stampanti" + +#: src/slic3r/GUI/Tab.cpp:970 msgid "Additional information:" msgstr "Informazioni aggiuntive:" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59 msgid "Additional Settings" msgstr "Impostazioni Aggiuntive" -#: src/slic3r/GUI/ConfigWizard.cpp:431 +#: src/slic3r/GUI/ConfigWizard.cpp:791 msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied." -msgstr "Inoltre viene creata una copia di backup dei preset prima di applicare un aggiornamento." +msgstr "Inoltre viene generata una copia di backup dei preset prima di applicare un aggiornamento." #: src/slic3r/GUI/BonjourDialog.cpp:72 msgid "Address" msgstr "Indirizzo" -#: src/slic3r/GUI/GUI_App.cpp:675 src/slic3r/GUI/GUI_ObjectList.cpp:76 -#: src/slic3r/GUI/GUI_ObjectList.cpp:517 src/slic3r/GUI/Tab.cpp:1026 -#: src/slic3r/GUI/Tab.cpp:1041 src/slic3r/GUI/Tab.cpp:1139 -#: src/slic3r/GUI/Tab.cpp:1142 src/slic3r/GUI/Tab.cpp:1515 -#: src/slic3r/GUI/Tab.cpp:1940 src/slic3r/GUI/Tab.cpp:3435 -#: src/slic3r/GUI/wxExtensions.cpp:2460 src/libslic3r/PrintConfig.cpp:72 -#: src/libslic3r/PrintConfig.cpp:187 src/libslic3r/PrintConfig.cpp:350 -#: src/libslic3r/PrintConfig.cpp:988 src/libslic3r/PrintConfig.cpp:2175 +#: 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 msgid "Advanced" msgstr "Avanzate" -#: src/slic3r/GUI/GUI_App.cpp:675 +#: src/slic3r/GUI/ConfigWizard.cpp:821 +msgid "Advanced mode" +msgstr "Modalità Avanzata" + +#: src/slic3r/GUI/GUI_App.cpp:814 msgid "Advanced View Mode" msgstr "Modalità Visualizzazione Avanzata" -#: src/slic3r/GUI/FirmwareDialog.cpp:803 +#: src/slic3r/GUI/FirmwareDialog.cpp:841 msgid "Advanced: Output log" msgstr "Avanzato: Log di output" -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:668 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:1967 src/libslic3r/PrintConfig.cpp:1031 +#: src/slic3r/GUI/Tab.cpp:1994 src/libslic3r/PrintConfig.cpp:1080 msgid "After layer change G-code" msgstr "G-code dopo il cambio layer" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3398 msgid "Align the model to the given point." msgstr "Allinea il modello al punto dato." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3397 msgid "Align XY" msgstr "Allinea XY" -#: src/libslic3r/PrintConfig.cpp:1561 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "Aligned" msgstr "Allineato" -#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:2986 +#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573 +#: src/slic3r/GUI/Tab.cpp:3174 msgid "All" msgstr "Tutto" -#: src/libslic3r/Print.cpp:1135 +#: src/libslic3r/Print.cpp:1219 msgid "All objects are outside of the print volume." msgstr "Tutti gli oggetti sono fuori dal volume di stampa." -#: src/slic3r/GUI/Plater.cpp:3298 -msgid "All objects will be removed, continue ?" +#: src/slic3r/GUI/Plater.cpp:4669 +msgid "All objects will be removed, continue?" msgstr "Saranno rimossi tutti gli oggetti, continuare?" -#: src/slic3r/GUI/ConfigWizard.cpp:188 +#: src/slic3r/GUI/ConfigWizard.cpp:289 msgid "All standard" msgstr "Tutto standard" -#: src/libslic3r/Zipper.cpp:65 +#: src/libslic3r/Zipper.cpp:62 msgid "allocation failed" msgstr "allocazione fallita" -#: src/slic3r/GUI/Plater.cpp:2939 +#: src/slic3r/GUI/Plater.cpp:3995 msgid "Along X axis" msgstr "Lungo asse X" -#: src/slic3r/GUI/Plater.cpp:2941 +#: src/slic3r/GUI/Plater.cpp:3997 msgid "Along Y axis" msgstr "Lungo asse Y" -#: src/slic3r/GUI/Plater.cpp:2943 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Along Z axis" msgstr "Lungo l'asse Z" -#: src/slic3r/GUI/ConfigWizard.cpp:122 +#: src/slic3r/GUI/ConfigWizard.cpp:222 msgid "Alternate nozzles:" msgstr "Ugelli alternativi:" -#: src/slic3r/GUI/Plater.cpp:3561 +#: src/slic3r/GUI/Plater.cpp:5002 #, possible-c-format msgid "AMF file exported to %s" msgstr "File AMF esportato in %s" -#: src/slic3r/GUI/GLCanvas3D.cpp:725 +#: 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:720 +#: 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/Tab.cpp:2781 +#: 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:2461 +#: src/slic3r/GUI/Plater.cpp:3170 msgid "Another export job is currently running." msgstr "Un altro processo di esportazione è in corso." -#: src/slic3r/GUI/Tab.cpp:926 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Any arrow" +msgstr "Qualunque freccia" + +#: src/slic3r/GUI/Tab.cpp:965 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:88 +#: src/libslic3r/PrintConfig.cpp:104 msgid "API Key / Password" msgstr "Chiave API / Password" -#: src/slic3r/GUI/GUI_App.cpp:671 +#: src/slic3r/GUI/GUI_App.cpp:810 msgid "Application preferences" msgstr "Preferenze applicazione" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:864 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1240 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1374 msgid "Apply changes" msgstr "Applica cambiamenti" -#: src/libslic3r/PrintConfig.cpp:542 src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708 msgid "approximate seconds" msgstr "secondi approssimativi" -#: src/libslic3r/PrintConfig.cpp:401 src/libslic3r/PrintConfig.cpp:807 +#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854 msgid "Archimedean Chords" msgstr "Corde di Archimede" -#: src/libslic3r/Zipper.cpp:91 +#: src/libslic3r/Zipper.cpp:88 msgid "archive is too large" msgstr "l'archivio è troppo grande" #. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:2955 +#: src/slic3r/GUI/Tab.cpp:3123 msgid "Are you sure you want to %1% the selected preset?" msgstr "Sei sicuro di voler %1% il preset selezionato?" -#: src/slic3r/GUI/FirmwareDialog.cpp:862 +#: src/slic3r/GUI/FirmwareDialog.cpp:902 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/libslic3r/PrintConfig.cpp:2258 +#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924 +msgid "Are you sure you want to continue?" +msgstr "Sei sicuro di voler continuare?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 +msgid "Are you sure you want to do it?" +msgstr "Sei sicuro di voler procedere?" + +#: src/libslic3r/PrintConfig.cpp:2423 msgid "Area fill" msgstr "Riempimento area" -#: src/slic3r/GUI/Plater.cpp:609 +#: src/slic3r/GUI/Plater.cpp:641 msgid "Around object" msgstr "Intorno all'oggetto" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/Plater.cpp:2754 msgid "Arrange" msgstr "Disponi" -#: src/slic3r/GUI/GLCanvas3D.cpp:3486 +#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Arrange selection" msgstr "Disponi selezione" -#: src/libslic3r/PrintConfig.cpp:3054 +#: src/libslic3r/PrintConfig.cpp:3443 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:2106 +#: src/slic3r/GUI/Plater.cpp:2813 msgid "Arranging" msgstr "Disponendo" -#: src/slic3r/GUI/Plater.cpp:2718 +#: src/slic3r/GUI/Plater.cpp:2841 msgid "Arranging canceled." msgstr "Disposizione annullata." -#: src/slic3r/GUI/Plater.cpp:2144 +#: src/slic3r/GUI/Plater.cpp:2842 msgid "Arranging done." msgstr "Disposizione completata." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Arrow Down" msgstr "Freccia giù" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 msgid "Arrow Left" msgstr "Freccia sinistra" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 msgid "Arrow Right" msgstr "Freccia Destra" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 msgid "Arrow Up" msgstr "Freccia Su" -#: src/slic3r/GUI/GUI_App.cpp:303 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:290 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.cpp:144 src/slic3r/GUI/GUI_App.cpp:743 -#: src/slic3r/GUI/Tab.cpp:2798 +#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2313 +#: src/slic3r/GUI/Tab.cpp:2960 msgid "Attention!" msgstr "Attenzione!" -#: src/libslic3r/PrintConfig.cpp:1785 +#: src/libslic3r/PrintConfig.cpp:1871 msgid "Auto generated supports" msgstr "Supporti generati automaticamente" -#: src/slic3r/GUI/Preferences.cpp:44 +#: src/slic3r/GUI/Preferences.cpp:47 msgid "Auto-center parts" msgstr "Centra automaticamente le parti" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:902 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1243 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1377 msgid "Auto-generate points" msgstr "Genera punti automaticamente" -#: src/slic3r/GUI/Plater.cpp:979 +#: src/slic3r/GUI/Plater.cpp:1157 #, possible-c-format msgid "Auto-repaired (%d errors)" msgstr "Auto-riparati (%d errori)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:339 #, possible-c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "Auto-riparati (%d errori):\n" +msgid "Auto-repaired (%d errors):" +msgstr "Auto-riparati (%d errori):" -#: src/slic3r/GUI/FirmwareDialog.cpp:771 +#: src/slic3r/GUI/FirmwareDialog.cpp:809 msgid "Autodetected" msgstr "Autorilevato" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1338 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Autogenerate support points" msgstr "Genera automaticamente punti di supporto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1166 -msgid "Autogeneration will erase all manually edited points.\n\nAre you sure you want to do it?\n" -msgstr "La generazione automatica cancellerà tutti i punti editati manualmente.\n\nSei sicuro di volere continuare?\n" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 +msgid "Autogeneration will erase all manually edited points." +msgstr "La generazione automatica cancellerà tutti i punti editati manualmente." -#: src/slic3r/GUI/Tab.cpp:3421 +#: src/slic3r/GUI/Tab.cpp:3632 msgid "Automatic generation" msgstr "Generazione automatica" -#: src/slic3r/GUI/ConfigWizard.cpp:401 +#: src/slic3r/GUI/ConfigWizard.cpp:761 msgid "Automatic updates" msgstr "Aggiornamenti automatici" -#: src/slic3r/GUI/MainFrame.cpp:406 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "Automatically repair an STL file" msgstr "Ripara automaticamente un file STL" -#: src/slic3r/GUI/Tab.cpp:1110 +#: src/slic3r/GUI/Tab.cpp:1171 msgid "Autospeed (advanced)" msgstr "Autovelocità (avanzato)" -#: src/libslic3r/PrintConfig.cpp:111 +#: src/libslic3r/PrintConfig.cpp:136 msgid "Avoid crossing perimeters" msgstr "Evita incrocio perimetri" -#: src/slic3r/GUI/Tab.cpp:3081 +#: src/slic3r/GUI/Tab.cpp:3268 msgid "BACK ARROW" msgstr "FRECCIA INDIETRO" -#: src/slic3r/GUI/Tab.cpp:3113 +#: 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.\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:3127 +#: 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.\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:52 +#: src/slic3r/GUI/Preferences.cpp:55 msgid "Background processing" msgstr "Elaborazione in background" -#: src/slic3r/GUI/GUI_ObjectList.cpp:242 +#: src/slic3r/GUI/GUI_ObjectList.cpp:351 msgid "backwards edges" msgstr "spigoli invertiti" -#: src/slic3r/GUI/MainFrame.cpp:152 +#: src/slic3r/GUI/MainFrame.cpp:174 msgid "based on Slic3r" msgstr "basato su Slic3r" -#: src/slic3r/GUI/Tab.cpp:1484 +#: src/slic3r/GUI/Tab.cpp:1439 msgid "Bed" msgstr "Piano" @@ -750,31 +863,31 @@ msgstr "Modello piano personalizzato" msgid "Bed custom texture" msgstr "Forma piano personalizzata" -#: src/slic3r/GUI/BedShapeDialog.hpp:45 src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:929 msgid "Bed Shape" msgstr "Forma Piano" -#: src/libslic3r/PrintConfig.cpp:50 +#: src/libslic3r/PrintConfig.cpp:51 msgid "Bed shape" msgstr "Forma piano" -#: src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/ConfigWizard.cpp:929 msgid "Bed Shape and Size" msgstr "Forma e dimensioni del piano di stampa" -#: src/libslic3r/PrintConfig.cpp:122 +#: src/libslic3r/PrintConfig.cpp:147 msgid "Bed temperature" msgstr "Temperatura piano" -#: src/libslic3r/PrintConfig.cpp:120 +#: src/libslic3r/PrintConfig.cpp:145 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:626 +#: src/slic3r/GUI/ConfigWizard.cpp:1051 msgid "Bed Temperature:" msgstr "Temperatura piano di stampa:" -#: src/slic3r/GUI/Tab.cpp:1961 src/libslic3r/PrintConfig.cpp:128 +#: src/slic3r/GUI/Tab.cpp:1988 src/libslic3r/PrintConfig.cpp:153 msgid "Before layer change G-code" msgstr "G-code prima del cambio layer" @@ -782,90 +895,110 @@ msgstr "G-code prima del cambio layer" msgid "Before roll back" msgstr "Prima di tornare indietro" -#: src/slic3r/GUI/Plater.cpp:608 +#: src/slic3r/GUI/Plater.cpp:640 msgid "Below object" msgstr "Sotto l'oggetto" -#: src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Below Z" -msgstr "Sotto Z" +msgstr "Z Sotto" -#: src/libslic3r/PrintConfig.cpp:139 +#: src/libslic3r/PrintConfig.cpp:164 msgid "Between objects G-code" msgstr "G-code tra gli oggetti" -#: src/slic3r/GUI/Tab.cpp:1979 +#: src/slic3r/GUI/Tab.cpp:2006 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 +msgid "Bottle volume" +msgstr "Volume bottiglia" + +#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497 +msgid "Bottle weight" +msgstr "Peso bottiglia" + #. TRN To be shown in the main menu View->Bottom -#: src/slic3r/GUI/MainFrame.cpp:524 +#. 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 msgid "Bottom" msgstr "Inferiore" -#: src/libslic3r/PrintConfig.cpp:409 +#: src/libslic3r/PrintConfig.cpp:435 msgid "Bottom fill pattern" msgstr "Trama riempimento inferiore" -#: src/libslic3r/PrintConfig.cpp:152 +#: src/slic3r/GUI/PresetHints.cpp:342 +msgid "Bottom is open." +msgstr "La parte inferiore è aperta." + +#: src/slic3r/GUI/PresetHints.cpp:336 +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 msgid "Bottom solid layers" msgstr "Layer solidi sul fondo" -#: src/slic3r/GUI/MainFrame.cpp:524 +#: src/slic3r/GUI/MainFrame.cpp:665 msgid "Bottom View" msgstr "Vista inferiore" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1087 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1090 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1464 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1468 msgid "Box" -msgstr "Box" +msgstr "Cubo" -#: src/libslic3r/PrintConfig.cpp:157 +#: src/libslic3r/PrintConfig.cpp:193 msgid "Bridge" msgstr "Bridge" -#: src/libslic3r/PrintConfig.cpp:186 +#: src/libslic3r/PrintConfig.cpp:222 msgid "Bridge flow ratio" msgstr "Rapporto flusso Bridge" -#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/GCode/PreviewData.cpp:169 +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316 msgid "Bridge infill" msgstr "Riempimento Bridge" -#: src/libslic3r/PrintConfig.cpp:198 +#: src/libslic3r/PrintConfig.cpp:234 msgid "Bridges" msgstr "Bridge" -#: src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:213 msgid "Bridges fan speed" msgstr "Velocità ventola Bridge" -#: src/libslic3r/PrintConfig.cpp:166 +#: src/libslic3r/PrintConfig.cpp:202 msgid "Bridging angle" msgstr "Angolo Bridge" -#: src/libslic3r/PrintConfig.cpp:168 +#: src/libslic3r/PrintConfig.cpp:204 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:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Bridging volumetric" msgstr "Bridging volumetrico" -#: src/slic3r/GUI/Plater.cpp:446 src/slic3r/GUI/Tab.cpp:1056 +#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117 msgid "Brim" msgstr "Brim" -#: src/libslic3r/PrintConfig.cpp:208 +#: src/libslic3r/PrintConfig.cpp:244 msgid "Brim width" msgstr "Larghezza brim" -#: src/slic3r/GUI/Tab.cpp:1681 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1658 +#: src/slic3r/GUI/Tab.cpp:1721 msgid "Browse" msgstr "Naviga" -#: src/libslic3r/Zipper.cpp:85 +#: src/libslic3r/Zipper.cpp:82 msgid "buffer too small" msgstr "buffer troppo piccolo" @@ -873,850 +1006,1022 @@ msgstr "buffer troppo piccolo" msgid "Buttons And Text Colors Description" msgstr "Descrizione colori testo e pulsanti" -#: src/slic3r/GUI/PresetHints.cpp:220 +#: src/slic3r/GUI/PresetHints.cpp:223 msgid "by the print profile maximum" msgstr "secondo il massimo del profilo di stampa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:113 +msgid "Camera" +msgstr "Camera" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Camera view" msgstr "Vista camera" -#: src/slic3r/GUI/ConfigWizard.cpp:1095 src/slic3r/GUI/FirmwareDialog.cpp:147 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:37 -#: src/slic3r/GUI/ProgressStatusBar.cpp:28 +#: src/slic3r/GUI/ConfigWizard.cpp:1982 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 msgid "Cancel" msgstr "Annulla" -#: src/slic3r/GUI/PrintHostDialogs.cpp:156 +#: src/slic3r/GUI/PrintHostDialogs.cpp:157 msgid "Cancel selected" msgstr "Cancella selezione" -#: src/slic3r/GUI/Plater.cpp:2727 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3669 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "Annullato" -#: src/slic3r/GUI/Plater.cpp:2444 src/slic3r/GUI/PrintHostDialogs.cpp:231 +#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "Annullamento" -#: src/slic3r/GUI/FirmwareDialog.cpp:866 +#: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." msgstr "Annullo in corso..." -#: src/slic3r/GUI/Tab.cpp:2905 +#: src/libslic3r/Flow.cpp:61 +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 +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 +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 +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 msgid "Cannot overwrite a system profile." msgstr "Impossibile sovrascrivere un profilo di sistema." -#: src/slic3r/GUI/Tab.cpp:2909 +#: src/slic3r/GUI/Tab.cpp:3077 msgid "Cannot overwrite an external profile." msgstr "Impossibile sovrascrivere un profilo esterno." -#: src/libslic3r/SLAPrint.cpp:612 +#: src/libslic3r/SLAPrint.cpp:613 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:1840 +#: src/slic3r/GUI/Tab.cpp:1834 msgid "Capabilities" msgstr "Caratteristiche" -#: src/slic3r/GUI/GUI_App.cpp:662 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Capture a configuration snapshot" msgstr "Cattura un'istantanea della configurazione" -#: src/libslic3r/PrintConfig.cpp:3035 +#: src/libslic3r/PrintConfig.cpp:3424 msgid "Center" msgstr "Centro" -#: src/libslic3r/PrintConfig.cpp:3036 +#: src/libslic3r/PrintConfig.cpp:3425 msgid "Center the print around the given center." msgstr "Centra la stampa sul centro dato." -#: src/slic3r/GUI/Tab.cpp:1744 +#: src/slic3r/GUI/Tab.cpp:1728 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "File di certificato (*.crt, *.pem)|*.crt;*.pem|All files|*.*" -#: src/slic3r/GUI/GUI_App.cpp:683 -msgid "Change Application &Language" -msgstr "Cambia &Lingua Applicazione" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Change camera type (perspective, orthographic)" -msgstr "Cambia tipo di camera (prospettiva, ortografica)" +msgstr "Cambia tipo di visuale (prospettica, ortografica)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:885 +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 msgid "Change extruder" msgstr "Cambia estrusore" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:144 +#: src/slic3r/GUI/GUI_ObjectList.cpp:536 +msgid "Change Extruder" +msgstr "Cambio estrusore" + +#: src/slic3r/GUI/DoubleSlider.cpp:1145 +msgid "Change extruder (N/A)" +msgstr "Cambio estrusore (N/A)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3997 +msgid "Change Extruders" +msgstr "Cambio Estrusori" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 #, possible-c-format msgid "Change Option %s" msgstr "Modifica Opzione %s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3134 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3558 msgid "Change Part Type" msgstr "Modifica il tipo di Parte" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:925 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820 msgid "Change point head diameter" msgstr "Modifica diametro punta della testa" -#: src/slic3r/GUI/Plater.cpp:3520 +#: src/slic3r/GUI/Plater.cpp:3944 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:1185 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1589 msgid "Change type" msgstr "Cambia tipo" -#: src/slic3r/GUI/UpdateDialogs.cpp:56 +#: src/slic3r/GUI/UpdateDialogs.cpp:53 msgid "Changelog && Download" msgstr "Changelog && Download" -#: src/slic3r/GUI/GUI_App.cpp:378 +#: src/slic3r/GUI/GUI_App.cpp:442 msgid "Changing of an application language" msgstr "Cambio lingua applicazione" -#: src/slic3r/GUI/ConfigWizard.cpp:409 src/slic3r/GUI/Preferences.cpp:61 +#: src/slic3r/GUI/ConfigWizard.cpp:769 src/slic3r/GUI/Preferences.cpp:64 msgid "Check for application updates" msgstr "Verifica la presenza di aggiornamenti" -#: src/slic3r/GUI/BedShapeDialog.cpp:509 +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for configuration updates" +msgstr "Controlla aggiornamenti di configurazione" + +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for updates" +msgstr "Cerca aggiorna&menti" + +#: src/slic3r/GUI/BedShapeDialog.cpp:532 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:621 +#: src/slic3r/GUI/MainFrame.cpp:773 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:532 +#: src/slic3r/GUI/BedShapeDialog.cpp:555 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:464 +#: src/slic3r/GUI/BedShapeDialog.cpp:487 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:510 +#: src/slic3r/GUI/GUI_App.cpp:555 msgid "Choose one file (3MF/AMF):" msgstr "Seleziona un file (3MF/AMF):" -#: src/slic3r/GUI/GUI_App.cpp:501 +#: src/slic3r/GUI/GUI_App.cpp:567 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:490 +#: src/slic3r/GUI/ConfigWizard.cpp:895 msgid "Choose the type of firmware used by your printer." msgstr "Indica il firmware usato dalla tua stampante." -#: src/slic3r/GUI/BedShapeDialog.cpp:84 +#: src/slic3r/GUI/BedShapeDialog.cpp:89 msgid "Circular" msgstr "Circolare" -#: src/slic3r/GUI/GLCanvas3D.cpp:3701 src/slic3r/GUI/GLCanvas3D.cpp:3734 +#: 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/GUI_ObjectList.cpp:383 +#: src/slic3r/GUI/GUI_ObjectList.cpp:404 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:377 +#: src/slic3r/GUI/GUI_ObjectList.cpp:398 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:292 +#: src/slic3r/GUI/Plater.cpp:343 msgid "Click to edit preset" msgstr "Clicca per modificare il preset" -#: src/libslic3r/PrintConfig.cpp:216 +#: src/libslic3r/PrintConfig.cpp:252 msgid "Clip multi-part objects" msgstr "Collega oggetti multi-part" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:928 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 msgid "Clipping of view" msgstr "Ritaglio della vista" -#: src/slic3r/GUI/FirmwareDialog.cpp:814 -#: src/slic3r/GUI/PrintHostDialogs.cpp:160 +#: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/Mouse3DController.cpp:364 +#: src/slic3r/GUI/PrintHostDialogs.cpp:161 msgid "Close" msgstr "Chiudi" -#: src/libslic3r/PrintConfig.cpp:550 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +#: src/libslic3r/PrintConfig.cpp:2934 +msgid "Closing distance" +msgstr "Distanza di chiusura" + +#: src/slic3r/GUI/Plater.cpp:1260 src/libslic3r/PrintConfig.cpp:582 msgid "Color" msgstr "Colore" -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/GUI_Preview.cpp:535 -#: src/libslic3r/GCode/PreviewData.cpp:406 +#: src/slic3r/GUI/DoubleSlider.cpp:1005 +msgid "Color change (\"%1%\")" +msgstr "Cambio colore (\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:1006 +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/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572 +#: src/libslic3r/GCode/PreviewData.cpp:359 msgid "Color Print" msgstr "Color Print (Stampa a Colori)" -#: src/libslic3r/PrintConfig.cpp:224 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Colorprint height" msgstr "Altezza Colorprint" -#: src/libslic3r/PrintConfig.cpp:942 +#: src/libslic3r/PrintConfig.cpp:990 msgid "Combine infill every" msgstr "Combina riempimento ogni" -#: src/libslic3r/PrintConfig.cpp:947 +#: src/libslic3r/PrintConfig.cpp:995 msgid "Combine infill every n layers" msgstr "Combina riempimento ogni n layer" -#: src/slic3r/GUI/UpdateDialogs.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Commands" +msgstr "Comandi" + +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 msgid "Comment:" msgstr "Commento:" -#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:244 +#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280 msgid "Compatible print profiles" msgstr "Profili di stampa compatibili" -#: src/libslic3r/PrintConfig.cpp:250 +#: src/libslic3r/PrintConfig.cpp:286 msgid "Compatible print profiles condition" msgstr "Condizioni profili di stampa compatibili" -#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:229 +#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265 msgid "Compatible printers" msgstr "Stampanti compatibili" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:271 msgid "Compatible printers condition" msgstr "Condizioni di stampante compatibile" -#: src/libslic3r/PrintConfig.cpp:268 +#: src/libslic3r/PrintConfig.cpp:304 msgid "Complete individual objects" msgstr "Completa singoli oggetti" -#: src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/PrintHostDialogs.cpp:234 msgid "Completed" msgstr "Completato" -#: src/libslic3r/Zipper.cpp:57 +#: src/libslic3r/Zipper.cpp:54 msgid "compression failed" msgstr "compressione fallita" -#: src/libslic3r/PrintConfig.cpp:399 src/libslic3r/PrintConfig.cpp:802 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849 msgid "Concentric" msgstr "Concentrico" -#: src/slic3r/GUI/ConfigWizard.cpp:1185 +#: src/slic3r/GUI/ConfigWizard.cpp:2110 msgid "Configuration &Assistant" msgstr "&Assistente Configurazione" -#: src/slic3r/GUI/ConfigWizard.cpp:1182 +#: src/slic3r/GUI/ConfigWizard.cpp:2113 msgid "Configuration &Wizard" -msgstr "Configurazione guidata (&Wizard)" +msgstr "Co&nfigurazione guidata" -#: src/slic3r/GUI/ConfigWizard.cpp:1184 +#: src/slic3r/GUI/ConfigWizard.cpp:2109 msgid "Configuration Assistant" msgstr "Assistente configurazione" -#: src/libslic3r/PrintConfig.cpp:1251 +#: src/libslic3r/PrintConfig.cpp:1316 msgid "Configuration notes" msgstr "Note di configurazione" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:99 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104 msgid "Configuration Snapshots" msgstr "Istantanee di Configurazione" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 src/slic3r/GUI/UpdateDialogs.cpp:168 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" msgstr "Aggiornamento di configurazione" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 msgid "Configuration update is available" msgstr "Aggiornamento di configurazione disponibile" -#: src/slic3r/GUI/ConfigWizard.cpp:1181 +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "Configuration updates" +msgstr "Aggiornamenti di configurazione" + +#: src/slic3r/GUI/ConfigWizard.cpp:2112 msgid "Configuration Wizard" msgstr "Configurazione Guidata" -#: src/slic3r/GUI/FirmwareDialog.cpp:863 +#: src/slic3r/GUI/FirmwareDialog.cpp:903 msgid "Confirmation" msgstr "Conferma" -#: src/slic3r/GUI/Tab.cpp:1904 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Connection failed." msgstr "Connessione fallita." -#: src/slic3r/GUI/Tab.cpp:3416 +#: src/slic3r/GUI/Tab.cpp:3627 msgid "Connection of the support sticks and junctions" msgstr "Connessione delle barre di supporto e giunzioni" -#: src/slic3r/Utils/Duet.cpp:51 +#: src/slic3r/Utils/AstroBox.cpp:83 +msgid "Connection to AstroBox works correctly." +msgstr "La connessione ad AstroBox funziona correttamente." + +#: src/slic3r/Utils/Duet.cpp:49 msgid "Connection to Duet works correctly." msgstr "La connessione a Duet funziona correttamente." -#: src/slic3r/Utils/OctoPrint.cpp:84 +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "Connessione a FlashAir correttamente funzionante e caricamento abilitato." + +#: src/slic3r/Utils/OctoPrint.cpp:83 msgid "Connection to OctoPrint works correctly." msgstr "Connessione con OctoPrint funzionante." -#: src/slic3r/GUI/Tab.cpp:1901 +#: src/slic3r/GUI/Tab.cpp:1928 msgid "Connection to printer works correctly." msgstr "Connessione con la stampante funzionante." -#: src/slic3r/Utils/OctoPrint.cpp:195 +#: src/slic3r/Utils/OctoPrint.cpp:176 msgid "Connection to Prusa SL1 works correctly." msgstr "La connessione a Prusa SL1 funziona correttamente." -#: src/libslic3r/PrintConfig.cpp:1823 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Contact Z distance" msgstr "Distanza di contatto Z" -#: src/slic3r/GUI/AboutDialog.cpp:96 +#: src/slic3r/GUI/AboutDialog.cpp:261 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:2433 +#: src/libslic3r/PrintConfig.cpp:2659 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:1489 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Cooling" msgstr "Raffreddamento" -#: src/libslic3r/PrintConfig.cpp:629 +#: src/libslic3r/PrintConfig.cpp:660 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:648 +#: src/libslic3r/PrintConfig.cpp:679 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "I movimenti di raffreddamento accelerano gradualmente verso questa velocità." -#: src/slic3r/GUI/Tab.cpp:1510 +#: src/slic3r/GUI/Tab.cpp:1465 msgid "Cooling thresholds" msgstr "Soglie di raffreddamento" -#: src/libslic3r/PrintConfig.cpp:291 +#: src/libslic3r/PrintConfig.cpp:327 msgid "Cooling tube length" msgstr "Lunghezza del tubo di raffreddamento" -#: src/libslic3r/PrintConfig.cpp:283 +#: src/libslic3r/PrintConfig.cpp:319 msgid "Cooling tube position" msgstr "Posizione tubo di raffreddamento" -#: src/slic3r/GUI/Tab.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:4752 +msgid "Copies of the selected object" +msgstr "Copie dell'oggetto selezionato" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4505 msgid "Copy" msgstr "Copia" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:589 msgid "Copy selection to clipboard" msgstr "Copia selezione negli appunti" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 msgid "Copy to clipboard" msgstr "Copia negli appunti" -#: src/slic3r/GUI/SysInfoDialog.cpp:120 +#: src/slic3r/GUI/SysInfoDialog.cpp:154 msgid "Copy to Clipboard" msgstr "Copia negli appunti" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:84 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:400 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121 +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 +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 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:92 +#: 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/AboutDialog.cpp:92 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112 +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 msgid "Copyright" msgstr "Copyright" -#: src/libslic3r/PrintConfig.cpp:2324 src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572 msgid "Correction for expansion" msgstr "Correzione dell'espansione" -#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:3310 +#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:3519 msgid "Corrections" msgstr "Correzioni" -#: src/slic3r/GUI/Plater.cpp:216 src/slic3r/GUI/Plater.cpp:1056 -#: src/libslic3r/PrintConfig.cpp:717 +#: src/slic3r/GUI/Plater.cpp:1243 src/libslic3r/PrintConfig.cpp:760 +#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511 msgid "Cost" msgstr "Costo" -#: src/slic3r/GUI/Plater.cpp:2140 +#: src/slic3r/GUI/Plater.cpp:239 +msgid "Cost (money)" +msgstr "Costo (soldi)" + +#: src/slic3r/GUI/Plater.cpp:2835 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/Duet.cpp:56 +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Could not connect to AstroBox" +msgstr "Impossibile connettere ad AstroBox" + +#: src/slic3r/Utils/Duet.cpp:54 msgid "Could not connect to Duet" msgstr "Connessione a Duet fallita" -#: src/slic3r/Utils/OctoPrint.cpp:90 +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "Could not connect to FlashAir" +msgstr "Impossibile connettersi a FlashAir" + +#: src/slic3r/Utils/OctoPrint.cpp:89 msgid "Could not connect to OctoPrint" msgstr "Impossibile connettersi ad OctoPrint" -#: src/slic3r/Utils/OctoPrint.cpp:200 +#: src/slic3r/Utils/OctoPrint.cpp:181 msgid "Could not connect to Prusa SLA" msgstr "Connessione a Prusa SLA fallita" -#: src/slic3r/GUI/Tab.cpp:1710 +#: src/slic3r/GUI/Tab.cpp:1687 msgid "Could not get a valid Printer Host reference" msgstr "Impossibile ottenere un riferimento Host Stampante valido" -#: src/slic3r/Utils/Duet.cpp:151 +#: src/slic3r/Utils/Duet.cpp:134 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:1872 +#: src/libslic3r/PrintConfig.cpp:1959 msgid "Cover the top contact layer of the supports with loops. Disabled by default." -msgstr "Copri il layer di contatto superiore del supporto con anelli. Disattivato per impostazione predefinita." +msgstr "Copre con anelli il layer superiore del supporto a contatto. Disattivato per impostazione predefinita." -#: src/libslic3r/PrintConfig.cpp:73 +#: src/libslic3r/PrintConfig.cpp:89 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:61 +#: src/libslic3r/Zipper.cpp:58 msgid "CRC-32 check failed" msgstr "verifica CRC-32 fallita" -#: src/libslic3r/PrintConfig.cpp:2734 +#: src/libslic3r/PrintConfig.cpp:2857 msgid "Create pad around object and ignore the support elevation" -msgstr "Crea Pad intorno all'oggetto ed ignora l'elevazione del supporto" +msgstr "Genera Pad intorno all'oggetto ed ignora l'elevazione del supporto" -#: src/libslic3r/PrintConfig.cpp:2460 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Critical angle" msgstr "Angolo critico" -#: src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2668 msgid "Cross" msgstr "Croce" -#: src/libslic3r/PrintConfig.cpp:800 +#: src/libslic3r/PrintConfig.cpp:847 msgid "Cubic" msgstr "Cubico" -#: src/slic3r/GUI/wxExtensions.cpp:2413 +#: src/slic3r/GUI/wxExtensions.cpp:704 #, possible-c-format msgid "Current mode is %s" msgstr "La modalità corrente è %s" -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" +msgstr "Il preset corrente è ereditato da" + +#: src/slic3r/GUI/Tab.cpp:957 msgid "Current preset is inherited from the default preset." msgstr "Il preset attuale è stato ereditato dal preset predefinito." -#: src/slic3r/GUI/Tab.cpp:928 -#, possible-c-format -msgid "Current preset is inherited from:\n\t%s" -msgstr "Il preset corrente è ereditato da:\n%s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:45 +#: src/slic3r/GUI/UpdateDialogs.cpp:43 msgid "Current version:" msgstr "Versione corrente:" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/slic3r/GUI/GUI_Preview.cpp:239 -#: src/libslic3r/GCode/PreviewData.cpp:175 +#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249 +#: src/libslic3r/ExtrusionEntity.cpp:322 msgid "Custom" msgstr "Personalizzato" -#: src/libslic3r/PrintConfig.cpp:96 +#: src/libslic3r/PrintConfig.cpp:112 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:1563 src/slic3r/GUI/Tab.cpp:1948 +#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1975 msgid "Custom G-code" msgstr "G-code personalizzato" -#: src/slic3r/GUI/ConfigWizard.cpp:373 +#: src/slic3r/GUI/DoubleSlider.cpp:1619 +msgid "Custom G-code on current layer (%1% mm)." +msgstr "G-code personalizzato al layer attuale (%1% mm)." + +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer" msgstr "Stampante Personalizzata" -#: src/slic3r/GUI/ConfigWizard.cpp:373 +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer Setup" msgstr "Setup Stampante Personalizzata" -#: src/slic3r/GUI/ConfigWizard.cpp:377 +#: src/slic3r/GUI/ConfigWizard.cpp:736 msgid "Custom profile name:" msgstr "Nome profilo personalizzato:" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3013 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3402 msgid "Cut" msgstr "Taglia" -#: src/slic3r/GUI/Plater.cpp:4193 +#: src/slic3r/GUI/Plater.cpp:4786 msgid "Cut by Plane" msgstr "Taglia sul Piano" -#: src/libslic3r/PrintConfig.cpp:3014 +#: src/libslic3r/PrintConfig.cpp:3403 msgid "Cut model at the given Z." msgstr "Taglia il modello al dato Z." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Cylinder" msgstr "Cilindro" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:568 msgid "D&eselect all" msgstr "D&eseleziona tutto" -#: src/libslic3r/PrintConfig.cpp:3115 +#: src/libslic3r/PrintConfig.cpp:3504 msgid "Data directory" msgstr "Directory dati" -#: src/libslic3r/Zipper.cpp:55 +#: src/slic3r/GUI/Mouse3DController.cpp:313 +msgid "Deadzone:" +msgstr "Zona morta:" + +#: src/libslic3r/Zipper.cpp:52 msgid "decompression failed or archive is corrupted" msgstr "decompressione non riuscita o archivio corrotto" -#: src/slic3r/GUI/Plater.cpp:4127 +#: src/slic3r/GUI/Plater.cpp:4720 msgid "Decrease Instances" msgstr "Diminuisci Istanze" -#: src/slic3r/GUI/GUI_App.cpp:594 src/slic3r/GUI/GUI_ObjectList.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1704 src/libslic3r/PrintConfig.cpp:335 msgid "Default" msgstr "Predefinito" -#: xs/src/slic3r/GUI/Field.cpp:98 +#: 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 msgid "default" msgstr "predefinito" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:777 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:522 +#: src/libslic3r/PrintConfig.cpp:554 msgid "Default extrusion width" msgstr "Larghezza estrusione predefinita" -#: src/slic3r/GUI/Tab.cpp:937 +#: src/slic3r/GUI/Tab.cpp:987 msgid "default filament profile" msgstr "profilo filamento predefinito" -#: src/libslic3r/PrintConfig.cpp:309 +#: src/libslic3r/PrintConfig.cpp:345 msgid "Default filament profile" msgstr "Profilo filamento predefinito" -#: src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:346 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:2757 +#: src/slic3r/GUI/Tab.cpp:2919 #, possible-c-format msgid "Default preset (%s)" msgstr "Preset predefinito (%s)" -#: src/libslic3r/GCode/PreviewData.cpp:491 +#: 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:934 +#: src/slic3r/GUI/Tab.cpp:984 msgid "default print profile" msgstr "profilo di stampa predefinito" -#: src/libslic3r/PrintConfig.cpp:316 +#: src/libslic3r/PrintConfig.cpp:352 msgid "Default print profile" msgstr "Profilo di stampa predefinito" -#: src/libslic3r/PrintConfig.cpp:317 src/libslic3r/PrintConfig.cpp:2341 -#: src/libslic3r/PrintConfig.cpp:2352 +#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592 +#: src/libslic3r/PrintConfig.cpp:2603 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:951 +#: src/slic3r/GUI/Tab.cpp:1001 msgid "default SLA material profile" msgstr "profilo materiale SLA predefinito" -#: src/libslic3r/PrintConfig.cpp:2340 src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602 msgid "Default SLA material profile" msgstr "Profilo materiale SLA predefinito" -#: src/slic3r/GUI/Tab.cpp:955 +#: src/slic3r/GUI/Tab.cpp:1005 msgid "default SLA print profile" msgstr "profilo di stampa SLA predefinito" -#: src/slic3r/GUI/Field.cpp:105 +#: src/slic3r/GUI/Field.cpp:136 msgid "default value" msgstr "valore predefinito" -#: src/slic3r/GUI/ConfigWizard.cpp:375 +#: src/slic3r/GUI/ConfigWizard.cpp:734 msgid "Define a custom printer profile" msgstr "Inserisci un profilo stampante personalizzato" -#: src/libslic3r/PrintConfig.cpp:2558 +#: src/libslic3r/PrintConfig.cpp:2798 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:237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:346 msgid "degenerate facets" msgstr "facce degenerate" -#: src/libslic3r/PrintConfig.cpp:608 +#: src/libslic3r/PrintConfig.cpp:640 msgid "Delay after unloading" msgstr "Ritardo dopo lo scarico" -#: src/slic3r/GUI/Tab.cpp:2935 +#: src/slic3r/GUI/Tab.cpp:3121 msgid "delete" msgstr "elimina" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1257 src/slic3r/GUI/Plater.cpp:2891 -#: src/slic3r/GUI/Plater.cpp:2909 src/slic3r/GUI/Tab.cpp:2937 +#: 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 msgid "Delete" msgstr "Elimina" -#: src/slic3r/GUI/MainFrame.cpp:449 +#: src/slic3r/GUI/MainFrame.cpp:575 msgid "Delete &all" msgstr "Elimin&a tutto" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 -msgid "Delete All" -msgstr "Elimina tutto" - -#: src/slic3r/GUI/Plater.cpp:3298 +#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129 +#: src/slic3r/GUI/Plater.cpp:4669 msgid "Delete all" msgstr "Elimina tutto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1806 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2176 msgid "Delete All Instances from Object" msgstr "Elimina Tutte le Istanze dall'Oggetto" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/DoubleSlider.cpp:1516 +msgid "Delete color change" +msgstr "Elimina il cambio colore" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Delete color change marker for current layer" msgstr "Elimina il segnale di cambio colore per il layer corrente" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1898 +#: src/slic3r/GUI/DoubleSlider.cpp:1519 +msgid "Delete custom G-code" +msgstr "Elimina G-code personalizzato" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:539 +msgid "Delete drainage hole" +msgstr "Elimina foro di drenaggio" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2192 msgid "Delete Height Range" msgstr "Elimina Intervallo Altezza" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2246 msgid "Delete Instance" msgstr "Elimina Istanza" -#: src/slic3r/GUI/Plater.cpp:2592 +#: src/slic3r/GUI/Plater.cpp:2712 msgid "Delete Object" msgstr "Elimina Oggetto" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:100 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 #, possible-c-format msgid "Delete Option %s" msgstr "Elimina Opzione %s" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/DoubleSlider.cpp:1518 +msgid "Delete pause print" +msgstr "Elimina pausa stampa" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 msgid "Delete selected" msgstr "Elimina selezionato" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2830 msgid "Delete Selected" msgstr "Elimina Selezionati" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2303 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2693 msgid "Delete Selected Item" msgstr "Elimina l'elemento selezionato" -#: src/slic3r/GUI/Plater.cpp:4083 +#: src/slic3r/GUI/Plater.cpp:4677 msgid "Delete Selected Objects" msgstr "Elimina Oggetti Selezionati" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2152 msgid "Delete Settings" msgstr "Elimina Impostazioni" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1857 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2227 msgid "Delete Subobject" msgstr "Elimina Sotto-oggetto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:720 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631 msgid "Delete support point" msgstr "Elimina punto di supporto" -#: src/slic3r/GUI/Tab.cpp:131 +#: src/slic3r/GUI/Tab.cpp:134 msgid "Delete this preset" msgstr "Elimina questo preset" -#: src/slic3r/GUI/MainFrame.cpp:449 +#: src/slic3r/GUI/DoubleSlider.cpp:1035 +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 +msgid "Delete tool change" +msgstr "Elimina cambio attrezzo" + +#: src/slic3r/GUI/MainFrame.cpp:576 msgid "Deletes all objects" msgstr "Elimina tutti gli oggetti" -#: src/slic3r/GUI/MainFrame.cpp:447 +#: src/slic3r/GUI/MainFrame.cpp:573 msgid "Deletes the current selection" msgstr "Elimina la selezione corrente" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:2504 msgid "Density" msgstr "Densità" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:791 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:1200 src/slic3r/GUI/Tab.cpp:1584 -#: src/slic3r/GUI/Tab.cpp:1992 src/slic3r/GUI/Tab.cpp:2086 -#: src/slic3r/GUI/Tab.cpp:3336 src/slic3r/GUI/Tab.cpp:3445 +#: 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 msgid "Dependencies" msgstr "Dipendenze" -#: src/libslic3r/PrintConfig.cpp:1542 src/libslic3r/PrintConfig.cpp:1543 +#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613 msgid "Deretraction Speed" msgstr "Velocità di deretrazione" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +msgid "Deselect all" +msgstr "Deseleziona tutto" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369 msgid "Deselect by rectangle" msgstr "Deseleziona con rettangolo" -#: src/slic3r/GUI/MainFrame.cpp:492 +#: src/slic3r/GUI/MainFrame.cpp:569 msgid "Deselects all objects" msgstr "Deseleziona tutti gli oggetti" -#: src/libslic3r/PrintConfig.cpp:1304 -msgid "Detect bridging perimeters" -msgstr "Rileva perimetri ponte" +#: src/slic3r/GUI/Tab.cpp:963 +msgid "Detach from system preset" +msgstr "Distacco dal preset di sistema" -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/slic3r/GUI/Tab.cpp:984 +msgid "Detach preset" +msgstr "Preset distacco" + +#: src/slic3r/GUI/Tab.cpp:3029 +msgid "Detached" +msgstr "Distaccato" + +#: src/libslic3r/PrintConfig.cpp:1373 +msgid "Detect bridging perimeters" +msgstr "Rileva perimetri ponte (bridge)" + +#: src/libslic3r/PrintConfig.cpp:2075 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:1986 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "Detect thin walls" msgstr "Rileva perimetri sottili" -#: src/libslic3r/PrintConfig.cpp:3083 +#: src/libslic3r/PrintConfig.cpp:3472 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:1713 +#: src/slic3r/GUI/Plater.cpp:2368 msgid "Detected advanced data" msgstr "Rilevati dati avanzati" -#: src/slic3r/GUI/BedShapeDialog.cpp:88 src/libslic3r/PrintConfig.cpp:677 +#: src/slic3r/GUI/Mouse3DController.cpp:289 +msgid "Device:" +msgstr "Dispositivo:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709 msgid "Diameter" msgstr "Diametro" -#: src/libslic3r/PrintConfig.cpp:2443 +#: src/libslic3r/PrintConfig.cpp:2694 msgid "Diameter in mm of the pillar base" msgstr "Diametro in mm della base del pilastro" -#: src/libslic3r/PrintConfig.cpp:2399 +#: src/libslic3r/PrintConfig.cpp:2650 msgid "Diameter in mm of the support pillars" msgstr "Diametro in mm dei pilastri di supporto" -#: src/libslic3r/PrintConfig.cpp:2371 +#: src/libslic3r/PrintConfig.cpp:2622 msgid "Diameter of the pointing side of the head" msgstr "Diametro del lato di puntamento della testa" -#: src/slic3r/GUI/BedShapeDialog.cpp:89 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 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:1569 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Direction" msgstr "Direzione" -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:359 msgid "Disable fan for the first" msgstr "Disattiva ventola per i primi" -#: src/libslic3r/PrintConfig.cpp:1280 +#: src/libslic3r/PrintConfig.cpp:1349 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/wxExtensions.cpp:2572 -msgid "Discard all color changes" -msgstr "Elimina tutti i cambi colore" +#: src/slic3r/GUI/DoubleSlider.cpp:952 +msgid "Discard all custom changes" +msgstr "Elimina tutte le modifiche personalizzate" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1241 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1375 msgid "Discard changes" msgstr "Annulla modifiche" -#: src/slic3r/GUI/Tab.cpp:2784 +#: 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/Gizmos/GLGizmoMove.cpp:177 -msgid "Displacement (mm)" -msgstr "Spostamento (mm)" - -#: src/slic3r/GUI/Tab.cpp:2041 +#: src/slic3r/GUI/Tab.cpp:2078 msgid "Display" msgstr "Display" -#: src/libslic3r/PrintConfig.cpp:2208 +#: src/libslic3r/PrintConfig.cpp:2359 msgid "Display height" msgstr "Altezza display" -#: src/libslic3r/PrintConfig.cpp:2319 +#: src/libslic3r/PrintConfig.cpp:2378 msgid "Display horizontal mirroring" msgstr "Mostra mirroring orizzontale" -#: src/libslic3r/PrintConfig.cpp:2227 +#: src/libslic3r/PrintConfig.cpp:2392 msgid "Display orientation" msgstr "Orientamento display" -#: src/slic3r/GUI/MainFrame.cpp:510 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Display the Print Host Upload Queue window" msgstr "Mostra la finestra della fila di caricamento all'host di stampa" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2385 msgid "Display vertical mirroring" msgstr "Mostra mirroring verticale" -#: src/libslic3r/PrintConfig.cpp:2202 +#: src/libslic3r/PrintConfig.cpp:2353 msgid "Display width" msgstr "Larghezza display" -#: src/libslic3r/PrintConfig.cpp:341 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Distance between copies" msgstr "Distanza tra le copie" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1680 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:2752 +#: src/libslic3r/PrintConfig.cpp:2882 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:1609 +#: src/libslic3r/PrintConfig.cpp:1679 msgid "Distance from object" msgstr "Distanza dall'oggetto" -#: src/slic3r/GUI/BedShapeDialog.cpp:80 +#: src/slic3r/GUI/BedShapeDialog.cpp:85 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:285 +#: src/libslic3r/PrintConfig.cpp:320 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:1338 +#: src/libslic3r/PrintConfig.cpp:1382 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:342 +#: src/libslic3r/PrintConfig.cpp:378 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:3097 +#: src/libslic3r/PrintConfig.cpp:3486 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:3041 +#: src/libslic3r/PrintConfig.cpp:3430 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:206 +#: src/slic3r/GUI/Field.cpp:240 #, 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/GUI_App.cpp:754 +#: src/slic3r/GUI/DoubleSlider.cpp:1920 +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 msgid "Do you want to proceed?" msgstr "Vuoi continuare?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1024 +#: src/slic3r/GUI/Plater.cpp:3321 +msgid "Do you want to retry" +msgstr "Vuoi riprovare" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1045 msgid "Do you want to save your manually edited support points?" msgstr "Vuoi salvare i punti di supporto modificati manualmente?" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:1834 +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 +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 msgid "Don't arrange" msgstr "Non disporre" -#: src/slic3r/GUI/UpdateDialogs.cpp:55 +#: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" msgstr "Non notificare più i nuovi rilasci" -#: src/libslic3r/PrintConfig.cpp:333 +#: src/libslic3r/PrintConfig.cpp:369 msgid "Don't support bridges" msgstr "Non supportare i bridge" @@ -1724,316 +2029,426 @@ msgstr "Non supportare i bridge" msgid "Downgrade" msgstr "Downgrade" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1233 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1236 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1237 +#: src/libslic3r/PrintConfig.cpp:1695 +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 msgid "Drag" msgstr "Trascina" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:340 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:355 +#: src/libslic3r/SLAPrintSteps.cpp:44 +msgid "Drilling holes into model." +msgstr "Praticare fori nel modello." + +#: src/libslic3r/SLAPrintSteps.cpp:199 +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 msgid "Drop to bed" msgstr "Poggia sul piano" -#: src/libslic3r/PrintConfig.cpp:3044 +#: src/libslic3r/PrintConfig.cpp:3433 msgid "Duplicate" msgstr "Duplica" -#: src/libslic3r/PrintConfig.cpp:3049 +#: src/libslic3r/PrintConfig.cpp:3438 msgid "Duplicate by grid" msgstr "Duplica per griglia" -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/slic3r/GUI/PresetHints.cpp:40 +msgid "During the other layers, fan" +msgstr "Durante gli altri layer, la ventola" + +#: src/libslic3r/PrintConfig.cpp:2669 msgid "Dynamic" msgstr "Dinamico" -#: src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/MainFrame.cpp:749 msgid "E&xport" msgstr "Esporta" -#: src/slic3r/GUI/GUI_ObjectList.cpp:238 +#: src/slic3r/GUI/GUI_ObjectList.cpp:347 msgid "edges fixed" msgstr "spigoli riparati" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2690 +#: src/slic3r/GUI/DoubleSlider.cpp:1508 +msgid "Edit color" +msgstr "Modifica colore" + +#: src/slic3r/GUI/DoubleSlider.cpp:960 +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 +msgid "Edit custom G-code" +msgstr "Modifica G-code personalizzato" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3003 msgid "Edit Height Range" msgstr "Modifica Intervallo Altezza" -#: src/slic3r/GUI/GUI_ObjectList.cpp:373 -msgid "Editing" -msgstr "Editing" +#: src/slic3r/GUI/DoubleSlider.cpp:1509 +msgid "Edit pause print message" +msgstr "Modifica messaggio pausa di stampa" -#: src/libslic3r/PrintConfig.cpp:349 +#: src/slic3r/GUI/DoubleSlider.cpp:1037 +msgid "Edit tick mark - Ctrl + Left click" +msgstr "Modifica segno di spunta - Ctrl + Clic Sinistro" + +#: src/slic3r/GUI/DoubleSlider.cpp:1038 +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 +msgid "Editing" +msgstr "Modifica" + +#: src/slic3r/GUI/MainFrame.cpp:547 +msgid "Ejec&t SD card / Flash drive" +msgstr "Espelli Scheda SD / Memoria flash &t" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Eject SD card / Flash drive" +msgstr "Espelli scheda SD / Memoria flash" + +#: src/slic3r/GUI/MainFrame.cpp:547 +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 +#, possible-c-format +msgid "Ejecting of device %s(%s) has failed." +msgstr "Espulsione del dispositivo %s(%s) non riuscita." + +#: src/libslic3r/PrintConfig.cpp:118 msgid "Elephant foot compensation" msgstr "Compensazione zampa d'elefante" -#: src/libslic3r/SLAPrint.cpp:681 -msgid "Elevation is too low for object. Use the \"Pad around obect\" 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:2447 +msgid "Elephant foot minimum width" +msgstr "Larghezza minima zampa d'elefante" -#: src/libslic3r/SLAPrint.cpp:678 +#: src/libslic3r/SLAPrint.cpp:625 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:1044 +#: src/libslic3r/PrintConfig.cpp:1093 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/slic3r/GUI/Tab.cpp:1490 src/libslic3r/PrintConfig.cpp:1286 -#: src/libslic3r/PrintConfig.cpp:2099 +#: src/libslic3r/GCode.cpp:637 +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 msgid "Enable" msgstr "Abilita" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:313 msgid "Enable auto cooling" msgstr "Abilita raffreddamento automatico" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:572 msgid "Enable fan if layer print time is below" msgstr "Attiva ventola se la stampa del layer impiega meno di" -#: src/libslic3r/PrintConfig.cpp:2321 +#: src/libslic3r/PrintConfig.cpp:2908 +msgid "Enable hollowing" +msgstr "Attiva svuotamento" + +#: src/libslic3r/PrintConfig.cpp:2380 msgid "Enable horizontal mirroring of output images" msgstr "Attiva il mirroring orizzontale per le immagini di output" -#: src/libslic3r/PrintConfig.cpp:1781 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Enable support material generation." msgstr "Abilita la generazione di materiale di supporto." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:966 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:881 +#: src/libslic3r/PrintConfig.cpp:929 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:2085 +#: src/libslic3r/PrintConfig.cpp:2186 msgid "Enable variable layer height feature" msgstr "Abilita layer ad altezza variabile" -#: src/libslic3r/PrintConfig.cpp:2328 +#: src/libslic3r/PrintConfig.cpp:2387 msgid "Enable vertical mirroring of output images" msgstr "Attiva mirroring verticale per le immagini di output" -#: src/slic3r/GUI/Tab.cpp:1570 src/slic3r/GUI/Tab.cpp:1955 -#: src/libslic3r/PrintConfig.cpp:359 src/libslic3r/PrintConfig.cpp:369 +#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:1982 +#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 msgid "End G-code" msgstr "G-code finale" -#: src/libslic3r/PrintConfig.cpp:1838 +#: src/libslic3r/PrintConfig.cpp:1924 msgid "Enforce support for the first" msgstr "Applica il supporto per i primi" -#: src/libslic3r/PrintConfig.cpp:1845 +#: src/libslic3r/PrintConfig.cpp:1931 msgid "Enforce support for the first n layers" msgstr "Applica il supporto per i primi n layer" -#: src/slic3r/GUI/PrintHostDialogs.cpp:197 -#: src/slic3r/GUI/PrintHostDialogs.cpp:228 +#: src/slic3r/GUI/PrintHostDialogs.cpp:198 +#: src/slic3r/GUI/PrintHostDialogs.cpp:229 msgid "Enqueued" msgstr "Messo in coda" -#: src/libslic3r/PrintConfig.cpp:380 +#: src/libslic3r/PrintConfig.cpp:407 msgid "Ensure vertical shell thickness" msgstr "Mantieni spessore guscio verticale" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 +#: src/slic3r/GUI/DoubleSlider.cpp:1618 +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 msgid "Enter new name" msgstr "Inserisci un nuovo nome" -#: src/slic3r/GUI/ConfigWizard.cpp:622 +#: src/slic3r/GUI/DoubleSlider.cpp:1634 +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 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:570 +#: src/slic3r/GUI/ConfigWizard.cpp:979 msgid "Enter the diameter of your filament." msgstr "Inserisci il diametro del filamento." -#: src/slic3r/GUI/ConfigWizard.cpp:557 +#: src/slic3r/GUI/ConfigWizard.cpp:966 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "Inserisci il diametro dell'ugello dell'estrusore della stampante." -#: src/slic3r/GUI/ConfigWizard.cpp:608 +#: src/slic3r/GUI/DoubleSlider.cpp:1650 +msgid "Enter the height you want to jump to" +msgstr "Inserisci l'altezza a cui si vuole saltare" + +#: src/slic3r/GUI/Plater.cpp:4751 +msgid "Enter the number of copies:" +msgstr "Inserisci il numero di copie:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1033 msgid "Enter the temperature needed for extruding your filament." msgstr "Inserisci la temperatura necessaria per estrudere il filamento." -#: src/libslic3r/PrintConfig.cpp:718 +#: src/libslic3r/PrintConfig.cpp:761 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:686 +#: src/libslic3r/PrintConfig.cpp:718 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:678 +#: src/libslic3r/PrintConfig.cpp:710 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:636 src/slic3r/GUI/PrintHostDialogs.cpp:230 +#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:785 +#: src/slic3r/GUI/PrintHostDialogs.cpp:231 msgid "Error" msgstr "Errore" -#: src/slic3r/GUI/FirmwareDialog.cpp:608 +#: src/slic3r/GUI/FirmwareDialog.cpp:645 #, possible-c-format msgid "Error accessing port at %s: %s" msgstr "Errore nell'accedere alla porta a%s: %s" -#: src/slic3r/GUI/Plater.cpp:3593 +#: src/slic3r/GUI/Plater.cpp:3433 +msgid "Error during reload" +msgstr "Errore durante il ri-caricamento" + +#: src/slic3r/GUI/Plater.cpp:5043 #, possible-c-format msgid "Error exporting 3MF file %s" msgstr "Errore nell'esportazione del file 3MF %s" -#: src/slic3r/GUI/Plater.cpp:3564 +#: src/slic3r/GUI/Plater.cpp:5005 #, possible-c-format msgid "Error exporting AMF file %s" msgstr "Errore nell'esportazione del file AMF %s" -#: src/slic3r/GUI/PrintHostDialogs.cpp:153 +#: src/slic3r/GUI/PrintHostDialogs.cpp:154 msgid "Error Message" msgstr "Messaggio d'errore" -#: src/slic3r/GUI/PrintHostDialogs.cpp:271 +#: src/slic3r/GUI/AppConfig.cpp:114 +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." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:272 msgid "Error uploading to print host:" msgstr "Errore durante il caricamento dell'host di stampa:" -#: src/libslic3r/Zipper.cpp:105 +#: src/libslic3r/Zipper.cpp:102 msgid "Error with zip archive" msgstr "Errore con archivio zip" -#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/GUI_ObjectList.cpp:1443 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1918 msgid "Error!" msgstr "Errore!" -#: src/slic3r/GUI/BedShapeDialog.cpp:482 +#: src/slic3r/GUI/BedShapeDialog.cpp:505 msgid "Error! Invalid model" msgstr "Errore! Modello non valido" -#: src/slic3r/GUI/FirmwareDialog.cpp:610 +#: src/slic3r/GUI/FirmwareDialog.cpp:647 #, possible-c-format msgid "Error: %s" msgstr "Errore: %s" -#: src/slic3r/GUI/Plater.cpp:1503 +#: src/slic3r/GUI/Job.hpp:123 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:217 src/slic3r/GUI/Plater.cpp:1028 -#: src/slic3r/GUI/Plater.cpp:1070 +#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1216 +#: src/slic3r/GUI/Plater.cpp:1258 msgid "Estimated printing time" msgstr "Tempo di stampa stimato" -#: src/slic3r/GUI/Plater.cpp:424 +#: src/slic3r/GUI/Plater.cpp:502 msgid "Everywhere" msgstr "Ovunque" -#: src/slic3r/GUI/PresetHints.cpp:50 +#: src/slic3r/GUI/PresetHints.cpp:51 msgid "except for the first %1% layers." msgstr "ad eccezione dei primi %1% layer." -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:53 msgid "except for the first layer." msgstr "ad eccezione del primo layer." -#: src/libslic3r/Print.cpp:1285 +#: src/libslic3r/Print.cpp:1377 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" -#: src/slic3r/GUI/UpdateDialogs.cpp:148 +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 #, possible-c-format msgid "Exit %s" msgstr "Chiudi %s" -#: src/libslic3r/PrintConfig.cpp:335 +#: src/libslic3r/PrintConfig.cpp:371 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:1306 +#: src/libslic3r/PrintConfig.cpp:1375 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:676 src/slic3r/GUI/wxExtensions.cpp:2461 +#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755 msgid "Expert" msgstr "Esperto" -#: src/slic3r/GUI/GUI_App.cpp:676 +#: src/slic3r/GUI/ConfigWizard.cpp:822 +msgid "Expert mode" +msgstr "Modalità Esperto" + +#: src/slic3r/GUI/GUI_App.cpp:815 msgid "Expert View Mode" msgstr "Modalità Visualizzazione Esperto" -#: src/slic3r/GUI/MainFrame.cpp:602 src/slic3r/GUI/Plater.cpp:3821 +#: src/slic3r/GUI/Plater.cpp:5521 msgid "Export" msgstr "Esporta" -#: src/slic3r/GUI/MainFrame.cpp:373 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export &Config" msgstr "Esporta &Configurazione" -#: src/slic3r/GUI/MainFrame.cpp:362 src/slic3r/GUI/MainFrame.cpp:602 +#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:749 msgid "Export &G-code" msgstr "Esporta &G-code" -#: src/slic3r/GUI/MainFrame.cpp:488 +#: src/slic3r/GUI/MainFrame.cpp:496 msgid "Export &toolpaths as OBJ" msgstr "Esporta percorso a&ttrezzo come OBJ" -#: src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Export 3MF" msgstr "Esporta 3MF" -#: src/slic3r/GUI/MainFrame.cpp:375 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export all presets to file" msgstr "Esporta tutti i preset su file" -#: src/libslic3r/PrintConfig.cpp:2954 +#: src/libslic3r/PrintConfig.cpp:3343 msgid "Export AMF" msgstr "Esporta AMF" -#: src/slic3r/GUI/Plater.cpp:1932 +#: src/slic3r/GUI/Plater.cpp:2598 msgid "Export AMF file:" msgstr "Esporta file AMF:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1219 src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1657 src/slic3r/GUI/Plater.cpp:3966 msgid "Export as STL" msgstr "Esporta come STL" -#: src/slic3r/GUI/MainFrame.cpp:375 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +msgid "Export config" +msgstr "Esporta config" + +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export Config &Bundle" msgstr "Esporta Configurazione da &Bundle" -#: src/slic3r/GUI/MainFrame.cpp:373 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export current configuration to file" msgstr "Esporta la configurazione corrente su file" -#: src/slic3r/GUI/MainFrame.cpp:370 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export current plate as AMF" msgstr "Esporta il piano corrente come AMF" -#: src/slic3r/GUI/MainFrame.cpp:362 +#: src/slic3r/GUI/MainFrame.cpp:477 msgid "Export current plate as G-code" msgstr "Esporta il piano corrente come G-code" -#: src/slic3r/GUI/MainFrame.cpp:366 +#: src/slic3r/GUI/MainFrame.cpp:521 +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 msgid "Export current plate as STL" msgstr "Esporta il piano corrente come STL" -#: src/slic3r/GUI/MainFrame.cpp:368 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export current plate as STL including supports" msgstr "Esporta piano corrente come STL includendo i supporti" -#: src/slic3r/GUI/Plater.cpp:2722 +#: src/slic3r/GUI/Plater.cpp:3664 msgid "Export failed" msgstr "Esportazione fallita" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/Plater.cpp:733 -#: src/slic3r/GUI/Plater.cpp:3821 src/libslic3r/PrintConfig.cpp:2964 +#: src/slic3r/GUI/ConfigWizard.cpp:801 +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 msgid "Export G-code" msgstr "Esporta G-code" -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/slic3r/GUI/MainFrame.cpp:521 +msgid "Export G-code to SD card / Flash drive" +msgstr "Esporta G-code su Scheda SD / Memoria flash" + +#: src/libslic3r/PrintConfig.cpp:3320 msgid "Export OBJ" msgstr "Esporta OBJ" -#: src/slic3r/GUI/Plater.cpp:2531 +#: src/slic3r/GUI/Plater.cpp:2610 msgid "Export OBJ file:" msgstr "Esporta file OBJ:" @@ -2041,55 +2456,63 @@ 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:370 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export plate as &AMF" msgstr "Esporta piano come &AMF" -#: src/slic3r/GUI/MainFrame.cpp:366 +#: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export plate as &STL" msgstr "Esporta piano come &STL" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export plate as STL &including supports" msgstr "Esporta piano come STL &includendo i supporti" -#: src/libslic3r/PrintConfig.cpp:2943 +#: src/libslic3r/PrintConfig.cpp:3332 msgid "Export SLA" msgstr "Esporta SLA" -#: src/libslic3r/PrintConfig.cpp:2959 +#: src/slic3r/GUI/Preferences.cpp:72 +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 msgid "Export STL" msgstr "Esporta STL" -#: src/slic3r/GUI/Plater.cpp:1925 +#: src/slic3r/GUI/Plater.cpp:2591 msgid "Export STL file:" msgstr "Esporta file STL:" -#: src/libslic3r/PrintConfig.cpp:2950 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "Export the model(s) as 3MF." msgstr "Esporta modello/i come 3MF." -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3344 msgid "Export the model(s) as AMF." msgstr "Esporta il modello(i) come AMF." -#: src/libslic3r/PrintConfig.cpp:2932 +#: src/libslic3r/PrintConfig.cpp:3321 msgid "Export the model(s) as OBJ." msgstr "Esporta il modello(i) come OBJ." -#: src/libslic3r/PrintConfig.cpp:2960 +#: src/libslic3r/PrintConfig.cpp:3349 msgid "Export the model(s) as STL." msgstr "Esporta il modello(i) come STL." -#: src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/Plater.cpp:3966 msgid "Export the selected object as STL file" msgstr "Esporta l'oggetto selezionato come file STL" -#: src/slic3r/GUI/MainFrame.cpp:488 +#: src/slic3r/GUI/Plater.cpp:880 +msgid "Export to SD card / Flash drive" +msgstr "Esporta su scheda SD / memoria Flash" + +#: src/slic3r/GUI/MainFrame.cpp:496 msgid "Export toolpaths as OBJ" msgstr "Esporta percorso attrezzo come OBJ" -#: src/libslic3r/Print.cpp:1517 +#: src/libslic3r/Print.cpp:1638 msgid "Exporting G-code" msgstr "Esportando il G-code" @@ -2102,139 +2525,143 @@ msgstr "Esportazione modello..." msgid "Exporting source model" msgstr "Esportazione modello sorgente" -#: src/libslic3r/SLAPrint.cpp:700 +#: src/libslic3r/SLAPrint.cpp:646 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:3306 +#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:3515 msgid "Exposure" msgstr "Esposizione" -#: src/libslic3r/PrintConfig.cpp:2310 src/libslic3r/PrintConfig.cpp:2311 +#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542 msgid "Exposure time" msgstr "Tempo di esposizione" -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/GCode/PreviewData.cpp:164 +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311 msgid "External perimeter" msgstr "Perimetro esterno" -#: src/slic3r/GUI/PresetHints.cpp:153 +#: src/slic3r/GUI/PresetHints.cpp:156 msgid "external perimeters" msgstr "perimetri esterni" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:425 +#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457 msgid "External perimeters" msgstr "Perimetri esterni" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:469 msgid "External perimeters first" msgstr "Perimetri esterni per primi" -#: src/libslic3r/PrintConfig.cpp:1518 src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596 msgid "Extra length on restart" msgstr "Lunghezza extra in ripresa" -#: src/libslic3r/PrintConfig.cpp:1321 +#: src/libslic3r/PrintConfig.cpp:1390 msgid "Extra loading distance" msgstr "Distanza di caricamento aggiuntiva" -#: src/libslic3r/PrintConfig.cpp:445 +#: src/libslic3r/PrintConfig.cpp:477 msgid "Extra perimeters if needed" msgstr "Perimetro aggiuntivo se necessario" -#: src/slic3r/GUI/GUI_ObjectList.cpp:335 src/slic3r/GUI/Tab.cpp:1479 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1434 +#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487 msgid "Extruder" msgstr "Estrusore" -#: src/slic3r/GUI/Tab.cpp:2253 src/libslic3r/GCode/PreviewData.cpp:475 +#: 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 #, possible-c-format msgid "Extruder %d" msgstr "Estrusore %d" -#: src/slic3r/GUI/ConfigWizard.cpp:592 +#: src/slic3r/GUI/DoubleSlider.cpp:1011 +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:226 +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" msgstr "Cambia estrusore a" -#: src/slic3r/GUI/Tab.cpp:1171 +#: src/slic3r/GUI/Tab.cpp:1233 msgid "Extruder clearance (mm)" msgstr "Spazio libero per l'estrusore (mm)" -#: src/libslic3r/PrintConfig.cpp:490 +#: src/libslic3r/PrintConfig.cpp:522 msgid "Extruder Color" msgstr "Colore estrusore" -#: src/libslic3r/PrintConfig.cpp:497 +#: src/libslic3r/PrintConfig.cpp:529 msgid "Extruder offset" msgstr "Offset estrusore" -#: src/libslic3r/PrintConfig.cpp:863 +#: 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:1978 +#: 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:33 src/slic3r/GUI/GUI_ObjectList.cpp:72 -#: src/slic3r/GUI/GUI_ObjectList.cpp:513 src/slic3r/GUI/Tab.cpp:1119 -#: src/slic3r/GUI/Tab.cpp:1844 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:954 src/libslic3r/PrintConfig.cpp:1340 -#: src/libslic3r/PrintConfig.cpp:1668 src/libslic3r/PrintConfig.cpp:1852 -#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:2151 -#: src/libslic3r/PrintConfig.cpp:2159 +#: 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 msgid "Extruders" msgstr "Estrusori" -#: src/libslic3r/PrintConfig.cpp:507 +#: src/libslic3r/PrintConfig.cpp:539 msgid "Extrusion axis" msgstr "Asse estrusore" -#: src/libslic3r/PrintConfig.cpp:513 +#: src/libslic3r/PrintConfig.cpp:545 msgid "Extrusion multiplier" msgstr "Moltiplicatore estrusione" -#: src/slic3r/GUI/ConfigWizard.cpp:612 +#: src/slic3r/GUI/ConfigWizard.cpp:1037 msgid "Extrusion Temperature:" msgstr "Temperatura di estrusione:" -#: src/slic3r/GUI/Tab.cpp:1143 +#: src/slic3r/GUI/Tab.cpp:1205 msgid "Extrusion width" msgstr "Larghezza estrusione" -#: src/slic3r/GUI/GUI_ObjectList.cpp:73 src/slic3r/GUI/GUI_ObjectList.cpp:514 -#: src/libslic3r/PrintConfig.cpp:416 src/libslic3r/PrintConfig.cpp:523 -#: src/libslic3r/PrintConfig.cpp:830 src/libslic3r/PrintConfig.cpp:962 -#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1688 -#: src/libslic3r/PrintConfig.cpp:1861 src/libslic3r/PrintConfig.cpp:2018 +#: 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 msgid "Extrusion Width" msgstr "Larghezza Estrusione" -#: src/slic3r/GUI/Plater.cpp:139 +#: src/slic3r/GUI/Plater.cpp:162 msgid "Facets" msgstr "Facce" -#: src/slic3r/GUI/GUI_ObjectList.cpp:240 +#: src/slic3r/GUI/GUI_ObjectList.cpp:349 msgid "facets added" msgstr "aggiunte facce" -#: src/slic3r/GUI/GUI_ObjectList.cpp:239 +#: src/slic3r/GUI/GUI_ObjectList.cpp:348 msgid "facets removed" msgstr "rimosse facce" -#: src/slic3r/GUI/GUI_ObjectList.cpp:241 +#: src/slic3r/GUI/GUI_ObjectList.cpp:350 msgid "facets reversed" msgstr "facce invertite" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2517 msgid "Faded layers" msgstr "Layer sfumati" -#: src/libslic3r/Zipper.cpp:47 +#: src/libslic3r/Zipper.cpp:44 msgid "failed finding central directory" msgstr "directory centrale non trovata" @@ -2242,165 +2669,181 @@ msgstr "directory centrale non trovata" msgid "Failed loading the input model." msgstr "Caricamento modello input fallito." -#: src/libslic3r/PrintBase.cpp:65 +#: src/libslic3r/PrintBase.cpp:71 msgid "Failed processing of the output_filename_format template." msgstr "Elaborazione fallita del modello output_filename_format." -#: src/slic3r/GUI/PresetHints.cpp:41 +#: src/slic3r/GUI/PresetHints.cpp:42 msgid "Fan" msgstr "Ventola" -#: src/slic3r/GUI/Tab.cpp:1501 +#: src/slic3r/GUI/Tab.cpp:1456 msgid "Fan settings" msgstr "Impostazioni ventola" -#: src/slic3r/GUI/Tab.cpp:1502 +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1457 msgid "Fan speed" msgstr "Velocità ventola" -#: src/libslic3r/PrintConfig.cpp:2240 +#: src/libslic3r/GCode/PreviewData.cpp:353 +msgid "Fan Speed (%)" +msgstr "Velocità ventola (%)" + +#: src/libslic3r/PrintConfig.cpp:2405 msgid "Fast" msgstr "Veloce" -#: src/libslic3r/PrintConfig.cpp:2241 +#: src/libslic3r/PrintConfig.cpp:2406 msgid "Fast tilt" msgstr "Tilt veloce" -#: src/slic3r/GUI/GUI_App.cpp:135 +#: src/slic3r/GUI/GUI_App.cpp:141 msgid "Fatal error" msgstr "Errore irreversibile" -#: src/slic3r/GUI/GUI_Preview.cpp:212 src/slic3r/GUI/GUI_Preview.cpp:537 -#: src/libslic3r/GCode/PreviewData.cpp:394 +#: 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 di caratteristica" -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:225 +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235 msgid "Feature types" msgstr "Tipi di caratteristica" -#: src/slic3r/GUI/Plater.cpp:682 src/slic3r/GUI/Tab.cpp:1470 -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/ConfigWizard.cpp:1525 +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 msgid "Filament" msgstr "Filamento" -#: src/slic3r/GUI/Preset.cpp:1275 +#: src/slic3r/GUI/Preset.cpp:1522 msgid "filament" msgstr "filamento" -#: src/slic3r/GUI/ConfigWizard.cpp:541 +#: src/slic3r/GUI/ConfigWizard.cpp:952 msgid "Filament and Nozzle Diameters" msgstr "Diametro filamento e ugello" -#: src/slic3r/GUI/ConfigWizard.cpp:574 +#: src/slic3r/GUI/ConfigWizard.cpp:983 msgid "Filament Diameter:" msgstr "Diametro del filamento:" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:651 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:654 +#: src/libslic3r/PrintConfig.cpp:686 msgid "Filament load time" msgstr "Durata caricamento filamento" -#: src/libslic3r/PrintConfig.cpp:556 +#: src/libslic3r/PrintConfig.cpp:588 msgid "Filament notes" msgstr "Note filamento" -#: src/slic3r/GUI/Tab.cpp:1502 src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1378 msgid "Filament Overrides" msgstr "Sovrascrittura filamento" -#: src/libslic3r/PrintConfig.cpp:1312 +#: src/libslic3r/PrintConfig.cpp:1381 msgid "Filament parking position" msgstr "Posizione di parcheggio del filamento" -#: src/slic3r/GUI/Tab.cpp:1516 +#: src/slic3r/GUI/ConfigWizard.cpp:2013 +msgid "Filament Profiles Selection" +msgstr "Selezione Profili Filamento" + +#: src/slic3r/GUI/Tab.cpp:1471 msgid "Filament properties" msgstr "Proprietà filamento" -#: src/slic3r/GUI/Tab.hpp:335 +#: src/slic3r/GUI/Tab.hpp:355 msgid "Filament Settings" msgstr "Impostazioni Filamento" -#: src/libslic3r/PrintConfig.cpp:694 +#: src/libslic3r/PrintConfig.cpp:726 msgid "Filament type" msgstr "Tipo filamento" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:701 msgid "Filament unload time" msgstr "Durata scaricamento filamento" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "filaments" msgstr "filamenti" -#: src/libslic3r/Zipper.cpp:75 +#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2013 +msgid "Filaments" +msgstr "Filamenti" + +#: src/libslic3r/Zipper.cpp:72 msgid "file close failed" msgstr "chiusura del file fallita" -#: src/libslic3r/Zipper.cpp:69 +#: src/libslic3r/Zipper.cpp:66 msgid "file create failed" -msgstr "creazione del file non riuscita" +msgstr "generazione del file non riuscita" -#: src/slic3r/GUI/MainFrame.cpp:642 +#: src/slic3r/GUI/MainFrame.cpp:791 msgid "File Not Found" msgstr "file non trovato" -#: src/libslic3r/Zipper.cpp:89 +#: src/libslic3r/Zipper.cpp:86 msgid "file not found" msgstr "file non trovato" -#: src/libslic3r/Zipper.cpp:67 +#: src/libslic3r/Zipper.cpp:64 msgid "file open failed" msgstr "apertura file non riuscita" -#: src/libslic3r/Zipper.cpp:73 +#: src/libslic3r/Zipper.cpp:70 msgid "file read failed" msgstr "lettura del file non riuscita" -#: src/libslic3r/Zipper.cpp:77 +#: src/libslic3r/Zipper.cpp:74 msgid "file seek failed" msgstr "ricerca file fallita" -#: src/libslic3r/Zipper.cpp:79 +#: src/libslic3r/Zipper.cpp:76 msgid "file stat failed" msgstr "statistica file non riuscita" -#: src/libslic3r/Zipper.cpp:39 +#: src/libslic3r/Zipper.cpp:36 msgid "file too large" msgstr "file troppo grande" -#: src/libslic3r/Zipper.cpp:71 +#: src/libslic3r/Zipper.cpp:68 msgid "file write failed" msgstr "scrittura file fallita" -#: src/slic3r/GUI/PrintHostDialogs.cpp:152 +#: src/slic3r/GUI/PrintHostDialogs.cpp:153 msgid "Filename" msgstr "Nome file" -#: src/libslic3r/PrintConfig.cpp:728 +#: src/libslic3r/PrintConfig.cpp:775 msgid "Fill angle" msgstr "Angolo riempimento" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:789 msgid "Fill density" msgstr "Densità riempimento" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:826 msgid "Fill pattern" msgstr "Trama riempimento" -#: src/libslic3r/PrintConfig.cpp:410 +#: src/libslic3r/PrintConfig.cpp:437 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:781 +#: src/libslic3r/PrintConfig.cpp:828 msgid "Fill pattern for general low-density infill." msgstr "Trama riempimento generale a bassa densità." -#: src/libslic3r/PrintConfig.cpp:390 +#: src/libslic3r/PrintConfig.cpp:417 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." @@ -2408,364 +2851,463 @@ msgstr "Trama per riempimento superiore. Questo influenza solamente il layer sup msgid "Finished" msgstr "Finito" -#: src/slic3r/GUI/ConfigWizard.cpp:486 src/slic3r/GUI/Tab.cpp:1920 +#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1947 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/FirmwareDialog.cpp:740 +#: src/slic3r/GUI/FirmwareDialog.cpp:777 msgid "Firmware flasher" -msgstr "Flasher Firmware" +msgstr "Firmware flasher" -#: src/slic3r/GUI/FirmwareDialog.cpp:765 +#: src/slic3r/GUI/FirmwareDialog.cpp:802 msgid "Firmware image:" msgstr "Immagine firmware:" -#: src/slic3r/GUI/Tab.cpp:2431 +#: src/slic3r/GUI/Tab.cpp:2577 msgid "Firmware Retraction" msgstr "Retrazione Firmware" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:891 msgid "Firmware Type" msgstr "Tipo Firmware" -#: src/libslic3r/PrintConfig.cpp:812 src/libslic3r/PrintConfig.cpp:821 -#: src/libslic3r/PrintConfig.cpp:829 src/libslic3r/PrintConfig.cpp:862 +#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868 +#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910 msgid "First layer" msgstr "Primo layer" -#: src/libslic3r/PrintConfig.cpp:841 +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889 msgid "First layer height" msgstr "Altezza del primo layer" -#: src/libslic3r/Print.cpp:1328 +#: src/libslic3r/Print.cpp:1422 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:852 +#: src/libslic3r/PrintConfig.cpp:900 msgid "First layer speed" msgstr "Velocità del primo layer" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "First layer volumetric" msgstr "Volumetrica primo layer" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1210 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 msgid "Fix through the Netfabb" msgstr "Ripara tramite Netfabb" -#: src/slic3r/GUI/Plater.cpp:3072 +#: src/slic3r/GUI/Plater.cpp:3473 msgid "Fix Throught NetFabb" msgstr "Ripara tramite NetFabb" -#: src/slic3r/GUI/GUI_App.cpp:685 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Flash printer &firmware" msgstr "Installa &firmware stampante" -#: src/slic3r/GUI/FirmwareDialog.cpp:146 +#: src/slic3r/GUI/FirmwareDialog.cpp:150 msgid "Flash!" msgstr "Flash!" -#: src/slic3r/GUI/FirmwareDialog.cpp:275 +#: src/slic3r/GUI/FirmwareDialog.cpp:284 msgid "Flashing cancelled." msgstr "Flash annullato." -#: src/slic3r/GUI/FirmwareDialog.cpp:192 +#: src/slic3r/GUI/FirmwareDialog.cpp:199 msgid "Flashing failed" msgstr "Flash non riuscito" -#: src/slic3r/GUI/FirmwareDialog.cpp:274 +#: src/slic3r/GUI/FirmwareDialog.cpp:283 msgid "Flashing failed. Please see the avrdude log below." msgstr "Flash fallito. Ti preghiamo di consultare il registro avrdude qui sotto." -#: src/slic3r/GUI/FirmwareDialog.cpp:148 +#: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flashing in progress. Please do not disconnect the printer!" msgstr "Flash in corso. Non disconnettere la stampante!" -#: src/slic3r/GUI/FirmwareDialog.cpp:273 +#: src/slic3r/GUI/FirmwareDialog.cpp:282 msgid "Flashing succeeded!" msgstr "Flash completato con successo!" -#: src/slic3r/GUI/Tab.cpp:1156 +#: src/slic3r/GUI/Tab.cpp:1218 msgid "Flow" msgstr "Flusso" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:220 msgid "flow rate is maximized" msgstr "il flusso viene massimizzato" -#: src/slic3r/GUI/UpdateDialogs.cpp:188 +#: src/slic3r/GUI/UpdateDialogs.cpp:286 msgid "For more information please visit our wiki page:" msgstr "Per maggiori informazioni visita la nostra pagina wiki:" -#: src/slic3r/GUI/Plater.cpp:435 src/slic3r/GUI/Plater.cpp:528 +#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Plater.cpp:624 msgid "For support enforcers only" msgstr "Solo per rinforzi supporto" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3345 -msgid "for the left button: \tindicates a non-system (or non-default) preset,\nfor the right button: \tindicates that the settings hasn't been modified." +#: src/slic3r/GUI/Tab.cpp:3267 +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/libslic3r/Print.cpp:1302 +#: src/slic3r/GUI/ConfigManipulation.cpp:136 +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 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:1660 +#: src/libslic3r/PrintConfig.cpp:2864 +msgid "Force pad around object everywhere" +msgstr "Forza il Pad ovunque intorno all'oggetto" + +#: src/libslic3r/PrintConfig.cpp:1729 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:1023 +#: src/libslic3r/PrintConfig.cpp:1072 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." -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 msgid "From" msgstr "Da" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1853 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2223 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:525 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front" msgstr "Frontale" -#: src/slic3r/GUI/MainFrame.cpp:525 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front View" msgstr "Vista anteriore" -#: src/slic3r/GUI/MainFrame.cpp:677 +#: src/slic3r/GUI/Tab.cpp:1013 +msgid "full profile name" +msgstr "nome completo profilo" + +#: src/slic3r/GUI/MainFrame.cpp:826 msgid "G-code" msgstr "G-code" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:87 +#: src/slic3r/GUI/DoubleSlider.cpp:1021 +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 msgid "G-code file exported to %1%" msgstr "G-code esportato in %1%" -#: src/libslic3r/PrintConfig.cpp:888 +#: src/libslic3r/PrintConfig.cpp:936 msgid "G-code flavor" msgstr "Formato G-code" -#: src/libslic3r/PrintConfig.cpp:689 +#: src/libslic3r/PrintConfig.cpp:721 msgid "g/cm³" msgstr "g/cm³" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/PrintConfig.cpp:870 -#: src/libslic3r/GCode/PreviewData.cpp:170 +#: src/libslic3r/PrintConfig.cpp:2505 +msgid "g/ml" +msgstr "g/ml" + +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/PrintConfig.cpp:918 msgid "Gap fill" msgstr "Riempimento spazi" -#: src/slic3r/GUI/Preferences.cpp:19 src/slic3r/GUI/Tab.cpp:1812 -#: src/slic3r/GUI/Tab.cpp:2013 +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1796 +#: src/slic3r/GUI/Tab.cpp:2040 msgid "General" msgstr "Generale" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1307 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:1779 +#: src/libslic3r/PrintConfig.cpp:1865 msgid "Generate support material" msgstr "Genera materiale di supporto" -#: src/libslic3r/PrintConfig.cpp:1840 +#: src/libslic3r/PrintConfig.cpp:1926 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:2362 +#: src/libslic3r/PrintConfig.cpp:2613 msgid "Generate supports" msgstr "Genera supporti" -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2615 msgid "Generate supports for the models" msgstr "Genera supporti per i modelli" -#: src/libslic3r/Print.cpp:1492 +#: src/libslic3r/Print.cpp:1614 msgid "Generating brim" msgstr "Generazione brim" -#: src/libslic3r/Print.cpp:1524 +#: src/libslic3r/Print.cpp:1642 msgid "Generating G-code" msgstr "Generazione G-code" -#: src/libslic3r/SLAPrint.cpp:58 +#: src/libslic3r/SLAPrintSteps.cpp:48 msgid "Generating pad" msgstr "Generazione pad" -#: src/libslic3r/PrintObject.cpp:141 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "Generazione perimetri" -#: src/libslic3r/Print.cpp:1484 +#: src/libslic3r/Print.cpp:1606 msgid "Generating skirt" msgstr "Generando skirt" -#: src/libslic3r/PrintObject.cpp:391 +#: src/libslic3r/PrintObject.cpp:395 msgid "Generating support material" msgstr "Generazione materiale di supporto" -#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:809 +#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356 msgid "Generating support points" msgstr "Generazione punti di supporto" -#: src/libslic3r/SLAPrint.cpp:57 +#: src/libslic3r/SLAPrintSteps.cpp:47 msgid "Generating support tree" msgstr "Generazione albero di supporto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2022 msgid "Generic" msgstr "Generico" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 msgid "Gizmo cut" msgstr "Gizmo Taglia" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Gizmo move" msgstr "Gizmo Sposta" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Gizmo Place face on bed" msgstr "Gizmo Posiziona faccia sul piano" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Gizmo rotate" msgstr "Gizmo Ruota" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Gizmo scale" msgstr "Gizmo Ridimensiona" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +msgid "Gizmo SLA hollow" +msgstr "Gizmo SLA Svuota" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 msgid "Gizmo SLA support points" msgstr "Gizmo Punti supporto SLA" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:641 +#: src/slic3r/GUI/GLCanvas3D.cpp:2921 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 msgid "Gizmo-Move" msgstr "Gizmo-Sposta" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:569 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:489 msgid "Gizmo-Place on Face" -msgstr "Gizmo-Posiziona sulla faccia" +msgstr "Gizmo-Posiziona su faccia" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:651 +#: src/slic3r/GUI/GLCanvas3D.cpp:3001 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:564 msgid "Gizmo-Rotate" msgstr "Gizmo-Ruota" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:646 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:563 msgid "Gizmo-Scale" msgstr "Gizmo-Ridimensiona" -#: src/slic3r/GUI/AboutDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +msgid "Gizmos" +msgstr "Gizmo" + +#: src/slic3r/GUI/AboutDialog.cpp:259 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero General Public License, versione 3" -#: src/slic3r/GUI/ConfigWizard.cpp:571 +#: src/slic3r/GUI/ConfigWizard.cpp:980 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:797 +#: src/libslic3r/PrintConfig.cpp:844 msgid "Grid" msgstr "Griglia" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1846 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2454 msgid "Group manipulation" msgstr "Manipolazione gruppo" -#: src/libslic3r/PrintConfig.cpp:805 +#: src/slic3r/GUI/Preferences.cpp:133 +msgid "GUI" +msgstr "GUI" + +#: src/libslic3r/PrintConfig.cpp:852 msgid "Gyroid" msgstr "Giroide" -#: src/slic3r/GUI/Tab.cpp:2775 +#: 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:840 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 msgid "Head diameter" msgstr "Diametro testa" -#: src/libslic3r/PrintConfig.cpp:822 +#: src/slic3r/GUI/ConfigManipulation.cpp:317 +msgid "Head penetration should not be greater than the head width." +msgstr "L'inserimento della capocchia non deve essere più grande della sua larghezza." + +#: src/libslic3r/PrintConfig.cpp:869 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:213 src/libslic3r/PrintConfig.cpp:468 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500 msgid "Height" msgstr "Altezza" -#: src/libslic3r/GCode/PreviewData.cpp:396 +#: src/libslic3r/GCode/PreviewData.cpp:347 msgid "Height (mm)" msgstr "Altezza (mm)" -#: src/libslic3r/PrintConfig.cpp:1618 +#: src/libslic3r/PrintConfig.cpp:1688 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:2209 +#: src/libslic3r/PrintConfig.cpp:2360 msgid "Height of the display" msgstr "Altezza del display" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1350 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1500 msgid "Height range Modifier" msgstr "Modificatore intervallo Altezza" -#: src/slic3r/GUI/GLCanvas3D.cpp:3650 src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 msgid "Height ranges" msgstr "Intervalli Altezza" -#: src/libslic3r/PrintConfig.cpp:226 +#: src/libslic3r/PrintConfig.cpp:261 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:300 +#: src/slic3r/GUI/ConfigWizard.cpp:433 #, 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:2976 +#: src/libslic3r/PrintConfig.cpp:3365 msgid "Help" msgstr "Aiuto" -#: src/libslic3r/PrintConfig.cpp:2982 +#: src/libslic3r/PrintConfig.cpp:3371 msgid "Help (FFF options)" msgstr "Aiuto (opzioni FFF)" -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3376 msgid "Help (SLA options)" msgstr "Aiuto (opzioni SLA)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." msgstr "Qui è possibile regolare il volume di spurgo necessario (mm³) per ogni coppia di attrezzi." -#: src/libslic3r/PrintConfig.cpp:925 +#: src/libslic3r/PrintConfig.cpp:973 msgid "High extruder current on filament swap" msgstr "Alta corrente estrusore al cambio filamento" -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:806 +#: src/slic3r/GUI/GLCanvas3D.cpp:277 +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 msgid "Hilbert Curve" msgstr "Curva di Hilbert" -#: src/slic3r/GUI/Plater.cpp:873 +#: src/slic3r/GUI/Plater.cpp:1042 msgid "Hold Shift to Slice & Export G-code" msgstr "Tieni premuto Shift per fare lo Slice & Esportare il G-code" -#: src/libslic3r/PrintConfig.cpp:803 src/libslic3r/PrintConfig.cpp:1924 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Hole depth" +msgstr "Profondità foro" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +msgid "Hole diameter" +msgstr "Diametro foro" + +#: src/slic3r/GUI/Plater.cpp:2760 +msgid "Hollow" +msgstr "Svuota" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:977 +msgid "Hollow and drill" +msgstr "Svuota e perfora" + +#: src/libslic3r/PrintConfig.cpp:2910 +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 +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 +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 +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 +msgid "Hollowing model" +msgstr "Svuotamento modello" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:813 +msgid "Hollowing parameter change" +msgstr "Cambio parametro svuotamento" + +#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011 msgid "Honeycomb" msgstr "Nido d'ape" -#: src/slic3r/GUI/Tab.cpp:1013 +#: src/slic3r/GUI/Tab.cpp:1064 msgid "Horizontal shells" msgstr "Gusci orizzontali" -#: src/libslic3r/PrintConfig.cpp:209 +#: src/libslic3r/PrintConfig.cpp:245 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:151 +#: src/slic3r/GUI/PrintHostDialogs.cpp:152 msgid "Host" msgstr "Host" -#: src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Host Type" msgstr "Tipo di Host" @@ -2773,162 +3315,189 @@ msgstr "Tipo di Host" msgid "Hostname" msgstr "Nome Host" -#: src/libslic3r/PrintConfig.cpp:81 +#: src/libslic3r/PrintConfig.cpp:97 msgid "Hostname, IP or URL" msgstr "Nome Host, IP o URL" -#: src/slic3r/GUI/Tab.cpp:136 +#: src/slic3r/GUI/Tab.cpp:139 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:2734 +#: src/libslic3r/PrintConfig.cpp:2812 +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 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:2380 +#: src/libslic3r/PrintConfig.cpp:2631 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:2642 +#: src/libslic3r/PrintConfig.cpp:2755 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:95 +#: src/libslic3r/PrintConfig.cpp:111 msgid "HTTPS CA File" msgstr "File HTTPS CA" -#: src/slic3r/GUI/Tab.cpp:1731 +#: src/slic3r/GUI/Tab.cpp:1713 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/Tab.cpp:1773 -#, possible-c-format -msgid "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." -msgstr "File HTTPS CA:\nSu questo sistema, %s utilizza certificati HTTPS provenienti dal sistema Certificate Store o da Keychain.\nPer utilizzare un file CA personalizzato, importa il tuo file CA sul Certificate Store / Keychain." - -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:222 msgid "Icon size in a respect to the default size" msgstr "Dimensioni icona rispetto alla dimensione predefinita" -#: src/slic3r/GUI/PrintHostDialogs.cpp:148 +#: src/slic3r/GUI/PrintHostDialogs.cpp:149 msgid "ID" msgstr "ID" -#: src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1873 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:413 +#: src/slic3r/GUI/ConfigWizard.cpp:773 #, 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:423 +#: src/slic3r/GUI/ConfigWizard.cpp:783 #, 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:1774 +#: src/libslic3r/PrintConfig.cpp:1852 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/Preferences.cpp:63 +#: src/slic3r/GUI/ConfigWizard.cpp:805 +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 +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 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:71 +#: src/slic3r/GUI/Preferences.cpp:82 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:105 +#: src/slic3r/GUI/Preferences.cpp:106 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/slic3r/GUI/Preferences.cpp:112 -msgid "If enabled, use perspective camera. If not enabled, use orthographic camera." -msgstr "Se attivo, usa la camera in prospettiva. Se non attivo, usa la camera ortografica." +#: src/libslic3r/PrintConfig.cpp:1696 +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/slic3r/GUI/Preferences.cpp:119 +#: src/libslic3r/PrintConfig.cpp:1858 +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 +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 +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 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:28 +#: src/slic3r/GUI/PresetHints.cpp:29 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/libslic3r/PrintConfig.cpp:853 +#: src/slic3r/GUI/PresetHints.cpp:36 +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 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:540 +#: src/libslic3r/PrintConfig.cpp:573 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:1636 +#: src/libslic3r/PrintConfig.cpp:1706 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:534 +#: src/libslic3r/PrintConfig.cpp:567 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:46 +#: src/slic3r/GUI/Preferences.cpp:49 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:54 +#: src/slic3r/GUI/Preferences.cpp:57 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:38 +#: src/slic3r/GUI/Preferences.cpp:41 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:1492 +#: src/libslic3r/PrintConfig.cpp:1562 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:1501 +#: src/libslic3r/PrintConfig.cpp:1571 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:1510 +#: src/libslic3r/PrintConfig.cpp:1580 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:1384 +#: src/libslic3r/PrintConfig.cpp:1454 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:498 +#: src/libslic3r/PrintConfig.cpp:530 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:2068 +#: src/libslic3r/PrintConfig.cpp:2169 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:3096 +#: src/libslic3r/PrintConfig.cpp:3485 msgid "Ignore non-existent config files" msgstr "Ignora file di configurazione non esistenti" -#: src/slic3r/GUI/MainFrame.cpp:352 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Import &Config" msgstr "Importa &Configurazione" -#: src/slic3r/GUI/MainFrame.cpp:357 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Import Config &Bundle" msgstr "Importa Configurazione da &Bundle" -#: src/slic3r/GUI/MainFrame.cpp:354 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Import Config from &project" msgstr "Importa Configurazione da &progetto" -#: src/slic3r/GUI/Plater.cpp:4016 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +msgid "Import Config from ini/amf/3mf/gcode" +msgstr "Importa Config da ini/amf/3mf/gcode" + +#: src/slic3r/GUI/Plater.cpp:4603 msgid "Import Object" msgstr "Importa Oggetto" -#: src/slic3r/GUI/Plater.cpp:4020 +#: src/slic3r/GUI/Plater.cpp:4607 msgid "Import Objects" msgstr "Importa Oggetti" @@ -2936,439 +3505,488 @@ msgstr "Importa Oggetti" msgid "Import of the repaired 3mf file failed" msgstr "Importazione del file 3mf riparato non riuscita" -#: src/slic3r/GUI/MainFrame.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Importa STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "Importa STL/OBJ/AMF/3MF senza configurazione, mantieni il piano" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +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:2416 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3422 #, 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/UpdateDialogs.cpp:132 +#: src/slic3r/GUI/UpdateDialogs.cpp:230 msgid "Incompatible bundles:" msgstr "Gruppi incompatibili:" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 #, possible-c-format msgid "Incompatible with this %s" msgstr "Incompatibile con questo %s" -#: src/slic3r/GUI/Plater.cpp:4091 +#: src/slic3r/GUI/Plater.cpp:4685 msgid "Increase Instances" msgstr "Aumenta Istanze" +#: src/slic3r/GUI/GLCanvas3D.cpp:264 +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:3338 +#: 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.\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:3334 +#: src/slic3r/GUI/Tab.cpp:3254 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:3083 +#: 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.\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/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:69 -#: src/slic3r/GUI/GUI_ObjectList.cpp:510 src/slic3r/GUI/Plater.cpp:439 -#: src/slic3r/GUI/Tab.cpp:1030 src/slic3r/GUI/Tab.cpp:1031 -#: src/slic3r/GUI/Tab.cpp:1360 src/libslic3r/PrintConfig.cpp:167 -#: src/libslic3r/PrintConfig.cpp:389 src/libslic3r/PrintConfig.cpp:729 -#: src/libslic3r/PrintConfig.cpp:743 src/libslic3r/PrintConfig.cpp:780 -#: src/libslic3r/PrintConfig.cpp:933 src/libslic3r/PrintConfig.cpp:943 -#: src/libslic3r/PrintConfig.cpp:961 src/libslic3r/PrintConfig.cpp:979 -#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1659 -#: src/libslic3r/PrintConfig.cpp:1676 +#: 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 msgid "Infill" msgstr "Riempimento" -#: src/slic3r/GUI/PresetHints.cpp:171 +#: src/slic3r/GUI/PresetHints.cpp:174 msgid "infill" msgstr "riempimento" -#: src/libslic3r/PrintConfig.cpp:972 +#: src/libslic3r/PrintConfig.cpp:1021 msgid "Infill before perimeters" msgstr "Riempimento prima dei perimetri" -#: src/libslic3r/PrintConfig.cpp:953 +#: src/libslic3r/PrintConfig.cpp:1001 msgid "Infill extruder" msgstr "Estrusore riempimento" -#: src/libslic3r/PrintConfig.cpp:987 +#: src/libslic3r/PrintConfig.cpp:1036 msgid "Infill/perimeters overlap" msgstr "Sovrapposizione riempimento/perimetri" -#: src/libslic3r/Print.cpp:1476 +#: src/libslic3r/Print.cpp:1584 msgid "Infilling layers" msgstr "Layer di riempimento" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:118 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3430 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 src/slic3r/GUI/Plater.cpp:141 msgid "Info" msgstr "Info" -#: src/libslic3r/PrintConfig.cpp:1008 +#: src/libslic3r/PrintConfig.cpp:1057 msgid "Inherits profile" msgstr "Eredita profilo" -#: src/libslic3r/SLAPrint.cpp:707 +#: src/libslic3r/SLAPrint.cpp:653 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:2317 src/libslic3r/PrintConfig.cpp:2318 +#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565 msgid "Initial exposure time" msgstr "Tempo di esposizione iniziale" -#: src/libslic3r/PrintConfig.cpp:2295 src/libslic3r/PrintConfig.cpp:2296 +#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483 msgid "Initial layer height" msgstr "Altezza layer iniziale" -#: src/slic3r/GUI/Field.cpp:155 +#: src/slic3r/GUI/Field.cpp:204 msgid "Input value is out of range" msgstr "Valore input fuori portata" -#: src/slic3r/GUI/GUI_App.cpp:661 +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "Inspect / activate configuration snapshots" msgstr "Ispeziona / attiva istantanee di configurazione" -#: src/slic3r/GUI/wxExtensions.cpp:407 src/slic3r/GUI/wxExtensions.cpp:474 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:60 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:216 #, possible-c-format msgid "Instance %d" msgstr "Istanza %d" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1887 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2500 msgid "Instance manipulation" msgstr "Manipolazione istanza" -#: src/slic3r/GUI/wxExtensions.cpp:358 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:56 msgid "Instances" msgstr "Istanze" -#: src/slic3r/GUI/GUI_ObjectList.cpp:934 src/slic3r/GUI/GUI_ObjectList.cpp:3346 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3781 msgid "Instances to Separated Objects" msgstr "Istanze in Oggetti Separati" -#: src/libslic3r/PrintConfig.cpp:1886 +#: src/libslic3r/PrintConfig.cpp:1973 msgid "Interface layers" msgstr "Layer interfaccia" -#: src/libslic3r/PrintConfig.cpp:1870 +#: src/libslic3r/PrintConfig.cpp:1957 msgid "Interface loops" msgstr "Giri interfaccia" -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:1982 msgid "Interface pattern spacing" msgstr "Spaziatura trama interfaccia" -#: src/libslic3r/PrintConfig.cpp:1022 +#: src/libslic3r/PrintConfig.cpp:1071 msgid "Interface shells" msgstr "Gusci interfaccia" -#: src/libslic3r/Zipper.cpp:87 +#: src/libslic3r/Zipper.cpp:84 msgid "internal error" msgstr "errore interno" -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/GCode/PreviewData.cpp:166 +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313 msgid "Internal infill" msgstr "Riempimento interno" -#: src/slic3r/GUI/Plater.cpp:2397 +#: src/slic3r/GUI/Plater.cpp:3106 msgid "Invalid data" msgstr "Dati non validi" -#: src/slic3r/GUI/BedShapeDialog.cpp:471 src/slic3r/GUI/BedShapeDialog.cpp:520 -#: src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:566 msgid "Invalid file format." msgstr "Formato file non valido." -#: src/libslic3r/Zipper.cpp:83 +#: src/libslic3r/Zipper.cpp:80 msgid "invalid filename" msgstr "nome file non valido" -#: src/libslic3r/Zipper.cpp:51 +#: src/slic3r/GUI/ConfigManipulation.cpp:319 +msgid "Invalid Head penetration" +msgstr "Inserimento Capocchia non valido" + +#: src/libslic3r/Zipper.cpp:48 msgid "invalid header or archive is corrupted" msgstr "titolo non valido o archivio corrotto" -#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/Field.cpp:173 +#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376 msgid "Invalid numeric input." msgstr "Input numerico non valido." -#: src/libslic3r/Zipper.cpp:81 +#: src/libslic3r/Zipper.cpp:78 msgid "invalid parameter" msgstr "parametro non valido" +#: src/slic3r/GUI/ConfigManipulation.cpp:332 +msgid "Invalid pinhead diameter" +msgstr "Diametro apice non valido" + #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:94 +#: src/slic3r/GUI/AboutDialog.cpp:258 msgid "is licensed under the" msgstr "è concesso in licenza ai sensi" -#: src/slic3r/GUI/Tab.cpp:2779 +#: 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:2778 +#: src/slic3r/GUI/Tab.cpp:2940 msgid "is not compatible with printer" msgstr "non è compatibile con la stampante" -#: src/slic3r/GUI/MainFrame.cpp:519 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso" msgstr "Iso" -#: src/slic3r/GUI/MainFrame.cpp:519 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso View" msgstr "Vista isometrica" -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:964 msgid "It can't be deleted or modified." msgstr "Non può essere eliminato o modificato." -#: src/libslic3r/PrintConfig.cpp:926 +#: src/slic3r/GUI/Plater.cpp:3321 +msgid "It is not allowed to change the file to reload" +msgstr "Non è permesso modificare il file da ricaricare" + +#: src/libslic3r/PrintConfig.cpp:974 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.cpp:142 src/slic3r/GUI/Tab.cpp:2796 +#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2958 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:2177 +#: src/slic3r/GUI/Tab.cpp:2229 msgid "Jerk limits" msgstr "Limiti Jerk" -#: src/libslic3r/PrintConfig.cpp:1579 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Jitter" msgstr "Jitter" -#: src/libslic3r/PrintConfig.cpp:533 +#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529 +#: src/slic3r/GUI/DoubleSlider.cpp:1651 +msgid "Jump to height" +msgstr "Salta all'altezza" + +#: src/slic3r/GUI/DoubleSlider.cpp:955 +#, 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" + +#: src/libslic3r/PrintConfig.cpp:566 msgid "Keep fan always on" msgstr "Mantieni la ventola sempre accesa" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 msgid "Keep lower part" msgstr "Mantieni parte inferiore" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:193 +#: src/slic3r/GUI/GLCanvas3D.cpp:304 +msgid "Keep min" +msgstr "Mantieni min" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168 msgid "Keep upper part" msgstr "Mantieni parte superiore" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:566 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:708 msgid "Keyboard Shortcuts" msgstr "Scorciatoie Tastiera" -#: src/libslic3r/PrintConfig.cpp:917 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +msgid "Keyboard shortcuts" +msgstr "Scorciatoie tastiera" + +#: src/libslic3r/PrintConfig.cpp:2498 +msgid "kg" +msgstr "kg" + +#: src/libslic3r/PrintConfig.cpp:965 msgid "Label objects" msgstr "Etichetta oggetti" -#: src/libslic3r/PrintConfig.cpp:2234 +#: src/libslic3r/PrintConfig.cpp:2399 msgid "Landscape" msgstr "Landscape" -#: src/slic3r/GUI/GUI_App.cpp:524 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Language" msgstr "Lingua" -#: src/slic3r/GUI/GUI_App.cpp:755 +#: src/slic3r/GUI/GUI_App.cpp:885 msgid "Language selection" msgstr "Selezione lingua" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1770 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2140 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2242 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:2994 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 msgid "Layer" msgstr "Layer" -#: src/slic3r/GUI/Tab.cpp:998 src/libslic3r/PrintConfig.cpp:55 +#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:71 msgid "Layer height" msgstr "Altezza layer" -#: src/libslic3r/Print.cpp:1332 +#: src/libslic3r/Print.cpp:1427 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:2260 +#: src/slic3r/GUI/Tab.cpp:2362 msgid "Layer height limits" msgstr "Limiti altezza layer" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2109 +#: src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "Layer height:" +msgstr "Altezza layer:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2488 msgid "Layer range Settings to modify" msgstr "Impostazioni da modificare in Intervallo Layer" -#: src/libslic3r/PrintConfig.cpp:326 src/libslic3r/PrintConfig.cpp:946 -#: src/libslic3r/PrintConfig.cpp:1435 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1844 -#: src/libslic3r/PrintConfig.cpp:1889 +#: 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 msgid "layers" msgstr "layer" -#: src/slic3r/GUI/Tab.cpp:3302 src/slic3r/GUI/Tab.cpp:3393 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3512 +#: src/slic3r/GUI/Tab.cpp:3600 msgid "Layers" msgstr "Layer" -#: src/slic3r/GUI/Tab.cpp:997 src/slic3r/GUI/Tab.cpp:3391 +#: src/slic3r/GUI/Tab.cpp:1048 src/slic3r/GUI/Tab.cpp:3598 msgid "Layers and perimeters" msgstr "Layer e perimetri" -#: src/slic3r/GUI/GUI_ObjectList.cpp:28 src/slic3r/GUI/GUI_ObjectList.cpp:68 -#: src/slic3r/GUI/GUI_ObjectList.cpp:509 src/libslic3r/PrintConfig.cpp:56 -#: src/libslic3r/PrintConfig.cpp:150 src/libslic3r/PrintConfig.cpp:381 -#: src/libslic3r/PrintConfig.cpp:438 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1026 -#: src/libslic3r/PrintConfig.cpp:1305 src/libslic3r/PrintConfig.cpp:1371 -#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1987 -#: src/libslic3r/PrintConfig.cpp:2044 +#: 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 msgid "Layers and Perimeters" msgstr "Layer e Perimetri" -#: src/slic3r/GUI/GLCanvas3D.cpp:526 -msgid "Layers heights" -msgstr "Altezze layer" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +msgid "Layers Slider" +msgstr "Barra di scorrimento Layer" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 -msgid "Layers Slider Shortcuts" -msgstr "Scorciatoie Scorrimento Layer" - -#. TRN To be shown in Print Settings "Bottom solid layers" -#: rc/libslic3r/PrintConfig.cpp:149 +#: src/slic3r/GUI/OptionsGroup.cpp:258 msgctxt "Layers" msgid "Bottom" msgstr "Inferiore" -#. TRN To be shown in Print Settings "Top solid layers" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/slic3r/GUI/OptionsGroup.cpp:258 msgctxt "Layers" msgid "Top" msgstr "Superiore" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left" msgstr "Sinistra" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1234 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1235 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 msgid "Left click" msgstr "Click sinistro" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/GLCanvas3D.cpp:237 +msgid "Left mouse button:" +msgstr "Tasto sinistro mouse:" + +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left View" msgstr "Vista sinistra" -#: src/slic3r/GUI/GUI_Preview.cpp:255 +#: src/slic3r/GUI/GUI_Preview.cpp:257 msgid "Legend" msgstr "Legenda" -#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551 msgid "Length" msgstr "Lunghezza" -#: src/libslic3r/PrintConfig.cpp:293 +#: src/libslic3r/PrintConfig.cpp:328 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." #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:124 +#: src/slic3r/GUI/AboutDialog.cpp:129 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:1491 +#: src/libslic3r/PrintConfig.cpp:1561 msgid "Lift Z" msgstr "Solleva Z" -#: src/libslic3r/PrintConfig.cpp:801 +#: src/libslic3r/PrintConfig.cpp:848 msgid "Line" msgstr "Linea" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1050 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1427 msgid "Load" msgstr "Carica" -#: src/slic3r/GUI/MainFrame.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Load a model" msgstr "Carica modello" -#: src/libslic3r/PrintConfig.cpp:3116 +#: src/libslic3r/PrintConfig.cpp:3505 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:3100 +#: src/libslic3r/PrintConfig.cpp:3489 msgid "Load config file" msgstr "Carica file di configurazione" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 -msgid "Load Config from .ini/amf/3mf/gcode" -msgstr "Carica Config da .ini/amf/3mf/gcode" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +msgid "Load Config from ini/amf/3mf/gcode and merge" +msgstr "Carica Config da ini/amf/3mf/gcode e unisci" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 -msgid "Load Config from .ini/amf/3mf/gcode and merge" -msgstr "Carica Config da .ini/amf/3mf/gcode ed unisci" - -#: src/slic3r/GUI/MainFrame.cpp:354 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Load configuration from project file" msgstr "Carica configurazione dal file di progetto" -#: src/libslic3r/PrintConfig.cpp:3101 +#: src/libslic3r/PrintConfig.cpp:3490 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:352 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Load exported configuration file" msgstr "Carica un file di configurazione esportato" -#: src/slic3r/GUI/Plater.cpp:1271 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Load File" msgstr "Carica file" -#: src/slic3r/GUI/Plater.cpp:1275 +#: src/slic3r/GUI/Plater.cpp:1399 msgid "Load Files" msgstr "Carica file" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1585 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1879 msgid "Load Part" msgstr "Carica Parte" -#: src/slic3r/GUI/MainFrame.cpp:357 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Load presets from a bundle" msgstr "Carica i preset da un gruppo" -#: src/slic3r/GUI/Plater.cpp:3992 +#: src/slic3r/GUI/Plater.cpp:4575 msgid "Load Project" msgstr "Carica Progetto" -#: src/slic3r/GUI/BedShapeDialog.cpp:97 +#: src/slic3r/GUI/BedShapeDialog.cpp:102 msgid "Load shape from STL..." msgstr "Carica forma da STL..." -#: src/slic3r/GUI/BedShapeDialog.cpp:181 src/slic3r/GUI/BedShapeDialog.cpp:249 +#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261 msgid "Load..." msgstr "Caricamento..." -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" msgstr "caricato" -#: src/slic3r/GUI/Plater.cpp:1782 +#: src/slic3r/GUI/Plater.cpp:2426 msgid "Loaded" msgstr "Caricato" -#: src/slic3r/GUI/Plater.cpp:1590 +#: src/slic3r/GUI/Plater.cpp:2273 msgid "Loading" msgstr "Caricamento" -#: src/slic3r/GUI/GUI_App.cpp:407 +#: src/slic3r/GUI/GUI_App.cpp:474 msgid "Loading of a mode view" msgstr "Caricamento di una modalità di vista" -#: src/slic3r/GUI/GUI_App.cpp:399 +#: src/slic3r/GUI/GUI_App.cpp:466 msgid "Loading of current presets" msgstr "Caricamento dei preset correnti" @@ -3377,277 +3995,281 @@ msgstr "Caricamento dei preset correnti" msgid "Loading repaired model" msgstr "Caricamento modello riparato" -#: src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:607 msgid "Loading speed" msgstr "Velocità di caricamento" -#: src/libslic3r/PrintConfig.cpp:583 +#: src/libslic3r/PrintConfig.cpp:615 msgid "Loading speed at the start" msgstr "Velocità iniziale di caricamento" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:41 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106 msgid "Local coordinates" msgstr "Coordinate locali" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:851 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 msgid "Lock supports under new islands" msgstr "Fissa i supporti sotto le nuove isole" -#: src/slic3r/GUI/Tab.cpp:3065 +#: src/slic3r/GUI/Tab.cpp:3252 msgid "LOCKED LOCK" msgstr "LUCCHETTO CHIUSO" -#: src/slic3r/GUI/Tab.cpp:3360 +#: src/slic3r/GUI/Tab.cpp:3280 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:3376 +#: src/slic3r/GUI/Tab.cpp:3296 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:3119 +#: src/libslic3r/PrintConfig.cpp:3508 msgid "Logging level" msgstr "Livello di logging" -#: src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "Loops (minimum)" msgstr "Giri (minimo)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Lower Layer" msgstr "Layer Inferiore" -#: src/slic3r/GUI/Tab.cpp:2136 src/slic3r/GUI/Tab.cpp:2209 -#: src/libslic3r/PrintConfig.cpp:1077 src/libslic3r/PrintConfig.cpp:1087 -#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1110 -#: src/libslic3r/PrintConfig.cpp:1121 src/libslic3r/PrintConfig.cpp:1132 -#: src/libslic3r/PrintConfig.cpp:1143 +#: 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 msgid "Machine limits" msgstr "Limiti macchina" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -msgid "Main Shortcuts" -msgstr "Collegamenti Principali" - -#: src/slic3r/GUI/Plater.cpp:143 +#: src/slic3r/GUI/Plater.cpp:166 msgid "Manifold" msgstr "Manifold" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:908 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 msgid "Manual editing" -msgstr "Editing manuale" +msgstr "Modifica manuale" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:105 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180 msgid "Masked SLA file exported to %1%" msgstr "File SLA mascherato esportato su %1%" -#: src/slic3r/GUI/MainFrame.cpp:604 +#: src/slic3r/GUI/MainFrame.cpp:752 msgid "Mate&rial Settings Tab" msgstr "Scheda Impostazioni Mate&riale" -#: src/slic3r/GUI/Tab.cpp:3300 +#: src/slic3r/GUI/Tab.cpp:3478 src/slic3r/GUI/Tab.cpp:3480 msgid "Material" msgstr "Materiale" -#: src/slic3r/GUI/Tab.hpp:391 +#: src/slic3r/GUI/Tab.hpp:416 msgid "Material Settings" msgstr "Impostazioni Materiali" -#: src/slic3r/GUI/Plater.cpp:140 +#: src/slic3r/GUI/Plater.cpp:163 msgid "Materials" msgstr "Materiali" -#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226 msgid "Max" msgstr "Massimo" -#: src/libslic3r/PrintConfig.cpp:2470 +#: src/libslic3r/PrintConfig.cpp:2734 msgid "Max bridge length" msgstr "Lunghezza massima Bridge" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "Ponteggi massimi su un pilastro" + +#: src/libslic3r/PrintConfig.cpp:2822 msgid "Max merge distance" msgstr "Massima distanza di unione" -#: src/libslic3r/PrintConfig.cpp:2479 +#: src/libslic3r/PrintConfig.cpp:2743 msgid "Max pillar linking distance" msgstr "Distanza massima collegamento pilastri" -#: src/libslic3r/PrintConfig.cpp:64 +#: src/libslic3r/PrintConfig.cpp:80 msgid "Max print height" msgstr "Altezza massima di stampa" -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "Max print speed" msgstr "Massima velocità di stampa" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 -msgid "max slic3r version" -msgstr "versione slic3r massima" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +msgid "max PrusaSlicer version" +msgstr "versione PrusaSlicer massima" -#: src/libslic3r/PrintConfig.cpp:1203 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "Max volumetric slope negative" msgstr "Massima pendenza volumetrica negativa" -#: src/libslic3r/PrintConfig.cpp:1192 +#: src/libslic3r/PrintConfig.cpp:1257 msgid "Max volumetric slope positive" msgstr "Massima pendenza volumetrica positiva" -#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247 msgid "Max volumetric speed" msgstr "Massima velocità volumetrica" -#: src/libslic3r/PrintConfig.cpp:2167 +#: src/libslic3r/PrintConfig.cpp:2268 msgid "Maximal bridging distance" msgstr "Distanza massima bridging" -#: src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2269 msgid "Maximal distance between supports on sparse infill sections." -msgstr "Distanza massima tra supporti in sezioni a scarso riempimento." +msgstr "Distanza massima tra supporti in sezioni a riempimento sparso." -#: src/libslic3r/PrintConfig.cpp:1099 +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Maximum acceleration E" msgstr "Accelerazione massima E" -#: src/libslic3r/PrintConfig.cpp:1105 +#: src/libslic3r/PrintConfig.cpp:1151 msgid "Maximum acceleration of the E axis" msgstr "Accelerazione massima dell'asse E" -#: src/libslic3r/PrintConfig.cpp:1102 +#: src/libslic3r/PrintConfig.cpp:1148 msgid "Maximum acceleration of the X axis" msgstr "Accelerazione massima dell'asse X" -#: src/libslic3r/PrintConfig.cpp:1103 +#: src/libslic3r/PrintConfig.cpp:1149 msgid "Maximum acceleration of the Y axis" msgstr "Accelerazione massima dell'asse Y" -#: src/libslic3r/PrintConfig.cpp:1104 +#: src/libslic3r/PrintConfig.cpp:1150 msgid "Maximum acceleration of the Z axis" msgstr "Accelerazione massima dell'asse Z" -#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133 +#: src/libslic3r/PrintConfig.cpp:1198 msgid "Maximum acceleration when extruding" msgstr "Accelerazione massima durante l'estrusione" -#: src/libslic3r/PrintConfig.cpp:1158 +#: src/libslic3r/PrintConfig.cpp:1200 msgid "Maximum acceleration when extruding (M204 S)" msgstr "Accelerazione massima durante l'estrusione (M204 S)" -#: src/libslic3r/PrintConfig.cpp:1142 src/libslic3r/PrintConfig.cpp:1144 +#: src/libslic3r/PrintConfig.cpp:1208 msgid "Maximum acceleration when retracting" msgstr "Accelerazione massima durante la retrazione" -#: src/libslic3r/PrintConfig.cpp:1169 +#: src/libslic3r/PrintConfig.cpp:1210 msgid "Maximum acceleration when retracting (M204 T)" msgstr "Accelerazione massima durante la retrazione (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1096 +#: src/libslic3r/PrintConfig.cpp:1142 msgid "Maximum acceleration X" msgstr "Accelerazione massima X" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1143 msgid "Maximum acceleration Y" msgstr "Accelerazione massima Y" -#: src/libslic3r/PrintConfig.cpp:1098 +#: src/libslic3r/PrintConfig.cpp:1144 msgid "Maximum acceleration Z" msgstr "Accelerazione massima Z" -#: src/slic3r/GUI/Tab.cpp:2170 +#: src/slic3r/GUI/Tab.cpp:2222 msgid "Maximum accelerations" msgstr "Accelerazioni massime" -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534 msgid "Maximum exposure time" msgstr "Tempo massimo di esposizione" -#: src/libslic3r/PrintConfig.cpp:1081 +#: src/libslic3r/PrintConfig.cpp:1128 msgid "Maximum feedrate E" msgstr "Avanzamento massimo E" -#: src/libslic3r/PrintConfig.cpp:1087 +#: src/libslic3r/PrintConfig.cpp:1134 msgid "Maximum feedrate of the E axis" msgstr "Avanzamento massimo dell'asse E" -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1131 msgid "Maximum feedrate of the X axis" msgstr "Avanzamento massimo dell'asse X" -#: src/libslic3r/PrintConfig.cpp:1085 +#: src/libslic3r/PrintConfig.cpp:1132 msgid "Maximum feedrate of the Y axis" msgstr "Avanzamento massimo dell'asse Y" -#: src/libslic3r/PrintConfig.cpp:1086 +#: src/libslic3r/PrintConfig.cpp:1133 msgid "Maximum feedrate of the Z axis" msgstr "Avanzamento massimo dell'asse Z" -#: src/libslic3r/PrintConfig.cpp:1078 +#: src/libslic3r/PrintConfig.cpp:1125 msgid "Maximum feedrate X" msgstr "Avanzamento massimo X" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Maximum feedrate Y" msgstr "Avanzamento massimo Y" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "Maximum feedrate Z" msgstr "Avanzamento massimo Z" -#: src/slic3r/GUI/Tab.cpp:2165 +#: src/slic3r/GUI/Tab.cpp:2217 msgid "Maximum feedrates" msgstr "Avanzamenti massimi" -#: src/libslic3r/PrintConfig.cpp:2447 src/libslic3r/PrintConfig.cpp:2448 +#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557 msgid "Maximum initial exposure time" msgstr "Tempo massimo di esposizione iniziale" -#: src/libslic3r/PrintConfig.cpp:1117 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "Maximum jerk E" msgstr "Jerk massimo E" -#: src/libslic3r/PrintConfig.cpp:1123 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Maximum jerk of the E axis" msgstr "Jerk massimo dell'asse E" -#: src/libslic3r/PrintConfig.cpp:1120 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Maximum jerk of the X axis" msgstr "Jerk massimo dell'asse X" -#: src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "Maximum jerk of the Y axis" msgstr "Jerk massimo dell'asse Y" -#: src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1167 msgid "Maximum jerk of the Z axis" msgstr "Jerk massimo dell'asse Z" -#: src/libslic3r/PrintConfig.cpp:1114 +#: src/libslic3r/PrintConfig.cpp:1159 msgid "Maximum jerk X" msgstr "Jerk massimo X" -#: src/libslic3r/PrintConfig.cpp:1115 +#: src/libslic3r/PrintConfig.cpp:1160 msgid "Maximum jerk Y" msgstr "Jerk massimo Y" -#: src/libslic3r/PrintConfig.cpp:1116 +#: src/libslic3r/PrintConfig.cpp:1161 msgid "Maximum jerk Z" msgstr "Jerk massimo Z" -#: src/libslic3r/PrintConfig.cpp:566 +#: src/libslic3r/PrintConfig.cpp:2660 +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 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:3053 +#: src/libslic3r/PrintConfig.cpp:3442 msgid "Merge" msgstr "Unisci" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2683 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/SLAPrint.cpp:71 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Merging slices and calculating statistics" msgstr "Unendo gli slice e calcolando le statistiche" @@ -3655,207 +4277,256 @@ msgstr "Unendo gli slice e calcolando le statistiche" msgid "Mesh repair failed." msgstr "Riparazione mesh fallita." -#: src/libslic3r/PrintConfig.cpp:3120 -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" -msgstr "Messaggi con severità inferiore o uguale al loglevel saranno stampati. 0:trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" +#: src/slic3r/GUI/DoubleSlider.cpp:1635 +msgid "Message for pause print on current layer (%1% mm)." +msgstr "Messaggio per pausa stampa al corrente layer (%1% mm)." -#: src/libslic3r/PrintConfig.cpp:1215 src/libslic3r/PrintConfig.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289 msgid "Min" msgstr "Minimo" -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1298 msgid "Min print speed" msgstr "Velocità minima di stampa" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 -msgid "min slic3r version" -msgstr "versione slic3r minima" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "min PrusaSlicer version" +msgstr "versione PrusaSlicer minima" -#: src/libslic3r/PrintConfig.cpp:2507 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Minimal distance of the support points" msgstr "Distanza minima dei punti di supporto" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1306 msgid "Minimal filament extrusion length" msgstr "Lunghezza di estrusione minima del filamento" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:879 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 msgid "Minimal points distance" msgstr "Distanza minima punti" -#: src/libslic3r/PrintConfig.cpp:635 +#: src/libslic3r/PrintConfig.cpp:667 msgid "Minimal purge on wipe tower" msgstr "Spurgo minimo sulla torre di spurgo" -#: src/libslic3r/PrintConfig.cpp:1442 +#: src/libslic3r/PrintConfig.cpp:187 +msgid "Minimum bottom shell thickness" +msgstr "Spessore minimo guscio inferiore" + +#: src/slic3r/GUI/PresetHints.cpp:339 +msgid "Minimum bottom shell thickness is %1% mm." +msgstr "Spessore minimo guscio inferiore è %1% mm." + +#: src/libslic3r/PrintConfig.cpp:1512 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:2416 src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526 msgid "Minimum exposure time" msgstr "Tempo minimo di esposizione" -#: src/libslic3r/PrintConfig.cpp:1109 src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1178 msgid "Minimum feedrate when extruding" msgstr "Avanzamento minimo durante estrusione" -#: src/libslic3r/PrintConfig.cpp:1136 +#: src/libslic3r/PrintConfig.cpp:1180 msgid "Minimum feedrate when extruding (M205 S)" msgstr "Avanzamento minimo durante estrusione (M205 S)" -#: src/slic3r/GUI/Tab.cpp:2182 +#: src/slic3r/GUI/Tab.cpp:2234 msgid "Minimum feedrates" msgstr "Avanzamento minimo" -#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549 msgid "Minimum initial exposure time" msgstr "Tempo minimo di esposizione iniziale" -#: src/libslic3r/PrintConfig.cpp:1452 +#: src/slic3r/GUI/Tab.cpp:1069 +msgid "Minimum shell thickness" +msgstr "Spessore minimo guscio" + +#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788 +msgid "Minimum thickness of a top / bottom shell" +msgstr "Spessore minimo guscio superiore / inferiore" + +#: src/libslic3r/PrintConfig.cpp:2146 +msgid "Minimum top shell thickness" +msgstr "Spessore minimo guscio superiore" + +#: src/slic3r/GUI/PresetHints.cpp:320 +msgid "Minimum top shell thickness is %1% mm." +msgstr "Spessore minimo guscio superiore è %1% mm." + +#: src/libslic3r/PrintConfig.cpp:1522 msgid "Minimum travel after retraction" msgstr "Spostamento minimo dopo una retrazione" -#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "Minimum travel feedrate" msgstr "Avanzamento minimo di spostamento" -#: src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1190 msgid "Minimum travel feedrate (M205 T)" msgstr "Avanzamento minimo di spostamento (M205 T)" -#: src/slic3r/GUI/Plater.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:2917 +msgid "Minimum wall thickness of a hollowed model." +msgstr "Spessore minimo parete di un modello svuotato." + +#: src/libslic3r/PrintConfig.cpp:2449 +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 msgid "Mirror" msgstr "Specchia" -#: src/libslic3r/PrintConfig.cpp:2320 +#: src/libslic3r/PrintConfig.cpp:2379 msgid "Mirror horizontally" msgstr "Specchia orizzontalmente" -#: src/slic3r/GUI/GLCanvas3D.cpp:1711 +#: src/slic3r/GUI/GLCanvas3D.cpp:2053 msgid "Mirror Object" msgstr "Specchia Oggetto" -#: src/slic3r/GUI/Plater.cpp:2946 +#: src/slic3r/GUI/Plater.cpp:4002 msgid "Mirror the selected object" msgstr "Specchia l'oggetto selezionato" -#: src/slic3r/GUI/Plater.cpp:2939 +#: src/slic3r/GUI/Plater.cpp:3995 msgid "Mirror the selected object along the X axis" msgstr "Specchia l'oggetto selezionato sull'asse X" -#: src/slic3r/GUI/Plater.cpp:2941 +#: src/slic3r/GUI/Plater.cpp:3997 msgid "Mirror the selected object along the Y axis" msgstr "Specchia l'oggetto selezionato sull'asse y" -#: src/slic3r/GUI/Plater.cpp:2943 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Mirror the selected object along the Z axis" msgstr "Specchia l'oggetto selezionato sull'asse Z" -#: src/libslic3r/PrintConfig.cpp:2327 +#: src/libslic3r/PrintConfig.cpp:2386 msgid "Mirror vertically" msgstr "Specchia verticalmente" -#: src/slic3r/Utils/OctoPrint.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:68 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/GCode/PreviewData.cpp:176 +#: src/libslic3r/ExtrusionEntity.cpp:323 msgid "Mixed" msgstr "Mischiate" -#: src/slic3r/GUI/BedShapeDialog.cpp:87 src/slic3r/GUI/ConfigWizard.cpp:118 -#: src/slic3r/GUI/ConfigWizard.cpp:561 src/slic3r/GUI/ConfigWizard.cpp:575 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 -#: src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:84 -#: src/libslic3r/PrintConfig.cpp:59 src/libslic3r/PrintConfig.cpp:66 -#: src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:210 -#: src/libslic3r/PrintConfig.cpp:285 src/libslic3r/PrintConfig.cpp:293 -#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:353 -#: src/libslic3r/PrintConfig.cpp:473 src/libslic3r/PrintConfig.cpp:484 -#: src/libslic3r/PrintConfig.cpp:502 src/libslic3r/PrintConfig.cpp:680 -#: src/libslic3r/PrintConfig.cpp:1166 src/libslic3r/PrintConfig.cpp:1227 -#: src/libslic3r/PrintConfig.cpp:1245 src/libslic3r/PrintConfig.cpp:1263 -#: src/libslic3r/PrintConfig.cpp:1315 src/libslic3r/PrintConfig.cpp:1325 -#: src/libslic3r/PrintConfig.cpp:1446 src/libslic3r/PrintConfig.cpp:1454 -#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 -#: src/libslic3r/PrintConfig.cpp:1513 src/libslic3r/PrintConfig.cpp:1521 -#: src/libslic3r/PrintConfig.cpp:1529 src/libslic3r/PrintConfig.cpp:1612 -#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1898 -#: src/libslic3r/PrintConfig.cpp:1932 src/libslic3r/PrintConfig.cpp:2125 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2139 -#: src/libslic3r/PrintConfig.cpp:2169 src/libslic3r/PrintConfig.cpp:2179 -#: src/libslic3r/PrintConfig.cpp:2189 src/libslic3r/PrintConfig.cpp:2297 -#: src/libslic3r/PrintConfig.cpp:2372 src/libslic3r/PrintConfig.cpp:2381 -#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2400 -#: src/libslic3r/PrintConfig.cpp:2444 src/libslic3r/PrintConfig.cpp:2454 -#: src/libslic3r/PrintConfig.cpp:2473 src/libslic3r/PrintConfig.cpp:2483 -#: src/libslic3r/PrintConfig.cpp:2492 src/libslic3r/PrintConfig.cpp:2510 -#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2539 -#: src/libslic3r/PrintConfig.cpp:2552 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2491 +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/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: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 msgid "mm" msgstr "mm" -#: src/libslic3r/PrintConfig.cpp:1477 src/libslic3r/PrintConfig.cpp:1486 +#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556 msgid "mm (zero to disable)" msgstr "mm (imposta a zero per disabilitare)" -#: src/libslic3r/PrintConfig.cpp:847 src/libslic3r/PrintConfig.cpp:992 -#: src/libslic3r/PrintConfig.cpp:1797 +#: 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 msgid "mm or %" msgstr "mm o %" -#: src/libslic3r/PrintConfig.cpp:201 src/libslic3r/PrintConfig.cpp:577 -#: src/libslic3r/PrintConfig.cpp:585 src/libslic3r/PrintConfig.cpp:594 -#: src/libslic3r/PrintConfig.cpp:602 src/libslic3r/PrintConfig.cpp:629 -#: src/libslic3r/PrintConfig.cpp:648 src/libslic3r/PrintConfig.cpp:874 -#: src/libslic3r/PrintConfig.cpp:1001 src/libslic3r/PrintConfig.cpp:1079 -#: src/libslic3r/PrintConfig.cpp:1099 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1123 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1363 -#: src/libslic3r/PrintConfig.cpp:1537 src/libslic3r/PrintConfig.cpp:1546 -#: src/libslic3r/PrintConfig.cpp:1941 src/libslic3r/PrintConfig.cpp:2053 +#: 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 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:430 src/libslic3r/PrintConfig.cpp:856 -#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1702 -#: src/libslic3r/PrintConfig.cpp:1908 src/libslic3r/PrintConfig.cpp:2035 +#: 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 msgid "mm/s or %" msgstr "mm/s o %" -#: src/libslic3r/PrintConfig.cpp:160 src/libslic3r/PrintConfig.cpp:303 -#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:936 -#: src/libslic3r/PrintConfig.cpp:1089 src/libslic3r/PrintConfig.cpp:1134 -#: src/libslic3r/PrintConfig.cpp:1145 src/libslic3r/PrintConfig.cpp:1334 +#: 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 msgid "mm/s²" msgstr "mm/s²" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:640 +#: src/libslic3r/PrintConfig.cpp:672 msgid "mm³" msgstr "mm³" -#: src/libslic3r/PrintConfig.cpp:569 src/libslic3r/PrintConfig.cpp:1185 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "mm³/s" msgstr "mm³/s" -#: src/libslic3r/PrintConfig.cpp:1197 src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273 msgid "mm³/s²" msgstr "mm³/s²" -#: src/slic3r/GUI/GUI_App.cpp:681 +#: src/slic3r/GUI/GUI_App.cpp:820 msgid "Mode" -msgstr "Modalità" +msgstr "&Modalità" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "model" msgstr "modello" -#: src/slic3r/GUI/BedShapeDialog.cpp:239 +#: src/slic3r/GUI/BedShapeDialog.cpp:251 msgid "Model" msgstr "Modello" @@ -3873,8 +4544,8 @@ msgid "Model repair canceled" msgstr "Riparazione modello annullata" #: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" -msgstr "Riparazione modello fallita:\n" +msgid "Model repair failed:" +msgstr "Riparazione modello fallita:" #: src/slic3r/Utils/FixModelByWin10.cpp:400 msgid "Model repair finished" @@ -3884,104 +4555,145 @@ msgstr "Riparazione modello terminata" msgid "Model repaired successfully" msgstr "Modello riparato con successo" -#: src/slic3r/GUI/Preset.cpp:207 +#: src/slic3r/GUI/Tab.cpp:979 +msgid "Modifications to the current profile will be saved." +msgstr "Verranno salvate le modifiche al profilo attuale." + +#: src/slic3r/GUI/Preset.cpp:247 msgid "modified" msgstr "modificato" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Modifier" msgstr "Modificatore" -#: src/slic3r/GUI/Tab.cpp:1100 +#: src/slic3r/GUI/Tab.cpp:1161 msgid "Modifiers" msgstr "Modificatori" -#: src/libslic3r/PrintConfig.cpp:719 +#: src/libslic3r/PrintConfig.cpp:2512 +msgid "money/bottle" +msgstr "soldi/bottiglia" + +#: src/libslic3r/PrintConfig.cpp:762 msgid "money/kg" msgstr "soldi/kg" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1240 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 msgid "Mouse wheel" msgstr "Rotella del mouse" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:51 +#: src/slic3r/GUI/GLCanvas3D.cpp:261 +msgid "Mouse wheel:" +msgstr "Rotella del mouse:" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 msgid "Move" msgstr "Sposta" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1238 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 msgid "Move clipping plane" msgstr "Sposta piano di ritaglio" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Move current slider thumb Down" msgstr "Abbassa la barra di scorrimento attuale" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 msgid "Move current slider thumb Up" msgstr "Solleva la barra di scorrimento attuale" -#: src/slic3r/GUI/GLCanvas3D.cpp:2872 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1059 +msgid "Move drainage hole" +msgstr "Sposta foro di drenaggio" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3505 msgid "Move Object" msgstr "Sposta oggetto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365 msgid "Move point" msgstr "Sposta punto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Move selection 10 mm in negative X direction" +msgstr "Sposta selezione 10 mm in direzione X negativa" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +msgid "Move selection 10 mm in negative Y direction" +msgstr "Sposta selezione 10 mm in direzione Y negativa" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +msgid "Move selection 10 mm in positive X direction" +msgstr "Sposta selezione 10 mm in direzione X positiva" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +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 msgid "Move support point" msgstr "Sposta punto di supporto" -#: src/libslic3r/PrintConfig.cpp:2100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Movement in camera space" +msgstr "Movimento nello spazio della camera" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +msgid "Movement step set to 1 mm" +msgstr "Passo del movimento impostato a 1 mm" + +#: src/libslic3r/PrintConfig.cpp:2201 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:1661 src/slic3r/GUI/Plater.cpp:1769 +#: src/slic3r/GUI/Plater.cpp:2360 src/slic3r/GUI/Plater.cpp:2413 msgid "Multi-part object detected" msgstr "Rilevato oggetto in parti multiple" -#: src/slic3r/GUI/FirmwareDialog.cpp:400 src/slic3r/GUI/FirmwareDialog.cpp:436 +#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 #, possible-c-format 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:1118 +#: src/slic3r/GUI/Tab.cpp:1179 msgid "Multiple Extruders" msgstr "Estrusori multipli" -#: src/slic3r/GUI/Plater.cpp:1766 -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?\n" -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?\n" +#: src/slic3r/GUI/Plater.cpp:2410 +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:3050 +#: src/libslic3r/PrintConfig.cpp:3439 msgid "Multiply copies by creating a grid." msgstr "Moltiplica le copie creando una griglia." -#: src/libslic3r/PrintConfig.cpp:3045 +#: src/libslic3r/PrintConfig.cpp:3434 msgid "Multiply copies by this factor." msgstr "Moltiplica le copie per questo valore." -#: src/slic3r/GUI/Field.cpp:139 +#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:580 msgid "N/A" msgstr "N/A" -#: src/slic3r/GUI/GUI_ObjectList.cpp:176 +#: src/slic3r/GUI/GUI_ObjectList.cpp:270 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 msgid "Name" msgstr "Nome" -#: src/libslic3r/PrintConfig.cpp:1418 +#: src/libslic3r/PrintConfig.cpp:1488 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:1412 +#: src/libslic3r/PrintConfig.cpp:1482 msgid "Name of the printer vendor." msgstr "Nome del venditore della stampante." -#: src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1058 msgid "Name of the profile, from which this profile inherits." msgstr "Nome del profilo da cui questo profilo eredita." -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Nearest" msgstr "Più vicino" @@ -3989,32 +4701,40 @@ msgstr "Più vicino" msgid "Network lookup" msgstr "Ricerca network" -#: src/slic3r/GUI/Plater.cpp:2056 +#: src/slic3r/GUI/Plater.cpp:2151 msgid "New Project" msgstr "Nuovo progetto" -#: src/slic3r/GUI/UpdateDialogs.cpp:30 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +msgid "New project, clear plater" +msgstr "Nuovo progetto, pulisci piano" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 #, possible-c-format msgid "New version of %s is available" msgstr "È disponibile una nuova versione di %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:47 +#: src/slic3r/GUI/UpdateDialogs.cpp:45 msgid "New version:" msgstr "Nuova versione:" -#: src/slic3r/GUI/GLCanvas3D.cpp:3750 +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 msgid "Next Redo action: %1%" msgstr "Ripeti Prossima azione: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:3718 +#: src/slic3r/GUI/GLCanvas3D.cpp:4641 msgid "Next Undo action: %1%" msgstr "Annulla Prossima azione: %1%" -#: src/libslic3r/PrintConfig.cpp:912 +#: src/libslic3r/PrintConfig.cpp:960 msgid "No extrusion" msgstr "No estrusione" -#: src/slic3r/GUI/MainFrame.cpp:635 +#: src/libslic3r/SLAPrintSteps.cpp:453 +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 msgid "No previously sliced file." msgstr "File non processato precedentemente." @@ -4022,152 +4742,175 @@ msgstr "File non processato precedentemente." msgid "NO RAMMING AT ALL" msgstr "NESSUN RAMMING" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:1857 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "Nessun layer sparso (SPERIMENTALE)" + +#: src/libslic3r/PrintConfig.cpp:2774 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/ConfigWizard.cpp:190 src/slic3r/GUI/Plater.cpp:422 -#: src/libslic3r/GCode/PreviewData.cpp:162 +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +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 msgid "None" msgstr "Nessuno" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2203 msgid "Normal" msgstr "Normale" -#: src/slic3r/GUI/Plater.cpp:1073 +#: src/slic3r/GUI/Plater.cpp:1286 msgid "normal mode" msgstr "modalità normale" -#: src/libslic3r/Zipper.cpp:49 +#: src/libslic3r/Zipper.cpp:46 msgid "not a ZIP archive" msgstr "non un archivio ZIP" -#: src/slic3r/Utils/OctoPrint.cpp:90 +#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302 +msgid "Not found:" +msgstr "Non trovato:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1019 +msgid "Note" +msgstr "Nota" + +#: src/slic3r/Utils/AstroBox.cpp:89 +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 +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 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:1213 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 msgid "Note: some shortcuts work in (non)editing mode only." -msgstr "Nota: alcune scorciatoie funzionano solo in modalità (non)editing." +msgstr "Nota: alcune scorciatoie funzionano solo in modalità (non)modifica." -#: src/slic3r/GUI/Tab.cpp:1193 src/slic3r/GUI/Tab.cpp:1194 -#: src/slic3r/GUI/Tab.cpp:1576 src/slic3r/GUI/Tab.cpp:1577 -#: src/slic3r/GUI/Tab.cpp:1985 src/slic3r/GUI/Tab.cpp:1986 -#: src/slic3r/GUI/Tab.cpp:2079 src/slic3r/GUI/Tab.cpp:2080 -#: src/slic3r/GUI/Tab.cpp:3328 src/slic3r/GUI/Tab.cpp:3329 +#: 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 msgid "Notes" msgstr "Note" -#: src/slic3r/GUI/GUI.cpp:277 +#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905 +#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:245 msgid "Notice" msgstr "Avvertenza" -#: src/slic3r/GUI/ConfigWizard.cpp:118 +#: src/slic3r/GUI/ConfigWizard.cpp:218 msgid "nozzle" msgstr "ugello" -#: src/libslic3r/PrintConfig.cpp:1261 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2340 +#: src/libslic3r/PrintConfig.cpp:1326 msgid "Nozzle diameter" msgstr "Diametro ugello" -#: src/slic3r/GUI/ConfigWizard.cpp:560 +#: src/slic3r/GUI/ConfigWizard.cpp:969 msgid "Nozzle Diameter:" msgstr "Diametro ugello:" -#: src/libslic3r/PrintConfig.cpp:618 +#: src/libslic3r/PrintConfig.cpp:650 msgid "Number of cooling moves" msgstr "Numero di movimenti di raffreddamento" -#: src/slic3r/GUI/Tab.cpp:1845 +#: src/slic3r/GUI/Tab.cpp:1839 msgid "Number of extruders of the printer." msgstr "Numero estrusori della stampante." -#: src/libslic3r/PrintConfig.cpp:1888 +#: src/libslic3r/PrintConfig.cpp:1975 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:1627 +#: src/libslic3r/PrintConfig.cpp:1697 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:2214 +#: src/libslic3r/PrintConfig.cpp:2365 msgid "Number of pixels in" msgstr "Numero di pixel su" -#: src/libslic3r/PrintConfig.cpp:2216 +#: src/libslic3r/PrintConfig.cpp:2367 msgid "Number of pixels in X" msgstr "Numero di pixel su X" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "Number of pixels in Y" msgstr "Numero di pixel su Y" -#: src/libslic3r/PrintConfig.cpp:151 +#: src/libslic3r/PrintConfig.cpp:176 msgid "Number of solid layers to generate on bottom surfaces." msgstr "Numero di layer solidi da generare sulle superfici inferiori." -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1781 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:2045 +#: src/libslic3r/PrintConfig.cpp:2134 msgid "Number of solid layers to generate on top surfaces." msgstr "Numero di layer solidi da generare sulle superfici superiori." -#: src/libslic3r/PrintConfig.cpp:2303 +#: src/libslic3r/PrintConfig.cpp:2518 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:218 +#: src/slic3r/GUI/Plater.cpp:241 msgid "Number of tool changes" msgstr "Numero di cambi attrezzo" -#: src/libslic3r/PrintConfig.cpp:2489 +#: src/libslic3r/PrintConfig.cpp:2753 msgid "Object elevation" msgstr "Elevazione oggetto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2466 msgid "Object manipulation" msgstr "Manipolazione oggetto" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:27 -msgid "Object Manipulation" -msgstr "Manipolazione Oggetto" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:78 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638 msgid "Object name" msgstr "Nome oggetto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3417 msgid "Object or Instance" msgstr "Oggetto o Istanza" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1010 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 msgid "Object reordered" msgstr "Oggetto riordinato" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1868 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2479 msgid "Object Settings to modify" msgstr "Impostazioni Oggetto da modificare" -#: src/slic3r/GUI/Plater.cpp:1875 +#: src/slic3r/GUI/Plater.cpp:2529 msgid "Object too large?" msgstr "Oggetto troppo grande?" -#: src/libslic3r/PrintConfig.cpp:2161 +#: src/libslic3r/PrintConfig.cpp:2262 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:1018 +#: src/slic3r/GUI/Plater.cpp:1194 msgid "object(s)" msgstr "oggetto(i)" -#: src/slic3r/GUI/Plater.cpp:1043 src/slic3r/GUI/Plater.cpp:1058 +#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245 msgid "objects" msgstr "oggetti" -#: src/libslic3r/PrintConfig.cpp:402 src/libslic3r/PrintConfig.cpp:808 +#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 msgid "Octagram Spiral" msgstr "Spirale a Ottagramma" @@ -4175,745 +4918,898 @@ msgstr "Spirale a Ottagramma" msgid "OctoPrint version" msgstr "Versione OctoPrint" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3425 msgid "of a current Object" msgstr "di un Oggetto corrente" -#: src/slic3r/GUI/wxExtensions.cpp:2570 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +msgid "Offset" +msgstr "Offset" + +#: src/slic3r/GUI/Tab.cpp:1755 +#, 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 msgid "One layer mode" msgstr "Modalità Un Layer" -#: src/libslic3r/Print.cpp:1285 +#: src/libslic3r/Print.cpp:1365 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:1817 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2676 msgid "Only create support if it lies on a build plate. Don't create support on a print." -msgstr "Crea supporti solo se poggiano sulla superficie di stampa. Non creare supporti sulla stampa." +msgstr "Genera supporti solo se questi poggiano sulla superficie di stampa. Non genera supporti sulla stampa." -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1027 msgid "Only infill where needed" msgstr "Riempimento solo quando necessario" -#: src/slic3r/GUI/Tab.cpp:2271 +#: src/slic3r/GUI/Tab.cpp:2373 msgid "Only lift Z" -msgstr "Solleva solo Z" +msgstr "Solleva Z solamente" -#: src/libslic3r/PrintConfig.cpp:1500 +#: src/libslic3r/PrintConfig.cpp:1570 msgid "Only lift Z above" -msgstr "Solleva solo Z al di sopra" +msgstr "Solleva Z solo al di sopra" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1579 msgid "Only lift Z below" -msgstr "Solleva solo Z al di sotto" +msgstr "Solleva Z solo al di sotto" -#: src/libslic3r/PrintConfig.cpp:1279 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Only retract when crossing perimeters" msgstr "Retrai solo se si attraversa un perimetro" -#: src/slic3r/GUI/Tab.cpp:1126 +#: src/slic3r/GUI/Tab.cpp:1187 msgid "Ooze prevention" msgstr "Prevenzione delle fuoriuscite" -#: src/libslic3r/Print.cpp:1193 +#: src/libslic3r/Print.cpp:1266 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:339 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "Open a project file" msgstr "Apri un file progetto" -#: src/slic3r/GUI/Tab.cpp:1745 +#: src/slic3r/GUI/Tab.cpp:1729 msgid "Open CA certificate file" msgstr "Apri file di certificato CA" -#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:126 +#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:183 msgid "Open changelog page" msgstr "Apri la pagina del registro delle modifiche" -#: src/slic3r/GUI/UpdateDialogs.cpp:68 +#: src/slic3r/GUI/UpdateDialogs.cpp:65 msgid "Open download page" msgstr "Apri la pagina di Download" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 -msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "Apri progetto STL/OBJ/AMF/3MF con configurazione, cancella il piano" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +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:551 +#: src/slic3r/GUI/MainFrame.cpp:693 #, 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:542 +#: src/slic3r/GUI/MainFrame.cpp:684 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:549 +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Open the software releases page in your browser" msgstr "Apri la pagina delle versioni software sul browser" -#: src/slic3r/GUI/Plater.cpp:2994 +#: src/slic3r/GUI/Plater.cpp:4040 msgid "Optimize orientation" msgstr "Ottimizza orientamento" -#: src/slic3r/GUI/Plater.cpp:2643 +#: src/slic3r/GUI/Plater.cpp:2767 msgid "Optimize Rotation" msgstr "Ottimizza Rotazione" -#: src/slic3r/GUI/Plater.cpp:2994 +#: src/slic3r/GUI/Plater.cpp:4040 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:112 +#: src/libslic3r/PrintConfig.cpp:137 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:1070 +#: src/slic3r/GUI/Tab.cpp:1131 msgid "Options for support material and raft" msgstr "Opzioni per materiale di supporto e raft" -#: src/slic3r/GUI/Plater.cpp:2251 +#: src/slic3r/GUI/DoubleSlider.cpp:989 +msgid "or press \"+\" key" +msgstr "o premi il tasto \"+\"" + +#: src/slic3r/GUI/Plater.cpp:2892 msgid "Orientation found." msgstr "Trovato orientamento." -#: src/slic3r/GUI/Plater.cpp:2768 +#: src/slic3r/GUI/Plater.cpp:2891 msgid "Orientation search canceled." msgstr "Ricerca orientamento annullata." -#: src/slic3r/GUI/BedShapeDialog.cpp:79 +#: src/slic3r/GUI/BedShapeDialog.cpp:84 msgid "Origin" msgstr "Origine" -#: src/slic3r/GUI/Tab.cpp:1165 +#: src/slic3r/GUI/Tab.cpp:1227 msgid "Other" msgstr "Altro" -#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:1977 +#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064 msgid "Other layers" msgstr "Altri layer" -#: src/slic3r/GUI/ConfigWizard.cpp:438 +#: src/slic3r/GUI/ConfigWizard.cpp:856 msgid "Other Vendors" msgstr "Altri Fornitori" -#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:3440 +#: src/slic3r/GUI/Tab.cpp:1238 src/slic3r/GUI/Tab.cpp:3666 msgid "Output file" msgstr "File di output" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3493 msgid "Output File" msgstr "File di output" -#: src/libslic3r/PrintConfig.cpp:1294 +#: src/libslic3r/PrintConfig.cpp:1363 msgid "Output filename format" msgstr "Formato del file di output" -#: src/libslic3r/PrintConfig.cpp:2992 +#: src/libslic3r/PrintConfig.cpp:3381 msgid "Output Model Info" msgstr "Info Modello di output" -#: src/slic3r/GUI/Tab.cpp:1168 src/slic3r/GUI/Tab.cpp:3439 +#: src/slic3r/GUI/Tab.cpp:1230 src/slic3r/GUI/Tab.cpp:3665 msgid "Output options" msgstr "Opzioni output" -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/GCode/PreviewData.cpp:165 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312 msgid "Overhang perimeter" msgstr "Perimetro sporgente" -#: src/libslic3r/PrintConfig.cpp:1955 +#: src/libslic3r/PrintConfig.cpp:2042 msgid "Overhang threshold" msgstr "Soglia sporgenza" -#: src/slic3r/GUI/Tab.cpp:1153 +#: src/slic3r/GUI/Tab.cpp:1215 msgid "Overlap" msgstr "Sovrapposizione" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "P&rint Settings Tab" -msgstr "Impostazioni S&tampa" +msgstr "Impos&tazioni Stampa" -#: src/slic3r/GUI/GUI_ObjectList.cpp:79 src/slic3r/GUI/GUI_ObjectList.cpp:520 -#: src/slic3r/GUI/Tab.cpp:3425 src/slic3r/GUI/Tab.cpp:3426 -#: src/libslic3r/PrintConfig.cpp:2516 src/libslic3r/PrintConfig.cpp:2523 -#: src/libslic3r/PrintConfig.cpp:2537 src/libslic3r/PrintConfig.cpp:2547 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2569 +#: 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 msgid "Pad" msgstr "Pad" -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 msgid "Pad and Support" msgstr "Pad e Supporto" -#: src/libslic3r/PrintConfig.cpp:2732 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "Pad around object" msgstr "Pad Intorno all'oggetto" -#: src/libslic3r/PrintConfig.cpp:2731 -msgid "Pad object connector penetration" -msgstr "Penetrazione connettore Pad dell'oggetto" +#: src/libslic3r/PrintConfig.cpp:2862 +msgid "Pad around object everywhere" +msgstr "Pad ovunque intorno all'oggetto" -#: src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2811 +msgid "Pad brim size" +msgstr "Dimensioni brim del Pad" + +#: src/libslic3r/SLA/Pad.cpp:691 +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 +msgid "Pad object connector penetration" +msgstr "Inserimento connettore Pad dell'oggetto" + +#: src/libslic3r/PrintConfig.cpp:2880 msgid "Pad object connector stride" msgstr "Passo del connettore del pad dell'oggetto" -#: src/libslic3r/PrintConfig.cpp:2721 +#: src/libslic3r/PrintConfig.cpp:2889 msgid "Pad object connector width" msgstr "Lunghezza connettore Pad dell'oggetto" -#: src/libslic3r/PrintConfig.cpp:2700 +#: src/libslic3r/PrintConfig.cpp:2869 msgid "Pad object gap" msgstr "Spazio Pad oggetto" -#: src/libslic3r/PrintConfig.cpp:2532 +#: src/libslic3r/PrintConfig.cpp:2797 msgid "Pad wall height" msgstr "Altezza parete Pad" -#: src/libslic3r/PrintConfig.cpp:2568 +#: src/libslic3r/PrintConfig.cpp:2844 msgid "Pad wall slope" msgstr "Inclinazione della parete del pad" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2787 msgid "Pad wall thickness" msgstr "Spessore parete Pad" -#: src/slic3r/GUI/Field.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +msgid "Page Down" +msgstr "Page Down" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Page Up" +msgstr "Page Up" + +#: src/slic3r/GUI/Field.cpp:139 msgid "parameter name" msgstr "nome parametro" -#: src/slic3r/GUI/Field.cpp:184 +#: src/slic3r/GUI/Field.cpp:243 msgid "Parameter validation" msgstr "Validazione parametri" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Part" msgstr "Parte" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1881 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2494 msgid "Part manipulation" msgstr "Manipolazione parti" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2483 msgid "Part Settings to modify" msgstr "Impostazioni parte da modificare" -#: src/slic3r/GUI/GLCanvas3D.cpp:3449 +#: src/slic3r/GUI/GLCanvas3D.cpp:4514 msgid "Paste" msgstr "Incolla" -#: src/slic3r/GUI/MainFrame.cpp:456 +#: src/slic3r/GUI/MainFrame.cpp:592 msgid "Paste clipboard" msgstr "Incolla appunti" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 msgid "Paste from clipboard" msgstr "Incolla dagli appunti" -#: src/slic3r/GUI/Plater.cpp:4772 +#: src/slic3r/GUI/Plater.cpp:5606 msgid "Paste From Clipboard" msgstr "Incolla dagli appunti" -#: src/libslic3r/PrintConfig.cpp:1915 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "Pattern" msgstr "Trama" -#: src/libslic3r/PrintConfig.cpp:1805 +#: src/libslic3r/PrintConfig.cpp:1891 msgid "Pattern angle" msgstr "Angolo trama" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:2016 msgid "Pattern spacing" msgstr "Spaziatura trama" -#: src/libslic3r/PrintConfig.cpp:1917 +#: src/libslic3r/PrintConfig.cpp:2004 msgid "Pattern used to generate support material." msgstr "Trama usata per generare il materiale di supporto." -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:198 +#: src/slic3r/GUI/Plater.cpp:1261 +msgid "Pause" +msgstr "Pausa" + +#: src/slic3r/GUI/DoubleSlider.cpp:1009 +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/Gizmos/GLGizmoCut.cpp:175 msgid "Perform cut" msgstr "Effettua taglio" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/GCode/PreviewData.cpp:163 +#: src/libslic3r/PrintConfig.cpp:2927 +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 msgid "Perimeter" msgstr "Perimetro" -#: src/libslic3r/PrintConfig.cpp:1339 +#: src/libslic3r/PrintConfig.cpp:1408 msgid "Perimeter extruder" msgstr "Estrusore perimetro" -#: src/slic3r/GUI/PresetHints.cpp:162 +#: src/slic3r/GUI/PresetHints.cpp:165 msgid "perimeters" msgstr "perimetri" -#: src/libslic3r/PrintConfig.cpp:1330 src/libslic3r/PrintConfig.cpp:1348 -#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1370 +#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440 msgid "Perimeters" msgstr "Perimetri" -#: src/slic3r/GUI/ConfigWizard.cpp:440 +#: src/slic3r/GUI/ConfigWizard.cpp:860 #, possible-c-format -msgid "Pick another vendor supported by %s:" -msgstr "Scegli un altro produttore supportato da %s:" +msgid "Pick another vendor supported by %s" +msgstr "Scegli un altro distributore supportato da %s" -#: src/libslic3r/PrintConfig.cpp:2430 +#: 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:2681 msgid "Pillar widening factor" msgstr "Fattore di espansione pilastro" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:32 -msgid "Place on face" -msgstr "Posiziona sulla faccia" +#: src/slic3r/GUI/ConfigManipulation.cpp:330 +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/MainFrame.cpp:161 +#: src/slic3r/GUI/DoubleSlider.cpp:79 +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 +msgid "Place on face" +msgstr "Posiziona su faccia" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:204 msgid "Plater" msgstr "Piano" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 -msgid "Plater Shortcuts" -msgstr "Scorciatoie Piano" - -#: src/slic3r/GUI/GUI.cpp:143 +#: src/slic3r/GUI/GUI_App.cpp:1085 msgid "Please check and fix your object list." msgstr "Per favore controlla e correggi la tua lista oggetti." -#: src/slic3r/GUI/Tab.cpp:2797 +#: src/slic3r/GUI/Plater.cpp:2312 src/slic3r/GUI/Tab.cpp:2959 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/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:286 +#: src/slic3r/GUI/Plater.cpp:3286 +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 msgid "Portions copyright" msgstr "Parti di copyright" -#: src/libslic3r/PrintConfig.cpp:2235 +#: src/libslic3r/PrintConfig.cpp:2400 msgid "Portrait" msgstr "Ritratto" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:193 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457 msgid "Position" msgstr "Posizione" -#: src/slic3r/GUI/Tab.cpp:2265 +#: src/slic3r/GUI/Tab.cpp:2367 msgid "Position (for multi-extruder printers)" msgstr "Posizione (per stampanti multi-estrusore)" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Position (mm)" -msgstr "Posizione (mm)" - -#: src/libslic3r/PrintConfig.cpp:1553 +#: src/libslic3r/PrintConfig.cpp:1623 msgid "Position of perimeters starting points." msgstr "Posizione dei punti iniziali dei perimetri." -#: src/libslic3r/PrintConfig.cpp:2123 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Position X" msgstr "Posizione X" -#: src/libslic3r/PrintConfig.cpp:2130 +#: src/libslic3r/PrintConfig.cpp:2231 msgid "Position Y" msgstr "Posizione Y" -#: src/slic3r/GUI/Tab.cpp:1187 src/libslic3r/PrintConfig.cpp:1383 +#: src/slic3r/GUI/Tab.cpp:1245 src/libslic3r/PrintConfig.cpp:1453 msgid "Post-processing scripts" msgstr "Script di post produzione" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Pre&view" msgstr "&Visualizza anteprima" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 src/slic3r/GUI/Preferences.cpp:10 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10 msgid "Preferences" msgstr "Preferenze" -#: src/libslic3r/PrintConfig.cpp:1571 +#: src/libslic3r/PrintConfig.cpp:1641 msgid "Preferred direction of the seam" msgstr "Direzione preferita della giunzione" -#: src/libslic3r/PrintConfig.cpp:1582 +#: src/libslic3r/PrintConfig.cpp:1652 msgid "Preferred direction of the seam - jitter" msgstr "Direzione preferita della giunzione - jitter" -#: src/libslic3r/PrintObject.cpp:251 +#: src/libslic3r/PrintObject.cpp:255 msgid "Preparing infill" msgstr "Preparazione infill" -#: src/slic3r/GUI/Tab.cpp:2758 +#: src/slic3r/GUI/Tab.cpp:2920 #, possible-c-format msgid "Preset (%s)" msgstr "Preset (%s)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Press to activate deselection rectangle\nor to scale or rotate selected objects\naround their own center" -msgstr "Premere per attivare il rettangolo di deselezione\no per ridimensionare o ruotare gli oggetti selezionati\nattorno al loro centro" +#: src/slic3r/GUI/Tab.cpp:3082 +msgid "Preset with name \"%1%\" already exists." +msgstr "Preset con il nome \"%1%\" già esistente." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/Tab.cpp:3029 +msgctxt "PresetName" +msgid "Copy" +msgstr "Copia" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +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:146 -#, possible-c-format -msgid "Press to activate selection rectangle\nor to snap by 5% in Gizmo scale\nor to snap by 1mm in Gizmo move" -msgstr "Premere per attivare il rettangolo di selezione\no per incrementi del 5% nel Gizmo ridimensiona\no per incrementi di 1mm nel Gizmo sposta" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +msgid "Press to activate selection rectangle" +msgstr "Premi per attivare il rettangolo di selezione" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Press to scale selection to fit print volume\nin Gizmo scale" -msgstr "Premere per ridimensionare la selezione così da entrare nel volume di stampa\nnel Gizmo ridimensiona" +#: 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:127 -msgid "Press to select multiple object or move multiple object with mouse" -msgstr "Premi per selezionare o spostare oggetti multipli con il mouse" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +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/Tab.cpp:2288 +#: 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:211 src/slic3r/GUI/Plater.cpp:4105 +#: src/slic3r/GUI/Tab.cpp:2390 msgid "Preview" msgstr "Anteprima" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -msgid "Preview Shortcuts" -msgstr "Mostra Scorciatoie" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Preview hollowed and drilled model" +msgstr "Anteprima del modello svuotato e forato" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:790 msgid "Previously sliced file (" msgstr "File precedentemente processato (" -#: src/libslic3r/PrintConfig.cpp:1773 +#: src/libslic3r/PrintConfig.cpp:1851 msgid "Prime all printing extruders" msgstr "Prepara tutti gli estrusori di stampa" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1274 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1521 msgid "print" msgstr "stampa" -#: src/slic3r/GUI/MainFrame.cpp:510 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Print &Host Upload Queue" msgstr "Coda di caricamento &Host di stampa" -#: src/libslic3r/PrintConfig.cpp:439 +#: src/libslic3r/PrintConfig.cpp:471 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:541 +#: src/slic3r/GUI/ConfigWizard.cpp:952 msgid "Print Diameters" msgstr "Diametro di stampa" -#: src/slic3r/GUI/Tab.cpp:1917 src/slic3r/GUI/Tab.cpp:2074 +#: src/slic3r/GUI/Tab.cpp:1944 src/slic3r/GUI/Tab.cpp:2123 msgid "Print Host upload" msgstr "Caricamento Host di stampa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 -#: src/slic3r/GUI/PrintHostDialogs.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/PrintHostDialogs.cpp:136 msgid "Print host upload queue" msgstr "Coda di caricamento Host di stampa" -#: src/slic3r/GUI/Tab.hpp:317 src/slic3r/GUI/Tab.hpp:405 +#: src/slic3r/GUI/DoubleSlider.cpp:970 +msgid "Print mode" +msgstr "Modalità di stampa" + +#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:431 msgid "Print Settings" msgstr "Impostazioni Stampa" -#: src/slic3r/GUI/Plater.cpp:681 +#: src/slic3r/GUI/Plater.cpp:815 msgid "Print settings" msgstr "Impostazioni di stampa" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1478 msgid "Print speed override" msgstr "Scavalca velocità di stampa" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/libslic3r/GCode.cpp:638 +msgid "Print z" +msgstr "Stampa z" + +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Print&er Settings Tab" msgstr "Impostazioni Stampant&e" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1438 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1621 msgid "Printable" msgstr "Stampabile" -#: src/slic3r/GUI/Plater.cpp:685 +#: src/slic3r/GUI/Plater.cpp:819 msgid "Printer" msgstr "Stampante" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:48 src/slic3r/GUI/Preset.cpp:1278 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1525 msgid "printer" msgstr "stampante" -#: src/libslic3r/PrintConfig.cpp:2274 src/libslic3r/PrintConfig.cpp:2275 +#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 msgid "Printer absolute correction" msgstr "Correzione assoluta stampante" -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457 msgid "Printer gamma correction" msgstr "Correzione gamma della stampante" -#: src/slic3r/GUI/Tab.cpp:926 +#: src/slic3r/GUI/Tab.cpp:976 msgid "printer model" msgstr "modello stampante" -#: src/libslic3r/PrintConfig.cpp:1402 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Printer notes" msgstr "Note stampante" -#: src/libslic3r/PrintConfig.cpp:2266 src/libslic3r/PrintConfig.cpp:2267 -#: src/libslic3r/PrintConfig.cpp:2268 +#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2433 msgid "Printer scaling correction" msgstr "Correzione di scala stampante" -#: src/slic3r/GUI/Tab.hpp:368 +#: src/slic3r/GUI/Tab.hpp:391 msgid "Printer Settings" msgstr "Impostazioni stampante" -#: src/libslic3r/PrintConfig.cpp:42 src/libslic3r/PrintConfig.cpp:43 +#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 msgid "Printer technology" msgstr "Tecnologia stampante" -#: src/libslic3r/PrintConfig.cpp:1396 +#: src/libslic3r/PrintConfig.cpp:1466 msgid "Printer type" msgstr "Tipo stampante" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1487 msgid "Printer variant" msgstr "Variante della stampante" -#: src/libslic3r/PrintConfig.cpp:1411 +#: src/libslic3r/PrintConfig.cpp:1481 msgid "Printer vendor" msgstr "Venditore della stampante" -#: src/libslic3r/Print.cpp:1294 +#: src/libslic3r/Print.cpp:1388 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:715 +#: src/slic3r/GUI/MainFrame.cpp:849 #, possible-c-format msgid "Processing %s" msgstr "Elaborando %s" -#: src/slic3r/GUI/Plater.cpp:1600 +#: src/slic3r/GUI/Plater.cpp:2283 #, possible-c-format -msgid "Processing input file %s\n" -msgstr "Processando il file di input %s\n" +msgid "Processing input file %s" +msgstr "Processando il file di input %s" -#: src/libslic3r/PrintObject.cpp:110 +#: src/libslic3r/PrintObject.cpp:108 msgid "Processing triangulated mesh" msgstr "Elaborando la mesh triangolata" -#: src/slic3r/GUI/Tab.cpp:1201 src/slic3r/GUI/Tab.cpp:1585 -#: src/slic3r/GUI/Tab.cpp:1993 src/slic3r/GUI/Tab.cpp:2087 -#: src/slic3r/GUI/Tab.cpp:3337 src/slic3r/GUI/Tab.cpp:3446 +#: 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 msgid "Profile dependencies" msgstr "Dipendenze profilo" -#: src/slic3r/GUI/PrintHostDialogs.cpp:149 +#: src/slic3r/GUI/ConfigWizard.cpp:566 +msgid "Profile:" +msgstr "Profilo:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:150 msgid "Progress" msgstr "Progresso" -#: src/slic3r/GUI/FirmwareDialog.cpp:779 +#: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Progress:" msgstr "Progresso:" -#: src/slic3r/GUI/MainFrame.cpp:542 +#: src/slic3r/GUI/MainFrame.cpp:684 msgid "Prusa 3D &Drivers" msgstr "Prusa 3D &Drivers" -#: src/slic3r/GUI/ConfigWizard.cpp:1109 +#: src/slic3r/GUI/ConfigWizard.cpp:1995 msgid "Prusa FFF Technology Printers" msgstr "Stampanti Prusa con tecnologia FFF" -#: src/slic3r/GUI/ConfigWizard.cpp:1112 +#: src/slic3r/GUI/ConfigWizard.cpp:1998 msgid "Prusa MSLA Technology Printers" msgstr "Stampanti Prusa con tecnologia MSLA" -#: src/slic3r/GUI/AboutDialog.cpp:255 +#: src/slic3r/GUI/AboutDialog.cpp:260 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/GUI_App.cpp:297 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:284 #, 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." -#: src/libslic3r/PrintConfig.cpp:2153 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50 +msgid "PrusaSlicer version" +msgstr "versione PrusaSlicer" + +#: src/slic3r/GUI/ConfigWizard.cpp:815 +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 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:456 +#: src/slic3r/GUI/Plater.cpp:544 msgid "Purging volumes" msgstr "Volumi di spurgo" -#: src/libslic3r/PrintConfig.cpp:2106 +#: src/libslic3r/PrintConfig.cpp:2207 msgid "Purging volumes - load/unload volumes" msgstr "Volumi di spurgo - volumi di carico/scarico" -#: src/libslic3r/PrintConfig.cpp:2113 +#: src/libslic3r/PrintConfig.cpp:2214 msgid "Purging volumes - matrix" msgstr "Volumi di spurgo - matrice" -#: src/slic3r/GUI/Tab.cpp:1019 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +msgid "Quality" +msgstr "Qualità" + +#: src/slic3r/GUI/Tab.cpp:1080 msgid "Quality (slower slicing)" msgstr "Qualità (slicing più lento)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:854 src/slic3r/GUI/GUI_ObjectList.cpp:1139 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1145 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1377 +#: src/slic3r/GUI/GLCanvas3D.cpp:273 +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 #, possible-c-format msgid "Quick Add Settings (%s)" msgstr "Aggiungere Impostazioni Rapide (%s)" -#: src/slic3r/GUI/MainFrame.cpp:383 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Quick Slice" msgstr "Slice veloce" -#: src/slic3r/GUI/MainFrame.cpp:389 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Quick Slice and Save As" msgstr "Slice veloce e Salva Come" -#: src/slic3r/GUI/MainFrame.cpp:409 +#: src/slic3r/GUI/MainFrame.cpp:540 #, possible-c-format msgid "Quit %s" msgstr "Chiudi %s" -#: src/libslic3r/PrintConfig.cpp:479 +#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511 msgid "Radius" msgstr "Raggio" -#: src/slic3r/GUI/Tab.cpp:1066 +#: src/slic3r/GUI/Tab.cpp:1127 msgid "Raft" msgstr "Raft" -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1501 msgid "Raft layers" msgstr "Layer raft" -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" msgstr "Personalizzazione del ramming" -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 +#: src/slic3r/GUI/WipeTowerDialog.cpp:41 msgid "Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the 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 "Il ramming è la rapida estrusione appena prima di un cambio di attrezzo in una stampante MM ad estrusore singolo. Lo scopo è di dare la forma corretta al capo del filamento scaricato cosicché non prevenga l'inserzione del nuovo filamento e perché possa essere inserito più facilmente esso stesso. Questa fase è importante e materiali diversi possono richiedere velocità diverse per ottenere la forma corretta. Per questo motivo le velocità di estrusione del ramming possono essere modificate.\n\nQuesta è un'impostazione per esperti, valori scorretti produrranno facilmente dei blocchi, o porteranno l'ingranaggio di estrusione a macinare il filamento etc." -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 msgid "Ramming line spacing" msgstr "Spaziatura tra linee di ramming" -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 msgid "Ramming line width" msgstr "Larghezza della linea di Ramming" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Ramming parameters" msgstr "Parametri del ramming" -#: src/slic3r/GUI/Tab.cpp:1545 +#: src/slic3r/GUI/Tab.cpp:1505 msgid "Ramming settings" msgstr "Impostazioni del ramming" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "Random" msgstr "Casuale" -#: src/slic3r/GUI/wxExtensions.cpp:486 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 msgid "Range" msgstr "Intervallo" -#: src/libslic3r/SLAPrint.cpp:72 +#: src/libslic3r/SLAPrintSteps.cpp:65 msgid "Rasterizing layers" msgstr "Rasterizzazione dei layer" -#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#: src/slic3r/GUI/MainFrame.cpp:596 +msgid "Re&load from disk" +msgstr "R&icarica da disco" + +#: src/slic3r/GUI/UpdateDialogs.cpp:249 msgid "Re-configure" msgstr "Ri-configura" -#: src/slic3r/GUI/FirmwareDialog.cpp:783 +#: src/slic3r/GUI/FirmwareDialog.cpp:821 msgid "Ready" msgstr "Pronto" -#: src/slic3r/GUI/Plater.cpp:2406 +#: src/slic3r/GUI/Plater.cpp:3115 msgid "Ready to slice" msgstr "Pronto a processare" -#: src/slic3r/GUI/MainFrame.cpp:526 src/libslic3r/PrintConfig.cpp:1562 +#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632 msgid "Rear" msgstr "Posteriore" -#: src/slic3r/GUI/MainFrame.cpp:526 +#: src/slic3r/GUI/MainFrame.cpp:669 msgid "Rear View" msgstr "Vista posteriore" -#: src/slic3r/GUI/MainFrame.cpp:401 +#: src/slic3r/GUI/MainFrame.cpp:413 msgid "Recent projects" -msgstr "Progetti recenti" +msgstr "Prog&etti recenti" -#: src/slic3r/GUI/PresetHints.cpp:262 +#: src/slic3r/GUI/PresetHints.cpp:263 #, 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 +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 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:386 src/slic3r/GUI/GUI_App.cpp:395 +#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459 msgid "Recreating" -msgstr "Ricreando" +msgstr "Rigenerando" -#: src/slic3r/GUI/BedShapeDialog.cpp:68 +#: src/slic3r/GUI/BedShapeDialog.cpp:73 msgid "Rectangular" msgstr "Rettangolare" -#: src/libslic3r/PrintConfig.cpp:398 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1922 +#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843 +#: src/libslic3r/PrintConfig.cpp:2009 msgid "Rectilinear" msgstr "Rettilineo" -#: src/libslic3r/PrintConfig.cpp:1923 +#: src/libslic3r/PrintConfig.cpp:2010 msgid "Rectilinear grid" msgstr "Griglia rettilinea" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3639 -#: src/slic3r/GUI/MainFrame.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131 +#: src/slic3r/GUI/MainFrame.cpp:584 msgid "Redo" msgstr "Ripeti" -#: src/slic3r/GUI/GLCanvas3D.cpp:3497 +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 #, 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:3479 +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 msgid "Redo History" msgstr "Storia Ripeti" -#: src/slic3r/GUI/Tab.cpp:1037 +#: src/slic3r/GUI/Tab.cpp:1098 msgid "Reducing printing time" msgstr "Riduzione tempo di stampa" -#: src/slic3r/GUI/Plater.cpp:2924 -msgid "Reload from Disk" +#: src/slic3r/GUI/Plater.cpp:3452 +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 +msgid "Reload from disk" msgstr "Ricarica da Disco" -#: src/slic3r/GUI/Plater.cpp:2924 -msgid "Reload the selected file from Disk" -msgstr "Ricarica il file selezionato dal Disco" +#: src/slic3r/GUI/Plater.cpp:3339 +msgid "Reload from:" +msgstr "Ricarica da:" -#: src/slic3r/GUI/Preferences.cpp:36 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +msgid "Reload plater from disk" +msgstr "Ricarica piano da disco" + +#: src/slic3r/GUI/MainFrame.cpp:597 +msgid "Reload the plater from disk" +msgstr "Ricarica piano da disco" + +#: src/slic3r/GUI/Plater.cpp:3963 +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 +msgid "Reload the selected volumes from disk" +msgstr "Ricarica i volumi selezionati dal disco" + +#: src/slic3r/GUI/Preferences.cpp:39 msgid "Remember output directory" msgstr "Ricorda la directory di output" -#: src/slic3r/GUI/Tab.cpp:2935 +#: src/slic3r/GUI/Tab.cpp:3121 msgid "remove" msgstr "rimuovi" -#: src/slic3r/GUI/Tab.cpp:2937 +#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 +#: src/slic3r/GUI/Tab.cpp:3124 msgid "Remove" msgstr "Rimuovi" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:859 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +msgid "Remove all holes" +msgstr "Rimuovi tutti i fori" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 msgid "Remove all points" msgstr "Rimuovi tutti i punti" -#: src/slic3r/GUI/GLCanvas3D.cpp:3475 +#: src/slic3r/GUI/GLCanvas3D.cpp:246 +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 msgid "Remove instance" msgstr "Rimuovi istanza" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Remove Instance of the selected object" msgstr "Rimuovi Istanza dell'oggetto selezionato" @@ -4921,60 +5817,68 @@ msgstr "Rimuovi Istanza dell'oggetto selezionato" msgid "Remove layer range" msgstr "Rimuovi intervallo layer" -#: src/slic3r/GUI/Plater.cpp:3518 +#: src/slic3r/GUI/Plater.cpp:3942 msgid "Remove one instance of the selected object" msgstr "Rimuovi una istanza dell'oggetto selezionato" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:83 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95 msgid "Remove parameter" msgstr "Rimuovi parametro" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1230 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 msgid "Remove point" msgstr "Rimuovi punto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1233 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 msgid "Remove point from selection" msgstr "Rimuovi punto dalla selezione" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:855 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1237 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +msgid "Remove selected holes" +msgstr "Rimuovi i fori selezionati" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1371 msgid "Remove selected points" msgstr "Rimuovi punti selezionati" -#: src/slic3r/GUI/Plater.cpp:2891 src/slic3r/GUI/Plater.cpp:2909 +#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953 msgid "Remove the selected object" msgstr "Rimuovi l'oggetto selezionato" -#: src/slic3r/GUI/ConfigWizard.cpp:305 -msgid "Remove user profiles - install from scratch (a snapshot will be taken beforehand)" -msgstr "Rimuovi profili utente - reinstalla da zero (sarà prima fatto uno snapshot)" +#: src/slic3r/GUI/ConfigWizard.cpp:453 +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:1200 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1636 msgid "Rename" msgstr "Rinomina" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:551 msgid "Rename Object" msgstr "Rinomina oggetto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:551 msgid "Rename Sub-object" msgstr "Rinomina sotto-oggetto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3803 msgid "Renaming" msgstr "Rinomina" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115 +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 msgid "Render with a software renderer" msgstr "Eseguire il rendering con un software redender" -#: src/libslic3r/PrintConfig.cpp:3126 +#: src/libslic3r/PrintConfig.cpp:3516 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:772 src/libslic3r/PrintConfig.cpp:3058 +#: src/slic3r/GUI/MainFrame.cpp:911 src/libslic3r/PrintConfig.cpp:3447 msgid "Repair" msgstr "Ripara" @@ -4998,229 +5902,256 @@ msgstr "Il file 3MF non contiene alcun volume" msgid "Repairing model by the Netfabb service" msgstr "Riparare modello tramite servizio Netfabb" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 src/slic3r/GUI/MainFrame.cpp:395 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat last quick slice" msgstr "Ripeti l'ultimo slice veloce" -#: src/slic3r/GUI/MainFrame.cpp:395 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat Last Quick Slice" msgstr "Ripeti l'ultimo slice veloce" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/Tab.cpp:3083 +msgid "Replace?" +msgstr "Sostituire?" + +#: src/slic3r/GUI/MainFrame.cpp:703 msgid "Report an I&ssue" msgstr "&Segnala un problema" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/MainFrame.cpp:703 #, possible-c-format msgid "Report an issue on %s" msgstr "Segnala un problema su %s" -#: src/slic3r/Utils/PresetUpdater.cpp:590 +#: src/slic3r/Utils/PresetUpdater.cpp:713 #, possible-c-format msgid "requires max. %s" msgstr "richiede max. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:588 +#: src/slic3r/Utils/PresetUpdater.cpp:710 #, possible-c-format msgid "requires min. %s" msgstr "richiede min. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:583 +#: src/slic3r/Utils/PresetUpdater.cpp:705 #, possible-c-format msgid "requires min. %s and max. %s" msgstr "richiede min. %s e max. %s" -#: src/slic3r/GUI/FirmwareDialog.cpp:772 +#: src/slic3r/GUI/FirmwareDialog.cpp:810 msgid "Rescan" msgstr "Ri-scansiona" -#: src/slic3r/GUI/Tab.cpp:1879 +#: src/slic3r/GUI/Tab.cpp:1906 msgid "Rescan serial ports" msgstr "Scansiona nuovamente porte seriali" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1239 +#: src/slic3r/GUI/GLCanvas3D.cpp:313 +msgid "Reset" +msgstr "Reimposta" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1373 msgid "Reset clipping plane" msgstr "Ripristina piano di ritaglio" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:928 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 msgid "Reset direction" msgstr "Reset direzione" -#: src/slic3r/GUI/Plater.cpp:2603 +#: src/slic3r/GUI/Plater.cpp:2723 msgid "Reset Project" msgstr "Reimposta Progetto" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:303 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 msgid "Reset rotation" msgstr "Reimposta rotazione" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:328 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 msgid "Reset Rotation" msgstr "Reimposta rotazione" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:290 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 msgid "Reset scale" msgstr "Reimposta scala" -#: src/slic3r/GUI/Tab.cpp:2584 +#: src/slic3r/GUI/GLCanvas3D.cpp:252 +msgid "Reset to base" +msgstr "Ripristina alla base" + +#: src/slic3r/GUI/Tab.cpp:2394 msgid "Reset to Filament Color" msgstr "Ripristina colore Filamento" -#: src/libslic3r/PrintConfig.cpp:1441 +#: src/libslic3r/PrintConfig.cpp:1511 msgid "Resolution" msgstr "Risoluzione" -#: src/libslic3r/PrintConfig.cpp:1459 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Retract amount before wipe" msgstr "Retrai la quantità prima di pulire" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1537 msgid "Retract on layer change" msgstr "Retrai al cambio layer" -#: src/slic3r/GUI/Tab.cpp:2268 +#: src/slic3r/GUI/Tab.cpp:1324 src/slic3r/GUI/Tab.cpp:1383 +#: src/slic3r/GUI/Tab.cpp:2370 msgid "Retraction" msgstr "Retrazione" -#: src/libslic3r/PrintConfig.cpp:1453 +#: src/libslic3r/PrintConfig.cpp:1523 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:1474 +#: src/libslic3r/PrintConfig.cpp:1544 msgid "Retraction Length" msgstr "Lunghezza Retrazione" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1552 msgid "Retraction Length (Toolchange)" msgstr "Lunghezza Retrazione (cambio attrezzo)" -#: src/libslic3r/PrintConfig.cpp:1534 src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605 msgid "Retraction Speed" msgstr "Velocità di retrazione" -#: src/slic3r/GUI/Tab.cpp:2284 +#: src/slic3r/GUI/Tab.cpp:2386 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:244 +#: src/slic3r/GUI/GUI_Preview.cpp:254 msgid "Retractions" msgstr "Retrazioni" -#: src/slic3r/GUI/MainFrame.cpp:528 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right" msgstr "Destra" -#: src/slic3r/GUI/GUI_ObjectList.cpp:381 +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 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:279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 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:250 +#: src/slic3r/GUI/GUI_ObjectList.cpp:359 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:1232 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 msgid "Right click" msgstr "Click destro" -#: src/slic3r/GUI/MainFrame.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:243 +msgid "Right mouse button:" +msgstr "Tasto destro mouse:" + +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right View" msgstr "Vista destra" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:233 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:253 -#: src/libslic3r/PrintConfig.cpp:3062 +#: 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 msgid "Rotate" msgstr "Ruota" -#: src/libslic3r/PrintConfig.cpp:3067 +#: src/libslic3r/PrintConfig.cpp:3456 msgid "Rotate around X" msgstr "Ruota attorno ad X" -#: src/libslic3r/PrintConfig.cpp:3072 +#: src/libslic3r/PrintConfig.cpp:3461 msgid "Rotate around Y" msgstr "Ruota attorno ad Y" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:35 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 msgid "Rotate lower part upwards" msgstr "Capovolgi la parte inferiore" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:151 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:194 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Rotate selection 45 degrees CCW" +msgstr "Ruota la selezione di 45° in senso antiorario" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +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 msgid "Rotation" msgstr "Rotazione" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:491 -msgid "Rotation (deg)" -msgstr "Rotazione (gradi)" - -#: src/libslic3r/PrintConfig.cpp:3068 +#: src/libslic3r/PrintConfig.cpp:3457 msgid "Rotation angle around the X axis in degrees." msgstr "Angolo di rotazione attorno all'asse X in gradi." -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3462 msgid "Rotation angle around the Y axis in degrees." msgstr "Angolo di rotazione sull'asse Y in gradi." -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3452 msgid "Rotation angle around the Z axis in degrees." msgstr "Angolo di rotazione attorno all'asse Z in gradi." -#: src/slic3r/GUI/ConfigWizard.cpp:298 src/slic3r/GUI/GUI_App.cpp:658 +#: src/slic3r/GUI/GUI_App.cpp:797 #, possible-c-format msgid "Run %s" msgstr "Run %s" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:85 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:398 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478 msgid "Running post-processing scripts" msgstr "Esecuzione script di post produzione" -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/RammingChart.cpp:81 -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 src/libslic3r/PrintConfig.cpp:612 -#: src/libslic3r/PrintConfig.cpp:656 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:2243 src/libslic3r/PrintConfig.cpp:2252 -#: src/libslic3r/PrintConfig.cpp:2312 src/libslic3r/PrintConfig.cpp:2319 +#: 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 msgid "s" msgstr "s" -#: src/slic3r/GUI/MainFrame.cpp:466 src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:750 msgid "S&end G-code" msgstr "Invia G-cod&e" -#: src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:750 msgid "S&end to print" msgstr "Manda in stampa" #. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3264 +#: src/slic3r/GUI/Tab.cpp:3417 #, possible-c-format msgid "Save %s as:" msgstr "Salva %s come:" -#: src/slic3r/GUI/MainFrame.cpp:686 +#: src/slic3r/GUI/MainFrame.cpp:826 #, possible-c-format msgid "Save %s file as:" msgstr "Salva file %s come:" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1023 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046 msgid "Save changes?" msgstr "Salvare modifiche?" -#: src/libslic3r/PrintConfig.cpp:2997 +#: src/libslic3r/PrintConfig.cpp:3386 msgid "Save config file" msgstr "Salva file config" -#: src/slic3r/GUI/MainFrame.cpp:786 +#: src/slic3r/GUI/MainFrame.cpp:925 msgid "Save configuration as:" msgstr "Salva configurazione come:" -#: src/libslic3r/PrintConfig.cpp:2998 +#: src/libslic3r/PrintConfig.cpp:3387 msgid "Save configuration to the specified file." msgstr "Salva configurazione nel file specificato." @@ -5230,47 +6161,51 @@ msgstr "Salva configurazione nel file specificato." msgid "Save current %s" msgstr "Salva le %s attuali" -#: src/slic3r/GUI/MainFrame.cpp:341 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "Save current project file" msgstr "Salva progetto corrente" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save current project file as" msgstr "Salvare il file del progetto corrente come" -#: src/slic3r/GUI/Plater.cpp:1938 +#: src/slic3r/GUI/Plater.cpp:2604 msgid "Save file as:" msgstr "Salva come:" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/Plater.cpp:4839 msgid "Save G-code file as:" msgstr "Salva il file G-code come:" -#: src/slic3r/GUI/MainFrame.cpp:757 +#: src/slic3r/GUI/MainFrame.cpp:899 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:417 +#: src/slic3r/GUI/Tab.hpp:443 msgid "Save preset" msgstr "Salva preset" -#: src/slic3r/GUI/MainFrame.cpp:843 +#: src/slic3r/GUI/MainFrame.cpp:980 msgid "Save presets bundle as:" msgstr "Salva il gruppo di preset come:" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save Project &as" msgstr "Salv&a Progetto come" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 -msgid "Save project (3MF)" -msgstr "Salva progetto (3MF)" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +msgid "Save project (3mf)" +msgstr "Salva progetto (3mf)" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +msgid "Save project as (3mf)" +msgstr "Salva progetto come (3mf)" + +#: src/slic3r/GUI/Plater.cpp:4839 msgid "Save SL1 file as:" msgstr "Salva file SL1 come:" -#: src/slic3r/GUI/MainFrame.cpp:692 +#: src/slic3r/GUI/MainFrame.cpp:838 msgid "Save zip file as:" msgstr "Salva file zip come:" @@ -5280,58 +6215,59 @@ 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/GUI_ObjectManipulation.cpp:152 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:234 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:254 -#: src/libslic3r/PrintConfig.cpp:3077 +#: 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 msgid "Scale" msgstr "Ridimensiona" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:276 -msgid "Scale (%)" -msgstr "Ridimensiona (%)" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:195 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 msgid "Scale factors" msgstr "Fattore di scala" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: 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 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:3086 +#: src/libslic3r/PrintConfig.cpp:3475 msgid "Scale to Fit" msgstr "Ridimensiona per riempire" -#: src/slic3r/GUI/Selection.cpp:947 +#: src/slic3r/GUI/Selection.cpp:939 msgid "Scale To Fit" msgstr "Ridimensiona per adattare" -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3476 msgid "Scale to fit the given volume." msgstr "Ridimensiona per adattare al volume dato." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1724 msgid "Scale to print volume" msgstr "Ridimensiona a volume di stampa" -#: src/libslic3r/PrintConfig.cpp:3078 +#: src/libslic3r/PrintConfig.cpp:3467 msgid "Scaling factor or percentage." msgstr "Fattore di scala o percentuale." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:409 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505 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:1551 +#: src/libslic3r/PrintConfig.cpp:1621 msgid "Seam position" msgstr "Posizione giunzioni" -#: src/libslic3r/PrintConfig.cpp:1572 +#: src/libslic3r/PrintConfig.cpp:1642 msgid "Seam preferred direction" msgstr "Direzione preferita giunzione" -#: src/libslic3r/PrintConfig.cpp:1581 +#: src/libslic3r/PrintConfig.cpp:1651 msgid "Seam preferred direction jitter" msgstr "Direzione preferita giunzione jitter" @@ -5339,67 +6275,63 @@ msgstr "Direzione preferita giunzione jitter" msgid "Searching for devices" msgstr "Ricerca dispositivi" -#: src/slic3r/GUI/Plater.cpp:2190 +#: src/slic3r/GUI/Plater.cpp:2858 msgid "Searching for optimal orientation" msgstr "Ricerca orientamento ottimale" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 -msgid "Select All objects" -msgstr "Seleziona Tutti gli oggetti" +#: src/slic3r/GUI/GUI_App.cpp:1103 +msgid "Select a gcode file:" +msgstr "Seleziona un file gcode:" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Select all objects" +msgstr "Seleziona tutti gli oggetti" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1370 msgid "Select all points" msgstr "Seleziona tutti i punti" -#: src/slic3r/GUI/ConfigWizard.cpp:1089 +#: src/slic3r/GUI/ConfigWizard.cpp:1976 msgid "Select all standard printers" msgstr "Seleziona tutte le stampanti standard" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1234 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368 msgid "Select by rectangle" msgstr "Seleziona con rettangolo" -#: src/slic3r/GUI/MainFrame.cpp:806 src/slic3r/GUI/MainFrame.cpp:870 +#: src/slic3r/GUI/MainFrame.cpp:944 src/slic3r/GUI/MainFrame.cpp:1006 msgid "Select configuration to load:" msgstr "Seleziona configurazione da caricare:" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82 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:2834 -msgid "Select extruder number for selected objects and/or parts" -msgstr "Seleziona il numero estrusore per gli oggetti selezionati e/o parti" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2847 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3971 msgid "Select extruder number:" msgstr "Seleziona l'estrusore numero:" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 msgid "Select Filament Settings Tab" msgstr "Attiva Scheda impostazioni di Filamento" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1251 -msgid "Select new extruder for the object/part" -msgstr "Seleziona il nuovo estrusore per l'oggetto/parte" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 msgid "Select Plater Tab" msgstr "Seleziona scheda piano" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 msgid "Select Print Settings Tab" msgstr "Attiva Scheda Impostazioni di Stampa" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 msgid "Select Printer Settings Tab" msgstr "Attiva Scheda Impostazioni Stampante" -#: src/slic3r/GUI/GUI_ObjectList.cpp:917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1265 msgid "Select showing settings" msgstr "Seleziona le impostazioni mostrate" -#: src/slic3r/GUI/GUI_App.cpp:524 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Select the language" msgstr "Seleziona la lingua" @@ -5411,39 +6343,43 @@ msgstr "Seleziona i profili di stampa compatibili con questo profilo." msgid "Select the printers this profile is compatible with." msgstr "Seleziona le stampanti compatibili con questo profilo." -#: src/slic3r/GUI/MainFrame.cpp:744 +#: src/slic3r/GUI/MainFrame.cpp:889 msgid "Select the STL file to repair:" msgstr "Seleziona il file STL da riparare:" -#: src/slic3r/GUI/Preferences.cpp:207 +#: src/slic3r/GUI/Preferences.cpp:237 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:2545 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3553 msgid "Select type of part" msgstr "Seleziona il tipo di parte" -#: src/slic3r/GUI/Plater.cpp:606 +#: src/slic3r/GUI/Plater.cpp:638 msgid "Select what kind of pad do you need" msgstr "Seleziona il tipo di Pad richiesto" -#: src/slic3r/GUI/Plater.cpp:421 +#: src/slic3r/GUI/Plater.cpp:498 msgid "Select what kind of support do you need" msgstr "Seleziona il tipo di supporto richiesto" +#: src/slic3r/GUI/DoubleSlider.cpp:1917 +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 msgid "Selection-Add" msgstr "Selezione-Aggiungi" -#: src/slic3r/GUI/Selection.cpp:384 +#: src/slic3r/GUI/Selection.cpp:376 msgid "Selection-Add All" msgstr "Selezione-Aggiungi tutti" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3299 msgid "Selection-Add from list" msgstr "Aggiungi selezione da elenco" -#: src/slic3r/GUI/GLCanvas3D.cpp:5623 +#: src/slic3r/GUI/GLCanvas3D.cpp:6598 msgid "Selection-Add from rectangle" msgstr "Aggiungi Selezione da rettangolo" @@ -5459,15 +6395,15 @@ msgstr "Selezione-Aggiungi Oggetto" msgid "Selection-Remove" msgstr "Selezione-Rimuovi" -#: src/slic3r/GUI/Selection.cpp:410 +#: src/slic3r/GUI/Selection.cpp:402 msgid "Selection-Remove All" msgstr "Selezione-Rimuovi tutti" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2867 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3291 msgid "Selection-Remove from list" msgstr "Rimozione Selezione dall'elenco" -#: src/slic3r/GUI/GLCanvas3D.cpp:5642 +#: src/slic3r/GUI/GLCanvas3D.cpp:6617 msgid "Selection-Remove from rectangle" msgstr "Rimuovi selezione da rettangolo" @@ -5479,11 +6415,11 @@ msgstr "Selezione-Rimuovi istanza" msgid "Selection-Remove Object" msgstr "Selezione-Rimuovi oggetto" -#: src/slic3r/GUI/MainFrame.cpp:444 +#: src/slic3r/GUI/MainFrame.cpp:566 msgid "Selects all objects" msgstr "Seleziona tutti gli oggetti" -#: src/slic3r/GUI/Plater.cpp:3822 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5522 msgid "Send G-code" msgstr "Invia G-code" @@ -5491,27 +6427,31 @@ msgstr "Invia G-code" msgid "Send G-Code to printer host" msgstr "Invia G-code all’host stampante" -#: src/slic3r/GUI/MainFrame.cpp:466 +#: src/slic3r/GUI/MainFrame.cpp:481 msgid "Send to print current plate as G-code" msgstr "Manda alla stampante il piano corrente come G-Code" -#: src/slic3r/GUI/Plater.cpp:731 src/slic3r/GUI/Plater.cpp:3822 +#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5522 msgid "Send to printer" msgstr "Manda alla stampante" -#: src/slic3r/GUI/Tab.cpp:1169 +#: src/slic3r/GUI/GLCanvas3D.cpp:1305 +msgid "Seq." +msgstr "Seq." + +#: src/slic3r/GUI/Tab.cpp:1231 msgid "Sequential printing" msgstr "Stampa sequenziale" -#: src/slic3r/GUI/Tab.cpp:1874 src/libslic3r/PrintConfig.cpp:1591 +#: src/slic3r/GUI/Tab.cpp:1901 src/libslic3r/PrintConfig.cpp:1661 msgid "Serial port" msgstr "Porta seriale" -#: src/libslic3r/PrintConfig.cpp:1599 +#: src/libslic3r/PrintConfig.cpp:1669 msgid "Serial port speed" msgstr "Velocità porta seriale" -#: src/slic3r/GUI/FirmwareDialog.cpp:769 +#: src/slic3r/GUI/FirmwareDialog.cpp:807 msgid "Serial port:" msgstr "Porta seriale:" @@ -5519,629 +6459,733 @@ msgstr "Porta seriale:" msgid "Service name" msgstr "Nome servizio" -#: src/slic3r/GUI/Tab.cpp:1824 src/slic3r/GUI/Tab.cpp:2025 -#: src/slic3r/GUI/Tab.cpp:3008 +#: src/slic3r/GUI/Tab.cpp:1802 src/slic3r/GUI/Tab.cpp:2046 +#: src/slic3r/GUI/Tab.cpp:3176 msgid "Set" msgstr "Imposta" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1192 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1599 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 msgid "Set as a Separated Object" msgstr "Imposta come Oggetto Separato" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 msgid "Set as a Separated Objects" msgstr "Imposta come Oggetti Separati" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +msgid "Set extruder change for every" +msgstr "Imposta il cambio estrusore per ogni" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1671 msgid "Set extruder for selected items" msgstr "Imposta estrusore per gli elementi selezionati" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 +msgid "Set extruder sequence" +msgstr "Imposta sequenza estrusore" + +#: src/slic3r/GUI/DoubleSlider.cpp:1532 +msgid "Set extruder sequence for the entire print" +msgstr "Imposta sequenza estrusore per l'intera stampa" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "Imposta sequenza estrusore(attrezzo)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 msgid "Set lower thumb to current slider thumb" msgstr "Imposta il cursore inferiore alla barra di scorrimento attuale" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:245 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297 msgid "Set Mirror" msgstr "Imposta specchio" -#: src/slic3r/GUI/Plater.cpp:3520 +#: src/slic3r/GUI/Plater.cpp:3944 msgid "Set number of instances" msgstr "Imposta numero di istanze" -#: src/slic3r/GUI/Plater.cpp:4163 +#: src/slic3r/GUI/Plater.cpp:4756 #, possible-c-format msgid "Set numbers of copies to %d" msgstr "Imposta il numero di copie a %d" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:746 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781 msgid "Set Orientation" msgstr "Imposta orientamento" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:715 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750 msgid "Set Position" msgstr "Imposta posizione" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3759 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Printable" msgstr "Imposta stampabile" -#: src/slic3r/GUI/Selection.cpp:1482 +#: src/slic3r/GUI/Selection.cpp:1475 msgid "Set Printable Instance" msgstr "Imposta Istanza Stampabile" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846 msgid "Set Scale" msgstr "Imposta scala" -#: src/libslic3r/PrintConfig.cpp:2228 +#: src/libslic3r/PrintConfig.cpp:2393 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:527 +#: src/slic3r/GUI/ConfigWizard.cpp:932 msgid "Set the shape of your printer's bed." msgstr "Imposta la dimensione del piano della stampante." -#: src/libslic3r/PrintConfig.cpp:524 +#: src/libslic3r/PrintConfig.cpp:556 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:417 +#: src/libslic3r/PrintConfig.cpp:448 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:831 +#: src/libslic3r/PrintConfig.cpp:878 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:1689 +#: src/libslic3r/PrintConfig.cpp:1758 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:2019 +#: src/libslic3r/PrintConfig.cpp:2107 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:963 +#: src/libslic3r/PrintConfig.cpp:1011 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:1350 +#: src/libslic3r/PrintConfig.cpp:1419 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:1862 +#: src/libslic3r/PrintConfig.cpp:1948 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:480 +#: src/libslic3r/PrintConfig.cpp:512 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." -#: src/libslic3r/PrintConfig.cpp:65 +#: src/libslic3r/PrintConfig.cpp:81 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:469 +#: src/libslic3r/PrintConfig.cpp:501 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:3759 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Unprintable" msgstr "Imposta non stampabile" -#: src/slic3r/GUI/Selection.cpp:1482 +#: src/slic3r/GUI/Selection.cpp:1475 msgid "Set Unprintable Instance" msgstr "Imposta Istanza non stampabile" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 msgid "Set upper thumb to current slider thumb" msgstr "Imposta il cursore superiore alla barra di scorrimento attuale" -#: src/slic3r/GUI/BedShapeDialog.cpp:143 +#: src/libslic3r/PrintConfig.cpp:3509 +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 msgid "Settings" msgstr "Impostazioni" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 msgid "Settings for height range" msgstr "Impostazioni per intervallo altezza" -#: src/slic3r/GUI/BedShapeDialog.cpp:60 +#: src/slic3r/GUI/ConfigManipulation.cpp:162 +msgid "Shall I adjust those settings for supports?" +msgstr "Vuoi che regoli queste impostazioni per i supporti?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:89 +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 +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 +msgid "Shall I switch to rectilinear fill pattern?" +msgstr "Devo passare alla trama di riempimento rettilinea?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:139 +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 msgid "Shape" msgstr "Forma" -#: src/slic3r/GUI/GUI_Preview.cpp:246 +#: src/slic3r/GUI/GUI_Preview.cpp:256 msgid "Shells" msgstr "Gusci" -#: src/slic3r/GUI/GUI_Preview.cpp:221 +#: src/slic3r/GUI/GLCanvas3D.cpp:249 +msgid "Shift + Left mouse button:" +msgstr "Shift + Tasto sinistro mouse:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:255 +msgid "Shift + Right mouse button:" +msgstr "Shift + Tasto destro mouse:" + +#: src/slic3r/GUI/GUI_Preview.cpp:231 msgid "Show" msgstr "Mostra" -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show &Configuration Folder" msgstr "Mostra Cartella &Configurazione" -#: src/slic3r/GUI/MainFrame.cpp:563 +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Show &labels" +msgstr "Mostra &etichette" + +#: src/slic3r/GUI/MainFrame.cpp:705 msgid "Show about dialog" msgstr "Mostra la finestra di informazioni" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show advanced settings" msgstr "Mostra impostazioni avanzate" -#: src/slic3r/GUI/PrintHostDialogs.cpp:158 +#: src/slic3r/GUI/PrintHostDialogs.cpp:159 msgid "Show error message" msgstr "Mostra messaggio d'errore" -#: src/slic3r/GUI/Preferences.cpp:84 +#: src/slic3r/GUI/Preferences.cpp:95 msgid "Show incompatible print and filament presets" msgstr "Mostra preset di stampa e di filamento incompatibili" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Show keyboard shortcuts list" msgstr "Mostra elenco scorciatoie di tastiera" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Show object/instance labels in 3D scene" +msgstr "Mostra nella scena 3D le etichette dell'oggetto/istanza" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show simplified settings" msgstr "Mostra impostazioni semplificate" -#: src/slic3r/GUI/MainFrame.cpp:557 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52 +msgid "Show supports" +msgstr "Mostra supporti" + +#: src/slic3r/GUI/MainFrame.cpp:699 msgid "Show system information" msgstr "Mostra informazioni di sistema" -#: src/slic3r/GUI/MainFrame.cpp:487 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "Show the 3D editing view" -msgstr "Mostra la Vista editing 3D" +msgstr "Mostra la Vista modifica 3D" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Show the 3D slices preview" msgstr "Mostra anteprima slice 3D" -#: src/slic3r/GUI/MainFrame.cpp:480 +#: src/slic3r/GUI/MainFrame.cpp:617 msgid "Show the filament settings" msgstr "Mostra impostazioni filamento" -#: src/libslic3r/PrintConfig.cpp:2983 +#: src/libslic3r/PrintConfig.cpp:3372 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:2988 +#: src/libslic3r/PrintConfig.cpp:3377 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:566 +#: src/slic3r/GUI/MainFrame.cpp:708 msgid "Show the list of the keyboard shortcuts" msgstr "Mostra l'elenco delle scorciatoie di tastiera" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "Show the plater" msgstr "Mostra il piano" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "Show the print settings" msgstr "Mostra impostazioni di stampa" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Show the printer settings" msgstr "Mostra impostazioni della stampante" -#: src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:3366 msgid "Show this help." msgstr "Mostra questo aiuto." -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show user configuration folder (datadir)" msgstr "Mostra cartella configurazione utente (datadir)" #: src/slic3r/GUI/KBShortcutsDialog.cpp:185 -msgid "Show/Hide (L)egend" -msgstr "Mostra/Nascondi (L)egenda" +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Mostra/Nascondi finestra delle impostazioni dei dispositivi 3Dconnexion" -#: src/slic3r/GUI/GUI_App.cpp:674 src/slic3r/GUI/wxExtensions.cpp:2459 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +msgid "Show/Hide Legend" +msgstr "Mostra/Nascondi Legenda" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +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 msgid "Simple" msgstr "Semplice" -#: src/slic3r/GUI/GUI_App.cpp:674 +#: src/slic3r/GUI/ConfigWizard.cpp:820 +msgid "Simple mode" +msgstr "Modalità Semplice" + +#: src/slic3r/GUI/GUI_App.cpp:813 msgid "Simple View Mode" msgstr "Modalità di visualizzazione semplice" -#: src/slic3r/GUI/Tab.cpp:2231 src/slic3r/GUI/Tab.cpp:2239 +#: src/slic3r/GUI/Tab.cpp:2298 src/slic3r/GUI/Tab.cpp:2306 msgid "Single extruder MM setup" msgstr "Setup Estrusore singolo MM" -#: src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1845 msgid "Single Extruder Multi Material" msgstr "Estrusore singolo Multi Material" -#: src/slic3r/GUI/Tab.cpp:2023 +#: src/slic3r/GUI/Tab.cpp:1867 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:2240 +#: src/slic3r/GUI/Tab.cpp:2307 msgid "Single extruder multimaterial parameters" msgstr "Parametri estrusore singolo materiale multiplo" -#: src/slic3r/GUI/BedShapeDialog.cpp:72 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 src/slic3r/GUI/Plater.cpp:137 -#: src/slic3r/GUI/Tab.cpp:2257 +#: 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 msgid "Size" msgstr "Dimensioni" -#: src/slic3r/GUI/Tab.cpp:1813 src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:1797 src/slic3r/GUI/Tab.cpp:2041 msgid "Size and coordinates" msgstr "Dimensione e coordinate" -#: src/slic3r/GUI/BedShapeDialog.cpp:73 +#: src/slic3r/GUI/BedShapeDialog.cpp:78 msgid "Size in X and Y of the rectangular plate." msgstr "Dimensioni X e Y del piano rettangolare." -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/slic3r/GUI/Tab.cpp:1050 -#: src/libslic3r/GCode/PreviewData.cpp:171 +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1111 +#: src/libslic3r/ExtrusionEntity.cpp:318 msgid "Skirt" msgstr "Skirt" -#: src/slic3r/GUI/Tab.cpp:1049 +#: src/slic3r/GUI/Tab.cpp:1110 msgid "Skirt and brim" msgstr "Skirt e brim" -#: src/libslic3r/PrintConfig.cpp:1617 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "Skirt height" msgstr "Altezza skirt" -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Skirt Loops" msgstr "Giri skirt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1200 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1334 msgid "SLA gizmo keyboard shortcuts" msgstr "Scorciatoie di tastiera gizmo SLA" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1150 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1058 msgid "SLA gizmo turned off" msgstr "Gizmo SLA disattivato" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1115 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1017 msgid "SLA gizmo turned on" msgstr "Gizmo SLA attivato" -#: src/slic3r/GUI/Plater.cpp:684 src/slic3r/GUI/Preset.cpp:1277 +#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1524 msgid "SLA material" msgstr "Materiale SLA" -#: src/slic3r/GUI/Plater.cpp:683 src/slic3r/GUI/Preset.cpp:1276 +#: src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "SLA Material Profiles Selection" +msgstr "Selezione Profili Materiale SLA" + +#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471 +msgid "SLA material type" +msgstr "Tipo materiale SLA" + +#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "SLA Materials" +msgstr "Materiali SLA" + +#: src/slic3r/GUI/Preset.cpp:1523 msgid "SLA print" msgstr "Stampa SLA" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2578 msgid "SLA print material notes" msgstr "Note sul materiale di stampa SLA" -#: src/slic3r/GUI/Plater.cpp:690 +#: src/slic3r/GUI/Plater.cpp:817 msgid "SLA print settings" msgstr "Impostazioni di stampa SLA" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:997 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:996 msgid "SLA Support Points" msgstr "Punti di Supporto SLA" -#: src/slic3r/GUI/GLCanvas3D.cpp:722 +#: 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/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/ConfigWizard.cpp:1530 +msgid "SLA Technology Printers" +msgstr "Stampanti con tecnologia SLA" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Slab" msgstr "Lastra" -#: src/libslic3r/PrintConfig.cpp:1268 +#: src/libslic3r/PrintConfig.cpp:1333 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:89 +#: src/libslic3r/PrintConfig.cpp:105 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:82 +#: 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/slic3r/GUI/ConfigSnapshotDialog.cpp:45 -msgid "slic3r version" -msgstr "versione di slic3r" - -#: src/libslic3r/PrintConfig.cpp:1234 +#: src/libslic3r/PrintConfig.cpp:1299 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:2970 +#: src/libslic3r/PrintConfig.cpp:3359 msgid "Slice" msgstr "Processa" -#: src/slic3r/GUI/MainFrame.cpp:383 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Slice a file into a G-code" msgstr "Processa un file in G-code" -#: src/slic3r/GUI/MainFrame.cpp:389 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Slice a file into a G-code, save as" msgstr "Processa un file in G-code, salva come" -#: src/libslic3r/PrintConfig.cpp:71 +#: src/libslic3r/PrintConfig.cpp:87 msgid "Slice gap closing radius" msgstr "Gap closing radius per slicing" -#: src/slic3r/GUI/Plater.cpp:734 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3618 +#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3121 +#: src/slic3r/GUI/Plater.cpp:5110 msgid "Slice now" msgstr "Processa ora" -#: src/libslic3r/PrintConfig.cpp:2944 +#: src/libslic3r/PrintConfig.cpp:3333 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:2965 +#: src/libslic3r/PrintConfig.cpp:3354 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:2971 +#: src/libslic3r/PrintConfig.cpp:3360 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:193 +#: src/slic3r/GUI/Plater.cpp:216 msgid "Sliced Info" msgstr "Informazioni processo" -#: src/slic3r/GUI/MainFrame.cpp:704 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3615 src/slic3r/GUI/Tab.cpp:1159 -#: src/slic3r/GUI/Tab.cpp:3436 +#: 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 msgid "Slicing" msgstr "Slicing" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:91 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184 msgid "Slicing complete" msgstr "Slicing completato" -#: src/libslic3r/SLAPrint.cpp:1459 +#: src/libslic3r/SLAPrint.cpp:760 msgid "Slicing done" msgstr "Slicing completato" -#: src/slic3r/GUI/MainFrame.cpp:729 +#: src/slic3r/GUI/MainFrame.cpp:874 msgid "Slicing Done!" msgstr "Slicing Completato!" -#: src/libslic3r/SLAPrint.cpp:759 +#: src/libslic3r/SLAPrintSteps.cpp:245 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/SLAPrint.cpp:55 +#: src/libslic3r/SLAPrintSteps.cpp:45 msgid "Slicing model" msgstr "Slice modello" -#: src/libslic3r/SLAPrint.cpp:59 +#: src/libslic3r/SLAPrintSteps.cpp:49 msgid "Slicing supports" msgstr "Supporti di Slicing" -#: src/libslic3r/PrintConfig.cpp:2249 +#: src/libslic3r/PrintConfig.cpp:2414 msgid "Slow" msgstr "Lento" -#: src/libslic3r/PrintConfig.cpp:1635 +#: src/libslic3r/PrintConfig.cpp:1705 msgid "Slow down if layer print time is below" msgstr "Rallenta se il tempo di stampa del layer è inferiore" -#: src/libslic3r/PrintConfig.cpp:2250 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "Slow tilt" msgstr "Inclinazione lenta" -#: src/libslic3r/PrintConfig.cpp:1646 +#: src/libslic3r/PrintConfig.cpp:1715 msgid "Small perimeters" msgstr "Perimetri piccoli" -#: src/slic3r/GUI/GUI_App.cpp:697 +#: src/slic3r/GUI/GLCanvas3D.cpp:288 +msgid "Smooth" +msgstr "Leviga" + +#: src/slic3r/GUI/GLCanvas3D.cpp:258 +msgid "Smoothing" +msgstr "Levigatura" + +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Snapshot name" msgstr "Nome istantanea" -#: src/slic3r/GUI/MainFrame.cpp:549 +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Software &Releases" msgstr "Ve&rsioni Software" -#: src/slic3r/GUI/PresetHints.cpp:181 +#: src/slic3r/GUI/PresetHints.cpp:184 msgid "solid infill" msgstr "riempimento solido" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/PrintConfig.cpp:1687 -#: src/libslic3r/PrintConfig.cpp:1697 src/libslic3r/GCode/PreviewData.cpp:167 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767 msgid "Solid infill" msgstr "Riempimento solido" -#: src/libslic3r/PrintConfig.cpp:1675 +#: src/libslic3r/PrintConfig.cpp:1744 msgid "Solid infill every" msgstr "Riempimento solido ogni" -#: src/libslic3r/PrintConfig.cpp:1667 +#: src/libslic3r/PrintConfig.cpp:1736 msgid "Solid infill extruder" msgstr "Estrusore riempimento solido" -#: src/libslic3r/PrintConfig.cpp:1658 +#: src/libslic3r/PrintConfig.cpp:1727 msgid "Solid infill threshold area" msgstr "Area soglia riempimento solido" -#: src/slic3r/GUI/Tab.cpp:1014 src/libslic3r/PrintConfig.cpp:1710 +#: src/slic3r/GUI/Tab.cpp:1065 src/libslic3r/PrintConfig.cpp:1780 msgid "Solid layers" msgstr "Layer solidi" -#: src/libslic3r/PrintConfig.cpp:711 +#: src/libslic3r/PrintConfig.cpp:754 msgid "Soluble material" msgstr "Materiale solubile" -#: src/libslic3r/PrintConfig.cpp:712 +#: src/libslic3r/PrintConfig.cpp:755 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:914 +#: src/libslic3r/PrintConfig.cpp:937 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:721 -msgid "Some objects are not visible when editing supports" -msgstr "Alcuni oggetti non sono visibili nel modificare i supporti" +#: src/slic3r/GUI/GLCanvas3D.cpp:688 +msgid "Some objects are not visible" +msgstr "Alcuni oggetti non sono visibili" -#: src/libslic3r/Print.cpp:1162 +#: src/libslic3r/Print.cpp:1226 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:1177 +#: src/libslic3r/Print.cpp:1228 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:2548 +#: src/libslic3r/PrintConfig.cpp:2824 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:2086 +#: src/libslic3r/PrintConfig.cpp:2187 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:1897 +#: src/libslic3r/PrintConfig.cpp:1984 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:1931 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "Spacing between support material lines." msgstr "Spaziatura tra le linee del materiale di supporto." -#: src/slic3r/GUI/GUI_ObjectList.cpp:71 src/slic3r/GUI/GUI_ObjectList.cpp:512 -#: src/slic3r/GUI/GUI_Preview.cpp:215 src/slic3r/GUI/Tab.cpp:1084 -#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:426 -#: src/libslic3r/PrintConfig.cpp:871 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1361 src/libslic3r/PrintConfig.cpp:1598 -#: src/libslic3r/PrintConfig.cpp:1647 src/libslic3r/PrintConfig.cpp:1698 -#: src/libslic3r/PrintConfig.cpp:2029 +#: 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 msgid "Speed" msgstr "Velocità" -#: src/libslic3r/PrintConfig.cpp:1600 +#: 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:400 +#: src/libslic3r/GCode/PreviewData.cpp:351 msgid "Speed (mm/s)" msgstr "Velocità (mm/s)" -#: src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:920 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:1097 +#: src/slic3r/GUI/Tab.cpp:1158 msgid "Speed for non-print moves" msgstr "Velocità per i movimenti non di stampa" -#: src/libslic3r/PrintConfig.cpp:1362 +#: src/libslic3r/PrintConfig.cpp:1432 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:1085 +#: src/slic3r/GUI/Tab.cpp:1146 msgid "Speed for print moves" msgstr "Velocità per i movimenti di stampa" -#: src/libslic3r/PrintConfig.cpp:200 +#: src/libslic3r/PrintConfig.cpp:236 msgid "Speed for printing bridges." msgstr "Velocità di stampa Bridge." -#: src/libslic3r/PrintConfig.cpp:1699 +#: src/libslic3r/PrintConfig.cpp:1769 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:1906 +#: src/libslic3r/PrintConfig.cpp:1993 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:1940 +#: src/libslic3r/PrintConfig.cpp:2027 msgid "Speed for printing support material." msgstr "Velocità per la stampa del materiale di supporto." -#: src/libslic3r/PrintConfig.cpp:1000 +#: src/libslic3r/PrintConfig.cpp:1049 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:2030 +#: src/libslic3r/PrintConfig.cpp:2119 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:2052 +#: src/libslic3r/PrintConfig.cpp:2153 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:627 +#: src/libslic3r/PrintConfig.cpp:659 msgid "Speed of the first cooling move" msgstr "Velocità del primo movimento di raffreddamento" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:678 msgid "Speed of the last cooling move" msgstr "Velocità dell'ultimo movimento di raffreddamento" -#: src/libslic3r/PrintConfig.cpp:585 +#: src/libslic3r/PrintConfig.cpp:616 msgid "Speed used at the very beginning of loading phase." msgstr "Velocità utilizzata all'inizio della fase di caricamento." -#: src/libslic3r/PrintConfig.cpp:577 +#: src/libslic3r/PrintConfig.cpp:608 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:593 +#: src/libslic3r/PrintConfig.cpp:624 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:602 +#: src/libslic3r/PrintConfig.cpp:633 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/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/Mouse3DController.cpp:296 +msgid "Speed:" +msgstr "Velocità:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Sphere" msgstr "Sfera" -#: src/libslic3r/PrintConfig.cpp:1717 +#: src/libslic3r/PrintConfig.cpp:1794 msgid "Spiral vase" msgstr "Vaso a spirale" -#: src/slic3r/GUI/Plater.cpp:2971 src/slic3r/GUI/Plater.cpp:2988 -#: src/slic3r/GUI/Plater.cpp:3008 src/libslic3r/PrintConfig.cpp:3082 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 +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 msgid "Split" msgstr "Dividi" -#: src/slic3r/GUI/Plater.cpp:2971 +#: src/slic3r/GUI/Plater.cpp:4019 msgid "Split the selected object" msgstr "Dividi l'oggetto selezionato" -#: src/slic3r/GUI/Plater.cpp:2966 src/slic3r/GUI/Plater.cpp:2988 +#: src/slic3r/GUI/Plater.cpp:4014 src/slic3r/GUI/Plater.cpp:4034 msgid "Split the selected object into individual objects" msgstr "Dividi l'oggetto selezionato in singoli oggetti" -#: src/slic3r/GUI/Plater.cpp:2968 src/slic3r/GUI/Plater.cpp:3008 +#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4048 msgid "Split the selected object into individual sub-parts" msgstr "Dividi l'oggetto selezionato in singole sotto parti" -#: src/slic3r/GUI/GLCanvas3D.cpp:3490 +#: src/slic3r/GUI/GLCanvas3D.cpp:4550 msgid "Split to objects" msgstr "Separa in oggetti" -#: src/slic3r/GUI/Plater.cpp:2796 +#: src/slic3r/GUI/Plater.cpp:2981 msgid "Split to Objects" msgstr "Separa in oggetti" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1110 +#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1487 msgid "Split to parts" msgstr "Dividi in parti" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1904 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2274 msgid "Split to Parts" msgstr "Dividi in parti" -#: src/libslic3r/PrintConfig.cpp:799 +#: src/slic3r/GUI/ConfigWizard.cpp:289 +msgid "Standard" +msgstr "Standard" + +#: src/libslic3r/PrintConfig.cpp:846 msgid "Stars" msgstr "Stelle" -#: src/slic3r/GUI/MainFrame.cpp:376 +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "Start a new project" msgstr "Inizia un nuovo progetto" @@ -6149,12 +7193,12 @@ msgstr "Inizia un nuovo progetto" msgid "Start at height" msgstr "Inizia all'altezza" -#: src/slic3r/GUI/Tab.cpp:1564 src/slic3r/GUI/Tab.cpp:1949 -#: src/libslic3r/PrintConfig.cpp:1736 src/libslic3r/PrintConfig.cpp:1751 +#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1976 +#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828 msgid "Start G-code" msgstr "G-code iniziale" -#: src/slic3r/GUI/MainFrame.cpp:403 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "Start new slicing process" msgstr "Avvia un nuovo processo di slicing" @@ -6162,23 +7206,23 @@ msgstr "Avvia un nuovo processo di slicing" msgid "Start printing after upload" msgstr "Avvia la stampa dopo il caricamento" -#: src/slic3r/GUI/PrintHostDialogs.cpp:150 +#: src/slic3r/GUI/PrintHostDialogs.cpp:151 msgid "Status" msgstr "Stato" -#: src/slic3r/GUI/FirmwareDialog.cpp:782 +#: src/slic3r/GUI/FirmwareDialog.cpp:820 msgid "Status:" msgstr "Stato:" -#: src/slic3r/GUI/Tab.cpp:2158 +#: src/slic3r/GUI/Tab.cpp:2209 msgid "Stealth" msgstr "Silenzioso" -#: src/slic3r/GUI/Plater.cpp:1084 +#: src/slic3r/GUI/Plater.cpp:1291 msgid "stealth mode" msgstr "modalità silenziosa" -#: src/slic3r/GUI/Plater.cpp:3545 +#: src/slic3r/GUI/Plater.cpp:4985 #, possible-c-format msgid "STL file exported to %s" msgstr "File STL esportato in %s" @@ -6187,699 +7231,806 @@ msgstr "File STL esportato in %s" msgid "Stop at height" msgstr "Ferma all'altezza" -#: src/slic3r/GUI/Tab.cpp:1716 src/slic3r/GUI/Tab.cpp:1901 +#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:1928 msgid "Success!" msgstr "Successo!" -#: src/slic3r/GUI/PresetHints.cpp:200 +#: src/slic3r/GUI/PresetHints.cpp:203 msgid "support" msgstr "supporto" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2692 msgid "Support base diameter" msgstr "Diametro della base del supporto" -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "Support base height" msgstr "Altezza della base del supporto" -#: src/libslic3r/PrintConfig.cpp:2566 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "Support base safety distance" msgstr "Distanza di sicurezza base supporto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Support Blocker" msgstr "Blocco Supporto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Support Enforcer" msgstr "Rinforzo Supporto" -#: src/slic3r/GUI/Tab.cpp:3401 +#: src/slic3r/GUI/ConfigManipulation.cpp:163 +msgid "Support Generator" +msgstr "Generatore Supporti" + +#: src/slic3r/GUI/Tab.cpp:3608 msgid "Support head" msgstr "Testa supporto" -#: src/libslic3r/PrintConfig.cpp:2369 +#: src/libslic3r/PrintConfig.cpp:2620 msgid "Support head front diameter" msgstr "Diametro anteriore della testa del supporto" -#: src/libslic3r/PrintConfig.cpp:2378 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "Support head penetration" -msgstr "Penetrazione testa del supporto" +msgstr "Inserimento testa del supporto" -#: src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2638 msgid "Support head width" msgstr "Larghezza testa del supporto" -#: src/slic3r/GUI/PresetHints.cpp:210 +#: src/slic3r/GUI/PresetHints.cpp:213 msgid "support interface" msgstr "interfaccia supporto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:70 -#: src/slic3r/GUI/GUI_ObjectList.cpp:511 src/slic3r/GUI/GUI_Preview.cpp:236 -#: src/slic3r/GUI/Tab.cpp:1059 src/slic3r/GUI/Tab.cpp:1060 -#: src/libslic3r/PrintConfig.cpp:334 src/libslic3r/PrintConfig.cpp:1432 -#: src/libslic3r/PrintConfig.cpp:1780 src/libslic3r/PrintConfig.cpp:1786 -#: src/libslic3r/PrintConfig.cpp:1794 src/libslic3r/PrintConfig.cpp:1806 -#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:1824 -#: src/libslic3r/PrintConfig.cpp:1839 src/libslic3r/PrintConfig.cpp:1860 -#: src/libslic3r/PrintConfig.cpp:1871 src/libslic3r/PrintConfig.cpp:1887 -#: src/libslic3r/PrintConfig.cpp:1896 src/libslic3r/PrintConfig.cpp:1905 -#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1930 -#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1939 -#: src/libslic3r/PrintConfig.cpp:1948 src/libslic3r/PrintConfig.cpp:1956 -#: src/libslic3r/PrintConfig.cpp:1970 src/libslic3r/GCode/PreviewData.cpp:172 +#: 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 msgid "Support material" -msgstr "Materiale supporto" +msgstr "Materiale di supporto" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/PrintConfig.cpp:1904 -#: src/libslic3r/GCode/PreviewData.cpp:173 +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/libslic3r/PrintConfig.cpp:1991 msgid "Support material interface" -msgstr "Interfaccia materiale supporto" +msgstr "Interfaccia materiale di supporto" -#: src/libslic3r/PrintConfig.cpp:1957 +#: src/libslic3r/PrintConfig.cpp:2044 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:1877 +#: src/libslic3r/PrintConfig.cpp:1964 msgid "Support material/raft interface extruder" msgstr "Estrusore materiale di supporto/intefaccia raft" -#: src/libslic3r/PrintConfig.cpp:1851 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Support material/raft/skirt extruder" msgstr "Estrusore materiale di supporto/raft/skirt" -#: src/slic3r/GUI/Plater.cpp:423 src/libslic3r/PrintConfig.cpp:1815 -#: src/libslic3r/PrintConfig.cpp:2423 +#: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "Support on build plate only" msgstr "Supporti solo dal piano di stampa" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:991 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888 msgid "Support parameter change" msgstr "Modifica parametro del Supporto" -#: src/slic3r/GUI/Tab.cpp:3406 +#: src/slic3r/GUI/Tab.cpp:3613 msgid "Support pillar" msgstr "Pilastro di supporto" -#: src/libslic3r/PrintConfig.cpp:2407 +#: src/libslic3r/PrintConfig.cpp:2658 msgid "Support pillar connection mode" msgstr "Modalità di connessione dei pilastri di supporto" -#: src/libslic3r/PrintConfig.cpp:2397 +#: src/libslic3r/PrintConfig.cpp:2648 msgid "Support pillar diameter" msgstr "Diametro pilastro di supporto" -#: src/libslic3r/PrintConfig.cpp:2499 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/libslic3r/PrintConfig.cpp:2764 msgid "Support points density" msgstr "Densità punti di supporto" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1196 msgid "Support points edit" msgstr "Edita punti di supporto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:78 src/slic3r/GUI/GUI_ObjectList.cpp:519 -#: src/slic3r/GUI/Plater.cpp:418 src/slic3r/GUI/Tab.cpp:3397 -#: src/slic3r/GUI/Tab.cpp:3398 src/libslic3r/PrintConfig.cpp:2363 -#: src/libslic3r/PrintConfig.cpp:2370 src/libslic3r/PrintConfig.cpp:2379 -#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2398 -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2431 -#: src/libslic3r/PrintConfig.cpp:2442 src/libslic3r/PrintConfig.cpp:2452 -#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2471 -#: src/libslic3r/PrintConfig.cpp:2480 src/libslic3r/PrintConfig.cpp:2490 -#: src/libslic3r/PrintConfig.cpp:2500 src/libslic3r/PrintConfig.cpp:2508 +#: 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 msgid "Supports" msgstr "Supporti" -#: src/slic3r/GUI/Plater.cpp:1018 +#: src/slic3r/GUI/Plater.cpp:1194 msgid "supports and pad" msgstr "supporti e pad" -#: src/libslic3r/PrintConfig.cpp:1043 +#: src/libslic3r/PrintConfig.cpp:1092 msgid "Supports remaining times" msgstr "Supporto Tempo residuo" -#: src/libslic3r/PrintConfig.cpp:1053 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Supports stealth mode" msgstr "Supporto modalità silenziosa" -#: src/slic3r/GUI/Preferences.cpp:76 +#: src/slic3r/GUI/ConfigManipulation.cpp:159 +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 msgid "Suppress \" - default - \" presets" msgstr "Nascondi i preset \" - default - \"" -#: src/slic3r/GUI/Preferences.cpp:78 +#: src/slic3r/GUI/Preferences.cpp:89 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:677 +#: src/slic3r/GUI/MainFrame.cpp:826 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +#: src/slic3r/GUI/DoubleSlider.cpp:1144 +msgid "Switch code to Change extruder" +msgstr "Passa il codice a Cambio estrusore" + +#: src/slic3r/GUI/DoubleSlider.cpp:1179 +msgid "Switch code to Color change (%1%) for:" +msgstr "Passa il codice a Cambio colore (%1%) per:" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Switch to 3D" msgstr "Passa a 3D" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1376 msgid "Switch to editing mode" msgstr "Passa alla modalità modifica" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Switch to Preview" msgstr "Passa ad Anteprima" -#: src/slic3r/GUI/wxExtensions.cpp:2412 +#: src/slic3r/GUI/wxExtensions.cpp:703 #, possible-c-format msgid "Switch to the %s mode" msgstr "Passa alla modalità %s" -#: src/slic3r/GUI/GUI_App.cpp:752 +#: src/slic3r/GUI/GUI_App.cpp:882 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." -#: src/slic3r/GUI/WipeTowerDialog.cpp:327 +#: src/slic3r/GUI/WipeTowerDialog.cpp:365 msgid "Switching to simple settings will discard changes done in the advanced mode!\n\nDo you want to proceed?" msgstr "Cambiare alle impostazioni semplici eliminerà tutte le modifiche fatte alle impostazioni complesse!\n\nProcedere?" -#: src/libslic3r/PrintConfig.cpp:1949 +#: src/slic3r/GUI/Tab.cpp:1014 +msgid "symbolic profile name" +msgstr "nome simbolico profilo" + +#: src/libslic3r/PrintConfig.cpp:2036 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:1947 +#: src/libslic3r/PrintConfig.cpp:2034 msgid "Synchronize with object layers" msgstr "Sincronizza con i layer dell'oggetto" -#: src/slic3r/GUI/MainFrame.cpp:557 +#: src/slic3r/GUI/MainFrame.cpp:699 msgid "System &Info" msgstr "&Info di Sistema" -#: src/slic3r/GUI/SysInfoDialog.cpp:44 +#: src/slic3r/GUI/SysInfoDialog.cpp:78 msgid "System Information" msgstr "Informazioni di sistema" -#: src/slic3r/GUI/Preset.cpp:930 src/slic3r/GUI/Preset.cpp:970 -#: src/slic3r/GUI/Preset.cpp:1035 src/slic3r/GUI/Preset.cpp:1067 -#: src/slic3r/GUI/PresetBundle.cpp:1488 src/slic3r/GUI/PresetBundle.cpp:1553 +#: 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 msgid "System presets" msgstr "Preset di sistema" -#: src/slic3r/GUI/GUI_App.cpp:662 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Take Configuration &Snapshot" msgstr "Cattura I&stantanea di Configurazione" -#: src/slic3r/GUI/GUI_App.cpp:697 +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Taking configuration snapshot" msgstr "Cattura istantanea della configurazione" -#: src/libslic3r/PrintConfig.cpp:1980 +#: src/slic3r/GUI/Tab.cpp:1433 src/libslic3r/PrintConfig.cpp:2067 msgid "Temperature" msgstr "Temperatura" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1804 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:1726 +#: src/libslic3r/PrintConfig.cpp:1803 msgid "Temperature variation" msgstr "Variazione di temperatura" -#: src/slic3r/GUI/ConfigWizard.cpp:592 +#: src/slic3r/GUI/ConfigWizard.cpp:1017 msgid "Temperatures" msgstr "Temperature" -#: src/slic3r/GUI/Tab.cpp:1700 src/slic3r/GUI/Tab.cpp:1888 +#: src/slic3r/GUI/Tab.cpp:1677 src/slic3r/GUI/Tab.cpp:1915 msgid "Test" msgstr "Test" -#: src/slic3r/GUI/BedShapeDialog.cpp:171 +#: src/slic3r/GUI/BedShapeDialog.cpp:172 msgid "Texture" msgstr "Texture" -#: src/slic3r/GUI/FirmwareDialog.cpp:530 +#: src/slic3r/GUI/ConfigManipulation.cpp:208 +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%%." + +#: src/slic3r/GUI/FirmwareDialog.cpp:548 #, possible-c-format msgid "The %s device could not have been found" msgstr "Il dispositivo %s non è stato trovato" -#: src/slic3r/GUI/FirmwareDialog.cpp:417 +#: src/slic3r/GUI/FirmwareDialog.cpp:436 #, 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 "Il dispositivo %s non è stato trovato.\nSe il dispositivo è connesso, premi il pulsante Reset vicino al connettore USB ..." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 +#: src/slic3r/GUI/Tab.cpp:976 +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 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:2462 +#: src/libslic3r/PrintConfig.cpp:2726 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:670 +#: src/libslic3r/SLAPrint.cpp:631 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:457 +#: src/libslic3r/PrintConfig.cpp:489 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:955 +#: src/libslic3r/PrintConfig.cpp:1003 msgid "The extruder to use when printing infill." msgstr "L'estrusore da utilizzare per la stampa del riempimento." -#: src/libslic3r/PrintConfig.cpp:1341 +#: src/libslic3r/PrintConfig.cpp:1410 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:1669 +#: src/libslic3r/PrintConfig.cpp:1738 msgid "The extruder to use when printing solid infill." msgstr "L'estrusore da utilizzare per la stampa del riempimento solido." -#: src/libslic3r/PrintConfig.cpp:1879 +#: src/libslic3r/PrintConfig.cpp:1966 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:1853 +#: src/libslic3r/PrintConfig.cpp:1939 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:695 +#: src/libslic3r/PrintConfig.cpp:727 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:3105 +#: src/libslic3r/PrintConfig.cpp:3494 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:1054 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "The firmware supports stealth mode" msgstr "Il firmware supporta la modalità silenziosa" -#: src/libslic3r/PrintConfig.cpp:351 +#: src/libslic3r/PrintConfig.cpp:120 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:2726 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2813 src/slic3r/GUI/Tab.cpp:3279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3820 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3457 msgid "the following characters are not allowed:" msgstr "non sono permessi i seguenti caratteri:" -#: src/slic3r/GUI/Tab.cpp:3311 +#: src/slic3r/GUI/ConfigWizard.cpp:1830 +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 +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 msgid "the following suffix is not allowed:" msgstr "il seguente suffisso non è permesso:" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2871 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:2453 +#: src/libslic3r/PrintConfig.cpp:2704 msgid "The height of the pillar base cone" msgstr "Altezza del cono alla base del pilastro" -#: src/libslic3r/PrintConfig.cpp:2481 +#: src/slic3r/GUI/DoubleSlider.cpp:1922 +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 +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 +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 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:2472 +#: src/libslic3r/PrintConfig.cpp:2736 msgid "The max length of a bridge" msgstr "La lunghezza massima di un bridge" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2714 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:2176 +#: src/libslic3r/PrintConfig.cpp:185 +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 +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 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:1433 +#: src/libslic3r/PrintConfig.cpp:1503 msgid "The object will be raised by this number of layers, and support material will be generated under it." -msgstr "L'oggetto verrà sollevato da questo numero di layer, e verrà generato il materiale di supporto al di sotto di questo." +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:2259 +#: src/libslic3r/PrintConfig.cpp:2424 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:831 +#: 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/libslic3r/PrintConfig.cpp:1768 +#: src/libslic3r/PrintConfig.cpp:1846 msgid "The printer multiplexes filaments into a single hot end." msgstr "La stampante processa diversi filamenti in un singolo hotend." -#: src/slic3r/GUI/BedShapeDialog.cpp:342 +#: 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 "Il file 3mf selezionato è stato salvato con una versione più recente di %1% e non è compatibile." + +#: 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 "Il file amf selezionato è stato salvato con una versione più recente di %1% e non è compatibile." + +#: src/slic3r/GUI/BedShapeDialog.cpp:513 msgid "The selected file contains no geometry." msgstr "Il file selezionato non contiene geometrie." -#: src/slic3r/GUI/BedShapeDialog.cpp:346 +#: src/slic3r/GUI/BedShapeDialog.cpp:517 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:2271 +#: src/slic3r/GUI/Plater.cpp:2970 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:1737 src/slic3r/GUI/Plater.cpp:2279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2270 src/slic3r/GUI/Plater.cpp:2978 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:410 -msgid "The selected project is no more available" -msgstr "Il progetto selezionato non è più disponibile" +#: src/slic3r/GUI/MainFrame.cpp:461 +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/libslic3r/PrintConfig.cpp:2570 +#: src/slic3r/GUI/DoubleSlider.cpp:998 +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 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:1544 +#: src/libslic3r/PrintConfig.cpp:1614 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:1536 +#: src/libslic3r/PrintConfig.cpp:1606 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "Velocità delle retrazioni (si applica solamente al motore dell'estrusore)." -#: src/libslic3r/Print.cpp:1187 +#: 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 "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:1189 +#: src/libslic3r/Print.cpp:1244 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:2900 +#: src/slic3r/GUI/Tab.cpp:3068 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:3287 +#: src/slic3r/GUI/Tab.cpp:3465 msgid "The supplied name is not available." msgstr "Il nome fornito non è disponibile." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2725 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2812 src/slic3r/GUI/Tab.cpp:3278 -#: src/slic3r/GUI/Tab.cpp:3282 +#: 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 msgid "The supplied name is not valid;" msgstr "Il nome fornito non è valido;" -#: src/libslic3r/Print.cpp:1268 +#: src/libslic3r/Print.cpp:1222 msgid "The supplied settings will cause an empty print." msgstr "Le configurazioni fornite causeranno una stampa vuota." -#: src/libslic3r/PrintConfig.cpp:2524 +#: src/libslic3r/PrintConfig.cpp:2789 msgid "The thickness of the pad and its optional cavity walls." msgstr "Lo spessore del pad e delle intercapedini opzionali." -#: src/libslic3r/PrintConfig.cpp:1825 +#: src/libslic3r/PrintConfig.cpp:1911 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:2429 +#: src/slic3r/GUI/Tab.cpp:2575 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:1306 +#: src/libslic3r/Print.cpp:1268 +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 +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 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:1200 +#: src/libslic3r/Print.cpp:1270 +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:1202 +#: src/libslic3r/Print.cpp:1264 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:1225 +#: src/libslic3r/Print.cpp:1293 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:1227 +#: src/libslic3r/Print.cpp:1295 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:1229 +#: src/libslic3r/Print.cpp:1297 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:1223 +#: src/libslic3r/Print.cpp:1291 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:1155 +#: src/libslic3r/Print.cpp:1257 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:1258 -msgid "The Wipe tower is only supported if all objects have the same layer height profile" -msgstr "La Torre di spurgo è supportata solo con oggetti multipli che hanno lo stesso profilo di altezza layer" +#: src/libslic3r/Print.cpp:1339 +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/slic3r/GUI/UpdateDialogs.cpp:127 +#: src/libslic3r/SLAPrintSteps.cpp:621 +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 +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 +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 +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/slic3r/GUI/UpdateDialogs.cpp:225 #, possible-c-format msgid "This %s version: %s" msgstr "%s versione: %s" -#: src/libslic3r/PrintConfig.cpp:140 +#: src/slic3r/GUI/Tab.cpp:982 +msgid "This action is not revertable.\nDo you want to proceed?" +msgstr "Questa azione non è reversibile.\nVuoi continuare?" + +#: src/libslic3r/PrintConfig.cpp:165 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:2057 -msgid "This custom code is inserted at every extruder change. If you don't leave this empty, you are expected to take care of the toolchange yourself - PrusaSlicer will not output any other G-code to change the filament. You can use placeholder variables for all Slic3r settings as well as [previous_extruder] and [next_extruder], so e.g. the standard toolchange command can be scripted as T[next_extruder]." -msgstr "Questo codice personalizzato è inserito ad ogni cambio estrusore. Se non lo lasci vuoto, dovrai provvedere al cambio di attrezzo da solo - PrusaSlicer non emetterà altri G-code per cambiare il filamento. È possibile usare delle variabili segnaposto per tutte le impostazioni di Slic3r così come [previous_extruder] e [next_extruder], così ad es. il comando per il cambio attrezzo standard può essere scriptato come T[next_extruder]." - -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1081 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:129 +#: src/libslic3r/PrintConfig.cpp:154 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:2057 +#: src/libslic3r/PrintConfig.cpp:2094 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:380 +#: src/libslic3r/PrintConfig.cpp:396 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:370 +#: src/libslic3r/PrintConfig.cpp:386 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:1193 src/libslic3r/PrintConfig.cpp:1204 +#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269 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:1183 +#: src/libslic3r/PrintConfig.cpp:1248 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:2061 +#: src/libslic3r/PrintConfig.cpp:2162 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:2075 +#: src/libslic3r/PrintConfig.cpp:2176 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:2848 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3972 msgid "This extruder will be set for selected items" msgstr "L'estrusore sarà impostato per gli elementi selezionati" -#: src/libslic3r/PrintConfig.cpp:188 +#: src/libslic3r/PrintConfig.cpp:224 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:514 +#: src/libslic3r/PrintConfig.cpp:546 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:178 +#: src/libslic3r/PrintConfig.cpp:214 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:944 +#: src/libslic3r/PrintConfig.cpp:992 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:1677 +#: src/libslic3r/PrintConfig.cpp:1746 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:1718 +#: 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/slic3r/GUI/Plater.cpp:1712 -msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?\n" -msgstr "Non è possibile caricare questo file in modalità semplice. Si desidera passare alla modalità avanzata?\n\n" +#: src/slic3r/GUI/Plater.cpp:2367 +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:1658 -msgid "This file contains several objects positioned at multiple heights. Instead of considering them as multiple objects, should I consider\nthis file as a single object having multiple parts?\n" -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?\n" +#: src/slic3r/GUI/Plater.cpp:2357 +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?" -#: src/slic3r/GUI/FirmwareDialog.cpp:313 +#: src/slic3r/GUI/FirmwareDialog.cpp:332 #, 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 "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:278 +#: src/libslic3r/PrintConfig.cpp:314 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:448 +#: src/slic3r/GUI/Plater.cpp:536 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:1468 +#: src/libslic3r/PrintConfig.cpp:1538 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:2093 +#: src/libslic3r/PrintConfig.cpp:2194 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:921 +#: src/slic3r/GUI/Tab.cpp:953 msgid "This is a default preset." msgstr "Questo è un preset predefinito." -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2766 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:2528 +#: src/slic3r/GUI/Tab.cpp:2338 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:923 +#: src/slic3r/GUI/Tab.cpp:955 msgid "This is a system preset." msgstr "Questo è un preset di sistema." -#: src/libslic3r/PrintConfig.cpp:491 src/libslic3r/PrintConfig.cpp:551 +#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583 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:300 +#: src/libslic3r/PrintConfig.cpp:336 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:158 +#: src/libslic3r/PrintConfig.cpp:194 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:813 +#: src/libslic3r/PrintConfig.cpp:860 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:934 +#: src/libslic3r/PrintConfig.cpp:982 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:1331 +#: 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:1262 +#: src/libslic3r/PrintConfig.cpp:1327 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:1162 +#: src/libslic3r/PrintConfig.cpp:1227 #, no-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:1225 +#: src/libslic3r/PrintConfig.cpp:1290 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/PrintConfig.cpp:2139 +#: 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 "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 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:643 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878 msgid "This operation is irreversible.\nDo you want to proceed?" msgstr "Questa operazione è irreversibile.\nVuoi continuare?" -#: src/libslic3r/PrintConfig.cpp:1372 +#: src/libslic3r/PrintConfig.cpp:1442 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:1287 +#: src/libslic3r/PrintConfig.cpp:1356 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:980 +#: src/libslic3r/PrintConfig.cpp:1029 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:973 +#: src/libslic3r/PrintConfig.cpp:1022 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:427 +#: src/libslic3r/PrintConfig.cpp:459 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:1648 +#: src/libslic3r/PrintConfig.cpp:1717 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:989 +#: src/libslic3r/PrintConfig.cpp:1038 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." -#: src/libslic3r/PrintConfig.cpp:57 +#: 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 "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:1153 +#: src/libslic3r/PrintConfig.cpp:1218 msgid "This setting represents the maximum speed of your fan." msgstr "Questa impostazione rappresenta la velocità massima della ventola." -#: src/libslic3r/PrintConfig.cpp:1216 +#: src/libslic3r/PrintConfig.cpp:1281 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:1801 +#: src/libslic3r/PrintConfig.cpp:1829 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:1786 +#: src/libslic3r/PrintConfig.cpp:1814 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:664 +#: src/libslic3r/PrintConfig.cpp:695 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:2185 +#: src/libslic3r/PrintConfig.cpp:2286 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:2132 +#: src/libslic3r/PrintConfig.cpp:2208 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." -#: src/slic3r/GUI/UpdateDialogs.cpp:118 +#: src/slic3r/GUI/UpdateDialogs.cpp:216 #, 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.\n" -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.\n" +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:2284 +#: src/libslic3r/PrintConfig.cpp:2458 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:1994 +#: src/libslic3r/PrintConfig.cpp:2081 msgid "Threads" msgstr "Thread" -#: src/libslic3r/PrintConfig.cpp:1995 +#: src/libslic3r/PrintConfig.cpp:2082 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:2052 +#: src/slic3r/GUI/Tab.cpp:2093 msgid "Tilt" msgstr "Inclina" -#: src/slic3r/GUI/Tab.cpp:2053 +#: src/slic3r/GUI/Tab.cpp:2094 msgid "Tilt time" msgstr "Tempo di tilt" @@ -6887,148 +8038,179 @@ msgstr "Tempo di tilt" msgid "Time" msgstr "Tempo" -#: src/libslic3r/PrintConfig.cpp:655 +#: src/libslic3r/PrintConfig.cpp:687 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:670 +#: src/libslic3r/PrintConfig.cpp:702 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:2242 +#: src/libslic3r/PrintConfig.cpp:2407 msgid "Time of the fast tilt" msgstr "Tempo di inclinazione veloce" -#: src/libslic3r/PrintConfig.cpp:2251 +#: src/libslic3r/PrintConfig.cpp:2416 msgid "Time of the slow tilt" msgstr "Tempo di inclinazione lenta" -#: src/libslic3r/PrintConfig.cpp:610 +#: src/libslic3r/PrintConfig.cpp:641 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:916 +#: src/slic3r/GUI/Tab.cpp:966 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:2966 +#: src/slic3r/GUI/Plater.cpp:4014 msgid "To objects" msgstr "In oggetti" -#: src/slic3r/GUI/Plater.cpp:2968 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "To parts" msgstr "In parti" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:212 +#: src/slic3r/GUI/Tab.cpp:1756 +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 #, possible-c-format msgid "Toggle %c axis mirroring" msgstr "Attiva / disattiva il mirroring dell'asse %c" -#: src/libslic3r/Zipper.cpp:37 +#: src/libslic3r/Zipper.cpp:34 msgid "too many files" msgstr "troppi file" -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:315 -#: src/slic3r/GUI/GUI_Preview.cpp:481 src/slic3r/GUI/GUI_Preview.cpp:537 -#: src/slic3r/GUI/GUI_Preview.cpp:713 src/libslic3r/GCode/PreviewData.cpp:404 +#: src/libslic3r/SLAPrintSteps.cpp:190 +msgid "Too much 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 msgid "Tool" msgstr "Attrezzo" -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" msgstr "Utensile #" -#: src/slic3r/GUI/Tab.cpp:1973 src/libslic3r/PrintConfig.cpp:2006 +#: src/slic3r/GUI/Tab.cpp:2000 src/libslic3r/PrintConfig.cpp:2093 msgid "Tool change G-code" msgstr "G-code cambio attrezzo" -#: src/slic3r/GUI/Tab.cpp:1530 +#: src/slic3r/GUI/Tab.cpp:1491 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 -#: src/slic3r/GUI/MainFrame.cpp:522 +#. 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 msgid "Top" msgstr "Superiore" -#: src/libslic3r/PrintConfig.cpp:388 +#: src/slic3r/GUI/PresetHints.cpp:304 +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 msgid "Top fill pattern" msgstr "Trama riempimento superiore" -#: src/slic3r/GUI/PresetHints.cpp:189 +#: src/slic3r/GUI/PresetHints.cpp:323 +msgid "Top is open." +msgstr "La parte superiore è aperta." + +#: src/slic3r/GUI/PresetHints.cpp:317 +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 msgid "top solid infill" msgstr "riempimento solido superiore" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/PrintConfig.cpp:2017 -#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/GCode/PreviewData.cpp:168 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117 msgid "Top solid infill" msgstr "Riempimento solido superiore" -#: src/libslic3r/PrintConfig.cpp:2046 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Top solid layers" msgstr "Layer solidi superiori" -#: src/slic3r/GUI/MainFrame.cpp:522 +#: src/slic3r/GUI/MainFrame.cpp:662 msgid "Top View" msgstr "Vista superiore" -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +#: src/slic3r/GUI/WipeTowerDialog.cpp:285 msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded." msgstr "Il volume totale di spurgo viene calcolato sommando i due valori sotto, a seconda di quali attrezzi vengono scaricati/caricati." -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 msgid "Total rammed volume" msgstr "Volume totale di ramming" -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" msgstr "Durata totale di ramming" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:252 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 msgid "Translate" msgstr "Traduci" -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/PrintConfig.cpp:2051 +#: src/slic3r/GUI/Mouse3DController.cpp:300 +#: src/slic3r/GUI/Mouse3DController.cpp:317 +msgid "Translation" +msgstr "Traduzione" + +#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152 msgid "Travel" msgstr "Spostamento" -#: src/libslic3r/PrintConfig.cpp:798 +#: src/libslic3r/PrintConfig.cpp:845 msgid "Triangles" -msgstr "Tiangoli" +msgstr "Triangoli" -#: src/libslic3r/PrintConfig.cpp:3059 +#: src/libslic3r/PrintConfig.cpp:3448 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:1397 +#: src/libslic3r/PrintConfig.cpp:1467 msgid "Type of the printer." msgstr "Tipologia stampante." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2549 +#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3553 msgid "Type:" msgstr "Tipo:" -#: src/libslic3r/Zipper.cpp:35 +#: src/slic3r/GUI/Plater.cpp:3428 +msgid "Unable to reload:" +msgstr "Impossibile ricaricare:" + +#: src/libslic3r/Zipper.cpp:32 msgid "undefined error" msgstr "errore non definito" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3609 -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/MainFrame.cpp:581 msgid "Undo" msgstr "Annulla" -#: src/slic3r/GUI/GLCanvas3D.cpp:3497 +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 #, 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:3479 +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 msgid "Undo History" msgstr "Storia Annulla" -#: src/libslic3r/Zipper.cpp:59 +#: src/libslic3r/Zipper.cpp:56 msgid "unexpected decompressed size" msgstr "dimensione decompressa imprevista" @@ -7036,96 +8218,103 @@ msgstr "dimensione decompressa imprevista" msgid "Unknown" msgstr "Sconosciuto" -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 +#: 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 msgid "Unknown error occured" msgstr "Si è verificato un errore sconosciuto" -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 msgid "unloaded" msgstr "scaricato" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:623 msgid "Unloading speed" msgstr "Velocità di scaricamento" -#: src/libslic3r/PrintConfig.cpp:600 +#: src/libslic3r/PrintConfig.cpp:632 msgid "Unloading speed at the start" msgstr "Velocità iniziale di scaricamento" -#: src/slic3r/GUI/Tab.cpp:3069 +#: src/slic3r/GUI/Tab.cpp:3256 msgid "UNLOCKED LOCK" msgstr "LUCCHETTO APERTO" -#: src/slic3r/GUI/Tab.cpp:3362 +#: 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.\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:3377 +#: 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.\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/GUI_Preview.cpp:245 +#: 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:2785 +#: src/slic3r/GUI/Tab.cpp:2947 msgid "Unsaved Changes" msgstr "Modifiche non salvate" -#: src/slic3r/GUI/GUI_App.cpp:790 +#: src/slic3r/GUI/GUI_App.cpp:935 msgid "Unsaved Presets" msgstr "Preset non salvati" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -msgid "Unselect gizmo / Clear selection" -msgstr "Deseleziona gizmo / Ripulisci la selezione" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Unselect gizmo or clear selection" +msgstr "Deseleziona gizmo o pulisci selezione" -#: src/libslic3r/Zipper.cpp:63 +#: src/libslic3r/Zipper.cpp:60 msgid "unsupported central directory size" msgstr "dimensione della directory centrale non supportata" -#: src/libslic3r/Zipper.cpp:43 +#: src/libslic3r/Zipper.cpp:40 msgid "unsupported encryption" msgstr "criptaggio non supportato" -#: src/libslic3r/Zipper.cpp:45 +#: src/libslic3r/Zipper.cpp:42 msgid "unsupported feature" msgstr "caratteristica non supportata" -#: src/libslic3r/Zipper.cpp:41 +#: src/libslic3r/Zipper.cpp:38 msgid "unsupported method" msgstr "metodo non supportato" -#: src/libslic3r/Zipper.cpp:53 +#: src/libslic3r/Zipper.cpp:50 msgid "unsupported multidisk archive" msgstr "archivio multidisk non supportato" -#: src/slic3r/GUI/GUI_App.cpp:305 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:292 msgid "Unsupported OpenGL version" msgstr "Versione OpenGL non supportata" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2414 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3420 msgid "Unsupported selection" msgstr "Selezione non supportata" -#: src/libslic3r/GCode/PreviewData.cpp:495 +#: src/slic3r/GUI/GLCanvas3D.cpp:955 #, possible-c-format msgid "up to %.2f mm" msgstr "fino a %.2f mm" -#: src/slic3r/GUI/UpdateDialogs.cpp:30 +#: src/slic3r/GUI/UpdateDialogs.cpp:38 msgid "Update available" msgstr "Aggiornamento disponibile" -#: src/slic3r/GUI/ConfigWizard.cpp:419 src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:779 src/slic3r/GUI/Preferences.cpp:80 msgid "Update built-in Presets automatically" msgstr "Aggiorna automaticamente i Preset integrati" -#: src/slic3r/GUI/ConfigWizard.cpp:401 +#: src/slic3r/GUI/ConfigWizard.cpp:761 msgid "Updates" msgstr "Aggiornamenti" -#: src/slic3r/GUI/ConfigWizard.cpp:426 +#: src/slic3r/GUI/ConfigWizard.cpp:786 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." @@ -7133,36 +8322,44 @@ msgstr "Gli aggiornamenti non vengono mai applicati senza il consenso dell'utent msgid "Upgrade" msgstr "Aggiorna" -#: src/slic3r/GUI/GUI_App.cpp:685 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Upload a firmware image into an Arduino based printer" msgstr "Carica un'immagine del firmware su una stampante basata su Arduino" +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "Caricamento non attivato sulla scheda FlashAir." + #: src/slic3r/GUI/PrintHostDialogs.cpp:33 msgid "Upload to Printer Host with the following filename:" msgstr "Carica all'Host di stampa con il seguente nome file:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:229 +#: src/slic3r/GUI/PrintHostDialogs.cpp:230 msgid "Uploading" msgstr "Caricamento" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 msgid "Upper Layer" msgstr "Layer superiore" -#: src/slic3r/GUI/Tab.cpp:1873 +#: src/slic3r/GUI/Tab.cpp:1900 msgid "USB/Serial connection" msgstr "Connessione USB/Seriale" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1662 msgid "USB/serial port for printer connection." msgstr "Porta USB/Seriale per connessione stampante." -#: src/slic3r/GUI/Preferences.cpp:117 +#: src/slic3r/GUI/DoubleSlider.cpp:1147 +msgid "Use another extruder" +msgstr "Usa un altro estrusore" + +#: src/slic3r/GUI/Preferences.cpp:143 msgid "Use custom size for toolbar icons" msgstr "Utilizza dimensione personalizzata per le icone degli strumenti" -#: src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Use firmware retraction" msgstr "Usa retrazione firmware" @@ -7170,51 +8367,59 @@ msgstr "Usa retrazione firmware" msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "Usa la barra ( / ) come separatore di cartella se necessario." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/slic3r/GUI/Preferences.cpp:126 +msgid "Use free camera" +msgstr "Usa l'inquadratura libera" + +#: src/libslic3r/PrintConfig.cpp:2780 msgid "Use pad" msgstr "Utilizza pad" -#: src/slic3r/GUI/Preferences.cpp:110 +#: src/slic3r/GUI/Preferences.cpp:119 msgid "Use perspective camera" -msgstr "Usa la camera in prospettiva" +msgstr "Usa la visuale prospettica" -#: src/libslic3r/PrintConfig.cpp:2067 +#: src/libslic3r/PrintConfig.cpp:2168 msgid "Use relative E distances" msgstr "Usa distanze E relative" -#: src/slic3r/GUI/Preferences.cpp:103 +#: src/slic3r/GUI/Preferences.cpp:104 msgid "Use Retina resolution for the 3D scene" msgstr "Usa risoluzione Retina per la scena 3D" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:540 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:1807 +#: src/libslic3r/PrintConfig.cpp:1893 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:2074 +#: src/libslic3r/PrintConfig.cpp:2175 msgid "Use volumetric E" msgstr "Utilizza E volumetrico" -#: src/slic3r/GUI/Plater.cpp:214 +#: src/slic3r/GUI/DoubleSlider.cpp:1171 +msgid "used" +msgstr "usato" + +#: src/slic3r/GUI/Plater.cpp:237 msgid "Used Filament (g)" msgstr "Filamento usato (g)" -#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:1041 +#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1229 msgid "Used Filament (m)" msgstr "Filamento usato (m)" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:236 msgid "Used Filament (mm³)" msgstr "Filamento usato (mm³)" -#: src/slic3r/GUI/Plater.cpp:1015 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "Used Material (ml)" msgstr "Materiale Usato (ml)" -#: src/slic3r/GUI/Plater.cpp:215 +#: src/slic3r/GUI/Plater.cpp:238 msgid "Used Material (unit)" msgstr "Materiale usato (unità)" @@ -7222,409 +8427,469 @@ msgstr "Materiale usato (unità)" msgid "User" msgstr "Utente" -#: src/slic3r/GUI/Preset.cpp:974 src/slic3r/GUI/Preset.cpp:1071 -#: src/slic3r/GUI/PresetBundle.cpp:1558 +#: src/slic3r/GUI/Preset.cpp:1168 src/slic3r/GUI/Preset.cpp:1288 +#: src/slic3r/GUI/PresetBundle.cpp:1677 msgid "User presets" msgstr "Preset utente" -#: src/libslic3r/Zipper.cpp:93 +#: src/libslic3r/Zipper.cpp:90 msgid "validation failed" msgstr "convalida non riuscita" -#: src/slic3r/GUI/ButtonsDescription.cpp:41 +#: src/slic3r/GUI/ButtonsDescription.cpp:36 msgid "Value is the same as the system value" msgstr "Valore uguale a quello di sistema" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:53 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:2151 +#: src/slic3r/GUI/Tab.cpp:2202 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:2157 +#: src/slic3r/GUI/Tab.cpp:2208 msgid "Values in this column are for Stealth mode" msgstr "I valori in questa colonna sono per la modalità Silenziosa" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4573 +msgid "Variable layer height" +msgstr "Altezza layer variabile" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1709 +msgid "Variable layer height - Adaptive" +msgstr "Altezza layer variabile - Adattivo" + +#: src/slic3r/GUI/GLCanvas3D.cpp:599 +msgid "Variable layer height - Manual edit" +msgstr "Altezza layer variabile - Modifica manuale" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1701 +msgid "Variable layer height - Reset" +msgstr "Altezza layer variabile - Ripristina" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1717 +msgid "Variable layer height - Smooth all" +msgstr "Altezza layer variabile - Leviga tutto" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "variants" msgstr "varianti" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 src/slic3r/GUI/Tab.cpp:921 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:971 msgid "vendor" msgstr "produttore" -#: src/libslic3r/PrintConfig.cpp:880 +#: src/slic3r/GUI/ConfigWizard.cpp:565 +msgid "Vendor:" +msgstr "Fornitore:" + +#: src/libslic3r/PrintConfig.cpp:928 msgid "Verbose G-code" msgstr "G-code verboso" -#: src/slic3r/GUI/AboutDialog.cpp:67 src/slic3r/GUI/MainFrame.cpp:53 +#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64 msgid "Version" msgstr "Versione" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 msgid "version" msgstr "versione" -#: src/slic3r/GUI/Tab.cpp:1002 +#: src/slic3r/GUI/Tab.cpp:1053 msgid "Vertical shells" msgstr "Gusci verticali" -#: src/slic3r/GUI/GUI_Preview.cpp:209 +#: src/slic3r/GUI/GUI_Preview.cpp:218 msgid "View" msgstr "Vista" -#: src/libslic3r/SLAPrint.cpp:857 src/libslic3r/SLAPrint.cpp:867 -#: src/libslic3r/SLAPrint.cpp:915 +#: src/slic3r/GUI/ConfigWizard.cpp:813 +msgid "View mode" +msgstr "Modalità Visualizzazione" + +#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422 +#: src/libslic3r/SLAPrintSteps.cpp:461 msgid "Visualizing supports" msgstr "Visualizzazione supporti" -#: src/slic3r/GUI/Plater.cpp:138 +#: src/slic3r/GUI/Plater.cpp:161 msgid "Volume" msgstr "Volume" -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 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:1010 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 msgid "Volumes in Object reordered" msgstr "Volumi in Oggetto riordinati" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Volumetric" msgstr "Volumetrico" -#: src/slic3r/GUI/Tab.cpp:1800 +#: src/slic3r/GUI/Tab.cpp:1591 msgid "Volumetric flow hints not available" msgstr "Suggerimenti sul flusso volumetrico non disponibili" -#: src/slic3r/GUI/GUI_Preview.cpp:216 +#: src/slic3r/GUI/GUI_Preview.cpp:226 msgid "Volumetric flow rate" msgstr "Flusso volumetrico" -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "Flusso volumetrico (mm3/s)" +#: src/libslic3r/GCode/PreviewData.cpp:355 +msgid "Volumetric flow rate (mm³/s)" +msgstr "Flusso volumetrico (mm³/s)" #: src/slic3r/GUI/RammingChart.cpp:81 msgid "Volumetric speed" msgstr "Velocità volumetrica" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1168 src/slic3r/GUI/GUI.cpp:283 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 +#: src/libslic3r/PrintConfig.cpp:2915 +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 msgid "Warning" msgstr "Attenzione" -#: src/slic3r/GUI/ConfigWizard.cpp:294 +#: src/slic3r/GUI/ConfigWizard.cpp:431 msgid "Welcome" msgstr "Benvenuto" -#: src/slic3r/GUI/ConfigWizard.cpp:296 +#: src/slic3r/GUI/ConfigWizard.cpp:427 #, possible-c-format msgid "Welcome to the %s Configuration Assistant" msgstr "Benvenuto nell'Assistente di Configurazione di %s" -#: src/slic3r/GUI/ConfigWizard.cpp:298 +#: src/slic3r/GUI/ConfigWizard.cpp:429 #, possible-c-format msgid "Welcome to the %s Configuration Wizard" msgstr "Benvenuto nella Configurazione Guidata di %s" -#: src/slic3r/GUI/Preferences.cpp:86 +#: src/slic3r/GUI/Preferences.cpp:97 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:223 +#: src/slic3r/GUI/PresetHints.cpp:224 msgid "when printing" msgstr "durante la stampa" -#: src/libslic3r/PrintConfig.cpp:217 +#: src/libslic3r/PrintConfig.cpp:253 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:269 +#: src/libslic3r/PrintConfig.cpp:305 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:843 +#: src/libslic3r/PrintConfig.cpp:891 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:1483 +#: src/libslic3r/PrintConfig.cpp:1553 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:1475 +#: src/libslic3r/PrintConfig.cpp:1545 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:1347 +#: src/libslic3r/PrintConfig.cpp:1391 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:1173 +#: src/libslic3r/PrintConfig.cpp:1238 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:1527 +#: src/libslic3r/PrintConfig.cpp:1597 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:1519 +#: src/libslic3r/PrintConfig.cpp:1589 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:3076 +#: src/slic3r/GUI/Tab.cpp:3263 msgid "WHITE BULLET" msgstr "PALLINO BIANCO" -#: src/slic3r/GUI/Tab.cpp:3365 +#: src/slic3r/GUI/Tab.cpp:3285 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:3111 +#: src/slic3r/GUI/Tab.cpp:3288 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:3126 +#: src/slic3r/GUI/Tab.cpp:3303 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:214 src/libslic3r/PrintConfig.cpp:2137 +#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238 msgid "Width" msgstr "Larghezza" -#: src/libslic3r/GCode/PreviewData.cpp:398 +#: src/libslic3r/GCode/PreviewData.cpp:349 msgid "Width (mm)" msgstr "Larghezza (mm)" -#: src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2640 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:2138 +#: src/libslic3r/PrintConfig.cpp:2239 msgid "Width of a wipe tower" msgstr "Larghezza della torre di spurgo" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2891 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:2203 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Width of the display" msgstr "Larghezza del display" -#: src/slic3r/GUI/PresetHints.cpp:47 +#: src/slic3r/GUI/PresetHints.cpp:48 msgid "will always run at %1%%%" msgstr "lavorerà sempre a %1%%%" -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:55 msgid "will be turned off." msgstr "rimarrà spenta." -#: src/libslic3r/PrintConfig.cpp:2276 +#: src/libslic3r/PrintConfig.cpp:2441 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:2160 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "Wipe into this object" msgstr "Spurgo in questo oggetto" -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2253 msgid "Wipe into this object's infill" msgstr "Spurgo nel riempimento di questo oggetto" -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:90 -#: src/slic3r/GUI/GUI_ObjectList.cpp:564 src/libslic3r/PrintConfig.cpp:2202 -#: src/libslic3r/PrintConfig.cpp:2210 +#: 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 msgid "Wipe options" msgstr "Opzioni pulizia" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/slic3r/GUI/Tab.cpp:1130 -#: src/libslic3r/GCode/PreviewData.cpp:174 +#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1191 +#: src/libslic3r/ExtrusionEntity.cpp:321 msgid "Wipe tower" msgstr "Torre di spurgo" -#: src/slic3r/GUI/Plater.cpp:1043 src/slic3r/GUI/Plater.cpp:1058 +#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245 msgid "wipe tower" msgstr "torre di spurgo" -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +#: src/slic3r/GUI/ConfigManipulation.cpp:120 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 +msgid "Wipe Tower" +msgstr "Torre di spurgo" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" msgstr "Torre di spurgo - Regolazione volume di spurgo" -#: src/slic3r/GUI/Tab.cpp:1664 +#: src/slic3r/GUI/Tab.cpp:1488 msgid "Wipe tower parameters" msgstr "Parametri torre di spurgo" -#: src/libslic3r/PrintConfig.cpp:2144 +#: src/libslic3r/PrintConfig.cpp:2245 msgid "Wipe tower rotation angle" msgstr "Angolo di rotazione della torre di spurgo" -#: src/libslic3r/PrintConfig.cpp:2170 +#: src/libslic3r/PrintConfig.cpp:2246 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:2092 +#: src/libslic3r/PrintConfig.cpp:2193 msgid "Wipe while retracting" msgstr "Pulisci durante la retrazione" -#: src/slic3r/GUI/PresetHints.cpp:224 +#: src/slic3r/GUI/PresetHints.cpp:225 msgid "with a volumetric rate" msgstr "con una portata volumetrica" -#: src/libslic3r/PrintConfig.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1530 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 saggio effettuare una certa retrazione veloce prima di effettuare un movimento di pulizia." +msgstr "Con estrusori bowden, potrebbe essere conveniente effettuare una certa retrazione veloce prima di effettuare un movimento di pulizia." -#: src/libslic3r/PrintConfig.cpp:1969 +#: src/libslic3r/PrintConfig.cpp:2056 msgid "With sheath around the support" msgstr "Con guaina attorno al supporto" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:40 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:83 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 msgid "World coordinates" msgstr "Coordinate reali" -#: src/slic3r/GUI/UpdateDialogs.cpp:76 +#: src/slic3r/GUI/UpdateDialogs.cpp:92 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:95 +#: src/libslic3r/Zipper.cpp:92 msgid "write calledback failed" msgstr "scrittura richiamo non riuscita" -#: src/libslic3r/PrintConfig.cpp:2993 +#: src/libslic3r/PrintConfig.cpp:3382 msgid "Write information about the model to the console." msgstr "Scrivi informazioni sul modello alla console." -#: src/slic3r/Utils/Duet.cpp:148 +#: src/slic3r/Utils/Duet.cpp:131 msgid "Wrong password" msgstr "Password errata" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2225 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:1793 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "XY separation between an object and its support" msgstr "Separazione XY tra un oggetto e il suo supporto" -#: src/libslic3r/PrintConfig.cpp:1795 +#: src/libslic3r/PrintConfig.cpp:1881 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:2174 +#: src/libslic3r/PrintConfig.cpp:2275 msgid "XY Size Compensation" msgstr "Compensazione dimensione XY" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2232 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:992 +#: src/slic3r/GUI/Plater.cpp:1170 msgid "Yes" msgstr "Si" -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1317 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:557 +#: src/libslic3r/PrintConfig.cpp:589 msgid "You can put your notes regarding the filament here." msgstr "È possibile inserire qui le note riguardanti il filamento." -#: src/libslic3r/PrintConfig.cpp:1403 +#: src/libslic3r/PrintConfig.cpp:1473 msgid "You can put your notes regarding the printer here." msgstr "È possibile inserire qui le note riguardanti la stampante." -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2579 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:324 +#: src/libslic3r/PrintConfig.cpp:360 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:1295 +#: src/libslic3r/PrintConfig.cpp:1364 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:2538 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3546 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:2243 -msgid "You can't load SLA project if there is at least one multi-part object on the bed" -msgstr "Non è possibile caricare il progetto SLA se è presente almeno un oggetto multi-parte sul piano" - -#: src/slic3r/GUI/Plater.cpp:1746 +#: src/slic3r/GUI/Plater.cpp:2390 #, 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/GUI_ObjectManipulation.cpp:565 +#: src/slic3r/GUI/Plater.cpp:2311 +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 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/GUI_App.cpp:300 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:287 msgid "You may need to update your graphics card driver." msgstr "Dovresti aggiornare i driver della scheda video." -#: src/slic3r/GUI/Preferences.cpp:130 +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +msgid "You must install a configuration update." +msgstr "È necessario installare un aggiornamento della configurazione." + +#: src/slic3r/GUI/Preferences.cpp:172 #, 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:2415 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3421 #, possible-c-format msgid "You started your selection with %s Item." msgstr "Hai iniziato la selezione con %s elementi." -#: src/slic3r/GUI/MainFrame.cpp:772 +#: src/slic3r/GUI/DoubleSlider.cpp:1902 +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 +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 msgid "Your file was repaired." msgstr "Il file è stato riparato." -#: src/slic3r/GUI/Plater.cpp:1874 +#: src/slic3r/GUI/Plater.cpp:2528 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:2184 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "Z offset" msgstr "Offset Z" -#: src/libslic3r/PrintConfig.cpp:2416 +#: src/slic3r/GUI/ConfigManipulation.cpp:60 +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 +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 msgid "Zig-Zag" msgstr "Zig-Zag" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/Mouse3DController.cpp:308 +#: src/slic3r/GUI/Mouse3DController.cpp:317 +msgid "Zoom" +msgstr "Zoom" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 msgid "Zoom in" msgstr "Zoom in" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 msgid "Zoom out" msgstr "Zoom out" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -msgid "Zoom to all objects in scene, if none selected" -msgstr "Zoom su tutti gli oggetti nella scena, se nessuno è selezionato" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 msgid "Zoom to Bed" msgstr "Zoom sul piano" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 -msgid "Zoom to selected object" -msgstr "Zoom sull'oggetto selezionato" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +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:171 src/libslic3r/PrintConfig.cpp:733 -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:1580 -#: src/libslic3r/PrintConfig.cpp:1808 src/libslic3r/PrintConfig.cpp:1962 -#: src/libslic3r/PrintConfig.cpp:2146 src/libslic3r/PrintConfig.cpp:2463 +#: 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 msgid "°" msgstr "°" -#: src/slic3r/GUI/ConfigWizard.cpp:613 src/slic3r/GUI/ConfigWizard.cpp:627 +#: src/slic3r/GUI/ConfigWizard.cpp:1038 src/slic3r/GUI/ConfigWizard.cpp:1052 msgid "°C" msgstr "°C" diff --git a/resources/localization/ja/PrusaSlicer.mo b/resources/localization/ja/PrusaSlicer.mo new file mode 100644 index 0000000000..14198bdb7a Binary files /dev/null and b/resources/localization/ja/PrusaSlicer.mo differ diff --git a/resources/localization/ja/PrusaSlicer_ja.po b/resources/localization/ja/PrusaSlicer_ja.po new file mode 100644 index 0000000000..b136ba0daa --- /dev/null +++ b/resources/localization/ja/PrusaSlicer_ja.po @@ -0,0 +1,8876 @@ +msgid "" +msgstr "" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\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 " -http://github.com/prusa3d/PrusaSlicer/releasesで更新を確認することを忘れないでください" + +#: src/slic3r/GUI/MainFrame.cpp:872 +msgid " was successfully sliced." +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:2425 +#: src/libslic3r/PrintConfig.cpp:2767 +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 +msgid "%1% Preset" +msgstr "プリセット%1%" + +#: src/slic3r/GUI/Plater.cpp:4400 +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%プリンターがアクティブでした。 %1%プリンターに切り替えるには、%1%プリセットのリロードが必要です。" + +#: src/libslic3r/Print.cpp:1374 +msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" +msgstr "%1%=%2% mmはレイヤーの高さ%3% mmでプリントするには低すぎます" + +#: src/slic3r/GUI/PresetHints.cpp:229 +#, possible-c-format +msgid "%3.2f mm³/s at filament speed %3.2f mm/s." +msgstr "フィラメント速度%3.2f mm/sで%3.2f mm³/ s。" + +#: src/slic3r/GUI/Plater.cpp:1152 +#, possible-c-format +msgid "%d (%d shells)" +msgstr "%d (%d 領域)" + +#: src/slic3r/GUI/Plater.cpp:1160 +#, possible-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/PresetHints.cpp:270 +#, possible-c-format +msgid "%d lines: %.2f mm" +msgstr "%dライン:%.2f mm" + +#: src/slic3r/GUI/MainFrame.cpp:1027 +#, possible-c-format +msgid "%d presets successfully imported." +msgstr "%d プリセットを正常にインポートしました。" + +#: src/slic3r/GUI/MainFrame.cpp:692 +#, possible-c-format +msgid "%s &Website" +msgstr "%s &Webサイト" + +#: src/slic3r/GUI/UpdateDialogs.cpp:211 +#, possible-c-format +msgid "%s configuration is incompatible" +msgstr "%s構成に互換性がありません" + +#: src/slic3r/GUI/Field.cpp:175 +#, possible-c-format +msgid "%s doesn't support percentage" +msgstr "%sは比率をサポートしていません" + +#: src/slic3r/GUI/MsgDialog.cpp:73 +#, possible-c-format +msgid "%s error" +msgstr "%sエラー" + +#: src/slic3r/GUI/ConfigWizard.cpp:481 +#, possible-c-format +msgid "%s Family" +msgstr "%sファミリー" + +#: src/slic3r/GUI/MsgDialog.cpp:74 +#, possible-c-format +msgid "%s has encountered an error" +msgstr "%sでエラーが発生しました" + +#: src/slic3r/GUI/GUI_App.cpp:138 +#, 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でエラーが発生しました。 メモリ不足が原因である可能性があります。 システムに十分なRAMがあるのにこのエラーが発生している場合、バグの可能性がありますので、ご報告いただければ幸いです。\n\nこれで、アプリケーションは終了します。" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:222 +#, 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でエラーが発生しました。 メモリ不足の可能性があります。 システムに十分な空きメモリー領域があるのに発生した場合、バグの可能性がありますので、ご報告いただければ幸いです。" + +#: src/slic3r/GUI/UpdateDialogs.cpp:308 +#, possible-c-format +msgid "%s has no configuration updates available." +msgstr "%sには使用可能な構成の更新がありません。" + +#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 +#, possible-c-format +msgid "%s incompatibility" +msgstr "%sと互換性がありません" + +#: src/slic3r/GUI/UpdateDialogs.cpp:270 +#, 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は、更新された構成を使用するようになりました。さまざまなプリンターのデフォルト設定を含む、いわゆる「システムプリセット」が導入されました。 これらのシステムプリセットは変更できません。代わりに、ユーザーはシステムプリセットの1つから設定を継承して独自のプリセットを作成できます。新しく作成されたプリセットは、その前身から値を継承するか、変更された値で上書きできます。%sの指示に従って新しい設定を行い、自動プリセット更新を有効にするかどうかを選択します。" + +#: src/slic3r/GUI/GUI_App.cpp:820 +#, possible-c-format +msgid "%s View Mode" +msgstr "%s表示モード" + +#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#, 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は更新を開始します。 そうしないと、実行できません。\n \n最初に、構成の完全なスナップショットが作成され、新しいバージョンに問題がある場合は回復できます。\n \n更新された構成パッケージ:" + +#: src/slic3r/GUI/MainFrame.cpp:705 +#, possible-c-format +msgid "&About %s" +msgstr "%sについて(&A)" + +#: src/slic3r/GUI/GUI_App.cpp:908 +msgid "&Configuration" +msgstr "構成(&C)" + +#: src/slic3r/GUI/GUI_App.cpp:800 +msgid "&Configuration Snapshots" +msgstr "構成スナップショット(&C)" + +#: src/slic3r/GUI/MainFrame.cpp:588 +msgid "&Copy" +msgstr "コピー(&C)" + +#: src/slic3r/GUI/MainFrame.cpp:572 +msgid "&Delete selected" +msgstr "選択したものを削除(&D)" + +#: src/slic3r/GUI/MainFrame.cpp:722 +msgid "&Edit" +msgstr "編集(&E)" + +#: src/slic3r/GUI/MainFrame.cpp:506 +msgid "&Export" +msgstr "エクスポート(&E)" + +#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:752 +msgid "&Filament Settings Tab" +msgstr "フィラメント設定タブ(&F)" + +#: src/slic3r/GUI/MainFrame.cpp:721 +msgid "&File" +msgstr "ファイル(&F)" + +#: src/slic3r/GUI/ConfigWizard.cpp:1981 +msgid "&Finish" +msgstr "終了(&F)" + +#: src/slic3r/GUI/MainFrame.cpp:727 +msgid "&Help" +msgstr "ヘルプ(&H)" + +#: src/slic3r/GUI/MainFrame.cpp:474 +msgid "&Import" +msgstr "インポート(&I)" + +#: src/slic3r/GUI/GUI_App.cpp:822 +msgid "&Language" +msgstr "言語(&L)" + +#: src/slic3r/GUI/MainFrame.cpp:405 +msgid "&New Project" +msgstr "新しいプロジェクト(&N)" + +#: src/slic3r/GUI/ConfigWizard.cpp:1980 +msgid "&Next >" +msgstr "次 >(&N)" + +#: src/slic3r/GUI/MainFrame.cpp:408 +msgid "&Open Project" +msgstr "プロジェクトのオープン(&O)" + +#: src/slic3r/GUI/MainFrame.cpp:591 +msgid "&Paste" +msgstr "貼り付け(&P)" + +#: src/slic3r/GUI/MainFrame.cpp:606 +msgid "&Plater Tab" +msgstr "プレートタブ(&P)" + +#: src/slic3r/GUI/GUI_App.cpp:804 +msgid "&Preferences" +msgstr "環境設定(&P)" + +#: src/slic3r/GUI/MainFrame.cpp:540 +msgid "&Quit" +msgstr "中止(&Q)" + +#: src/slic3r/GUI/MainFrame.cpp:583 +msgid "&Redo" +msgstr "やり直し(&R)" + +#: src/slic3r/GUI/MainFrame.cpp:536 +msgid "&Repair STL file" +msgstr "STLファイルの修復(&R)" + +#: src/slic3r/GUI/MainFrame.cpp:446 +msgid "&Save Project" +msgstr "プロジェクトを保存(&S)" + +#: src/slic3r/GUI/MainFrame.cpp:565 +msgid "&Select all" +msgstr "全て選択(&S)" + +#: src/slic3r/GUI/MainFrame.cpp:580 +msgid "&Undo" +msgstr "元に戻す(&U)" + +#: src/slic3r/GUI/MainFrame.cpp:724 +msgid "&View" +msgstr "ビュー(&V)" + +#: src/slic3r/GUI/MainFrame.cpp:723 +msgid "&Window" +msgstr "ウィンドウ(&W)" + +#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631 +msgid "(All)" +msgstr "(全て)" + +#: src/libslic3r/PrintConfig.cpp:1446 +msgid "(minimum)" +msgstr "(最小)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 +msgid "(Re)slice" +msgstr "スライス" + +#: src/slic3r/GUI/MainFrame.cpp:532 +msgid "(Re)Slice No&w" +msgstr "(再)スライス実行(&w)" + +#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587 +msgid "(Unknown)" +msgstr "(不明)" + +#: src/slic3r/GUI/MainFrame.cpp:790 +msgid ") not found." +msgstr ")見つかりません。" + +#: src/libslic3r/PrintConfig.cpp:1918 +msgid "0 (soluble)" +msgstr "0 (溶解性)" + +#: src/libslic3r/PrintConfig.cpp:1919 +msgid "0.2 (detachable)" +msgstr "0.2(分離可能)" + +#: src/slic3r/GUI/MainFrame.cpp:626 +msgid "3&D" +msgstr "3&D" + +#: src/slic3r/GUI/Plater.cpp:4097 +msgid "3D editor view" +msgstr "3D編集画面" + +#: src/libslic3r/PrintConfig.cpp:851 +msgid "3D Honeycomb" +msgstr "3Dハニカム" + +#: src/slic3r/GUI/Mouse3DController.cpp:274 +msgid "3Dconnexion settings" +msgstr "3Dconnexion設定" + +#: src/slic3r/GUI/Plater.cpp:5038 +#, possible-c-format +msgid "3MF file exported to %s" +msgstr "3MFファイルを%sにエクスポートしました" + +#: src/slic3r/GUI/ConfigWizard.cpp:1979 +msgid "< &Back" +msgstr "< 戻る(&B)" + +#: src/libslic3r/PrintConfig.cpp:287 +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:272 +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/slic3r/GUI/Tab.cpp:975 +msgid "A copy of the current system preset will be created, which will be detached from the system preset." +msgstr "現在のシステムプリセットからコピーを作成し、システムプリセットから切り離します。" + +#: src/slic3r/GUI/ConfigWizard.cpp:1034 +msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS." +msgstr "一般的には、PLAは160〜230℃、ABSは215〜250℃です。" + +#: src/slic3r/GUI/ConfigWizard.cpp:1048 +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℃、ABSでは110℃です。 ヒートベッドがないプリンタではゼロを入力します。" + +#: src/slic3r/GUI/GLCanvas3D.cpp:686 +msgid "A toolpath outside the print area was detected" +msgstr "プリント可能範囲外のツールパスが検出されました" + +#: src/slic3r/GUI/AboutDialog.cpp:199 +#, possible-c-format +msgid "About %s" +msgstr "%sについて" + +#: src/slic3r/GUI/GLCanvas3D.cpp:959 +#, possible-c-format +msgid "above %.2f mm" +msgstr "%.2fmm以上" + +#: src/libslic3r/PrintConfig.cpp:1569 +msgid "Above Z" +msgstr "Zの上" + +#: src/slic3r/GUI/Tab.cpp:1164 +msgid "Acceleration control (advanced)" +msgstr "加速度コントロール (上級者向け)" + +#: src/libslic3r/PrintConfig.cpp:2925 +msgid "Accuracy" +msgstr "精度" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +msgid "Activate" +msgstr "アクティベート" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 +msgid "Active" +msgstr "アクティブ" + +#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1705 +msgid "active" +msgstr "アクティブ" + +#: src/slic3r/GUI/GLCanvas3D.cpp:267 +msgid "Adaptive" +msgstr "アダプティブ" + +#: src/slic3r/GUI/Tab.cpp:241 +msgid "Add a new printer" +msgstr "新しいプリンターを追加" + +#: src/libslic3r/PrintConfig.cpp:2782 +msgid "Add a pad underneath the supported model" +msgstr "サポートされているモデルの下にパッドを追加します" + +#: src/libslic3r/PrintConfig.cpp:2058 +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 "サポートの周りに覆い(1つの円周線)を追加します。 これにより、サポートの造形信頼性が高まりますが、除去するのが難しくなります。" + +#: src/slic3r/GUI/DoubleSlider.cpp:991 +msgid "Add another code - Ctrl + Left click" +msgstr "別のコードを追加 - Ctrl +左クリック" + +#: src/slic3r/GUI/DoubleSlider.cpp:992 +msgid "Add another code - Right click" +msgstr "その他のコードを追加ー右クリック" + +#: src/slic3r/GUI/DoubleSlider.cpp:1477 +msgid "Add color change" +msgstr "色の変更を追加" + +#: src/slic3r/GUI/DoubleSlider.cpp:1180 +msgid "Add color change (%1%) for:" +msgstr "色の変更(%1%)を追加:" + +#: src/slic3r/GUI/DoubleSlider.cpp:988 +msgid "Add color change - Left click" +msgstr "カラー変更の追加 - 左クリック" + +#: src/slic3r/GUI/DoubleSlider.cpp:986 +msgid "Add color change - Left click for predefined color or Shift + Left click for custom color selection" +msgstr "色の変更の追加-定義済みの色の場合は左クリック、カスタムの色選択の場合はシフト +左クリック" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 +msgid "Add color change marker for current layer" +msgstr "現在のレイヤーに色変更マーカーを追加" + +#: src/slic3r/GUI/DoubleSlider.cpp:1490 +msgid "Add custom G-code" +msgstr "カスタムG-コードの追加" + +#: src/slic3r/GUI/GLCanvas3D.cpp:240 +msgid "Add detail" +msgstr "詳細を追加" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:421 +msgid "Add drainage hole" +msgstr "抜き穴を追加" + +#: src/slic3r/GUI/DoubleSlider.cpp:984 +msgid "Add extruder change - Left click" +msgstr "エクストルーダーの変更を追加-左クリック" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 +msgid "Add extruder to sequence" +msgstr "エクストルーダーをリストに追加します" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1993 +msgid "Add Generic Subobject" +msgstr "一般的なサブオブジェクトの追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2896 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2925 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 +msgid "Add Height Range" +msgstr "高さ範囲追加" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3788 +#: src/slic3r/GUI/Plater.cpp:3800 src/slic3r/GUI/Plater.cpp:3940 +msgid "Add instance" +msgstr "インスタンス追加" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 +msgid "Add Instance of the selected object" +msgstr "選択したオブジェクトのインスタンスを追加" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162 +msgid "Add layer range" +msgstr "レイヤー範囲追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2328 +msgid "Add Layers" +msgstr "レイヤー追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 +msgid "Add modifier" +msgstr "個別条件領域の追加" + +#: src/libslic3r/PrintConfig.cpp:479 +#, no-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/slic3r/GUI/Plater.cpp:3940 +msgid "Add one more instance of the selected object" +msgstr "選択したオブジェクトの1つ以上のインスタンスを追加します" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 +msgid "Add part" +msgstr "パーツ追加" + +#: src/slic3r/GUI/DoubleSlider.cpp:1487 +msgid "Add pause print" +msgstr "プリントの一時停止を追加" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 +msgid "Add point" +msgstr "ポイント追加" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 +msgid "Add point to selection" +msgstr "選択ポイントを追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 +msgid "Add settings" +msgstr "設定を追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 +msgid "Add Settings Bundle for Height range" +msgstr "高さ範囲の設定バンドルを追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1388 +msgid "Add Settings Bundle for Object" +msgstr "オブジェクトの設定バンドルを追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1387 +msgid "Add Settings Bundle for Sub-object" +msgstr "サブオブジェクトの設定バンドルを追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1314 +msgid "Add Settings for Layers" +msgstr "レイヤー設定の追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 +msgid "Add Settings for Object" +msgstr "オブジェクト設定の追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1315 +msgid "Add Settings for Sub-object" +msgstr "サブオブジェクト設定の追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1793 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2051 +msgid "Add Shape" +msgstr "形状を追加" + +#: src/libslic3r/PrintConfig.cpp:409 +msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)." +msgstr "傾斜面付近でソリッドインフィル(塗りつぶし)を追加して、垂直方向の厚みを保証します(トップ+ボトムソリッドレイヤー)。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 +msgid "Add support blocker" +msgstr "サポートブロッカーを追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 +msgid "Add support enforcer" +msgstr "強制サポートを追加する" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:494 +msgid "Add support point" +msgstr "サポートポイントの追加" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4467 +msgid "Add..." +msgstr "追加..." + +#: src/slic3r/GUI/PresetBundle.cpp:1704 +msgid "Add/Remove filaments" +msgstr "フィラメントの追加/削除" + +#: src/slic3r/GUI/Preset.cpp:1201 +msgid "Add/Remove materials" +msgstr "材料の追加/削除" + +#: src/slic3r/GUI/Preset.cpp:1203 +msgid "Add/Remove printers" +msgstr "プリンターの追加/削除" + +#: src/slic3r/GUI/Tab.cpp:970 +msgid "Additional information:" +msgstr "追加情報:" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59 +msgid "Additional Settings" +msgstr "追加設定" + +#: src/slic3r/GUI/ConfigWizard.cpp:791 +msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied." +msgstr "更新が適用される前に、構成全体の追加バックアップスナップショットが作成されます。" + +#: src/slic3r/GUI/BonjourDialog.cpp:72 +msgid "Address" +msgstr "アドレス" + +#: 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 +msgid "Advanced" +msgstr "上級者向け" + +#: src/slic3r/GUI/ConfigWizard.cpp:821 +msgid "Advanced mode" +msgstr "拡張モード" + +#: src/slic3r/GUI/GUI_App.cpp:814 +msgid "Advanced View Mode" +msgstr "高度なビューモード" + +#: src/slic3r/GUI/FirmwareDialog.cpp:841 +msgid "Advanced: Output log" +msgstr "上級者向け:出力ログ" + +#: src/libslic3r/PrintConfig.cpp:668 +msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Slic3r will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably." +msgstr "ツールを交換した後、ノズル内に新しく挿入されたフィラメントの正確な位置がわからない場合があり、フィラメントの押圧が安定していない場合があります。 プリントヘッドをインフィル(中塗り)または犠牲オブジェクトでパージする前に、Slic3rは常にこの量の材料をワイプタワーに試し出しすることで、インフィルまたは犠牲オブジェクトを確実に形成します。" + +#: src/slic3r/GUI/Tab.cpp:1994 src/libslic3r/PrintConfig.cpp:1080 +msgid "After layer change G-code" +msgstr "レイヤーチェンジ後のGコード" + +#: src/libslic3r/PrintConfig.cpp:3398 +msgid "Align the model to the given point." +msgstr "モデルを指定されたポイントに合わせます。" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Align XY" +msgstr "XYで整列" + +#: src/libslic3r/PrintConfig.cpp:1631 +msgid "Aligned" +msgstr "整列された" + +#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573 +#: src/slic3r/GUI/Tab.cpp:3174 +msgid "All" +msgstr "全て" + +#: src/libslic3r/Print.cpp:1219 +msgid "All objects are outside of the print volume." +msgstr "すべてのオブジェクトはプリントボリュームの外側にあります。" + +#: src/slic3r/GUI/Plater.cpp:4669 +msgid "All objects will be removed, continue?" +msgstr "すべてのオブジェクトが削除されます、続行しますか?" + +#: src/slic3r/GUI/ConfigWizard.cpp:289 +msgid "All standard" +msgstr "すべての標準" + +#: src/libslic3r/Zipper.cpp:62 +msgid "allocation failed" +msgstr "割り当て失敗" + +#: src/slic3r/GUI/Plater.cpp:3995 +msgid "Along X axis" +msgstr "X軸に沿って" + +#: src/slic3r/GUI/Plater.cpp:3997 +msgid "Along Y axis" +msgstr "Y軸に沿って" + +#: src/slic3r/GUI/Plater.cpp:3999 +msgid "Along Z axis" +msgstr "Z軸に沿って" + +#: src/slic3r/GUI/ConfigWizard.cpp:222 +msgid "Alternate nozzles:" +msgstr "代替ノズル:" + +#: src/slic3r/GUI/Plater.cpp:5002 +#, possible-c-format +msgid "AMF file exported to %s" +msgstr "%sにエクスポートされたAMFファイル" + +#: src/slic3r/GUI/GLCanvas3D.cpp:690 +msgid "An object outside the print area was detected\nResolve the current problem to continue slicing" +msgstr "プリント領域外のオブジェクトが検出されました。スライスを続行するには、この問題を解決してください" + +#: src/slic3r/GUI/GLCanvas3D.cpp:685 +msgid "An object outside the print area was detected" +msgstr "プリント可能範囲外のオブジェクトが検出されました" + +#: src/slic3r/GUI/Tab.cpp:2943 +msgid "and it has the following unsaved changes:" +msgstr "また、次の未保存の変更があります :" + +#: src/slic3r/GUI/Plater.cpp:3170 +msgid "Another export job is currently running." +msgstr "現在、別のエクスポートジョブを実行中です。" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Any arrow" +msgstr "任意の矢印" + +#: src/slic3r/GUI/Tab.cpp:965 +msgid "Any modifications should be saved as a new preset inherited from this one." +msgstr "修正したら、これから継承された新しいプリセットとして保存する必要があります。" + +#: src/libslic3r/PrintConfig.cpp:104 +msgid "API Key / Password" +msgstr "APIキー/パスワード" + +#: src/slic3r/GUI/GUI_App.cpp:810 +msgid "Application preferences" +msgstr "ソフトウェア設定" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1374 +msgid "Apply changes" +msgstr "変更を適用" + +#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708 +msgid "approximate seconds" +msgstr "秒(約)" + +#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854 +msgid "Archimedean Chords" +msgstr "アルキメデスコード" + +#: src/libslic3r/Zipper.cpp:88 +msgid "archive is too large" +msgstr "アーカイブが大きすぎます" + +#. TRN remove/delete +#: src/slic3r/GUI/Tab.cpp:3123 +msgid "Are you sure you want to %1% the selected preset?" +msgstr "%1%のプリセットを選択してよろしいですか?" + +#: src/slic3r/GUI/FirmwareDialog.cpp:902 +msgid "Are you sure you want to cancel firmware flashing?\nThis could leave your printer in an unusable state!" +msgstr "ファームウェアの書込みをキャンセルしてもよろしいですか?\nこれにより、プリンターが使用できない状態になる可能性があります!" + +#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924 +msgid "Are you sure you want to continue?" +msgstr "続行しますか?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 +msgid "Are you sure you want to do it?" +msgstr "実行してもよろしいですか?" + +#: src/libslic3r/PrintConfig.cpp:2423 +msgid "Area fill" +msgstr "領域塗りつぶし" + +#: src/slic3r/GUI/Plater.cpp:641 +msgid "Around object" +msgstr "オブジェクトの周り" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/Plater.cpp:2754 +msgid "Arrange" +msgstr "整列" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:158 +msgid "Arrange selection" +msgstr "選択の整列" + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "Arrange the supplied models in a plate and merge them in a single model in order to perform actions once." +msgstr "モデルをプリントパッド上に配置し、それらを1つのモデルにマージして、一度で実行できるようにします。" + +#: src/slic3r/GUI/Plater.cpp:2813 +msgid "Arranging" +msgstr "整列" + +#: src/slic3r/GUI/Plater.cpp:2841 +msgid "Arranging canceled." +msgstr "配列中止。" + +#: src/slic3r/GUI/Plater.cpp:2842 +msgid "Arranging done." +msgstr "準備完了。" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 +msgid "Arrow Down" +msgstr "下矢印" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 +msgid "Arrow Left" +msgstr "左矢印" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 +msgid "Arrow Right" +msgstr "右矢印" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 +msgid "Arrow Up" +msgstr "上矢印" + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:290 +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 "回避策として、--sw_rendererパラメーターを指定してprusa-slicer.exeを実行することにより、PrusaSlicerの3Dグラフィックのレンダリングにソフトウェアレンダラーを使用させます。" + +#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2313 +#: src/slic3r/GUI/Tab.cpp:2960 +msgid "Attention!" +msgstr "注意!" + +#: src/libslic3r/PrintConfig.cpp:1871 +msgid "Auto generated supports" +msgstr "自動生成サポート" + +#: src/slic3r/GUI/Preferences.cpp:47 +msgid "Auto-center parts" +msgstr "パーツの自動センタリング" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1377 +msgid "Auto-generate points" +msgstr "自動ポイント生成" + +#: src/slic3r/GUI/Plater.cpp:1157 +#, possible-c-format +msgid "Auto-repaired (%d errors)" +msgstr "自動修復( エラー: %d)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:339 +#, possible-c-format +msgid "Auto-repaired (%d errors):" +msgstr "自動修正(エラー:%d):" + +#: src/slic3r/GUI/FirmwareDialog.cpp:809 +msgid "Autodetected" +msgstr "自動検出" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 +msgid "Autogenerate support points" +msgstr "サポートポイントの自動生成" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 +msgid "Autogeneration will erase all manually edited points." +msgstr "自動生成は、マニュアルで編集されたすべてのポイントを消去します。" + +#: src/slic3r/GUI/Tab.cpp:3632 +msgid "Automatic generation" +msgstr "自動生成" + +#: src/slic3r/GUI/ConfigWizard.cpp:761 +msgid "Automatic updates" +msgstr "自動アップデート" + +#: src/slic3r/GUI/MainFrame.cpp:536 +msgid "Automatically repair an STL file" +msgstr "STLファイルの自動修復" + +#: src/slic3r/GUI/Tab.cpp:1171 +msgid "Autospeed (advanced)" +msgstr "オートスピード(上級者向け)" + +#: src/libslic3r/PrintConfig.cpp:136 +msgid "Avoid crossing perimeters" +msgstr "外周をまたがないようにする" + +#: src/slic3r/GUI/Tab.cpp:3268 +msgid "BACK ARROW" +msgstr "戻る矢印" + +#: 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.\nClick to reset all settings for the current option group to the last saved preset." +msgstr "戻る矢印アイコンは、現在の設定グループが最後に保存されたプリセットとは異なる設定に変更されたことを示します。\nクリックすると、現在の設定グループのすべての設定が最後に保存されたプリセットに戻されます。" + +#: 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.\nClick to reset current value to the last saved preset." +msgstr "戻る矢印アイコンは、値が変更され、最後に保存されたプリセットと等しくないことを示します。\nクリックすると、現在の値が最後に保存されたプリセットにリセットされます。" + +#: src/slic3r/GUI/Preferences.cpp:55 +msgid "Background processing" +msgstr "バックグラウンドで実行中" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:351 +msgid "backwards edges" +msgstr "後方エッジ" + +#: src/slic3r/GUI/MainFrame.cpp:174 +msgid "based on Slic3r" +msgstr "Slic3rをベースに" + +#: src/slic3r/GUI/Tab.cpp:1439 +msgid "Bed" +msgstr "ベッド" + +#: src/libslic3r/PrintConfig.cpp:61 +msgid "Bed custom model" +msgstr "カスタムベッドモデル" + +#: src/libslic3r/PrintConfig.cpp:56 +msgid "Bed custom texture" +msgstr "ベッドのカスタムイメージ" + +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:929 +msgid "Bed Shape" +msgstr "ベッドの形状" + +#: src/libslic3r/PrintConfig.cpp:51 +msgid "Bed shape" +msgstr "ベッドの形状" + +#: src/slic3r/GUI/ConfigWizard.cpp:929 +msgid "Bed Shape and Size" +msgstr "ベッドの形状とサイズ" + +#: src/libslic3r/PrintConfig.cpp:147 +msgid "Bed temperature" +msgstr "ベッドの温度" + +#: src/libslic3r/PrintConfig.cpp:145 +msgid "Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands in the output." +msgstr "最初のレイヤー以降のレイヤーのベッド温度。 ベッド温度制御コマンドを無効にするには、これをゼロに設定します。" + +#: src/slic3r/GUI/ConfigWizard.cpp:1051 +msgid "Bed Temperature:" +msgstr "ベッド温度:" + +#: src/slic3r/GUI/Tab.cpp:1988 src/libslic3r/PrintConfig.cpp:153 +msgid "Before layer change G-code" +msgstr "レイヤー変更前のGコード" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 +msgid "Before roll back" +msgstr "元に戻す前に" + +#: src/slic3r/GUI/Plater.cpp:640 +msgid "Below object" +msgstr "下のオブジェクト" + +#: src/libslic3r/PrintConfig.cpp:1578 +msgid "Below Z" +msgstr "Zの下" + +#: src/libslic3r/PrintConfig.cpp:164 +msgid "Between objects G-code" +msgstr "オブジェクト間のGコード" + +#: src/slic3r/GUI/Tab.cpp:2006 +msgid "Between objects G-code (for sequential printing)" +msgstr "オブジェクト間のGコード(シーケンシャルプリントの場合)" + +#: src/libslic3r/PrintConfig.cpp:2489 src/libslic3r/PrintConfig.cpp:2490 +msgid "Bottle volume" +msgstr "ボトル容量" + +#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497 +msgid "Bottle weight" +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:665 src/libslic3r/PrintConfig.cpp:174 +#: src/libslic3r/PrintConfig.cpp:183 +msgid "Bottom" +msgstr "ボトム" + +#: src/libslic3r/PrintConfig.cpp:435 +msgid "Bottom fill pattern" +msgstr "ボトム塗りつぶしパターン" + +#: src/slic3r/GUI/PresetHints.cpp:342 +msgid "Bottom is open." +msgstr "底部が開いています。" + +#: src/slic3r/GUI/PresetHints.cpp:336 +msgid "Bottom shell is %1% mm thick for layer height %2% mm." +msgstr "最下層のシェルの厚さは%1%mmで、層の高さは%2%mmです。" + +#: src/libslic3r/PrintConfig.cpp:177 +msgid "Bottom solid layers" +msgstr "底部ソリッドレイヤー" + +#: src/slic3r/GUI/MainFrame.cpp:665 +msgid "Bottom View" +msgstr "下面表示" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1464 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1468 +msgid "Box" +msgstr "ボックス" + +#: src/libslic3r/PrintConfig.cpp:193 +msgid "Bridge" +msgstr "ブリッジ" + +#: src/libslic3r/PrintConfig.cpp:222 +msgid "Bridge flow ratio" +msgstr "ブリッジ部吐出率" + +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316 +msgid "Bridge infill" +msgstr "ブリッジインフィル" + +#: src/libslic3r/PrintConfig.cpp:234 +msgid "Bridges" +msgstr "ブリッジ" + +#: src/libslic3r/PrintConfig.cpp:213 +msgid "Bridges fan speed" +msgstr "ブリッジファン速度" + +#: src/libslic3r/PrintConfig.cpp:202 +msgid "Bridging angle" +msgstr "ブリッジ形成角" + +#: src/libslic3r/PrintConfig.cpp:204 +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に設定すると角度が自動的に計算されます。 角度を入力すると、入力した角度がすべてのブリッジに適用されます。 強制的に角度を0に指定したい場合は、180°を入力してください。" + +#: src/slic3r/GUI/PresetHints.cpp:219 +msgid "Bridging volumetric" +msgstr "ブリッジの体積値" + +#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117 +msgid "Brim" +msgstr "ブリム" + +#: src/libslic3r/PrintConfig.cpp:244 +msgid "Brim width" +msgstr "ブリム幅" + +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1658 +#: src/slic3r/GUI/Tab.cpp:1721 +msgid "Browse" +msgstr "ブラウズ" + +#: src/libslic3r/Zipper.cpp:82 +msgid "buffer too small" +msgstr "バッファーが少なすぎます" + +#: src/slic3r/GUI/ButtonsDescription.cpp:16 +msgid "Buttons And Text Colors Description" +msgstr "ボタンとテキストカラーの種類" + +#: src/slic3r/GUI/PresetHints.cpp:223 +msgid "by the print profile maximum" +msgstr "プリントプロファイルの最大値" + +#: src/slic3r/GUI/Preferences.cpp:113 +msgid "Camera" +msgstr "カメラ" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +msgid "Camera view" +msgstr "カメラビュー" + +#: src/slic3r/GUI/ConfigWizard.cpp:1982 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 +msgid "Cancel" +msgstr "中止" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:157 +msgid "Cancel selected" +msgstr "選択取り消し" + +#: src/slic3r/GUI/Plater.cpp:3669 src/slic3r/GUI/PrintHostDialogs.cpp:233 +msgid "Cancelled" +msgstr "中止" + +#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232 +msgid "Cancelling" +msgstr "中止中" + +#: src/slic3r/GUI/FirmwareDialog.cpp:906 +msgid "Cancelling..." +msgstr "取り消し中..." + +#: src/libslic3r/Flow.cpp:61 +msgid "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." +msgstr "%1%の押出し幅を計算できません:変数 \"%2%\"にアクセスできません。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3017 +msgid "Cannot insert a new layer range after the current layer range.\nCurrent layer range overlaps with the next layer range." +msgstr "現在のレイヤー範囲の後に新しいレイヤー範囲を挿入できません。\n現在のレイヤー範囲は次のレイヤー範囲と重複しています。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3008 +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 "現在のレイヤー範囲の後に新しいレイヤー範囲を挿入できません。\n次のレイヤー範囲は薄すぎて、\n最小レイヤー高さに違反せずに2つに分割できません。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3012 +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 "現在のレイヤー範囲と次のレイヤー範囲の間に新しいレイヤー範囲を挿入できません。\n現在のレイヤー範囲と次のレイヤー範囲の間のギャップは、\n許容される最小レイヤー高さよりも薄くなっています。" + +#: src/slic3r/GUI/Tab.cpp:3073 +msgid "Cannot overwrite a system profile." +msgstr "システムプロファイルを上書きできません。" + +#: src/slic3r/GUI/Tab.cpp:3077 +msgid "Cannot overwrite an external profile." +msgstr "外部プロファイルを上書きできません。" + +#: src/libslic3r/SLAPrint.cpp:613 +msgid "Cannot proceed without support points! Add support points or disable support generation." +msgstr "サポートポイントなしでは続行できません! サポートポイントを追加するか、サポート生成を無効にします。" + +#: src/slic3r/GUI/Tab.cpp:1834 +msgid "Capabilities" +msgstr "オプション" + +#: src/slic3r/GUI/GUI_App.cpp:801 +msgid "Capture a configuration snapshot" +msgstr "構成スナップショットをキャプチャーする" + +#: src/libslic3r/PrintConfig.cpp:3424 +msgid "Center" +msgstr "中心" + +#: src/libslic3r/PrintConfig.cpp:3425 +msgid "Center the print around the given center." +msgstr "指定されたポイントを中心にプリントを配置します。" + +#: src/slic3r/GUI/Tab.cpp:1728 +msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" +msgstr "証明書ファイル (*.crt, *.pem)|*.crt;*.pem|全て|*.*" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 +msgid "Change camera type (perspective, orthographic)" +msgstr "カメラタイプの変更(パース/アイソメ)" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:885 +msgid "Change drainage hole diameter" +msgstr "ドレインホール(抜き穴)の径を変更" + +#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1671 +msgid "Change extruder" +msgstr "エクストルーダー切替え" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:536 +msgid "Change Extruder" +msgstr "エクストルーダーの変更" + +#: src/slic3r/GUI/DoubleSlider.cpp:1145 +msgid "Change extruder (N/A)" +msgstr "エクストルーダーの変更(N/A)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3997 +msgid "Change Extruders" +msgstr "エクストルーダーの変更" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 +#, possible-c-format +msgid "Change Option %s" +msgstr "オプション%s変更" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3558 +msgid "Change Part Type" +msgstr "パーツタイプの変更" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820 +msgid "Change point head diameter" +msgstr "ポイントヘッド径の変更" + +#: src/slic3r/GUI/Plater.cpp:3944 +msgid "Change the number of instances of the selected object" +msgstr "選択したオブジェクトのインスタンス数を変更します" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1589 +msgid "Change type" +msgstr "タイプを変更" + +#: src/slic3r/GUI/UpdateDialogs.cpp:53 +msgid "Changelog && Download" +msgstr "変更ログ && ダウンロード" + +#: src/slic3r/GUI/GUI_App.cpp:442 +msgid "Changing of an application language" +msgstr "アプリケーション言語の変更" + +#: src/slic3r/GUI/ConfigWizard.cpp:769 src/slic3r/GUI/Preferences.cpp:64 +msgid "Check for application updates" +msgstr "最新バージョンをチェック" + +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for configuration updates" +msgstr "構成の更新を確認する" + +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for updates" +msgstr "アップデートのチェック" + +#: src/slic3r/GUI/BedShapeDialog.cpp:532 +msgid "Choose a file to import bed texture from (PNG/SVG):" +msgstr "ベッドのイメージファイルを選択(PNG/SVG):" + +#: src/slic3r/GUI/MainFrame.cpp:773 +msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "スライスするファイルを選択(STL/OBJ/AMF/3MF/PRUSA):" + +#: src/slic3r/GUI/BedShapeDialog.cpp:555 +msgid "Choose an STL file to import bed model from:" +msgstr "ベッドモデルをインポートするSTLファイルを選択します:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:487 +msgid "Choose an STL file to import bed shape from:" +msgstr "ベッド形状をインポートするためのSTLファイルを選択:" + +#: src/slic3r/GUI/GUI_App.cpp:555 +msgid "Choose one file (3MF/AMF):" +msgstr "1つのファイルを選択します(3MF/AMF):" + +#: src/slic3r/GUI/GUI_App.cpp:567 +msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "1つ以上のファイルの選択(STL/OBJ/AMF/3MF/PRUSA):" + +#: src/slic3r/GUI/ConfigWizard.cpp:895 +msgid "Choose the type of firmware used by your printer." +msgstr "プリンタのファームウェアタイプを選択します。" + +#: src/slic3r/GUI/BedShapeDialog.cpp:89 +msgid "Circular" +msgstr "円形" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/GLCanvas3D.cpp:4657 +msgid "Click right mouse button to open History" +msgstr "マウスの右クリックでヒストリーが表示されます" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:404 +msgid "Click the icon to change the object printable property" +msgstr "アイコンをクリックして、オブジェクトのプリント可能なプロパティを変更します" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:398 +msgid "Click the icon to change the object settings" +msgstr "アイコンをクリックして、オブジェクトの設定を変更します" + +#: src/slic3r/GUI/Plater.cpp:343 +msgid "Click to edit preset" +msgstr "クリックしてプリセットを編集" + +#: src/libslic3r/PrintConfig.cpp:252 +msgid "Clip multi-part objects" +msgstr "マルチパートオブジェクトをクリップする" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 +msgid "Clipping of view" +msgstr "ビューのクリッピング" + +#: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/Mouse3DController.cpp:364 +#: src/slic3r/GUI/PrintHostDialogs.cpp:161 +msgid "Close" +msgstr "閉じる" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +#: src/libslic3r/PrintConfig.cpp:2934 +msgid "Closing distance" +msgstr "閉鎖距離" + +#: src/slic3r/GUI/Plater.cpp:1260 src/libslic3r/PrintConfig.cpp:582 +msgid "Color" +msgstr "色" + +#: src/slic3r/GUI/DoubleSlider.cpp:1005 +msgid "Color change (\"%1%\")" +msgstr "色の変更(\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:1006 +msgid "Color change (\"%1%\") for Extruder %2%" +msgstr "エクストルーダー%2%の色の変更( \"%1%\")" + +#: src/slic3r/GUI/GLCanvas3D.cpp:995 +#, possible-c-format +msgid "Color change for Extruder %d at %.2f mm" +msgstr "エクストルーダー %d の色のチェンジを %.2f mmで行う。" + +#: 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/libslic3r/PrintConfig.cpp:260 +msgid "Colorprint height" +msgstr "カラープリント高" + +#: src/libslic3r/PrintConfig.cpp:990 +msgid "Combine infill every" +msgstr "インフィルをこれ毎に結合する" + +#: src/libslic3r/PrintConfig.cpp:995 +msgid "Combine infill every n layers" +msgstr "インフィルをnレイヤー組合わせる" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Commands" +msgstr "コマンド" + +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 +msgid "Comment:" +msgstr "コメント:" + +#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280 +msgid "Compatible print profiles" +msgstr "互換性のあるプリントプロファイル" + +#: src/libslic3r/PrintConfig.cpp:286 +msgid "Compatible print profiles condition" +msgstr "互換性のあるプリントプロファイル条件" + +#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265 +msgid "Compatible printers" +msgstr "互換プリンター" + +#: src/libslic3r/PrintConfig.cpp:271 +msgid "Compatible printers condition" +msgstr "互換性のあるプリンターのコンディション" + +#: src/libslic3r/PrintConfig.cpp:304 +msgid "Complete individual objects" +msgstr "個々のオブジェクトを完成させる" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:234 +msgid "Completed" +msgstr "完了" + +#: src/libslic3r/Zipper.cpp:54 +msgid "compression failed" +msgstr "圧縮失敗" + +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849 +msgid "Concentric" +msgstr "同心円" + +#: src/slic3r/GUI/ConfigWizard.cpp:2110 +msgid "Configuration &Assistant" +msgstr "セットアップガイド(&A)" + +#: src/slic3r/GUI/ConfigWizard.cpp:2113 +msgid "Configuration &Wizard" +msgstr "設定ウィザード(&W)" + +#: src/slic3r/GUI/ConfigWizard.cpp:2109 +msgid "Configuration Assistant" +msgstr "設定アシスタント" + +#: src/libslic3r/PrintConfig.cpp:1316 +msgid "Configuration notes" +msgstr "設定上の注意" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104 +msgid "Configuration Snapshots" +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:303 +msgid "Configuration updates" +msgstr "構成の更新" + +#: src/slic3r/GUI/ConfigWizard.cpp:2112 +msgid "Configuration Wizard" +msgstr "設定ウィザード" + +#: src/slic3r/GUI/FirmwareDialog.cpp:903 +msgid "Confirmation" +msgstr "確認" + +#: src/slic3r/GUI/Tab.cpp:1931 +msgid "Connection failed." +msgstr "接続失敗。" + +#: src/slic3r/GUI/Tab.cpp:3627 +msgid "Connection of the support sticks and junctions" +msgstr "サポートスティックとジャンクションの接続" + +#: src/slic3r/Utils/AstroBox.cpp:83 +msgid "Connection to AstroBox works correctly." +msgstr "AstroBoxへの接続は正常です。" + +#: src/slic3r/Utils/Duet.cpp:49 +msgid "Connection to Duet works correctly." +msgstr "Duetへの接続は機能しています。" + +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "FlashAir接続が正常に機能し、アップロードが有効になっています。" + +#: src/slic3r/Utils/OctoPrint.cpp:83 +msgid "Connection to OctoPrint works correctly." +msgstr "OctPrintとの接続成功。" + +#: src/slic3r/GUI/Tab.cpp:1928 +msgid "Connection to printer works correctly." +msgstr "プリンターとの接続成功。" + +#: src/slic3r/Utils/OctoPrint.cpp:176 +msgid "Connection to Prusa SL1 works correctly." +msgstr "Prusa SL1と正しく接続しました。" + +#: src/libslic3r/PrintConfig.cpp:1909 +msgid "Contact Z distance" +msgstr "Z軸上のサポートーオブジェクト間距離" + +#: src/slic3r/GUI/AboutDialog.cpp:261 +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/libslic3r/PrintConfig.cpp:2659 +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 "2つの隣接する柱のブリッジタイプを設定します。 2本の柱の距離に応じて、最初の2つを自動的に切り替えるジグザグ、クロス(ダブルジグザグ)、またはダイナミックにすることができます。" + +#: src/slic3r/GUI/Tab.cpp:1444 +msgid "Cooling" +msgstr "クーリング" + +#: src/libslic3r/PrintConfig.cpp:660 +msgid "Cooling moves are gradually accelerating beginning at this speed." +msgstr "クーリング動作はこのスピードから徐々に加速します。" + +#: src/libslic3r/PrintConfig.cpp:679 +msgid "Cooling moves are gradually accelerating towards this speed." +msgstr "冷却動作は、この速度に向かって徐々に加速しています。" + +#: src/slic3r/GUI/Tab.cpp:1465 +msgid "Cooling thresholds" +msgstr "クーリングしきい値" + +#: src/libslic3r/PrintConfig.cpp:327 +msgid "Cooling tube length" +msgstr "冷却チューブの長さ" + +#: src/libslic3r/PrintConfig.cpp:319 +msgid "Cooling tube position" +msgstr "冷却チューブ位置" + +#: src/slic3r/GUI/Plater.cpp:4752 +msgid "Copies of the selected object" +msgstr "選択したオブジェクトのコピー" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4505 +msgid "Copy" +msgstr "コピー" + +#: src/slic3r/GUI/MainFrame.cpp:589 +msgid "Copy selection to clipboard" +msgstr "選択をクリップボードにコピー" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 +msgid "Copy to clipboard" +msgstr "クリップボードにコピー" + +#: src/slic3r/GUI/SysInfoDialog.cpp:154 +msgid "Copy to Clipboard" +msgstr "クリップボードにコピー" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121 +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コードを開くことができませんでした。 出力Gコードは、%1%.tmpです。" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118 +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コードのコピーは完了しましたが、コピーチェック中に元のGコードの%1%を開くことができませんでした。 出力Gコードは、%2%.tmpです。" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:480 +msgid "Copying of the temporary G-code to the output G-code failed" +msgstr "一時Gコードから出力Gコードへのコピーに失敗しました" + +#: 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 "一時Gコードの出力Gコードへのコピーに失敗しました。 SDカードが書き込みロックされていませんか?" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112 +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/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256 +msgid "Copyright" +msgstr "コピーライト" + +#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572 +msgid "Correction for expansion" +msgstr "膨張補正" + +#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:3519 +msgid "Corrections" +msgstr "補正" + +#: src/slic3r/GUI/Plater.cpp:1243 src/libslic3r/PrintConfig.cpp:760 +#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511 +msgid "Cost" +msgstr "費用" + +#: src/slic3r/GUI/Plater.cpp:239 +msgid "Cost (money)" +msgstr "コスト(金額)" + +#: src/slic3r/GUI/Plater.cpp:2835 +msgid "Could not arrange model objects! Some geometries may be invalid." +msgstr "モデルオブジェクトを配置できませんでした! 一部のジオメトリが無効のようです。" + +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Could not connect to AstroBox" +msgstr "AstroBoxに接続できません" + +#: src/slic3r/Utils/Duet.cpp:54 +msgid "Could not connect to Duet" +msgstr "Duetに接続できませんでした" + +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "Could not connect to FlashAir" +msgstr "FlashAirに接続できませんでした" + +#: src/slic3r/Utils/OctoPrint.cpp:89 +msgid "Could not connect to OctoPrint" +msgstr "OctoPrintに接続できません" + +#: src/slic3r/Utils/OctoPrint.cpp:181 +msgid "Could not connect to Prusa SLA" +msgstr "Prusa SLAに接続できませんでした" + +#: src/slic3r/GUI/Tab.cpp:1687 +msgid "Could not get a valid Printer Host reference" +msgstr "有効なプリントサーバー参照を取得できません" + +#: src/slic3r/Utils/Duet.cpp:134 +msgid "Could not get resources to create a new connection" +msgstr "新しい接続を作成するためのリソースを取得できません" + +#: src/libslic3r/PrintConfig.cpp:1959 +msgid "Cover the top contact layer of the supports with loops. Disabled by default." +msgstr "ループでサポート上部の接触層を覆います。 デフォルトでは無効になっています。" + +#: src/libslic3r/PrintConfig.cpp:89 +msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low." +msgstr "ポリゴンメッシュのスライス中に、ギャップを閉じる半径の2倍より小さいクラックが埋められます。 ギャップを閉じることで、最終的なプリント解像度が低下する可能性があるため、この値は適度に小さくすることをお勧めします。" + +#: src/libslic3r/Zipper.cpp:58 +msgid "CRC-32 check failed" +msgstr "CRC-32チェックに失敗しました" + +#: src/libslic3r/PrintConfig.cpp:2857 +msgid "Create pad around object and ignore the support elevation" +msgstr "オブジェクトの周りにパッドを作成し、サポートでオブジェクトを上げることを無視します" + +#: src/libslic3r/PrintConfig.cpp:2724 +msgid "Critical angle" +msgstr "限界角" + +#: src/libslic3r/PrintConfig.cpp:2668 +msgid "Cross" +msgstr "クロス" + +#: src/libslic3r/PrintConfig.cpp:847 +msgid "Cubic" +msgstr "立方" + +#: src/slic3r/GUI/wxExtensions.cpp:704 +#, possible-c-format +msgid "Current mode is %s" +msgstr "現在のモードは%sです" + +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" +msgstr "現在のプリセット継承元" + +#: src/slic3r/GUI/Tab.cpp:957 +msgid "Current preset is inherited from the default preset." +msgstr "現在の設定はデフォルト設定から継承されます。" + +#: src/slic3r/GUI/UpdateDialogs.cpp:43 +msgid "Current version:" +msgstr "現在のバージョン:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249 +#: src/libslic3r/ExtrusionEntity.cpp:322 +msgid "Custom" +msgstr "カスタム" + +#: src/libslic3r/PrintConfig.cpp:112 +msgid "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. If left blank, the default OS CA certificate repository is used." +msgstr "HTTPS OctoPrint接続用にカスタムCA証明書ファイルをcrt/pem形式で指定できます。 空白のままにすると、デフォルトのOS CA証明書リポジトリが使用されます。" + +#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1975 +msgid "Custom G-code" +msgstr "カスタムGコード" + +#: src/slic3r/GUI/DoubleSlider.cpp:1619 +msgid "Custom G-code on current layer (%1% mm)." +msgstr "現在のレイヤーのカスタムGコード(%1%mm)。" + +#: src/slic3r/GUI/ConfigWizard.cpp:732 +msgid "Custom Printer" +msgstr "カスタムプリンター" + +#: src/slic3r/GUI/ConfigWizard.cpp:732 +msgid "Custom Printer Setup" +msgstr "カスタムプリンター設定" + +#: src/slic3r/GUI/ConfigWizard.cpp:736 +msgid "Custom profile name:" +msgstr "カスタムプロファイル名:" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3402 +msgid "Cut" +msgstr "カット" + +#: src/slic3r/GUI/Plater.cpp:4786 +msgid "Cut by Plane" +msgstr "面でカット" + +#: src/libslic3r/PrintConfig.cpp:3403 +msgid "Cut model at the given Z." +msgstr "指定されたZでモデルをカットします。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 +msgid "Cylinder" +msgstr "シリンダー" + +#: src/slic3r/GUI/MainFrame.cpp:568 +msgid "D&eselect all" +msgstr "全てを非選択状態に(&e)" + +#: src/libslic3r/PrintConfig.cpp:3504 +msgid "Data directory" +msgstr "データディレクトリー" + +#: src/slic3r/GUI/Mouse3DController.cpp:313 +msgid "Deadzone:" +msgstr "デッドゾーン:" + +#: src/libslic3r/Zipper.cpp:52 +msgid "decompression failed or archive is corrupted" +msgstr "解凍に失敗したか、アーカイブが破損しています" + +#: src/slic3r/GUI/Plater.cpp:4720 +msgid "Decrease Instances" +msgstr "インスタンスを減らす" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1704 src/libslic3r/PrintConfig.cpp:335 +msgid "Default" +msgstr "デフォルト" + +#: 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 +msgid "default" +msgstr "デフォルト" + +#: src/libslic3r/PrintConfig.cpp:777 +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 "インフィル(塗りつぶし)方向のデフォルトの角度。レイヤー毎に90°切替るクロスハッチングされます。 ブリッジはSlic3rが最適な方向を自動設定するため、この設定はブリッジ部分には影響しません。" + +#: src/libslic3r/PrintConfig.cpp:554 +msgid "Default extrusion width" +msgstr "デフォルト射出幅" + +#: src/slic3r/GUI/Tab.cpp:987 +msgid "default filament profile" +msgstr "デフォルトフィラメントプロファイル" + +#: src/libslic3r/PrintConfig.cpp:345 +msgid "Default filament profile" +msgstr "デフォルトフィラメントプロファイル" + +#: src/libslic3r/PrintConfig.cpp:346 +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/slic3r/GUI/Tab.cpp:2919 +#, possible-c-format +msgid "Default preset (%s)" +msgstr "デフォルトプリセット(%s)" + +#: src/slic3r/GUI/GLCanvas3D.cpp:904 src/slic3r/GUI/GLCanvas3D.cpp:933 +msgid "Default print color" +msgstr "デフォルトプリントカラー" + +#: src/slic3r/GUI/Tab.cpp:984 +msgid "default print profile" +msgstr "デフォルトプリントプロファイル" + +#: src/libslic3r/PrintConfig.cpp:352 +msgid "Default print profile" +msgstr "デフォルトプリントプロファイル" + +#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592 +#: src/libslic3r/PrintConfig.cpp:2603 +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/slic3r/GUI/Tab.cpp:1001 +msgid "default SLA material profile" +msgstr "デフォルトのSLA材料プロファイル" + +#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602 +msgid "Default SLA material profile" +msgstr "デフォルトのSLA材料プロファイル" + +#: src/slic3r/GUI/Tab.cpp:1005 +msgid "default SLA print profile" +msgstr "デフォルトのSLAプリントプロファイル" + +#: src/slic3r/GUI/Field.cpp:136 +msgid "default value" +msgstr "デフォルト値" + +#: src/slic3r/GUI/ConfigWizard.cpp:734 +msgid "Define a custom printer profile" +msgstr "カスタムプリンタープロファイルを定義する" + +#: src/libslic3r/PrintConfig.cpp:2798 +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/slic3r/GUI/GUI_ObjectList.cpp:346 +msgid "degenerate facets" +msgstr "縮退したファセット" + +#: src/libslic3r/PrintConfig.cpp:640 +msgid "Delay after unloading" +msgstr "アンロードした後の待ち時間" + +#: src/slic3r/GUI/Tab.cpp:3121 +msgid "delete" +msgstr "削除" + +#: 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 +msgid "Delete" +msgstr "削除" + +#: src/slic3r/GUI/MainFrame.cpp:575 +msgid "Delete &all" +msgstr "全て削除(&a)" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129 +#: src/slic3r/GUI/Plater.cpp:4669 +msgid "Delete all" +msgstr "全て削除" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2176 +msgid "Delete All Instances from Object" +msgstr "オブジェクトのすべてのインスタンスを削除" + +#: src/slic3r/GUI/DoubleSlider.cpp:1516 +msgid "Delete color change" +msgstr "色変更を削除" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 +msgid "Delete color change marker for current layer" +msgstr "現在のレイヤーの色変更マーカーを削除" + +#: src/slic3r/GUI/DoubleSlider.cpp:1519 +msgid "Delete custom G-code" +msgstr "カスタムG-コードを削除" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:539 +msgid "Delete drainage hole" +msgstr "ドレインホール(抜き穴)の除去" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2192 +msgid "Delete Height Range" +msgstr "高さ範囲を削除" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2246 +msgid "Delete Instance" +msgstr "インスタンス削除" + +#: src/slic3r/GUI/Plater.cpp:2712 +msgid "Delete Object" +msgstr "オブジェクト削除" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 +#, possible-c-format +msgid "Delete Option %s" +msgstr "オプション%s削除" + +#: src/slic3r/GUI/DoubleSlider.cpp:1518 +msgid "Delete pause print" +msgstr "プリント一時停止を削除" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +msgid "Delete selected" +msgstr "選択を削除します" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2830 +msgid "Delete Selected" +msgstr "選択を削除" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2693 +msgid "Delete Selected Item" +msgstr "選択したアイテムを削除" + +#: src/slic3r/GUI/Plater.cpp:4677 +msgid "Delete Selected Objects" +msgstr "選択オブジェクトの削除" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2152 +msgid "Delete Settings" +msgstr "設定削除" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2227 +msgid "Delete Subobject" +msgstr "サブオブジェクト削除" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631 +msgid "Delete support point" +msgstr "サポートポイントの削除" + +#: src/slic3r/GUI/Tab.cpp:134 +msgid "Delete this preset" +msgstr "このプリセットを削除" + +#: src/slic3r/GUI/DoubleSlider.cpp:1035 +msgid "Delete tick mark - Left click or press \"-\" key" +msgstr "マーカーの削除-マウスの左ボタンまたは「-」キー" + +#: src/slic3r/GUI/DoubleSlider.cpp:1517 +msgid "Delete tool change" +msgstr "ツールチェンジを削除" + +#: src/slic3r/GUI/MainFrame.cpp:576 +msgid "Deletes all objects" +msgstr "全てのオブジェクトを削除" + +#: src/slic3r/GUI/MainFrame.cpp:573 +msgid "Deletes the current selection" +msgstr "現在の選択を削除します" + +#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:2504 +msgid "Density" +msgstr "密度" + +#: src/libslic3r/PrintConfig.cpp:791 +msgid "Density of internal infill, expressed in the range 0% - 100%." +msgstr "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 +msgid "Dependencies" +msgstr "依存関係" + +#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613 +msgid "Deretraction Speed" +msgstr "待避からの復帰速度" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +msgid "Deselect all" +msgstr "全ての選択解除" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369 +msgid "Deselect by rectangle" +msgstr "方形で選択解除" + +#: src/slic3r/GUI/MainFrame.cpp:569 +msgid "Deselects all objects" +msgstr "全てのオブジェクトの選択解除" + +#: src/slic3r/GUI/Tab.cpp:963 +msgid "Detach from system preset" +msgstr "システムプリセットから取り外す" + +#: src/slic3r/GUI/Tab.cpp:984 +msgid "Detach preset" +msgstr "プリセットを切り離す" + +#: src/slic3r/GUI/Tab.cpp:3029 +msgid "Detached" +msgstr "取り外しました" + +#: src/libslic3r/PrintConfig.cpp:1373 +msgid "Detect bridging perimeters" +msgstr "ブリッジ外周の検出" + +#: src/libslic3r/PrintConfig.cpp:2075 +msgid "Detect single-width walls (parts where two extrusions don't fit and we need to collapse them into a single trace)." +msgstr "単一の線の太さ(2本の線が入れられず、1本の線で射出する必要がある部分)の壁を検出します。" + +#: src/libslic3r/PrintConfig.cpp:2073 +msgid "Detect thin walls" +msgstr "薄壁を検知" + +#: src/libslic3r/PrintConfig.cpp:3472 +msgid "Detect unconnected parts in the given model(s) and split them into separate objects." +msgstr "指定されたモデルで接続されていないパーツを検出し、それらを個別のオブジェクトに分割します。" + +#: src/slic3r/GUI/Plater.cpp:2368 +msgid "Detected advanced data" +msgstr "検出された高度なデータ" + +#: src/slic3r/GUI/Mouse3DController.cpp:289 +msgid "Device:" +msgstr "デバイス:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709 +msgid "Diameter" +msgstr "直径" + +#: src/libslic3r/PrintConfig.cpp:2694 +msgid "Diameter in mm of the pillar base" +msgstr "支柱ベースの直径(mm)" + +#: src/libslic3r/PrintConfig.cpp:2650 +msgid "Diameter in mm of the support pillars" +msgstr "サポート支柱の直径(mm)" + +#: src/libslic3r/PrintConfig.cpp:2622 +msgid "Diameter of the pointing side of the head" +msgstr "サポート先端の直径" + +#: src/slic3r/GUI/BedShapeDialog.cpp:94 +msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center." +msgstr "プリントベッドの直径。 原点(0,0)は中央にあるとみなされます。" + +#: src/libslic3r/PrintConfig.cpp:1639 +msgid "Direction" +msgstr "方向" + +#: src/libslic3r/PrintConfig.cpp:359 +msgid "Disable fan for the first" +msgstr "ファンをオフにする最初のレイヤー" + +#: src/libslic3r/PrintConfig.cpp:1349 +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/slic3r/GUI/DoubleSlider.cpp:952 +msgid "Discard all custom changes" +msgstr "すべてのカスタム変更を破棄" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1375 +msgid "Discard changes" +msgstr "変更取りやめ" + +#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2946 +msgid "Discard changes and continue anyway?" +msgstr "変更を破棄して続行しますか?" + +#: src/slic3r/GUI/Tab.cpp:2078 +msgid "Display" +msgstr "ディスプレイ" + +#: src/libslic3r/PrintConfig.cpp:2359 +msgid "Display height" +msgstr "ディスプレイの高さ" + +#: src/libslic3r/PrintConfig.cpp:2378 +msgid "Display horizontal mirroring" +msgstr "水平ディスプレイミラーリング" + +#: src/libslic3r/PrintConfig.cpp:2392 +msgid "Display orientation" +msgstr "ディスプレイの向き" + +#: src/slic3r/GUI/MainFrame.cpp:648 +msgid "Display the Print Host Upload Queue window" +msgstr "プリントサーバーのアップロードキュー画面を表示する" + +#: src/libslic3r/PrintConfig.cpp:2385 +msgid "Display vertical mirroring" +msgstr "垂直ミラーリングを表示する" + +#: src/libslic3r/PrintConfig.cpp:2353 +msgid "Display width" +msgstr "画面の幅" + +#: src/libslic3r/PrintConfig.cpp:377 +msgid "Distance between copies" +msgstr "コピー間の距離" + +#: src/libslic3r/PrintConfig.cpp:1680 +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:2882 +msgid "Distance between two connector sticks which connect the object and the generated pad." +msgstr "オブジェクトと生成されたパッドを接続する2つのコネクタスティック間の距離。" + +#: src/libslic3r/PrintConfig.cpp:1679 +msgid "Distance from object" +msgstr "オブジェクトからの距離" + +#: src/slic3r/GUI/BedShapeDialog.cpp:85 +msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle." +msgstr "四角形の左前隅からの0,0 Gコード座標の距離。" + +#: src/libslic3r/PrintConfig.cpp:320 +msgid "Distance of the center-point of the cooling tube from the extruder tip." +msgstr "ノズル先端から冷却チューブの中心までの距離。" + +#: src/libslic3r/PrintConfig.cpp:1382 +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:378 +msgid "Distance used for the auto-arrange feature of the plater." +msgstr "プレートの自動配置機能で使用される距離。" + +#: src/libslic3r/PrintConfig.cpp:3486 +msgid "Do not fail if a file supplied to --load does not exist." +msgstr "存在しない読込みが行われても提供されたファイルは失敗させない。" + +#: src/libslic3r/PrintConfig.cpp:3430 +msgid "Do not rearrange the given models before merging and keep their original XY coordinates." +msgstr "元のXY座標を残して、マージする前にモデルを再配置しないでください。" + +#: src/slic3r/GUI/Field.cpp:240 +#, 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 "%s%sではなく%s%%ですか?この値を%s %%に変更するなら「はい」を、%s%sでよろしいなら「いいえ」を選択してください。" + +#: src/slic3r/GUI/DoubleSlider.cpp:1920 +msgid "Do you want to delete all saved tool changes?" +msgstr "保存したツールの変更をすべて削除しますか?" + +#: src/slic3r/GUI/GUI_App.cpp:884 +msgid "Do you want to proceed?" +msgstr "続行しますか?" + +#: src/slic3r/GUI/Plater.cpp:3321 +msgid "Do you want to retry" +msgstr "リトライしますか" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1045 +msgid "Do you want to save your manually edited support points?" +msgstr "マニュアル編集したサポートポイントを保存しますか?" + +#: src/slic3r/GUI/ConfigWizard.cpp:1834 +msgid "Do you want to select default filaments for these FFF printer models?" +msgstr "これらのFFFプリンターモデルのデフォルトフィラメントを選択しますか?" + +#: src/slic3r/GUI/ConfigWizard.cpp:1852 +msgid "Do you want to select default SLA materials for these printer models?" +msgstr "これらのプリンターモデルにデフォルトのSLAマテリアルを選択しますか?" + +#: src/libslic3r/PrintConfig.cpp:3429 +msgid "Don't arrange" +msgstr "整列させない" + +#: src/slic3r/GUI/UpdateDialogs.cpp:71 +msgid "Don't notify about new releases any more" +msgstr "新しいリリースについて通知しない" + +#: src/libslic3r/PrintConfig.cpp:369 +msgid "Don't support bridges" +msgstr "ブリッジ部のサポート禁止" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 +msgid "Downgrade" +msgstr "ダウングレード" + +#: src/libslic3r/PrintConfig.cpp:1695 +msgid "Draft shield" +msgstr "保護シールド" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369 +msgid "Drag" +msgstr "ドラッグ" + +#: src/libslic3r/SLAPrintSteps.cpp:44 +msgid "Drilling holes into model." +msgstr "モデルに穴を開けます。" + +#: src/libslic3r/SLAPrintSteps.cpp:199 +msgid "Drilling holes into the mesh failed. This is usually caused by broken model. Try to fix it first." +msgstr "メッシュの穴あけに失敗しました。 これは通常、モデルの破損が原因です。 最初に修正してください。" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349 +msgid "Drop to bed" +msgstr "ベッドに落とす" + +#: src/libslic3r/PrintConfig.cpp:3433 +msgid "Duplicate" +msgstr "複製" + +#: src/libslic3r/PrintConfig.cpp:3438 +msgid "Duplicate by grid" +msgstr "グリッドで複製" + +#: src/slic3r/GUI/PresetHints.cpp:40 +msgid "During the other layers, fan" +msgstr "他のレイヤーの間、ファン" + +#: src/libslic3r/PrintConfig.cpp:2669 +msgid "Dynamic" +msgstr "動的" + +#: src/slic3r/GUI/MainFrame.cpp:749 +msgid "E&xport" +msgstr "エクスポート(&x)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:347 +msgid "edges fixed" +msgstr "エッジ修正" + +#: src/slic3r/GUI/DoubleSlider.cpp:1508 +msgid "Edit color" +msgstr "色を編集" + +#: src/slic3r/GUI/DoubleSlider.cpp:960 +msgid "Edit current color - Right click the colored slider segment" +msgstr "現在の色を編集-色付きのスライダーセグメントを右クリック" + +#: src/slic3r/GUI/DoubleSlider.cpp:1510 +msgid "Edit custom G-code" +msgstr "カスタムG-コードの編集" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3003 +msgid "Edit Height Range" +msgstr "高さ範囲の編集" + +#: src/slic3r/GUI/DoubleSlider.cpp:1509 +msgid "Edit pause print message" +msgstr "一時停止メッセージを編集" + +#: src/slic3r/GUI/DoubleSlider.cpp:1037 +msgid "Edit tick mark - Ctrl + Left click" +msgstr "マーカーの編集-Ctrl +マウスの左ボタン" + +#: src/slic3r/GUI/DoubleSlider.cpp:1038 +msgid "Edit tick mark - Right click" +msgstr "マーカーの編集-マウスの右ボタン" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:282 src/slic3r/GUI/GUI_ObjectList.cpp:394 +msgid "Editing" +msgstr "編集中" + +#: src/slic3r/GUI/MainFrame.cpp:547 +msgid "Ejec&t SD card / Flash drive" +msgstr "SDカード/USBメモリーを取り出す(&t)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Eject SD card / Flash drive" +msgstr "SDカード/USBメモリーを取り出す" + +#: src/slic3r/GUI/MainFrame.cpp:547 +msgid "Eject SD card / Flash drive after the G-code was exported to it." +msgstr "Gコードをエクスポートした後に、SDカード/USBメモリーを取り出します。" + +#: src/slic3r/GUI/Plater.cpp:2202 +#, possible-c-format +msgid "Ejecting of device %s(%s) has failed." +msgstr "デバイス %s(%s) の取り出しに失敗しました。" + +#: src/libslic3r/PrintConfig.cpp:118 +msgid "Elephant foot compensation" +msgstr "最初の層の広がり補正" + +#: src/libslic3r/PrintConfig.cpp:2447 +msgid "Elephant foot minimum width" +msgstr "エレファントフット(最下層がちょっと太る)の最小幅" + +#: src/libslic3r/SLAPrint.cpp:625 +msgid "Elevation is too low for object. Use the \"Pad around object\" feature to print the object without elevation." +msgstr "オブジェクトに対して持上げ高さが低すぎます。 「オブジェクトの周囲のパッド」機能を使用して、オブジェクトを持上げ高さなしでプリントします。" + +#: src/libslic3r/PrintConfig.cpp:1093 +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 "正確な残り時間を表示させるために、Gコードに1分間隔でM73 P [プリント率(%)] R [残り時間(分)]を埋め込みます。 現在のところ、M73を認識するのはPrusa i3 MK3ファームウェアのみです。 また、Prusa i3 MK3ファームウェアは、サイレントモードのM73 Qxx Sxxもサポートしています。" + +#: src/libslic3r/GCode.cpp:637 +msgid "Empty layers detected, the output would not be printable." +msgstr "空のレイヤーが検出されたため、モデルをプリントできませんでした。" + +#: src/slic3r/GUI/Tab.cpp:1445 src/libslic3r/PrintConfig.cpp:1355 +#: src/libslic3r/PrintConfig.cpp:2200 +msgid "Enable" +msgstr "有効" + +#: src/libslic3r/PrintConfig.cpp:313 +msgid "Enable auto cooling" +msgstr "自動クーリングを有効化する" + +#: src/libslic3r/PrintConfig.cpp:572 +msgid "Enable fan if layer print time is below" +msgstr "レイヤーのプリント時間がこれ以下の場合にファンをオンにします" + +#: src/libslic3r/PrintConfig.cpp:2908 +msgid "Enable hollowing" +msgstr "くり抜きを有効にする" + +#: src/libslic3r/PrintConfig.cpp:2380 +msgid "Enable horizontal mirroring of output images" +msgstr "出力画像の水平ミラーリングを有効にします" + +#: src/libslic3r/PrintConfig.cpp:1867 +msgid "Enable support material generation." +msgstr "サポート材生成の有効化。" + +#: src/libslic3r/PrintConfig.cpp:966 +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プラグインに役立ちます。 この設定は、単一エクストルーダーのマルチマテリアル構成およびオブジェクト内ワイプのノズルクリーニング機能と互換性がありません。" + +#: src/libslic3r/PrintConfig.cpp:929 +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:2186 +msgid "Enable variable layer height feature" +msgstr "可変レイヤー高さ機能を有効にする" + +#: src/libslic3r/PrintConfig.cpp:2387 +msgid "Enable vertical mirroring of output images" +msgstr "出力イメージの垂直ミラーリングをオンにします" + +#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:1982 +#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 +msgid "End G-code" +msgstr "終了Gコード" + +#: src/libslic3r/PrintConfig.cpp:1924 +msgid "Enforce support for the first" +msgstr "最初のサポートを強制" + +#: src/libslic3r/PrintConfig.cpp:1931 +msgid "Enforce support for the first n layers" +msgstr "最初のnレイヤーのサポートを強制します" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:198 +#: src/slic3r/GUI/PrintHostDialogs.cpp:229 +msgid "Enqueued" +msgstr "キュー追加済み" + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "Ensure vertical shell thickness" +msgstr "垂直壁の厚さを確認する" + +#: src/slic3r/GUI/DoubleSlider.cpp:1618 +msgid "Enter custom G-code used on current layer" +msgstr "クリーニングタワーは、すべてのオブジェクトのレイヤー高さが同じである場合にのみサポートされます" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3803 +msgid "Enter new name" +msgstr "新しい名前を入力" + +#: src/slic3r/GUI/DoubleSlider.cpp:1634 +msgid "Enter short message shown on Printer display when a print is paused" +msgstr "プリントが一時停止されたときにプリンターディスプレイに表示される短いメッセージを入力します" + +#: src/slic3r/GUI/ConfigWizard.cpp:1047 +msgid "Enter the bed temperature needed for getting your filament to stick to your heated bed." +msgstr "フィラメントをベッドに確実に付着させるために必要なベッド温度を入力します。" + +#: src/slic3r/GUI/ConfigWizard.cpp:979 +msgid "Enter the diameter of your filament." +msgstr "フィラメント径を入力します。" + +#: src/slic3r/GUI/ConfigWizard.cpp:966 +msgid "Enter the diameter of your printer's hot end nozzle." +msgstr "プリンターのホットエンドノズルの直径を入力します。" + +#: src/slic3r/GUI/DoubleSlider.cpp:1650 +msgid "Enter the height you want to jump to" +msgstr "ジャンプしたい高さを入力" + +#: src/slic3r/GUI/Plater.cpp:4751 +msgid "Enter the number of copies:" +msgstr "コピー数を入力:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1033 +msgid "Enter the temperature needed for extruding your filament." +msgstr "フィラメントを押し出すのに必要な温度を入力します。" + +#: src/libslic3r/PrintConfig.cpp:761 +msgid "Enter your filament cost per kg here. This is only for statistical information." +msgstr "ここに1kgあたりのフィラメント価格を入力します。 プリント情報表示に使われます。" + +#: src/libslic3r/PrintConfig.cpp:718 +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:710 +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/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:785 +#: src/slic3r/GUI/PrintHostDialogs.cpp:231 +msgid "Error" +msgstr "エラー" + +#: src/slic3r/GUI/FirmwareDialog.cpp:645 +#, possible-c-format +msgid "Error accessing port at %s: %s" +msgstr "%sポートへのアクセスエラー:%s" + +#: src/slic3r/GUI/Plater.cpp:3433 +msgid "Error during reload" +msgstr "リロード中にエラー発生" + +#: src/slic3r/GUI/Plater.cpp:5043 +#, possible-c-format +msgid "Error exporting 3MF file %s" +msgstr "3MFファイル%sのエクスポートエラー" + +#: src/slic3r/GUI/Plater.cpp:5005 +#, possible-c-format +msgid "Error exporting AMF file %s" +msgstr "AMFファイル%sのエクスポートエラー" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:154 +msgid "Error Message" +msgstr "エラーメッセージ" + +#: src/slic3r/GUI/AppConfig.cpp:114 +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/PrintHostDialogs.cpp:272 +msgid "Error uploading to print host:" +msgstr "プリントサーバーへのアップロードエラー:" + +#: src/libslic3r/Zipper.cpp:102 +msgid "Error with zip archive" +msgstr "zipアーカイブのエラー" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1918 +msgid "Error!" +msgstr "エラー!" + +#: src/slic3r/GUI/BedShapeDialog.cpp:505 +msgid "Error! Invalid model" +msgstr "エラー!無効なモデル" + +#: src/slic3r/GUI/FirmwareDialog.cpp:647 +#, possible-c-format +msgid "Error: %s" +msgstr "エラー: %s" + +#: src/slic3r/GUI/Job.hpp:123 +msgid "ERROR: not enough resources to execute a new job." +msgstr "エラー:新しいジョブを実行するのに十分なリソースがありません。" + +#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1216 +#: src/slic3r/GUI/Plater.cpp:1258 +msgid "Estimated printing time" +msgstr "予測プリント時間" + +#: src/slic3r/GUI/Plater.cpp:502 +msgid "Everywhere" +msgstr "どこでも" + +#: src/slic3r/GUI/PresetHints.cpp:51 +msgid "except for the first %1% layers." +msgstr "最初の%1%レイヤーを除きます。" + +#: src/slic3r/GUI/PresetHints.cpp:53 +msgid "except for the first layer." +msgstr "最初のレイヤーを除きます。" + +#: src/libslic3r/Print.cpp:1377 +msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" +msgstr "ノズル径%3% mmで過剰な%1%=%2% mmをプリント可能" + +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 +#, possible-c-format +msgid "Exit %s" +msgstr "%s終了" + +#: src/libslic3r/PrintConfig.cpp:371 +msgid "Experimental option for preventing support material from being generated under bridged areas." +msgstr "ブリッジエリアでサポート材の生成をしない試用的オプション。" + +#: src/libslic3r/PrintConfig.cpp:1375 +msgid "Experimental option to adjust flow for overhangs (bridge flow will be used), to apply bridge speed to them and enable fan." +msgstr "オーバーハング時の流量を調整する試用的なオプション(ブリッジ流量が使用されます)、ブリッジ速度を適用してファンを有効にします。" + +#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755 +msgid "Expert" +msgstr "高度" + +#: src/slic3r/GUI/ConfigWizard.cpp:822 +msgid "Expert mode" +msgstr "エキスパートモード" + +#: src/slic3r/GUI/GUI_App.cpp:815 +msgid "Expert View Mode" +msgstr "エキスパートビューモード" + +#: src/slic3r/GUI/Plater.cpp:5521 +msgid "Export" +msgstr "エクスポート" + +#: src/slic3r/GUI/MainFrame.cpp:500 +msgid "Export &Config" +msgstr "設定のエクスポート(&C)" + +#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:749 +msgid "Export &G-code" +msgstr "Gコードのエクスポート(&G)" + +#: src/slic3r/GUI/MainFrame.cpp:496 +msgid "Export &toolpaths as OBJ" +msgstr "ツールパスをOBJとしてエクスポート(&t)" + +#: src/libslic3r/PrintConfig.cpp:3338 +msgid "Export 3MF" +msgstr "3MFのエクスポート" + +#: src/slic3r/GUI/MainFrame.cpp:503 +msgid "Export all presets to file" +msgstr "すべてのプリセットをファイルにエクスポートします" + +#: src/libslic3r/PrintConfig.cpp:3343 +msgid "Export AMF" +msgstr "AMFのエクスポート" + +#: src/slic3r/GUI/Plater.cpp:2598 +msgid "Export AMF file:" +msgstr "AMFファイルのエクスポート:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1657 src/slic3r/GUI/Plater.cpp:3966 +msgid "Export as STL" +msgstr "STLとしてエクスポート" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +msgid "Export config" +msgstr "構成のエクスポート" + +#: src/slic3r/GUI/MainFrame.cpp:503 +msgid "Export Config &Bundle" +msgstr "設定とバンドルのエクスポート(&B)" + +#: src/slic3r/GUI/MainFrame.cpp:500 +msgid "Export current configuration to file" +msgstr "現在の構成をファイルにエクスポート" + +#: src/slic3r/GUI/MainFrame.cpp:492 +msgid "Export current plate as AMF" +msgstr "現在のプレートをAMFとしてエクスポート" + +#: src/slic3r/GUI/MainFrame.cpp:477 +msgid "Export current plate as G-code" +msgstr "現在のプレートをGコードとしてエクスポート" + +#: src/slic3r/GUI/MainFrame.cpp:521 +msgid "Export current plate as G-code to SD card / Flash drive" +msgstr "現在のプレートをGコードとしてSDカード/USBメモリーにエクスポート" + +#: src/slic3r/GUI/MainFrame.cpp:486 +msgid "Export current plate as STL" +msgstr "現在のプレートをSTLとしてエクスポート" + +#: src/slic3r/GUI/MainFrame.cpp:489 +msgid "Export current plate as STL including supports" +msgstr "サポートを含むSTLとして現在のプレートをエクスポート" + +#: src/slic3r/GUI/Plater.cpp:3664 +msgid "Export failed" +msgstr "エクスポート失敗" + +#: src/slic3r/GUI/ConfigWizard.cpp:801 +msgid "Export full pathnames of models and parts sources into 3mf and amf files" +msgstr "モデルのフルパス名とパーツソースを3mfおよびamfファイルにエクスポートする" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:891 +#: src/slic3r/GUI/Plater.cpp:5521 src/libslic3r/PrintConfig.cpp:3353 +msgid "Export G-code" +msgstr "Gコードのエクスポート" + +#: src/slic3r/GUI/MainFrame.cpp:521 +msgid "Export G-code to SD card / Flash drive" +msgstr "GコードをSDカード/USBメモリーにエクスポート" + +#: src/libslic3r/PrintConfig.cpp:3320 +msgid "Export OBJ" +msgstr "OBJのエクスポート" + +#: src/slic3r/GUI/Plater.cpp:2610 +msgid "Export OBJ file:" +msgstr "OBJファイルのエクスポート :" + +#: src/slic3r/Utils/FixModelByWin10.cpp:368 +msgid "Export of a temporary 3mf file failed" +msgstr "3MFの一時ファイルのエクスポートに失敗しました" + +#: src/slic3r/GUI/MainFrame.cpp:492 +msgid "Export plate as &AMF" +msgstr "プレートをAMFとしてエクスポート(&A)" + +#: src/slic3r/GUI/MainFrame.cpp:486 +msgid "Export plate as &STL" +msgstr "プレートをSTLとしてエクスポート(&S)" + +#: src/slic3r/GUI/MainFrame.cpp:489 +msgid "Export plate as STL &including supports" +msgstr "サポートを含むSTLとしてプレートをエクスポート(&i)" + +#: src/libslic3r/PrintConfig.cpp:3332 +msgid "Export SLA" +msgstr "SLAのエクスポート" + +#: src/slic3r/GUI/Preferences.cpp:72 +msgid "Export sources full pathnames to 3mf and amf" +msgstr "ソースのフルパス名を3mfおよびamfにエクスポートする" + +#: src/libslic3r/PrintConfig.cpp:3348 +msgid "Export STL" +msgstr "STLのエクスポート" + +#: src/slic3r/GUI/Plater.cpp:2591 +msgid "Export STL file:" +msgstr "STLファイルのエクスポート :" + +#: src/libslic3r/PrintConfig.cpp:3339 +msgid "Export the model(s) as 3MF." +msgstr "モデルを3MFとしてエクスポートします。" + +#: src/libslic3r/PrintConfig.cpp:3344 +msgid "Export the model(s) as AMF." +msgstr "モデルをAMF形式でエクスポート。" + +#: src/libslic3r/PrintConfig.cpp:3321 +msgid "Export the model(s) as OBJ." +msgstr "モデルをOBJとしてエクスポート。" + +#: src/libslic3r/PrintConfig.cpp:3349 +msgid "Export the model(s) as STL." +msgstr "STLとしてモデルをエクスポート。" + +#: src/slic3r/GUI/Plater.cpp:3966 +msgid "Export the selected object as STL file" +msgstr "選択したオブジェクトをSTL形式でエクスポートします" + +#: src/slic3r/GUI/Plater.cpp:880 +msgid "Export to SD card / Flash drive" +msgstr "SDカード/Flashドライブにエクスポート" + +#: src/slic3r/GUI/MainFrame.cpp:496 +msgid "Export toolpaths as OBJ" +msgstr "ツールパスをOBJとしてエクスポート" + +#: src/libslic3r/Print.cpp:1638 +msgid "Exporting G-code" +msgstr "Gコードのエクスポート" + +#: src/slic3r/Utils/FixModelByWin10.cpp:341 +msgid "Exporting model..." +msgstr "モデルのエクスポート中..." + +#: src/slic3r/Utils/FixModelByWin10.cpp:219 +#: src/slic3r/Utils/FixModelByWin10.cpp:359 +msgid "Exporting source model" +msgstr "ソースモデルのエクスポート" + +#: src/libslic3r/SLAPrint.cpp:646 +msgid "Exposition time is out of printer profile bounds." +msgstr "露光時間がプリンタープロファイルの範囲外です。" + +#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:3515 +msgid "Exposure" +msgstr "露光" + +#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542 +msgid "Exposure time" +msgstr "露光時間" + +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311 +msgid "External perimeter" +msgstr "最外周" + +#: src/slic3r/GUI/PresetHints.cpp:156 +msgid "external perimeters" +msgstr "最外周" + +#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457 +msgid "External perimeters" +msgstr "最外周" + +#: src/libslic3r/PrintConfig.cpp:469 +msgid "External perimeters first" +msgstr "最外周を先にプリント" + +#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596 +msgid "Extra length on restart" +msgstr "追加の戻り距離" + +#: src/libslic3r/PrintConfig.cpp:1390 +msgid "Extra loading distance" +msgstr "追加ローディング長さ" + +#: src/libslic3r/PrintConfig.cpp:477 +msgid "Extra perimeters if needed" +msgstr "必要に応じて外周を追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1434 +#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487 +msgid "Extruder" +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:1704 +#: src/slic3r/GUI/Tab.cpp:2320 src/libslic3r/GCode/PreviewData.cpp:445 +#, possible-c-format +msgid "Extruder %d" +msgstr "エクストルーダー %d" + +#: src/slic3r/GUI/DoubleSlider.cpp:1011 +msgid "Extruder (tool) is changed to Extruder \"%1%\"" +msgstr "エクストルーダー(ツール)がエクストルーダー\"%1%\"に変更されます" + +#: src/slic3r/GUI/ConfigWizard.cpp:1017 +msgid "Extruder and Bed Temperatures" +msgstr "エクストルーダーとベッド温度" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 +msgid "Extruder changed to" +msgstr "エクストルーダーを変更" + +#: src/slic3r/GUI/Tab.cpp:1233 +msgid "Extruder clearance (mm)" +msgstr "エクストルーダーのクリアランス(mm)" + +#: src/libslic3r/PrintConfig.cpp:522 +msgid "Extruder Color" +msgstr "エクストルーダーカラー" + +#: src/libslic3r/PrintConfig.cpp:529 +msgid "Extruder offset" +msgstr "エクストルーダーのオフセット" + +#: 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 "最初のレイヤーのエクストルーダー温度。 プリント中に温度をマニュアル制御する場合は、これをゼロに設定して、出力ファイルの温度制御コマンドを無効にします。" + +#: 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 "最初のレイヤー以降のレイヤーのエクストルーダー温度。 出力の温度制御コマンドを無効にするには、これをゼロに設定します。" + +#: 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 +msgid "Extruders" +msgstr "エクストルーダー" + +#: src/libslic3r/PrintConfig.cpp:539 +msgid "Extrusion axis" +msgstr "射出軸" + +#: src/libslic3r/PrintConfig.cpp:545 +msgid "Extrusion multiplier" +msgstr "射出率" + +#: src/slic3r/GUI/ConfigWizard.cpp:1037 +msgid "Extrusion Temperature:" +msgstr "射出温度:" + +#: src/slic3r/GUI/Tab.cpp:1205 +msgid "Extrusion width" +msgstr "射出幅" + +#: 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 +msgid "Extrusion Width" +msgstr "射出幅" + +#: src/slic3r/GUI/Plater.cpp:162 +msgid "Facets" +msgstr "面" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:349 +msgid "facets added" +msgstr "追加されたファセット" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:348 +msgid "facets removed" +msgstr "削除されたファセット" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:350 +msgid "facets reversed" +msgstr "ファセットが反転しました" + +#: src/libslic3r/PrintConfig.cpp:2517 +msgid "Faded layers" +msgstr "初期露出レイヤー" + +#: src/libslic3r/Zipper.cpp:44 +msgid "failed finding central directory" +msgstr "基準ディレクトリの検索に失敗しました" + +#: src/slic3r/Utils/FixModelByWin10.cpp:235 +msgid "Failed loading the input model." +msgstr "入力モデルの読み込みに失敗しました。" + +#: src/libslic3r/PrintBase.cpp:71 +msgid "Failed processing of the output_filename_format template." +msgstr "output_filename_formatの処理に失敗しました。" + +#: src/slic3r/GUI/PresetHints.cpp:42 +msgid "Fan" +msgstr "ファン" + +#: src/slic3r/GUI/Tab.cpp:1456 +msgid "Fan settings" +msgstr "ファン設定" + +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1457 +msgid "Fan speed" +msgstr "ファンスピード" + +#: src/libslic3r/GCode/PreviewData.cpp:353 +msgid "Fan Speed (%)" +msgstr "ファンスピード(%)" + +#: src/libslic3r/PrintConfig.cpp:2405 +msgid "Fast" +msgstr "早い" + +#: src/libslic3r/PrintConfig.cpp:2406 +msgid "Fast tilt" +msgstr "早いチルト" + +#: src/slic3r/GUI/GUI_App.cpp:141 +msgid "Fatal error" +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:234 src/slic3r/GUI/GUI_Preview.cpp:235 +msgid "Feature types" +msgstr "射出の種類" + +#: src/slic3r/GUI/ConfigWizard.cpp:1525 +msgid "FFF Technology Printers" +msgstr "FFF型プリンター" + +#: src/slic3r/GUI/Plater.cpp:816 src/slic3r/GUI/Tab.cpp:1425 +#: src/slic3r/GUI/Tab.cpp:1426 +msgid "Filament" +msgstr "フィラメント" + +#: src/slic3r/GUI/Preset.cpp:1522 +msgid "filament" +msgstr "フィラメント" + +#: src/slic3r/GUI/ConfigWizard.cpp:952 +msgid "Filament and Nozzle Diameters" +msgstr "フィラメントとノズル径" + +#: src/slic3r/GUI/ConfigWizard.cpp:983 +msgid "Filament Diameter:" +msgstr "フィラメント径:" + +#: src/libslic3r/PrintConfig.cpp:651 +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:686 +msgid "Filament load time" +msgstr "フィラメントのローディング時間" + +#: src/libslic3r/PrintConfig.cpp:588 +msgid "Filament notes" +msgstr "フィラメントメモ" + +#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1378 +msgid "Filament Overrides" +msgstr "フィラメント上書き" + +#: src/libslic3r/PrintConfig.cpp:1381 +msgid "Filament parking position" +msgstr "フィラメント待避ポジション" + +#: src/slic3r/GUI/ConfigWizard.cpp:2013 +msgid "Filament Profiles Selection" +msgstr "フィラメントプロファイルの選択" + +#: src/slic3r/GUI/Tab.cpp:1471 +msgid "Filament properties" +msgstr "フィラメント特性" + +#: src/slic3r/GUI/Tab.hpp:355 +msgid "Filament Settings" +msgstr "フィラメント設定" + +#: src/libslic3r/PrintConfig.cpp:726 +msgid "Filament type" +msgstr "フィラメントの種類" + +#: src/libslic3r/PrintConfig.cpp:701 +msgid "Filament unload time" +msgstr "フィラメントアンロード時間" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +msgid "filaments" +msgstr "フィラメント" + +#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2013 +msgid "Filaments" +msgstr "フィラメント" + +#: src/libslic3r/Zipper.cpp:72 +msgid "file close failed" +msgstr "ファイルのクローズに失敗しました" + +#: src/libslic3r/Zipper.cpp:66 +msgid "file create failed" +msgstr "ファイルの作成に失敗しました" + +#: src/slic3r/GUI/MainFrame.cpp:791 +msgid "File Not Found" +msgstr "ファイルが見つかりません" + +#: src/libslic3r/Zipper.cpp:86 +msgid "file not found" +msgstr "ファイルがありません" + +#: src/libslic3r/Zipper.cpp:64 +msgid "file open failed" +msgstr "ファイルオープンエラー" + +#: src/libslic3r/Zipper.cpp:70 +msgid "file read failed" +msgstr "ファイルの読込に失敗しました" + +#: src/libslic3r/Zipper.cpp:74 +msgid "file seek failed" +msgstr "ファイル検索に失敗" + +#: src/libslic3r/Zipper.cpp:76 +msgid "file stat failed" +msgstr "ファイル情報失敗" + +#: src/libslic3r/Zipper.cpp:36 +msgid "file too large" +msgstr "ファイルが大きすぎます" + +#: src/libslic3r/Zipper.cpp:68 +msgid "file write failed" +msgstr "ファイルの書き込みに失敗しました" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:153 +msgid "Filename" +msgstr "ファイル名" + +#: src/libslic3r/PrintConfig.cpp:775 +msgid "Fill angle" +msgstr "塗りつぶし角" + +#: src/libslic3r/PrintConfig.cpp:789 +msgid "Fill density" +msgstr "充填密度" + +#: src/libslic3r/PrintConfig.cpp:826 +msgid "Fill pattern" +msgstr "インフィルパターン" + +#: src/libslic3r/PrintConfig.cpp:437 +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:828 +msgid "Fill pattern for general low-density infill." +msgstr "一般的な低密度インフィルのパターン。" + +#: src/libslic3r/PrintConfig.cpp:417 +msgid "Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells." +msgstr "トップレイヤーのインフィル(塗りつぶし)パターン。 これは最上層レイヤーにのみに適用され、それ以外のソリッドシェル(塗りつぶし)には影響しません。" + +#: src/slic3r/GUI/BonjourDialog.cpp:225 +msgid "Finished" +msgstr "完了" + +#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1947 +msgid "Firmware" +msgstr "ファームウェア" + +#: src/slic3r/GUI/FirmwareDialog.cpp:777 +msgid "Firmware flasher" +msgstr "ファームウェア更新" + +#: src/slic3r/GUI/FirmwareDialog.cpp:802 +msgid "Firmware image:" +msgstr "ファームウェアイメージ:" + +#: src/slic3r/GUI/Tab.cpp:2577 +msgid "Firmware Retraction" +msgstr "ファームウェア引き込み" + +#: src/slic3r/GUI/ConfigWizard.cpp:891 +msgid "Firmware Type" +msgstr "ファームウェアタイプ" + +#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868 +#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910 +msgid "First layer" +msgstr "1番目のレイヤー" + +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889 +msgid "First layer height" +msgstr "最初のレイヤー高さ" + +#: src/libslic3r/Print.cpp:1422 +msgid "First layer height can't be greater than nozzle diameter" +msgstr "最初のレイヤー高は、ノズルの直径より大きくすることはできません" + +#: src/libslic3r/PrintConfig.cpp:900 +msgid "First layer speed" +msgstr "最初のレイヤーの速度" + +#: src/slic3r/GUI/PresetHints.cpp:219 +msgid "First layer volumetric" +msgstr "最初のレイヤーの体積押出し" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 +msgid "Fix through the Netfabb" +msgstr "Netfabbで修正" + +#: src/slic3r/GUI/Plater.cpp:3473 +msgid "Fix Throught NetFabb" +msgstr "NetFabbで修正" + +#: src/slic3r/GUI/GUI_App.cpp:824 +msgid "Flash printer &firmware" +msgstr "firmwareをプリンタに書込む(&f)" + +#: src/slic3r/GUI/FirmwareDialog.cpp:150 +msgid "Flash!" +msgstr "書込み!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:284 +msgid "Flashing cancelled." +msgstr "書込み中止。" + +#: src/slic3r/GUI/FirmwareDialog.cpp:199 +msgid "Flashing failed" +msgstr "アップロード失敗" + +#: src/slic3r/GUI/FirmwareDialog.cpp:283 +msgid "Flashing failed. Please see the avrdude log below." +msgstr "更新に失敗しました。 以下のavrdudeログを参照してください。" + +#: src/slic3r/GUI/FirmwareDialog.cpp:152 +msgid "Flashing in progress. Please do not disconnect the printer!" +msgstr "更新中。 プリンターの接続を切らないでください!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:282 +msgid "Flashing succeeded!" +msgstr "更新完了!" + +#: src/slic3r/GUI/Tab.cpp:1218 +msgid "Flow" +msgstr "移動" + +#: src/slic3r/GUI/PresetHints.cpp:220 +msgid "flow rate is maximized" +msgstr "最大送り量になります" + +#: src/slic3r/GUI/UpdateDialogs.cpp:286 +msgid "For more information please visit our wiki page:" +msgstr "詳細については、Wikiページをご覧ください:" + +#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Plater.cpp:624 +msgid "For support enforcers only" +msgstr "強制サポートのみ" + +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3267 +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 "左ボタンの場合:システム(デフォルト)プリセットでないことを示し、\n右側ボタンの場合:設定が変更されていないことを示します。" + +#: src/slic3r/GUI/ConfigManipulation.cpp:136 +msgid "For the Wipe Tower to work with the soluble supports, the support layers\nneed to be synchronized with the object layers." +msgstr "ワイプタワーを可溶性のサポートと連携させるには、\nサポートレイヤーをオブジェクトレイヤーと同期させる必要があります。" + +#: src/libslic3r/Print.cpp:1396 +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/PrintConfig.cpp:2864 +msgid "Force pad around object everywhere" +msgstr "オブジェクト全体にパッドを強制" + +#: src/libslic3r/PrintConfig.cpp:1729 +msgid "Force solid infill for regions having a smaller area than the specified threshold." +msgstr "指定されたしきい値よりも小さい領域を、ソリッドインフィル(塗りつぶし)にします。" + +#: src/libslic3r/PrintConfig.cpp:1072 +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/slic3r/GUI/WipeTowerDialog.cpp:300 +msgid "From" +msgstr "前のエクストルーダー" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2223 +msgid "From Object List You can't delete the last solid part from object." +msgstr "オブジェクトリストからオブジェクトの最後のパートを削除することはできません。" + +#: src/slic3r/GUI/MainFrame.cpp:667 +msgid "Front" +msgstr "正面" + +#: src/slic3r/GUI/MainFrame.cpp:667 +msgid "Front View" +msgstr "正面" + +#: src/slic3r/GUI/Tab.cpp:1013 +msgid "full profile name" +msgstr "完全なプロファイル名" + +#: src/slic3r/GUI/MainFrame.cpp:826 +msgid "G-code" +msgstr "Gコード" + +#: src/slic3r/GUI/DoubleSlider.cpp:1021 +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コードは、プリントモードと競合しています。\n編集すると、スライダーデータが変更されます。" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:130 +msgid "G-code file exported to %1%" +msgstr "Gコードファイルを%1%にエクスポートしました" + +#: src/libslic3r/PrintConfig.cpp:936 +msgid "G-code flavor" +msgstr "Gコード型" + +#: src/libslic3r/PrintConfig.cpp:721 +msgid "g/cm³" +msgstr "g/cm³" + +#: src/libslic3r/PrintConfig.cpp:2505 +msgid "g/ml" +msgstr "g/ml" + +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/PrintConfig.cpp:918 +msgid "Gap fill" +msgstr "ギャップフィル" + +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1796 +#: src/slic3r/GUI/Tab.cpp:2040 +msgid "General" +msgstr "全般" + +#: src/libslic3r/PrintConfig.cpp:1307 +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 "1番目のレイヤーで指定された量のフィラメントを射出するためにスカート(パーツを囲むアウトライン)周回数を設定を超えて生成します。 マルチエクストルーダーの場合、この最小値は各エクストルーダーに適用されます。" + +#: src/libslic3r/PrintConfig.cpp:1865 +msgid "Generate support material" +msgstr "サポート材の生成" + +#: src/libslic3r/PrintConfig.cpp:1926 +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:2613 +msgid "Generate supports" +msgstr "サポート生成" + +#: src/libslic3r/PrintConfig.cpp:2615 +msgid "Generate supports for the models" +msgstr "モデルのサポートを生成する" + +#: src/libslic3r/Print.cpp:1614 +msgid "Generating brim" +msgstr "ブリム生成" + +#: src/libslic3r/Print.cpp:1642 +msgid "Generating G-code" +msgstr "Gコード作成中" + +#: src/libslic3r/SLAPrintSteps.cpp:48 +msgid "Generating pad" +msgstr "パッド生成" + +#: src/libslic3r/PrintObject.cpp:152 +msgid "Generating perimeters" +msgstr "境界線の生成中" + +#: src/libslic3r/Print.cpp:1606 +msgid "Generating skirt" +msgstr "スカート生成" + +#: src/libslic3r/PrintObject.cpp:395 +msgid "Generating support material" +msgstr "サポート材の生成" + +#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356 +msgid "Generating support points" +msgstr "サポートポイントの生成" + +#: src/libslic3r/SLAPrintSteps.cpp:47 +msgid "Generating support tree" +msgstr "サポートツリーの生成" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2022 +msgid "Generic" +msgstr "一般" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 +msgid "Gizmo cut" +msgstr "ギズモカット" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +msgid "Gizmo move" +msgstr "ギズモ移動" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 +msgid "Gizmo Place face on bed" +msgstr "ベッド面にギズモ配置" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +msgid "Gizmo rotate" +msgstr "ギズモ回転" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +msgid "Gizmo scale" +msgstr "ギズモ縮尺" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +msgid "Gizmo SLA hollow" +msgstr "ギズモSLAくり抜き" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +msgid "Gizmo SLA support points" +msgstr "ギズモ-SLAサポートポイント" + +#: src/slic3r/GUI/GLCanvas3D.cpp:2921 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 +msgid "Gizmo-Move" +msgstr "ギズモ移動" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:489 +msgid "Gizmo-Place on Face" +msgstr "ギズモ-面に配置" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3001 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:564 +msgid "Gizmo-Rotate" +msgstr "ギズモ-回転" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:563 +msgid "Gizmo-Scale" +msgstr "ギズモ-縮尺" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +msgid "Gizmos" +msgstr "ギズモ" + +#: src/slic3r/GUI/AboutDialog.cpp:259 +msgid "GNU Affero General Public License, version 3" +msgstr "GNU Affero General Public License, version 3 (AGPL v3)" + +#: src/slic3r/GUI/ConfigWizard.cpp:980 +msgid "Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average." +msgstr "高い精度が必要なため、ノギスを使用して何カ所かフィラメントの測定を行い、直径を計算します。" + +#: src/libslic3r/PrintConfig.cpp:844 +msgid "Grid" +msgstr "グリッド" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2454 +msgid "Group manipulation" +msgstr "グループ操作" + +#: src/slic3r/GUI/Preferences.cpp:133 +msgid "GUI" +msgstr "GUI" + +#: src/libslic3r/PrintConfig.cpp:852 +msgid "Gyroid" +msgstr "ジャイロイド" + +#: src/slic3r/GUI/Tab.cpp:2937 +msgid "has the following unsaved changes:" +msgstr "次の未保存の変更があります:" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +msgid "Head diameter" +msgstr "先端径" + +#: src/slic3r/GUI/ConfigManipulation.cpp:317 +msgid "Head penetration should not be greater than the head width." +msgstr "サポートチップの貫通は、サポートチップの厚さを超えないようにしてください。" + +#: src/libslic3r/PrintConfig.cpp:869 +msgid "Heated build plate temperature for the first layer. Set this to zero to disable bed temperature control commands in the output." +msgstr "最初のレイヤーのビルドプレート(ベッド)の加熱温度。ベッド温度制御コマンドを無効にするには、これをゼロにします。" + +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500 +msgid "Height" +msgstr "高さ" + +#: src/libslic3r/GCode/PreviewData.cpp:347 +msgid "Height (mm)" +msgstr "高さ(mm)" + +#: src/libslic3r/PrintConfig.cpp:1688 +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:2360 +msgid "Height of the display" +msgstr "ディスプレイの高さ" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1500 +msgid "Height range Modifier" +msgstr "個別条件領域の高さ範囲" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +msgid "Height ranges" +msgstr "高さ範囲" + +#: src/libslic3r/PrintConfig.cpp:261 +msgid "Heights at which a filament change is to occur." +msgstr "フィラメントを切り替える高さ。" + +#: src/slic3r/GUI/ConfigWizard.cpp:433 +#, 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 "こんにちは、%sへようこそ! この%sは初期設定に役立ちます。 いくつかの設定を行うだけで、プリントの準備ができます。" + +#: src/libslic3r/PrintConfig.cpp:3365 +msgid "Help" +msgstr "ヘルプ" + +#: src/libslic3r/PrintConfig.cpp:3371 +msgid "Help (FFF options)" +msgstr "ヘルプ(FFFオプション)" + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Help (SLA options)" +msgstr "ヘルプ(SLAオプション)" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 +msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." +msgstr "ここで、ツールの任意のペアで必要なパージ量(mm³)を調整できます。" + +#: src/libslic3r/PrintConfig.cpp:973 +msgid "High extruder current on filament swap" +msgstr "フィラメント交換時の高いエクストルーダー電流" + +#: src/slic3r/GUI/GLCanvas3D.cpp:277 +msgid "Higher print quality versus higher print speed." +msgstr "高いプリント品質vs.高いプリント速度。" + +#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:853 +msgid "Hilbert Curve" +msgstr "ヒルベルト曲線" + +#: src/slic3r/GUI/Plater.cpp:1042 +msgid "Hold Shift to Slice & Export G-code" +msgstr "シフトキーを押しながらで、スライス&Gコードエクスポート" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Hole depth" +msgstr "穴の深さ" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +msgid "Hole diameter" +msgstr "穴径" + +#: src/slic3r/GUI/Plater.cpp:2760 +msgid "Hollow" +msgstr "くり抜き" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:977 +msgid "Hollow and drill" +msgstr "くり抜きと穴開け" + +#: src/libslic3r/PrintConfig.cpp:2910 +msgid "Hollow out a model to have an empty interior" +msgstr "内部を空にするためにモデルをくり抜く" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +msgid "Hollow this object" +msgstr "このオブジェクトのくり抜き" + +#: 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 +msgid "Hollowing" +msgstr "くり抜き" + +#: src/slic3r/GUI/Plater.cpp:2926 +msgid "Hollowing cancelled." +msgstr "くり抜きをキャンセルしました。" + +#: src/slic3r/GUI/Plater.cpp:2927 +msgid "Hollowing done." +msgstr "くり抜き完了。" + +#: src/slic3r/GUI/Plater.cpp:2929 +msgid "Hollowing failed." +msgstr "くり抜き失敗。" + +#: src/libslic3r/PrintConfig.cpp:2937 +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 "くり抜きは2ステップで形成されます。最初に、オブジェクトの仮想の内壁がより深く計算され(オフセット+閉鎖距離)、次に指定されたオフセットまで膨張します。 閉鎖距離が大きいと、モデルの内部は丸みを帯びます。 ゼロでは、モデルの内部はモデルの外部シェイプに最も似ます。" + +#: src/libslic3r/SLAPrintSteps.cpp:43 +msgid "Hollowing model" +msgstr "くり抜きモデル" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:813 +msgid "Hollowing parameter change" +msgstr "くり抜きパラメータの変更" + +#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011 +msgid "Honeycomb" +msgstr "ハニカム" + +#: src/slic3r/GUI/Tab.cpp:1064 +msgid "Horizontal shells" +msgstr "水平構造設定" + +#: src/libslic3r/PrintConfig.cpp:245 +msgid "Horizontal width of the brim that will be printed around each object on the first layer." +msgstr "各オブジェクトの最初のレイヤーにプリントされるブリム(縁)の幅。" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:152 +msgid "Host" +msgstr "サーバー" + +#: src/libslic3r/PrintConfig.cpp:1332 +msgid "Host Type" +msgstr "サーバータイプ" + +#: src/slic3r/GUI/BonjourDialog.cpp:73 +msgid "Hostname" +msgstr "ホスト名" + +#: src/libslic3r/PrintConfig.cpp:97 +msgid "Hostname, IP or URL" +msgstr "ホスト名、IPアドレス、もしくはURL" + +#: src/slic3r/GUI/Tab.cpp:139 +msgid "Hover the cursor over buttons to find more information \nor click this button." +msgstr "カーソルをボタンの上に置くと、詳細情報が表示されます。またはこのボタンをクリックします。" + +#: src/libslic3r/PrintConfig.cpp:2812 +msgid "How far should the pad extend around the contained geometry" +msgstr "パッドの形状の周りの幅" + +#: src/libslic3r/PrintConfig.cpp:2901 +msgid "How much should the tiny connectors penetrate into the model body." +msgstr "小さなコネクターをモデルにどの程度深く入れるか。" + +#: src/libslic3r/PrintConfig.cpp:2631 +msgid "How much the pinhead has to penetrate the model surface" +msgstr "サポートの先端がモデルの表面をどの程度貫通しているか" + +#: src/libslic3r/PrintConfig.cpp:2755 +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:111 +msgid "HTTPS CA File" +msgstr "HTTPS CAファイル" + +#: src/slic3r/GUI/Tab.cpp:1713 +msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate." +msgstr "HTTPS CAファイルはオプションです。 HTTPSを自己署名証明書で使用する場合にのみ必要です。" + +#: src/slic3r/GUI/Preferences.cpp:222 +msgid "Icon size in a respect to the default size" +msgstr "デフォルトのサイズと相対的なアイコンのサイズ" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:149 +msgid "ID" +msgstr "ID" + +#: src/libslic3r/PrintConfig.cpp:1873 +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/slic3r/GUI/ConfigWizard.cpp:773 +#, 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 "有効にすると、%sはプログラムの新バージョンをオンラインでチェックします。 新しいバージョンが利用可能になると、次のアプリケーションの起動時にメッセージが表示されます(プログラムの使用中は表示されません)。 これは単なる通知であり、自動インストールは行われません。" + +#: src/slic3r/GUI/ConfigWizard.cpp:783 +#, 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 "有効にすると、%sはバックグラウンドでビルトインシステムプリセットアップデートをダウンロードします。 これらの更新は一時的な場所にダウンロードされます。 新しいプリセットが利用可能な場合、プログラムの起動時に警告が表示されます。" + +#: src/libslic3r/PrintConfig.cpp:1852 +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/slic3r/GUI/ConfigWizard.cpp:805 +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 "有効にした場合、「ディスクからリロード」コマンドを使用して、起動時にファイルを自動的に検索してロードできます。\n有効になっていない場合、「ディスクからリロード」コマンドは、ファイルを開くダイアログを使用して各ファイルの選択を要求します。" + +#: src/slic3r/GUI/Preferences.cpp:74 +msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked." +msgstr "有効にした場合、「ディスクからリロード」コマンドを使用して、起動時にファイルを自動的に検索してロードできます。" + +#: src/slic3r/GUI/Preferences.cpp:66 +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:82 +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:106 +msgid "If enabled, the 3D scene will be rendered in Retina resolution. If you are experiencing 3D performance problems, disabling this option may help." +msgstr "有効にすると、3DシーンはRetina解像度でレンダリングされます。 3Dパフォーマンスに問題がある場合は、このオプションを無効にしてください。" + +#: src/libslic3r/PrintConfig.cpp:1696 +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:1858 +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/slic3r/GUI/Preferences.cpp:128 +msgid "If enabled, use free camera. If not enabled, use constrained camera." +msgstr "チェックすると、フリーカメラが使用されます。 そうでない場合は、拘束カメラを使用します。" + +#: src/slic3r/GUI/Preferences.cpp:121 +msgid "If enabled, use perspective camera. If not enabled, use orthographic camera." +msgstr "有効にした場合、パース(遠近)ビューカメラを使用します。 有効になっていない場合は、アイソメ(等角)ビューカメラを使用します。" + +#: src/slic3r/GUI/Preferences.cpp:145 +msgid "If enabled, you can change size of toolbar icons manually." +msgstr "有効にすると、ツールバーアイコンのサイズをマニュアル変更できます。" + +#: src/slic3r/GUI/PresetHints.cpp:29 +msgid "If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed will be reduced so that no less than %3%s are spent on that layer (however, speed will never be reduced below %4%mm/s)." +msgstr "レイヤーの推定時間が〜%1%s未満の場合、ファンは%2%%%で動作し、プリント速度が低下して、そのレイヤーで%3%s以上が費やされます(ただし、速度が%4%mm/s以下になることはありません)。" + +#: src/slic3r/GUI/PresetHints.cpp:36 +msgid "If estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%." +msgstr "レイヤーのプリント予測時間が長くなったものの、まだおよそ%1%sより短い場合、冷却ファンは%2%%%から%3%%%の間で時間に比例した回転数になります。" + +#: src/libslic3r/PrintConfig.cpp:901 +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 "値がmm/s単位の絶対値として入力された場合、この速度はタイプに関係なく、最初のレイヤーのすべてのプリント移動に適用されます。 パーセンテージ(例:40%)で入力された場合、デフォルトの速度をスケーリングします。" + +#: src/libslic3r/PrintConfig.cpp:573 +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:1706 +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:567 +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/slic3r/GUI/Preferences.cpp:49 +msgid "If this is enabled, Slic3r will auto-center objects around the print bed center." +msgstr "有効にすると、Slic3rは自動的にオブジェクトをプリント領域の中央に配置します。" + +#: src/slic3r/GUI/Preferences.cpp:57 +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:41 +msgid "If this is enabled, Slic3r will prompt the last output directory instead of the one containing the input files." +msgstr "これを有効にすると、Slic3rは入力ファイルを含むディレクトリではなく、最後の出力ディレクトリを取得します。" + +#: src/libslic3r/PrintConfig.cpp:1562 +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 "これに正の値を入力すると、引き込みされるたびにZが瞬間持ち上げられます。 マルチエクストルーダーを使用する場合、最初のエクストルーダーの設定が優先されます。" + +#: src/libslic3r/PrintConfig.cpp:1571 +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以上に制限されます。これを使って1レイヤー目のZリフトをスキップさせることが出来ます。" + +#: src/libslic3r/PrintConfig.cpp:1580 +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 "正の値を入力すると、Zリフトは指定された絶対Z未満でのみ発生します。この設定を調整して、リフトを最初のレイヤーに制限できます。" + +#: src/libslic3r/PrintConfig.cpp:1454 +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:530 +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:2169 +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:3485 +msgid "Ignore non-existent config files" +msgstr "存在しない設定ファイルを無視する" + +#: src/slic3r/GUI/MainFrame.cpp:464 +msgid "Import &Config" +msgstr "設定インポート(&C)" + +#: src/slic3r/GUI/MainFrame.cpp:471 +msgid "Import Config &Bundle" +msgstr "構成バンドルのインポート(&B)" + +#: src/slic3r/GUI/MainFrame.cpp:467 +msgid "Import Config from &project" +msgstr "プロジェクトから構成をインポート(&p)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +msgid "Import Config from ini/amf/3mf/gcode" +msgstr "ini/amf/3mf/gcodeファイルから設定を読み込む" + +#: src/slic3r/GUI/Plater.cpp:4603 +msgid "Import Object" +msgstr "オブジェクトをインポート" + +#: src/slic3r/GUI/Plater.cpp:4607 +msgid "Import Objects" +msgstr "オブジェクトのインポート" + +#: src/slic3r/Utils/FixModelByWin10.cpp:383 +msgid "Import of the repaired 3mf file failed" +msgstr "修正した3mfファイルのインポートに失敗しました" + +#: src/slic3r/GUI/MainFrame.cpp:460 +msgid "Import STL/OBJ/AM&F/3MF" +msgstr "STL/OBJ/AMF/3MFのインポート(&F)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +msgid "Import STL/OBJ/AMF/3MF without config, keep plater" +msgstr "既存のプレートを保持しながらSTL/OBJ/AMF/3MFを設定なしでインポート" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3422 +#, possible-c-format +msgid "In this mode you can select only other %s Items%s" +msgstr "このモードでは、他の%sアイテム%sのみを選択できます" + +#: src/slic3r/GUI/UpdateDialogs.cpp:230 +msgid "Incompatible bundles:" +msgstr "互換性のないパッケージ:" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#, possible-c-format +msgid "Incompatible with this %s" +msgstr "この%sと互換性がありません" + +#: src/slic3r/GUI/Plater.cpp:4685 +msgid "Increase Instances" +msgstr "インスタンスを増やす" + +#: src/slic3r/GUI/GLCanvas3D.cpp:264 +msgid "Increase/decrease edit area" +msgstr "編集エリアを拡大/縮小する" + +#: src/slic3r/GUI/Plater.cpp:2922 +msgid "Indexing hollowed object" +msgstr "中空オブジェクトのインデックス作成" + +#. 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.\nClick the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values." +msgstr "一部の設定が変更され、現在のオプショングループのシステム(またはデフォルト)値と等しくないことを示します。\n開いたカギアイコンをクリックして、現在のオプショングループのすべての設定をシステム(またはデフォルト)値にリセットします。" + +#. TRN Description for "LOCKED LOCK" +#: src/slic3r/GUI/Tab.cpp:3254 +msgid "indicates that the settings are the same as the system (or default) values for the current option group" +msgstr "設定が現在の設定グループのシステム(デフォルト)値と同じであることを示します" + +#. 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.\nClick the BACK ARROW icon to reset all settings for the current option group to the last saved preset." +msgstr "設定が変更され、現在のオプショングループに最後に保存されたプリセットと等しくないことを示します。\n戻る矢印アイコンをクリックして、現在のオプショングループのすべての設定を最後に保存されたプリセットに戻します。" + +#: 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 +msgid "Infill" +msgstr "インフィル" + +#: src/slic3r/GUI/PresetHints.cpp:174 +msgid "infill" +msgstr "インフィル" + +#: src/libslic3r/PrintConfig.cpp:1021 +msgid "Infill before perimeters" +msgstr "外周よりも先にインフィルを実施" + +#: src/libslic3r/PrintConfig.cpp:1001 +msgid "Infill extruder" +msgstr "インフィルエクストルーダー" + +#: src/libslic3r/PrintConfig.cpp:1036 +msgid "Infill/perimeters overlap" +msgstr "外周とインフィルの重なり幅" + +#: src/libslic3r/Print.cpp:1584 +msgid "Infilling layers" +msgstr "レイヤーのインフィル" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3430 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 src/slic3r/GUI/Plater.cpp:141 +msgid "Info" +msgstr "情報" + +#: src/libslic3r/PrintConfig.cpp:1057 +msgid "Inherits profile" +msgstr "プロファイルを継承" + +#: src/libslic3r/SLAPrint.cpp:653 +msgid "Initial exposition time is out of printer profile bounds." +msgstr "初期露出時間は、プリンタプロファイルの範囲外です。" + +#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565 +msgid "Initial exposure time" +msgstr "初期露出時間" + +#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483 +msgid "Initial layer height" +msgstr "初期レイヤー高さ" + +#: src/slic3r/GUI/Field.cpp:204 +msgid "Input value is out of range" +msgstr "入力値が範囲を超えています" + +#: src/slic3r/GUI/GUI_App.cpp:800 +msgid "Inspect / activate configuration snapshots" +msgstr "構成スナップショットの点検/有効化" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:60 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:216 +#, possible-c-format +msgid "Instance %d" +msgstr "インスタンス%d" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2500 +msgid "Instance manipulation" +msgstr "オブジェクトのインスタンスを操作する" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:56 +msgid "Instances" +msgstr "インスタンス" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3781 +msgid "Instances to Separated Objects" +msgstr "分離されたオブジェクトのインスタンス" + +#: src/libslic3r/PrintConfig.cpp:1973 +msgid "Interface layers" +msgstr "インターフェースレイヤー" + +#: src/libslic3r/PrintConfig.cpp:1957 +msgid "Interface loops" +msgstr "インターフェースのループ" + +#: src/libslic3r/PrintConfig.cpp:1982 +msgid "Interface pattern spacing" +msgstr "コンタクトレイヤーのピッチ" + +#: src/libslic3r/PrintConfig.cpp:1071 +msgid "Interface shells" +msgstr "中間壁" + +#: src/libslic3r/Zipper.cpp:84 +msgid "internal error" +msgstr "内部エラー" + +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313 +msgid "Internal infill" +msgstr "内部のインフィル" + +#: src/slic3r/GUI/Plater.cpp:3106 +msgid "Invalid data" +msgstr "無効なデータ" + +#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:566 +msgid "Invalid file format." +msgstr "無効なファイル形式。" + +#: src/libslic3r/Zipper.cpp:80 +msgid "invalid filename" +msgstr "無効なファイル名" + +#: src/slic3r/GUI/ConfigManipulation.cpp:319 +msgid "Invalid Head penetration" +msgstr "モデルへの無効なサポートの貫通" + +#: src/libslic3r/Zipper.cpp:48 +msgid "invalid header or archive is corrupted" +msgstr "無効なヘッダーまたはアーカイブが破損しています" + +#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376 +msgid "Invalid numeric input." +msgstr "無効な数値入力。" + +#: src/libslic3r/Zipper.cpp:78 +msgid "invalid parameter" +msgstr "無効なパラメーター" + +#: src/slic3r/GUI/ConfigManipulation.cpp:332 +msgid "Invalid pinhead diameter" +msgstr "無効なピンヘッド径" + +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:258 +msgid "is licensed under the" +msgstr "の下でライセンスされています" + +#: src/slic3r/GUI/Tab.cpp:2941 +msgid "is not compatible with print profile" +msgstr "プリントプロファイルと互換性がない" + +#: src/slic3r/GUI/Tab.cpp:2940 +msgid "is not compatible with printer" +msgstr "プリンターと互換性がありません" + +#: src/slic3r/GUI/MainFrame.cpp:658 +msgid "Iso" +msgstr "アイソメ" + +#: src/slic3r/GUI/MainFrame.cpp:658 +msgid "Iso View" +msgstr "アイソメ表示" + +#: src/slic3r/GUI/Tab.cpp:964 +msgid "It can't be deleted or modified." +msgstr "削除もしくは変更ができません。" + +#: src/slic3r/GUI/Plater.cpp:3321 +msgid "It is not allowed to change the file to reload" +msgstr "リロードするファイルを変更することはできません" + +#: src/libslic3r/PrintConfig.cpp:974 +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/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2958 +msgid "It's impossible to print multi-part object(s) with SLA technology." +msgstr "SLAではマルチパートオブジェクトのプリントはできません。" + +#: src/slic3r/GUI/Tab.cpp:2229 +msgid "Jerk limits" +msgstr "ジャーク(加加速度)限界" + +#: src/libslic3r/PrintConfig.cpp:1649 +msgid "Jitter" +msgstr "ジッター" + +#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529 +#: src/slic3r/GUI/DoubleSlider.cpp:1651 +msgid "Jump to height" +msgstr "高さにジャンプ" + +#: src/slic3r/GUI/DoubleSlider.cpp:955 +#, possible-c-format +msgid "Jump to height %s or Set extruder sequence for the entire print" +msgstr "高さ%sにジャンプするか、プリント全体のエクストルーダーシーケンスを設定します" + +#: src/libslic3r/PrintConfig.cpp:566 +msgid "Keep fan always on" +msgstr "ファンを常時オン" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 +msgid "Keep lower part" +msgstr "下側パーツをキープ" + +#: src/slic3r/GUI/GLCanvas3D.cpp:304 +msgid "Keep min" +msgstr "最小に保つ" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168 +msgid "Keep upper part" +msgstr "上側パーツを保持" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:708 +msgid "Keyboard Shortcuts" +msgstr "キーボードショートカット" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +msgid "Keyboard shortcuts" +msgstr "キーボードショートカット" + +#: src/libslic3r/PrintConfig.cpp:2498 +msgid "kg" +msgstr "kg" + +#: src/libslic3r/PrintConfig.cpp:965 +msgid "Label objects" +msgstr "オブジェクトにラベルを付ける" + +#: src/libslic3r/PrintConfig.cpp:2399 +msgid "Landscape" +msgstr "横方向" + +#: src/slic3r/GUI/GUI_App.cpp:629 +msgid "Language" +msgstr "言語" + +#: src/slic3r/GUI/GUI_App.cpp:885 +msgid "Language selection" +msgstr "言語選択" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2140 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2242 +msgid "Last instance of an object cannot be deleted." +msgstr "オブジェクトの最後のインスタンスは削除できません。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 +msgid "Layer" +msgstr "レイヤー" + +#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:71 +msgid "Layer height" +msgstr "積層ピッチ" + +#: src/libslic3r/Print.cpp:1427 +msgid "Layer height can't be greater than nozzle diameter" +msgstr "ノズル径を超えるレイヤー高さには設定できません" + +#: src/slic3r/GUI/Tab.cpp:2362 +msgid "Layer height limits" +msgstr "レイヤー高さ限度" + +#: src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "Layer height:" +msgstr "レイヤー高さ:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2488 +msgid "Layer range Settings to modify" +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:1750 src/libslic3r/PrintConfig.cpp:1930 +#: src/libslic3r/PrintConfig.cpp:1976 +msgid "layers" +msgstr "レイヤー" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3512 +#: src/slic3r/GUI/Tab.cpp:3600 +msgid "Layers" +msgstr "レイヤー" + +#: src/slic3r/GUI/Tab.cpp:1048 src/slic3r/GUI/Tab.cpp:3598 +msgid "Layers and perimeters" +msgstr "レイヤーと外周" + +#: 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 +msgid "Layers and Perimeters" +msgstr "積層ピッチと外壁の設定" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +msgid "Layers Slider" +msgstr "レイヤースライダー" + +#: src/slic3r/GUI/OptionsGroup.cpp:258 +msgctxt "Layers" +msgid "Bottom" +msgstr "レイヤー||最下層" + +#: src/slic3r/GUI/OptionsGroup.cpp:258 +msgctxt "Layers" +msgid "Top" +msgstr "レイヤー||トップ" + +#: src/slic3r/GUI/MainFrame.cpp:671 +msgid "Left" +msgstr "左" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 +msgid "Left click" +msgstr "左クリック" + +#: src/slic3r/GUI/GLCanvas3D.cpp:237 +msgid "Left mouse button:" +msgstr "左マウスボタン:" + +#: src/slic3r/GUI/MainFrame.cpp:671 +msgid "Left View" +msgstr "左面" + +#: src/slic3r/GUI/GUI_Preview.cpp:257 +msgid "Legend" +msgstr "凡例" + +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551 +msgid "Length" +msgstr "長さ" + +#: src/libslic3r/PrintConfig.cpp:328 +msgid "Length of the cooling tube to limit space for cooling moves inside it." +msgstr "ノズルからの溶融樹脂を引抜いた後にフィラメントを凝固させるための冷却用チューブの長さ。" + +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:129 +msgid "License agreements of all following programs (libraries) are part of application license agreement" +msgstr "以下のすべてのプログラム(ライブラリ)のライセンス契約は、アプリケーションライセンス契約の一部です" + +#: src/libslic3r/PrintConfig.cpp:1561 +msgid "Lift Z" +msgstr "リフトZ" + +#: src/libslic3r/PrintConfig.cpp:848 +msgid "Line" +msgstr "線" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1427 +msgid "Load" +msgstr "ロード" + +#: src/slic3r/GUI/MainFrame.cpp:460 +msgid "Load a model" +msgstr "モデルを読込む" + +#: src/libslic3r/PrintConfig.cpp:3505 +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:3489 +msgid "Load config file" +msgstr "設定ファイルの読込み" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +msgid "Load Config from ini/amf/3mf/gcode and merge" +msgstr "ini/amf/3mf/gcodeから構成を読み込み、マージします" + +#: src/slic3r/GUI/MainFrame.cpp:467 +msgid "Load configuration from project file" +msgstr "プロジェクトファイルから設定を読み込む" + +#: src/libslic3r/PrintConfig.cpp:3490 +msgid "Load configuration from the specified file. It can be used more than once to load options from multiple files." +msgstr "指定されたファイルから構成をロードします。 複数のファイルからオプションをロードするために複数回使用できます。" + +#: src/slic3r/GUI/MainFrame.cpp:464 +msgid "Load exported configuration file" +msgstr "エクスポートされた構成ファイルを読込む" + +#: src/slic3r/GUI/Plater.cpp:1395 +msgid "Load File" +msgstr "ファイルのロード" + +#: src/slic3r/GUI/Plater.cpp:1399 +msgid "Load Files" +msgstr "複数ファイルのロード" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1879 +msgid "Load Part" +msgstr "パーツの読込み" + +#: src/slic3r/GUI/MainFrame.cpp:471 +msgid "Load presets from a bundle" +msgstr "プリセットをバンドルから読込む" + +#: src/slic3r/GUI/Plater.cpp:4575 +msgid "Load Project" +msgstr "プロジェクト読込み" + +#: src/slic3r/GUI/BedShapeDialog.cpp:102 +msgid "Load shape from STL..." +msgstr "STLから形状を読込み..." + +#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261 +msgid "Load..." +msgstr "ロード..." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 +msgid "loaded" +msgstr "ロード完了" + +#: src/slic3r/GUI/Plater.cpp:2426 +msgid "Loaded" +msgstr "読み込みました" + +#: src/slic3r/GUI/Plater.cpp:2273 +msgid "Loading" +msgstr "ローディング" + +#: src/slic3r/GUI/GUI_App.cpp:474 +msgid "Loading of a mode view" +msgstr "ビューモードの読込み" + +#: src/slic3r/GUI/GUI_App.cpp:466 +msgid "Loading of current presets" +msgstr "現在のプリセットを取得する" + +#: src/slic3r/Utils/FixModelByWin10.cpp:251 +#: src/slic3r/Utils/FixModelByWin10.cpp:378 +msgid "Loading repaired model" +msgstr "修復モデルを読込み" + +#: src/libslic3r/PrintConfig.cpp:607 +msgid "Loading speed" +msgstr "ローディング速度" + +#: src/libslic3r/PrintConfig.cpp:615 +msgid "Loading speed at the start" +msgstr "ローディング開始時の速度" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106 +msgid "Local coordinates" +msgstr "ローカル座標" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 +msgid "Lock supports under new islands" +msgstr "新しい台座でのサポートロック" + +#: src/slic3r/GUI/Tab.cpp:3252 +msgid "LOCKED LOCK" +msgstr "ロックしたカギ" + +#: src/slic3r/GUI/Tab.cpp:3280 +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:3296 +msgid "LOCKED LOCK icon indicates that the value is the same as the system (or default) value." +msgstr "カギロック状態のアイコンは、値がシステム(デフォルト)値と同じであることを示します。" + +#: src/libslic3r/PrintConfig.cpp:3508 +msgid "Logging level" +msgstr "ログレベル" + +#: src/libslic3r/PrintConfig.cpp:1695 +msgid "Loops (minimum)" +msgstr "ループ数(最小)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 +msgid "Lower Layer" +msgstr "最下層レイヤー" + +#: 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 +msgid "Machine limits" +msgstr "機体の限界" + +#: src/slic3r/GUI/Plater.cpp:166 +msgid "Manifold" +msgstr "モデルOK" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 +msgid "Manual editing" +msgstr "マニュアル編集" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180 +msgid "Masked SLA file exported to %1%" +msgstr "マスクされたSLAファイルが%1%にエクスポートされました" + +#: src/slic3r/GUI/MainFrame.cpp:752 +msgid "Mate&rial Settings Tab" +msgstr "材料設定タブ(&r)" + +#: src/slic3r/GUI/Tab.cpp:3478 src/slic3r/GUI/Tab.cpp:3480 +msgid "Material" +msgstr "材料" + +#: src/slic3r/GUI/Tab.hpp:416 +msgid "Material Settings" +msgstr "材料設定" + +#: src/slic3r/GUI/Plater.cpp:163 +msgid "Materials" +msgstr "材料" + +#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226 +msgid "Max" +msgstr "最大" + +#: src/libslic3r/PrintConfig.cpp:2734 +msgid "Max bridge length" +msgstr "最長ブリッジ長さ" + +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "柱の上の最大ブリッジ数" + +#: src/libslic3r/PrintConfig.cpp:2822 +msgid "Max merge distance" +msgstr "最大結合距離" + +#: src/libslic3r/PrintConfig.cpp:2743 +msgid "Max pillar linking distance" +msgstr "支柱がリンクする最大距離" + +#: src/libslic3r/PrintConfig.cpp:80 +msgid "Max print height" +msgstr "最大のプリント高さ" + +#: src/libslic3r/PrintConfig.cpp:1237 +msgid "Max print speed" +msgstr "最大プリント速度" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +msgid "max PrusaSlicer version" +msgstr "最大PrusaSclierバージョン" + +#: src/libslic3r/PrintConfig.cpp:1268 +msgid "Max volumetric slope negative" +msgstr "最大体積押出し下り勾配" + +#: src/libslic3r/PrintConfig.cpp:1257 +msgid "Max volumetric slope positive" +msgstr "最大体積押出し上り勾配" + +#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247 +msgid "Max volumetric speed" +msgstr "最大体積押出し速度" + +#: src/libslic3r/PrintConfig.cpp:2268 +msgid "Maximal bridging distance" +msgstr "ブリッジ最大距離" + +#: src/libslic3r/PrintConfig.cpp:2269 +msgid "Maximal distance between supports on sparse infill sections." +msgstr "中抜きインフィルレイヤーの間隔の最大値。" + +#: src/libslic3r/PrintConfig.cpp:1145 +msgid "Maximum acceleration E" +msgstr "E最大加速度" + +#: src/libslic3r/PrintConfig.cpp:1151 +msgid "Maximum acceleration of the E axis" +msgstr "最大E軸加速度" + +#: src/libslic3r/PrintConfig.cpp:1148 +msgid "Maximum acceleration of the X axis" +msgstr "X軸の最大加速度" + +#: src/libslic3r/PrintConfig.cpp:1149 +msgid "Maximum acceleration of the Y axis" +msgstr "最大Y軸加速度" + +#: src/libslic3r/PrintConfig.cpp:1150 +msgid "Maximum acceleration of the Z axis" +msgstr "Z軸の最大加速度" + +#: src/libslic3r/PrintConfig.cpp:1198 +msgid "Maximum acceleration when extruding" +msgstr "射出時の最大加速度" + +#: src/libslic3r/PrintConfig.cpp:1200 +msgid "Maximum acceleration when extruding (M204 S)" +msgstr "射出時の最大加速度 (M204 S)" + +#: src/libslic3r/PrintConfig.cpp:1208 +msgid "Maximum acceleration when retracting" +msgstr "吸込み中の最大加速度" + +#: src/libslic3r/PrintConfig.cpp:1210 +msgid "Maximum acceleration when retracting (M204 T)" +msgstr "吸込み時の最大加速度(M204 T)" + +#: src/libslic3r/PrintConfig.cpp:1142 +msgid "Maximum acceleration X" +msgstr "X軸の最大加速度" + +#: src/libslic3r/PrintConfig.cpp:1143 +msgid "Maximum acceleration Y" +msgstr "Y最大加速度" + +#: src/libslic3r/PrintConfig.cpp:1144 +msgid "Maximum acceleration Z" +msgstr "Zの最大加速度" + +#: src/slic3r/GUI/Tab.cpp:2222 +msgid "Maximum accelerations" +msgstr "最大加速度" + +#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534 +msgid "Maximum exposure time" +msgstr "最長露光時間" + +#: src/libslic3r/PrintConfig.cpp:1128 +msgid "Maximum feedrate E" +msgstr "E最大送り量" + +#: src/libslic3r/PrintConfig.cpp:1134 +msgid "Maximum feedrate of the E axis" +msgstr "E軸の最大送り速度" + +#: src/libslic3r/PrintConfig.cpp:1131 +msgid "Maximum feedrate of the X axis" +msgstr "最大X軸送り速度" + +#: src/libslic3r/PrintConfig.cpp:1132 +msgid "Maximum feedrate of the Y axis" +msgstr "Y軸の最大送り速度" + +#: src/libslic3r/PrintConfig.cpp:1133 +msgid "Maximum feedrate of the Z axis" +msgstr "Z軸最大送り量" + +#: src/libslic3r/PrintConfig.cpp:1125 +msgid "Maximum feedrate X" +msgstr "最大送り速度X" + +#: src/libslic3r/PrintConfig.cpp:1126 +msgid "Maximum feedrate Y" +msgstr "Yの最大送り量" + +#: src/libslic3r/PrintConfig.cpp:1127 +msgid "Maximum feedrate Z" +msgstr "Zの最大送り量" + +#: src/slic3r/GUI/Tab.cpp:2217 +msgid "Maximum feedrates" +msgstr "最大送り速度" + +#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557 +msgid "Maximum initial exposure time" +msgstr "最大初期露光時間" + +#: src/libslic3r/PrintConfig.cpp:1162 +msgid "Maximum jerk E" +msgstr "Eの最大ジャーク" + +#: src/libslic3r/PrintConfig.cpp:1168 +msgid "Maximum jerk of the E axis" +msgstr "E軸最大ジャーク" + +#: src/libslic3r/PrintConfig.cpp:1165 +msgid "Maximum jerk of the X axis" +msgstr "X軸の最大ジャーク" + +#: src/libslic3r/PrintConfig.cpp:1166 +msgid "Maximum jerk of the Y axis" +msgstr "Y軸の最大ジャーク" + +#: src/libslic3r/PrintConfig.cpp:1167 +msgid "Maximum jerk of the Z axis" +msgstr "Z軸最大ジャーク" + +#: src/libslic3r/PrintConfig.cpp:1159 +msgid "Maximum jerk X" +msgstr "Xの最大ジャーク" + +#: src/libslic3r/PrintConfig.cpp:1160 +msgid "Maximum jerk Y" +msgstr "Yの最大ジャーク" + +#: src/libslic3r/PrintConfig.cpp:1161 +msgid "Maximum jerk Z" +msgstr "Zの最大ジャーク" + +#: src/libslic3r/PrintConfig.cpp:2660 +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:598 +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:3442 +msgid "Merge" +msgstr "マージ" + +#: src/libslic3r/PrintConfig.cpp:2683 +msgid "Merging bridges or pillars into another pillars can increase the radius. Zero means no increase, one means full increase." +msgstr "ブリッジまたはピラーを別のピラーに結合すると、半径が大きくなる可能性があります。 値0は増加なし、値1は最大増加を意味します。" + +#: src/libslic3r/SLAPrintSteps.cpp:64 +msgid "Merging slices and calculating statistics" +msgstr "スライスの合成と見積もりの計算" + +#: src/slic3r/Utils/FixModelByWin10.cpp:248 +msgid "Mesh repair failed." +msgstr "メッシュ修復失敗。" + +#: src/slic3r/GUI/DoubleSlider.cpp:1635 +msgid "Message for pause print on current layer (%1% mm)." +msgstr "現在のレイヤーで印刷を一時停止するためのメッセージ(%1% mm)。" + +#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289 +msgid "Min" +msgstr "最小" + +#: src/libslic3r/PrintConfig.cpp:1298 +msgid "Min print speed" +msgstr "最低プリント速度" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "min PrusaSlicer version" +msgstr "最小PrusaSlicerバージョン" + +#: src/libslic3r/PrintConfig.cpp:2772 +msgid "Minimal distance of the support points" +msgstr "サポートポイントの最小距離" + +#: src/libslic3r/PrintConfig.cpp:1306 +msgid "Minimal filament extrusion length" +msgstr "フィラメント射出の最小値" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 +msgid "Minimal points distance" +msgstr "最小ポイント距離" + +#: src/libslic3r/PrintConfig.cpp:667 +msgid "Minimal purge on wipe tower" +msgstr "ワイプタワーの最小パージ量" + +#: src/libslic3r/PrintConfig.cpp:187 +msgid "Minimum bottom shell thickness" +msgstr "最小ボトムシェル厚さ" + +#: src/slic3r/GUI/PresetHints.cpp:339 +msgid "Minimum bottom shell thickness is %1% mm." +msgstr "ボトムシェルの最小厚さは%1%mmです。" + +#: src/libslic3r/PrintConfig.cpp:1512 +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 "スライス処理を高速化しメモリ使用量を低減する目的で、入力ファイルを簡素化するために使用される最小の解像度。 高解像度のモデルで多くの場合は、プリンターの能力以上の情報があります。 単純化しないでファイルの完全な解像度で処理するには、ゼロに設定します。" + +#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526 +msgid "Minimum exposure time" +msgstr "最短露光時間" + +#: src/libslic3r/PrintConfig.cpp:1178 +msgid "Minimum feedrate when extruding" +msgstr "射出中の最小速度" + +#: src/libslic3r/PrintConfig.cpp:1180 +msgid "Minimum feedrate when extruding (M205 S)" +msgstr "射出時の最小送り速度(M205 S)" + +#: src/slic3r/GUI/Tab.cpp:2234 +msgid "Minimum feedrates" +msgstr "最小送り速度" + +#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549 +msgid "Minimum initial exposure time" +msgstr "最小初期露光時間" + +#: src/slic3r/GUI/Tab.cpp:1069 +msgid "Minimum shell thickness" +msgstr "最小セル厚さ" + +#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788 +msgid "Minimum thickness of a top / bottom shell" +msgstr "上部/下部シェルの最小厚" + +#: src/libslic3r/PrintConfig.cpp:2146 +msgid "Minimum top shell thickness" +msgstr "最小トップシェル厚" + +#: src/slic3r/GUI/PresetHints.cpp:320 +msgid "Minimum top shell thickness is %1% mm." +msgstr "上部シェルの最小厚さは%1%mmです。" + +#: src/libslic3r/PrintConfig.cpp:1522 +msgid "Minimum travel after retraction" +msgstr "吸込み後の最小移動量" + +#: src/libslic3r/PrintConfig.cpp:1188 +msgid "Minimum travel feedrate" +msgstr "最小移動速度" + +#: src/libslic3r/PrintConfig.cpp:1190 +msgid "Minimum travel feedrate (M205 T)" +msgstr "最小移動速度 (M205 T)" + +#: src/libslic3r/PrintConfig.cpp:2917 +msgid "Minimum wall thickness of a hollowed model." +msgstr "くり抜きモデルの最小壁厚" + +#: src/libslic3r/PrintConfig.cpp:2449 +msgid "Minimum width of features to maintain when doing elephant foot compensation." +msgstr "エレファントフットの補正を行うときに維持する外観の最小幅。" + +#: src/slic3r/GUI/Plater.cpp:4002 +msgid "Mirror" +msgstr "ミラー" + +#: src/libslic3r/PrintConfig.cpp:2379 +msgid "Mirror horizontally" +msgstr "水平にミラーリング" + +#: src/slic3r/GUI/GLCanvas3D.cpp:2053 +msgid "Mirror Object" +msgstr "オブジェクトのミラーリング" + +#: src/slic3r/GUI/Plater.cpp:4002 +msgid "Mirror the selected object" +msgstr "選択オブジェクトのミラーリング" + +#: src/slic3r/GUI/Plater.cpp:3995 +msgid "Mirror the selected object along the X axis" +msgstr "選択したオブジェクトをX軸でミラーリングします" + +#: src/slic3r/GUI/Plater.cpp:3997 +msgid "Mirror the selected object along the Y axis" +msgstr "選択オブジェクトをY軸に沿ってミラーリング" + +#: src/slic3r/GUI/Plater.cpp:3999 +msgid "Mirror the selected object along the Z axis" +msgstr "選択したオブジェクトをZ軸に沿ってミラーリングします" + +#: src/libslic3r/PrintConfig.cpp:2386 +msgid "Mirror vertically" +msgstr "垂直にミラーリング" + +#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68 +#, possible-c-format +msgid "Mismatched type of print host: %s" +msgstr "プリントホストのタイプの不一致:%s" + +#: src/libslic3r/ExtrusionEntity.cpp:323 +msgid "Mixed" +msgstr "ミックス" + +#: src/libslic3r/PrintConfig.cpp:2491 +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/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: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 +msgid "mm" +msgstr "mm" + +#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556 +msgid "mm (zero to disable)" +msgstr "mm (0で無効化)" + +#: 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 +msgid "mm or %" +msgstr "mmまたは%" + +#: 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 +msgid "mm/s or %" +msgstr "mm/s または %" + +#: 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 +msgid "mm/s²" +msgstr "mm/s²" + +#: src/libslic3r/PrintConfig.cpp:672 +msgid "mm³" +msgstr "mm³" + +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601 +#: src/libslic3r/PrintConfig.cpp:1250 +msgid "mm³/s" +msgstr "mm³/s" + +#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273 +msgid "mm³/s²" +msgstr "mm³/s²" + +#: src/slic3r/GUI/GUI_App.cpp:820 +msgid "Mode" +msgstr "モード (&M)" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 +msgid "model" +msgstr "モデル" + +#: src/slic3r/GUI/BedShapeDialog.cpp:251 +msgid "Model" +msgstr "モデル" + +#: src/slic3r/Utils/FixModelByWin10.cpp:340 +msgid "Model fixing" +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:406 +msgid "Model repair canceled" +msgstr "モデルの修復を中止しました" + +#: src/slic3r/Utils/FixModelByWin10.cpp:426 +msgid "Model repair failed:" +msgstr "モデルの修正に失敗しました:" + +#: src/slic3r/Utils/FixModelByWin10.cpp:400 +msgid "Model repair finished" +msgstr "モデル修正完了" + +#: src/slic3r/Utils/FixModelByWin10.cpp:423 +msgid "Model repaired successfully" +msgstr "モデルの修復完了" + +#: src/slic3r/GUI/Tab.cpp:979 +msgid "Modifications to the current profile will be saved." +msgstr "現在のプロファイルの編集が保存されます。" + +#: src/slic3r/GUI/Preset.cpp:247 +msgid "modified" +msgstr "変更あり" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 +msgid "Modifier" +msgstr "個別条件領域" + +#: src/slic3r/GUI/Tab.cpp:1161 +msgid "Modifiers" +msgstr "個別条件領域" + +#: src/libslic3r/PrintConfig.cpp:2512 +msgid "money/bottle" +msgstr "金額/ボトル" + +#: src/libslic3r/PrintConfig.cpp:762 +msgid "money/kg" +msgstr "コスト/kg" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 +msgid "Mouse wheel" +msgstr "マウスホイール" + +#: src/slic3r/GUI/GLCanvas3D.cpp:261 +msgid "Mouse wheel:" +msgstr "マウスホイール:" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 +msgid "Move" +msgstr "移動" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 +msgid "Move clipping plane" +msgstr "クリッピングプレーンを移動する" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 +msgid "Move current slider thumb Down" +msgstr "現在のスライダーのつまみを下に移動" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 +msgid "Move current slider thumb Up" +msgstr "現在のスライダーのつまみを上に移動" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1059 +msgid "Move drainage hole" +msgstr "抜き穴の移動" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3505 +msgid "Move Object" +msgstr "オブジェクト移動" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365 +msgid "Move point" +msgstr "移動ポイント" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Move selection 10 mm in negative X direction" +msgstr "選択範囲をX方向に-10mm(逆方向)移動します" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +msgid "Move selection 10 mm in negative Y direction" +msgstr "選択範囲をY方向に-10 mm(逆方向)移動" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +msgid "Move selection 10 mm in positive X direction" +msgstr "選択範囲を正のX方向に10 mm移動します" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +msgid "Move selection 10 mm in positive Y direction" +msgstr "選択範囲を正のY方向に10 mm移動" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1097 +msgid "Move support point" +msgstr "サポートポイントの移動" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Movement in camera space" +msgstr "カメラ空間の動き" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +msgid "Movement step set to 1 mm" +msgstr "移動ステップを1 mmに設定" + +#: src/libslic3r/PrintConfig.cpp:2201 +msgid "Multi material printers may need to prime or purge extruders on tool changes. Extrude the excess material into the wipe tower." +msgstr "マルチマテリアルプリンターでは、ツール変更時にエクストルーダーの試し出しまたはパージが必要になる場合があります。 余分な材料をワイプタワーに射出します。" + +#: src/slic3r/GUI/Plater.cpp:2360 src/slic3r/GUI/Plater.cpp:2413 +msgid "Multi-part object detected" +msgstr "マルチパートオブジェクトを検出" + +#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454 +#, possible-c-format +msgid "Multiple %s devices found. Please only connect one at a time for flashing." +msgstr "複数の%sデバイスが見つかりました。 更新するには一度に1つずつ接続してください。" + +#: src/slic3r/GUI/Tab.cpp:1179 +msgid "Multiple Extruders" +msgstr "複数のエクストルーダー" + +#: src/slic3r/GUI/Plater.cpp:2410 +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 "マルチマテリアルプリンター用に複数のオブジェクトがロードされました。\nこれらは複数のオブジェクトではなく、\n複数のパーツからなる単一のオブジェクトとしますか?" + +#: src/libslic3r/PrintConfig.cpp:3439 +msgid "Multiply copies by creating a grid." +msgstr "グリッドを作成して複数コピーします。" + +#: src/libslic3r/PrintConfig.cpp:3434 +msgid "Multiply copies by this factor." +msgstr "この係数で複数コピーします。" + +#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:580 +msgid "N/A" +msgstr "N/A" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:270 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 +msgid "Name" +msgstr "名前" + +#: src/libslic3r/PrintConfig.cpp:1488 +msgid "Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter." +msgstr "プリンターバリエーションの名前。 たとえば、プリンターのバリエーションは、ノズル径によって区別されます。" + +#: src/libslic3r/PrintConfig.cpp:1482 +msgid "Name of the printer vendor." +msgstr "プリンターメーカーの名前。" + +#: src/libslic3r/PrintConfig.cpp:1058 +msgid "Name of the profile, from which this profile inherits." +msgstr "このプロファイルが継承するプロファイルの名前。" + +#: src/libslic3r/PrintConfig.cpp:1630 +msgid "Nearest" +msgstr "近傍" + +#: src/slic3r/GUI/BonjourDialog.cpp:55 +msgid "Network lookup" +msgstr "ネットワーク調査" + +#: src/slic3r/GUI/Plater.cpp:2151 +msgid "New Project" +msgstr "新プロジェクト" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +msgid "New project, clear plater" +msgstr "新しいプロジェクト、プレート上のモデルの削除" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +#, possible-c-format +msgid "New version of %s is available" +msgstr "新バージョン%sがあります" + +#: src/slic3r/GUI/UpdateDialogs.cpp:45 +msgid "New version:" +msgstr "新バージョン:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 +msgid "Next Redo action: %1%" +msgstr "次のやり直し:%1%" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4641 +msgid "Next Undo action: %1%" +msgstr "次の取り消しアクション:%1%" + +#: src/libslic3r/PrintConfig.cpp:960 +msgid "No extrusion" +msgstr "射出なし" + +#: src/libslic3r/SLAPrintSteps.cpp:453 +msgid "No pad can be generated for this model with the current configuration" +msgstr "現在の構成では、このモデルのパッドを生成できません" + +#: src/slic3r/GUI/MainFrame.cpp:784 +msgid "No previously sliced file." +msgstr "以前にスライスされたファイルはありません。" + +#: src/slic3r/GUI/RammingChart.cpp:23 +msgid "NO RAMMING AT ALL" +msgstr "ラミングなし" + +#: src/libslic3r/PrintConfig.cpp:1857 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "スパースレイヤーなし(試用的)" + +#: src/libslic3r/PrintConfig.cpp:2774 +msgid "No support points will be placed closer than this threshold." +msgstr "このしきい値よりも近くにサポートポイントは配置されません。" + +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "No updates available" +msgstr "利用可能なアップデートはありません" + +#: 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 +msgid "None" +msgstr "なし" + +#: src/slic3r/GUI/Tab.cpp:2203 +msgid "Normal" +msgstr "ノーマル" + +#: src/slic3r/GUI/Plater.cpp:1286 +msgid "normal mode" +msgstr "通常モード" + +#: src/libslic3r/Zipper.cpp:46 +msgid "not a ZIP archive" +msgstr "ZIPアーカイブではありません" + +#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302 +msgid "Not found:" +msgstr "見つかりません:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1019 +msgid "Note" +msgstr "注意" + +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "注:AstroBoxバージョン1.1.0以降が必要です。" + +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "Note: FlashAir with firmware 2.00.02 or newer and activated upload function is required." +msgstr "注:ファームウェア2.00.02以降のFlashAirおよびアップロード機能を有効にする必要があります。" + +#: src/slic3r/Utils/OctoPrint.cpp:89 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "注:OctoPrintのバージョンは1.1.0以上が必要です。" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 +msgid "Note: some shortcuts work in (non)editing mode only." +msgstr "注:一部のショートカットは編集モードでは使えません。" + +#: 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 +msgid "Notes" +msgstr "メモ" + +#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905 +#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:245 +msgid "Notice" +msgstr "通知" + +#: src/slic3r/GUI/ConfigWizard.cpp:218 +msgid "nozzle" +msgstr "ノズル" + +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2340 +#: src/libslic3r/PrintConfig.cpp:1326 +msgid "Nozzle diameter" +msgstr "ノズル径" + +#: src/slic3r/GUI/ConfigWizard.cpp:969 +msgid "Nozzle Diameter:" +msgstr "ノズル径:" + +#: src/libslic3r/PrintConfig.cpp:650 +msgid "Number of cooling moves" +msgstr "冷却移動回数" + +#: src/slic3r/GUI/Tab.cpp:1839 +msgid "Number of extruders of the printer." +msgstr "プリンターのエクストルーダー数。" + +#: src/libslic3r/PrintConfig.cpp:1975 +msgid "Number of interface layers to insert between the object(s) and support material." +msgstr "オブジェクトとサポート材の間に挿入するインターフェイスレイヤーの数。" + +#: src/libslic3r/PrintConfig.cpp:1697 +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:2365 +msgid "Number of pixels in" +msgstr "ピクセル数" + +#: src/libslic3r/PrintConfig.cpp:2367 +msgid "Number of pixels in X" +msgstr "Xのピクセル数" + +#: src/libslic3r/PrintConfig.cpp:2373 +msgid "Number of pixels in Y" +msgstr "Yのピクセル数" + +#: src/libslic3r/PrintConfig.cpp:176 +msgid "Number of solid layers to generate on bottom surfaces." +msgstr "底部のソリッドレイヤー(塗りつぶし)数。" + +#: src/libslic3r/PrintConfig.cpp:1781 +msgid "Number of solid layers to generate on top and bottom surfaces." +msgstr "上部と底部のソリッドレイヤー(塗りつぶし)数。" + +#: src/libslic3r/PrintConfig.cpp:2134 +msgid "Number of solid layers to generate on top surfaces." +msgstr "上部に生成するソリッドレイヤー(塗りつぶし)数。" + +#: src/libslic3r/PrintConfig.cpp:2518 +msgid "Number of the layers needed for the exposure time fade from initial exposure time to the exposure time" +msgstr "初期露光時間から露光時間に移行するために必要なレイヤーの数" + +#: src/slic3r/GUI/Plater.cpp:241 +msgid "Number of tool changes" +msgstr "ツールチェンジ回数" + +#: src/libslic3r/PrintConfig.cpp:2753 +msgid "Object elevation" +msgstr "オブジェクトの持ち上げ高" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2466 +msgid "Object manipulation" +msgstr "オブジェクト操作" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638 +msgid "Object name" +msgstr "オブジェクト名" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3417 +msgid "Object or Instance" +msgstr "オブジェクトまたはインスタンス" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 +msgid "Object reordered" +msgstr "オブジェクト順序変更" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2479 +msgid "Object Settings to modify" +msgstr "オブジェクト設定を変更" + +#: src/slic3r/GUI/Plater.cpp:2529 +msgid "Object too large?" +msgstr "オブジェクトが大きすぎませんか?" + +#: src/libslic3r/PrintConfig.cpp:2262 +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/slic3r/GUI/Plater.cpp:1194 +msgid "object(s)" +msgstr "オブジェクト" + +#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245 +msgid "objects" +msgstr "オブジェクト" + +#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 +msgid "Octagram Spiral" +msgstr "オクタグラムスパイラル" + +#: src/slic3r/GUI/BonjourDialog.cpp:76 +msgid "OctoPrint version" +msgstr "OctoPrintバージョン" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3425 +msgid "of a current Object" +msgstr "現在のオブジェクトの" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +msgid "Offset" +msgstr "オフセット" + +#: src/slic3r/GUI/Tab.cpp:1755 +#, possible-c-format +msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." +msgstr "このシステムでは、%sはシステムの証明書ストアまたはキーチェーンからのHTTPS証明書を使用します。" + +#: src/slic3r/GUI/DoubleSlider.cpp:950 +msgid "One layer mode" +msgstr "1レイヤーモード" + +#: src/libslic3r/Print.cpp:1365 +msgid "One or more object were assigned an extruder that the printer does not have." +msgstr "1つ以上のオブジェクトに、プリンターにないエクストルーダーが割り当てられました。" + +#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2676 +msgid "Only create support if it lies on a build plate. Don't create support on a print." +msgstr "ビルドプレート(ベッド)上からのみサポートを作成します。プリントしたモデル上からはサポートを生成しません。" + +#: src/libslic3r/PrintConfig.cpp:1027 +msgid "Only infill where needed" +msgstr "必要な場合のみインフィルを付ける" + +#: src/slic3r/GUI/Tab.cpp:2373 +msgid "Only lift Z" +msgstr "Zをリフト" + +#: src/libslic3r/PrintConfig.cpp:1570 +msgid "Only lift Z above" +msgstr "これ以上でリフトZ" + +#: src/libslic3r/PrintConfig.cpp:1579 +msgid "Only lift Z below" +msgstr "Zリフト以下" + +#: src/libslic3r/PrintConfig.cpp:1348 +msgid "Only retract when crossing perimeters" +msgstr "外周をまたぐときだけ吸込み" + +#: src/slic3r/GUI/Tab.cpp:1187 +msgid "Ooze prevention" +msgstr "垂れ出し抑止" + +#: src/libslic3r/Print.cpp:1266 +msgid "Ooze prevention is currently not supported with the wipe tower enabled." +msgstr "垂れ防止機能は、現在のところ、ワイプタワーを有効にした状態では使えません。" + +#: src/slic3r/GUI/MainFrame.cpp:408 +msgid "Open a project file" +msgstr "プロジェクトファイルを開く" + +#: src/slic3r/GUI/Tab.cpp:1729 +msgid "Open CA certificate file" +msgstr "CA証明書ファイルを開く" + +#: 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/KBShortcutsDialog.cpp:113 +msgid "Open project STL/OBJ/AMF/3MF with config, clear plater" +msgstr "プロジェクトSTL/OBJ/AMF/3MFを設定を含めて開き、プレートをクリアします" + +#: src/slic3r/GUI/MainFrame.cpp:693 +#, possible-c-format +msgid "Open the %s website in your browser" +msgstr "ブラウザで%sウェブサイトを開きます" + +#: src/slic3r/GUI/MainFrame.cpp:684 +msgid "Open the Prusa3D drivers download page in your browser" +msgstr "ブラウザーでPrusa3Dドライバのダウンロードページを開きます" + +#: src/slic3r/GUI/MainFrame.cpp:686 +msgid "Open the software releases page in your browser" +msgstr "ブラウザでソフトウェアリリースページを開きます" + +#: src/slic3r/GUI/Plater.cpp:4040 +msgid "Optimize orientation" +msgstr "向きを最適化する" + +#: src/slic3r/GUI/Plater.cpp:2767 +msgid "Optimize Rotation" +msgstr "回転の最適化" + +#: src/slic3r/GUI/Plater.cpp:4040 +msgid "Optimize the rotation of the object for better print results." +msgstr "プリント結果をよくするために、オブジェクトの回転を最適化します。" + +#: src/libslic3r/PrintConfig.cpp:137 +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/slic3r/GUI/Tab.cpp:1131 +msgid "Options for support material and raft" +msgstr "サポート材とラフトのオプション" + +#: src/slic3r/GUI/DoubleSlider.cpp:989 +msgid "or press \"+\" key" +msgstr "もしくは\"+\"キーを押す" + +#: src/slic3r/GUI/Plater.cpp:2892 +msgid "Orientation found." +msgstr "オリエンテーションが見つかりました。" + +#: src/slic3r/GUI/Plater.cpp:2891 +msgid "Orientation search canceled." +msgstr "オリエンテーション検索がキャンセルされました。" + +#: src/slic3r/GUI/BedShapeDialog.cpp:84 +msgid "Origin" +msgstr "原点" + +#: src/slic3r/GUI/Tab.cpp:1227 +msgid "Other" +msgstr "その他" + +#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064 +msgid "Other layers" +msgstr "他のレイヤー" + +#: src/slic3r/GUI/ConfigWizard.cpp:856 +msgid "Other Vendors" +msgstr "他のベンダー" + +#: src/slic3r/GUI/Tab.cpp:1238 src/slic3r/GUI/Tab.cpp:3666 +msgid "Output file" +msgstr "出力ファイル" + +#: src/libslic3r/PrintConfig.cpp:3493 +msgid "Output File" +msgstr "ファイル出力" + +#: src/libslic3r/PrintConfig.cpp:1363 +msgid "Output filename format" +msgstr "出力ファイル名の形式" + +#: src/libslic3r/PrintConfig.cpp:3381 +msgid "Output Model Info" +msgstr "モデル情報のアウトプット" + +#: src/slic3r/GUI/Tab.cpp:1230 src/slic3r/GUI/Tab.cpp:3665 +msgid "Output options" +msgstr "出力オプション" + +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312 +msgid "Overhang perimeter" +msgstr "オーバーハング外周" + +#: src/libslic3r/PrintConfig.cpp:2042 +msgid "Overhang threshold" +msgstr "オーバハングのしきい値" + +#: src/slic3r/GUI/Tab.cpp:1215 +msgid "Overlap" +msgstr "オーバーラップ" + +#: src/slic3r/GUI/MainFrame.cpp:614 +msgid "P&rint Settings Tab" +msgstr "プリント設定タブ(&r)" + +#: 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 +msgid "Pad" +msgstr "パッド" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 +msgid "Pad and Support" +msgstr "パッドとサポート" + +#: src/libslic3r/PrintConfig.cpp:2855 +msgid "Pad around object" +msgstr "オブジェクト周りにパッド" + +#: src/libslic3r/PrintConfig.cpp:2862 +msgid "Pad around object everywhere" +msgstr "オブジェクト周り全体にパッドを配置" + +#: src/libslic3r/PrintConfig.cpp:2811 +msgid "Pad brim size" +msgstr "パッドブリムサイズ" + +#: src/libslic3r/SLA/Pad.cpp:691 +msgid "Pad brim size is too small for the current configuration." +msgstr "パッドのブリム(縁)サイズは、現在の構成には小さすぎます。" + +#: src/libslic3r/PrintConfig.cpp:2898 +msgid "Pad object connector penetration" +msgstr "パッドオブジェクトコネクタの貫通" + +#: src/libslic3r/PrintConfig.cpp:2880 +msgid "Pad object connector stride" +msgstr "パッドオブジェクトコネクタのピッチ" + +#: src/libslic3r/PrintConfig.cpp:2889 +msgid "Pad object connector width" +msgstr "パッドオブジェクトの接続幅" + +#: src/libslic3r/PrintConfig.cpp:2869 +msgid "Pad object gap" +msgstr "パッドオブジェクトのギャップ" + +#: src/libslic3r/PrintConfig.cpp:2797 +msgid "Pad wall height" +msgstr "パッド壁の高さ" + +#: src/libslic3r/PrintConfig.cpp:2844 +msgid "Pad wall slope" +msgstr "側壁の傾斜" + +#: src/libslic3r/PrintConfig.cpp:2787 +msgid "Pad wall thickness" +msgstr "台座の壁の厚さ" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +msgid "Page Down" +msgstr "ページダウン" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Page Up" +msgstr "ページアップ" + +#: src/slic3r/GUI/Field.cpp:139 +msgid "parameter name" +msgstr "パラメータ名" + +#: src/slic3r/GUI/Field.cpp:243 +msgid "Parameter validation" +msgstr "パラメータ検証" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 +msgid "Part" +msgstr "パート" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2494 +msgid "Part manipulation" +msgstr "部品操作" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2483 +msgid "Part Settings to modify" +msgstr "変更するパーツ設定" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4514 +msgid "Paste" +msgstr "ペースト" + +#: src/slic3r/GUI/MainFrame.cpp:592 +msgid "Paste clipboard" +msgstr "クリップボードからペースト" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 +msgid "Paste from clipboard" +msgstr "クリップボードからペースト" + +#: src/slic3r/GUI/Plater.cpp:5606 +msgid "Paste From Clipboard" +msgstr "クリップボードからの貼り付け" + +#: src/libslic3r/PrintConfig.cpp:2002 +msgid "Pattern" +msgstr "パターン" + +#: src/libslic3r/PrintConfig.cpp:1891 +msgid "Pattern angle" +msgstr "パターン角" + +#: src/libslic3r/PrintConfig.cpp:2016 +msgid "Pattern spacing" +msgstr "パターンの間隔" + +#: src/libslic3r/PrintConfig.cpp:2004 +msgid "Pattern used to generate support material." +msgstr "サポートの生成用のパターン。" + +#: src/slic3r/GUI/Plater.cpp:1261 +msgid "Pause" +msgstr "停止" + +#: src/slic3r/GUI/DoubleSlider.cpp:1009 +msgid "Pause print (\"%1%\")" +msgstr "プリント停止(\"%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 "プリントを一時停止するか、カスタムGコードを挿入します" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175 +msgid "Perform cut" +msgstr "カットする" + +#: src/libslic3r/PrintConfig.cpp:2927 +msgid "Performance vs accuracy of calculation. Lower values may produce unwanted artifacts." +msgstr "パフォーマンスvs.計算の精度。 値を低くすると、不自然な結果が生成される場合があります。" + +#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:310 +msgid "Perimeter" +msgstr "外周" + +#: src/libslic3r/PrintConfig.cpp:1408 +msgid "Perimeter extruder" +msgstr "外周エクストルーダー" + +#: src/slic3r/GUI/PresetHints.cpp:165 +msgid "perimeters" +msgstr "外周" + +#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440 +msgid "Perimeters" +msgstr "外周" + +#: src/slic3r/GUI/ConfigWizard.cpp:860 +#, possible-c-format +msgid "Pick another vendor supported by %s" +msgstr "%sがサポートする別のベンダーを選択してください" + +#: src/libslic3r/PrintConfig.cpp:66 +msgid "Picture sizes to be stored into a .gcode and .sl1 files" +msgstr ".gcodeおよび.sl1ファイルに保存される画像サイズ" + +#: src/libslic3r/PrintConfig.cpp:2681 +msgid "Pillar widening factor" +msgstr "柱の太さ係数" + +#: src/slic3r/GUI/ConfigManipulation.cpp:330 +msgid "Pinhead diameter should be smaller than the pillar diameter." +msgstr "サポートチップの直径は、支柱の直径より小さくする必要があります。" + +#: src/slic3r/GUI/DoubleSlider.cpp:79 +msgid "Place bearings in slots and resume printing" +msgstr "ベアリングを穴に挿入し、プリントを再開します" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45 +msgid "Place on face" +msgstr "ベッド上に配置" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:204 +msgid "Plater" +msgstr "プレート" + +#: src/slic3r/GUI/GUI_App.cpp:1085 +msgid "Please check and fix your object list." +msgstr "オブジェクトリストを確認して修正してください。" + +#: src/slic3r/GUI/Plater.cpp:2312 src/slic3r/GUI/Tab.cpp:2959 +msgid "Please check your object list before preset changing." +msgstr "プリセットを変更する前にオブジェクトリストを確認してください。" + +#: src/slic3r/GUI/Plater.cpp:3286 +msgid "Please select the file to reload" +msgstr "リロードするファイルを選択してください" + +#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291 +msgid "Portions copyright" +msgstr "一部の著作権" + +#: src/libslic3r/PrintConfig.cpp:2400 +msgid "Portrait" +msgstr "ポートレート" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457 +msgid "Position" +msgstr "位置" + +#: src/slic3r/GUI/Tab.cpp:2367 +msgid "Position (for multi-extruder printers)" +msgstr "ポジション(マルチエクストルーダーの場合)" + +#: src/libslic3r/PrintConfig.cpp:1623 +msgid "Position of perimeters starting points." +msgstr "外周プリントの開始点。" + +#: src/libslic3r/PrintConfig.cpp:2224 +msgid "Position X" +msgstr "X位置" + +#: src/libslic3r/PrintConfig.cpp:2231 +msgid "Position Y" +msgstr "Yポジション" + +#: src/slic3r/GUI/Tab.cpp:1245 src/libslic3r/PrintConfig.cpp:1453 +msgid "Post-processing scripts" +msgstr "ポストプロセス・スクリプト" + +#: src/slic3r/GUI/MainFrame.cpp:629 +msgid "Pre&view" +msgstr "プレビュー(&v)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10 +msgid "Preferences" +msgstr "環境設定" + +#: src/libslic3r/PrintConfig.cpp:1641 +msgid "Preferred direction of the seam" +msgstr "シームの優先方向" + +#: src/libslic3r/PrintConfig.cpp:1652 +msgid "Preferred direction of the seam - jitter" +msgstr "シームの優先方向ージッター" + +#: src/libslic3r/PrintObject.cpp:255 +msgid "Preparing infill" +msgstr "インフィルの準備" + +#: src/slic3r/GUI/Tab.cpp:2920 +#, possible-c-format +msgid "Preset (%s)" +msgstr "プリセット(%s)" + +#: src/slic3r/GUI/Tab.cpp:3082 +msgid "Preset with name \"%1%\" already exists." +msgstr "\"%1%\"というプリセット名は既に存在します。" + +#: src/slic3r/GUI/Tab.cpp:3029 +msgctxt "PresetName" +msgid "Copy" +msgstr "コピー" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +msgid "Press to activate deselection rectangle" +msgstr "押すと選択解除長方形をアクティブにします" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 +msgid "Press to activate one direction scaling in Gizmo scale" +msgstr "クリックして一方向だけギズモサイズを変更します" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +msgid "Press to activate selection rectangle" +msgstr "押すと選択範囲がアクティブになります" + +#: 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 "押して、選択したオブジェクトの中心でスケーリング\n(ギズモスケール)または回転(ギズモ回転)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +msgid "Press to select multiple objects\nor move multiple objects with mouse" +msgstr "マウスを押して複数のオブジェクトを選択します\nまたは複数のオブジェクトを移動します" + +#: 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 "ギズモスケールで5%スナップする\nまたはギズモ移動で1mmずつスナップする" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/Plater.cpp:4105 +#: src/slic3r/GUI/Tab.cpp:2390 +msgid "Preview" +msgstr "プレビュー" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Preview hollowed and drilled model" +msgstr "くり抜き穴開けモデルのプレビュー" + +#: src/slic3r/GUI/MainFrame.cpp:790 +msgid "Previously sliced file (" +msgstr "以前のスライスファイル(" + +#: src/libslic3r/PrintConfig.cpp:1851 +msgid "Prime all printing extruders" +msgstr "全てのエクストルーダーでプライムを実施" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1521 +msgid "print" +msgstr "プリント" + +#: src/slic3r/GUI/MainFrame.cpp:648 +msgid "Print &Host Upload Queue" +msgstr "プリントサーバーアップロードキュー(&H)" + +#: src/libslic3r/PrintConfig.cpp:471 +msgid "Print contour perimeters from the outermost one to the innermost one instead of the default inverse order." +msgstr "デフォルトの順ではなく、外周から始めて内周へとプリントします。" + +#: src/slic3r/GUI/ConfigWizard.cpp:952 +msgid "Print Diameters" +msgstr "各種直径" + +#: src/slic3r/GUI/Tab.cpp:1944 src/slic3r/GUI/Tab.cpp:2123 +msgid "Print Host upload" +msgstr "プリントサーバーアップロード" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/PrintHostDialogs.cpp:136 +msgid "Print host upload queue" +msgstr "プリントサーバーのアップロードキュー" + +#: src/slic3r/GUI/DoubleSlider.cpp:970 +msgid "Print mode" +msgstr "プリントモード" + +#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:431 +msgid "Print Settings" +msgstr "プリント設定" + +#: src/slic3r/GUI/Plater.cpp:815 +msgid "Print settings" +msgstr "プリント設定" + +#: src/slic3r/GUI/Tab.cpp:1478 +msgid "Print speed override" +msgstr "プリント速度上書き" + +#: src/libslic3r/GCode.cpp:638 +msgid "Print z" +msgstr "Z高さでプリント" + +#: src/slic3r/GUI/MainFrame.cpp:621 +msgid "Print&er Settings Tab" +msgstr "プリンター設定タブ(&e)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1621 +msgid "Printable" +msgstr "プリント可" + +#: src/slic3r/GUI/Plater.cpp:819 +msgid "Printer" +msgstr "プリンター" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1525 +msgid "printer" +msgstr "プリンター" + +#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 +msgid "Printer absolute correction" +msgstr "絶対的なプリンター補正" + +#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457 +msgid "Printer gamma correction" +msgstr "プリンタガンマ補正" + +#: src/slic3r/GUI/Tab.cpp:976 +msgid "printer model" +msgstr "プリンターモデル" + +#: src/libslic3r/PrintConfig.cpp:1472 +msgid "Printer notes" +msgstr "プリンターメモ" + +#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2433 +msgid "Printer scaling correction" +msgstr "プリンタースケーリング補正" + +#: src/slic3r/GUI/Tab.hpp:391 +msgid "Printer Settings" +msgstr "プリンター設定" + +#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 +msgid "Printer technology" +msgstr "プリント方式" + +#: src/libslic3r/PrintConfig.cpp:1466 +msgid "Printer type" +msgstr "プリンタータイプ" + +#: src/libslic3r/PrintConfig.cpp:1487 +msgid "Printer variant" +msgstr "プリンターバリエーション" + +#: src/libslic3r/PrintConfig.cpp:1481 +msgid "Printer vendor" +msgstr "プリンターメーカー" + +#: src/libslic3r/Print.cpp:1388 +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)、すべてのノズル径を同じにする必要があります。" + +#. TRN "Processing input_file_basename" +#: src/slic3r/GUI/MainFrame.cpp:849 +#, possible-c-format +msgid "Processing %s" +msgstr "%s実行中" + +#: src/slic3r/GUI/Plater.cpp:2283 +#, possible-c-format +msgid "Processing input file %s" +msgstr "入力ファイル%sを処理中" + +#: src/libslic3r/PrintObject.cpp:108 +msgid "Processing triangulated mesh" +msgstr "ポリゴンメッシュ処理" + +#: 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 +msgid "Profile dependencies" +msgstr "プロファイルの依存関係" + +#: src/slic3r/GUI/ConfigWizard.cpp:566 +msgid "Profile:" +msgstr "プロファイル:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:150 +msgid "Progress" +msgstr "進捗" + +#: src/slic3r/GUI/FirmwareDialog.cpp:817 +msgid "Progress:" +msgstr "進度:" + +#: src/slic3r/GUI/MainFrame.cpp:684 +msgid "Prusa 3D &Drivers" +msgstr "Prusa 3&D &ドライバー" + +#: src/slic3r/GUI/ConfigWizard.cpp:1995 +msgid "Prusa FFF Technology Printers" +msgstr "Prusa FFF方式プリンター" + +#: src/slic3r/GUI/ConfigWizard.cpp:1998 +msgid "Prusa MSLA Technology Printers" +msgstr "Prusa MSLA方式プリンター" + +#: src/slic3r/GUI/AboutDialog.cpp:260 +msgid "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community." +msgstr "PrusaSlicerは、Alessandro RanellucciとRepRapコミュニティによるSlic3rをベースにしています。" + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:284 +#, 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 "OpenGLバージョン%s、レンダー%s、ベンダー%sが検出されました。PrusaSlicerには、OpenGL 2.0が機能するグラフィックドライバーが必要です。" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50 +msgid "PrusaSlicer version" +msgstr "PrusaSlicerバージョン" + +#: src/slic3r/GUI/ConfigWizard.cpp:815 +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 "PrusaSlicerのユーザーインターフェイスには、次の3つのバリエーションがあります。\nシンプル、高度、エキスパート。\nシンプルモードでは、通常の3Dプリントするときに最も一般的に使用される設定のみが表示されます。 他の2つは上級ユーザーやエキスパートユーザー向けに微調整できる項目を提供します。" + +#: src/libslic3r/PrintConfig.cpp:2254 +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/slic3r/GUI/Plater.cpp:544 +msgid "Purging volumes" +msgstr "パージ体積" + +#: src/libslic3r/PrintConfig.cpp:2207 +msgid "Purging volumes - load/unload volumes" +msgstr "パージ量-ロード/アンロード時" + +#: src/libslic3r/PrintConfig.cpp:2214 +msgid "Purging volumes - matrix" +msgstr "パージする量−行列" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +msgid "Quality" +msgstr "品質" + +#: src/slic3r/GUI/Tab.cpp:1080 +msgid "Quality (slower slicing)" +msgstr "高品質(スライスが遅くなります)" + +#: src/slic3r/GUI/GLCanvas3D.cpp:273 +msgid "Quality / Speed" +msgstr "品質/スピード" + +#: 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 +#, possible-c-format +msgid "Quick Add Settings (%s)" +msgstr "クイック追加設定(%s)" + +#: src/slic3r/GUI/MainFrame.cpp:512 +msgid "Quick Slice" +msgstr "高速スライス" + +#: src/slic3r/GUI/MainFrame.cpp:518 +msgid "Quick Slice and Save As" +msgstr "クイックスライスと名前を付けて保存" + +#: src/slic3r/GUI/MainFrame.cpp:540 +#, possible-c-format +msgid "Quit %s" +msgstr "%sを終了" + +#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511 +msgid "Radius" +msgstr "半径" + +#: src/slic3r/GUI/Tab.cpp:1127 +msgid "Raft" +msgstr "ラフト" + +#: src/libslic3r/PrintConfig.cpp:1501 +msgid "Raft layers" +msgstr "ラフトレイヤー" + +#: 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\nThis is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc." +msgstr "ラミングとは、単一エクストルーダーMMプリンターでツールを交換する直前の急速吐出動作を指します。 その目的は、フィラメントを抜く時に新しいフィラメントの挿入を妨げないようにすることと、再挿入のときにエラーにならないよう、フィラメントの先端部を適切な形にすることです。 この処理は重要であり、材料が変わると、良好な先端形状が得られるラミング条件の変更が必要となったりします。 このため、ラミング中の吐出速度は調整できるようになっています。\n\nこれはエキスパートレベルの設定です。不適切な調整は、ジャムや、ドライブギアがフィラメントを削ったりする可能性があります。" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 +msgid "Ramming line spacing" +msgstr "ラミング線間距離" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 +msgid "Ramming line width" +msgstr "ラミング線幅" + +#: src/libslic3r/PrintConfig.cpp:694 +msgid "Ramming parameters" +msgstr "ラミングパラメーター" + +#: src/slic3r/GUI/Tab.cpp:1505 +msgid "Ramming settings" +msgstr "ラミング設定" + +#: src/libslic3r/PrintConfig.cpp:1629 +msgid "Random" +msgstr "ランダム" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +msgid "Range" +msgstr "範囲" + +#: src/libslic3r/SLAPrintSteps.cpp:65 +msgid "Rasterizing layers" +msgstr "レイヤーのラスタライズ" + +#: src/slic3r/GUI/MainFrame.cpp:596 +msgid "Re&load from disk" +msgstr "ディスクからリロード(&l)" + +#: src/slic3r/GUI/UpdateDialogs.cpp:249 +msgid "Re-configure" +msgstr "再構成" + +#: src/slic3r/GUI/FirmwareDialog.cpp:821 +msgid "Ready" +msgstr "準備完了" + +#: src/slic3r/GUI/Plater.cpp:3115 +msgid "Ready to slice" +msgstr "スライス可能" + +#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632 +msgid "Rear" +msgstr "背面" + +#: src/slic3r/GUI/MainFrame.cpp:669 +msgid "Rear View" +msgstr "背面" + +#: src/slic3r/GUI/MainFrame.cpp:413 +msgid "Recent projects" +msgstr "最近のプロジェクト" + +#: src/slic3r/GUI/PresetHints.cpp:263 +#, possible-c-format +msgid "Recommended object thin wall thickness for layer height %.2f and" +msgstr "レイヤー高さ%.2fでの推奨オブジェクトの薄壁厚と" + +#: src/slic3r/GUI/PresetHints.cpp:274 +msgid "Recommended object thin wall thickness: Not available due to excessively small extrusion width." +msgstr "推奨されるオブジェクトの薄壁の厚さ:押出し幅が小さくなりすぎるため利用できません。" + +#: src/slic3r/GUI/PresetHints.cpp:247 +msgid "Recommended object thin wall thickness: Not available due to invalid layer height." +msgstr "推奨されるオブジェクトの薄壁の厚さ:レイヤーの高さが無効なため利用できません。" + +#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459 +msgid "Recreating" +msgstr "更新" + +#: src/slic3r/GUI/BedShapeDialog.cpp:73 +msgid "Rectangular" +msgstr "四角形" + +#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843 +#: src/libslic3r/PrintConfig.cpp:2009 +msgid "Rectilinear" +msgstr "直線的" + +#: src/libslic3r/PrintConfig.cpp:2010 +msgid "Rectilinear grid" +msgstr "直線グリッド" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131 +#: src/slic3r/GUI/MainFrame.cpp:584 +msgid "Redo" +msgstr "再実行" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 +#, possible-c-format +msgid "Redo %1$d Action" +msgid_plural "Redo %1$d Actions" +msgstr[0] "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 +msgid "Redo History" +msgstr "やり直し履歴" + +#: src/slic3r/GUI/Tab.cpp:1098 +msgid "Reducing printing time" +msgstr "造形時間短縮" + +#: src/slic3r/GUI/Plater.cpp:3452 +msgid "Reload all from disk" +msgstr "全てをディスクからリロード" + +#: 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 +msgid "Reload from disk" +msgstr "ディスクからリロード" + +#: src/slic3r/GUI/Plater.cpp:3339 +msgid "Reload from:" +msgstr "リロード元:" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +msgid "Reload plater from disk" +msgstr "ディスクからプレートをリロードします" + +#: src/slic3r/GUI/MainFrame.cpp:597 +msgid "Reload the plater from disk" +msgstr "プレートをリロードします" + +#: src/slic3r/GUI/Plater.cpp:3963 +msgid "Reload the selected object from disk" +msgstr "選択したオブジェクトをディスクからリロードします" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1664 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3934 +msgid "Reload the selected volumes from disk" +msgstr "選択したオブジェクトをディスクからリロードする" + +#: src/slic3r/GUI/Preferences.cpp:39 +msgid "Remember output directory" +msgstr "出力ディレクトリを記憶する" + +#: src/slic3r/GUI/Tab.cpp:3121 +msgid "remove" +msgstr "外す" + +#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 +#: src/slic3r/GUI/Tab.cpp:3124 +msgid "Remove" +msgstr "除去" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +msgid "Remove all holes" +msgstr "全ての穴の削除" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 +msgid "Remove all points" +msgstr "全てのポイントを削除" + +#: src/slic3r/GUI/GLCanvas3D.cpp:246 +msgid "Remove detail" +msgstr "詳細を削除" + +#: src/slic3r/GUI/Plater.cpp:879 +msgid "Remove device" +msgstr "デバイスを削除する" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182 +msgid "Remove extruder from sequence" +msgstr "リストからエクストルーダーを削除する" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4537 src/slic3r/GUI/Plater.cpp:3942 +msgid "Remove instance" +msgstr "インスタンス削除" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 +msgid "Remove Instance of the selected object" +msgstr "選択したオブジェクトのインスタンスを削除" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153 +msgid "Remove layer range" +msgstr "レイヤーの範囲を削除します" + +#: src/slic3r/GUI/Plater.cpp:3942 +msgid "Remove one instance of the selected object" +msgstr "選択したオブジェクトのインスタンスを1つ削除します" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95 +msgid "Remove parameter" +msgstr "パラメータを削除" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 +msgid "Remove point" +msgstr "ポイント削除" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 +msgid "Remove point from selection" +msgstr "選択からポイントを削除" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +msgid "Remove selected holes" +msgstr "選択した穴の削除" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1371 +msgid "Remove selected points" +msgstr "選択したポイントを削除" + +#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953 +msgid "Remove the selected object" +msgstr "選択オブジェクトを削除" + +#: src/slic3r/GUI/ConfigWizard.cpp:453 +msgid "Remove user profiles (a snapshot will be taken beforehand)" +msgstr "ユーザープロファイルを削除します(スナップショットは事前に作成されます)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1636 +msgid "Rename" +msgstr "名前の変更" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:551 +msgid "Rename Object" +msgstr "オブジェクト名を変更" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:551 +msgid "Rename Sub-object" +msgstr "サブオブジェクトの名前変更" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3803 +msgid "Renaming" +msgstr "名前の変更" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115 +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/libslic3r/PrintConfig.cpp:3515 +msgid "Render with a software renderer" +msgstr "ソフトウェアでレンダリングする" + +#: src/libslic3r/PrintConfig.cpp:3516 +msgid "Render with a software renderer. The bundled MESA software renderer is loaded instead of the default OpenGL driver." +msgstr "ソフトウェアレンダラーでレンダリングします。 デフォルトのOpenGLドライバーの代わりに、バンドルされたMESAソフトウェアレンダラーがロードされます。" + +#: src/slic3r/GUI/MainFrame.cpp:911 src/libslic3r/PrintConfig.cpp:3447 +msgid "Repair" +msgstr "修復" + +#: src/slic3r/Utils/FixModelByWin10.cpp:387 +msgid "Repaired 3MF file contains more than one object" +msgstr "修復された3MFファイルに複数のオブジェクトが含まれています" + +#: src/slic3r/Utils/FixModelByWin10.cpp:391 +msgid "Repaired 3MF file contains more than one volume" +msgstr "修復された3MFファイルに複数のボリュームが含まれています" + +#: src/slic3r/Utils/FixModelByWin10.cpp:385 +msgid "Repaired 3MF file does not contain any object" +msgstr "修正された3MFファイルにはオブジェクトがありません" + +#: src/slic3r/Utils/FixModelByWin10.cpp:389 +msgid "Repaired 3MF file does not contain any volume" +msgstr "修正された3MFファイルにはソリッドボディがありません" + +#: src/slic3r/Utils/FixModelByWin10.cpp:242 +msgid "Repairing model by the Netfabb service" +msgstr "Netfabbでモデルを修復中" + +#: src/slic3r/GUI/MainFrame.cpp:524 +msgid "Repeat last quick slice" +msgstr "最後のクイックスライスを繰り返す" + +#: src/slic3r/GUI/MainFrame.cpp:524 +msgid "Repeat Last Quick Slice" +msgstr "最後のクイックスライスを繰り返す" + +#: src/slic3r/GUI/Tab.cpp:3083 +msgid "Replace?" +msgstr "置き換えますか?" + +#: src/slic3r/GUI/MainFrame.cpp:703 +msgid "Report an I&ssue" +msgstr "問題を報告する(&s)" + +#: src/slic3r/GUI/MainFrame.cpp:703 +#, possible-c-format +msgid "Report an issue on %s" +msgstr "%sに関する問題を報告する" + +#: src/slic3r/Utils/PresetUpdater.cpp:713 +#, possible-c-format +msgid "requires max. %s" +msgstr "最大%sが必要" + +#: src/slic3r/Utils/PresetUpdater.cpp:710 +#, possible-c-format +msgid "requires min. %s" +msgstr "最小%sが必要" + +#: src/slic3r/Utils/PresetUpdater.cpp:705 +#, possible-c-format +msgid "requires min. %s and max. %s" +msgstr "最小%sと最大%sが必要です" + +#: src/slic3r/GUI/FirmwareDialog.cpp:810 +msgid "Rescan" +msgstr "再走査" + +#: src/slic3r/GUI/Tab.cpp:1906 +msgid "Rescan serial ports" +msgstr "シリアルポートの再捜査" + +#: src/slic3r/GUI/GLCanvas3D.cpp:313 +msgid "Reset" +msgstr "リセット" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1373 +msgid "Reset clipping plane" +msgstr "切断面をリセットする" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 +msgid "Reset direction" +msgstr "方向のリセット" + +#: src/slic3r/GUI/Plater.cpp:2723 +msgid "Reset Project" +msgstr "プロジェクトのリセット" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +msgid "Reset rotation" +msgstr "回転をリセット" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +msgid "Reset Rotation" +msgstr "回転をリセット" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 +msgid "Reset scale" +msgstr "縮尺をリセット" + +#: src/slic3r/GUI/GLCanvas3D.cpp:252 +msgid "Reset to base" +msgstr "ベースにリセット" + +#: src/slic3r/GUI/Tab.cpp:2394 +msgid "Reset to Filament Color" +msgstr "フィラメントの色をリセット" + +#: src/libslic3r/PrintConfig.cpp:1511 +msgid "Resolution" +msgstr "解像度" + +#: src/libslic3r/PrintConfig.cpp:1529 +msgid "Retract amount before wipe" +msgstr "ワイプ前に引き込む" + +#: src/libslic3r/PrintConfig.cpp:1537 +msgid "Retract on layer change" +msgstr "レイヤーチェンジ時の待避" + +#: src/slic3r/GUI/Tab.cpp:1324 src/slic3r/GUI/Tab.cpp:1383 +#: src/slic3r/GUI/Tab.cpp:2370 +msgid "Retraction" +msgstr "リトラクション" + +#: src/libslic3r/PrintConfig.cpp:1523 +msgid "Retraction is not triggered when travel moves are shorter than this length." +msgstr "移動がこの長さより短い場合、吸込み動作を行いません。" + +#: src/libslic3r/PrintConfig.cpp:1544 +msgid "Retraction Length" +msgstr "材料待避長さ" + +#: src/libslic3r/PrintConfig.cpp:1552 +msgid "Retraction Length (Toolchange)" +msgstr "引込み長(ツールチェンジ)" + +#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605 +msgid "Retraction Speed" +msgstr "引き込み速度" + +#: src/slic3r/GUI/Tab.cpp:2386 +msgid "Retraction when tool is disabled (advanced settings for multi-extruder setups)" +msgstr "非アクティブなツールのフィラメントを待避する(マルチエクストルーダーの高度な設定)" + +#: src/slic3r/GUI/GUI_Preview.cpp:254 +msgid "Retractions" +msgstr "待避" + +#: src/slic3r/GUI/MainFrame.cpp:673 +msgid "Right" +msgstr "右" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 +msgid "Right button click the icon to change the object printable property" +msgstr "アイコンを右クリックして、オブジェクトのプリント可プロパティを変更します" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 +msgid "Right button click the icon to change the object settings" +msgstr "アイコンを右クリックして、オブジェクトの設定を変更します" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:359 +msgid "Right button click the icon to fix STL through Netfabb" +msgstr "NetfabbでSTLを修正するには、アイコンを右クリックします" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 +msgid "Right click" +msgstr "右クリック" + +#: src/slic3r/GUI/GLCanvas3D.cpp:243 +msgid "Right mouse button:" +msgstr "右マウスボタン:" + +#: src/slic3r/GUI/MainFrame.cpp:673 +msgid "Right View" +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:3451 +msgid "Rotate" +msgstr "回転" + +#: src/libslic3r/PrintConfig.cpp:3456 +msgid "Rotate around X" +msgstr "X軸周りで回転" + +#: src/libslic3r/PrintConfig.cpp:3461 +msgid "Rotate around Y" +msgstr "Y軸周りの回転" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 +msgid "Rotate lower part upwards" +msgstr "回転させて上下をひっくり返します" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Rotate selection 45 degrees CCW" +msgstr "選択を反時計回りに45°回転" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +msgid "Rotate selection 45 degrees CW" +msgstr "選択範囲を時計回りに45度回転" + +#: 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 +msgid "Rotation" +msgstr "回転" + +#: src/libslic3r/PrintConfig.cpp:3457 +msgid "Rotation angle around the X axis in degrees." +msgstr "X軸の周りの回転角度(度)。" + +#: src/libslic3r/PrintConfig.cpp:3462 +msgid "Rotation angle around the Y axis in degrees." +msgstr "Y軸を中心とした回転角(度単位)。" + +#: src/libslic3r/PrintConfig.cpp:3452 +msgid "Rotation angle around the Z axis in degrees." +msgstr "Z軸周りの回転角度(度)。" + +#: src/slic3r/GUI/GUI_App.cpp:797 +#, possible-c-format +msgid "Run %s" +msgstr "%s実行" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478 +msgid "Running post-processing scripts" +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: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 +msgid "s" +msgstr "s" + +#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:750 +msgid "S&end G-code" +msgstr "Gコードを送信(&e)" + +#: src/slic3r/GUI/MainFrame.cpp:750 +msgid "S&end to print" +msgstr "プリントする(&e)" + +#. TRN Preset +#: src/slic3r/GUI/Tab.cpp:3417 +#, possible-c-format +msgid "Save %s as:" +msgstr "形式を変更して%sを保存:" + +#: src/slic3r/GUI/MainFrame.cpp:826 +#, possible-c-format +msgid "Save %s file as:" +msgstr "%sファイルを別の名前で保存:" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046 +msgid "Save changes?" +msgstr "変更を保存しますか?" + +#: src/libslic3r/PrintConfig.cpp:3386 +msgid "Save config file" +msgstr "設定ファイルを保存" + +#: src/slic3r/GUI/MainFrame.cpp:925 +msgid "Save configuration as:" +msgstr "構成ファイルを別名で保存:" + +#: src/libslic3r/PrintConfig.cpp:3387 +msgid "Save configuration to the specified file." +msgstr "指定したファイルに構成を保存します。" + +#. TRN "Save current Settings" +#: src/slic3r/GUI/Tab.cpp:133 +#, possible-c-format +msgid "Save current %s" +msgstr "現在の%sを保存" + +#: src/slic3r/GUI/MainFrame.cpp:446 +msgid "Save current project file" +msgstr "現在のプロジェクトファイルの保存" + +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 +msgid "Save current project file as" +msgstr "現在のプロジェクトに名前を付けて保存" + +#: src/slic3r/GUI/Plater.cpp:2604 +msgid "Save file as:" +msgstr "別名で保存 :" + +#: src/slic3r/GUI/Plater.cpp:4839 +msgid "Save G-code file as:" +msgstr "Gコードを別名で保存:" + +#: src/slic3r/GUI/MainFrame.cpp:899 +msgid "Save OBJ file (less prone to coordinate errors than STL) as:" +msgstr "OBJファイルを保存します(STLよりも調整エラーが少ない):" + +#: src/slic3r/GUI/Tab.hpp:443 +msgid "Save preset" +msgstr "プリセット保存" + +#: src/slic3r/GUI/MainFrame.cpp:980 +msgid "Save presets bundle as:" +msgstr "プリセットパッケージを別の名前で保存:" + +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 +msgid "Save Project &as" +msgstr "プロジェクトを別名で保存(&a)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +msgid "Save project (3mf)" +msgstr "プロジェクトの保存(3mf)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +msgid "Save project as (3mf)" +msgstr "別名でプロジェクトを保存(3mf)" + +#: src/slic3r/GUI/Plater.cpp:4839 +msgid "Save SL1 file as:" +msgstr "SL1ファイルを別名で保存 :" + +#: src/slic3r/GUI/MainFrame.cpp:838 +msgid "Save zip file as:" +msgstr "ZIPファイルを保存:" + +#: 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 "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 +msgid "Scale" +msgstr "スケール" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 +msgid "Scale factors" +msgstr "寸法係数" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:196 +msgid "Scale selection to fit print volume\nin Gizmo scale" +msgstr "ギズモスケールでプリントボリュームに合わせて選択範囲を拡大/縮小します" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1724 +msgid "Scale the selected object to fit the print volume" +msgstr "選択したオブジェクトをプリントボリュームに合わせて拡大縮小します" + +#: src/libslic3r/PrintConfig.cpp:3475 +msgid "Scale to Fit" +msgstr "フィットするように縮尺" + +#: src/slic3r/GUI/Selection.cpp:939 +msgid "Scale To Fit" +msgstr "フィットするように縮尺" + +#: src/libslic3r/PrintConfig.cpp:3476 +msgid "Scale to fit the given volume." +msgstr "指定したプリントスペースに合わせてサイズを変更します。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1724 +msgid "Scale to print volume" +msgstr "プリントエリアに合わせて縮尺する" + +#: src/libslic3r/PrintConfig.cpp:3467 +msgid "Scaling factor or percentage." +msgstr "スケーリング係数または割合。" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505 +msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" +msgstr "`%1%`へのアップロードスケジュール。 ウィンドウ->プリントホストアップロードキューを参照してください" + +#: src/libslic3r/PrintConfig.cpp:1621 +msgid "Seam position" +msgstr "シーム位置" + +#: src/libslic3r/PrintConfig.cpp:1642 +msgid "Seam preferred direction" +msgstr "シーム優先方向" + +#: src/libslic3r/PrintConfig.cpp:1651 +msgid "Seam preferred direction jitter" +msgstr "シーム優先方向ジッター" + +#: src/slic3r/GUI/BonjourDialog.cpp:218 +msgid "Searching for devices" +msgstr "デバイス検索中" + +#: src/slic3r/GUI/Plater.cpp:2858 +msgid "Searching for optimal orientation" +msgstr "最適方向を探す" + +#: src/slic3r/GUI/GUI_App.cpp:1103 +msgid "Select a gcode file:" +msgstr "Gコードファイルの選択:" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Select all objects" +msgstr "全てのオブジェクトを選択" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1370 +msgid "Select all points" +msgstr "全てのポイントを選択" + +#: src/slic3r/GUI/ConfigWizard.cpp:1976 +msgid "Select all standard printers" +msgstr "すべての標準プリンターを選択" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368 +msgid "Select by rectangle" +msgstr "四角形で選択" + +#: src/slic3r/GUI/MainFrame.cpp:944 src/slic3r/GUI/MainFrame.cpp:1006 +msgid "Select configuration to load:" +msgstr "読み込む構成を選択します:" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82 +msgid "Select coordinate space, in which the transformation will be performed." +msgstr "変換する座標空間を選択します。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3971 +msgid "Select extruder number:" +msgstr "エクストルーダー番号の選択:" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +msgid "Select Filament Settings Tab" +msgstr "フィラメント設定タブを選択" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +msgid "Select Plater Tab" +msgstr "プレートタブを選択" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +msgid "Select Print Settings Tab" +msgstr "プリント設定タブを選択" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +msgid "Select Printer Settings Tab" +msgstr "プリンタ設定タブを選択" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1265 +msgid "Select showing settings" +msgstr "表示設定を選択" + +#: src/slic3r/GUI/GUI_App.cpp:629 +msgid "Select the language" +msgstr "言語を選択" + +#: src/slic3r/GUI/Tab.cpp:57 +msgid "Select the print profiles this profile is compatible with." +msgstr "このプロファイルと互換性のあるプリントプロファイルを選択します。" + +#: src/slic3r/GUI/Tab.cpp:51 +msgid "Select the printers this profile is compatible with." +msgstr "このプロファイルと互換性のあるプリンターを選択します。" + +#: src/slic3r/GUI/MainFrame.cpp:889 +msgid "Select the STL file to repair:" +msgstr "修復するSTLファイルを選択 :" + +#: src/slic3r/GUI/Preferences.cpp:237 +msgid "Select toolbar icon size in respect to the default one." +msgstr "デフォルトのツールバーアイコンのサイズを選択します。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3553 +msgid "Select type of part" +msgstr "パーツのタイプを選択" + +#: src/slic3r/GUI/Plater.cpp:638 +msgid "Select what kind of pad do you need" +msgstr "必要なパッドの種類を選択してください" + +#: src/slic3r/GUI/Plater.cpp:498 +msgid "Select what kind of support do you need" +msgstr "必要なサポートの種類を選択してください" + +#: src/slic3r/GUI/DoubleSlider.cpp:1917 +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 "保存したツールの変更をすべて削除する場合は、「はい」を選択します。\nすべてのツールの変更を色の変更に切り替えたい場合は「いいえ」、\nまたは「キャンセル」で変更せずにそのままにします" + +#: src/slic3r/GUI/Selection.cpp:146 +msgid "Selection-Add" +msgstr "選択-追加" + +#: src/slic3r/GUI/Selection.cpp:376 +msgid "Selection-Add All" +msgstr "選択-すべて追加" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3299 +msgid "Selection-Add from list" +msgstr "選択-リストから追加" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6598 +msgid "Selection-Add from rectangle" +msgstr "選択-長方形から追加" + +#: src/slic3r/GUI/Selection.cpp:256 +msgid "Selection-Add Instance" +msgstr "選択ーインスタンス追加" + +#: src/slic3r/GUI/Selection.cpp:219 +msgid "Selection-Add Object" +msgstr "選択-オブジェクト追加" + +#: src/slic3r/GUI/Selection.cpp:187 +msgid "Selection-Remove" +msgstr "選択-除去" + +#: src/slic3r/GUI/Selection.cpp:402 +msgid "Selection-Remove All" +msgstr "選択-全て除去" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3291 +msgid "Selection-Remove from list" +msgstr "リストの選択-削除" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6617 +msgid "Selection-Remove from rectangle" +msgstr "選択-四角形から削除" + +#: src/slic3r/GUI/Selection.cpp:275 +msgid "Selection-Remove Instance" +msgstr "選択-インスタンス削除" + +#: src/slic3r/GUI/Selection.cpp:238 +msgid "Selection-Remove Object" +msgstr "選択-オブジェクト削除" + +#: src/slic3r/GUI/MainFrame.cpp:566 +msgid "Selects all objects" +msgstr "全てのオブジェクトを選択" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5522 +msgid "Send G-code" +msgstr "Gコード送信" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:33 +msgid "Send G-Code to printer host" +msgstr "プリンターサーバーにGコードを送信" + +#: src/slic3r/GUI/MainFrame.cpp:481 +msgid "Send to print current plate as G-code" +msgstr "現在のプレートをプリントするためにGコードとして送信" + +#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5522 +msgid "Send to printer" +msgstr "プリンターに送信" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1305 +msgid "Seq." +msgstr "シーケンス" + +#: src/slic3r/GUI/Tab.cpp:1231 +msgid "Sequential printing" +msgstr "順次プリンティング" + +#: src/slic3r/GUI/Tab.cpp:1901 src/libslic3r/PrintConfig.cpp:1661 +msgid "Serial port" +msgstr "シリアルポート" + +#: src/libslic3r/PrintConfig.cpp:1669 +msgid "Serial port speed" +msgstr "シリアルポートスピード" + +#: src/slic3r/GUI/FirmwareDialog.cpp:807 +msgid "Serial port:" +msgstr "シリアルポート:" + +#: src/slic3r/GUI/BonjourDialog.cpp:74 +msgid "Service name" +msgstr "サービス名" + +#: src/slic3r/GUI/Tab.cpp:1802 src/slic3r/GUI/Tab.cpp:2046 +#: src/slic3r/GUI/Tab.cpp:3176 +msgid "Set" +msgstr "設定" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1599 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 +msgid "Set as a Separated Object" +msgstr "分離オブジェクトとして設定" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 +msgid "Set as a Separated Objects" +msgstr "分離オブジェクトとして設定" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +msgid "Set extruder change for every" +msgstr "エクストルーダー変更のサイクルを設定する" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1671 +msgid "Set extruder for selected items" +msgstr "選択アイテムのエクストルーダーを設定" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 +msgid "Set extruder sequence" +msgstr "エクストルーダーの順序を設定する" + +#: src/slic3r/GUI/DoubleSlider.cpp:1532 +msgid "Set extruder sequence for the entire print" +msgstr "プリント全体のエクストルーダーシーケンスを設定する" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "エクストルーダー(ツール)の順序を設定する" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 +msgid "Set lower thumb to current slider thumb" +msgstr "下のつまみを現在のスライダーのつまみに設定します" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297 +msgid "Set Mirror" +msgstr "ミラーリング設定" + +#: src/slic3r/GUI/Plater.cpp:3944 +msgid "Set number of instances" +msgstr "インスタンス数の設定" + +#: src/slic3r/GUI/Plater.cpp:4756 +#, possible-c-format +msgid "Set numbers of copies to %d" +msgstr "コピーの数を%dに設定" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781 +msgid "Set Orientation" +msgstr "方向を設定" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750 +msgid "Set Position" +msgstr "位置設定" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 +msgid "Set Printable" +msgstr "プリント可にする" + +#: src/slic3r/GUI/Selection.cpp:1475 +msgid "Set Printable Instance" +msgstr "プリント可なインスタンスを設定" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846 +msgid "Set Scale" +msgstr "縮尺をセット" + +#: src/libslic3r/PrintConfig.cpp:2393 +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 "SLAプリンター内の実際のLCDディスプレイの向きを設定します。 ポートレートモードでは、ディスプレイの幅と高さのパラメーターの意味が変わり、出力画像が90度回転します。" + +#: src/slic3r/GUI/ConfigWizard.cpp:932 +msgid "Set the shape of your printer's bed." +msgstr "プリントベッドの形状とサイズを設定します。" + +#: src/libslic3r/PrintConfig.cpp:556 +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 "正の値を設定すると、射出幅のマニュアル設定が有効になります。 値がゼロに設定されている場合、Slic3rはノズル径から射出幅を計算します(外周射出幅、インフィル射出幅などのヘルプを参照)。 値がパーセンテージで入力された場合(例:230%)、レイヤーの高さから計算されます。" + +#: src/libslic3r/PrintConfig.cpp:448 +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 "ゼロ以外の値を入力すると、最外周の射出幅をマニュアル設定できます。 ゼロの場合、設定されていればデフォルトの射出幅が使用され、設定されていない場合はノズル径の1.125倍になります。 パーセンテージ(200%など)で入力された場合、レイヤーの高さに対して計算されます。" + +#: src/libslic3r/PrintConfig.cpp:878 +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 "これをゼロ以外の値にすると、最初のレイヤーの射出幅をマニュアル設定できます。 これを使用して、ベッドとの密着を上げるために、より太い射出幅にできます。 パーセンテージ(例:120%)で入力した場合、最初のレイヤーの高さに対して計算されます。 ゼロに設定すると、デフォルトの射出幅になります。" + +#: src/libslic3r/PrintConfig.cpp:1758 +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 "正の値を入力して、射出幅をマニュアル設定し、ソリッドサーフェスを塗りつぶします。 ゼロのにすると、設定されていればデフォルトの射出幅が使用され、設定されていなければノズル径の1.125倍が適用されます。 パーセンテージ(たとえば、90%)で入力すると、レイヤーの高さから計算されます。" + +#: src/libslic3r/PrintConfig.cpp:2107 +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 "ゼロ以外の値を入力すると、上面インフィル(塗りつぶし)の射出幅をマニュアル設定できます。 細い射出幅に設定して、隙間なく、より滑らかに仕上げることができます。 ゼロのままにすると、設定されていればデフォルトの射出幅となり、設定されていなければノズル径が使用されます。 パーセンテージ(90%など)で入力された場合、レイヤーの高さに対して計算されます。" + +#: src/libslic3r/PrintConfig.cpp:1011 +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 "正の値を設定して、インフィル(中塗り)の射出幅をマニュアル調整します。 値がゼロの場合、設定されている場合は標準の射出幅が使用され、設定されていない場合はノズル径の1.125倍になります。 より太い射出幅を使用して、塗りつぶしを高速化し、プリント強度を強化することができます。 パーセンテージ(たとえば、90%)で表される場合、レイヤーの高さから計算されます。" + +#: src/libslic3r/PrintConfig.cpp:1419 +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 "外周の射出幅をマニュアル設定するには、正の値を入力します。 より正確な表面を得るために、より細い射出幅を設定できます。 ゼロが入力されている場合、設定されている場合は標準の射出幅が使用され、設定されていない場合はノズル径の1.125倍が適用されます。 パーセンテージ(200%など)で入力された場合は、レイヤーの高さから計算されます。" + +#: src/libslic3r/PrintConfig.cpp:1948 +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 "これをゼロ以外の値にすると、サポート材の射出幅を設定できます。 ゼロのままですと、デフォルトの射出幅が設定されていればその値が設定され、設定されていない場合はノズル径が設定されます。 パーセンテージ(90%など)で設定された場合は、レイヤーの高さから自動計算されます。" + +#: src/libslic3r/PrintConfig.cpp:512 +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:81 +msgid "Set this to the maximum height that can be reached by your extruder while printing." +msgstr "プリント中にエクストルーダーが到達できる最大の高さを設定します。" + +#: src/libslic3r/PrintConfig.cpp:501 +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/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 +msgid "Set Unprintable" +msgstr "プリント不可にする" + +#: src/slic3r/GUI/Selection.cpp:1475 +msgid "Set Unprintable Instance" +msgstr "プリントしないインスタンスを設定する" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 +msgid "Set upper thumb to current slider thumb" +msgstr "上部のつまみを現在のスライダーのつまみに設定します" + +#: src/libslic3r/PrintConfig.cpp:3509 +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 "ログレベルの選択:0:致命的なエラー、1:エラー、2:警告、3:情報、4:デバッグ、5:トレース\nたとえば。 loglevel = 2は、致命的なエラー、エラー、および警告メッセージを記録します。" + +#: src/slic3r/GUI/BedShapeDialog.cpp:155 +msgid "Settings" +msgstr "設定" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 +msgid "Settings for height range" +msgstr "高さ範囲の設定" + +#: src/slic3r/GUI/ConfigManipulation.cpp:162 +msgid "Shall I adjust those settings for supports?" +msgstr "サポート用にこれらの設定を調整しますか?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:89 +msgid "Shall I adjust those settings in order to enable Spiral Vase?" +msgstr "これらの設定を調整して、スパイラル花瓶(ベイス)モードを有効にしますか?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:119 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "ワイプタワーを有効にするために、これらの設定を調整しますか?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:210 +msgid "Shall I switch to rectilinear fill pattern?" +msgstr "線形塗りつぶしパターンに切り替えてもよろしいですか?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:139 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "クリーニングタワーを有効にするには、サポートレイヤーを同期する必要がありますが変更してよろしいですか?" + +#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2059 +msgid "Shape" +msgstr "形状" + +#: src/slic3r/GUI/GUI_Preview.cpp:256 +msgid "Shells" +msgstr "シェル" + +#: src/slic3r/GUI/GLCanvas3D.cpp:249 +msgid "Shift + Left mouse button:" +msgstr "シフト+左マウスボタン:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:255 +msgid "Shift + Right mouse button:" +msgstr "シフト+右マウスボタン:" + +#: src/slic3r/GUI/GUI_Preview.cpp:231 +msgid "Show" +msgstr "表示" + +#: src/slic3r/GUI/MainFrame.cpp:701 +msgid "Show &Configuration Folder" +msgstr "設定フォルダーの表示(&C)" + +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Show &labels" +msgstr "ラベル表示(&l)" + +#: src/slic3r/GUI/MainFrame.cpp:705 +msgid "Show about dialog" +msgstr "アバウトダイヤログを表示" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 +msgid "Show advanced settings" +msgstr "高度な設定を表示" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:159 +msgid "Show error message" +msgstr "エラーメッセージの表示" + +#: src/slic3r/GUI/Preferences.cpp:95 +msgid "Show incompatible print and filament presets" +msgstr "互換性のないプリントとフィラメントのプリセットを表示する" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +msgid "Show keyboard shortcuts list" +msgstr "キーボードショートカット一覧を表示" + +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Show object/instance labels in 3D scene" +msgstr "3Dシーンにオブジェクト/インスタンスラベルを表示する" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 +msgid "Show simplified settings" +msgstr "簡易設定を表示" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52 +msgid "Show supports" +msgstr "サポート表示" + +#: src/slic3r/GUI/MainFrame.cpp:699 +msgid "Show system information" +msgstr "システム情報を表示" + +#: src/slic3r/GUI/MainFrame.cpp:626 +msgid "Show the 3D editing view" +msgstr "3D編集画面の表示" + +#: src/slic3r/GUI/MainFrame.cpp:629 +msgid "Show the 3D slices preview" +msgstr "3Dスライスのプレビューを表示" + +#: src/slic3r/GUI/MainFrame.cpp:617 +msgid "Show the filament settings" +msgstr "フィラメントの設定を表示" + +#: src/libslic3r/PrintConfig.cpp:3372 +msgid "Show the full list of print/G-code configuration options." +msgstr "プリント/ Gコード構成オプションの完全なリストを表示します。" + +#: src/libslic3r/PrintConfig.cpp:3377 +msgid "Show the full list of SLA print configuration options." +msgstr "SLAプリント構成オプションの完全なリストを表示します。" + +#: src/slic3r/GUI/MainFrame.cpp:708 +msgid "Show the list of the keyboard shortcuts" +msgstr "キーボードショートカットのリストを表示する" + +#: src/slic3r/GUI/MainFrame.cpp:606 +msgid "Show the plater" +msgstr "プレート表示" + +#: src/slic3r/GUI/MainFrame.cpp:614 +msgid "Show the print settings" +msgstr "プリント設定を表示する" + +#: src/slic3r/GUI/MainFrame.cpp:621 +msgid "Show the printer settings" +msgstr "プリンター設定を表示する" + +#: src/libslic3r/PrintConfig.cpp:3366 +msgid "Show this help." +msgstr "このヘルプを表示します。" + +#: src/slic3r/GUI/MainFrame.cpp:701 +msgid "Show user configuration folder (datadir)" +msgstr "ユーザー設定フォルダーの表示(datadir)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "3Dconnexion設定ダイアログボックスの表示/非表示" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +msgid "Show/Hide Legend" +msgstr "凡例の表示/非表示" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +msgid "Show/Hide object/instance labels" +msgstr "オブジェクト/インスタンスラベルの表示/非表示" + +#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:753 +msgid "Simple" +msgstr "簡易" + +#: src/slic3r/GUI/ConfigWizard.cpp:820 +msgid "Simple mode" +msgstr "シンプルモード" + +#: src/slic3r/GUI/GUI_App.cpp:813 +msgid "Simple View Mode" +msgstr "簡易ビューモード" + +#: src/slic3r/GUI/Tab.cpp:2298 src/slic3r/GUI/Tab.cpp:2306 +msgid "Single extruder MM setup" +msgstr "シングルエクストルーダーのMM設定" + +#: src/libslic3r/PrintConfig.cpp:1845 +msgid "Single Extruder Multi Material" +msgstr "シングルエクストルーダー・マルチマテリアル" + +#: src/slic3r/GUI/Tab.cpp:1867 +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 "1つのエクストルーダーのマルチマテリアルプリンターが選択されているため、すべてのエクストルーダーの直径が同じでなければなりません。最初のエクストルーダーの直径で、すべてのエクストルーダーノズルの直径を設定しますか?" + +#: src/slic3r/GUI/Tab.cpp:2307 +msgid "Single extruder multimaterial parameters" +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:2324 +msgid "Size" +msgstr "サイズ" + +#: src/slic3r/GUI/Tab.cpp:1797 src/slic3r/GUI/Tab.cpp:2041 +msgid "Size and coordinates" +msgstr "サイズと座標" + +#: src/slic3r/GUI/BedShapeDialog.cpp:78 +msgid "Size in X and Y of the rectangular plate." +msgstr "四角形プレートのX、Yサイズ。" + +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1111 +#: src/libslic3r/ExtrusionEntity.cpp:318 +msgid "Skirt" +msgstr "スカート" + +#: src/slic3r/GUI/Tab.cpp:1110 +msgid "Skirt and brim" +msgstr "スカートとブリム" + +#: src/libslic3r/PrintConfig.cpp:1687 +msgid "Skirt height" +msgstr "スカート高さ" + +#: src/libslic3r/PrintConfig.cpp:1696 +msgid "Skirt Loops" +msgstr "スカートのループ数" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1334 +msgid "SLA gizmo keyboard shortcuts" +msgstr "SLAギズモのキーボードショートカット" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1058 +msgid "SLA gizmo turned off" +msgstr "SLAギズモ非表示" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1017 +msgid "SLA gizmo turned on" +msgstr "SLAギズモ表示" + +#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1524 +msgid "SLA material" +msgstr "SLA材料" + +#: src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "SLA Material Profiles Selection" +msgstr "SLA材料プロファイルの選択" + +#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471 +msgid "SLA material type" +msgstr "SLA材料のタイプ" + +#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "SLA Materials" +msgstr "SLA材料" + +#: src/slic3r/GUI/Preset.cpp:1523 +msgid "SLA print" +msgstr "SLAプリント" + +#: src/libslic3r/PrintConfig.cpp:2578 +msgid "SLA print material notes" +msgstr "SLAプリント材料メモ" + +#: src/slic3r/GUI/Plater.cpp:817 +msgid "SLA print settings" +msgstr "SLAプリント設定" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:996 +msgid "SLA Support Points" +msgstr "SLAサポートポイント" + +#: src/slic3r/GUI/GLCanvas3D.cpp:687 +msgid "SLA supports outside the print area were detected" +msgstr "プリント範囲外のSLAサポートが検出されました" + +#: src/slic3r/GUI/ConfigWizard.cpp:1530 +msgid "SLA Technology Printers" +msgstr "SLA型プリンター" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 +msgid "Slab" +msgstr "平板" + +#: src/libslic3r/PrintConfig.cpp:1333 +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:105 +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: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はGコードファイルをプリントサーバーにアップロードできます。 このフィールドには、プリントサーバーのホスト名、IPアドレス、またはURLが含まれている必要があります。" + +#: src/libslic3r/PrintConfig.cpp:1299 +msgid "Slic3r will not scale speed down below this speed." +msgstr "Slic3rはこの速度以下にしません。" + +#: src/libslic3r/PrintConfig.cpp:3359 +msgid "Slice" +msgstr "スライス" + +#: src/slic3r/GUI/MainFrame.cpp:512 +msgid "Slice a file into a G-code" +msgstr "ファイルをスライスしてGコードに入れる" + +#: src/slic3r/GUI/MainFrame.cpp:518 +msgid "Slice a file into a G-code, save as" +msgstr "ファイルをスライスしGコードにして、名前を付けて保存" + +#: src/libslic3r/PrintConfig.cpp:87 +msgid "Slice gap closing radius" +msgstr "スライスギャップを閉じる半径" + +#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3121 +#: src/slic3r/GUI/Plater.cpp:5110 +msgid "Slice now" +msgstr "スライス実行" + +#: src/libslic3r/PrintConfig.cpp:3333 +msgid "Slice the model and export SLA printing layers as PNG." +msgstr "モデルをスライスし、SLAプリントレイヤーをPNGとしてエクスポートします。" + +#: src/libslic3r/PrintConfig.cpp:3354 +msgid "Slice the model and export toolpaths as G-code." +msgstr "モデルをスライスし、ツールパスをGコードでエクスポートします。" + +#: src/libslic3r/PrintConfig.cpp:3360 +msgid "Slice the model as FFF or SLA based on the printer_technology configuration value." +msgstr "printer_technology構成値に基づいて、モデルをFFFまたはSLAとしてスライスします。" + +#: src/slic3r/GUI/Plater.cpp:216 +msgid "Sliced Info" +msgstr "スライス情報" + +#: 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 +msgid "Slicing" +msgstr "スライス中" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184 +msgid "Slicing complete" +msgstr "スライス完了" + +#: src/libslic3r/SLAPrint.cpp:760 +msgid "Slicing done" +msgstr "スライス完了" + +#: src/slic3r/GUI/MainFrame.cpp:874 +msgid "Slicing Done!" +msgstr "スライス完了!" + +#: src/libslic3r/SLAPrintSteps.cpp:245 +msgid "Slicing had to be stopped due to an internal error: Inconsistent slice index." +msgstr "内部エラーのため、スライスを停止しました:一貫性のないスライスインデックス。" + +#: src/libslic3r/SLAPrintSteps.cpp:45 +msgid "Slicing model" +msgstr "モデルをスライス" + +#: src/libslic3r/SLAPrintSteps.cpp:49 +msgid "Slicing supports" +msgstr "サポートのスライス" + +#: src/libslic3r/PrintConfig.cpp:2414 +msgid "Slow" +msgstr "スロー" + +#: src/libslic3r/PrintConfig.cpp:1705 +msgid "Slow down if layer print time is below" +msgstr "スローダウンさせるレイヤーのプリント時間" + +#: src/libslic3r/PrintConfig.cpp:2415 +msgid "Slow tilt" +msgstr "スローチルト" + +#: src/libslic3r/PrintConfig.cpp:1715 +msgid "Small perimeters" +msgstr "短い外周" + +#: src/slic3r/GUI/GLCanvas3D.cpp:288 +msgid "Smooth" +msgstr "スムーズ" + +#: src/slic3r/GUI/GLCanvas3D.cpp:258 +msgid "Smoothing" +msgstr "スムージング" + +#: src/slic3r/GUI/GUI_App.cpp:839 +msgid "Snapshot name" +msgstr "スナップショット名" + +#: src/slic3r/GUI/MainFrame.cpp:686 +msgid "Software &Releases" +msgstr "ソフトウェアリリース" + +#: src/slic3r/GUI/PresetHints.cpp:184 +msgid "solid infill" +msgstr "ソリッドインフィル" + +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767 +msgid "Solid infill" +msgstr "ソリッドインフィル" + +#: src/libslic3r/PrintConfig.cpp:1744 +msgid "Solid infill every" +msgstr "ソリッドインフィルを各" + +#: src/libslic3r/PrintConfig.cpp:1736 +msgid "Solid infill extruder" +msgstr "ソリッドインフィルエクストルーダー" + +#: src/libslic3r/PrintConfig.cpp:1727 +msgid "Solid infill threshold area" +msgstr "ソリッドインフィル領域のしきい値" + +#: src/slic3r/GUI/Tab.cpp:1065 src/libslic3r/PrintConfig.cpp:1780 +msgid "Solid layers" +msgstr "ソリッドレイヤー" + +#: src/libslic3r/PrintConfig.cpp:754 +msgid "Soluble material" +msgstr "溶解性材料" + +#: src/libslic3r/PrintConfig.cpp:755 +msgid "Soluble material is most likely used for a soluble support." +msgstr "水溶性フィラメントが溶解性サポート材としてもっとも使用される。" + +#: src/libslic3r/PrintConfig.cpp:937 +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/slic3r/GUI/GLCanvas3D.cpp:688 +msgid "Some objects are not visible" +msgstr "一部のオブジェクトは表示されません" + +#: src/libslic3r/Print.cpp:1226 +msgid "Some objects are too close; your extruder will collide with them." +msgstr "一部のオブジェクトが接近しすぎています。エクストルーダが接触します。" + +#: src/libslic3r/Print.cpp:1228 +msgid "Some objects are too tall and cannot be printed without extruder collisions." +msgstr "一部のオブジェクトが高すぎて、エクストルーダーの衝突なしでプリントできません。" + +#: src/libslic3r/PrintConfig.cpp:2824 +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 "ある種のオブジェクトでは、単一の大きなパッドではなく、いくつかの小さなパッドの方がうまくいきます。 このパラメーターは、2つの小さなパッドの中心の距離を定義します。 それらが近い場合、それらは1つのパッドにマージされます。" + +#: src/libslic3r/PrintConfig.cpp:2187 +msgid "Some printers or printer setups may have difficulties printing with a variable layer height. Enabled by default." +msgstr "一部のプリンターまたはプリンターのセットアップでは、レイヤー高さ可変のプリントが困難な場合があります。 デフォルトで有効になっています。" + +#: src/libslic3r/PrintConfig.cpp:1984 +msgid "Spacing between interface lines. Set zero to get a solid interface." +msgstr "インターフェイスの塗りの隙間。 ゼロを設定すると、密なインターフェースになります。" + +#: src/libslic3r/PrintConfig.cpp:2018 +msgid "Spacing between support material lines." +msgstr "サポートパターンの線間距離。" + +#: 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 +msgid "Speed" +msgstr "速度" + +#: src/libslic3r/PrintConfig.cpp:1670 +msgid "Speed (baud) of USB/serial port for printer connection." +msgstr "プリンター接続用のUSB /シリアルポートのスピード(ボーレート)。" + +#: src/libslic3r/GCode/PreviewData.cpp:351 +msgid "Speed (mm/s)" +msgstr "速度(mm/s)" + +#: src/libslic3r/PrintConfig.cpp:920 +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/slic3r/GUI/Tab.cpp:1158 +msgid "Speed for non-print moves" +msgstr "移動速度" + +#: src/libslic3r/PrintConfig.cpp:1432 +msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." +msgstr "外周(輪郭、別名:垂直シェル)の速度。 自動の場合はゼロに設定します。" + +#: src/slic3r/GUI/Tab.cpp:1146 +msgid "Speed for print moves" +msgstr "造形速度設定" + +#: src/libslic3r/PrintConfig.cpp:236 +msgid "Speed for printing bridges." +msgstr "ブリッジ形成速度。" + +#: src/libslic3r/PrintConfig.cpp:1769 +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 "ソリッド(塗りつぶし)領域(上部/下部/内部水平シェル)のプリント速度。 これは、上記のデフォルトインフィル速度に対する割合(例:80%)で表すことができます。 自動の場合はゼロに設定します。" + +#: src/libslic3r/PrintConfig.cpp:1993 +msgid "Speed for printing support material interface layers. If expressed as percentage (for example 50%) it will be calculated over support material speed." +msgstr "サポートとモデルのインターフェイスレイヤーのプリントスピード。 パーセンテージ(たとえば、50%)を入力すると、サポートのプリントスピードから計算されます。" + +#: src/libslic3r/PrintConfig.cpp:2027 +msgid "Speed for printing support material." +msgstr "サポート材造形速度。" + +#: src/libslic3r/PrintConfig.cpp:1049 +msgid "Speed for printing the internal fill. Set to zero for auto." +msgstr "内部塗りつぶしのプリント速度。 自動の場合はゼロにします。" + +#: src/libslic3r/PrintConfig.cpp:2119 +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 "上部のソリッドレイヤー(塗りつぶし)のプリント速度(最上部のレイヤーにのみ適用されるもので、内部のソリッドレイヤーには適用されません)。 この速度を遅くすることで、より良い表面に仕上げることができます。 これは、内部のソリッドレイヤー速度に対する割合(例:80%)で入力することができます。 自動の場合はゼロに設定します。" + +#: src/libslic3r/PrintConfig.cpp:2153 +msgid "Speed for travel moves (jumps between distant extrusion points)." +msgstr "移動速度(射出ポイント間のジャンピング)。" + +#: src/libslic3r/PrintConfig.cpp:659 +msgid "Speed of the first cooling move" +msgstr "冷却移動の最初の速度" + +#: src/libslic3r/PrintConfig.cpp:678 +msgid "Speed of the last cooling move" +msgstr "最後の冷却移動の速度" + +#: src/libslic3r/PrintConfig.cpp:616 +msgid "Speed used at the very beginning of loading phase." +msgstr "ロードし始めの最初のスピード。" + +#: src/libslic3r/PrintConfig.cpp:608 +msgid "Speed used for loading the filament on the wipe tower." +msgstr "フィラメントをワイプタワー上でロードする際のスピード。" + +#: src/libslic3r/PrintConfig.cpp:624 +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:633 +msgid "Speed used for unloading the tip of the filament immediately after ramming." +msgstr "ラミング直後にフィラメントの先端を引き抜く速度。" + +#: src/slic3r/GUI/Mouse3DController.cpp:296 +msgid "Speed:" +msgstr "スピード:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 +msgid "Sphere" +msgstr "球体" + +#: src/libslic3r/PrintConfig.cpp:1794 +msgid "Spiral vase" +msgstr "スパイラル花瓶" + +#: src/slic3r/GUI/ConfigManipulation.cpp:90 +msgid "Spiral Vase" +msgstr "スパイラル花瓶" + +#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4034 +#: src/slic3r/GUI/Plater.cpp:4048 src/libslic3r/PrintConfig.cpp:3471 +msgid "Split" +msgstr "分割" + +#: src/slic3r/GUI/Plater.cpp:4019 +msgid "Split the selected object" +msgstr "選択したオブジェクトを分割します" + +#: src/slic3r/GUI/Plater.cpp:4014 src/slic3r/GUI/Plater.cpp:4034 +msgid "Split the selected object into individual objects" +msgstr "選択したオブジェクトを個々のオブジェクトに分割します" + +#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4048 +msgid "Split the selected object into individual sub-parts" +msgstr "選択したオブジェクトを個々のサブパーツに分割します" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4550 +msgid "Split to objects" +msgstr "オブジェクトの分割" + +#: src/slic3r/GUI/Plater.cpp:2981 +msgid "Split to Objects" +msgstr "オブジェクトに分割" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1487 +msgid "Split to parts" +msgstr "パーツの分割" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2274 +msgid "Split to Parts" +msgstr "パーツに分割" + +#: src/slic3r/GUI/ConfigWizard.cpp:289 +msgid "Standard" +msgstr "標準" + +#: src/libslic3r/PrintConfig.cpp:846 +msgid "Stars" +msgstr "スター型" + +#: src/slic3r/GUI/MainFrame.cpp:405 +msgid "Start a new project" +msgstr "新しいプロジェクトを開始" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +msgid "Start at height" +msgstr "開始高さ" + +#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1976 +#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828 +msgid "Start G-code" +msgstr "Gコードの最初" + +#: src/slic3r/GUI/MainFrame.cpp:532 +msgid "Start new slicing process" +msgstr "新しいスライスプロセスを開始する" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:35 +msgid "Start printing after upload" +msgstr "アップロード後にプリント開始" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:151 +msgid "Status" +msgstr "ステータス" + +#: src/slic3r/GUI/FirmwareDialog.cpp:820 +msgid "Status:" +msgstr "状況:" + +#: src/slic3r/GUI/Tab.cpp:2209 +msgid "Stealth" +msgstr "静音" + +#: src/slic3r/GUI/Plater.cpp:1291 +msgid "stealth mode" +msgstr "静音モード" + +#: src/slic3r/GUI/Plater.cpp:4985 +#, possible-c-format +msgid "STL file exported to %s" +msgstr "%sにエクスポートされたSTLファイル" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +msgid "Stop at height" +msgstr "高さで停止" + +#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:1928 +msgid "Success!" +msgstr "成功!" + +#: src/slic3r/GUI/PresetHints.cpp:203 +msgid "support" +msgstr "サポート" + +#: src/libslic3r/PrintConfig.cpp:2692 +msgid "Support base diameter" +msgstr "サポートベースの直径" + +#: src/libslic3r/PrintConfig.cpp:2702 +msgid "Support base height" +msgstr "サポートベースの高さ" + +#: src/libslic3r/PrintConfig.cpp:2711 +msgid "Support base safety distance" +msgstr "サポートベースの安全距離" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 +msgid "Support Blocker" +msgstr "サポート禁止" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 +msgid "Support Enforcer" +msgstr "サポート強制" + +#: src/slic3r/GUI/ConfigManipulation.cpp:163 +msgid "Support Generator" +msgstr "サポートジェネレーター" + +#: src/slic3r/GUI/Tab.cpp:3608 +msgid "Support head" +msgstr "サポート先端" + +#: src/libslic3r/PrintConfig.cpp:2620 +msgid "Support head front diameter" +msgstr "サポートチップ径" + +#: src/libslic3r/PrintConfig.cpp:2629 +msgid "Support head penetration" +msgstr "頭部貫通をサポート" + +#: src/libslic3r/PrintConfig.cpp:2638 +msgid "Support head width" +msgstr "サポートの先端幅" + +#: src/slic3r/GUI/PresetHints.cpp:213 +msgid "support interface" +msgstr "サポートの接触部" + +#: 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 +msgid "Support material" +msgstr "サポート材" + +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/libslic3r/PrintConfig.cpp:1991 +msgid "Support material interface" +msgstr "サポートのオブジェクトとの接触レイヤー" + +#: src/libslic3r/PrintConfig.cpp:2044 +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 "傾斜角(90°=垂直)がこのしきい値以上のオーバーハングに対しては、サポート材は生成されません。 言いかえるとこの値は、サポート材なしでプリントできる最もキツいオーバーハングのことです。 自動検出の場合はゼロに設定します(ゼロを推奨)。" + +#: src/libslic3r/PrintConfig.cpp:1964 +msgid "Support material/raft interface extruder" +msgstr "コンタクトサポート/ラフトインターフェース用のエクストルーダー" + +#: src/libslic3r/PrintConfig.cpp:1937 +msgid "Support material/raft/skirt extruder" +msgstr "サポート材/ラフト/スカート用エクストルーダー" + +#: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:2674 +msgid "Support on build plate only" +msgstr "サポートをビルドプレート(ベッド)のみに限定する" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888 +msgid "Support parameter change" +msgstr "サポートパラメータの変更" + +#: src/slic3r/GUI/Tab.cpp:3613 +msgid "Support pillar" +msgstr "支柱" + +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Support pillar connection mode" +msgstr "サポート支柱の接続モード" + +#: src/libslic3r/PrintConfig.cpp:2648 +msgid "Support pillar diameter" +msgstr "サポート支柱の直径" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/libslic3r/PrintConfig.cpp:2764 +msgid "Support points density" +msgstr "サポートポイント密度" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1196 +msgid "Support points edit" +msgstr "サポートポイントの編集" + +#: 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 +msgid "Supports" +msgstr "サポート" + +#: src/slic3r/GUI/Plater.cpp:1194 +msgid "supports and pad" +msgstr "サポートとパッド" + +#: src/libslic3r/PrintConfig.cpp:1092 +msgid "Supports remaining times" +msgstr "残り時間をサポート" + +#: src/libslic3r/PrintConfig.cpp:1101 +msgid "Supports stealth mode" +msgstr "静音モードサポート" + +#: src/slic3r/GUI/ConfigManipulation.cpp:159 +msgid "Supports work better, if the following feature is enabled:\n- Detect bridging perimeters" +msgstr "以下の機能が有効になっている場合、サポートはより良く機能します。\n-ブリッジング境界の検出" + +#: src/slic3r/GUI/Preferences.cpp:87 +msgid "Suppress \" - default - \" presets" +msgstr "「-デフォルト-」プリセットを非表示" + +#: src/slic3r/GUI/Preferences.cpp:89 +msgid "Suppress \" - default - \" presets in the Print / Filament / Printer selections once there are any other valid presets available." +msgstr "他の有効なプリセットが利用可能になったら、プリント/フィラメント/プリンターの選択で「−デフォルト−」プリセットを非表示にします。" + +#: src/slic3r/GUI/MainFrame.cpp:826 +msgid "SVG" +msgstr "SVG" + +#: src/slic3r/GUI/DoubleSlider.cpp:1144 +msgid "Switch code to Change extruder" +msgstr "コードを切り替えてエクストルーダーを変更する" + +#: src/slic3r/GUI/DoubleSlider.cpp:1179 +msgid "Switch code to Color change (%1%) for:" +msgstr "以下の色変更コマンドのスワップ(%1%):" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +msgid "Switch to 3D" +msgstr "3Dモードに" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1376 +msgid "Switch to editing mode" +msgstr "編集モードに切替え" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +msgid "Switch to Preview" +msgstr "プレビューに切替え" + +#: src/slic3r/GUI/wxExtensions.cpp:703 +#, possible-c-format +msgid "Switch to the %s mode" +msgstr "%sモードに切替え" + +#: src/slic3r/GUI/GUI_App.cpp:882 +msgid "Switching the language will trigger application restart.\nYou will lose content of the plater." +msgstr "言語を切り替えると、アプリケーションが再起動します。プレートの内容が失われます。" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:365 +msgid "Switching to simple settings will discard changes done in the advanced mode!\n\nDo you want to proceed?" +msgstr "簡易な設定に切り替えると、上級モードで行われた変更が破棄されます!\n\n続行しますか?" + +#: src/slic3r/GUI/Tab.cpp:1014 +msgid "symbolic profile name" +msgstr "シンボリック・プロファイル名" + +#: src/libslic3r/PrintConfig.cpp:2036 +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:2034 +msgid "Synchronize with object layers" +msgstr "オブジェクトレイヤーと同期する" + +#: src/slic3r/GUI/MainFrame.cpp:699 +msgid "System &Info" +msgstr "システム情報(&I)" + +#: src/slic3r/GUI/SysInfoDialog.cpp:78 +msgid "System Information" +msgstr "システム情報" + +#: 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 +msgid "System presets" +msgstr "システムプリセット" + +#: src/slic3r/GUI/GUI_App.cpp:801 +msgid "Take Configuration &Snapshot" +msgstr "構成スナップショットを撮る(&S)" + +#: src/slic3r/GUI/GUI_App.cpp:839 +msgid "Taking configuration snapshot" +msgstr "設定ファイルのスナップショット保存" + +#: src/slic3r/GUI/Tab.cpp:1433 src/libslic3r/PrintConfig.cpp:2067 +msgid "Temperature" +msgstr "温度" + +#: src/libslic3r/PrintConfig.cpp:1804 +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:1803 +msgid "Temperature variation" +msgstr "温度変化" + +#: src/slic3r/GUI/ConfigWizard.cpp:1017 +msgid "Temperatures" +msgstr "温度" + +#: src/slic3r/GUI/Tab.cpp:1677 src/slic3r/GUI/Tab.cpp:1915 +msgid "Test" +msgstr "テスト" + +#: src/slic3r/GUI/BedShapeDialog.cpp:172 +msgid "Texture" +msgstr "テクスチャー" + +#: src/slic3r/GUI/ConfigManipulation.cpp:208 +msgid "The %1% infill pattern is not supposed to work at 100%% density." +msgstr "インフィル(中塗り)パターン%1%は、塗りつぶし密度100%%では機能しません。" + +#: src/slic3r/GUI/FirmwareDialog.cpp:548 +#, possible-c-format +msgid "The %s device could not have been found" +msgstr "%sデバイスが見つかりませんでした" + +#: src/slic3r/GUI/FirmwareDialog.cpp:436 +#, 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 "%sデバイスが見つかりませんでした。\nデバイスが接続されている場合は、USBコネクタの横にあるリセットボタンを押してください..." + +#: src/slic3r/GUI/Tab.cpp:976 +msgid "The current custom preset will be detached from the parent system preset." +msgstr "現在のカスタムプリセットは、親システムプリセットから切り離されます。" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875 +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 "現在操作されているオブジェクトは傾斜しています(回転角度が90°の倍数ではありません)。\n回転がオブジェクト座標に埋め込まれると、傾斜オブジェクトの不均一なスケーリングはワールド座標系でのみ可能になります。" + +#: src/libslic3r/PrintConfig.cpp:2726 +msgid "The default angle for connecting support sticks and junctions." +msgstr "サポートスティックとジャンクションを接続するためのデフォルトの角度。" + +#: src/libslic3r/SLAPrint.cpp:631 +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/PrintConfig.cpp:489 +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:1003 +msgid "The extruder to use when printing infill." +msgstr "インフィルに使用するエクストルーダー。" + +#: src/libslic3r/PrintConfig.cpp:1410 +msgid "The extruder to use when printing perimeters and brim. First extruder is 1." +msgstr "外周とブリム(縁)をプリントするときに使用するエクストルーダー。 1番目のエクストルーダーは1です。" + +#: src/libslic3r/PrintConfig.cpp:1738 +msgid "The extruder to use when printing solid infill." +msgstr "ソリッドインフィルで使用するエクストルーダー。" + +#: src/libslic3r/PrintConfig.cpp:1966 +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:1939 +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:727 +msgid "The filament material type for use in custom G-codes." +msgstr "カスタムGコードで使用するフィラメント材料タイプ。" + +#: src/libslic3r/PrintConfig.cpp:3494 +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:1102 +msgid "The firmware supports stealth mode" +msgstr "ファームウェアはサイレントモードをサポートします" + +#: src/libslic3r/PrintConfig.cpp:120 +msgid "The first layer will be shrunk in the XY plane by the configured value to compensate for the 1st layer squish aka an Elephant Foot effect." +msgstr "最初のレイヤーは、設定された値によってXY平面で縮小され、1番目のレイヤーのダボつき、つまりエレファントフット効果を補正します。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3820 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3457 +msgid "the following characters are not allowed:" +msgstr "次の文字は使用できません:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1830 +msgid "The following FFF printer models have no filament selected:" +msgstr "次のFFFプリンターモデルには、フィラメントが選択されていません:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1848 +msgid "The following SLA printer models have no materials selected:" +msgstr "次のSLAプリンターモデルには材料が選択されていません:" + +#: src/slic3r/GUI/Tab.cpp:3461 +msgid "the following suffix is not allowed:" +msgstr "以下のサフィックスは許可されていません :" + +#: src/libslic3r/PrintConfig.cpp:2871 +msgid "The gap between the object bottom and the generated pad in zero elevation mode." +msgstr "ゼロリフトモードでのオブジェクトの底面と生成されたパッド間のギャップ。" + +#: src/libslic3r/PrintConfig.cpp:2704 +msgid "The height of the pillar base cone" +msgstr "柱のベースコーンの高さ" + +#: src/slic3r/GUI/DoubleSlider.cpp:1922 +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:1900 src/slic3r/GUI/DoubleSlider.cpp:1916 +msgid "The last color change data was saved for a multi extruder printing." +msgstr "最後の色の変更が、マルチエクストルーダーのプリンターに対して保存されました。" + +#: src/slic3r/GUI/DoubleSlider.cpp:1899 +msgid "The last color change data was saved for a single extruder printing." +msgstr "最後の色変更データは、シングルエクストルーダーでのプリント用に保存されました。" + +#: src/libslic3r/PrintConfig.cpp:2745 +msgid "The max distance of two pillars to get linked with each other. A zero value will prohibit pillar cascading." +msgstr "相互接続のための2つの支柱間の最大距離。 値がゼロの場合、柱のカスケードが無効になります。" + +#: src/libslic3r/PrintConfig.cpp:2736 +msgid "The max length of a bridge" +msgstr "最長ブリッジ長さ" + +#: src/libslic3r/PrintConfig.cpp:2714 +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 "モデルからのサポートベースの最小距離(mm)。 パッドの上のゼロリフトモードでは、このパラメーターに応じたギャップがモデルとパッドの間に挿入されます。" + +#: src/libslic3r/PrintConfig.cpp:185 +msgid "The number of bottom solid layers is increased above bottom_solid_layers if necessary to satisfy minimum thickness of bottom shell." +msgstr "ボトムシェルの最小厚さを確保するために、必要に応じてボトムソリッドレイヤーの数をbottom_solid_layersよりも増やします。" + +#: src/libslic3r/PrintConfig.cpp:2143 +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:2277 +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:1503 +msgid "The object will be raised by this number of layers, and support material will be generated under it." +msgstr "オブジェクトは、このレイヤー数だけ持ち上げられ、その下にサポート材が生成されます。" + +#: src/libslic3r/PrintConfig.cpp:2424 +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 "ベッド領域の占有率。\nプリント領域が指定された値を超える場合、ティルト動作を遅くします。それ以外では-速いティルトとなります" + +#: src/slic3r/GUI/GUI_App.cpp:932 +msgid "The presets on the following tabs were modified" +msgstr "次のタブのプリセットが変更されました" + +#: src/libslic3r/PrintConfig.cpp:1846 +msgid "The printer multiplexes filaments into a single hot end." +msgstr "プリンタは、1つのホットエンドで複数のフィラメントを切り替えます。" + +#: 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 "選択した3mfファイルは新しいバージョン%1%で保存されており、互換性がありません。" + +#: 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 "選択したamfファイルは新しいバージョン%1%で保存され、互換性がありません。" + +#: src/slic3r/GUI/BedShapeDialog.cpp:513 +msgid "The selected file contains no geometry." +msgstr "選択したファイルにはジオメトリが含まれていません。" + +#: src/slic3r/GUI/BedShapeDialog.cpp:517 +msgid "The selected file contains several disjoint areas. This is not supported." +msgstr "選択したファイルには、接続していない面がいくつか含まれています。 これはサポートされていません。" + +#: src/slic3r/GUI/Plater.cpp:2970 +msgid "The selected object can't be split because it contains more than one volume/material." +msgstr "選択したオブジェクトには複数のボリューム/マテリアルが含まれているため、分割できません。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2270 src/slic3r/GUI/Plater.cpp:2978 +msgid "The selected object couldn't be split because it contains only one part." +msgstr "選択したオブジェクトには、1つのパーツしか含まれていないため、分割できませんでした。" + +#: src/slic3r/GUI/MainFrame.cpp:461 +msgid "The selected project is no longer available.\nDo you want to remove it from the recent projects list?" +msgstr "選択したプロジェクトは使用できなくなりました。\n最近のプロジェクトリストから削除しますか?" + +#: src/slic3r/GUI/DoubleSlider.cpp:998 +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 "シーケンシャルプリントがオンになっています。\n連続してプリントするオブジェクトにカスタムGコードを適用することはできません。\nこのコードは、Gコード生成中に処理されません。" + +#: src/libslic3r/PrintConfig.cpp:2846 +msgid "The slope of the pad wall relative to the bed plane. 90 degrees means straight walls." +msgstr "ベッド平面に対するパッド壁の傾斜。 90度は真っ直ぐな壁を意味します。" + +#: src/libslic3r/PrintConfig.cpp:1614 +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:1606 +msgid "The speed for retractions (it only applies to the extruder motor)." +msgstr "吸込み速度(エクストルーダーモーターにのみ適用)。" + +#: 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 "スパイラル花瓶(ベイス)モードには以下が必要です。\n-1つの外周\n-上部ソリッドレイヤーなし\n-充填密度0%\n-サポート材設定なし\n-垂直シェルの厚さを有効にしてください\n-薄い壁を無効にする" + +#: src/libslic3r/Print.cpp:1237 +msgid "The Spiral Vase option can only be used when printing a single object." +msgstr "スパイラル花瓶オプションはオブジェクト一つのプリントに限られます。" + +#: src/libslic3r/Print.cpp:1244 +msgid "The Spiral Vase option can only be used when printing single material objects." +msgstr "スパイラル花瓶オプションは、単一の素材オブジェクトをプリントする場合にのみ使用できます。" + +#: src/slic3r/GUI/Tab.cpp:3068 +msgid "The supplied name is empty. It can't be saved." +msgstr "指定された名前が空白です。 保存できません。" + +#: src/slic3r/GUI/Tab.cpp:3465 +msgid "The supplied name is not available." +msgstr "指定された名前は使用できません。" + +#: 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 +msgid "The supplied name is not valid;" +msgstr "指定された名前は無効です;" + +#: src/libslic3r/Print.cpp:1222 +msgid "The supplied settings will cause an empty print." +msgstr "指定された設定では、何もプリントされません。" + +#: src/libslic3r/PrintConfig.cpp:2789 +msgid "The thickness of the pad and its optional cavity walls." +msgstr "パッドとそのオプションのキャビティ壁の厚さ。" + +#: src/libslic3r/PrintConfig.cpp:1911 +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/slic3r/GUI/Tab.cpp:2575 +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 "ファームウェア引き込みモードを使用している場合、ワイプオプションは使用できません。ファームウェア引き込みを有効にするために無効にしますか?" + +#: src/libslic3r/Print.cpp:1268 +msgid "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." +msgstr "ワイプタワーは現在のところ体積出力E(use_volumetric_e = 0)をサポートしていません。" + +#: src/slic3r/GUI/ConfigManipulation.cpp:115 +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 "現在のところ、非溶解性サポートのワイプタワーは、ツールの変更をトリガーせずに現在のエクストルーダーでプリントされる場合のみサポートします。\n(support_material_extruderとsupport_material_interface_extruderの両方を0に設定する必要があります)。" + +#: src/libslic3r/Print.cpp:1400 +msgid "The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. (both support_material_extruder and support_material_interface_extruder need to be set to 0)." +msgstr "ツールの変更を行わずに現在のエクストルーダーでプリントする場合、ワイプタワーは今のところ、非溶解性サポートのみをサポートします。 (support_material_extruderとsupport_material_interface_extruderの両方を0に設定する必要があります)。" + +#: src/libslic3r/Print.cpp:1270 +msgid "The Wipe Tower is currently not supported for multimaterial sequential prints." +msgstr "今のところ、ワイプタワーはマルチマテリアル・シーケンシャルプリントではサポートされていません。" + +#: src/libslic3r/Print.cpp:1262 +msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter and Repetier G-code flavors." +msgstr "ワイプタワーは現在、Marlin、RepRap/Sprinter、およびRepetierで生成されたGコードで使用できます。" + +#: src/libslic3r/Print.cpp:1264 +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:1293 +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:1295 +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:1297 +msgid "The Wipe Tower is only supported for multiple objects if they are sliced equally." +msgstr "ワイプタワーは、複数のオブジェクトが均等にスライスされている場合に利用できます。" + +#: src/libslic3r/Print.cpp:1291 +msgid "The Wipe Tower is only supported for multiple objects if they have equal layer heights" +msgstr "ワイプタワーは、複数のオブジェクトのレイヤーの高さが等しい場合に利用できます" + +#: src/libslic3r/Print.cpp:1257 +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:1339 +msgid "The Wipe tower is only supported if all objects have the same variable layer height" +msgstr "クリーニングタワーは、すべてのオブジェクトのレイヤーの高さが同じである場合にのみサポートされます" + +#: src/libslic3r/SLAPrintSteps.cpp:621 +msgid "There are unprintable objects. Try to adjust support settings to make the objects printable." +msgstr "プリントがうまくいかないオブジェクトがあります。 サポート設定を調整して、オブジェクトがプリント可能な状態にしてください。" + +#: src/slic3r/GUI/DoubleSlider.cpp:1030 +msgid "There is a color change for extruder that has not been used before.\nCheck your settings to avoid redundant color changes." +msgstr "まだ使用されていないエクストルーダーの色に変化があります。\n冗長な色の変更を避けるために設定を確認してください。" + +#: 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.\nThis code won't be processed during G-code generation." +msgstr "エクストルーダーの色が変更され、プリントジョブが終了するまで使用されません。\nこのコードは、Gコード生成中に処理されません。" + +#: src/slic3r/GUI/DoubleSlider.cpp:1027 +msgid "There is an extruder change set to the same extruder.\nThis code won't be processed during G-code generation." +msgstr "同じエクストルーダーに設定されたエクストルーダーの変更があります。\nこのコードは、Gコード生成中に処理されません。" + +#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#, possible-c-format +msgid "This %s version: %s" +msgstr "この%sのバージョン: %s" + +#: src/slic3r/GUI/Tab.cpp:982 +msgid "This action is not revertable.\nDo you want to proceed?" +msgstr "この操作は元に戻せません。\n続行しますか?" + +#: src/libslic3r/PrintConfig.cpp:165 +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/M140)。 ただし、このカスタムコードでM104、M109、M140またはM190が記述された場合、Slic3rは温度コマンドを追加しません。 すべてのSlic3r代替変数を使用できるため、「M109 S [first_layer_temperature]」コマンドを必要な場所に記述できます。" + +#: src/libslic3r/PrintConfig.cpp:1081 +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移動の直後、エクストルーダがレイヤーの最初のポイントに移動する前に挿入されます。 [layer_num]および[layer_z]と同様に、すべてのSlic3r設定にワイルドカード変数を追加できます。" + +#: src/libslic3r/PrintConfig.cpp:154 +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移動の直前に挿入されます。 [layer_num]および[layer_z]と同様に、すべてのSlic3r代替変数が使用できます。" + +#: src/libslic3r/PrintConfig.cpp:2094 +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 "このカスタムコードは、すべてのツール変更の前に挿入されます。 すべてのPrusaSlicer設定と{previous_extruder}および{next_extruder}の代替変数が使用できます。 希望するエクストルーダーに変更するツール変更コマンド(T {next_extruder}など)が含まれている場合、PrusaSlicerが同じコマンドを追加することはありません。 したがって、ツール変更の前後にカスタム動作をスクリプト化することが可能です。" + +#: src/libslic3r/PrintConfig.cpp:396 +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:386 +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:1258 src/libslic3r/PrintConfig.cpp:1269 +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.8mm³/s²の値は、1.8mm³/ s(射出幅0.45mm、レイヤー高さ0.2mm、送り速度20mm/s)の押出し速度から5.4mm³/s( 送り速度60 mm/s)への変化に少なくとも2秒かかることを意味します。" + +#: src/libslic3r/PrintConfig.cpp:1248 +msgid "This experimental setting is used to set the maximum volumetric speed your extruder supports." +msgstr "この試用的な設定で、エクストルーダーがサポートする最大の体積押出し速度を設定できます。" + +#: src/libslic3r/PrintConfig.cpp:2162 +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:2176 +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 "この試用的な設定で、線形ミリメートルではなく立方ミリメートルでE値を定義できます。 ファームウェアでフィラメント径が未定義の場合、開始Gコードに「M200 D [filament_diameter_0] T0」のようなコマンドを入力して、体積押出しモードをオンにし、Slic3rで選択したフィラメントに関連付けられたフィラメント径を使用できます。 これは最近のMarlinのみサポートされています。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3972 +msgid "This extruder will be set for selected items" +msgstr "このエクストルーダーを選択されたアイテムに設定します" + +#: src/libslic3r/PrintConfig.cpp:224 +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 "この値は、ブリッジが形成されるときに押出すプラスチックの量に影響します。この値をわずかに下げることで、押し出したものを引き戻しブリッジのたるみを減らすことができますが、通常はプリセット値が適切であり、この値よりも冷却(ファンを使用)を試す方をお勧めします。" + +#: src/libslic3r/PrintConfig.cpp:546 +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 "この係数は、流量を比率で変化させます。 この設定を微調整することで、表面をきれいに仕上げ、単一壁の幅を調整できる場合があります。 通常の値は0.9〜1.1です。 さらなるチューニングが必要な場合は、フィラメントの直径とファームウェアのEステップをチェックしてください。" + +#: src/libslic3r/PrintConfig.cpp:214 +msgid "This fan speed is enforced during all bridges and overhangs." +msgstr "設定されたファン速度は、ブリッジとオーバーハングを作成するときに常に使用されます。" + +#: src/libslic3r/PrintConfig.cpp:992 +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:1746 +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 "この機能により、強制的に指定されたレイヤーごとにソリッドレイヤー(塗りつぶし)を生成します。 無効にする場合はゼロ。 任意の値(たとえば、9999)が設定できます。 Slic3rは、ノズル径とレイヤー高さに応じて、組合わせ可能なレイヤーの最大数を自動的に計算します。" + +#: 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 "この機能は、レイヤーごとにプリントするのではなく、Zを徐々に上げながらオブジェクトの最外周だけを一筆書きで連続してプリントします。 このオプションを使うには、外周は1周で、インフィル(中塗り)なし、上部ソリッドレイヤー(塗りつぶし)なし、サポートなしに設定しなければなりません。 底部ソリッドレイヤーとスカート(パーツを囲むアウトライン)/ブリム(縁)ループの設定はできます。 2つ以上のオブジェクトをプリントする場合は使えません。" + +#: src/slic3r/GUI/Plater.cpp:2367 +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:2357 +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 "このファイルには、複数の高さに配置されたいくつかのオブジェクトが含まれています。\nそれらを複数のオブジェクトと見なすのではなく、\n複数のパーツから構成される単一のオブジェクトと見なすべきですか?" + +#: src/slic3r/GUI/FirmwareDialog.cpp:332 +#, 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 "このファームウェアhexファイルは、プリンターモデルと一致しません。\n16進ファイルの対象:%s\n報告されたプリンター:%s\n\nともかくこのhexファイルでファームウェアの書換えを続けますか?\n絶対に間違いないと確信している場合にのみ続行してください。" + +#: src/libslic3r/PrintConfig.cpp:314 +msgid "This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer printing time." +msgstr "このフラグは、レイヤーのプリント時間に応じてプリント速度とファン速度を調整する自動冷却プログラムを有効にします。" + +#: src/slic3r/GUI/Plater.cpp:536 +msgid "This flag enables the brim that will be printed around each object on the first layer." +msgstr "このフラグは、1番目のレイヤーの各オブジェクトの外周を拡張してプリントされるブリム(縁)を有効にします。" + +#: src/libslic3r/PrintConfig.cpp:1538 +msgid "This flag enforces a retraction whenever a Z move is done." +msgstr "このオプションは、Z移動が実行されるたびに樹脂の吸引を行います。" + +#: src/libslic3r/PrintConfig.cpp:2194 +msgid "This flag will move the nozzle while retracting to minimize the possible blob on leaky extruders." +msgstr "このフラグは、待避中にノズルを動かして、垂れやすいエクストルーダーで起こりうるブロブの発生を最小限に抑えます。" + +#: src/slic3r/GUI/Tab.cpp:953 +msgid "This is a default preset." +msgstr "これはデフォルトのプリセットです。" + +#: src/libslic3r/PrintConfig.cpp:2766 +msgid "This is a relative measure of support points density." +msgstr "サポートポイント密度の相対値です。" + +#: src/slic3r/GUI/Tab.cpp:2338 +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:955 +msgid "This is a system preset." +msgstr "これはシステムプリセットです。" + +#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583 +msgid "This is only used in the Slic3r interface as a visual help." +msgstr "これはSlic3rのみで使用されるイラストです。" + +#: src/libslic3r/PrintConfig.cpp:336 +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:194 +msgid "This is the acceleration your printer will use for bridges. Set zero to disable acceleration control for bridges." +msgstr "ブリッジを作成するときのプリンターアクセラレーションを設定します。 ブリッジの加速制御を無効にするには、ゼロを入力します。" + +#: src/libslic3r/PrintConfig.cpp:860 +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:982 +msgid "This is the acceleration your printer will use for infill. Set zero to disable acceleration control for infill." +msgstr "これはインフィル生成時のプリンタの加速度です。 インフィルの加速制御をオフにするには、ゼロに設定します。" + +#: 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 "これは、外周プリントに使用する加速度です。 ハードウェアが対応している場合、9000のような高い値で良い結果をもたらします。 外周プリント用の加速制御を無効にするには、ゼロを設定します。" + +#: src/libslic3r/PrintConfig.cpp:1327 +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:1227 +#, no-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 "これは、このエクストルーダーの最大プリント可能レイヤーの高さ(層間ピッチ)であり、可変レイヤー高さとキャップ層高さの上限に使用されます。 推奨最大レイヤー高さは、適切なレイヤー間接着を実現するため射出幅の75%です。 0に設定すると、レイヤーの高さはノズル径の75%に制限されます。" + +#: src/libslic3r/PrintConfig.cpp:1290 +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.05mmと0.1mmの間です。" + +#: 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 "これは通常、無視できるほど少量の押出量またはモデルの欠陥が原因です。 ベッド上のモデルの修復または向きを再配置してみてください。" + +#: src/libslic3r/PrintConfig.cpp:2215 +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/slic3r/GUI/GUI_ObjectManipulation.cpp:878 +msgid "This operation is irreversible.\nDo you want to proceed?" +msgstr "この操作は元に戻せません。\n続行しますか?" + +#: src/libslic3r/PrintConfig.cpp:1442 +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:1356 +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:1029 +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 "このオプションは、天井形成を可能にするために最低限必要な領域のみインフィル(中塗り)を行います(内部サポート材料として機能します)。 このオプションを有効にすると、複数のチェックによりGコードの生成が遅くなります。" + +#: src/libslic3r/PrintConfig.cpp:1022 +msgid "This option will switch the print order of perimeters and infill, making the latter first." +msgstr "このオプションは、外周とインフィル(中塗り)のプリント順序を切替え、インフィルからプリントします。" + +#: src/libslic3r/PrintConfig.cpp:459 +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 "この個別の設定は、最外周のプリント速度に影響します(モデルの露出部分)。 パーセンテージで入力された場合(例:80%)、上記で設定された外周プリント速度から計算されます。 0を入力すると自動計算になります。" + +#: src/libslic3r/PrintConfig.cpp:1717 +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 "この個別の設定は、半径<= 6.5mm(通常は穴)の外周プリントの速度に影響します。 パーセンテージ(例:80%)で入力された場合、上記の外周速度設定で計算されます。 自動の場合はゼロに設定します。" + +#: src/libslic3r/PrintConfig.cpp:1038 +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 "この設定は、インフィル(中塗り)と外周の間に追加でオーバーラップ(重なり)させて、接続性を改善します。 理論的にこれは必要ありませんが、機械的な遊びの影響によりギャップが生じる可能性がある場合に有効です。 パーセンテージ(例:15%)で表される場合、外周の射出幅から計算されます。" + +#: 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:1218 +msgid "This setting represents the maximum speed of your fan." +msgstr "ファンの最大速度を設定します。" + +#: src/libslic3r/PrintConfig.cpp:1281 +msgid "This setting represents the minimum PWM your fan needs to work." +msgstr "この設定は、ファンが回転するために必要な最小PWMです。" + +#: src/libslic3r/PrintConfig.cpp:1829 +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コードを開始した後(およびマルチマテリアルプリンタの場合はこのフィラメントにツールを変更した後)の最初に挿入されます。 これは、特定のフィラメントの設定をオーバーライドするために使用されます。カスタムコードでM104またはM190が書かれている場合には、同種のコマンドが自動的に追加されることはありませんので、加熱コマンドやその他のカスタムアクションの順序を自由にカスタマイズできます。 全てのPrusaSlicer変数を使用できますので、「M109 S [first_layer_temperature]」コマンドをご希望の場所に配置できます。複数のエクストルーダーがある場合、Gコードはエクストルーダーの順に処理されます。" + +#: src/libslic3r/PrintConfig.cpp:1814 +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 "この開始プロシージャーは、ベッドが目標温度に達し、エクストルーダーが加熱を開始した直後、およびエクストルーダーが加熱を完了する前のところに挿入されます。 カスタムコードでM104またはM190が書かれている場合には、同種のコマンドが自動的に追加されることはありませんので、加熱コマンドやその他のカスタムアクションの順序を自由にカスタマイズできます。 全てのPrusaSlicer変数を使用できますので、「M109 S [first_layer_temperature]」コマンドをご希望の場所に配置できます。" + +#: src/libslic3r/PrintConfig.cpp:695 +msgid "This string is edited by RammingDialog and contains ramming specific parameters." +msgstr "この文字列はラミングダイアログで編集され、ラミング固有のパラメーターが含まれています。" + +#: src/libslic3r/PrintConfig.cpp:2286 +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 "この値は、出力Gコードの全てのZ座標に対して加算/減算されます。これによって Zエンドストップの位置を補正できます。例えば、エンドストップで0のとき、実際にはノズルがベッド面から0.3mm離れる場合、これを-0.3に設定します(もしくはエンドストップ位置を修正します)。" + +#: src/libslic3r/PrintConfig.cpp:2208 +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/slic3r/GUI/UpdateDialogs.cpp:216 +#, 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 "このバージョン%sは、現在インストールされているセットアップパッケージと互換性がありません。\nこれは、新しいバージョンを使用した後に古いバージョンの%sを実行したことが原因である可能性があります。 \n%sを終了して新しいバージョンで再試行するか、再起動してデフォルト構成をロードしてください。 このバージョン%sと互換性のある設定をインストールする前に、現在の構成のバックアップが作成されます。" + +#: src/libslic3r/PrintConfig.cpp:2458 +msgid "This will apply a gamma correction to the rasterized 2D polygons. A gamma value of zero means thresholding with the threshold in the middle. This behaviour eliminates antialiasing without losing holes in polygons." +msgstr "ラスター2Dポリゴンにガンマ補正を適用します。 ガンマ値ゼロは、しきい値を中央に設定することを意味します。 この動作により、ポリゴンの穴を損なうことなくアンチエイリアスが除去されます。" + +#: src/libslic3r/PrintConfig.cpp:2081 +msgid "Threads" +msgstr "スレッド" + +#: src/libslic3r/PrintConfig.cpp:2082 +msgid "Threads are used to parallelize long-running tasks. Optimal threads number is slightly above the number of available cores/processors." +msgstr "スレッドは、長時間実行されるタスクを並列化するために使用されます。スレッド数は、使用可能なコア/プロセッサーの数をわずかに超えたところが最適となります。" + +#: src/slic3r/GUI/Tab.cpp:2093 +msgid "Tilt" +msgstr "チルト" + +#: src/slic3r/GUI/Tab.cpp:2094 +msgid "Tilt time" +msgstr "チルト時間" + +#: src/slic3r/GUI/RammingChart.cpp:76 +msgid "Time" +msgstr "時間" + +#: src/libslic3r/PrintConfig.cpp:687 +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 "ツールの変更中(Tコードの実行時)にプリンターファームウェア(またはMulti Material Unit 2.0)が新しいフィラメントをロードする時間。 この時間は、Gコード時間推定プログラムによって合計プリント時間に追加されます。" + +#: src/libslic3r/PrintConfig.cpp:702 +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 "ツールチェンジ中(Tコードの実行時)にプリンターファームウェア(またはMulti Material Unit 2.0)がフィラメントをアンロードする時間。 この時間は、Gコード時間予測プログラムによって合計プリント予測時間に追加されます。" + +#: src/libslic3r/PrintConfig.cpp:2407 +msgid "Time of the fast tilt" +msgstr "高速チルトの時間" + +#: src/libslic3r/PrintConfig.cpp:2416 +msgid "Time of the slow tilt" +msgstr "スローチルトの時間" + +#: src/libslic3r/PrintConfig.cpp:641 +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/slic3r/GUI/Tab.cpp:966 +msgid "To do that please specify a new name for the preset." +msgstr "これを行うには、プリセットの新しい名前を指定してください。" + +#: src/slic3r/GUI/Plater.cpp:4014 +msgid "To objects" +msgstr "オブジェクト" + +#: src/slic3r/GUI/Plater.cpp:4016 +msgid "To parts" +msgstr "パーツへ" + +#: src/slic3r/GUI/Tab.cpp:1756 +msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain." +msgstr "カスタムCAファイルを使用するには、CAファイルを証明書ストア/キーチェーンにインポートしてください。" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 +#, possible-c-format +msgid "Toggle %c axis mirroring" +msgstr "%c軸のミラーリングを切替え" + +#: src/libslic3r/Zipper.cpp:34 +msgid "too many files" +msgstr "ファイルが多すぎます" + +#: src/libslic3r/SLAPrintSteps.cpp:190 +msgid "Too much overlapping holes." +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/WipeTowerDialog.cpp:276 +msgid "Tool #" +msgstr "ツール#" + +#: src/slic3r/GUI/Tab.cpp:2000 src/libslic3r/PrintConfig.cpp:2093 +msgid "Tool change G-code" +msgstr "ツールチェンジ用のGコード" + +#: src/slic3r/GUI/Tab.cpp:1491 +msgid "Toolchange parameters with single extruder MM printers" +msgstr "単一エクストルーダー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 +msgid "Top" +msgstr "トップ" + +#: src/slic3r/GUI/PresetHints.cpp:304 +msgid "Top / bottom shell thickness hint: Not available due to invalid layer height." +msgstr "上部/下部シェルの厚さのヒント:レイヤーの高さが無効なため使用できません。" + +#: src/libslic3r/PrintConfig.cpp:415 +msgid "Top fill pattern" +msgstr "トップ塗りつぶしパターン" + +#: src/slic3r/GUI/PresetHints.cpp:323 +msgid "Top is open." +msgstr "上部が開いています。" + +#: src/slic3r/GUI/PresetHints.cpp:317 +msgid "Top shell is %1% mm thick for layer height %2% mm." +msgstr "レイヤーの高さ%2%mmの場合、上部シェルの厚さは%1%mmです。" + +#: src/slic3r/GUI/PresetHints.cpp:192 +msgid "top solid infill" +msgstr "最上層のソリッドインフィル" + +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117 +msgid "Top solid infill" +msgstr "トップソリッドインフィル" + +#: src/libslic3r/PrintConfig.cpp:2135 +msgid "Top solid layers" +msgstr "上部ソリッドレイヤー" + +#: src/slic3r/GUI/MainFrame.cpp:662 +msgid "Top View" +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 "総パージ量は、ロード/アンロードされるツールに応じて、以下の2つの値を合計して計算されます。" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 +msgid "Total rammed volume" +msgstr "合計ラミング容積" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 +msgid "Total ramming time" +msgstr "トータルラミング時間" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +msgid "Translate" +msgstr "移動" + +#: src/slic3r/GUI/Mouse3DController.cpp:300 +#: src/slic3r/GUI/Mouse3DController.cpp:317 +msgid "Translation" +msgstr "変形" + +#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152 +msgid "Travel" +msgstr "移動" + +#: src/libslic3r/PrintConfig.cpp:845 +msgid "Triangles" +msgstr "三角形" + +#: src/libslic3r/PrintConfig.cpp:3448 +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:1467 +msgid "Type of the printer." +msgstr "プリンターのタイプ。" + +#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3553 +msgid "Type:" +msgstr "タイプ:" + +#: src/slic3r/GUI/Plater.cpp:3428 +msgid "Unable to reload:" +msgstr "リロードできません:" + +#: src/libslic3r/Zipper.cpp:32 +msgid "undefined error" +msgstr "未定義エラー" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/MainFrame.cpp:581 +msgid "Undo" +msgstr "やり直し" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 +#, possible-c-format +msgid "Undo %1$d Action" +msgid_plural "Undo %1$d Actions" +msgstr[0] "" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 +msgid "Undo History" +msgstr "履歴を元に戻す" + +#: src/libslic3r/Zipper.cpp:56 +msgid "unexpected decompressed size" +msgstr "予期しない解凍サイズ" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27 +msgid "Unknown" +msgstr "不明" + +#: 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 +msgid "Unknown error occured" +msgstr "不明なエラーが発生" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 +msgid "unloaded" +msgstr "アンロード済" + +#: src/libslic3r/PrintConfig.cpp:623 +msgid "Unloading speed" +msgstr "アップロードスピード" + +#: src/libslic3r/PrintConfig.cpp:632 +msgid "Unloading speed at the start" +msgstr "最初のアンロードスピード" + +#: src/slic3r/GUI/Tab.cpp:3256 +msgid "UNLOCKED LOCK" +msgstr "開いたカギ" + +#: 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.\nClick to reset all settings for current option group to the system (or default) values." +msgstr "カギが開いたアイコンは、一部の設定が変更され、現在のオプショングループのシステム(またはデフォルト)値と等しくないことを示します。\nクリックすると、現在のオプショングループのすべての設定がシステム(またはデフォルト)値にリセットされます。" + +#: 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.\nClick to reset current value to the system (or default) value." +msgstr "カギが開いたアイコンは、値が変更され、システム(またはデフォルト)値と等しくないことを示します。クリックすると、現在の値がシステム(またはデフォルト)値にリセットされます。" + +#: 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 "アンマウントに成功しました。 デバイス%s(%s)をコンピューターから安全に取り出せます。" + +#: src/slic3r/GUI/GUI_Preview.cpp:255 +msgid "Unretractions" +msgstr "待避からの復帰" + +#: src/slic3r/GUI/Tab.cpp:2947 +msgid "Unsaved Changes" +msgstr "変更の未保存" + +#: src/slic3r/GUI/GUI_App.cpp:935 +msgid "Unsaved Presets" +msgstr "未保存のプリセット" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Unselect gizmo or clear selection" +msgstr "ギズモのキャンセルまたは選択解除" + +#: src/libslic3r/Zipper.cpp:60 +msgid "unsupported central directory size" +msgstr "サポートされていない中心ディレクトリのサイズ" + +#: src/libslic3r/Zipper.cpp:40 +msgid "unsupported encryption" +msgstr "サポートされていない暗号化" + +#: src/libslic3r/Zipper.cpp:42 +msgid "unsupported feature" +msgstr "サポートされていない機能" + +#: src/libslic3r/Zipper.cpp:38 +msgid "unsupported method" +msgstr "サポートされていない方法" + +#: src/libslic3r/Zipper.cpp:50 +msgid "unsupported multidisk archive" +msgstr "サポートされていないマルチディスクアーカイブ" + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:292 +msgid "Unsupported OpenGL version" +msgstr "サポートされていないOpenGLバージョン" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3420 +msgid "Unsupported selection" +msgstr "サポートしないところの選択" + +#: src/slic3r/GUI/GLCanvas3D.cpp:955 +#, possible-c-format +msgid "up to %.2f mm" +msgstr "最大%.2f mm" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +msgid "Update available" +msgstr "アップデート可能" + +#: src/slic3r/GUI/ConfigWizard.cpp:779 src/slic3r/GUI/Preferences.cpp:80 +msgid "Update built-in Presets automatically" +msgstr "組込みプリセットを自動的に更新する" + +#: src/slic3r/GUI/ConfigWizard.cpp:761 +msgid "Updates" +msgstr "アップデート情報" + +#: src/slic3r/GUI/ConfigWizard.cpp:786 +msgid "Updates are never applied without user's consent and never overwrite user's customized settings." +msgstr "更新プログラムはユーザーの知らないうちにインストールされることはなく、カスタマイズされた設定を上書きすることもありません。" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18 +msgid "Upgrade" +msgstr "アップグレード" + +#: src/slic3r/GUI/GUI_App.cpp:824 +msgid "Upload a firmware image into an Arduino based printer" +msgstr "ファームウェアイメージをArduinoベースのプリンターにアップロードする" + +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "FlashAirカードでのアップロードが有効になっていません。" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:33 +msgid "Upload to Printer Host with the following filename:" +msgstr "次のファイル名でプリンターサーバーにアップロードします:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:230 +msgid "Uploading" +msgstr "アップロード" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 +msgid "Upper Layer" +msgstr "上のレイヤー" + +#: src/slic3r/GUI/Tab.cpp:1900 +msgid "USB/Serial connection" +msgstr "USB/シリアル 接続" + +#: src/libslic3r/PrintConfig.cpp:1662 +msgid "USB/serial port for printer connection." +msgstr "プリンター接続用USB/シリアルポート。" + +#: src/slic3r/GUI/DoubleSlider.cpp:1147 +msgid "Use another extruder" +msgstr "別のエクストルーダーを使用する" + +#: src/slic3r/GUI/Preferences.cpp:143 +msgid "Use custom size for toolbar icons" +msgstr "ツールバーアイコンにカスタムサイズを使用する" + +#: src/libslic3r/PrintConfig.cpp:2161 +msgid "Use firmware retraction" +msgstr "ファームウェア吸込みを使用" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 +msgid "Use forward slashes ( / ) as a directory separator if needed." +msgstr "必要に応じて、ディレクトリ区切り文字としてスラッシュ(/)を使用してください。" + +#: src/slic3r/GUI/Preferences.cpp:126 +msgid "Use free camera" +msgstr "フリーカメラを使用" + +#: src/libslic3r/PrintConfig.cpp:2780 +msgid "Use pad" +msgstr "台座を使用" + +#: src/slic3r/GUI/Preferences.cpp:119 +msgid "Use perspective camera" +msgstr "パースカメラを使用" + +#: src/libslic3r/PrintConfig.cpp:2168 +msgid "Use relative E distances" +msgstr "E相対距離モードを使用する" + +#: src/slic3r/GUI/Preferences.cpp:104 +msgid "Use Retina resolution for the 3D scene" +msgstr "3DシーンにRetina解像度を使用する" + +#: src/libslic3r/PrintConfig.cpp:540 +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:1893 +msgid "Use this setting to rotate the support material pattern on the horizontal plane." +msgstr "この設定を使用して、水平面上でサポート材料パターンを回転します。" + +#: src/libslic3r/PrintConfig.cpp:2175 +msgid "Use volumetric E" +msgstr "体積押出しEを使用" + +#: src/slic3r/GUI/DoubleSlider.cpp:1171 +msgid "used" +msgstr "使用した" + +#: src/slic3r/GUI/Plater.cpp:237 +msgid "Used Filament (g)" +msgstr "使用フィラメント(g)" + +#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1229 +msgid "Used Filament (m)" +msgstr "使用フィラメント(m)" + +#: src/slic3r/GUI/Plater.cpp:236 +msgid "Used Filament (mm³)" +msgstr "使用フィラメント (mm³)" + +#: src/slic3r/GUI/Plater.cpp:1191 +msgid "Used Material (ml)" +msgstr "使用材料(ml)" + +#: src/slic3r/GUI/Plater.cpp:238 +msgid "Used Material (unit)" +msgstr "使用材料(単位)" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 +msgid "User" +msgstr "ユーザー" + +#: src/slic3r/GUI/Preset.cpp:1168 src/slic3r/GUI/Preset.cpp:1288 +#: src/slic3r/GUI/PresetBundle.cpp:1677 +msgid "User presets" +msgstr "ユーザープリセット" + +#: src/libslic3r/Zipper.cpp:90 +msgid "validation failed" +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/Tab.cpp:2202 +msgid "Values in this column are for Normal mode" +msgstr "この列の値は通常モード用です" + +#: src/slic3r/GUI/Tab.cpp:2208 +msgid "Values in this column are for Stealth mode" +msgstr "この列の値はサイレントモード用です" + +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4573 +msgid "Variable layer height" +msgstr "可変レイヤー高さ" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1709 +msgid "Variable layer height - Adaptive" +msgstr "可変レイヤー高-アダプティブ" + +#: src/slic3r/GUI/GLCanvas3D.cpp:599 +msgid "Variable layer height - Manual edit" +msgstr "可変レイヤー高-マニュアル編集" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1701 +msgid "Variable layer height - Reset" +msgstr "可変レイヤー高さ - リセット" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1717 +msgid "Variable layer height - Smooth all" +msgstr "可変レイヤー高さ - 全てを滑らかに" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 +msgid "variants" +msgstr "バリアント" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:971 +msgid "vendor" +msgstr "メーカー" + +#: src/slic3r/GUI/ConfigWizard.cpp:565 +msgid "Vendor:" +msgstr "ベンダー:" + +#: src/libslic3r/PrintConfig.cpp:928 +msgid "Verbose G-code" +msgstr "コメント付きGコード" + +#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64 +msgid "Version" +msgstr "バージョン" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 +msgid "version" +msgstr "バージョン" + +#: src/slic3r/GUI/Tab.cpp:1053 +msgid "Vertical shells" +msgstr "外壁設定" + +#: src/slic3r/GUI/GUI_Preview.cpp:218 +msgid "View" +msgstr "ビュー" + +#: src/slic3r/GUI/ConfigWizard.cpp:813 +msgid "View mode" +msgstr "ビューモード" + +#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422 +#: src/libslic3r/SLAPrintSteps.cpp:461 +msgid "Visualizing supports" +msgstr "サポートの視覚化" + +#: src/slic3r/GUI/Plater.cpp:161 +msgid "Volume" +msgstr "ボリューム" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 +msgid "Volume to purge (mm³) when the filament is being" +msgstr "フィラメントをロード/アンロードするときにパージする量(mm³)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 +msgid "Volumes in Object reordered" +msgstr "オブジェクトのボリュームが並べ替えられました" + +#: src/slic3r/GUI/PresetHints.cpp:219 +msgid "Volumetric" +msgstr "体積押出し" + +#: src/slic3r/GUI/Tab.cpp:1591 +msgid "Volumetric flow hints not available" +msgstr "体積押出し流量のヒントは利用できません" + +#: src/slic3r/GUI/GUI_Preview.cpp:226 +msgid "Volumetric flow rate" +msgstr "体積押出し流量" + +#: src/libslic3r/GCode/PreviewData.cpp:355 +msgid "Volumetric flow rate (mm³/s)" +msgstr "体積押出し量 (mm³/s)" + +#: src/slic3r/GUI/RammingChart.cpp:81 +msgid "Volumetric speed" +msgstr "体積押出し速度" + +#: src/libslic3r/PrintConfig.cpp:2915 +msgid "Wall thickness" +msgstr "壁の厚さ" + +#: 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 +msgid "Warning" +msgstr "注意" + +#: src/slic3r/GUI/ConfigWizard.cpp:431 +msgid "Welcome" +msgstr "ようこそ" + +#: src/slic3r/GUI/ConfigWizard.cpp:427 +#, possible-c-format +msgid "Welcome to the %s Configuration Assistant" +msgstr "%s構成アシスタントへようこそ" + +#: src/slic3r/GUI/ConfigWizard.cpp:429 +#, possible-c-format +msgid "Welcome to the %s Configuration Wizard" +msgstr "%s構成ウィザードへようこそ" + +#: src/slic3r/GUI/Preferences.cpp:97 +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/PresetHints.cpp:224 +msgid "when printing" +msgstr "プリントするとき" + +#: src/libslic3r/PrintConfig.cpp:253 +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は重なり合うオブジェクト部分を1つずつカットします(2番目の部分は1番目、3番目の部分は1番目、2番目などでカットされます)。" + +#: src/libslic3r/PrintConfig.cpp:305 +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:891 +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 "非常に薄いレイヤーでプリントする場合、プリントエリア内でのノズルービルドプレート(ベッド)間のバラツキによりベッドとの密着が損なわれないよう1番目のレイヤーは他のレイヤーより厚めにプリントして対策します。 1番目のレイヤーの厚みを、絶対値またはパーセンテージ(例:150%)で入力します。" + +#: src/libslic3r/PrintConfig.cpp:1553 +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:1545 +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:1391 +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 "ゼロに設定すると、ロード中にフィラメントがパーキング位置から押し出される距離は、アンロード中に戻った距離と同一になります。 正の場合、その分多くロードされ、逆に負の場合は、ロード距離はアンロードよりも短くなります。" + +#: src/libslic3r/PrintConfig.cpp:1238 +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:1597 +msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament." +msgstr "ツールの交換後に吸込み分が補正されると、エクストルーダーはこの追加量のフィラメントを押し出します。" + +#: src/libslic3r/PrintConfig.cpp:1589 +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/slic3r/GUI/Tab.cpp:3263 +msgid "WHITE BULLET" +msgstr "白丸" + +#: src/slic3r/GUI/Tab.cpp:3285 +msgid "WHITE BULLET icon indicates a non system (or non default) preset." +msgstr "白丸アイコンは、システム(またはデフォルト)プリセットでないことを示します。" + +#: src/slic3r/GUI/Tab.cpp:3288 +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:3303 +msgid "WHITE BULLET icon indicates that the value is the same as in the last saved preset." +msgstr "白丸アイコンは、値が最後に保存されたプリセットと同じであることを示します。" + +#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238 +msgid "Width" +msgstr "幅" + +#: src/libslic3r/GCode/PreviewData.cpp:349 +msgid "Width (mm)" +msgstr "幅(mm)" + +#: src/libslic3r/PrintConfig.cpp:2640 +msgid "Width from the back sphere center to the front sphere center" +msgstr "後部ボールの中心から前部ボールの中心までの幅" + +#: src/libslic3r/PrintConfig.cpp:2239 +msgid "Width of a wipe tower" +msgstr "ワイプタワーの幅" + +#: src/libslic3r/PrintConfig.cpp:2891 +msgid "Width of the connector sticks which connect the object and the generated pad." +msgstr "オブジェクトと生成されたパッドを接続するコネクタスティックの幅。" + +#: src/libslic3r/PrintConfig.cpp:2354 +msgid "Width of the display" +msgstr "ディスプレイの幅" + +#: src/slic3r/GUI/PresetHints.cpp:48 +msgid "will always run at %1%%%" +msgstr "常に%1%%%で実行されます" + +#: src/slic3r/GUI/PresetHints.cpp:55 +msgid "will be turned off." +msgstr "オフになります。" + +#: src/libslic3r/PrintConfig.cpp:2441 +msgid "Will inflate or deflate the sliced 2D polygons according to the sign of the correction." +msgstr "修正の符号に従って、スライスされた2Dポリゴンを膨張または収縮させます。" + +#: src/libslic3r/PrintConfig.cpp:2261 +msgid "Wipe into this object" +msgstr "このオブジェクトにワイプを含める" + +#: src/libslic3r/PrintConfig.cpp:2253 +msgid "Wipe into this object's infill" +msgstr "このオブジェクトのインフィルにワイプを含める" + +#: 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 +msgid "Wipe options" +msgstr "ワイプオプション" + +#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1191 +#: src/libslic3r/ExtrusionEntity.cpp:321 +msgid "Wipe tower" +msgstr "ワイプタワー" + +#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245 +msgid "wipe tower" +msgstr "ワイプタワー" + +#: src/slic3r/GUI/ConfigManipulation.cpp:120 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 +msgid "Wipe Tower" +msgstr "ワイプタワー" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 +msgid "Wipe tower - Purging volume adjustment" +msgstr "ワイプタワー-パージ量調整" + +#: src/slic3r/GUI/Tab.cpp:1488 +msgid "Wipe tower parameters" +msgstr "ワイプタワーのパラメータ" + +#: src/libslic3r/PrintConfig.cpp:2245 +msgid "Wipe tower rotation angle" +msgstr "ワイプタワーの回転角" + +#: src/libslic3r/PrintConfig.cpp:2246 +msgid "Wipe tower rotation angle with respect to x-axis." +msgstr "x軸に対するワイプタワーの回転角度。" + +#: src/libslic3r/PrintConfig.cpp:2193 +msgid "Wipe while retracting" +msgstr "吸込み中にワイプ" + +#: src/slic3r/GUI/PresetHints.cpp:225 +msgid "with a volumetric rate" +msgstr "体積押出し率で" + +#: src/libslic3r/PrintConfig.cpp:1530 +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:2056 +msgid "With sheath around the support" +msgstr "サポートの周りに覆いを付ける" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 +msgid "World coordinates" +msgstr "ワールド座標" + +#: src/slic3r/GUI/UpdateDialogs.cpp:92 +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 "インストールしますか?まず完全な設定スナップショットが作成されます。 新しいバージョンに問題がある場合はいつでも復元できます。アップデートされた設定に含まれるもの:" + +#: src/libslic3r/Zipper.cpp:92 +msgid "write calledback failed" +msgstr "コールバックの書込に失敗しました" + +#: src/libslic3r/PrintConfig.cpp:3382 +msgid "Write information about the model to the console." +msgstr "コンソールにモデル情報をリストします。" + +#: src/slic3r/Utils/Duet.cpp:131 +msgid "Wrong password" +msgstr "パスワードが違います" + +#: src/libslic3r/PrintConfig.cpp:2225 +msgid "X coordinate of the left front corner of a wipe tower" +msgstr "ワイプタワー前面左端のX座標" + +#: src/libslic3r/PrintConfig.cpp:1879 +msgid "XY separation between an object and its support" +msgstr "XY面でのサポートとモデルの隙間" + +#: src/libslic3r/PrintConfig.cpp:1881 +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 "レイヤー内のオブジェクトとサポート間の隙間。 パーセンテージ(たとえば、50%)で表された場合、最外周の射出幅から計算されます。" + +#: src/libslic3r/PrintConfig.cpp:2275 +msgid "XY Size Compensation" +msgstr "XYサイズ補正" + +#: src/libslic3r/PrintConfig.cpp:2232 +msgid "Y coordinate of the left front corner of a wipe tower" +msgstr "ワイプタワー前面左端のY座標" + +#: src/slic3r/GUI/Plater.cpp:1170 +msgid "Yes" +msgstr "はい" + +#: src/libslic3r/PrintConfig.cpp:1317 +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:589 +msgid "You can put your notes regarding the filament here." +msgstr "フィラメントに対してノートをここで書けます。" + +#: src/libslic3r/PrintConfig.cpp:1473 +msgid "You can put your notes regarding the printer here." +msgstr "プリンタに関するメモをここに入力できます。" + +#: src/libslic3r/PrintConfig.cpp:2579 +msgid "You can put your notes regarding the SLA print material here." +msgstr "SLAプリント材料に関するメモをここに記入できます。" + +#: src/libslic3r/PrintConfig.cpp:360 +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:1364 +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/slic3r/GUI/GUI_ObjectList.cpp:3546 +msgid "You can't change a type of the last solid part of the object." +msgstr "オブジェクトの最後のソリッドパーツのタイプを変更することはできません。" + +#: src/slic3r/GUI/Plater.cpp:2390 +#, 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 "オブジェクトの1つまたはいくつかはマルチパートであるため、%sからオブジェクトを追加できません" + +#: src/slic3r/GUI/Plater.cpp:2311 +msgid "You cannot load SLA project with a multi-part object on the bed" +msgstr "複数のパーツで構成されたオブジェクトを使用してSLAプロジェクトをベッドにロードすることはできません。" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 +msgid "You cannot use non-uniform scaling mode for multiple objects/parts selection" +msgstr "複数のオブジェクト/パーツの選択で軸別のスケールモードを使用することはできません" + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:287 +msgid "You may need to update your graphics card driver." +msgstr "グラフィックカードドライバを更新する必要がある場合があります。" + +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +msgid "You must install a configuration update." +msgstr "構成の更新をインストールする必要があります。" + +#: src/slic3r/GUI/Preferences.cpp:172 +#, possible-c-format +msgid "You need to restart %s to make the changes effective." +msgstr "変更を有効にするには、%sを再起動する必要があります。" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3421 +#, possible-c-format +msgid "You started your selection with %s Item." +msgstr "%sアイテムで選択を開始しました。" + +#: src/slic3r/GUI/DoubleSlider.cpp:1902 +msgid "Your current changes will delete all saved color changes." +msgstr "現在の変更により、保存されている全ての色の変更が削除されます。" + +#: src/slic3r/GUI/DoubleSlider.cpp:1923 +msgid "Your current changes will delete all saved extruder (tool) changes." +msgstr "現在の変更により、保存されているすべてのエクストルーダー(ツール)の変更が削除されます。" + +#: src/slic3r/GUI/MainFrame.cpp:911 +msgid "Your file was repaired." +msgstr "ファイルが修復されました。" + +#: src/slic3r/GUI/Plater.cpp:2528 +msgid "Your object appears to be too large, so it was automatically scaled down to fit your print bed." +msgstr "オブジェクトが大きすぎて、プリントベッドに収まるように自動縮小することができません。" + +#: src/libslic3r/PrintConfig.cpp:2285 +msgid "Z offset" +msgstr "Zオフセット" + +#: src/slic3r/GUI/ConfigManipulation.cpp:60 +msgid "Zero first layer height is not valid.\n\nThe first layer height will be reset to 0.01." +msgstr "最初のレイヤーのゼロの高さは無効です。\n \n最初のレイヤーの高さは0.01にリセットされます。" + +#: src/slic3r/GUI/ConfigManipulation.cpp:48 +msgid "Zero layer height is not valid.\n\nThe layer height will be reset to 0.01." +msgstr "レイヤーの高さゼロは無効です。\n \nレイヤーの高さは0.01にリセットされます。" + +#: src/libslic3r/PrintConfig.cpp:2667 +msgid "Zig-Zag" +msgstr "ジグザグ" + +#: src/slic3r/GUI/Mouse3DController.cpp:308 +#: src/slic3r/GUI/Mouse3DController.cpp:317 +msgid "Zoom" +msgstr "ズーム" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +msgid "Zoom in" +msgstr "ズームイン" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +msgid "Zoom out" +msgstr "縮小" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 +msgid "Zoom to Bed" +msgstr "ベッドの大きさにズーム" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +msgid "Zoom to selected object\nor all objects in scene, if none selected" +msgstr "オブジェクトが選択されていない場合、シーン内のすべてのオブジェクト\nもしくは選択されているオブジェクトをズーム表示します" + +#: 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 +msgid "°" +msgstr "°" + +#: src/slic3r/GUI/ConfigWizard.cpp:1038 src/slic3r/GUI/ConfigWizard.cpp:1052 +msgid "°C" +msgstr "°C" diff --git a/resources/localization/ko/PrusaSlicer.mo b/resources/localization/ko/PrusaSlicer.mo index 5ba55934e2..fa7a62e6ed 100644 Binary files a/resources/localization/ko/PrusaSlicer.mo and b/resources/localization/ko/PrusaSlicer.mo differ diff --git a/resources/localization/ko/PrusaSlicer_ko_KR.po b/resources/localization/ko/PrusaSlicer_ko_KR.po index 7bb8a8c6a7..804e211418 100644 --- a/resources/localization/ko/PrusaSlicer_ko_KR.po +++ b/resources/localization/ko/PrusaSlicer_ko_KR.po @@ -1,9 +1,14 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-08-06 09:54+0200\n" -"PO-Revision-Date: 2019-08-25 09:43+0900\n" +"PO-Revision-Date: 2020-02-28 09:34+0900\n" "Last-Translator: lee hak-min \n" "Language-Team: ulsanether\n" "Language: ko_KR\n" @@ -16,42 +21,42 @@ msgstr "" "X-Crowdin-Language: ko\n" "X-Crowdin-File: ko_KR.po\n" -#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:289 +#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291 msgid "Portions copyright" msgstr "다른 저작권" -#: src/slic3r/GUI/AboutDialog.cpp:125 src/slic3r/GUI/AboutDialog.cpp:254 +#: src/slic3r/GUI/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256 msgid "Copyright" msgstr "저작권" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:127 +#: src/slic3r/GUI/AboutDialog.cpp:129 msgid "" "License agreements of all following programs (libraries) are part of " "application license agreement" msgstr "" "다음의 모든 프로그램 (라이브러리)의 라이센스 계약은 응용 프로그램 라이센스 계" -"약의 일부입니다." +"약의 일부입니다" -#: src/slic3r/GUI/AboutDialog.cpp:197 +#: src/slic3r/GUI/AboutDialog.cpp:199 #, c-format msgid "About %s" msgstr "%s에 대하여" -#: src/slic3r/GUI/AboutDialog.cpp:229 src/slic3r/GUI/MainFrame.cpp:60 +#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64 msgid "Version" msgstr "버전" #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:256 +#: src/slic3r/GUI/AboutDialog.cpp:258 msgid "is licensed under the" msgstr "라이선스는" -#: src/slic3r/GUI/AboutDialog.cpp:257 +#: src/slic3r/GUI/AboutDialog.cpp:259 msgid "GNU Affero General Public License, version 3" msgstr "GNU Affero 일반 공중 사용 허가서, 버전 3" -#: src/slic3r/GUI/AboutDialog.cpp:258 +#: src/slic3r/GUI/AboutDialog.cpp:260 msgid "" "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap " "community." @@ -59,7 +64,7 @@ msgstr "" "프루사슬라이서는 알레산드로 라넬루치와 RepRap 커뮤니티 Slic3r를 기반으로합니" "다." -#: src/slic3r/GUI/AboutDialog.cpp:259 +#: src/slic3r/GUI/AboutDialog.cpp:261 msgid "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " @@ -67,184 +72,211 @@ msgid "" msgstr "" "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " "Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " -"numerous others. 한국어 번역 울산에테르." +"numerous others. 한국어 번역 울산에테르, 밤송이직박구리" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:92 +#: src/slic3r/GUI/AppConfig.cpp:118 +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/BackgroundSlicingProcess.cpp:118 msgid "" "Copying of the temporary G-code to the output G-code failed. Maybe the SD " "card is write locked?" msgstr "" -"임시 G-코드를 출력할 SD카드에 복사하는 데 실패했습니다. SD카드의 락을 확인 하" +"임시 G-code를 출력할 SD카드에 복사하는 데 실패했습니다. SD카드의 락을 확인 하" "시오." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:93 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:406 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:120 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:470 msgid "Running post-processing scripts" msgstr "포스트 프로세싱 스크립트" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:95 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:122 msgid "G-code file exported to %1%" msgstr "%1%로 내보낸 G 코드 파일" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:99 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:117 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:126 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:176 msgid "Slicing complete" msgstr "슬라이스 완료" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:113 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:172 msgid "Masked SLA file exported to %1%" msgstr "마스크 된 SLA 파일을 %1%로 내보냅니" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:408 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:214 +#, 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에서 오류가 발생했습니다. 메모리 부족으로 인해 발생했을 수 있습니다. 시스템" +"에 충분한 RAM이 있다고 확신하는 경우 버그가 될 수 있으며 보고해 주길 바랍니" +"다." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:472 msgid "Copying of the temporary G-code to the output G-code failed" msgstr "임시 G 코드를 출력 G 코드에 복사 하지 못했습니다" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:417 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:497 msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue" msgstr "" "`%1%`. 로 업로드를 예약 합니다. 창-> 인쇄 호스트 업로드 대기열을 참조 하십시" "오" -#: src/slic3r/GUI/BedShapeDialog.cpp:65 +#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2038 msgid "Shape" msgstr "모양" -#: src/slic3r/GUI/BedShapeDialog.cpp:72 +#: src/slic3r/GUI/BedShapeDialog.cpp:73 msgid "Rectangular" msgstr "직사각형" -#: src/slic3r/GUI/BedShapeDialog.cpp:76 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:391 src/slic3r/GUI/Plater.cpp:145 -#: src/slic3r/GUI/Tab.cpp:2469 +#: src/slic3r/GUI/BedShapeDialog.cpp:77 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:162 +#: src/slic3r/GUI/Tab.cpp:2306 msgid "Size" msgstr "사이즈" -#: src/slic3r/GUI/BedShapeDialog.cpp:77 +#: src/slic3r/GUI/BedShapeDialog.cpp:78 msgid "Size in X and Y of the rectangular plate." -msgstr "사격형 플레이트 X 및 Y 크기." - -#: src/slic3r/GUI/BedShapeDialog.cpp:83 -msgid "Origin" -msgstr "원본" +msgstr "사각 플레이트 X 및 Y 크기." #: src/slic3r/GUI/BedShapeDialog.cpp:84 +msgid "Origin" +msgstr "원점" + +#: src/slic3r/GUI/BedShapeDialog.cpp:85 msgid "" "Distance of the 0,0 G-code coordinate from the front left corner of the " "rectangle." -msgstr "사각형의 전면 왼쪽된 모서리에서 0, 0 G-코드 좌표 거리입니다." +msgstr "사각 전면 왼쪽 모서리에서 원저(0, 0) G-code 좌표 거리입니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:88 +#: src/slic3r/GUI/BedShapeDialog.cpp:89 msgid "Circular" msgstr "원형" -#: src/slic3r/GUI/BedShapeDialog.cpp:91 src/slic3r/GUI/ConfigWizard.cpp:118 -#: src/slic3r/GUI/ConfigWizard.cpp:571 src/slic3r/GUI/ConfigWizard.cpp:585 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 src/slic3r/GUI/wxExtensions.cpp:486 -#: src/libslic3r/PrintConfig.cpp:70 src/libslic3r/PrintConfig.cpp:77 -#: src/libslic3r/PrintConfig.cpp:86 src/libslic3r/PrintConfig.cpp:220 -#: src/libslic3r/PrintConfig.cpp:295 src/libslic3r/PrintConfig.cpp:303 -#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:363 -#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:499 -#: src/libslic3r/PrintConfig.cpp:517 src/libslic3r/PrintConfig.cpp:695 -#: src/libslic3r/PrintConfig.cpp:1215 src/libslic3r/PrintConfig.cpp:1276 -#: src/libslic3r/PrintConfig.cpp:1294 src/libslic3r/PrintConfig.cpp:1312 -#: src/libslic3r/PrintConfig.cpp:1364 src/libslic3r/PrintConfig.cpp:1374 -#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 -#: src/libslic3r/PrintConfig.cpp:1544 src/libslic3r/PrintConfig.cpp:1552 -#: src/libslic3r/PrintConfig.cpp:1562 src/libslic3r/PrintConfig.cpp:1570 -#: src/libslic3r/PrintConfig.cpp:1578 src/libslic3r/PrintConfig.cpp:1661 -#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:1948 -#: src/libslic3r/PrintConfig.cpp:1982 src/libslic3r/PrintConfig.cpp:2176 -#: src/libslic3r/PrintConfig.cpp:2183 src/libslic3r/PrintConfig.cpp:2190 -#: src/libslic3r/PrintConfig.cpp:2220 src/libslic3r/PrintConfig.cpp:2230 -#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2403 -#: src/libslic3r/PrintConfig.cpp:2478 src/libslic3r/PrintConfig.cpp:2487 -#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2506 -#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2560 -#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:2592 -#: src/libslic3r/PrintConfig.cpp:2602 src/libslic3r/PrintConfig.cpp:2613 -#: src/libslic3r/PrintConfig.cpp:2631 src/libslic3r/PrintConfig.cpp:2646 -#: src/libslic3r/PrintConfig.cpp:2660 src/libslic3r/PrintConfig.cpp:2673 -#: src/libslic3r/PrintConfig.cpp:2683 src/libslic3r/PrintConfig.cpp:2704 -#: src/libslic3r/PrintConfig.cpp:2715 src/libslic3r/PrintConfig.cpp:2725 -#: src/libslic3r/PrintConfig.cpp:2735 +#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:218 +#: src/slic3r/GUI/ConfigWizard.cpp:971 src/slic3r/GUI/ConfigWizard.cpp:985 +#: 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:178 src/libslic3r/PrintConfig.cpp:236 +#: src/libslic3r/PrintConfig.cpp:311 src/libslic3r/PrintConfig.cpp:319 +#: src/libslic3r/PrintConfig.cpp:369 src/libslic3r/PrintConfig.cpp:379 +#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516 +#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:713 +#: src/libslic3r/PrintConfig.cpp:1240 src/libslic3r/PrintConfig.cpp:1301 +#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1337 +#: src/libslic3r/PrintConfig.cpp:1393 src/libslic3r/PrintConfig.cpp:1403 +#: src/libslic3r/PrintConfig.cpp:1525 src/libslic3r/PrintConfig.cpp:1533 +#: src/libslic3r/PrintConfig.cpp:1574 src/libslic3r/PrintConfig.cpp:1582 +#: src/libslic3r/PrintConfig.cpp:1592 src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1608 src/libslic3r/PrintConfig.cpp:1691 +#: src/libslic3r/PrintConfig.cpp:1924 src/libslic3r/PrintConfig.cpp:1995 +#: src/libslic3r/PrintConfig.cpp:2029 src/libslic3r/PrintConfig.cpp:2157 +#: src/libslic3r/PrintConfig.cpp:2236 src/libslic3r/PrintConfig.cpp:2243 +#: src/libslic3r/PrintConfig.cpp:2250 src/libslic3r/PrintConfig.cpp:2280 +#: src/libslic3r/PrintConfig.cpp:2290 src/libslic3r/PrintConfig.cpp:2300 +#: src/libslic3r/PrintConfig.cpp:2485 src/libslic3r/PrintConfig.cpp:2624 +#: src/libslic3r/PrintConfig.cpp:2633 src/libslic3r/PrintConfig.cpp:2642 +#: src/libslic3r/PrintConfig.cpp:2652 src/libslic3r/PrintConfig.cpp:2696 +#: src/libslic3r/PrintConfig.cpp:2706 src/libslic3r/PrintConfig.cpp:2718 +#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2748 +#: src/libslic3r/PrintConfig.cpp:2758 src/libslic3r/PrintConfig.cpp:2776 +#: src/libslic3r/PrintConfig.cpp:2791 src/libslic3r/PrintConfig.cpp:2805 +#: src/libslic3r/PrintConfig.cpp:2816 src/libslic3r/PrintConfig.cpp:2829 +#: src/libslic3r/PrintConfig.cpp:2874 src/libslic3r/PrintConfig.cpp:2884 +#: src/libslic3r/PrintConfig.cpp:2893 src/libslic3r/PrintConfig.cpp:2903 +#: src/libslic3r/PrintConfig.cpp:2919 msgid "mm" msgstr "mm" -#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/libslic3r/PrintConfig.cpp:692 +#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:710 msgid "Diameter" msgstr "노즐 직경" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 msgid "" "Diameter of the print bed. It is assumed that origin (0,0) is located in the " "center." -msgstr "인쇄 침대의 직경. 원점 (0,0) 은 중심에 있다고 가정합니다." +msgstr "인쇄 배드의 직경. 원점 (0,0) 은 중재봉선에 있다고 가정합니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:97 src/slic3r/GUI/GUI_Preview.cpp:246 -#: src/libslic3r/GCode/PreviewData.cpp:175 +#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:251 +#: src/libslic3r/ExtrusionEntity.cpp:322 msgid "Custom" msgstr "사용자 정의" -#: src/slic3r/GUI/BedShapeDialog.cpp:101 +#: src/slic3r/GUI/BedShapeDialog.cpp:102 msgid "Load shape from STL..." msgstr "STL파일 로드." -#: src/slic3r/GUI/BedShapeDialog.cpp:154 +#: src/slic3r/GUI/BedShapeDialog.cpp:155 msgid "Settings" msgstr "설정" -#: src/slic3r/GUI/BedShapeDialog.cpp:171 +#: src/slic3r/GUI/BedShapeDialog.cpp:172 msgid "Texture" msgstr "질감" -#: src/slic3r/GUI/BedShapeDialog.cpp:181 src/slic3r/GUI/BedShapeDialog.cpp:249 +#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261 msgid "Load..." msgstr "불러오기..." -#: src/slic3r/GUI/BedShapeDialog.cpp:189 src/slic3r/GUI/BedShapeDialog.cpp:257 -#: src/slic3r/GUI/Tab.cpp:3204 +#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 +#: src/slic3r/GUI/Tab.cpp:3094 msgid "Remove" msgstr "제거" -#: src/slic3r/GUI/BedShapeDialog.cpp:239 +#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302 +msgid "Not found: " +msgstr "찾을 수 없음:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:251 msgid "Model" msgstr "모델" -#: src/slic3r/GUI/BedShapeDialog.cpp:464 +#: src/slic3r/GUI/BedShapeDialog.cpp:487 msgid "Choose an STL file to import bed shape from:" -msgstr "다음 에서 침대 모양을 가져올 STL 파일을 선택합니다." +msgstr "가져올 베드 모양을(STL 파일) 선택합니다:" -#: src/slic3r/GUI/BedShapeDialog.cpp:471 src/slic3r/GUI/BedShapeDialog.cpp:520 -#: src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:566 msgid "Invalid file format." msgstr "잘못된 파일 형식." -#: src/slic3r/GUI/BedShapeDialog.cpp:482 +#: src/slic3r/GUI/BedShapeDialog.cpp:505 msgid "Error! Invalid model" msgstr "오류! 잘못된 모델" -#: src/slic3r/GUI/BedShapeDialog.cpp:490 +#: src/slic3r/GUI/BedShapeDialog.cpp:513 msgid "The selected file contains no geometry." -msgstr "선택한 파일에는 형상이 없는 포함 되어 있습니다." +msgstr "선택한 파일에 없는 형상이 있습니다." -#: src/slic3r/GUI/BedShapeDialog.cpp:494 +#: src/slic3r/GUI/BedShapeDialog.cpp:517 msgid "" "The selected file contains several disjoint areas. This is not supported." msgstr "" -"선택한 파일 여러 분리 된 영역을 포함 되어 있습니다. 이것ㅇ 지원 되지 않습니" -"다." - -#: src/slic3r/GUI/BedShapeDialog.cpp:509 -msgid "Choose a file to import bed texture from (PNG/SVG):" -msgstr "(PNG /SVG)에서 침대 텍스처를 가져올 파일을 선택합니다." +"선택한 파일은 여러개의 분리 된 영역을 포함 되어 있어 지원 되지 않습니다." #: src/slic3r/GUI/BedShapeDialog.cpp:532 -msgid "Choose an STL file to import bed model from:" -msgstr "다음에서 침대 모델을 가져올 STL 파일을 선택합니다." +msgid "Choose a file to import bed texture from (PNG/SVG):" +msgstr "(PNG /SVG)에서 배드 텍스처를 가져올 파일을 선택합니다." -#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:530 +#: src/slic3r/GUI/BedShapeDialog.cpp:555 +msgid "Choose an STL file to import bed model from:" +msgstr "다음에서 베드 모델을 가져올 STL 파일을 선택합니다:" + +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:930 msgid "Bed Shape" msgstr "배드 모양" @@ -288,8 +320,150 @@ msgstr "이 값은 시스템 값과 같습니다" msgid "" "Value was changed and is not equal to the system value or the last saved " "preset" +msgstr "값이 변경 되었고, 시스템 값 또는 마지막으로 저장된 설정값과 다릅니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:48 +msgid "" +"Zero layer height is not valid.\n" +"\n" +"The layer height will be reset to 0.01." msgstr "" -"값이 변경 되었고 시스템 값 또는 마지막으로 저장 된 사전 설정과 같지 않음" +"바닥 레이어 높이가 잘못되었습니다.\n" +"\n" +"레이어 높이가 0.01로 재설정됩니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1039 +#: src/libslic3r/PrintConfig.cpp:71 +msgid "Layer height" +msgstr "레이어 높이" + +#: src/slic3r/GUI/ConfigManipulation.cpp:60 +msgid "" +"Zero first layer height is not valid.\n" +"\n" +"The first layer height will be reset to 0.01." +msgstr "" +"첫 번째 레이어 높이가 0이면 유효하지 않습니다.\n" +"\n" +"첫 번째 레이어 높이는 0.01로 재설정됩니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:890 +msgid "First layer height" +msgstr "첫 레이어 높이" + +#: src/slic3r/GUI/ConfigManipulation.cpp:75 +#, 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" +"- inactive Ensure vertical shell thickness" +msgstr "" +"나선형 꽃병 모드는 다음을 필요로 합니다.\n" +"- 하나의 둘레\n" +"- 상단 솔리드 레이어 없음\n" +"- 0% 충진 밀도\n" +"- 서포트가 필요 없음\n" +"- 비활성 수직 쉘 두께 보장" + +#: src/slic3r/GUI/ConfigManipulation.cpp:82 +msgid "Shall I adjust those settings in order to enable Spiral Vase?" +msgstr "나선형 꽃병을 활성화하기 위해 이러한 설정을 조정해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:83 +msgid "Spiral Vase" +msgstr "스파이럴 바이스" + +#: src/slic3r/GUI/ConfigManipulation.cpp:107 +msgid "" +"The Wipe Tower currently supports the non-soluble supports only\n" +"if they are printed with the current extruder without triggering a tool " +"change.\n" +"(both support_material_extruder and support_material_interface_extruder need " +"to be set to 0)." +msgstr "" +"와이프 타워(프라임 타워)는 현재 비수용성 지원만 지원합니다.\n" +"공구 교환을 트리거하지 않고 현재 압출기로 인쇄된 경우\n" +"(support_material_extruder support_material_interface_extruder 모두 0으로 설" +"정해야 합니다)." + +#: src/slic3r/GUI/ConfigManipulation.cpp:111 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "와이프 타워를 활성화하기 위해 이러한 설정을 조정해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:112 +#: src/slic3r/GUI/ConfigManipulation.cpp:132 +msgid "Wipe Tower" +msgstr "와이프 타워(프라임 타워)" + +#: src/slic3r/GUI/ConfigManipulation.cpp:128 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers\n" +"need to be synchronized with the object layers." +msgstr "" +"와이프 타워(프라임 타워)가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 객체(object) " +"레이어와 동기화 해야 합니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:131 +msgid "Shall I synchronize support layers in order to enable the Wipe Tower?" +msgstr "와이프 타워를 활성화하기 위해 지원 레이어를 동기화해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:151 +msgid "" +"Supports work better, if the following feature is enabled:\n" +"- Detect bridging perimeters" +msgstr "" +"다음 기능이 활성화된 경우 더 나은 작업을 지원합니다.\n" +"- 브리징 경계를 감지" + +#: src/slic3r/GUI/ConfigManipulation.cpp:154 +msgid "Shall I adjust those settings for supports?" +msgstr "지원에 대한 설정을 조정해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:155 +msgid "Support Generator" +msgstr "서포트 생성" + +#: src/slic3r/GUI/ConfigManipulation.cpp:200 +msgid "The %1% infill pattern is not supposed to work at 100%% density." +msgstr "%1% 채우기 패턴은 100%% 밀도로 작동하도록 되어 있지 않습니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:202 +msgid "Shall I switch to rectilinear fill pattern?" +msgstr "직선 채우기 패턴으로 전환해야 합니까?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:203 +#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:94 +#: src/slic3r/GUI/GUI_ObjectList.cpp:612 src/slic3r/GUI/Plater.cpp:524 +#: src/slic3r/GUI/Tab.cpp:1081 src/slic3r/GUI/Tab.cpp:1082 +#: src/libslic3r/PrintConfig.cpp:193 src/libslic3r/PrintConfig.cpp:416 +#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:777 +#: src/libslic3r/PrintConfig.cpp:791 src/libslic3r/PrintConfig.cpp:828 +#: src/libslic3r/PrintConfig.cpp:982 src/libslic3r/PrintConfig.cpp:992 +#: src/libslic3r/PrintConfig.cpp:1010 src/libslic3r/PrintConfig.cpp:1029 +#: src/libslic3r/PrintConfig.cpp:1048 src/libslic3r/PrintConfig.cpp:1738 +#: src/libslic3r/PrintConfig.cpp:1755 +msgid "Infill" +msgstr "인필(채움)" + +#: src/slic3r/GUI/ConfigManipulation.cpp:309 +msgid "Head penetration should not be greater than the head width." +msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:311 +msgid "Invalid Head penetration" +msgstr "잘못된 헤드 관통" + +#: src/slic3r/GUI/ConfigManipulation.cpp:322 +msgid "Pinhead diameter should be smaller than the pillar diameter." +msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." + +#: src/slic3r/GUI/ConfigManipulation.cpp:324 +msgid "Invalid pinhead diameter" +msgstr "잘못된 핀 헤드 지름" #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18 msgid "Upgrade" @@ -311,152 +485,165 @@ msgstr "사용자" msgid "Unknown" msgstr "알 수 없음" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:39 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 msgid "Active" msgstr "활동중" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:45 -msgid "slic3r version" -msgstr "slic3r 버전" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50 +msgid "PrusaSlicer version" +msgstr "Prusa슬라이서 버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1307 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1452 msgid "print" -msgstr "프린트" +msgstr "출력" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "filaments" msgstr "필라멘트" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:48 src/slic3r/GUI/Preset.cpp:1311 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1456 msgid "printer" msgstr "프린터" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 src/slic3r/GUI/Tab.cpp:939 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:961 msgid "vendor" msgstr "제조 회사" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 msgid "version" msgstr "버전" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 -msgid "min slic3r version" -msgstr "최소 slic3r 버전" - -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 -msgid "max slic3r version" -msgstr "최대 slic3r 버전" - #: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "min PrusaSlicer version" +msgstr "이전 slic3r 버전" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +msgid "max PrusaSlicer version" +msgstr "최신 slic3r 버전" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "model" msgstr "모델" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "variants" msgstr "변종" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 #, c-format msgid "Incompatible with this %s" -msgstr "%s 과 호환되지 않습니다" +msgstr "%s 와 호환되지 않습니다" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:73 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 msgid "Activate" msgstr "활성화" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:99 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104 msgid "Configuration Snapshots" msgstr "구성 스냅숏" -#: src/slic3r/GUI/ConfigWizard.cpp:118 +#: src/slic3r/GUI/ConfigWizard.cpp:218 msgid "nozzle" msgstr "노즐" -#: src/slic3r/GUI/ConfigWizard.cpp:122 +#: src/slic3r/GUI/ConfigWizard.cpp:222 msgid "Alternate nozzles:" msgstr "대체 노즐:" -#: src/slic3r/GUI/ConfigWizard.cpp:188 +#: src/slic3r/GUI/ConfigWizard.cpp:289 msgid "All standard" msgstr "모두 표준설정" -#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:3254 +#: src/slic3r/GUI/ConfigWizard.cpp:289 +msgid "Standard" +msgstr "표준" + +#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573 +#: src/slic3r/GUI/Tab.cpp:3144 msgid "All" msgstr "모두 선택" -#: src/slic3r/GUI/ConfigWizard.cpp:190 src/slic3r/GUI/Plater.cpp:470 -#: src/libslic3r/GCode/PreviewData.cpp:162 +#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:574 +#: src/slic3r/GUI/Plater.cpp:496 src/slic3r/GUI/Plater.cpp:636 +#: src/libslic3r/ExtrusionEntity.cpp:309 msgid "None" msgstr "없음" -#: src/slic3r/GUI/ConfigWizard.cpp:296 +#: src/slic3r/GUI/ConfigWizard.cpp:427 #, c-format msgid "Welcome to the %s Configuration Assistant" msgstr "%s 구성 도우미에 오신 것을 환영 합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:298 +#: src/slic3r/GUI/ConfigWizard.cpp:429 #, c-format msgid "Welcome to the %s Configuration Wizard" -msgstr "%s에 오신것을 환영 합니다." +msgstr "%s 구성 마법사에 오신 것을 환영 합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:300 +#: src/slic3r/GUI/ConfigWizard.cpp:431 msgid "Welcome" msgstr "환영합니다" -#: src/slic3r/GUI/ConfigWizard.cpp:304 src/slic3r/GUI/GUI_App.cpp:747 -#, c-format -msgid "Run %s" -msgstr "%s 실행" - -#: src/slic3r/GUI/ConfigWizard.cpp:306 +#: src/slic3r/GUI/ConfigWizard.cpp:433 #, 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는 초기 구성에 도움이 됩니다. 그" -"냥 몇 가지 설정 하 고 당신은 인쇄 할 준비가 될 것입니다." +"안녕하세요 ,%s에 오신 것을 환영 합니다! 이 %s는 초기 구성에 도움이 됩니다. " +"몇 가지 설정만으로 인쇄 준비가 될 것입니다." -#: src/slic3r/GUI/ConfigWizard.cpp:311 +#: src/slic3r/GUI/ConfigWizard.cpp:438 msgid "" "Remove user profiles - install from scratch (a snapshot will be taken " "beforehand)" -msgstr "사용자 프로필 제거-처음부터 설치 (스냅숏은 사전에 수행 됩니다)" +msgstr "사용자 프로필 제거 - 처음부터 설치 (스냅숏 값은 먼저 저장 됩니다.)" -#: src/slic3r/GUI/ConfigWizard.cpp:342 +#: src/slic3r/GUI/ConfigWizard.cpp:481 #, c-format msgid "%s Family" msgstr "%s의 가족들" -#: src/slic3r/GUI/ConfigWizard.cpp:379 +#: src/slic3r/GUI/ConfigWizard.cpp:565 +msgid "Vendor:" +msgstr "벤더:" + +#: src/slic3r/GUI/ConfigWizard.cpp:566 +msgid "Profile:" +msgstr "프로필:" + +#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631 +msgid "(All)" +msgstr "(모두)" + +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer Setup" msgstr "사용자 지정 프린터 설정" -#: src/slic3r/GUI/ConfigWizard.cpp:379 +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer" msgstr "사용자 정의 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:381 +#: src/slic3r/GUI/ConfigWizard.cpp:734 msgid "Define a custom printer profile" -msgstr "사용자 정의 프린터 프로필 정의" +msgstr "사용자 정의 프린터 프로필" -#: src/slic3r/GUI/ConfigWizard.cpp:383 +#: src/slic3r/GUI/ConfigWizard.cpp:736 msgid "Custom profile name:" -msgstr "사용자 지정 프로필 이름:" +msgstr "사용자 정의 프로필 명칭:" -#: src/slic3r/GUI/ConfigWizard.cpp:407 +#: src/slic3r/GUI/ConfigWizard.cpp:760 msgid "Automatic updates" msgstr "자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:407 +#: src/slic3r/GUI/ConfigWizard.cpp:760 msgid "Updates" msgstr "업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:415 src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:768 src/slic3r/GUI/Preferences.cpp:64 msgid "Check for application updates" msgstr "프로그램 업데이트 확인" -#: src/slic3r/GUI/ConfigWizard.cpp:419 +#: src/slic3r/GUI/ConfigWizard.cpp:772 #, c-format msgid "" "If enabled, %s checks for new application versions online. When a new " @@ -464,15 +651,15 @@ msgid "" "application startup (never during program usage). This is only a " "notification mechanisms, no automatic installation is done." msgstr "" -"활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수있게되" -"면 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대로 " -"사용하지 마십시오).이것은 알림 메커니즘 일뿐 자동 설치가 수행되지 않습니다." +"활성화 된 경우 %s은 온라인의 새 버전을 확인합니다. 새 버전을 사용할 수 있게 " +"되면, 다음 응용 프로그램 시작시 알림이 표시됩니다 (프로그램 사용 중에는 절대" +"로 사용하지 마십시오).이것은 단순한 알림 일뿐 자동으로 설치가 되지 않습니다." -#: src/slic3r/GUI/ConfigWizard.cpp:425 src/slic3r/GUI/Preferences.cpp:77 +#: src/slic3r/GUI/ConfigWizard.cpp:778 src/slic3r/GUI/Preferences.cpp:82 msgid "Update built-in Presets automatically" msgstr "기존의 설정 자동 업데이트" -#: src/slic3r/GUI/ConfigWizard.cpp:429 +#: src/slic3r/GUI/ConfigWizard.cpp:782 #, c-format msgid "" "If enabled, %s downloads updates of built-in system presets in the " @@ -480,74 +667,131 @@ msgid "" "When a new preset version becomes available it is offered at application " "startup." msgstr "" -"활성화 된 경우 %s은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다운로" -"드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설" -"정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." +"활성화 된 경우 %s은 백그라운드에서, 시스템 사전 설정을 다운로드합니다. 이러" +"한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사전 설정 버전을 사용" +"할 수 있게되면 응용 프로그램 시작시 제공됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:432 +#: src/slic3r/GUI/ConfigWizard.cpp:785 msgid "" "Updates are never applied without user's consent and never overwrite user's " "customized settings." msgstr "" -"업데이트는 사용자의 동의없이 적용되지 않으며 사용자의 사용자 지정된 설정을 덮" -"어 쓰지 않습니다." +"업데이트는 사용자의 동의를 받아야 하고, 지정된 이전 설정을 덮어 쓰지 않습니" +"다." -#: src/slic3r/GUI/ConfigWizard.cpp:437 +#: src/slic3r/GUI/ConfigWizard.cpp:790 msgid "" "Additionally a backup snapshot of the whole configuration is created before " "an update is applied." -msgstr "또한 업데이트가 적용되기 전에 전체 구성의 백업 스냅 샷이 생성됩니다." +msgstr "" +"또한 업데이트가 적용되기 전에 전체 구성의 백업 구성(스냅샷)이 생성됩니다." -#: src/slic3r/GUI/ConfigWizard.cpp:444 +#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1655 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3932 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3935 src/slic3r/GUI/Plater.cpp:3211 +#: src/slic3r/GUI/Plater.cpp:3946 src/slic3r/GUI/Plater.cpp:3949 +#: src/slic3r/GUI/Plater.cpp:3980 src/slic3r/GUI/Plater.cpp:3983 +msgid "Reload from disk" +msgstr "디스크에서 다시 불러오기" + +#: src/slic3r/GUI/ConfigWizard.cpp:801 +msgid "" +"Export full pathnames of models and parts sources into 3mf and amf files" +msgstr "모델 및 부품 소스의 전체 경로 이름을 3mf 및 amf 파일로 내보내기" + +#: 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 "" +"활성화된 경우 디스크에서 다시 로드 명령을 사용하여 호출될 때 파일을 자동으로 " +"찾고 로드할 수 있습니다.\n" +"활성화되지 않으면 디스크에서 다시 로드 명령에서 열린 파일 대화 상자를 사용하" +"여 각 파일을 선택하라는 요청이 표시됩니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:814 +msgid "View mode" +msgstr "방법 보기" + +#: src/slic3r/GUI/ConfigWizard.cpp:816 +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:821 +msgid "Simple mode" +msgstr "단순 모드" + +#: src/slic3r/GUI/ConfigWizard.cpp:822 +msgid "Advanced mode" +msgstr "고급 모드" + +#: src/slic3r/GUI/ConfigWizard.cpp:823 +msgid "Expert mode" +msgstr "전문가 모드" + +#: src/slic3r/GUI/ConfigWizard.cpp:857 msgid "Other Vendors" msgstr "다른 공급 업체" -#: src/slic3r/GUI/ConfigWizard.cpp:446 +#: src/slic3r/GUI/ConfigWizard.cpp:861 #, c-format -msgid "Pick another vendor supported by %s:" +msgid "Pick another vendor supported by %s" msgstr "%s가 지원하는 다른 공급 업체를 선택하십시오:" -#: src/slic3r/GUI/ConfigWizard.cpp:492 +#: src/slic3r/GUI/ConfigWizard.cpp:892 msgid "Firmware Type" -msgstr "펌웨어 타입" +msgstr "펌웨어 종류" -#: src/slic3r/GUI/ConfigWizard.cpp:492 src/slic3r/GUI/Tab.cpp:2100 +#: src/slic3r/GUI/ConfigWizard.cpp:892 src/slic3r/GUI/Tab.cpp:1931 msgid "Firmware" msgstr "펌웨어" -#: src/slic3r/GUI/ConfigWizard.cpp:496 +#: src/slic3r/GUI/ConfigWizard.cpp:896 msgid "Choose the type of firmware used by your printer." -msgstr "프린터에 패치할 펌웨어를 선택하세요." +msgstr "프린터에 업로드 할 펌웨어를 선택하세요." -#: src/slic3r/GUI/ConfigWizard.cpp:530 +#: src/slic3r/GUI/ConfigWizard.cpp:930 msgid "Bed Shape and Size" msgstr "배드 모양과 크기" -#: src/slic3r/GUI/ConfigWizard.cpp:533 +#: src/slic3r/GUI/ConfigWizard.cpp:933 msgid "Set the shape of your printer's bed." msgstr "프린터 배드모양을 설정하세요." -#: src/slic3r/GUI/ConfigWizard.cpp:553 +#: src/slic3r/GUI/ConfigWizard.cpp:953 msgid "Filament and Nozzle Diameters" msgstr "필라멘트와 노즐 크기" -#: src/slic3r/GUI/ConfigWizard.cpp:553 +#: src/slic3r/GUI/ConfigWizard.cpp:953 msgid "Print Diameters" msgstr "인쇄 직경" -#: src/slic3r/GUI/ConfigWizard.cpp:567 +#: src/slic3r/GUI/ConfigWizard.cpp:967 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "핫 엔드 노즐 직경을 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:570 +#: src/slic3r/GUI/ConfigWizard.cpp:970 msgid "Nozzle Diameter:" msgstr "노즐 직경:" -#: src/slic3r/GUI/ConfigWizard.cpp:580 +#: src/slic3r/GUI/ConfigWizard.cpp:980 msgid "Enter the diameter of your filament." msgstr "필라멘트의 직경을 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:581 +#: src/slic3r/GUI/ConfigWizard.cpp:981 msgid "" "Good precision is required, so use a caliper and do multiple measurements " "along the filament, then compute the average." @@ -555,41 +799,41 @@ msgstr "" "정밀도가 필요하므로 캘리퍼를 사용하여 필라멘트를 따라 여러 번 측정 한 다음 평" "균을 계산하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:584 +#: src/slic3r/GUI/ConfigWizard.cpp:984 msgid "Filament Diameter:" msgstr "필라멘트 직경:" -#: src/slic3r/GUI/ConfigWizard.cpp:618 +#: src/slic3r/GUI/ConfigWizard.cpp:1018 msgid "Extruder and Bed Temperatures" msgstr "익스트루더와 배드 온도" -#: src/slic3r/GUI/ConfigWizard.cpp:618 +#: src/slic3r/GUI/ConfigWizard.cpp:1018 msgid "Temperatures" msgstr "온도" -#: src/slic3r/GUI/ConfigWizard.cpp:634 +#: src/slic3r/GUI/ConfigWizard.cpp:1034 msgid "Enter the temperature needed for extruding your filament." msgstr "필라멘트 압출에 필요한 온도를 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:635 +#: src/slic3r/GUI/ConfigWizard.cpp:1035 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:638 +#: src/slic3r/GUI/ConfigWizard.cpp:1038 msgid "Extrusion Temperature:" msgstr "출력 온도 :" -#: src/slic3r/GUI/ConfigWizard.cpp:639 src/slic3r/GUI/ConfigWizard.cpp:653 +#: src/slic3r/GUI/ConfigWizard.cpp:1039 src/slic3r/GUI/ConfigWizard.cpp:1053 msgid "°C" msgstr "°C" -#: src/slic3r/GUI/ConfigWizard.cpp:648 +#: src/slic3r/GUI/ConfigWizard.cpp:1048 msgid "" "Enter the bed temperature needed for getting your filament to stick to your " "heated bed." -msgstr "필라멘트가 핫배드에 접착하는데 필요한 배드온도를 입력하십시오." +msgstr "필라멘트가 핫배드에 접착하는데 필요한 온도를 입력하십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:649 +#: src/slic3r/GUI/ConfigWizard.cpp:1049 msgid "" "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have " "no heated bed." @@ -597,81 +841,451 @@ msgstr "" "보통은 PLA의 경우 60 ° C이고 ABS의 경우 110 ° C입니다. 핫배드가 없는 경우에" "는 0으로 두십시오." -#: src/slic3r/GUI/ConfigWizard.cpp:652 +#: src/slic3r/GUI/ConfigWizard.cpp:1052 msgid "Bed Temperature:" msgstr "배드 온도 :" -#: src/slic3r/GUI/ConfigWizard.cpp:1115 +#: src/slic3r/GUI/ConfigWizard.cpp:1474 src/slic3r/GUI/ConfigWizard.cpp:2014 +msgid "Filaments" +msgstr "필라멘트" + +#: src/slic3r/GUI/ConfigWizard.cpp:1474 src/slic3r/GUI/ConfigWizard.cpp:2016 +msgid "SLA Materials" +msgstr "SLA 재료" + +#: src/slic3r/GUI/ConfigWizard.cpp:1528 +msgid "FFF Technology Printers" +msgstr "FFF 기술 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:1533 +msgid "SLA Technology Printers" +msgstr "SLA 기술 프린터" + +#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1877 +#: src/slic3r/GUI/DoubleSlider.cpp:1898 src/slic3r/GUI/GUI.cpp:240 +msgid "Notice" +msgstr "공지" + +#: src/slic3r/GUI/ConfigWizard.cpp:1760 +msgid "You have to select at least one filament for selected printers" +msgstr "선택한 프린터에 대해 필라멘트를 하나 이상 선택해야 합니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:1761 +msgid "Do you want to automatic select default filaments?" +msgstr "기본 필라멘트를 자동으로 선택하시겠습니까?" + +#: src/slic3r/GUI/ConfigWizard.cpp:1771 +msgid "You have to select at least one material for selected printers" +msgstr "선택한 프린터에 대해 하나 이상의 재질을 선택해야 합니다." + +#: src/slic3r/GUI/ConfigWizard.cpp:1772 +msgid "Do you want to automatic select default materials?" +msgstr "기본 재질을 자동으로 선택하시겠습니까?" + +#: src/slic3r/GUI/ConfigWizard.cpp:1979 msgid "Select all standard printers" msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요" -#: src/slic3r/GUI/ConfigWizard.cpp:1118 +#: src/slic3r/GUI/ConfigWizard.cpp:1982 msgid "< &Back" msgstr "< &뒤로" -#: src/slic3r/GUI/ConfigWizard.cpp:1119 +#: src/slic3r/GUI/ConfigWizard.cpp:1983 msgid "&Next >" msgstr "&다음 >" -#: src/slic3r/GUI/ConfigWizard.cpp:1120 +#: src/slic3r/GUI/ConfigWizard.cpp:1984 msgid "&Finish" msgstr "&완료" -#: src/slic3r/GUI/ConfigWizard.cpp:1121 src/slic3r/GUI/FirmwareDialog.cpp:151 -#: src/slic3r/GUI/ProgressStatusBar.cpp:27 +#: src/slic3r/GUI/ConfigWizard.cpp:1985 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 msgid "Cancel" msgstr "취소" -#: src/slic3r/GUI/ConfigWizard.cpp:1135 +#: src/slic3r/GUI/ConfigWizard.cpp:1998 msgid "Prusa FFF Technology Printers" msgstr "Prusa FFF 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:1138 +#: src/slic3r/GUI/ConfigWizard.cpp:2001 msgid "Prusa MSLA Technology Printers" msgstr "Prusa MSLA 방식 프린터" -#: src/slic3r/GUI/ConfigWizard.cpp:1207 +#: src/slic3r/GUI/ConfigWizard.cpp:2014 +msgid "Filament Profiles Selection" +msgstr "필라멘트 프로파일 선택" + +#: src/slic3r/GUI/ConfigWizard.cpp:2014 src/slic3r/GUI/GUI_ObjectList.cpp:3528 +msgid "Type:" +msgstr "형식:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2016 +msgid "SLA Material Profiles Selection" +msgstr "SLA 재질 프로파일 선택" + +#: src/slic3r/GUI/ConfigWizard.cpp:2016 +msgid "Layer height:" +msgstr "레이어 높이:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2112 msgid "Configuration Assistant" msgstr "구성 도우미" -#: src/slic3r/GUI/ConfigWizard.cpp:1208 +#: src/slic3r/GUI/ConfigWizard.cpp:2113 msgid "Configuration &Assistant" msgstr "구성 & 도우미" -#: src/slic3r/GUI/ConfigWizard.cpp:1210 +#: src/slic3r/GUI/ConfigWizard.cpp:2115 msgid "Configuration Wizard" msgstr "구성 마법사" -#: src/slic3r/GUI/ConfigWizard.cpp:1211 +#: src/slic3r/GUI/ConfigWizard.cpp:2116 msgid "Configuration &Wizard" msgstr "구성 & 마법사" -#: src/slic3r/GUI/Field.cpp:125 +#: src/slic3r/GUI/DoubleSlider.cpp:79 +msgid "Place bearings in slots and resume" +msgstr "슬롯에 베어링을 배치하고 다시 시작" + +#: src/slic3r/GUI/DoubleSlider.cpp:923 +msgid "One layer mode" +msgstr "하나의 레이어 모드" + +#: src/slic3r/GUI/DoubleSlider.cpp:925 +msgid "Discard all custom changes" +msgstr "모든 사용자 지정 변경 내용 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:928 +msgid "For jump to print Z use left mouse button click OR (Shift+G)" +msgstr "Z를 인쇄하는 점프를 위해 왼쪽 마우스 버튼을 클릭 (Shift +G)" + +#: src/slic3r/GUI/DoubleSlider.cpp:929 +msgid "For set extruder sequence for whole print use right mouse button click" +msgstr "전체 인쇄 용 돌출부 시퀀스 설정용 마우스 버튼 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:930 src/slic3r/GUI/DoubleSlider.cpp:1495 +msgid "Jump to print Z" +msgstr "Z 인쇄로 이동" + +#: src/slic3r/GUI/DoubleSlider.cpp:933 +msgid "For edit current color use right mouse button click on colored band" +msgstr "현재 색상 사용 오른쪽 마우스 버튼을 편집하려면 컬러 밴드를 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:941 +msgid "Slider(print) mode" +msgstr "슬라이더(인쇄) 모드" + +#: src/slic3r/GUI/DoubleSlider.cpp:955 +msgid "For add change extruder use left mouse button click" +msgstr "추가 변경 압출기 사용 왼쪽 마우스 단추 단추를 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:957 +msgid "" +"For add color change use left mouse button click if you want to use colors " +"from default color list, or Shift + left mouse button click if you want to " +"select a color" +msgstr "" +"색상 변경 추가하려면 기본 색상 목록에서 색상을 사용하려는 경우 왼쪽 마우스 버" +"튼을 클릭하거나 색상을 선택하려면 Shift + 왼쪽 마우스 버튼을 클릭하십시오." + +#: src/slic3r/GUI/DoubleSlider.cpp:960 +msgid "For add color change use left mouse button click" +msgstr "색상 변경 추가하려면 왼쪽 마우스 버튼을 클릭하십시오." + +#: src/slic3r/GUI/DoubleSlider.cpp:961 +msgid "OR pres \"+\" key" +msgstr "" + +#: src/slic3r/GUI/DoubleSlider.cpp:963 +msgid "For add another code use Ctrl + left mouse button click" +msgstr "다른 코드를 추가하려면 Ctrl + 왼쪽 마우스 버튼을 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:964 +msgid "For add another code use right mouse button click" +msgstr "다른 코드를 추가하려면 오른쪽 마우스 버튼을 클릭하십시오." + +#: src/slic3r/GUI/DoubleSlider.cpp:973 +msgid "Color change (\"%1%\")" +msgstr "색상 변경(\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:974 +msgid "Color change (\"%1%\") for Extruder %2%" +msgstr "압출기 %2%의 색상 변경(\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:977 +msgid "Pause print (\"%1%\")" +msgstr "일시 중지 인쇄(\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:979 +msgid "Extruder(tool) is changed to Extruder \"%1%\"" +msgstr "압출기(도구)가 압출기 \"%1%\"로 변경됩니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:980 +msgid "\"%1%\"" +msgstr "\"%1%\"" + +#: src/slic3r/GUI/DoubleSlider.cpp:986 +msgid "Note" +msgstr "메모" + +#: src/slic3r/GUI/DoubleSlider.cpp:988 +msgid "" +"G-code of this tick has a conflict with slider(print) mode.\n" +"Any its editing will cause a changes of DoubleSlider data." +msgstr "" +"이 틱의 G 코드는 슬라이더(인쇄) 모드와 충돌합니다.\n" +"편집하면 두개의 슬라이더 데이터가 변경됩니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:991 +msgid "" +"There is a color change for extruder that wouldn't be used till the end of " +"printing.\n" +"This code wouldn't be processed during GCode generation." +msgstr "" +"인쇄가 끝날 때까지 사용되지 않는 압출기의 색상 변경이 있습니다.\n" +"이 코드는 GCode 생성 중에 처리되지 않습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:994 +msgid "" +"There is a extruder change to the same extruder.\n" +"This code wouldn't be processed during GCode generation." +msgstr "" +"동일한 압출기로 돌출기 변경이 있습니다.\n" +"이 코드는 GCode 생성 중에 처리되지 않습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:997 +msgid "" +"There is a color change for extruder that has not been used before.\n" +"Check your choice to avoid redundant color changes." +msgstr "" +"이전에 사용되지 않은 압출기의 색상 변경이 있습니다.\n" +"중복 색상 변경을 방지하려면 선택 사항을 확인하십시오." + +#: src/slic3r/GUI/DoubleSlider.cpp:1002 +msgid "For Delete tick use left mouse button click OR pres \"-\" key" +msgstr "삭제 진드기 사용 왼쪽 마우스 버튼 클릭 또는 \"-\" 키를 pres" + +#: src/slic3r/GUI/DoubleSlider.cpp:1004 +msgid "For Edit tick use Ctrl + Left mouse button click" +msgstr "편집 진드기 사용 Ctrl + 왼쪽 마우스 버튼을 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:1005 +msgid "For Edit tick use right mouse button click" +msgstr "편집 사용 오른쪽 마우스 버튼을 클릭" + +#: src/slic3r/GUI/DoubleSlider.cpp:1099 src/slic3r/GUI/DoubleSlider.cpp:1135 +#: src/slic3r/GUI/GLCanvas3D.cpp:982 src/slic3r/GUI/Tab.cpp:2302 +#: src/libslic3r/GCode/PreviewData.cpp:445 +#, c-format +msgid "Extruder %d" +msgstr "익스트루더 %d" + +#: src/slic3r/GUI/DoubleSlider.cpp:1100 +msgid "active" +msgstr "활성" + +#: src/slic3r/GUI/DoubleSlider.cpp:1109 +msgid "Switch code to Change extruder" +msgstr "코드 전환- 압출기 변경" + +#: src/slic3r/GUI/DoubleSlider.cpp:1109 src/slic3r/GUI/GUI_ObjectList.cpp:1666 +msgid "Change extruder" +msgstr "압출기(익스트루더) 변경" + +#: src/slic3r/GUI/DoubleSlider.cpp:1110 +msgid "Change extruder (N/A)" +msgstr "돌출자 변경(N/A)" + +#: src/slic3r/GUI/DoubleSlider.cpp:1112 +msgid "Use another extruder" +msgstr "다른 압출기 사용" + +#: src/slic3r/GUI/DoubleSlider.cpp:1136 +msgid "used" +msgstr "사용됨" + +#: src/slic3r/GUI/DoubleSlider.cpp:1144 +msgid "Switch code to Color change (%1%) for:" +msgstr "코드 에서 색상 변경(%1%) 에 대 한:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1145 +msgid "Add color change (%1%) for:" +msgstr "색상 변경 추가(%1%) 에 대 한:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1443 +msgid "Add color change" +msgstr "색상 변경 추가" + +#: src/slic3r/GUI/DoubleSlider.cpp:1453 +msgid "Add pause print" +msgstr "일시 정지 인쇄 추가" + +#: src/slic3r/GUI/DoubleSlider.cpp:1456 +msgid "Add custom G-code" +msgstr "사용자 지정 G 코드 추가" + +#: src/slic3r/GUI/DoubleSlider.cpp:1474 +msgid "Edit color" +msgstr "색상 편집" + +#: src/slic3r/GUI/DoubleSlider.cpp:1475 +msgid "Edit pause print message" +msgstr "일시 정지 인쇄 메시지 편집" + +#: src/slic3r/GUI/DoubleSlider.cpp:1476 +msgid "Edit custom G-code" +msgstr "사용자 지정 G 코드 편집" + +#: src/slic3r/GUI/DoubleSlider.cpp:1482 +msgid "Delete color change" +msgstr "색상 변경 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:1483 +msgid "Delete tool change" +msgstr "도구 변경 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:1484 +msgid "Delete pause print" +msgstr "일시 정지 인쇄 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:1485 +msgid "Delete custom G-code" +msgstr "사용자 지정 G 코드 삭제" + +#: src/slic3r/GUI/DoubleSlider.cpp:1498 +msgid "Set extruder sequence for whole print" +msgstr "전체 인쇄를 위한 압출기 시퀀스 설정" + +#: src/slic3r/GUI/DoubleSlider.cpp:1584 +msgid "Enter custom G-code used on current layer" +msgstr "현재 레이어에 사용되는 사용자 지정 G 코드를 입력합니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1585 +msgid "Custom Gcode on current layer (%1% mm)." +msgstr "현재 레이어에 사용자 지정 Gcode(%1% mm)." + +#: src/slic3r/GUI/DoubleSlider.cpp:1600 +msgid "Enter short message shown on Printer display during pause print" +msgstr "" +"일시 정지시 인쇄 중에 프린터 디스플레이에 표시된 짧은 메시지를 입력합니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1601 +msgid "Message for pause print on current layer (%1% mm)." +msgstr "현재 레이어에서 일시 중지 인쇄를 위한 메시지(%1% mm)." + +#: src/slic3r/GUI/DoubleSlider.cpp:1616 +msgid "Enter print z value to jump to" +msgstr "인쇄 z 값을 입력하여" + +#: src/slic3r/GUI/DoubleSlider.cpp:1617 +msgid "Jump to print z" +msgstr "Z 인쇄로 이동" + +#: src/slic3r/GUI/DoubleSlider.cpp:1871 +msgid "" +"The last color change data was saved for a single extruder printer profile." +msgstr "" +"단일 압출기 프린터 프로파일에 대해 마지막 색상 변경 데이터가 저장되었습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1872 +msgid "" +"The last color change data was saved for a multiple extruder printer profile." +msgstr "" +"여러 압출기 프린터 프로파일에 대해 마지막 색상 변경 데이터가 저장되었습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1874 +msgid "Your current changes will cause a deletion of all saved color changes." +msgstr "현재 변경으로 인해 저장된 모든 색상 변경 내용이 삭제됩니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1875 src/slic3r/GUI/DoubleSlider.cpp:1896 +msgid "Are you sure you want to continue?" +msgstr "정말 계속하기를 원하십니까?" + +#: src/slic3r/GUI/DoubleSlider.cpp:1888 +msgid "The last color change data was saved for a multi extruder printing." +msgstr "다중 압출기 인쇄를 위해 마지막 색상 변경 데이터가 저장되었습니다." + +#: src/slic3r/GUI/DoubleSlider.cpp:1889 +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 for do nothing" +msgstr "" +"저장된 도구 변경 내용을 모두 삭제하려면 YES를 선택합니다.\n" +"아니오 모든 도구 변경 이 색상 변경으로 전환하려면\n" +"또는 아무것도 하지 않는 취소" + +#: src/slic3r/GUI/DoubleSlider.cpp:1892 +msgid "Do you want to delete all saved tool changes?" +msgstr "저장된 도구 변경 내용을 모두 삭제하시겠습니까?" + +#: src/slic3r/GUI/DoubleSlider.cpp:1894 +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:1895 +msgid "Your current changes will cause a deletion of all saved tool changes." +msgstr "현재 변경 으로 인해 저장된 모든 도구 변경 내용이 삭제됩니다." + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 +msgid "Set extruder sequence" +msgstr "압출기 시퀀스 설정" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +msgid "Set extruder change for every" +msgstr "모든 압출기 변경 설정" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52 +#: src/libslic3r/PrintConfig.cpp:352 src/libslic3r/PrintConfig.cpp:995 +#: src/libslic3r/PrintConfig.cpp:1514 src/libslic3r/PrintConfig.cpp:1699 +#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1940 +#: src/libslic3r/PrintConfig.cpp:1986 +msgid "layers" +msgstr "레이어" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "돌출기(도구) 시퀀스 설정" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182 +msgid "Remove extruder from sequence" +msgstr "시퀀스에서 압출기 제거" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 +msgid "Add extruder to sequence" +msgstr "시퀀스에 압출기 추가" + +#: src/slic3r/GUI/Field.cpp:131 msgid "default value" msgstr "기본값" -#: src/slic3r/GUI/Field.cpp:128 +#: src/slic3r/GUI/Field.cpp:134 msgid "parameter name" msgstr "매개 변수 명칭" -#: src/slic3r/GUI/Field.cpp:139 +#: src/slic3r/GUI/Field.cpp:145 src/slic3r/GUI/OptionsGroup.cpp:570 msgid "N/A" msgstr "N/A" -#: src/slic3r/GUI/Field.cpp:158 +#: src/slic3r/GUI/Field.cpp:170 #, c-format msgid "%s doesn't support percentage" msgstr "%s 이(가) 백분율을 지원하지 않음" -#: src/slic3r/GUI/Field.cpp:174 src/slic3r/GUI/Field.cpp:197 +#: src/slic3r/GUI/Field.cpp:190 src/slic3r/GUI/Field.cpp:221 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376 msgid "Invalid numeric input." msgstr "숫자 입력이 잘못 되었습니다." -#: src/slic3r/GUI/Field.cpp:179 +#: src/slic3r/GUI/Field.cpp:199 msgid "Input value is out of range" -msgstr "Input value is out of range" +msgstr "입력 값이 범위를 벗어났습니다." -#: src/slic3r/GUI/Field.cpp:206 +#: src/slic3r/GUI/Field.cpp:235 #, c-format msgid "" "Do you mean %s%% instead of %s %s?\n" @@ -680,9 +1294,9 @@ msgid "" msgstr "" "%s %s 대신 %s%%을 하려고 합니까?\n" "이 값을 %s%%, 로 변경하려면 YES를 선택하십시오. \n" -"또는 %s %s 이(가) 올바른 값인지 확인하는 경우 NO를 선택하세요. " +"또는 %s %s 이(가) 올바른 값인지 확인하는 경우 NO를 선택하세요." -#: src/slic3r/GUI/Field.cpp:209 +#: src/slic3r/GUI/Field.cpp:238 msgid "Parameter validation" msgstr "매개 변수 유효성 검사" @@ -731,8 +1345,7 @@ msgstr "" #, c-format msgid "" "Multiple %s devices found. Please only connect one at a time for flashing." -msgstr "" -"여러 %s 장치를 찾았습니다. 깜박이는 경우에는 한 번에 하나씩만 연결 하십시오." +msgstr "여러 %s 장치를 찾았습니다. 깜박이면 한 번에 하나씩만 연결하십시오." #: src/slic3r/GUI/FirmwareDialog.cpp:436 #, c-format @@ -741,8 +1354,8 @@ msgid "" "If the device is connected, please press the Reset button next to the USB " "connector ..." msgstr "" -"%s 장치를 찾을 하지 않았습니다.\n" -"장치가 연결 된 경우 USB 커넥터 옆에 있는 리셋 단추를 누르십시오." +"%s 장치를 찾을 수 없습니다.\n" +"장치가 연결되어 있는 경우 USB 커넥터 옆에 있는 리셋 버튼을 누르십시오..." #: src/slic3r/GUI/FirmwareDialog.cpp:548 #, c-format @@ -767,8 +1380,8 @@ msgstr "펌웨어 업로드" msgid "Firmware image:" msgstr "펌웨어 이미지:" -#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1824 -#: src/slic3r/GUI/Tab.cpp:1880 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1649 +#: src/slic3r/GUI/Tab.cpp:1705 msgid "Browse" msgstr "검색" @@ -801,11 +1414,12 @@ msgid "Advanced: Output log" msgstr "고급: 출력 로그" #: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/Mouse3DController.cpp:387 #: src/slic3r/GUI/PrintHostDialogs.cpp:161 msgid "Close" msgstr "닫기" -#: src/slic3r/GUI/FirmwareDialog.cpp:903 +#: 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!" @@ -813,147 +1427,317 @@ msgstr "" "새펌웨어 적용을 취소하시겠습니까?\n" "프린터가 사용할 수 없는 상태가 될 수 있습니다!" -#: src/slic3r/GUI/FirmwareDialog.cpp:904 +#: src/slic3r/GUI/FirmwareDialog.cpp:903 msgid "Confirmation" msgstr "확인" -#: src/slic3r/GUI/FirmwareDialog.cpp:907 +#: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." msgstr "취소 중...." -#: src/slic3r/GUI/GLCanvas3D.cpp:526 -msgid "Layers heights" -msgstr "레이어 높이" +#: src/slic3r/GUI/GLCanvas3D.cpp:239 src/slic3r/GUI/GLCanvas3D.cpp:4622 +msgid "Variable layer height" +msgstr "가변 레이어 높이" -#: src/slic3r/GUI/GLCanvas3D.cpp:623 +#: src/slic3r/GUI/GLCanvas3D.cpp:242 +msgid "Left mouse button:" +msgstr "왼쪽 마우스 단추:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:245 +msgid "Add detail" +msgstr "디테일 추가" + +#: src/slic3r/GUI/GLCanvas3D.cpp:248 +msgid "Right mouse button:" +msgstr "오른쪽 마우스 버튼:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:251 +msgid "Remove detail" +msgstr "디테일 제거" + +#: src/slic3r/GUI/GLCanvas3D.cpp:254 +msgid "Shift + Left mouse button:" +msgstr "시프트 + 왼쪽 마우스 버튼:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:257 +msgid "Reset to base" +msgstr "기본으로 재설정" + +#: src/slic3r/GUI/GLCanvas3D.cpp:260 +msgid "Shift + Right mouse button:" +msgstr "시프트 + 오른쪽 마우스 버튼:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:263 +msgid "Smoothing" +msgstr "부드럽게" + +#: src/slic3r/GUI/GLCanvas3D.cpp:266 +msgid "Mouse wheel:" +msgstr "마우스 휠: " + +#: src/slic3r/GUI/GLCanvas3D.cpp:269 +msgid "Increase/decrease edit area" +msgstr "편집 영역 증가/감소" + +#: src/slic3r/GUI/GLCanvas3D.cpp:272 +msgid "Adaptive" +msgstr "어뎁티브" + +#: src/slic3r/GUI/GLCanvas3D.cpp:278 +msgid "Quality / Speed" +msgstr "품질 / 속도" + +#: src/slic3r/GUI/GLCanvas3D.cpp:282 +msgid "Higher print quality versus higher print speed." +msgstr "인쇄 품질이 높고 인쇄 속도가 빨라질 수 있습니다." + +#: src/slic3r/GUI/GLCanvas3D.cpp:293 +msgid "Smooth" +msgstr "부드럽게" + +#: src/slic3r/GUI/GLCanvas3D.cpp:299 src/libslic3r/PrintConfig.cpp:511 +msgid "Radius" +msgstr " 반지름" + +#: src/slic3r/GUI/GLCanvas3D.cpp:309 +msgid "Keep min" +msgstr "최소 유지" + +#: src/slic3r/GUI/GLCanvas3D.cpp:318 +msgid "Reset" +msgstr "초기화" + +#: src/slic3r/GUI/GLCanvas3D.cpp:604 +msgid "Variable layer height - Manual edit" +msgstr "가변 레이어 높이 - 수동 편집" + +#: src/slic3r/GUI/GLCanvas3D.cpp:690 msgid "An object outside the print area was detected" -msgstr "인쇄 영역 밖에 있는 개체가 감지 되었습니다" +msgstr "인쇄 영역 밖에 있는 객체(object)가 감지 되었습니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:624 +#: src/slic3r/GUI/GLCanvas3D.cpp:691 msgid "A toolpath outside the print area was detected" msgstr "인쇄 영역 밖에 있는 공구 경로가 감지 되었습니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:625 +#: src/slic3r/GUI/GLCanvas3D.cpp:692 msgid "SLA supports outside the print area were detected" -msgstr "인쇄 영역 외부의 SLA 지원 감지 됨" +msgstr "인쇄 영역 외부의 SLA 서포트가 감지 됨" -#: src/slic3r/GUI/GLCanvas3D.cpp:626 -msgid "Some objects are not visible when editing supports" -msgstr "편집 지원 시 일부 객체가 표시 되지 않음" +#: src/slic3r/GUI/GLCanvas3D.cpp:693 +msgid "Some objects are not visible" +msgstr "일부 개체가 표시되지 않습니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:628 +#: src/slic3r/GUI/GLCanvas3D.cpp:695 msgid "" "An object outside the print area was detected\n" "Resolve the current problem to continue slicing" msgstr "" -"인쇄 영역 밖에 있는 개체가 감지 되었습니다.\n" -"현재 문제를 해결 하여 슬라이싱을 계속 합니다" +"인쇄 영역 밖에 있는 객체(object)가 감지 되었습니다.\n" +"현재 문제를 해결하고 슬라이싱을 계속 합니다" -#: src/slic3r/GUI/GLCanvas3D.cpp:1711 +#: src/slic3r/GUI/GLCanvas3D.cpp:909 src/slic3r/GUI/GLCanvas3D.cpp:938 +msgid "Default print color" +msgstr "기본 인쇄 색상" + +#: src/slic3r/GUI/GLCanvas3D.cpp:939 src/slic3r/GUI/GLCanvas3D.cpp:948 +#: src/slic3r/GUI/GLCanvas3D.cpp:987 +msgid "Pause print or custom G-code" +msgstr "인쇄 또는 사용자 지정 G-코드 일시 중지" + +#: src/slic3r/GUI/GLCanvas3D.cpp:960 +#, c-format +msgid "up to %.2f mm" +msgstr "최대%.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:964 +#, c-format +msgid "above %.2f mm" +msgstr "above %.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:968 +#, 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 "압출기 %d의 색상 변화 %.2f mm" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1306 +msgid "Seq." +msgstr "순서" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1705 +msgid "Variable layer height - Reset" +msgstr "가변 레이어 높이 - 재설정" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1713 +msgid "Variable layer height - Adaptive" +msgstr "가변 레이어 높이 - 어뎁티브" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1721 +msgid "Variable layer height - Smooth all" +msgstr "가변 레이어 높이 - 모두 부드럽게" + +#: src/slic3r/GUI/GLCanvas3D.cpp:2075 msgid "Mirror Object" -msgstr "오브젝트 미러" +msgstr "객체(object) 반전" -#: src/slic3r/GUI/GLCanvas3D.cpp:2872 +#: src/slic3r/GUI/GLCanvas3D.cpp:2945 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:571 +msgid "Gizmo-Move" +msgstr "개체(Gizmo) 이동" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3025 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:573 +msgid "Gizmo-Rotate" +msgstr "개체(Gizmo) 회전" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3538 msgid "Move Object" -msgstr "오브젝트 이동" +msgstr "객체(object) 이동" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3609 -#: src/slic3r/GUI/MainFrame.cpp:559 -msgid "Undo" -msgstr "실행 취소" +#: src/slic3r/GUI/GLCanvas3D.cpp:4085 +msgid "Undo History" +msgstr "실행취소 기록" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3639 -#: src/slic3r/GUI/MainFrame.cpp:562 -msgid "Redo" -msgstr "다시 실행" +#: src/slic3r/GUI/GLCanvas3D.cpp:4085 +msgid "Redo History" +msgstr "다시 실행 히스토리" -#: src/slic3r/GUI/GLCanvas3D.cpp:3395 +#: src/slic3r/GUI/GLCanvas3D.cpp:4103 #, c-format -msgid "%s Stack" -msgstr "%s 스택" +msgid "Undo %1$d Action" +msgid_plural "Undo %1$d Actions" +msgstr[0] "실행 취소 %1$d 작업" -#: src/slic3r/GUI/GLCanvas3D.cpp:3413 +#: src/slic3r/GUI/GLCanvas3D.cpp:4103 #, c-format -msgid "%s %d Action" -msgstr "%s %d 액션" +msgid "Redo %1$d Action" +msgid_plural "Redo %1$d Actions" +msgstr[0] "작업 %1$d 다시 실행" -#: src/slic3r/GUI/GLCanvas3D.cpp:3460 +#: src/slic3r/GUI/GLCanvas3D.cpp:4516 msgid "Add..." msgstr "추가..." -#: src/slic3r/GUI/GLCanvas3D.cpp:3468 src/slic3r/GUI/GUI_ObjectList.cpp:1434 -#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Plater.cpp:3486 -#: src/slic3r/GUI/Tab.cpp:3204 +#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/GUI_ObjectList.cpp:1697 +#: src/slic3r/GUI/Plater.cpp:3942 src/slic3r/GUI/Plater.cpp:3969 +#: src/slic3r/GUI/Tab.cpp:3094 msgid "Delete" msgstr "지우기 " -#: src/slic3r/GUI/GLCanvas3D.cpp:3477 src/slic3r/GUI/Plater.cpp:4075 +#: src/slic3r/GUI/GLCanvas3D.cpp:4533 src/slic3r/GUI/Plater.cpp:4693 msgid "Delete all" msgstr "전부 지우기" -#: src/slic3r/GUI/GLCanvas3D.cpp:3486 src/slic3r/GUI/KBShortcutsDialog.cpp:134 -#: src/slic3r/GUI/Plater.cpp:2636 +#: src/slic3r/GUI/GLCanvas3D.cpp:4542 src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/Plater.cpp:2740 msgid "Arrange" msgstr "정렬" -#: src/slic3r/GUI/GLCanvas3D.cpp:3486 +#: src/slic3r/GUI/GLCanvas3D.cpp:4542 src/slic3r/GUI/KBShortcutsDialog.cpp:138 msgid "Arrange selection" msgstr "선택 정렬" -#: src/slic3r/GUI/GLCanvas3D.cpp:3498 +#: src/slic3r/GUI/GLCanvas3D.cpp:4554 msgid "Copy" msgstr "복사" -#: src/slic3r/GUI/GLCanvas3D.cpp:3507 +#: src/slic3r/GUI/GLCanvas3D.cpp:4563 msgid "Paste" msgstr "붙여넣기" -#: src/slic3r/GUI/GLCanvas3D.cpp:3519 +#: src/slic3r/GUI/GLCanvas3D.cpp:4575 src/slic3r/GUI/Plater.cpp:3799 +#: src/slic3r/GUI/Plater.cpp:3811 src/slic3r/GUI/Plater.cpp:3956 msgid "Add instance" msgstr "복제본 추가" -#: src/slic3r/GUI/GLCanvas3D.cpp:3530 +#: src/slic3r/GUI/GLCanvas3D.cpp:4586 src/slic3r/GUI/Plater.cpp:3958 msgid "Remove instance" msgstr "복제본 제거" -#: src/slic3r/GUI/GLCanvas3D.cpp:3543 +#: src/slic3r/GUI/GLCanvas3D.cpp:4599 msgid "Split to objects" -msgstr "객체로 분할" +msgstr "객체(object)별 분할" -#: src/slic3r/GUI/GLCanvas3D.cpp:3553 src/slic3r/GUI/GUI_ObjectList.cpp:1280 +#: src/slic3r/GUI/GLCanvas3D.cpp:4609 src/slic3r/GUI/GUI_ObjectList.cpp:1485 msgid "Split to parts" -msgstr "파트로 분할" +msgstr "부품(Part)별 분할" -#: src/slic3r/GUI/GLCanvas3D.cpp:3566 -msgid "Layers editing" -msgstr "레이어층을 편집" +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 src/slic3r/GUI/MainFrame.cpp:581 +msgid "Undo" +msgstr "되돌리기" -#: src/slic3r/GUI/GLCanvas3D.cpp:5623 +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 src/slic3r/GUI/GLCanvas3D.cpp:4706 +msgid "Click right mouse button to open History" +msgstr "마우스 오른쪽 버튼을 클릭하여 기록을 엽니다." + +#: src/slic3r/GUI/GLCanvas3D.cpp:4690 +msgid "Next Undo action: %1%" +msgstr "다음 작업 실행 취소 : %1%" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4706 src/slic3r/GUI/MainFrame.cpp:584 +msgid "Redo" +msgstr "다시실행" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4722 +msgid "Next Redo action: %1%" +msgstr "다음 작업 다시 실행: %1%" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6659 msgid "Selection-Add from rectangle" -msgstr "사각형에서 선택-추가" +msgstr "선택-사각형에서 추가" -#: src/slic3r/GUI/GLCanvas3D.cpp:5642 +#: src/slic3r/GUI/GLCanvas3D.cpp:6678 msgid "Selection-Remove from rectangle" msgstr "선택- 사각형에서 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:40 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3176 +#: 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 제대로 실행하려면 OpenGL 2.0 가능한 그래픽 드라이버가 필요합니" +"다. \n" +"OpenGL 버전 %s, 렌더링 %s 동안, 공급 업체 %s가 감지되었습니다." + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:287 +msgid "You may need to update your graphics card driver." +msgstr "그래픽 카드 드라이버를 업데이트해야 할 수 있습니다." + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:290 +msgid "" +"As a workaround, you may run PrusaSlicer with a software rendered 3D " +"graphics by running prusa-slicer.exe with the --sw_renderer parameter." +msgstr "" +"해결 방법으로 prusaSlicer를 \"sw_renderer 매개 변수\"로 prusa-slicer.exe를 실" +"행하여 3D 그래픽을 렌더링한 소프트웨어로 실행할 수 있습니다." + +#: src/slic3r/GUI/GLCanvas3DManager.cpp:292 +msgid "Unsupported OpenGL version" +msgstr "지원되지 않는 OpenGL 버전" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3397 msgid "Cut" msgstr "자르기" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:149 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168 msgid "Keep upper part" msgstr "상위 부분 유지" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:150 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 msgid "Keep lower part" msgstr "낮은 부분 유지" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 msgid "Rotate lower part upwards" msgstr "아래쪽 부분을 위쪽으로 회전" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:154 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175 msgid "Perform cut" msgstr "절단 실행" @@ -961,906 +1745,1069 @@ msgstr "절단 실행" msgid "Place on face" msgstr "면 배치 " +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +msgid "Hollow this object" +msgstr "이 개체를 비우기" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Preview hollowed and drilled model" +msgstr "공동화된 모델 미리보기" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +msgid "Offset" +msgstr "오프셋" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +msgid "Quality" +msgstr "품질" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +msgid "Closing distance" +msgstr "닫힘 거리" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +msgid "Hole diameter" +msgstr "구멍 직경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Hole depth" +msgstr "구멍 깊이" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +msgid "Remove selected holes" +msgstr "선택한 구멍 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +msgid "Remove all holes" +msgstr "모든 구멍 제거" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 +msgid "Clipping of view" +msgstr "갈무리된것 보기" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 +msgid "Reset direction" +msgstr "방향 재설정" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52 +msgid "Show supports" +msgstr "서포트 표시" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:413 +msgid "Add drainage hole" +msgstr "배수 구멍 추가" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:530 +msgid "Delete drainage hole" +msgstr "배수 구멍 삭제" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:786 +msgid "Hollowing parameter change" +msgstr "공동화 변수 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:858 +msgid "Change drainage hole diameter" +msgstr "배수 구멍 직경 변경" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:948 +msgid "Hollowing and drilling" +msgstr "공동화 및 드릴링" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1027 +msgid "Move drainage hole" +msgstr "구멍 이동" + #: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 msgid "Move" msgstr "이동" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Position (mm)" -msgstr "위치 (mm)" - -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Displacement (mm)" -msgstr "변위 (mm)" - #: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:466 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:485 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:503 -#: src/libslic3r/PrintConfig.cpp:3225 +#: 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:3446 msgid "Rotate" msgstr "회전" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:482 -msgid "Rotation (deg)" -msgstr "회전 (°)" - #: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:390 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:504 -#: src/libslic3r/PrintConfig.cpp:3240 +#: 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:3461 msgid "Scale" msgstr "크기" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:292 -msgid "Scale (%)" -msgstr "스케일 (%)" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:44 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 msgid "Head diameter" msgstr "헤드 지름" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:45 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 msgid "Lock supports under new islands" -msgstr "새 고립 영역에서 잠금 지원" +msgstr "새영역에서 서포트 잠금 지원" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:46 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1427 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1350 msgid "Remove selected points" -msgstr "선택한 점 제거" +msgstr "선택한 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 msgid "Remove all points" -msgstr "모든 점 제거" +msgstr "모든 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1430 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353 msgid "Apply changes" msgstr "변경 내용을 적용" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1431 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354 msgid "Discard changes" msgstr "변경사항을 취소" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 msgid "Minimal points distance" -msgstr "최소 포인트 거리" +msgstr "최소한의 지점 거리" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 -#: src/libslic3r/PrintConfig.cpp:2620 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/libslic3r/PrintConfig.cpp:2765 msgid "Support points density" -msgstr "지원 포인트 밀도" +msgstr "서포트 지점 밀도" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1433 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356 msgid "Auto-generate points" -msgstr "점 자동 생성" +msgstr "지점 자동 생성" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 msgid "Manual editing" msgstr "수동 편집" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 -msgid "Clipping of view" -msgstr "클랩핑된것 보기" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 -msgid "Reset direction" -msgstr "방향 재설정" - -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:531 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:479 msgid "Add support point" msgstr "서포트 지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:720 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:615 msgid "Delete support point" msgstr "서포트 지점 삭제" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:925 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:804 msgid "Change point head diameter" -msgstr "변경 점 헤드 지름" +msgstr "변경된 해드의 끝 점 지름" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:991 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:872 msgid "Support parameter change" msgstr "서포트 매개 변수 변경" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1099 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:978 msgid "SLA Support Points" msgstr "SLA 지원 포인트" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1138 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:999 +msgid "SLA gizmo turned on" +msgstr "SLA 개체(gizmo)이동 켜기" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1024 msgid "Do you want to save your manually edited support points?" -msgstr "수동으로 편집한 서포트 지점을 저장 하 시겠습니까?" +msgstr "수동으로 편집한 서포트 지점을 저장 하시 겠습니까?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1139 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1025 msgid "Save changes?" -msgstr "변경 사항을 저장 하 시겠습니까?" +msgstr "변경 사항을 저장 하시겠습니까?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1183 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1037 +msgid "SLA gizmo turned off" +msgstr "SLA 개체(gizmo) 이동 끄기" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1076 msgid "Move support point" -msgstr "서포트 점 이동" +msgstr "서포트 지점 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1175 msgid "Support points edit" -msgstr "서포트 포인트 편집" +msgstr "서포트 지점 편집" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1333 -msgid "" -"Autogeneration will erase all manually edited points.\n" -"\n" -"Are you sure you want to do it?\n" -msgstr "" -"자동 생성은 수동으로 편집한 모든 점을 지웁니다.\n" -"\n" -"그렇게 하시겠습니까?\n" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1247 +msgid "Autogeneration will erase all manually edited points." +msgstr "자동 생성은 수동으로 편집한 모든 점을 지웁히 지웁습니다." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1335 src/slic3r/GUI/GUI.cpp:289 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1248 +msgid "Are you sure you want to do it?" +msgstr "당신은 그것을 하시겠습니까?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1249 src/slic3r/GUI/GUI.cpp:246 +#: src/slic3r/GUI/Tab.cpp:3054 src/slic3r/GUI/WipeTowerDialog.cpp:45 +#: src/slic3r/GUI/WipeTowerDialog.cpp:366 msgid "Warning" msgstr "위험" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1338 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1252 msgid "Autogenerate support points" msgstr "서포트 자동 생성" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1390 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1313 msgid "SLA gizmo keyboard shortcuts" -msgstr "SLA 장치바로 가기" +msgstr "SLA 장치 바로 가기" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1401 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1324 msgid "Note: some shortcuts work in (non)editing mode only." msgstr "참고: 일부 단축키는 (비)편집 모드 에서만 작동 합니다." -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1419 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1422 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1342 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1346 msgid "Left click" msgstr "왼쪽 클릭" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1419 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1342 msgid "Add point" -msgstr "점 추가" +msgstr "지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1420 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1343 msgid "Right click" msgstr "오른쪽 클릭" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1420 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1343 msgid "Remove point" msgstr "복제본 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1421 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1424 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1425 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1344 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1347 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1348 msgid "Drag" msgstr "드래그" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1421 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1344 msgid "Move point" -msgstr "점 이동" +msgstr "지점 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1422 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 msgid "Add point to selection" -msgstr "선택 영역에 점 추가" +msgstr "선택 영역에 지점 추가" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1423 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1346 msgid "Remove point from selection" -msgstr "선택 영역에서 점 제거" +msgstr "선택 영역에서 지점 제거" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1424 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1347 msgid "Select by rectangle" msgstr "직사각형으로 선택" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1425 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1348 msgid "Deselect by rectangle" msgstr "사각형으로 선택 해제" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1426 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1349 msgid "Select all points" -msgstr "모든 점 선택" +msgstr "모든 지점들 선택" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1351 msgid "Mouse wheel" msgstr "마우스 휠" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1428 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1351 msgid "Move clipping plane" -msgstr "클립핑 평면 이동" +msgstr "갈무리된 평면 이동" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1429 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1352 msgid "Reset clipping plane" -msgstr "클립핑 평면 재설정" +msgstr "갈무리된 평면 재설정" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1432 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355 msgid "Switch to editing mode" msgstr "편집 모드로 전환" -#: src/slic3r/GUI/GUI.cpp:141 src/slic3r/GUI/Tab.cpp:3063 -msgid "It's impossible to print multi-part object(s) with SLA technology." -msgstr "SLA 방식을 사용 하여 멀티파트를 인쇄할 수는 없습니다." +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:498 +msgid "Gizmo-Place on Face" +msgstr "개체(Gizmo)를 배드위로" -#: src/slic3r/GUI/GUI.cpp:142 -msgid "Please check and fix your object list." -msgstr "개체 목록을 확인 하고 수정 하십시오." +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:572 +msgid "Gizmo-Scale" +msgstr "개체(Gizmo) 배율" -#: src/slic3r/GUI/GUI.cpp:143 src/slic3r/GUI/Plater.cpp:2213 -#: src/slic3r/GUI/Tab.cpp:3065 -msgid "Attention!" -msgstr "주목!" +#: 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에서 오류가 발생했습니다. 메모리 부족으로 인해 발생했을 수 있습니다. 시스템" +"에 충분한 RAM이 있다고 확신하는 경우 버그가 될 수 있으며 보고하면 기쁠 것입니" +"다.\n" +"\n" +"이제 응용 프로그램이 종료됩니다." -#: src/slic3r/GUI/GUI.cpp:283 -msgid "Notice" -msgstr "공지" +#: src/slic3r/GUI/GUI_App.cpp:141 +msgid "Fatal error" +msgstr "치명적인 오류" -#: src/slic3r/GUI/GUI_App.cpp:435 +#: src/slic3r/GUI/GUI_App.cpp:442 msgid "Changing of an application language" msgstr "응용 프로그램 언어 변경" -#: src/slic3r/GUI/GUI_App.cpp:443 src/slic3r/GUI/GUI_App.cpp:452 +#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459 msgid "Recreating" msgstr "재현" -#: src/slic3r/GUI/GUI_App.cpp:456 +#: src/slic3r/GUI/GUI_App.cpp:466 msgid "Loading of current presets" -msgstr "현재 프리셋 불러오기" +msgstr "현재 기본 설정을 불러오기" -#: src/slic3r/GUI/GUI_App.cpp:464 +#: src/slic3r/GUI/GUI_App.cpp:474 msgid "Loading of a mode view" -msgstr "모드 보기 로드" +msgstr "보기 모드를 불러오기" -#: src/slic3r/GUI/GUI_App.cpp:544 +#: src/slic3r/GUI/GUI_App.cpp:555 msgid "Choose one file (3MF/AMF):" msgstr "파일(3MF/AMF) 선택:" -#: src/slic3r/GUI/GUI_App.cpp:556 +#: src/slic3r/GUI/GUI_App.cpp:567 msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" msgstr "파일을 선택하세요 (STL/OBJ/AMF/3MF/PRUSA):" -#: src/slic3r/GUI/GUI_App.cpp:598 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Select the language" msgstr "언어를 선택" -#: src/slic3r/GUI/GUI_App.cpp:599 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Language" msgstr "언어" -#: src/slic3r/GUI/GUI_App.cpp:750 -msgid "&Configuration Snapshots" -msgstr "구성 스냅숏" +#: src/slic3r/GUI/GUI_App.cpp:797 +#, c-format +msgid "Run %s" +msgstr "%s 실행" -#: src/slic3r/GUI/GUI_App.cpp:750 +#: src/slic3r/GUI/GUI_App.cpp:800 +msgid "&Configuration Snapshots" +msgstr "구성 스냅샷" + +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "Inspect / activate configuration snapshots" msgstr "구성 스냅 샷 검사 / 활성화" -#: src/slic3r/GUI/GUI_App.cpp:751 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Take Configuration &Snapshot" msgstr "구성 스냅 샷 가져 오기" -#: src/slic3r/GUI/GUI_App.cpp:751 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Capture a configuration snapshot" msgstr "구성 스냅 샷 캡처" -#: src/slic3r/GUI/GUI_App.cpp:754 +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for updates" +msgstr "업데이트 확인" + +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for configuration updates" +msgstr "구성 업데이트 확인" + +#: src/slic3r/GUI/GUI_App.cpp:804 msgid "&Preferences" msgstr "환경 설정" -#: src/slic3r/GUI/GUI_App.cpp:760 +#: src/slic3r/GUI/GUI_App.cpp:810 msgid "Application preferences" msgstr "응용 프로그램 환경 설정" -#: src/slic3r/GUI/GUI_App.cpp:763 src/slic3r/GUI/wxExtensions.cpp:2882 +#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:730 msgid "Simple" msgstr "단순" -#: src/slic3r/GUI/GUI_App.cpp:763 +#: src/slic3r/GUI/GUI_App.cpp:813 msgid "Simple View Mode" -msgstr "단순 보기 모드" +msgstr "기본 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:764 src/slic3r/GUI/GUI_ObjectList.cpp:93 -#: src/slic3r/GUI/GUI_ObjectList.cpp:567 src/slic3r/GUI/Tab.cpp:1037 -#: src/slic3r/GUI/Tab.cpp:1052 src/slic3r/GUI/Tab.cpp:1150 -#: src/slic3r/GUI/Tab.cpp:1153 src/slic3r/GUI/Tab.cpp:1649 -#: src/slic3r/GUI/Tab.cpp:2120 src/slic3r/GUI/Tab.cpp:3699 -#: src/slic3r/GUI/wxExtensions.cpp:2883 src/libslic3r/PrintConfig.cpp:83 -#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:360 -#: src/libslic3r/PrintConfig.cpp:1013 src/libslic3r/PrintConfig.cpp:2226 +#: src/slic3r/GUI/GUI_App.cpp:814 src/slic3r/GUI/GUI_ObjectList.cpp:102 +#: src/slic3r/GUI/GUI_ObjectList.cpp:620 src/slic3r/GUI/Tab.cpp:1077 +#: src/slic3r/GUI/Tab.cpp:1092 src/slic3r/GUI/Tab.cpp:1191 +#: src/slic3r/GUI/Tab.cpp:1194 src/slic3r/GUI/Tab.cpp:1464 +#: src/slic3r/GUI/Tab.cpp:1951 src/slic3r/GUI/Tab.cpp:3633 +#: src/slic3r/GUI/wxExtensions.cpp:731 src/libslic3r/PrintConfig.cpp:88 +#: src/libslic3r/PrintConfig.cpp:213 src/libslic3r/PrintConfig.cpp:376 +#: src/libslic3r/PrintConfig.cpp:1038 src/libslic3r/PrintConfig.cpp:2286 msgid "Advanced" msgstr "고급" -#: src/slic3r/GUI/GUI_App.cpp:764 +#: src/slic3r/GUI/GUI_App.cpp:814 msgid "Advanced View Mode" msgstr "고급 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:765 src/slic3r/GUI/wxExtensions.cpp:2884 +#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:732 msgid "Expert" msgstr "전문가" -#: src/slic3r/GUI/GUI_App.cpp:765 +#: src/slic3r/GUI/GUI_App.cpp:815 msgid "Expert View Mode" msgstr "전문가 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:770 +#: src/slic3r/GUI/GUI_App.cpp:820 msgid "Mode" msgstr "모드" -#: src/slic3r/GUI/GUI_App.cpp:770 +#: src/slic3r/GUI/GUI_App.cpp:820 #, c-format msgid "%s View Mode" msgstr "%s 보기 모드" -#: src/slic3r/GUI/GUI_App.cpp:772 +#: src/slic3r/GUI/GUI_App.cpp:822 msgid "Change Application &Language" msgstr "응용 프로그램 언어 번경" -#: src/slic3r/GUI/GUI_App.cpp:774 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Flash printer &firmware" msgstr "프린터 펌웨어 플래시" -#: src/slic3r/GUI/GUI_App.cpp:774 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Upload a firmware image into an Arduino based printer" msgstr "아두이노 기반의 프린터 이미지 업로드" -#: src/slic3r/GUI/GUI_App.cpp:786 +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Taking configuration snapshot" msgstr "구성 스냅 샷 만들기" -#: src/slic3r/GUI/GUI_App.cpp:786 +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Snapshot name" msgstr "스냅 샷 이름" -#: src/slic3r/GUI/GUI_App.cpp:829 +#: src/slic3r/GUI/GUI_App.cpp:882 msgid "" "Switching the language will trigger application restart.\n" "You will lose content of the plater." msgstr "" -"언어를 전환 하면 응용 프로그램 재시작 합니다.플레이트 위 오브젝트는 모두 지워" -"집니다." +"언어를 전환 하면 응용 프로그램 재시작 합니다. 플레이트 위 객체(object)는 모" +"두 지워집니다." -#: src/slic3r/GUI/GUI_App.cpp:831 +#: src/slic3r/GUI/GUI_App.cpp:884 msgid "Do you want to proceed?" msgstr "계속 하시겠습니까?" -#: src/slic3r/GUI/GUI_App.cpp:832 +#: src/slic3r/GUI/GUI_App.cpp:885 msgid "Language selection" msgstr "국가에 맞는 언어를 선택" -#: src/slic3r/GUI/GUI_App.cpp:855 +#: src/slic3r/GUI/GUI_App.cpp:908 msgid "&Configuration" msgstr "&구성" -#: src/slic3r/GUI/GUI_App.cpp:877 +#: src/slic3r/GUI/GUI_App.cpp:932 msgid "The presets on the following tabs were modified" msgstr "다음 탭의 사전 설정이 수정 되었습니다" -#: src/slic3r/GUI/GUI_App.cpp:877 src/slic3r/GUI/Tab.cpp:3051 +#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2916 msgid "Discard changes and continue anyway?" msgstr "수정된 사항을 취소하고 계속하겠습니까?" -#: src/slic3r/GUI/GUI_App.cpp:880 +#: src/slic3r/GUI/GUI_App.cpp:935 msgid "Unsaved Presets" msgstr "저장되지 않은 기존설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:84 -#: src/slic3r/GUI/GUI_ObjectList.cpp:558 src/libslic3r/PrintConfig.cpp:67 -#: src/libslic3r/PrintConfig.cpp:160 src/libslic3r/PrintConfig.cpp:392 -#: src/libslic3r/PrintConfig.cpp:453 src/libslic3r/PrintConfig.cpp:461 -#: src/libslic3r/PrintConfig.cpp:867 src/libslic3r/PrintConfig.cpp:1051 -#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1420 -#: src/libslic3r/PrintConfig.cpp:1601 src/libslic3r/PrintConfig.cpp:2037 -#: src/libslic3r/PrintConfig.cpp:2095 +#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2928 +msgid "It's impossible to print multi-part object(s) with SLA technology." +msgstr "SLA 방식을 사용 하여 다중 객체(object)를 인쇄할 수는 없습니다." + +#: src/slic3r/GUI/GUI_App.cpp:1085 +msgid "Please check and fix your object list." +msgstr "객체(object) 목록을 확인 하고 수정 하십시오." + +#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2299 +#: src/slic3r/GUI/Tab.cpp:2930 +msgid "Attention!" +msgstr "주목!" + +#: src/slic3r/GUI/GUI_App.cpp:1103 +msgid "Select a gcode file:" +msgstr "gcode 파일 선택:" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +msgid "Start at height" +msgstr "높이에서 시작" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +msgid "Stop at height" +msgstr "높이에서 정지" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153 +msgid "Remove layer range" +msgstr "레이어 범위 제거" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162 +msgid "Add layer range" +msgstr "레이어 범위 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:93 +#: src/slic3r/GUI/GUI_ObjectList.cpp:611 src/libslic3r/PrintConfig.cpp:72 +#: src/libslic3r/PrintConfig.cpp:165 src/libslic3r/PrintConfig.cpp:174 +#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470 +#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:891 +#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:1450 src/libslic3r/PrintConfig.cpp:1631 +#: src/libslic3r/PrintConfig.cpp:2084 src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2152 msgid "Layers and Perimeters" -msgstr "레이어 및 경계선" +msgstr "레이어 및 둘레" -#: src/slic3r/GUI/GUI_ObjectList.cpp:31 src/slic3r/GUI/GUI_ObjectList.cpp:85 -#: src/slic3r/GUI/GUI_ObjectList.cpp:559 src/slic3r/GUI/Plater.cpp:498 -#: src/slic3r/GUI/Tab.cpp:1041 src/slic3r/GUI/Tab.cpp:1042 -#: src/slic3r/GUI/Tab.cpp:1394 src/libslic3r/PrintConfig.cpp:177 -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:420 -#: src/libslic3r/PrintConfig.cpp:754 src/libslic3r/PrintConfig.cpp:768 -#: src/libslic3r/PrintConfig.cpp:805 src/libslic3r/PrintConfig.cpp:958 -#: src/libslic3r/PrintConfig.cpp:968 src/libslic3r/PrintConfig.cpp:986 -#: src/libslic3r/PrintConfig.cpp:1004 src/libslic3r/PrintConfig.cpp:1023 -#: src/libslic3r/PrintConfig.cpp:1708 src/libslic3r/PrintConfig.cpp:1725 -msgid "Infill" -msgstr "인필(채움)" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:32 src/slic3r/GUI/GUI_ObjectList.cpp:86 -#: src/slic3r/GUI/GUI_ObjectList.cpp:560 src/slic3r/GUI/GUI_Preview.cpp:243 -#: src/slic3r/GUI/Tab.cpp:1070 src/slic3r/GUI/Tab.cpp:1071 -#: src/libslic3r/PrintConfig.cpp:344 src/libslic3r/PrintConfig.cpp:1481 -#: src/libslic3r/PrintConfig.cpp:1830 src/libslic3r/PrintConfig.cpp:1836 -#: src/libslic3r/PrintConfig.cpp:1844 src/libslic3r/PrintConfig.cpp:1856 -#: src/libslic3r/PrintConfig.cpp:1866 src/libslic3r/PrintConfig.cpp:1874 -#: src/libslic3r/PrintConfig.cpp:1889 src/libslic3r/PrintConfig.cpp:1910 -#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1937 -#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1955 -#: src/libslic3r/PrintConfig.cpp:1966 src/libslic3r/PrintConfig.cpp:1980 -#: src/libslic3r/PrintConfig.cpp:1988 src/libslic3r/PrintConfig.cpp:1989 -#: src/libslic3r/PrintConfig.cpp:1998 src/libslic3r/PrintConfig.cpp:2006 -#: src/libslic3r/PrintConfig.cpp:2020 src/libslic3r/GCode/PreviewData.cpp:172 +#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95 +#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/slic3r/GUI/GUI_Preview.cpp:248 +#: src/slic3r/GUI/Tab.cpp:1110 src/slic3r/GUI/Tab.cpp:1111 +#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:360 +#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:1876 +#: src/libslic3r/PrintConfig.cpp:1882 src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1912 +#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1935 +#: src/libslic3r/PrintConfig.cpp:1956 src/libslic3r/PrintConfig.cpp:1968 +#: src/libslic3r/PrintConfig.cpp:1984 src/libslic3r/PrintConfig.cpp:1993 +#: src/libslic3r/PrintConfig.cpp:2002 src/libslic3r/PrintConfig.cpp:2013 +#: src/libslic3r/PrintConfig.cpp:2027 src/libslic3r/PrintConfig.cpp:2035 +#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2053 src/libslic3r/PrintConfig.cpp:2067 msgid "Support material" msgstr "서포트 재료(Support material)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:90 -#: src/slic3r/GUI/GUI_ObjectList.cpp:564 src/libslic3r/PrintConfig.cpp:2202 -#: src/libslic3r/PrintConfig.cpp:2210 +#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99 +#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/libslic3r/PrintConfig.cpp:2262 +#: src/libslic3r/PrintConfig.cpp:2270 msgid "Wipe options" msgstr "지우기 옵션" -#: src/slic3r/GUI/GUI_ObjectList.cpp:41 +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 msgid "Pad and Support" msgstr "패드 및 서포트" -#: src/slic3r/GUI/GUI_ObjectList.cpp:47 +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 msgid "Add part" -msgstr "파트 추가" +msgstr "부품(Part) 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:48 +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 msgid "Add modifier" msgstr "편집영역(modifier) 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:49 +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 msgid "Add support enforcer" msgstr "서포트 지원(enforcer)영역 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:50 +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 msgid "Add support blocker" msgstr "서포트 금지영역(blocker) 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:87 src/slic3r/GUI/GUI_ObjectList.cpp:561 -#: src/slic3r/GUI/GUI_Preview.cpp:222 src/slic3r/GUI/Tab.cpp:1095 -#: src/libslic3r/PrintConfig.cpp:209 src/libslic3r/PrintConfig.cpp:441 -#: src/libslic3r/PrintConfig.cpp:896 src/libslic3r/PrintConfig.cpp:1024 -#: src/libslic3r/PrintConfig.cpp:1410 src/libslic3r/PrintConfig.cpp:1647 -#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1747 -#: src/libslic3r/PrintConfig.cpp:2080 +#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:614 +#: src/slic3r/GUI/GUI_Preview.cpp:226 src/slic3r/GUI/Tab.cpp:1135 +#: src/libslic3r/PrintConfig.cpp:225 src/libslic3r/PrintConfig.cpp:458 +#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:1440 src/libslic3r/PrintConfig.cpp:1677 +#: src/libslic3r/PrintConfig.cpp:1726 src/libslic3r/PrintConfig.cpp:1778 +#: src/libslic3r/PrintConfig.cpp:2128 msgid "Speed" msgstr "속도" -#: src/slic3r/GUI/GUI_ObjectList.cpp:88 src/slic3r/GUI/GUI_ObjectList.cpp:562 -#: src/slic3r/GUI/Tab.cpp:1130 src/slic3r/GUI/Tab.cpp:1997 -#: src/libslic3r/PrintConfig.cpp:471 src/libslic3r/PrintConfig.cpp:979 -#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1717 -#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1928 +#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:615 +#: src/slic3r/GUI/Tab.cpp:1170 src/slic3r/GUI/Tab.cpp:1822 +#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1003 +#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1747 +#: src/libslic3r/PrintConfig.cpp:1948 src/libslic3r/PrintConfig.cpp:1975 msgid "Extruders" msgstr "익스트루더" -#: src/slic3r/GUI/GUI_ObjectList.cpp:89 src/slic3r/GUI/GUI_ObjectList.cpp:563 -#: src/libslic3r/PrintConfig.cpp:431 src/libslic3r/PrintConfig.cpp:538 -#: src/libslic3r/PrintConfig.cpp:855 src/libslic3r/PrintConfig.cpp:987 -#: src/libslic3r/PrintConfig.cpp:1398 src/libslic3r/PrintConfig.cpp:1737 -#: src/libslic3r/PrintConfig.cpp:1911 src/libslic3r/PrintConfig.cpp:2069 +#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:616 +#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555 +#: src/libslic3r/PrintConfig.cpp:878 src/libslic3r/PrintConfig.cpp:1011 +#: src/libslic3r/PrintConfig.cpp:1427 src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1957 src/libslic3r/PrintConfig.cpp:2116 msgid "Extrusion Width" msgstr "압출 폭" -#: src/slic3r/GUI/GUI_ObjectList.cpp:95 src/slic3r/GUI/GUI_ObjectList.cpp:569 -#: src/slic3r/GUI/Plater.cpp:466 src/slic3r/GUI/Tab.cpp:3655 -#: src/slic3r/GUI/Tab.cpp:3656 src/libslic3r/PrintConfig.cpp:2469 -#: src/libslic3r/PrintConfig.cpp:2476 src/libslic3r/PrintConfig.cpp:2485 -#: src/libslic3r/PrintConfig.cpp:2494 src/libslic3r/PrintConfig.cpp:2504 -#: src/libslic3r/PrintConfig.cpp:2530 src/libslic3r/PrintConfig.cpp:2537 -#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2558 -#: src/libslic3r/PrintConfig.cpp:2567 src/libslic3r/PrintConfig.cpp:2580 -#: src/libslic3r/PrintConfig.cpp:2590 src/libslic3r/PrintConfig.cpp:2599 -#: src/libslic3r/PrintConfig.cpp:2609 src/libslic3r/PrintConfig.cpp:2621 -#: src/libslic3r/PrintConfig.cpp:2629 +#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:622 +#: src/slic3r/GUI/Plater.cpp:492 src/slic3r/GUI/Tab.cpp:3576 +#: src/slic3r/GUI/Tab.cpp:3577 src/libslic3r/PrintConfig.cpp:2615 +#: src/libslic3r/PrintConfig.cpp:2622 src/libslic3r/PrintConfig.cpp:2631 +#: src/libslic3r/PrintConfig.cpp:2640 src/libslic3r/PrintConfig.cpp:2650 +#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2683 +#: src/libslic3r/PrintConfig.cpp:2694 src/libslic3r/PrintConfig.cpp:2704 +#: src/libslic3r/PrintConfig.cpp:2713 src/libslic3r/PrintConfig.cpp:2726 +#: src/libslic3r/PrintConfig.cpp:2736 src/libslic3r/PrintConfig.cpp:2745 +#: src/libslic3r/PrintConfig.cpp:2755 src/libslic3r/PrintConfig.cpp:2766 +#: src/libslic3r/PrintConfig.cpp:2774 msgid "Supports" msgstr "서포트" -#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:570 -#: src/slic3r/GUI/Tab.cpp:3684 src/slic3r/GUI/Tab.cpp:3685 -#: src/libslic3r/PrintConfig.cpp:2637 src/libslic3r/PrintConfig.cpp:2644 -#: src/libslic3r/PrintConfig.cpp:2658 src/libslic3r/PrintConfig.cpp:2668 -#: src/libslic3r/PrintConfig.cpp:2681 src/libslic3r/PrintConfig.cpp:2690 -#: src/libslic3r/PrintConfig.cpp:2701 src/libslic3r/PrintConfig.cpp:2712 -#: src/libslic3r/PrintConfig.cpp:2722 src/libslic3r/PrintConfig.cpp:2732 +#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:623 +#: src/slic3r/GUI/Plater.cpp:632 src/slic3r/GUI/Tab.cpp:3608 +#: src/slic3r/GUI/Tab.cpp:3609 src/libslic3r/PrintConfig.cpp:2782 +#: src/libslic3r/PrintConfig.cpp:2789 src/libslic3r/PrintConfig.cpp:2803 +#: src/libslic3r/PrintConfig.cpp:2814 src/libslic3r/PrintConfig.cpp:2824 +#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2857 +#: src/libslic3r/PrintConfig.cpp:2864 src/libslic3r/PrintConfig.cpp:2871 +#: src/libslic3r/PrintConfig.cpp:2882 src/libslic3r/PrintConfig.cpp:2891 +#: src/libslic3r/PrintConfig.cpp:2900 msgid "Pad" msgstr "패드" -#: src/slic3r/GUI/GUI_ObjectList.cpp:217 +#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:3626 +#: src/slic3r/GUI/Tab.cpp:3627 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:2910 +#: src/libslic3r/PrintConfig.cpp:2917 src/libslic3r/PrintConfig.cpp:2927 +#: src/libslic3r/PrintConfig.cpp:2936 +msgid "Hollowing" +msgstr "속이 빈 공동(Hollowing)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:268 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 msgid "Name" msgstr "이름" -#: src/slic3r/GUI/GUI_ObjectList.cpp:271 -#, c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "오류자동수정 (%d errors)\n" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:278 -msgid "degenerate facets" -msgstr "더러운 면" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:279 -msgid "edges fixed" -msgstr "모서리 고정" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:280 -msgid "facets removed" -msgstr "면 제거" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:281 -msgid "facets added" -msgstr "면 추가됨" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:282 -msgid "facets reversed" -msgstr "면 반전" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:283 -msgid "backwards edges" -msgstr "뒤쪽 가장자리" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:291 -msgid "Right button click the icon to fix STL through Netfabb" -msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:325 -msgid "Right button click the icon to change the object settings" -msgstr "아이콘을 클릭 하여 개체 설정을 변경 합니다" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:375 src/slic3r/GUI/GUI_ObjectList.cpp:396 -#: src/slic3r/GUI/GUI_ObjectList.cpp:408 src/slic3r/GUI/GUI_ObjectList.cpp:3508 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3518 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3550 src/slic3r/GUI/wxExtensions.cpp:576 -#: src/slic3r/GUI/wxExtensions.cpp:633 src/slic3r/GUI/wxExtensions.cpp:658 -#: src/slic3r/GUI/wxExtensions.cpp:794 -msgid "default" -msgstr "기본값" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:380 src/slic3r/GUI/Tab.cpp:1613 -#: src/libslic3r/PrintConfig.cpp:470 +#: src/slic3r/GUI/GUI_ObjectList.cpp:276 src/slic3r/GUI/Tab.cpp:1428 +#: src/slic3r/GUI/wxExtensions.cpp:589 src/libslic3r/PrintConfig.cpp:487 msgid "Extruder" msgstr "익스트루더(Extruder)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:280 src/slic3r/GUI/GUI_ObjectList.cpp:392 +msgid "Editing" +msgstr "편집" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:337 +#, c-format +msgid "Auto-repaired (%d errors):" +msgstr "오류자동수정 (%d errors):" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:344 +msgid "degenerate facets" +msgstr "더러운 면" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:345 +msgid "edges fixed" +msgstr "모서리 고정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:346 +msgid "facets removed" +msgstr "면 제거" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:347 +msgid "facets added" +msgstr "면 추가됨" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:348 +msgid "facets reversed" +msgstr "면 반전" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:349 +msgid "backwards edges" +msgstr "뒤쪽 가장자리" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:357 +msgid "Right button click the icon to fix STL through Netfabb" +msgstr "아이콘을 클릭 하여 Netfabb에서 STL을 수정 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:394 +msgid "Right button click the icon to change the object settings" +msgstr "아이콘을 클릭 하여 객체(object) 설정을 변경 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 +msgid "Click the icon to change the object settings" +msgstr "아이콘을 클릭 하여 오브젝트 설정을 변경 합니다" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:400 +msgid "Right button click the icon to change the object printable property" +msgstr "오른쪽 버튼이 아이콘을 클릭하여 객체 인쇄 가능한 속성을 변경합니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 +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:915 src/slic3r/GUI/GUI_ObjectList.cpp:3947 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3957 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3992 +#: 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:1725 +msgid "default" +msgstr "기본값" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:534 +msgid "Change Extruder" +msgstr "압출기(익스트루더) 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:549 msgid "Rename Object" -msgstr "개체 이름 바꾸기" +msgstr "객체(object) 이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:549 msgid "Rename Sub-object" -msgstr "하위 오브젝트 이름 바꾸기" +msgstr "하위 객체(object) 이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:934 src/slic3r/GUI/GUI_ObjectList.cpp:3346 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1089 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3756 msgid "Instances to Separated Objects" -msgstr "분리된 객체에 대한 복제본" +msgstr "분리된 객체(object)에 대한 복제본" -#: src/slic3r/GUI/GUI_ObjectList.cpp:952 -msgid "Remove Volume(s)" -msgstr "볼륨 제거" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1104 +msgid "Volumes in Object reordered" +msgstr "개체의 볼륨이 재정렬되었습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1007 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1322 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1556 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1104 +msgid "Object reordered" +msgstr "개체 순서가 다시 지정되었습니다." + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1180 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1528 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1534 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1828 #, c-format msgid "Quick Add Settings (%s)" msgstr "빠른 추가 설정 (%s)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1077 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1263 msgid "Select showing settings" -msgstr "설정 표시를 선택 합니다" +msgstr "표시된 설정을 선택 합니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1126 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1312 msgid "Add Settings for Layers" -msgstr "도면층에 대한 설정 추가" +msgstr "레이어 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1313 msgid "Add Settings for Sub-object" -msgstr "하위 개체에 대한 설정 추가" +msgstr "하위 객체(object)에 대한 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1128 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1314 msgid "Add Settings for Object" -msgstr "개체에 대한 설정 추가" +msgstr "객체(object)에 대한 설정 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1189 -msgid "Add Settings Bundle for Layers" -msgstr "레이어에 대한 설정 번들 추가" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1384 +msgid "Add Settings Bundle for Height range" +msgstr "높이 범위에 대한 설정 번들 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1190 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1385 msgid "Add Settings Bundle for Sub-object" -msgstr "하위 오브젝트에 대한 설정 번들 추가" +msgstr "하위 객체(object)에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1191 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 msgid "Add Settings Bundle for Object" -msgstr "개체에 대한 설정 번들 추가" +msgstr "객체(object)에 대한 번들 설정을 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1230 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1425 msgid "Load" msgstr "불러오기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1260 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1263 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1462 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1466 msgid "Box" msgstr "박스" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 msgid "Cylinder" msgstr "원통" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 msgid "Sphere" msgstr "영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1235 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1430 msgid "Slab" msgstr "슬랩" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1287 -msgid "Edit Layers" -msgstr "레이어 편집" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1498 +msgid "Height range Modifier" +msgstr "높이 범위에 대한 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1295 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1507 msgid "Add settings" msgstr "다음 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1362 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1582 msgid "Change type" msgstr "타입 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1369 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1510 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1589 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1601 msgid "Set as a Separated Object" -msgstr "분리 된 객체로 설정" +msgstr "분리 된 객체(object)로 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1375 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1601 +msgid "Set as a Separated Objects" +msgstr "분리된 객체(object)로 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 +msgid "Printable" +msgstr "인쇄가능" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1626 msgid "Rename" msgstr "이름 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1637 msgid "Fix through the Netfabb" -msgstr "네트워크를 통해 수정" +msgstr "Netfabb를 통해 수정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1396 src/slic3r/GUI/Plater.cpp:3496 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 src/slic3r/GUI/Plater.cpp:3987 msgid "Export as STL" msgstr "STL로 내보내기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1403 -msgid "Change extruder" -msgstr "압출기(익스트루더) 변경" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1655 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3932 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3935 src/slic3r/GUI/Plater.cpp:3946 +#: src/slic3r/GUI/Plater.cpp:3949 +msgid "Reload the selected volumes from disk" +msgstr "디스크에서 선택한 볼륨 다시 로드" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1422 src/libslic3r/PrintConfig.cpp:309 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1685 src/libslic3r/PrintConfig.cpp:325 msgid "Default" msgstr "기본값" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1428 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1691 msgid "Select new extruder for the object/part" -msgstr "객체/부품에 대한 새 압출(익스트루더) 기 선택" +msgstr "객체(object)/부품(Part)에 대한 새 압출(익스트루더) 기 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1703 msgid "Scale to print volume" msgstr "인쇄 볼륨에 따라 배율 조정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1703 msgid "Scale the selected object to fit the print volume" -msgstr "인쇄 볼륨에 맞게 선택한 오브젝트의 배율 조정" +msgstr "인쇄 볼륨에 맞게 선택한 객체(object)의 배율 조정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1510 -msgid "Set as a Separated Objects" -msgstr "분리 된 객체로 설정" +#: src/slic3r/GUI/GUI_ObjectList.cpp:1772 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2030 +msgid "Add Shape" +msgstr "모양 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1585 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 msgid "Load Part" -msgstr "하중 부품" +msgstr "부품(Part)을 불러 오기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1617 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1897 msgid "Error!" msgstr "에러!" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1662 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1972 msgid "Add Generic Subobject" -msgstr "일반 하위 개체 추가" +msgstr "기본이 되는 하위 객체(object) 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1669 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2001 msgid "Generic" msgstr "일반" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1770 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2119 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2221 msgid "Last instance of an object cannot be deleted." -msgstr "개체의 마지막 복제본를 삭제할 수 없습니다." +msgstr "객체(object)의 마지막 복제본를 삭제할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2131 msgid "Delete Settings" msgstr "설정 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1806 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2155 msgid "Delete All Instances from Object" -msgstr "개체에서 모든 복제본 삭제" +msgstr "객체(object)에서 모든 복제본 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1822 -msgid "Delete Layers Range" -msgstr "레이어 범위 삭제" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2171 +msgid "Delete Height Range" +msgstr "높이 범위 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1853 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2202 msgid "From Object List You can't delete the last solid part from object." -msgstr "개체 목록에서 개체에서 마지막 솔리드 부품을 삭제할 수 없습니다." +msgstr "객체(object) 리스트에서 마지막 부품(Part)을 삭제할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1857 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 msgid "Delete Subobject" -msgstr "하위 개체 삭제" +msgstr "하위 객체(object) 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2225 msgid "Delete Instance" msgstr "복제본 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1900 src/slic3r/GUI/Plater.cpp:2793 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2249 src/slic3r/GUI/Plater.cpp:2964 msgid "" "The selected object couldn't be split because it contains only one part." msgstr "" -"선택한 오브젝트는 파트 하나만 포함되어 있기 때문에 분할 할 수 없습니다." +"선택한 객체(object)는 부품(Part) 하나만 포함되어 있기 때문에 분할 할 수 없습" +"니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1904 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2253 msgid "Split to Parts" -msgstr "파트로 분할" +msgstr "부품(Part)으로 분할" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1950 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2305 msgid "Add Layers" msgstr "레이어 추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2075 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2431 msgid "Group manipulation" msgstr "그룹 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2087 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2443 msgid "Object manipulation" -msgstr "개체 조작" +msgstr "객체(object) 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2100 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2456 msgid "Object Settings to modify" -msgstr "수정할 개체 설정" +msgstr "수정할 객체(object) 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2104 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2460 msgid "Part Settings to modify" -msgstr "수정할 부품 설정" +msgstr "수정할 부품(Part) 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2109 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2465 msgid "Layer range Settings to modify" msgstr "레이어 범위 설정 수정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2115 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2471 msgid "Part manipulation" -msgstr "파트 조작" +msgstr "부품(Part) 조작" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2121 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2477 msgid "Instance manipulation" msgstr "복제본 제거" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2128 -msgid "Layers Editing" -msgstr "레이어층을 편집" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2128 -msgid "Layer Editing" -msgstr "레이어 편집" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2303 -msgid "Delete Selected Item" -msgstr "선택한 항목 삭제" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2415 -msgid "Delete Selected" -msgstr "선택된 것을 삭제" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2484 +msgid "Height ranges" +msgstr "높이 범위" #: src/slic3r/GUI/GUI_ObjectList.cpp:2484 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2513 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2531 -msgid "Add New Layers Range" -msgstr "새 레이어 범위 추가" +msgid "Settings for height range" +msgstr "높이 범위에 대한 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2590 -msgid "Edit Layers Range" -msgstr "레이어 범위 편집" +#: src/slic3r/GUI/GUI_ObjectList.cpp:2670 +msgid "Delete Selected Item" +msgstr "선택한 항목(item) 삭제" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2867 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2807 +msgid "Delete Selected" +msgstr "선택된 것 삭제" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2873 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2902 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2920 +msgid "Add Height Range" +msgstr "높이 범위 추가" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2980 +msgid "Edit Height Range" +msgstr "높이 범위 편집" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3266 msgid "Selection-Remove from list" msgstr "목록에서 선택-제거" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3274 msgid "Selection-Add from list" msgstr "목록에서 선택-추가" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2993 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3392 msgid "Object or Instance" -msgstr "개체 또는 복제본" +msgstr "객체(object) 또는 복제본" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2994 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3393 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Part" -msgstr "부품(Part)" +msgstr "부품(Part)(Part)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2994 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3393 msgid "Layer" msgstr "레이어" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2996 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3395 msgid "Unsupported selection" msgstr "지원 되지 않는 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2997 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3396 #, c-format msgid "You started your selection with %s Item." -msgstr "%s 항목으로 선택을 시작 했습니다." +msgstr "%s 선택된 항목으로 시작합니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2998 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3397 #, c-format msgid "In this mode you can select only other %s Items%s" msgstr "이 모드에서는 %s의 다른 %s 항목만 선택할 수 있습니다" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3001 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3400 msgid "of a current Object" -msgstr "현재 개체의" +msgstr "현재 객체(object)의" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3006 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3081 src/slic3r/GUI/Plater.cpp:126 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3405 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3480 src/slic3r/GUI/Plater.cpp:143 msgid "Info" msgstr "정보" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3122 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3521 msgid "You can't change a type of the last solid part of the object." -msgstr "객체의 마지막 솔리드 부품 유형은 변경할 수 없습니다." +msgstr "객체(object)의 마지막 부품(Part) 유형은 변경할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Modifier" msgstr "편집 영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Support Enforcer" msgstr "서포트 지원 영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3526 msgid "Support Blocker" msgstr "서포트 금지 영역" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3129 -msgid "Type:" -msgstr "형식:" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:3129 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3528 msgid "Select type of part" -msgstr "부품 유형 선택" +msgstr "부품(Part) 유형 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3134 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3533 msgid "Change Part Type" -msgstr "부품 유형 변경" +msgstr "부품(Part) 유형 변경" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3368 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3778 msgid "Enter new name" msgstr "새 이름 입력" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3368 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3778 msgid "Renaming" msgstr "이름 바꾸기" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3384 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3480 src/slic3r/GUI/Tab.cpp:3536 -#: src/slic3r/GUI/Tab.cpp:3540 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3794 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3901 src/slic3r/GUI/Tab.cpp:3426 +#: src/slic3r/GUI/Tab.cpp:3430 msgid "The supplied name is not valid;" msgstr "제공된 이름이 유효하지 않습니다;" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3385 -#: src/slic3r/GUI/GUI_ObjectList.cpp:3481 src/slic3r/GUI/Tab.cpp:3537 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3795 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3902 src/slic3r/GUI/Tab.cpp:3427 msgid "the following characters are not allowed:" msgstr "다음 문자는 허용되지 않습니다:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3498 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 msgid "Set extruder for selected items" msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3499 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3928 msgid "Select extruder number for selected objects and/or parts" -msgstr "선택한 객체 및 부품에 대한 압출기(익스트루더) 번호 선택" +msgstr "선택한 객체(object) 및 부품(Part)에 대한 압출기(익스트루더) 번호 선택" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3512 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3951 msgid "Select extruder number:" msgstr "압출기(익스트루더) 번호 선택:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3513 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3952 msgid "This extruder will be set for selected items" msgstr "선택한 항목에 대한 압출기(익스트루더) 설정" +#: src/slic3r/GUI/GUI_ObjectList.cpp:3977 +msgid "Change Extruders" +msgstr "돌출기 변경" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4074 src/slic3r/GUI/Selection.cpp:1474 +msgid "Set Printable" +msgstr "인쇄 가능 설정" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4074 src/slic3r/GUI/Selection.cpp:1474 +msgid "Set Unprintable" +msgstr "인쇄할 수 없는 설정" + #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 #: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 msgid "World coordinates" @@ -1875,78 +2822,76 @@ msgstr "로컬 좌표" msgid "Select coordinate space, in which the transformation will be performed." msgstr "변환이 수행될 좌표 공간을 선택 합니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:125 -msgid "Object Manipulation" -msgstr "개체 조작" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:176 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638 msgid "Object name" -msgstr "개체 이름" +msgstr "객체(object) 이름" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:212 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457 +msgid "Position" +msgstr "위치" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458 +#: src/slic3r/GUI/Mouse3DController.cpp:321 +#: src/slic3r/GUI/Mouse3DController.cpp:344 +msgid "Rotation" +msgstr "회전" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 #, c-format msgid "Toggle %c axis mirroring" msgstr "전환 %c 축 미러링" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:245 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297 msgid "Set Mirror" msgstr "미러 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:290 -msgid "Reset scale" -msgstr "스케일 재설정" +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349 +msgid "Drop to bed" +msgstr "배드를 아래로 내리기" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:303 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 msgid "Reset rotation" msgstr "회전 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:328 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 msgid "Reset Rotation" msgstr "회전 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:340 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:355 -msgid "Drop to bed" -msgstr "잠자리에 들기" +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 +msgid "Reset scale" +msgstr "크기 재설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:388 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:443 -msgid "Position" -msgstr "위치" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:389 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:444 -msgid "Rotation" -msgstr "회전" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:445 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 msgid "Scale factors" msgstr "축척 계수" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:502 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 msgid "Translate" msgstr "번역" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:554 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 msgid "" -"You cann't use non-uniform scaling mode for multiple objects/parts selection" +"You cannot use non-uniform scaling mode for multiple objects/parts selection" msgstr "" "여러 객체/부품 선택에 는 균일하지 않은 배율 조정 모드를 사용할 수 없습니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:715 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750 msgid "Set Position" msgstr "위치 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:746 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781 msgid "Set Orientation" msgstr "방향 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846 msgid "Set Scale" msgstr "축척 설정" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:895 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875 msgid "" "The currently manipulated object is tilted (rotation angles are not " "multiples of 90°).\n" @@ -1954,969 +2899,1042 @@ msgid "" "coordinate system,\n" "once the rotation is embedded into the object coordinates." msgstr "" -"현재 조작 된 오브젝트가 기울어져 있습니다 (회전 각도가 90 °의 배수가 아님).\n" -"기울어진 오브젝트의 비균일 배율 조정은 표준 좌표계에서만 가능 합니다.\n" -"회전이 오브젝트 좌표로 삽입되면." +"현재 조작 된 객체(object)가 기울어져 있습니다 (회전 각도가 90°의 배수가 아" +"님).\n" +"기울어진 객체(object)의 배율 조정은 기본 좌표에서만 가능 합니다." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:898 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878 msgid "" "This operation is irreversible.\n" "Do you want to proceed?" msgstr "" "이 작업은 되돌릴수 없습니다.\n" -"계속 하 시겠습니까?" +"계속 하시겠습니까?" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59 msgid "Additional Settings" msgstr "추가적인 세팅" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:94 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95 msgid "Remove parameter" msgstr "매개 변수 제거" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:100 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 #, c-format msgid "Delete Option %s" msgstr "삭제 %s 옵션" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:144 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 #, c-format msgid "Change Option %s" msgstr "옵션 %s 변경" -#: src/slic3r/GUI/GUI_Preview.cpp:216 +#: src/slic3r/GUI/GUI_Preview.cpp:220 msgid "View" msgstr "보기" -#: src/slic3r/GUI/GUI_Preview.cpp:219 src/slic3r/GUI/GUI_Preview.cpp:554 -#: src/libslic3r/GCode/PreviewData.cpp:394 +#: src/slic3r/GUI/GUI_Preview.cpp:223 src/slic3r/GUI/GUI_Preview.cpp:577 +#: src/libslic3r/GCode/PreviewData.cpp:345 msgid "Feature type" msgstr "특색 유형" -#: src/slic3r/GUI/GUI_Preview.cpp:220 src/libslic3r/PrintConfig.cpp:483 +#: src/slic3r/GUI/GUI_Preview.cpp:224 src/libslic3r/PrintConfig.cpp:500 msgid "Height" msgstr "높이" -#: src/slic3r/GUI/GUI_Preview.cpp:221 src/libslic3r/PrintConfig.cpp:2188 +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/libslic3r/PrintConfig.cpp:2248 msgid "Width" msgstr "폭" -#: src/slic3r/GUI/GUI_Preview.cpp:223 +#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/Tab.cpp:1451 +msgid "Fan speed" +msgstr "팬 속도" + +#: src/slic3r/GUI/GUI_Preview.cpp:228 msgid "Volumetric flow rate" msgstr "용적의 유량값" -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:328 -#: src/slic3r/GUI/GUI_Preview.cpp:506 src/slic3r/GUI/GUI_Preview.cpp:553 -#: src/slic3r/GUI/GUI_Preview.cpp:749 src/libslic3r/GCode/PreviewData.cpp:404 +#: src/slic3r/GUI/GUI_Preview.cpp:229 src/slic3r/GUI/GUI_Preview.cpp:337 +#: src/slic3r/GUI/GUI_Preview.cpp:521 src/slic3r/GUI/GUI_Preview.cpp:576 +#: src/slic3r/GUI/GUI_Preview.cpp:831 src/libslic3r/GCode/PreviewData.cpp:357 msgid "Tool" msgstr "도구" -#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/GUI_Preview.cpp:551 -#: src/libslic3r/GCode/PreviewData.cpp:406 +#: src/slic3r/GUI/GUI_Preview.cpp:230 src/slic3r/GUI/GUI_Preview.cpp:574 +#: src/libslic3r/GCode/PreviewData.cpp:359 msgid "Color Print" msgstr "컬러 프린트" -#: src/slic3r/GUI/GUI_Preview.cpp:228 +#: src/slic3r/GUI/GUI_Preview.cpp:233 msgid "Show" msgstr "보다" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/slic3r/GUI/GUI_Preview.cpp:232 +#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/GUI_Preview.cpp:237 msgid "Feature types" msgstr "특색 유형" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/GCode/PreviewData.cpp:163 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:310 msgid "Perimeter" msgstr "가장자리" -#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/GCode/PreviewData.cpp:164 +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:311 msgid "External perimeter" msgstr "외부 가장자리" -#: src/slic3r/GUI/GUI_Preview.cpp:236 src/libslic3r/GCode/PreviewData.cpp:165 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:312 msgid "Overhang perimeter" msgstr "오버행(Overhang) 둘레" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/GCode/PreviewData.cpp:166 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:313 msgid "Internal infill" msgstr "내부 채움" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/PrintConfig.cpp:1736 -#: src/libslic3r/PrintConfig.cpp:1746 src/libslic3r/GCode/PreviewData.cpp:167 +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/PrintConfig.cpp:1766 src/libslic3r/PrintConfig.cpp:1777 msgid "Solid infill" msgstr "솔리드 인필" -#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/PrintConfig.cpp:2068 -#: src/libslic3r/PrintConfig.cpp:2079 src/libslic3r/GCode/PreviewData.cpp:168 +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/PrintConfig.cpp:2115 src/libslic3r/PrintConfig.cpp:2127 msgid "Top solid infill" msgstr "가장 윗부분 채움" -#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/GCode/PreviewData.cpp:169 +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/libslic3r/ExtrusionEntity.cpp:316 msgid "Bridge infill" msgstr "브릿지 채움" -#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/PrintConfig.cpp:895 -#: src/libslic3r/GCode/PreviewData.cpp:170 +#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/PrintConfig.cpp:919 msgid "Gap fill" msgstr "공백 채움" -#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1061 -#: src/libslic3r/GCode/PreviewData.cpp:171 +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/slic3r/GUI/Tab.cpp:1101 +#: src/libslic3r/ExtrusionEntity.cpp:318 msgid "Skirt" msgstr "스커트" -#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/PrintConfig.cpp:1954 -#: src/libslic3r/GCode/PreviewData.cpp:173 +#: src/slic3r/GUI/GUI_Preview.cpp:249 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/libslic3r/PrintConfig.cpp:2001 msgid "Support material interface" -msgstr "서포트 재료 인터페이스" +msgstr "서포트 접점" -#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1141 -#: src/libslic3r/GCode/PreviewData.cpp:174 +#: src/slic3r/GUI/GUI_Preview.cpp:250 src/slic3r/GUI/Tab.cpp:1181 +#: src/libslic3r/ExtrusionEntity.cpp:321 msgid "Wipe tower" msgstr "와이프 타워(Wipe tower)" -#: src/slic3r/GUI/GUI_Preview.cpp:250 src/libslic3r/PrintConfig.cpp:2102 +#: src/slic3r/GUI/GUI_Preview.cpp:255 src/libslic3r/PrintConfig.cpp:2162 msgid "Travel" msgstr "이송" -#: src/slic3r/GUI/GUI_Preview.cpp:251 +#: src/slic3r/GUI/GUI_Preview.cpp:256 msgid "Retractions" msgstr "리트랙션" -#: src/slic3r/GUI/GUI_Preview.cpp:252 +#: src/slic3r/GUI/GUI_Preview.cpp:257 msgid "Unretractions" msgstr "리트랙션 취소" -#: src/slic3r/GUI/GUI_Preview.cpp:253 +#: src/slic3r/GUI/GUI_Preview.cpp:258 msgid "Shells" -msgstr "쉘" +msgstr "쉘(Shells)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:672 +#: src/slic3r/GUI/GUI_Preview.cpp:259 +msgid "Legend" +msgstr "범례" + +#: src/slic3r/GUI/Job.hpp:123 +msgid "ERROR: not enough resources to execute a new job." +msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 없습니다." + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:14 src/slic3r/GUI/MainFrame.cpp:710 msgid "Keyboard Shortcuts" -msgstr "키보드 바로 가기" +msgstr "키보드 단축기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:104 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" -msgstr "구성으로 프로젝트 STL/OBJ/AMF/3MF 열기, 배드 삭제" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "구성 없이 STL/OBJ/AMF/3MF 가져오기, 배드 유지" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 -msgid "Load Config from .ini/amf/3mf/gcode" -msgstr ".Ini/amf/3mf/gcode에서 구성 로드" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/Plater.cpp:822 -#: src/slic3r/GUI/Plater.cpp:4687 src/libslic3r/PrintConfig.cpp:3127 -msgid "Export G-code" -msgstr "G-코드 내보내기" +msgstr "프로젝트 구성 열기(STL/OBJ/AMF/3MF), 배드 삭제" #: src/slic3r/GUI/KBShortcutsDialog.cpp:108 +msgid "Import STL/OBJ/AMF/3MF without config, keep bed" +msgstr "구성 없이 가져오기(STL/OBJ/AMF/3MF), 배드 유지" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +msgid "Load Config from .ini/amf/3mf/gcode" +msgstr ".Ini/amf/3mf/gcode에서 구성 가져오기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 src/slic3r/GUI/Plater.cpp:888 +#: src/slic3r/GUI/Plater.cpp:5544 src/libslic3r/PrintConfig.cpp:3348 +msgid "Export G-code" +msgstr "G-code 내보내기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 msgid "Save project (3MF)" msgstr "프로젝트 저장 (3MF)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 msgid "Load Config from .ini/amf/3mf/gcode and merge" -msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 로드" +msgstr ".Ini/amf/3mf/gcode 및 병합에서 구성 가져오기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 msgid "(Re)slice" msgstr "(Re)슬라이스" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 -msgid "Select Plater Tab" -msgstr "선택 및 플래이트 탭" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 -msgid "Select Print Settings Tab" -msgstr "인쇄 설정 탭을 선택 합니다" - #: src/slic3r/GUI/KBShortcutsDialog.cpp:116 -msgid "Select Filament Settings Tab" -msgstr "필라멘트 설정 탭 선택" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 -msgid "Select Printer Settings Tab" -msgstr "프린터 설정 탭을 선택 합니다" +msgid "Select Plater Tab" +msgstr "선택 및 플래이터 탭" #: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +msgid "Select Print Settings Tab" +msgstr "인쇄 설정을 선택 합니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +msgid "Select Filament Settings Tab" +msgstr "필라멘트 설정을 선택" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +msgid "Select Printer Settings Tab" +msgstr "프린터 설정을 선택 합니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 msgid "Switch to 3D" msgstr "3D로 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 msgid "Switch to Preview" msgstr "미리 보기로 전환" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Preferences.cpp:10 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Preferences.cpp:10 msgid "Preferences" msgstr "기본 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 #: src/slic3r/GUI/PrintHostDialogs.cpp:136 msgid "Print host upload queue" -msgstr "호스트 업로드 대기열 인쇄" +msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 msgid "Camera view" msgstr "카메라 뷰" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 -msgid "Add Instance of the selected object" -msgstr "선택한 개체의 복제본 추가" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 -msgid "Remove Instance of the selected object" -msgstr "선택한 개체의 복제본 제거" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 -msgid "Show keyboard shortcuts list" -msgstr "바로 가기 키 목록 표시" - #: src/slic3r/GUI/KBShortcutsDialog.cpp:126 -msgid "Press to select multiple object or move multiple object with mouse" -msgstr "여러 개체를 선택 하거나 마우스로 여러 개체를 이동 하려면 누릅니다" +msgid "Add Instance of the selected object" +msgstr "선택한 객체(object)의 복제본 추가" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +msgid "Remove Instance of the selected object" +msgstr "선택한 객체(object)의 복제본 제거" #: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +msgid "Show keyboard shortcuts list" +msgstr "단축 키 목록 표시" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +msgid "Press to select multiple object or move multiple object with mouse" +msgstr "" +"여러 객체(object)를 선택 하거나 마우스로 여러 객체(object)를 이동 하려면 누릅" +"니다" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:131 msgid "Main Shortcuts" msgstr "주요 단축키" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 msgid "Select All objects" -msgstr "모든 객체 선택" +msgstr "모든 객체(object) 선택" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Delete selected" msgstr "선택 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Delete All" msgstr "전부 지움" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 msgid "Copy to clipboard" msgstr "클립보드로 복사" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 msgid "Paste from clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 -msgid "Gizmo move" -msgstr "객체 이동" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 -msgid "Gizmo scale" -msgstr "객체 배율" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 -msgid "Gizmo rotate" -msgstr "객체 회전" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 -msgid "Gizmo cut" -msgstr "기즈모 자르기" - #: src/slic3r/GUI/KBShortcutsDialog.cpp:144 -msgid "Gizmo Place face on bed" -msgstr "기즈모를 배드위에서" +msgid "Gizmo move" +msgstr "개체(Gizmo) 이동" #: src/slic3r/GUI/KBShortcutsDialog.cpp:145 -msgid "Gizmo SLA support points" -msgstr "객체 SLA 지원 포인트" +msgid "Gizmo scale" +msgstr "개체(Gizmo) 배율" #: src/slic3r/GUI/KBShortcutsDialog.cpp:146 -#, c-format +msgid "Gizmo rotate" +msgstr "개체(Gizmo) 회전" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +msgid "Gizmo cut" +msgstr "개체(Gizmo) 자르기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +msgid "Gizmo Place face on bed" +msgstr "개체(Gizmo)를 배드위로" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +msgid "Gizmo SLA support points" +msgstr "SLA 개체(Gizmo) 서포트 지점들" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 +#, no-c-format msgid "" "Press to activate selection rectangle\n" "or to snap by 5% in Gizmo scale\n" "or to snap by 1mm in Gizmo move" msgstr "" "활성화된 사각형을 선택합니다.\n" -"5% in 객체 크기를 스냅에 맞춰 조절합니다.\n" -"1mm 씩 객체를 스냅에 맞추 이동합니다." +"5% in 객체(object) 크기를 스냅에 맞춰 조절합니다.\n" +"1mm 씩 객체(object)를 스냅에 맞추 이동합니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "" "Press to scale selection to fit print volume\n" "in Gizmo scale" -msgstr "" -"인쇄 볼륨에 맞게 선택 크기를 조정하려면 누릅니다.\n" -"기즈모 스케일" +msgstr "개체(Gizmo)크기를 인쇄 볼륨에 맞게 조정하려면 누릅니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 msgid "" "Press to activate deselection rectangle\n" "or to scale or rotate selected objects\n" "around their own center" msgstr "" -"자신의 중심 주변\n" -"선택한 개체의 크기를 조정 하거나\n" +"중재봉선 주변으로. 선택한 개체의 크기를 조정 하거나 \n" "회전 하려면 누릅니다" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 msgid "Press to activate one direction scaling in Gizmo scale" -msgstr "기즈모 크기 조절을 활성화 합니다." +msgstr "개체(Gizmo) 크기 조절을 활성화 합니다." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -msgid "Change camera type" -msgstr "카메라 유형 변경" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Change camera type (perspective, orthographic)" +msgstr "카메라 유형 변경(원근, 직교)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 msgid "Zoom to Bed" msgstr "배드 확대" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 msgid "Zoom to all objects in scene, if none selected" -msgstr "장면의 모든 오브젝트로 확대/축소 (선택 하지 않은 경우)" +msgstr "모든 객체(object)를 확대/축소 (선택 하지 않은 경우)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:157 msgid "Zoom to selected object" -msgstr "선택한 개체로 확대/축소" +msgstr "선택한 객체(object)를 확대/축소" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Zoom in" msgstr "확대" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:155 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Zoom out" -msgstr "줌 아웃" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 -msgid "Unselect gizmo / Clear selection" -msgstr "기즈모 선택을 취소 하거나 지우기" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:158 -msgid "Toggle picking pass texture rendering on/off" -msgstr "선택 패스 텍스처 렌더링 켜기/끄기 전환" +msgstr "축소" #: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +msgid "Show/Hide object/instance labels" +msgstr "개체/인스턴스 레이블 표시/숨기기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "3Dconnexion 장치 설정 대화 상자 표시/숨기기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +msgid "Unselect gizmo / Clear selection" +msgstr "개체(Gizmo) 선택을 취소 하거나 지우기" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 msgid "Plater Shortcuts" msgstr "플레이터 단축기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 msgid "Arrow Up" msgstr "위쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 msgid "Upper Layer" msgstr "상위 레이어" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 msgid "Arrow Down" msgstr "아래쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 msgid "Lower Layer" msgstr "하위 레이어" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +msgid "Show/Hide (L)egend" +msgstr "표시/숨기기(L)egend" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 msgid "Preview Shortcuts" msgstr "미리보기 단축기" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:197 msgid "Move current slider thumb Up" -msgstr "현재 마우스 휠 슬라이더를 위로 이동" +msgstr "현재 마우스 휠을 위로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:188 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 msgid "Move current slider thumb Down" -msgstr "현재 마우스 휠 슬라이더를 아래로 이동" +msgstr "현재 마우스 휠을 아래로 이동" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Arrow Left" msgstr "왼쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:199 msgid "Set upper thumb to current slider thumb" msgstr "마우스 휠을 위로 움직여 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 msgid "Arrow Right" msgstr "오른쪽 화살표" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:200 msgid "Set lower thumb to current slider thumb" msgstr "마우스 휠을 아래로 움직여 설정" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:191 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 msgid "Add color change marker for current layer" -msgstr "현재 레이어의 색상 변경 마커 추가" +msgstr "현재 레이어의 색상을 변경할 마커 추가" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:202 msgid "Delete color change marker for current layer" -msgstr "현재 레이어의 색상 변경 마커 삭제" +msgstr "현재 레이어의 색상을 변경할 마커 삭제" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 msgid "Layers Slider Shortcuts" msgstr "레이어 슬라이더 단축키" -#: src/slic3r/GUI/MainFrame.cpp:62 +#: src/slic3r/GUI/MainFrame.cpp:66 msgid "" " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" "releases" msgstr "" -" -http://github.com/prusa3d/slic3r/releases에서 업데이트를 확인하는 것을 잊" -"지 마십시오" +" -http://github.com/prusa3d/slic3r/releases에서 업데이트 확인하는 것을 잊지 " +"마십시오" -#: src/slic3r/GUI/MainFrame.cpp:157 +#: src/slic3r/GUI/MainFrame.cpp:174 msgid "based on Slic3r" msgstr "Slic3r 기반" -#: src/slic3r/GUI/MainFrame.cpp:187 +#: src/slic3r/GUI/MainFrame.cpp:204 msgid "Plater" msgstr "플레이터" -#: src/slic3r/GUI/MainFrame.cpp:393 +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "&New Project" msgstr "&새로운 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:393 +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "Start a new project" msgstr "새로운 프로젝트 시작" -#: src/slic3r/GUI/MainFrame.cpp:396 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "&Open Project" msgstr "&프로젝트 열기" -#: src/slic3r/GUI/MainFrame.cpp:396 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "Open a project file" msgstr "프로젝트 파일 열기" -#: src/slic3r/GUI/MainFrame.cpp:401 +#: src/slic3r/GUI/MainFrame.cpp:413 msgid "Recent projects" msgstr "최근 프로젝트" -#: src/slic3r/GUI/MainFrame.cpp:410 +#: src/slic3r/GUI/MainFrame.cpp:422 msgid "The selected project is no more available" msgstr "선택한 프로젝트를 더 이상 사용할 수 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:410 src/slic3r/GUI/MainFrame.cpp:747 +#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:787 #: src/slic3r/GUI/PrintHostDialogs.cpp:231 msgid "Error" msgstr "에러" -#: src/slic3r/GUI/MainFrame.cpp:434 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "&Save Project" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:434 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "Save current project file" msgstr "현재 프로젝트 파일 저장" -#: src/slic3r/GUI/MainFrame.cpp:438 src/slic3r/GUI/MainFrame.cpp:440 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save Project &as" msgstr "프로젝트 저장" -#: src/slic3r/GUI/MainFrame.cpp:438 src/slic3r/GUI/MainFrame.cpp:440 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save current project file as" msgstr "현재 프로젝트 파일을 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:448 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Import STL/OBJ/AM&F/3MF" msgstr "가져오기 STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/MainFrame.cpp:448 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Load a model" msgstr "모델 로드" -#: src/slic3r/GUI/MainFrame.cpp:452 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Import &Config" msgstr "&구성 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:452 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Load exported configuration file" msgstr "내 보낸 구성 파일로드" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Import Config from &project" msgstr "프로젝트에서 설정 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Load configuration from project file" msgstr "프로젝트 파일에서 구성 로드" -#: src/slic3r/GUI/MainFrame.cpp:457 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Import Config &Bundle" msgstr "번들 &설정 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:457 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Load presets from a bundle" -msgstr "번들에서 미리 설정로드" +msgstr "미리 설정 번들값 가져오기" -#: src/slic3r/GUI/MainFrame.cpp:459 +#: src/slic3r/GUI/MainFrame.cpp:474 msgid "&Import" msgstr "&가져오기" -#: src/slic3r/GUI/MainFrame.cpp:462 src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:751 msgid "Export &G-code" -msgstr "G-코드 내보내기" +msgstr "G-code 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:462 +#: src/slic3r/GUI/MainFrame.cpp:477 msgid "Export current plate as G-code" msgstr "현재 플레이터를 G 코드로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:466 src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:752 msgid "S&end G-code" msgstr "S&엔드 G- 코드" -#: src/slic3r/GUI/MainFrame.cpp:466 +#: src/slic3r/GUI/MainFrame.cpp:481 msgid "Send to print current plate as G-code" msgstr "현재 플레이트를 G 코드로 인쇄하기 위해 보내기" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export plate as &STL" msgstr "STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export current plate as STL" msgstr "현재 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:474 -msgid "Export plate as STL including supports" -msgstr "서포트를 포함하여 STL파일로 내보내기" +#: src/slic3r/GUI/MainFrame.cpp:489 +msgid "Export plate as STL &including supports" +msgstr "서포트를 포함하여 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:474 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export current plate as STL including supports" msgstr "서포트를 포함 하여 현재 플레이터를 STL로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:477 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export plate as &AMF" msgstr "AMF로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:477 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export current plate as AMF" -msgstr "현재 플레이터를AMF로 내보내기" +msgstr "현재 플레이터를 AMF로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:496 +msgid "Export &toolpaths as OBJ" +msgstr "OBJ로 내보내기 및 공구 경로" + +#: src/slic3r/GUI/MainFrame.cpp:496 +msgid "Export toolpaths as OBJ" +msgstr "도구 경로를 OBJ로 내보내기" + +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export &Config" msgstr "&구성 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export current configuration to file" msgstr "현재 구성을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export Config &Bundle" msgstr "번들 & 내보내기 설정" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export all presets to file" msgstr "모든 이전 설정을 파일로 내보내기" -#: src/slic3r/GUI/MainFrame.cpp:485 +#: src/slic3r/GUI/MainFrame.cpp:506 msgid "&Export" msgstr "&내보내기" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Quick Slice" msgstr "빠른 슬라이스" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Slice a file into a G-code" msgstr "파일을 G 코드로 분할" -#: src/slic3r/GUI/MainFrame.cpp:497 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Quick Slice and Save As" msgstr "빠른 슬라이스 및 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:497 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Slice a file into a G-code, save as" -msgstr "파일을 G 코드로 분할하고 다음으로 저장" +msgstr "파일을 G 코드로 분할하고 다른 이름으로 저장" -#: src/slic3r/GUI/MainFrame.cpp:503 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat Last Quick Slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:503 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat last quick slice" msgstr "마지막으로 빠른 슬라이스 반복" -#: src/slic3r/GUI/MainFrame.cpp:511 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "(Re)Slice No&w" msgstr "지금(다시)자르기" -#: src/slic3r/GUI/MainFrame.cpp:511 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "Start new slicing process" msgstr "새로운 슬라이싱 작업 시작" -#: src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "&Repair STL file" msgstr "STL 파일 복구" -#: src/slic3r/GUI/MainFrame.cpp:515 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "Automatically repair an STL file" msgstr "STL 파일을 자동으로 복구합니다" -#: src/slic3r/GUI/MainFrame.cpp:518 +#: src/slic3r/GUI/MainFrame.cpp:540 msgid "&Quit" msgstr "&종료" -#: src/slic3r/GUI/MainFrame.cpp:518 +#: src/slic3r/GUI/MainFrame.cpp:540 #, c-format msgid "Quit %s" msgstr "%s 종료" -#: src/slic3r/GUI/MainFrame.cpp:543 +#: src/slic3r/GUI/MainFrame.cpp:565 msgid "&Select all" msgstr "&모두 선택 " -#: src/slic3r/GUI/MainFrame.cpp:544 +#: src/slic3r/GUI/MainFrame.cpp:566 msgid "Selects all objects" -msgstr "모든 개체를 선택 합니다" +msgstr "모든 객체(object)를 선택 합니다" -#: src/slic3r/GUI/MainFrame.cpp:546 +#: src/slic3r/GUI/MainFrame.cpp:568 msgid "D&eselect all" -msgstr "선택 취소 D&select+" +msgstr "모든 선택 취소 D&select" -#: src/slic3r/GUI/MainFrame.cpp:547 +#: src/slic3r/GUI/MainFrame.cpp:569 msgid "Deselects all objects" -msgstr "모든 객체 선택 취소" +msgstr "모든 객체(object) 선택 취소" -#: src/slic3r/GUI/MainFrame.cpp:550 +#: src/slic3r/GUI/MainFrame.cpp:572 msgid "&Delete selected" msgstr "&선택 삭제 " -#: src/slic3r/GUI/MainFrame.cpp:551 +#: src/slic3r/GUI/MainFrame.cpp:573 msgid "Deletes the current selection" msgstr "현재 선택 영역을 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:553 +#: src/slic3r/GUI/MainFrame.cpp:575 msgid "Delete &all" msgstr "전부 지움 " -#: src/slic3r/GUI/MainFrame.cpp:554 +#: src/slic3r/GUI/MainFrame.cpp:576 msgid "Deletes all objects" -msgstr "모든 객체를 삭제 합니다" +msgstr "모든 객체(object)를 삭제 합니다" -#: src/slic3r/GUI/MainFrame.cpp:558 +#: src/slic3r/GUI/MainFrame.cpp:580 msgid "&Undo" msgstr "&되돌리기" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/MainFrame.cpp:583 msgid "&Redo" msgstr "&앞으로" -#: src/slic3r/GUI/MainFrame.cpp:566 +#: src/slic3r/GUI/MainFrame.cpp:588 msgid "&Copy" msgstr "&복사 " -#: src/slic3r/GUI/MainFrame.cpp:567 +#: src/slic3r/GUI/MainFrame.cpp:589 msgid "Copy selection to clipboard" msgstr "선택영역을 클립보드로 복사합니다" -#: src/slic3r/GUI/MainFrame.cpp:569 +#: src/slic3r/GUI/MainFrame.cpp:591 msgid "&Paste" msgstr "&붙이기 " -#: src/slic3r/GUI/MainFrame.cpp:570 +#: src/slic3r/GUI/MainFrame.cpp:592 msgid "Paste clipboard" msgstr "클립보드 붙여넣기" -#: src/slic3r/GUI/MainFrame.cpp:579 +#: src/slic3r/GUI/MainFrame.cpp:596 +msgid "Re&load from disk" +msgstr "디스크에서 다시 로드" + +#: src/slic3r/GUI/MainFrame.cpp:597 +msgid "Reload the plater from disk" +msgstr "디스크에서 플래터 다시 로드" + +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "&Plater Tab" msgstr "&선택 및 플래이터 탭" -#: src/slic3r/GUI/MainFrame.cpp:579 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "Show the plater" msgstr "플레이터를 보기" -#: src/slic3r/GUI/MainFrame.cpp:586 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "P&rint Settings Tab" msgstr "프린트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:586 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "Show the print settings" msgstr "인쇄 설정 표시" -#: src/slic3r/GUI/MainFrame.cpp:588 src/slic3r/GUI/MainFrame.cpp:711 +#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:754 msgid "&Filament Settings Tab" msgstr "&필라멘트 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:588 +#: src/slic3r/GUI/MainFrame.cpp:617 msgid "Show the filament settings" msgstr "필라멘트 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:591 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Print&er Settings Tab" msgstr "설정 인쇄 탭" -#: src/slic3r/GUI/MainFrame.cpp:591 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Show the printer settings" msgstr "간단한 설정보기" -#: src/slic3r/GUI/MainFrame.cpp:595 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/MainFrame.cpp:595 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "Show the 3D editing view" msgstr "3D 편집용 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:598 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Pre&view" msgstr "미리 보기" -#: src/slic3r/GUI/MainFrame.cpp:598 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Show the 3D slices preview" msgstr "3D 슬라이스 미리 보기 표시" -#: src/slic3r/GUI/MainFrame.cpp:617 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Print &Host Upload Queue" -msgstr "호스트 업로드 대기열 인쇄" +msgstr "프린터 호스트 업로드 대기" -#: src/slic3r/GUI/MainFrame.cpp:617 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Display the Print Host Upload Queue window" msgstr "호스트 업로드 대기열 인쇄 창 표시" -#: src/slic3r/GUI/MainFrame.cpp:626 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso" msgstr "기본 " -#: src/slic3r/GUI/MainFrame.cpp:626 +#: src/slic3r/GUI/MainFrame.cpp:658 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:630 src/libslic3r/PrintConfig.cpp:2094 +#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2142 +#: src/libslic3r/PrintConfig.cpp:2151 msgid "Top" msgstr "윗부분 " -#: src/slic3r/GUI/MainFrame.cpp:630 +#: src/slic3r/GUI/MainFrame.cpp:662 msgid "Top View" msgstr "위에서 보기" #. TRN To be shown in the main menu View->Bottom #. TRN To be shown in Print Settings "Bottom solid layers" -#: src/slic3r/GUI/MainFrame.cpp:633 src/libslic3r/PrintConfig.cpp:159 +#. TRN To be shown in Print Settings "Top solid layers" +#: src/slic3r/GUI/MainFrame.cpp:665 src/libslic3r/PrintConfig.cpp:164 +#: src/libslic3r/PrintConfig.cpp:173 msgid "Bottom" msgstr "바닥 " -#: src/slic3r/GUI/MainFrame.cpp:633 +#: src/slic3r/GUI/MainFrame.cpp:665 msgid "Bottom View" msgstr "바닥 보기" -#: src/slic3r/GUI/MainFrame.cpp:635 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front" msgstr "앞 " -#: src/slic3r/GUI/MainFrame.cpp:635 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front View" msgstr "앞면 보기 " -#: src/slic3r/GUI/MainFrame.cpp:637 src/libslic3r/PrintConfig.cpp:1611 +#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1641 msgid "Rear" msgstr "뒷면 " -#: src/slic3r/GUI/MainFrame.cpp:637 +#: src/slic3r/GUI/MainFrame.cpp:669 msgid "Rear View" msgstr "뒷면 보기" -#: src/slic3r/GUI/MainFrame.cpp:639 +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left" msgstr "왼쪽 " -#: src/slic3r/GUI/MainFrame.cpp:639 +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left View" msgstr "왼쪽 보기" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right" msgstr "오른쪽 " -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right View" msgstr "오른쪽 보기" -#: src/slic3r/GUI/MainFrame.cpp:648 +#: src/slic3r/GUI/MainFrame.cpp:677 +msgid "Show &labels" +msgstr "레이블 & 표시 " + +#: src/slic3r/GUI/MainFrame.cpp:677 +msgid "Show object/instance labels in 3D scene" +msgstr "3D 장면에서 오브젝트/인스턴스 레이블 표시" + +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Prusa 3D &Drivers" msgstr "푸르사 3D 드라이버" -#: src/slic3r/GUI/MainFrame.cpp:648 +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Open the Prusa3D drivers download page in your browser" msgstr "브라우저에서 Prusa3D 드라이버 다운로드 페이지를 엽니다" -#: src/slic3r/GUI/MainFrame.cpp:650 +#: src/slic3r/GUI/MainFrame.cpp:688 msgid "Software &Releases" msgstr "소프트웨어 &자료" -#: src/slic3r/GUI/MainFrame.cpp:650 +#: src/slic3r/GUI/MainFrame.cpp:688 msgid "Open the software releases page in your browser" msgstr "브라우저에서 소프트웨어 정보 페이지 열기" -#: src/slic3r/GUI/MainFrame.cpp:656 +#: src/slic3r/GUI/MainFrame.cpp:694 #, c-format msgid "%s &Website" msgstr "%s &웹사이트" -#: src/slic3r/GUI/MainFrame.cpp:657 +#: src/slic3r/GUI/MainFrame.cpp:695 #, c-format msgid "Open the %s website in your browser" msgstr "%s 웹사이트를 브라우저에서 열기" -#: src/slic3r/GUI/MainFrame.cpp:663 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "System &Info" msgstr "시스템 정보" -#: src/slic3r/GUI/MainFrame.cpp:663 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show system information" msgstr "시스템 정보 표시" -#: src/slic3r/GUI/MainFrame.cpp:665 +#: src/slic3r/GUI/MainFrame.cpp:703 msgid "Show &Configuration Folder" msgstr "폴더 표시 및 구성" -#: src/slic3r/GUI/MainFrame.cpp:665 +#: src/slic3r/GUI/MainFrame.cpp:703 msgid "Show user configuration folder (datadir)" -msgstr "사용자 구성 폴더 표시 (datadir)" +msgstr "사용자 구성 폴더를 표시 (datadir)" -#: src/slic3r/GUI/MainFrame.cpp:667 +#: src/slic3r/GUI/MainFrame.cpp:705 msgid "Report an I&ssue" msgstr "문제를 보고" -#: src/slic3r/GUI/MainFrame.cpp:667 +#: src/slic3r/GUI/MainFrame.cpp:705 #, c-format msgid "Report an issue on %s" msgstr "%s에 문제 보고" -#: src/slic3r/GUI/MainFrame.cpp:669 +#: src/slic3r/GUI/MainFrame.cpp:707 #, c-format msgid "&About %s" msgstr "%s 에 대하여" -#: src/slic3r/GUI/MainFrame.cpp:669 +#: src/slic3r/GUI/MainFrame.cpp:707 msgid "Show about dialog" msgstr "다이얼로그 표시" -#: src/slic3r/GUI/MainFrame.cpp:672 +#: src/slic3r/GUI/MainFrame.cpp:710 msgid "Show the list of the keyboard shortcuts" msgstr "키보드 단축키 목록 표시" -#: src/slic3r/GUI/MainFrame.cpp:680 +#: src/slic3r/GUI/MainFrame.cpp:723 msgid "&File" msgstr "&파일" -#: src/slic3r/GUI/MainFrame.cpp:681 +#: src/slic3r/GUI/MainFrame.cpp:724 msgid "&Edit" msgstr "&수정" -#: src/slic3r/GUI/MainFrame.cpp:682 +#: src/slic3r/GUI/MainFrame.cpp:725 msgid "&Window" msgstr "&윈도우" -#: src/slic3r/GUI/MainFrame.cpp:683 +#: src/slic3r/GUI/MainFrame.cpp:726 msgid "&View" msgstr "&시점" -#: src/slic3r/GUI/MainFrame.cpp:686 +#: src/slic3r/GUI/MainFrame.cpp:729 msgid "&Help" msgstr "&도움말" -#: src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/MainFrame.cpp:751 msgid "E&xport" msgstr "보내기" -#: src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:752 msgid "S&end to print" msgstr "끝내고 프린트" -#: src/slic3r/GUI/MainFrame.cpp:711 +#: src/slic3r/GUI/MainFrame.cpp:754 msgid "Mate&rial Settings Tab" msgstr "재료(메터리리알) 설정 탭" -#: src/slic3r/GUI/MainFrame.cpp:732 +#: src/slic3r/GUI/MainFrame.cpp:775 msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):" msgstr "슬라이스 할 파일을 선택하십시오 (STL / OBJ / AMF / 3MF / PRUSA):" -#: src/slic3r/GUI/MainFrame.cpp:746 +#: src/slic3r/GUI/MainFrame.cpp:786 msgid "No previously sliced file." msgstr "이전에 분리 된 파일이 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:752 +#: src/slic3r/GUI/MainFrame.cpp:792 msgid "Previously sliced file (" msgstr "이전에 분리 된 파일 (" -#: src/slic3r/GUI/MainFrame.cpp:752 +#: src/slic3r/GUI/MainFrame.cpp:792 msgid ") not found." msgstr ")을 찾을 수 없습니다." -#: src/slic3r/GUI/MainFrame.cpp:753 +#: src/slic3r/GUI/MainFrame.cpp:793 msgid "File Not Found" msgstr "파일을 찾을수 없다" -#: src/slic3r/GUI/MainFrame.cpp:788 +#: src/slic3r/GUI/MainFrame.cpp:828 #, c-format msgid "Save %s file as:" -msgstr "%s 파일을 다음과 같이 저장 합니다" +msgstr "%s 파일을 저장 합니다:" -#: src/slic3r/GUI/MainFrame.cpp:788 +#: src/slic3r/GUI/MainFrame.cpp:828 msgid "SVG" msgstr "Svg" -#: src/slic3r/GUI/MainFrame.cpp:788 +#: src/slic3r/GUI/MainFrame.cpp:828 msgid "G-code" msgstr "G 코드" -#: src/slic3r/GUI/MainFrame.cpp:803 +#: src/slic3r/GUI/MainFrame.cpp:840 msgid "Save zip file as:" msgstr "압축(zip)파일 다른이름 저장:" -#: src/slic3r/GUI/MainFrame.cpp:815 src/slic3r/GUI/Plater.cpp:2933 -#: src/slic3r/GUI/Plater.cpp:4418 src/slic3r/GUI/Tab.cpp:1170 -#: src/slic3r/GUI/Tab.cpp:3700 +#: src/slic3r/GUI/MainFrame.cpp:849 src/slic3r/GUI/Plater.cpp:3107 +#: src/slic3r/GUI/Plater.cpp:5126 src/slic3r/GUI/Tab.cpp:1211 +#: src/slic3r/GUI/Tab.cpp:3634 msgid "Slicing" msgstr "슬라이싱" #. TRN "Processing input_file_basename" -#: src/slic3r/GUI/MainFrame.cpp:817 +#: src/slic3r/GUI/MainFrame.cpp:851 #, c-format msgid "Processing %s" msgstr "처리 %s" -#: src/slic3r/GUI/MainFrame.cpp:840 +#: src/slic3r/GUI/MainFrame.cpp:874 msgid " was successfully sliced." msgstr " 성공적으로 슬라이스." -#: src/slic3r/GUI/MainFrame.cpp:842 +#: src/slic3r/GUI/MainFrame.cpp:876 msgid "Slicing Done!" msgstr "슬라이스 완료!" -#: src/slic3r/GUI/MainFrame.cpp:857 +#: src/slic3r/GUI/MainFrame.cpp:891 msgid "Select the STL file to repair:" msgstr "복구 할 STL 파일을 선택하십시오:" -#: src/slic3r/GUI/MainFrame.cpp:870 +#: src/slic3r/GUI/MainFrame.cpp:901 msgid "Save OBJ file (less prone to coordinate errors than STL) as:" msgstr "OBJ 파일을 저장하십시오 (STL보다 오류를 덜 조정할 가능성이 적음):" -#: src/slic3r/GUI/MainFrame.cpp:885 +#: src/slic3r/GUI/MainFrame.cpp:913 msgid "Your file was repaired." msgstr "파일이 복구되었습니다." -#: src/slic3r/GUI/MainFrame.cpp:885 src/libslic3r/PrintConfig.cpp:3221 +#: src/slic3r/GUI/MainFrame.cpp:913 src/libslic3r/PrintConfig.cpp:3442 msgid "Repair" msgstr "수정" -#: src/slic3r/GUI/MainFrame.cpp:899 +#: src/slic3r/GUI/MainFrame.cpp:927 msgid "Save configuration as:" msgstr "구성을 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:919 src/slic3r/GUI/MainFrame.cpp:983 +#: src/slic3r/GUI/MainFrame.cpp:946 src/slic3r/GUI/MainFrame.cpp:1008 msgid "Select configuration to load:" -msgstr "로드 할 구성 선택 :" +msgstr "불러올 구성 선택 :" -#: src/slic3r/GUI/MainFrame.cpp:956 +#: src/slic3r/GUI/MainFrame.cpp:982 msgid "Save presets bundle as:" -msgstr "이전 설정 번들을 다음과 같이 저장 :" +msgstr "이전 번들 설정을 다음과 같이 저장 :" -#: src/slic3r/GUI/MainFrame.cpp:1007 +#: src/slic3r/GUI/MainFrame.cpp:1029 #, c-format msgid "%d presets successfully imported." msgstr "% d 사전 설정을 가져 왔습니다." +#: src/slic3r/GUI/Mouse3DController.cpp:291 +msgid "3Dconnexion settings" +msgstr "3Dconnexion 설정" + +#: src/slic3r/GUI/Mouse3DController.cpp:306 +msgid "Device:" +msgstr "장치:" + +#: src/slic3r/GUI/Mouse3DController.cpp:313 +msgid "Speed:" +msgstr "스피드:" + +#: src/slic3r/GUI/Mouse3DController.cpp:317 +#: src/slic3r/GUI/Mouse3DController.cpp:337 +#: src/slic3r/GUI/Mouse3DController.cpp:339 +msgid "Translation" +msgstr "번역" + +#: src/slic3r/GUI/Mouse3DController.cpp:326 +#: src/slic3r/GUI/Mouse3DController.cpp:337 +msgid "Zoom" +msgstr "확대" + +#: src/slic3r/GUI/Mouse3DController.cpp:332 +msgid "Deadzone:" +msgstr "데드존:" + #: src/slic3r/GUI/MsgDialog.cpp:73 #, c-format msgid "%s error" @@ -2927,137 +3945,184 @@ msgstr "%s 오류" msgid "%s has encountered an error" msgstr "%s에 오류가 발생 했습니다" -#: src/slic3r/GUI/Plater.cpp:146 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:56 +msgid "Instances" +msgstr "복제본" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:60 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:216 +#, c-format +msgid "Instance %d" +msgstr "복제본 %d" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3482 +#: src/slic3r/GUI/Tab.cpp:3572 +msgid "Layers" +msgstr "레이어" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +msgid "Range" +msgstr "범위" + +#: src/slic3r/GUI/OptionsGroup.cpp:249 +msgctxt "Layers" +msgid "Top" +msgstr "윗부분 " + +#: src/slic3r/GUI/OptionsGroup.cpp:249 +msgctxt "Layers" +msgid "Bottom" +msgstr "바닥 " + +#: src/slic3r/GUI/Plater.cpp:163 msgid "Volume" msgstr "크기" -#: src/slic3r/GUI/Plater.cpp:147 +#: src/slic3r/GUI/Plater.cpp:164 msgid "Facets" msgstr "측면" -#: src/slic3r/GUI/Plater.cpp:148 +#: src/slic3r/GUI/Plater.cpp:165 msgid "Materials" msgstr "재료" -#: src/slic3r/GUI/Plater.cpp:151 +#: src/slic3r/GUI/Plater.cpp:168 msgid "Manifold" msgstr "많은" -#: src/slic3r/GUI/Plater.cpp:201 +#: src/slic3r/GUI/Plater.cpp:218 msgid "Sliced Info" msgstr "슬라이스된 정보" -#: src/slic3r/GUI/Plater.cpp:220 src/slic3r/GUI/Plater.cpp:1135 +#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1226 msgid "Used Filament (m)" msgstr "사용자 필라멘트 (m)" -#: src/slic3r/GUI/Plater.cpp:221 +#: src/slic3r/GUI/Plater.cpp:238 msgid "Used Filament (mm³)" msgstr "사용자 필라멘트 (mm³)" -#: src/slic3r/GUI/Plater.cpp:222 +#: src/slic3r/GUI/Plater.cpp:239 msgid "Used Filament (g)" msgstr "사용자 필라멘트 (g)" -#: src/slic3r/GUI/Plater.cpp:223 +#: src/slic3r/GUI/Plater.cpp:240 msgid "Used Material (unit)" msgstr "사용 재료 (단위)" -#: src/slic3r/GUI/Plater.cpp:224 src/slic3r/GUI/Plater.cpp:1150 -#: src/libslic3r/PrintConfig.cpp:742 -msgid "Cost" -msgstr "비용" +#: src/slic3r/GUI/Plater.cpp:241 +msgid "Cost (money)" +msgstr "비용 (돈)" -#: src/slic3r/GUI/Plater.cpp:225 src/slic3r/GUI/Plater.cpp:1122 -#: src/slic3r/GUI/Plater.cpp:1164 +#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1213 +#: src/slic3r/GUI/Plater.cpp:1255 msgid "Estimated printing time" msgstr "예상 인쇄 시간" -#: src/slic3r/GUI/Plater.cpp:226 +#: src/slic3r/GUI/Plater.cpp:243 msgid "Number of tool changes" msgstr "공구(tool) 변경 수" -#: src/slic3r/GUI/Plater.cpp:317 +#: src/slic3r/GUI/Plater.cpp:340 msgid "Click to edit preset" msgstr "사전 설정을 편집 하려면 클릭 하십시오" -#: src/slic3r/GUI/Plater.cpp:469 +#: src/slic3r/GUI/Plater.cpp:495 msgid "Select what kind of support do you need" msgstr "서포트의 종류를 선택하세요" -#: src/slic3r/GUI/Plater.cpp:471 src/libslic3r/PrintConfig.cpp:1865 -#: src/libslic3r/PrintConfig.cpp:2529 +#: src/slic3r/GUI/Plater.cpp:497 src/libslic3r/PrintConfig.cpp:1911 +#: src/libslic3r/PrintConfig.cpp:2675 msgid "Support on build plate only" msgstr "출력물만 서포트를 지지" -#: src/slic3r/GUI/Plater.cpp:472 src/slic3r/GUI/Plater.cpp:587 +#: src/slic3r/GUI/Plater.cpp:498 src/slic3r/GUI/Plater.cpp:621 msgid "For support enforcers only" msgstr "서포트 지원영역 전용" -#: src/slic3r/GUI/Plater.cpp:473 +#: src/slic3r/GUI/Plater.cpp:499 msgid "Everywhere" msgstr "모든곳" -#: src/slic3r/GUI/Plater.cpp:505 src/slic3r/GUI/Tab.cpp:1067 +#: src/slic3r/GUI/Plater.cpp:531 src/slic3r/GUI/Tab.cpp:1107 msgid "Brim" msgstr "브림" -#: src/slic3r/GUI/Plater.cpp:507 +#: src/slic3r/GUI/Plater.cpp:533 msgid "" "This flag enables the brim that will be printed around each object on the " "first layer." -msgstr "" -"이 플래그는 첫 번째 레이어의 각 개체 주위에 인쇄 될 브림을 활성화합니다." +msgstr "첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 브림을 활성화합니다." -#: src/slic3r/GUI/Plater.cpp:515 +#: src/slic3r/GUI/Plater.cpp:541 msgid "Purging volumes" -msgstr "볼륨 삭제" +msgstr "퍼징 조절" -#: src/slic3r/GUI/Plater.cpp:766 +#: src/slic3r/GUI/Plater.cpp:635 +msgid "Select what kind of pad do you need" +msgstr "필요한 패드 종류를 선택하십시오." + +#: src/slic3r/GUI/Plater.cpp:637 +msgid "Below object" +msgstr "개체 아래" + +#: src/slic3r/GUI/Plater.cpp:638 +msgid "Around object" +msgstr "개체 주위" + +#: src/slic3r/GUI/Plater.cpp:812 msgid "Print settings" msgstr "프린트 설정" -#: src/slic3r/GUI/Plater.cpp:767 src/slic3r/GUI/Tab.cpp:1604 -#: src/slic3r/GUI/Tab.cpp:1605 +#: src/slic3r/GUI/Plater.cpp:813 src/slic3r/GUI/Tab.cpp:1419 +#: src/slic3r/GUI/Tab.cpp:1420 msgid "Filament" msgstr "필라멘트" -#: src/slic3r/GUI/Plater.cpp:768 +#: src/slic3r/GUI/Plater.cpp:814 msgid "SLA print settings" msgstr "SLA 인쇄 설정" -#: src/slic3r/GUI/Plater.cpp:769 src/slic3r/GUI/Preset.cpp:1310 +#: src/slic3r/GUI/Plater.cpp:815 src/slic3r/GUI/Preset.cpp:1455 msgid "SLA material" msgstr "SLA 재료" -#: src/slic3r/GUI/Plater.cpp:770 +#: src/slic3r/GUI/Plater.cpp:816 msgid "Printer" msgstr "프린터" -#: src/slic3r/GUI/Plater.cpp:820 src/slic3r/GUI/Plater.cpp:4688 +#: src/slic3r/GUI/Plater.cpp:875 src/slic3r/GUI/Plater.cpp:5545 msgid "Send to printer" msgstr "프린터로 보내기" -#: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Plater.cpp:2933 -#: src/slic3r/GUI/Plater.cpp:4421 -msgid "Slice now" -msgstr "지금 자르기" +#: src/slic3r/GUI/Plater.cpp:876 +msgid "Remove device" +msgstr "장치 제거" -#: src/slic3r/GUI/Plater.cpp:963 +#: src/slic3r/GUI/Plater.cpp:877 +msgid "Export to SD card/ USB thumb drive" +msgstr "SD 카드/USB 썸 드라이브로 내보내기" + +#: src/slic3r/GUI/Plater.cpp:889 src/slic3r/GUI/Plater.cpp:3107 +#: src/slic3r/GUI/Plater.cpp:5129 +msgid "Slice now" +msgstr "바로 슬라이스" + +#: src/slic3r/GUI/Plater.cpp:1039 msgid "Hold Shift to Slice & Export G-code" msgstr "Shift 키를 누른 채 G 코드 내보내기" -#: src/slic3r/GUI/Plater.cpp:1068 +#: src/slic3r/GUI/Plater.cpp:1149 #, c-format msgid "%d (%d shells)" msgstr "% d (% d 쉘)" -#: src/slic3r/GUI/Plater.cpp:1073 +#: src/slic3r/GUI/Plater.cpp:1154 #, c-format msgid "Auto-repaired (%d errors)" msgstr "오류자동수정 (%d errors)" -#: src/slic3r/GUI/Plater.cpp:1076 +#: src/slic3r/GUI/Plater.cpp:1157 #, c-format msgid "" "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d " @@ -3066,442 +4131,483 @@ msgstr "" "%d 면 고정, %d 모서리 고정, %d 면 제거, %d 면 추가, %d 면 반전, %d 후방 모서" "리" -#: src/slic3r/GUI/Plater.cpp:1086 +#: src/slic3r/GUI/Plater.cpp:1167 msgid "Yes" msgstr "예" -#: src/slic3r/GUI/Plater.cpp:1109 +#: src/slic3r/GUI/Plater.cpp:1188 msgid "Used Material (ml)" msgstr "사용 재료 (ml)" -#: src/slic3r/GUI/Plater.cpp:1112 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "object(s)" -msgstr "개체(들)" +msgstr "객체(object)" -#: src/slic3r/GUI/Plater.cpp:1112 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "supports and pad" msgstr "지지대 및 패드" -#: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 +#: src/slic3r/GUI/Plater.cpp:1228 src/slic3r/GUI/Plater.cpp:1243 msgid "objects" -msgstr "개체" +msgstr "객체들(objects)" -#: src/slic3r/GUI/Plater.cpp:1137 src/slic3r/GUI/Plater.cpp:1152 +#: src/slic3r/GUI/Plater.cpp:1228 src/slic3r/GUI/Plater.cpp:1243 msgid "wipe tower" msgstr "와이프 타워(Wipe tower)" -#: src/slic3r/GUI/Plater.cpp:1167 +#: src/slic3r/GUI/Plater.cpp:1241 src/libslic3r/PrintConfig.cpp:761 +#: src/libslic3r/PrintConfig.cpp:2511 src/libslic3r/PrintConfig.cpp:2512 +msgid "Cost" +msgstr "비용" + +#: src/slic3r/GUI/Plater.cpp:1258 msgid "normal mode" msgstr "일반 모드" -#: src/slic3r/GUI/Plater.cpp:1171 src/slic3r/GUI/Plater.cpp:1180 -msgid "Color " -msgstr "색" +#: src/slic3r/GUI/Plater.cpp:1262 src/slic3r/GUI/Plater.cpp:1271 +#: src/libslic3r/PrintConfig.cpp:583 +msgid "Color" +msgstr "색상" -#: src/slic3r/GUI/Plater.cpp:1176 +#: src/slic3r/GUI/Plater.cpp:1267 msgid "stealth mode" msgstr "스텔스 모드" -#: src/slic3r/GUI/Plater.cpp:1271 +#: src/slic3r/GUI/Plater.cpp:1375 msgid "Load File" msgstr "파일 로드" -#: src/slic3r/GUI/Plater.cpp:1275 +#: src/slic3r/GUI/Plater.cpp:1379 msgid "Load Files" msgstr "파일 로드" -#: src/slic3r/GUI/Plater.cpp:1503 -msgid "ERROR: not enough resources to execute a new job." -msgstr "오류: 새 작업을 실행하기에 충분한 리소스가 아닙니다." - -#: src/slic3r/GUI/Plater.cpp:2056 +#: src/slic3r/GUI/Plater.cpp:2137 msgid "New Project" msgstr "새로운 프로젝트" -#: src/slic3r/GUI/Plater.cpp:2173 +#: src/slic3r/GUI/Plater.cpp:2259 msgid "Loading" msgstr "로딩" -#: src/slic3r/GUI/Plater.cpp:2183 +#: src/slic3r/GUI/Plater.cpp:2269 #, c-format -msgid "Processing input file %s\n" -msgstr "입력 파일 처리 %s\n" +msgid "Processing input file %s" +msgstr "입력 파일 처리 %s" -#: src/slic3r/GUI/Plater.cpp:2211 -msgid "" -"You can't to load SLA project if there is at least one multi-part object on " -"the bed" +#: src/slic3r/GUI/Plater.cpp:2297 +msgid "You cannot load SLA project with a multi-part object on the bed" msgstr "" -"침대에 다중 부품 개체가 하나 이상 있는 경우 SLA 프로젝트를 로드할 수 없습니" -"다." +"배드에 여러 부분으로 구성된 객체가 있는 SLA 프로젝트를 로드할 수 없습니다." -#: src/slic3r/GUI/Plater.cpp:2212 src/slic3r/GUI/Tab.cpp:3064 +#: src/slic3r/GUI/Plater.cpp:2298 src/slic3r/GUI/Tab.cpp:2929 msgid "Please check your object list before preset changing." -msgstr "사전 설정을 변경 하기 전에 개체 목록을 확인 하십시오." +msgstr "사전 설정을 변경 하기 전에 객체(object) 목록을 확인 하십시오." -#: src/slic3r/GUI/Plater.cpp:2255 +#: src/slic3r/GUI/Plater.cpp:2343 msgid "" -"This file contains several objects positioned at multiple heights. Instead " -"of considering them as multiple objects, should I consider\n" -"this file as a single object having multiple parts?\n" +"This file contains several objects positioned at multiple heights.\n" +"Instead of considering them as multiple objects, should I consider\n" +"this file as a single object having multiple parts?" msgstr "" -"이 파일에는 여러 높이에 위치한 여러 객체가 들어 있습니다. 여러 객체로 간주하" +"이 파일에는 여러 높이마다 객체(object)가 있습니다. 여러 객체(object)로 간주하" "는 대신,\n" -"이 파일은 여러 부분을 갖는 단일 객체로 보입니까?\n" +"이 파일은 여러 부품을 갖는 단일 객체(object)로 보입니까?" -#: src/slic3r/GUI/Plater.cpp:2258 src/slic3r/GUI/Plater.cpp:2310 +#: src/slic3r/GUI/Plater.cpp:2346 src/slic3r/GUI/Plater.cpp:2399 msgid "Multi-part object detected" -msgstr "다중 부품 객체가 감지" +msgstr "다중 부품(Part) 객체(object)가 감지" -#: src/slic3r/GUI/Plater.cpp:2265 +#: src/slic3r/GUI/Plater.cpp:2353 msgid "" "This file cannot be loaded in a simple mode. Do you want to switch to an " -"advanced mode?\n" +"advanced mode?" msgstr "" -"이 파일은 단순 모드에서 로드할 수 없습니다. 고급 모드로 전환 하시겠습니까?\n" +"이 파일은 기본 모드에서 로드할 수 없습니다. 고급 모드로 전환 하시겠습니까?" -#: src/slic3r/GUI/Plater.cpp:2266 +#: src/slic3r/GUI/Plater.cpp:2354 msgid "Detected advanced data" msgstr "감지된 고급 데이터" -#: src/slic3r/GUI/Plater.cpp:2287 +#: src/slic3r/GUI/Plater.cpp:2376 #, c-format msgid "" "You can't to add the object(s) from %s because of one or some of them " "is(are) multi-part" -msgstr "멀티파트 하나 또는 그 중 일부 때문에 %s에서 개체를 추가 할 수 없습니다" +msgstr "" +"다중 부품(Part) 하나 또는 그 중 일부 때문에 %s에서 객체(object)를 추가 할 수 " +"없습니다" -#: src/slic3r/GUI/Plater.cpp:2307 +#: src/slic3r/GUI/Plater.cpp:2396 msgid "" "Multiple objects were loaded for a multi-material printer.\n" "Instead of considering them as multiple objects, should I consider\n" -"these files to represent a single object having multiple parts?\n" +"these files to represent a single object having multiple parts?" msgstr "" -"다중 재료 프린터에 대해 여러 객체가로드되었습니다.\n" -"여러 객체로 간주하는 대신,\n" -"이 파일들은 여러 부분을 갖는 단일 객체를 나타낼 수 있습니까?\n" +"다중 재료 프린터에 대해 여러 객체(object)가로드되었습니다.\n" +"여러 객체(object)로 간주하는 대신,\n" +"이 파일들은 여러 부분을 갖는 단일 객체(object)를 나타낼 수 있습니까?" -#: src/slic3r/GUI/Plater.cpp:2323 +#: src/slic3r/GUI/Plater.cpp:2412 msgid "Loaded" msgstr "로드(loaded)" -#: src/slic3r/GUI/Plater.cpp:2418 +#: src/slic3r/GUI/Plater.cpp:2514 msgid "" "Your object appears to be too large, so it was automatically scaled down to " "fit your print bed." -msgstr "개체가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." +msgstr "객체(object)가 너무 커서 인쇄물에 맞게 자동으로 축소되었습니다." -#: src/slic3r/GUI/Plater.cpp:2419 +#: src/slic3r/GUI/Plater.cpp:2515 msgid "Object too large?" -msgstr "개체가 너무 큽니까?" +msgstr "객체(object)가 너무 큽니까?" -#: src/slic3r/GUI/Plater.cpp:2476 +#: src/slic3r/GUI/Plater.cpp:2577 msgid "Export STL file:" msgstr "STL 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2483 +#: src/slic3r/GUI/Plater.cpp:2584 msgid "Export AMF file:" msgstr "AMF 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2489 +#: src/slic3r/GUI/Plater.cpp:2590 msgid "Save file as:" msgstr "다른 이름으로 파일 저장:" -#: src/slic3r/GUI/Plater.cpp:2592 -msgid "Delete Object" -msgstr "오브젝트 지우기" +#: src/slic3r/GUI/Plater.cpp:2596 +msgid "Export OBJ file:" +msgstr "OBJ 파일 내보내기:" -#: src/slic3r/GUI/Plater.cpp:2603 +#: src/slic3r/GUI/Plater.cpp:2698 +msgid "Delete Object" +msgstr "객체(object) 지우기" + +#: src/slic3r/GUI/Plater.cpp:2709 msgid "Reset Project" msgstr "프로젝트 재설정" -#: src/slic3r/GUI/Plater.cpp:2630 src/slic3r/GUI/Plater.cpp:3517 -msgid "Mirror" -msgstr "반전(Mirror)" +#: src/slic3r/GUI/Plater.cpp:2746 +msgid "Hollow" +msgstr "속비우기" -#: src/slic3r/GUI/Plater.cpp:2643 +#: src/slic3r/GUI/Plater.cpp:2753 msgid "Optimize Rotation" msgstr "회전 최적화" -#: src/slic3r/GUI/Plater.cpp:2689 +#: src/slic3r/GUI/Plater.cpp:2799 msgid "Arranging" msgstr "정렬" -#: src/slic3r/GUI/Plater.cpp:2712 +#: src/slic3r/GUI/Plater.cpp:2821 msgid "Could not arrange model objects! Some geometries may be invalid." msgstr "" -"모델 개체를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니다." +"모델 객체(object)를 정렬할 수 없습니다. 일부 형상은 유효 하지 않을 수 있습니" +"다." -#: src/slic3r/GUI/Plater.cpp:2718 +#: src/slic3r/GUI/Plater.cpp:2827 msgid "Arranging canceled." msgstr "취소 된 정렬" -#: src/slic3r/GUI/Plater.cpp:2719 +#: src/slic3r/GUI/Plater.cpp:2828 msgid "Arranging done." msgstr "정렬 완료." -#: src/slic3r/GUI/Plater.cpp:2735 +#: src/slic3r/GUI/Plater.cpp:2844 msgid "Searching for optimal orientation" msgstr "최적의 방향 검색" -#: src/slic3r/GUI/Plater.cpp:2768 +#: src/slic3r/GUI/Plater.cpp:2877 msgid "Orientation search canceled." -msgstr "오리엔테이션 검색이 취소 됨" +msgstr "방향 검색이 취소되었습니다." -#: src/slic3r/GUI/Plater.cpp:2769 +#: src/slic3r/GUI/Plater.cpp:2878 msgid "Orientation found." msgstr "방향을 찾았습니다." -#: src/slic3r/GUI/Plater.cpp:2785 +#: src/slic3r/GUI/Plater.cpp:2908 +msgid "Indexing hollowed object" +msgstr "빈 개체 인덱싱" + +#: src/slic3r/GUI/Plater.cpp:2912 +msgid "Hollowing cancelled." +msgstr "공동화 취소." + +#: src/slic3r/GUI/Plater.cpp:2913 +msgid "Hollowing done." +msgstr "속을 비움니다." + +#: src/slic3r/GUI/Plater.cpp:2915 +msgid "Hollowing failed." +msgstr "공동화를 실패했습니다." + +#: src/slic3r/GUI/Plater.cpp:2956 msgid "" "The selected object can't be split because it contains more than one volume/" "material." msgstr "" -"선택한 객체는 둘 이상의 볼륨 / 재료가 포함되어 있기 때문에 분할 할 수 없습니" -"다." +"선택한 객체(object)는 둘 이상의 부품/재료가 포함되어 있기 때문에 분할 할 수 " +"없습니다." -#: src/slic3r/GUI/Plater.cpp:2796 +#: src/slic3r/GUI/Plater.cpp:2967 msgid "Split to Objects" -msgstr "객체로 분할" +msgstr "객체(object)로 분할" -#: src/slic3r/GUI/Plater.cpp:2918 +#: src/slic3r/GUI/Plater.cpp:3092 msgid "Invalid data" msgstr "잘못 된 데이터" -#: src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/Plater.cpp:3101 msgid "Ready to slice" msgstr "슬라이스 준비" -#: src/slic3r/GUI/Plater.cpp:2965 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3139 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "취소 중" -#: src/slic3r/GUI/Plater.cpp:2982 +#: src/slic3r/GUI/Plater.cpp:3156 msgid "Another export job is currently running." msgstr "다른 내보내기 작업이 현재 실행 중입니다." -#: src/slic3r/GUI/Plater.cpp:3036 src/slic3r/GUI/Plater.cpp:3493 -msgid "Reload from Disk" -msgstr "디스크에서 다시 불러오기" +#: src/slic3r/GUI/Plater.cpp:3274 +msgid "Please select the file to reload" +msgstr "다시 로드할 파일을 선택하십시오." -#: src/slic3r/GUI/Plater.cpp:3072 +#: src/slic3r/GUI/Plater.cpp:3309 +msgid "It is not allowed to change the file to reload" +msgstr "다시 로드할 파일을 변경할 수 없습니다." + +#: src/slic3r/GUI/Plater.cpp:3309 +msgid "Do you want to retry" +msgstr "다시 시도하시겠습니까?" + +#: src/slic3r/GUI/Plater.cpp:3330 +msgid "Reload from: " +msgstr "다음에서 다시 로드합니다." + +#: src/slic3r/GUI/Plater.cpp:3438 +msgid "Unable to reload:" +msgstr "다시 로드할 수 없음:" + +#: src/slic3r/GUI/Plater.cpp:3443 +msgid "Error during reload" +msgstr "다시 로드하는 동안 오류" + +#: src/slic3r/GUI/Plater.cpp:3463 +msgid "Reload all from disk" +msgstr "디스크에서 모두 다시 로드" + +#: src/slic3r/GUI/Plater.cpp:3484 msgid "Fix Throught NetFabb" msgstr "NetFabb으로 수정" -#: src/slic3r/GUI/Plater.cpp:3254 +#: src/slic3r/GUI/Plater.cpp:3675 msgid "Export failed" msgstr "내보내기 실패" -#: src/slic3r/GUI/Plater.cpp:3259 src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/Plater.cpp:3680 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "취소됨" -#: src/slic3r/GUI/Plater.cpp:3347 src/slic3r/GUI/Plater.cpp:3359 -#: src/slic3r/GUI/Plater.cpp:3473 -msgid "Increase copies" -msgstr "복사본 늘리기" - -#: src/slic3r/GUI/Plater.cpp:3467 src/slic3r/GUI/Plater.cpp:3486 +#: src/slic3r/GUI/Plater.cpp:3942 src/slic3r/GUI/Plater.cpp:3969 msgid "Remove the selected object" -msgstr "선택한 객체 제거" +msgstr "선택한 객체(object) 제거" -#: src/slic3r/GUI/Plater.cpp:3473 -msgid "Place one more copy of the selected object" -msgstr "선택한 객체를 하나 더 복사합니다" +#: src/slic3r/GUI/Plater.cpp:3956 +msgid "Add one more instance of the selected object" +msgstr "선택한 개체의 인스턴스를 하나 더 추가합니다." -#: src/slic3r/GUI/Plater.cpp:3475 -msgid "Decrease copies" -msgstr "복사본 감소" +#: src/slic3r/GUI/Plater.cpp:3958 +msgid "Remove one instance of the selected object" +msgstr "선택한 개체의 인스턴스 하나 제거" -#: src/slic3r/GUI/Plater.cpp:3475 -msgid "Remove one copy of the selected object" -msgstr "선택한 객체 복사본 하나 삭제" +#: src/slic3r/GUI/Plater.cpp:3960 +msgid "Set number of instances" +msgstr "복제할 수량 설정" -#: src/slic3r/GUI/Plater.cpp:3477 -msgid "Set number of copies" -msgstr "복사될 수량 설정" +#: src/slic3r/GUI/Plater.cpp:3960 +msgid "Change the number of instances of the selected object" +msgstr "선택한 객체의 인스턴스 수 변경" -#: src/slic3r/GUI/Plater.cpp:3477 -msgid "Change the number of copies of the selected object" -msgstr "선택한 개체의 복사본 수 변경" +#: src/slic3r/GUI/Plater.cpp:3980 src/slic3r/GUI/Plater.cpp:3983 +msgid "Reload the selected object from disk" +msgstr "디스크에서 선택한 개체 다시 로드" -#: src/slic3r/GUI/Plater.cpp:3493 -msgid "Reload the selected file from Disk" -msgstr "디스크에서 다시 불러오기" - -#: src/slic3r/GUI/Plater.cpp:3496 +#: src/slic3r/GUI/Plater.cpp:3987 msgid "Export the selected object as STL file" -msgstr "선택한 객체를 STL 파일로 내보내기" +msgstr "선택한 객체(object)를 STL 파일로 내보내기" -#: src/slic3r/GUI/Plater.cpp:3510 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "Along X axis" msgstr "X 축을 따라" -#: src/slic3r/GUI/Plater.cpp:3510 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "Mirror the selected object along the X axis" -msgstr "선택한 객체를 X 축을 따라 반전합니다" +msgstr "선택한 객체(object)를 X 축을 따라 반전합니다" -#: src/slic3r/GUI/Plater.cpp:3512 +#: src/slic3r/GUI/Plater.cpp:4018 msgid "Along Y axis" msgstr "Y 축을 따라" -#: src/slic3r/GUI/Plater.cpp:3512 +#: src/slic3r/GUI/Plater.cpp:4018 msgid "Mirror the selected object along the Y axis" -msgstr "선택한 객체를 Y 축을 따라 반전합니다" +msgstr "선택한 객체(object)를 Y 축을 따라 반전합니다" -#: src/slic3r/GUI/Plater.cpp:3514 +#: src/slic3r/GUI/Plater.cpp:4020 msgid "Along Z axis" msgstr "Z 축 따라" -#: src/slic3r/GUI/Plater.cpp:3514 +#: src/slic3r/GUI/Plater.cpp:4020 msgid "Mirror the selected object along the Z axis" -msgstr "선택한 객체를 Z 축을 따라 반전합니다" +msgstr "선택한 객체(object)를 Z 축을 따라 반전합니다" -#: src/slic3r/GUI/Plater.cpp:3517 +#: src/slic3r/GUI/Plater.cpp:4023 +msgid "Mirror" +msgstr "반전(Mirror)" + +#: src/slic3r/GUI/Plater.cpp:4023 msgid "Mirror the selected object" msgstr "반전할 객제를 선택" -#: src/slic3r/GUI/Plater.cpp:3529 +#: src/slic3r/GUI/Plater.cpp:4035 msgid "To objects" -msgstr "개체에" +msgstr "객체(object)에" -#: src/slic3r/GUI/Plater.cpp:3529 src/slic3r/GUI/Plater.cpp:3549 +#: src/slic3r/GUI/Plater.cpp:4035 src/slic3r/GUI/Plater.cpp:4055 msgid "Split the selected object into individual objects" -msgstr "선택한 개체를 개별 개체로 분할 합니다." +msgstr "선택한 객체(object)를 개별 객체(object)로 분할 합니다." -#: src/slic3r/GUI/Plater.cpp:3531 +#: src/slic3r/GUI/Plater.cpp:4037 msgid "To parts" -msgstr "부품에" +msgstr "부품(Part)에" -#: src/slic3r/GUI/Plater.cpp:3531 src/slic3r/GUI/Plater.cpp:3563 +#: src/slic3r/GUI/Plater.cpp:4037 src/slic3r/GUI/Plater.cpp:4069 msgid "Split the selected object into individual sub-parts" -msgstr "선택한 오브젝트를 개별 하위 파트로 분할" +msgstr "선택한 객체(object)를 개별 하위 부품(Part)으로 분할" -#: src/slic3r/GUI/Plater.cpp:3534 src/slic3r/GUI/Plater.cpp:3549 -#: src/slic3r/GUI/Plater.cpp:3563 src/libslic3r/PrintConfig.cpp:3245 +#: src/slic3r/GUI/Plater.cpp:4040 src/slic3r/GUI/Plater.cpp:4055 +#: src/slic3r/GUI/Plater.cpp:4069 src/libslic3r/PrintConfig.cpp:3466 msgid "Split" msgstr "쪼개기" -#: src/slic3r/GUI/Plater.cpp:3534 +#: src/slic3r/GUI/Plater.cpp:4040 msgid "Split the selected object" -msgstr "선택한 개체 분할" +msgstr "선택한 객체(object) 분할" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:4061 msgid "Optimize orientation" msgstr "방향 최적화" -#: src/slic3r/GUI/Plater.cpp:3555 +#: src/slic3r/GUI/Plater.cpp:4061 msgid "Optimize the rotation of the object for better print results." -msgstr "더 나은 인쇄 결과를 위해 개체의 회전을 최적화합니다." +msgstr "더 나은 인쇄 결과를 위해 객체(object)의 회전을 최적화합니다." -#: src/slic3r/GUI/Plater.cpp:3595 +#: src/slic3r/GUI/Plater.cpp:4120 msgid "3D editor view" msgstr "3D 편집화면 보기" -#: src/slic3r/GUI/Plater.cpp:3603 src/slic3r/GUI/Tab.cpp:2534 +#: src/slic3r/GUI/Plater.cpp:4128 src/slic3r/GUI/Tab.cpp:2372 msgid "Preview" -msgstr "프리뷰" +msgstr "미리보기" -#: src/slic3r/GUI/Plater.cpp:3831 +#: src/slic3r/GUI/Plater.cpp:4422 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% 프린터가 대상 재생 취소/다시 작업 스냅샷을 생성할 때 활성화되었습니다. " -"%1% 프린터로 전환하려면 %1% 사전 설정을 다시 로드해야 합니다." +"%1% 프린터가 대상을 '되돌리기/취소하기' 작업 구성을 생성할 때 활성화되었습니" +"다. %1% 프린터로 전환하려면 %1% 사전 설정을 다시 불러와야 합니다." -#: src/slic3r/GUI/Plater.cpp:3992 +#: src/slic3r/GUI/Plater.cpp:4597 msgid "Load Project" -msgstr "프로젝트 로드" +msgstr "프로젝트 불러오기" -#: src/slic3r/GUI/Plater.cpp:4016 +#: src/slic3r/GUI/Plater.cpp:4625 msgid "Import Object" -msgstr "개체 가져오기" +msgstr "객체(object) 가져오기" -#: src/slic3r/GUI/Plater.cpp:4020 +#: src/slic3r/GUI/Plater.cpp:4629 msgid "Import Objects" -msgstr "객체 가져오기" +msgstr "객체(object) 가져오기" -#: src/slic3r/GUI/Plater.cpp:4075 -msgid "All objects will be removed, continue ?" -msgstr "모든 개체가 제거 됩니다, 계속합니까?" +#: src/slic3r/GUI/Plater.cpp:4693 +msgid "All objects will be removed, continue?" +msgstr "모든 객체(object)가 제거 됩니다, 계속합니까?" -#: src/slic3r/GUI/Plater.cpp:4083 +#: src/slic3r/GUI/Plater.cpp:4701 msgid "Delete Selected Objects" -msgstr "선택한 객체 삭제" +msgstr "선택한 객체(object) 삭제" -#: src/slic3r/GUI/Plater.cpp:4091 +#: src/slic3r/GUI/Plater.cpp:4709 msgid "Increase Instances" msgstr "복제본 늘리기" -#: src/slic3r/GUI/Plater.cpp:4127 +#: src/slic3r/GUI/Plater.cpp:4744 msgid "Decrease Instances" msgstr "복제본 감소" -#: src/slic3r/GUI/Plater.cpp:4163 +#: src/slic3r/GUI/Plater.cpp:4780 #, c-format msgid "Set numbers of copies to %d" msgstr "복사본 수를 %d로 설정" -#: src/slic3r/GUI/Plater.cpp:4193 +#: src/slic3r/GUI/Plater.cpp:4810 msgid "Cut by Plane" msgstr "평면으로 절단" -#: src/slic3r/GUI/Plater.cpp:4225 +#: src/slic3r/GUI/Plater.cpp:4863 msgid "Save G-code file as:" msgstr "G-code 파일 다른 이름 저장:" -#: src/slic3r/GUI/Plater.cpp:4225 +#: src/slic3r/GUI/Plater.cpp:4863 msgid "Save SL1 file as:" msgstr "SL1 파일 다른이름 저장:" -#: src/slic3r/GUI/Plater.cpp:4337 +#: src/slic3r/GUI/Plater.cpp:4990 #, c-format msgid "STL file exported to %s" msgstr "내보낸 STL 파일 %s" -#: src/slic3r/GUI/Plater.cpp:4353 +#: src/slic3r/GUI/Plater.cpp:5011 #, c-format msgid "AMF file exported to %s" msgstr "내보낸 AMF 파일 %s" -#: src/slic3r/GUI/Plater.cpp:4356 +#: src/slic3r/GUI/Plater.cpp:5014 #, c-format msgid "Error exporting AMF file %s" msgstr "AMF 파일 내보내기 오류 %s" -#: src/slic3r/GUI/Plater.cpp:4382 +#: src/slic3r/GUI/Plater.cpp:5057 #, c-format msgid "3MF file exported to %s" msgstr "3MF 파일을 내보냈습니다 %s" -#: src/slic3r/GUI/Plater.cpp:4387 +#: src/slic3r/GUI/Plater.cpp:5062 #, c-format msgid "Error exporting 3MF file %s" msgstr "3MF 파일 내보내기 오류 %s" -#: src/slic3r/GUI/Plater.cpp:4687 +#: src/slic3r/GUI/Plater.cpp:5544 msgid "Export" msgstr "내보내기" -#: src/slic3r/GUI/Plater.cpp:4688 +#: src/slic3r/GUI/Plater.cpp:5545 msgid "Send G-code" -msgstr "G 코드 보내기" +msgstr "G-code 보내기" -#: src/slic3r/GUI/Plater.cpp:4772 +#: src/slic3r/GUI/Plater.cpp:5629 msgid "Paste From Clipboard" msgstr "클립보드에서 붙여넣기" -#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1955 -#: src/slic3r/GUI/Tab.cpp:2193 +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1780 +#: src/slic3r/GUI/Tab.cpp:2024 msgid "General" msgstr "일반" -#: src/slic3r/GUI/Preferences.cpp:44 +#: src/slic3r/GUI/Preferences.cpp:39 msgid "Remember output directory" msgstr "출력 디렉토리 기억하기" -#: src/slic3r/GUI/Preferences.cpp:46 +#: src/slic3r/GUI/Preferences.cpp:41 msgid "" "If this is enabled, Slic3r will prompt the last output directory instead of " "the one containing the input files." @@ -3509,29 +4615,30 @@ msgstr "" "이 옵션을 사용하면 Slic3r은 입력 파일이 들어있는 디렉터리 대신 마지막 출력 디" "렉터리를 묻습니다." -#: src/slic3r/GUI/Preferences.cpp:52 +#: src/slic3r/GUI/Preferences.cpp:47 msgid "Auto-center parts" -msgstr "부품을 자동으로 중심에" +msgstr "부품(Part)을 자동으로 중재봉선에" -#: src/slic3r/GUI/Preferences.cpp:54 +#: src/slic3r/GUI/Preferences.cpp:49 msgid "" "If this is enabled, Slic3r will auto-center objects around the print bed " "center." -msgstr "이 옵션을 사용하면 Slic3r가 개체를 인쇄판 중앙에 자동으로 배치합니다." +msgstr "" +"이 옵션을 사용하면 Slic3r가 객체(object)를 인쇄판 중앙에 자동으로 배치합니다." -#: src/slic3r/GUI/Preferences.cpp:60 +#: src/slic3r/GUI/Preferences.cpp:55 msgid "Background processing" msgstr "백그라운드 프로세싱" -#: src/slic3r/GUI/Preferences.cpp:62 +#: src/slic3r/GUI/Preferences.cpp:57 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-코드를 내보낼 때." +"이 사용 하는 경우 Slic3r는 최대한 빨리 시간을 절약 하기 위해 로드된 G-code를 " +"내보낸다." -#: src/slic3r/GUI/Preferences.cpp:71 +#: src/slic3r/GUI/Preferences.cpp:66 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 " @@ -3542,46 +4649,58 @@ msgstr "" "되면 다음 응용 프로그램 시작시 (프로그램 사용 중이 아님) 알림이 표시 됩니다. " "이는 알림 메커니즘일뿐이며 자동 설치는 수행되지 않습니다." -#: src/slic3r/GUI/Preferences.cpp:79 +#: src/slic3r/GUI/Preferences.cpp:73 +msgid "Export sources full pathnames to 3mf and amf" +msgstr "소스 전체 경로 이름을 3mf 및 amf로 내보내기" + +#: src/slic3r/GUI/Preferences.cpp:75 +msgid "" +"If enabled, allows the Reload from disk command to automatically find and " +"load the files when invoked." +msgstr "" +"활성화된 경우 디스크에서 다시 로드 명령을 사용하여 호출될 때 파일을 자동으로 " +"찾고 로드할 수 있습니다." + +#: src/slic3r/GUI/Preferences.cpp:84 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은 백그라운드에서 내장 시스템 사전 설정의 업데이트를 다" -"운로드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 사" -"전 설정 버전을 사용할 수있게되면 응용 프로그램 시작시 제공됩니다." +"활성화 된 경우 Slic3r은 백그라운드에서 내장된 시스템 설정의 업데이트를 다운로" +"드합니다. 이러한 업데이트는 별도의 임시 위치에 다운로드됩니다. 새로운 '사전 " +"설정' 버전을 사용할 수 있게되면 응용 프로그램 시작시 제공됩니다." -#: src/slic3r/GUI/Preferences.cpp:84 +#: src/slic3r/GUI/Preferences.cpp:89 msgid "Suppress \" - default - \" presets" msgstr "\"- 기본 -\"사전 설정 숨기기" -#: src/slic3r/GUI/Preferences.cpp:86 +#: src/slic3r/GUI/Preferences.cpp:91 msgid "" "Suppress \" - default - \" presets in the Print / Filament / Printer " "selections once there are any other valid presets available." msgstr "" -"사용 가능한 다른 유효한 사전 설정이 있으면 인쇄 / 필라멘트 / 프린터 선택에서 " -"\"- 기본 -\"사전 설정을 억제하십시오." +"사용 가능한 다른 유효한 '사전 설정'이 있으면 인쇄 / 필라멘트 / 프린터 선택에" +"서 \"- 기본 -\"'사전 설정'을 억제하십시오." -#: src/slic3r/GUI/Preferences.cpp:92 +#: src/slic3r/GUI/Preferences.cpp:97 msgid "Show incompatible print and filament presets" msgstr "호환 되지 않는 인쇄 및 필라멘트 설정" -#: src/slic3r/GUI/Preferences.cpp:94 +#: src/slic3r/GUI/Preferences.cpp:99 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:101 +#: src/slic3r/GUI/Preferences.cpp:106 msgid "Use Retina resolution for the 3D scene" msgstr "3D 장면에 레티나 해상도 사용" -#: src/slic3r/GUI/Preferences.cpp:103 +#: src/slic3r/GUI/Preferences.cpp:108 msgid "" "If enabled, the 3D scene will be rendered in Retina resolution. If you are " "experiencing 3D performance problems, disabling this option may help." @@ -3589,191 +4708,240 @@ msgstr "" "활성화 된 경우 3D 장면은 레티나 해상도로 렌더링 됩니다. 3D 성능 문제가 발생하" "는 경우, 옵션을 사용하지 않도록 설정 하면 도움이 될 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:110 -msgid "Use perspective camera" -msgstr "원근 카메라 사용" +#: src/slic3r/GUI/Preferences.cpp:115 +msgid "Camera" +msgstr "카메라" -#: src/slic3r/GUI/Preferences.cpp:112 +#: src/slic3r/GUI/Preferences.cpp:121 +msgid "Use perspective camera" +msgstr "원근 보기 사용" + +#: src/slic3r/GUI/Preferences.cpp:123 msgid "" "If enabled, use perspective camera. If not enabled, use orthographic camera." msgstr "" -"이 옵션을 사용하면 원근 카메라를 사용합니다. 활성화되지 않은 경우 직교 카메라" +"이 옵션을 사용하면 원근 보기모드를 사용합니다. 활성화되지 않은 경우 일반 보기" "를 사용합니다." -#: src/slic3r/GUI/Preferences.cpp:117 +#: src/slic3r/GUI/Preferences.cpp:129 +msgid "Use free camera" +msgstr "무료 카메라 사용" + +#: src/slic3r/GUI/Preferences.cpp:131 +msgid "If enabled, use free camera. If not enabled, use constrained camera." +msgstr "" +"활성화된 경우 무료 카메라를 사용하십시오. 활성화되지 않은 경우 구속된 카메라" +"를 사용합니다." + +#: src/slic3r/GUI/Preferences.cpp:137 +msgid "GUI" +msgstr "GUI" + +#: src/slic3r/GUI/Preferences.cpp:147 msgid "Use custom size for toolbar icons" msgstr "도구 모음 아이콘에 사용자 지정 크기 사용" -#: src/slic3r/GUI/Preferences.cpp:119 +#: src/slic3r/GUI/Preferences.cpp:149 msgid "If enabled, you can change size of toolbar icons manually." msgstr "활성화된 경우 도구 모음 아이콘의 크기를 수동으로 변경할 수 있습니다." -#: src/slic3r/GUI/Preferences.cpp:144 +#: src/slic3r/GUI/Preferences.cpp:176 #, c-format msgid "You need to restart %s to make the changes effective." msgstr "변경 내용을 적용 하려면 %s를 다시 시작 해야 합니다." -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:226 msgid "Icon size in a respect to the default size" msgstr "기본 크기에 대한 아이콘 크기" -#: src/slic3r/GUI/Preferences.cpp:207 +#: src/slic3r/GUI/Preferences.cpp:241 msgid "Select toolbar icon size in respect to the default one." msgstr "기본 도구 모음에 대해 도구 모음 아이콘 크기를 선택합니다." -#: src/slic3r/GUI/Preset.cpp:212 +#: src/slic3r/GUI/Preset.cpp:247 msgid "modified" msgstr "수정된곳" -#: src/slic3r/GUI/Preset.cpp:963 src/slic3r/GUI/Preset.cpp:1003 -#: src/slic3r/GUI/Preset.cpp:1068 src/slic3r/GUI/Preset.cpp:1100 -#: src/slic3r/GUI/PresetBundle.cpp:1480 src/slic3r/GUI/PresetBundle.cpp:1545 +#: src/slic3r/GUI/Preset.cpp:1059 src/slic3r/GUI/Preset.cpp:1106 +#: src/slic3r/GUI/Preset.cpp:1182 src/slic3r/GUI/Preset.cpp:1216 +#: src/slic3r/GUI/PresetBundle.cpp:1576 src/slic3r/GUI/PresetBundle.cpp:1665 msgid "System presets" msgstr "시스템 기본설정" -#: src/slic3r/GUI/Preset.cpp:1007 src/slic3r/GUI/Preset.cpp:1104 -#: src/slic3r/GUI/PresetBundle.cpp:1550 +#: src/slic3r/GUI/Preset.cpp:1110 src/slic3r/GUI/Preset.cpp:1220 +#: src/slic3r/GUI/PresetBundle.cpp:1670 msgid "User presets" msgstr "사용자 사전설정" -#: src/slic3r/GUI/Preset.cpp:1036 src/slic3r/GUI/Tab.cpp:241 +#: src/slic3r/GUI/Preset.cpp:1141 src/slic3r/GUI/Tab.cpp:243 msgid "Add a new printer" msgstr "새 프린터 추가" -#: src/slic3r/GUI/Preset.cpp:1308 +#: src/slic3r/GUI/Preset.cpp:1143 +msgid "Add/Remove materials" +msgstr "재질 추가/제거" + +#: src/slic3r/GUI/Preset.cpp:1453 msgid "filament" msgstr "필라멘트" -#: src/slic3r/GUI/Preset.cpp:1309 +#: src/slic3r/GUI/Preset.cpp:1454 msgid "SLA print" msgstr "SLA 인쇄" -#: src/slic3r/GUI/PresetHints.cpp:28 +#: src/slic3r/GUI/PresetBundle.cpp:1681 +msgid "Add/Remove filaments" +msgstr "필라멘트 추가/제거" + +#: src/slic3r/GUI/PresetHints.cpp:29 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%mm/s 이하로 감소하지 않" -"습니다) ." +"예상 레이어 시간이 ~%1%s 미만이면 팬이 %2%%% 에서 실행되고 인쇄 속도가 감소하" +"여 해당 레이어에 %3%s 이상이 소비되지 않습니다 (단, 속도는 아래로 감소하지 않" +"습니다 %4%mm/s)." -#: src/slic3r/GUI/PresetHints.cpp:35 +#: src/slic3r/GUI/PresetHints.cpp:36 msgid "" -"\n" "If estimated layer time is greater, but still below ~%1%s, fan will run at a " "proportionally decreasing speed between %2%%% and %3%%%." msgstr "" -"\n" -"예상 레이어 시간이 더 길지만 ~%1%초 미만인 경우 팬은 %2%%%와 %3%%%사이 비례, " -"감소하는 속도로 실행됩니다." +"예상 레이어 시간이 더 크지만 여전히 ~%1%s 미만이면, 팬은 %2%%% ~ %3%%% 사이에" +"서 비례적으로 감소하는 속도로 실행될 것이다." -#: src/slic3r/GUI/PresetHints.cpp:39 -msgid "" -"\n" -"During the other layers, fan" -msgstr "" -"\n" -"다른 레이어의, 팬설정은 " +#: src/slic3r/GUI/PresetHints.cpp:40 +msgid "During the other layers, fan" +msgstr "다른 레이어의, 팬설정" -#: src/slic3r/GUI/PresetHints.cpp:41 +#: src/slic3r/GUI/PresetHints.cpp:42 msgid "Fan" msgstr "팬(Fan)" -#: src/slic3r/GUI/PresetHints.cpp:47 +#: src/slic3r/GUI/PresetHints.cpp:48 msgid "will always run at %1%%%" msgstr "항상 다음처럼 실행 %1%%%" -#: src/slic3r/GUI/PresetHints.cpp:50 +#: src/slic3r/GUI/PresetHints.cpp:51 msgid "except for the first %1% layers." -msgstr "첫 번째 %d 레이어를 제외하고" +msgstr "첫 번째 %1% 레이어를 제외하고" -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:53 msgid "except for the first layer." msgstr "첫 번째 레이어를 제외하고" -#: src/slic3r/GUI/PresetHints.cpp:54 +#: src/slic3r/GUI/PresetHints.cpp:55 msgid "will be turned off." msgstr "off 됩니다." -#: src/slic3r/GUI/PresetHints.cpp:155 +#: src/slic3r/GUI/PresetHints.cpp:156 msgid "external perimeters" msgstr "외부 둘레" -#: src/slic3r/GUI/PresetHints.cpp:164 +#: src/slic3r/GUI/PresetHints.cpp:165 msgid "perimeters" msgstr "둘레" -#: src/slic3r/GUI/PresetHints.cpp:173 +#: src/slic3r/GUI/PresetHints.cpp:174 msgid "infill" msgstr "채움(infill)" -#: src/slic3r/GUI/PresetHints.cpp:183 +#: src/slic3r/GUI/PresetHints.cpp:184 msgid "solid infill" msgstr "외부(solid)부분 채움" -#: src/slic3r/GUI/PresetHints.cpp:191 +#: src/slic3r/GUI/PresetHints.cpp:192 msgid "top solid infill" msgstr "가장 윗부분 채움" -#: src/slic3r/GUI/PresetHints.cpp:202 +#: src/slic3r/GUI/PresetHints.cpp:203 msgid "support" msgstr "서포트" -#: src/slic3r/GUI/PresetHints.cpp:212 +#: src/slic3r/GUI/PresetHints.cpp:213 msgid "support interface" -msgstr "서포트 인터페이스" +msgstr "서포트 접점" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "First layer volumetric" msgstr "첫번째 레이어 용적은" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Bridging volumetric" msgstr "브리징(Bridging) 용적" -#: src/slic3r/GUI/PresetHints.cpp:218 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Volumetric" msgstr "용적" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:220 msgid "flow rate is maximized" msgstr "의 유속(flow)이 최대화된다. " -#: src/slic3r/GUI/PresetHints.cpp:222 +#: src/slic3r/GUI/PresetHints.cpp:223 msgid "by the print profile maximum" msgstr "인쇄 프로파일 최대 값" -#: src/slic3r/GUI/PresetHints.cpp:223 +#: src/slic3r/GUI/PresetHints.cpp:224 msgid "when printing" msgstr "인쇄 할 때" -#: src/slic3r/GUI/PresetHints.cpp:224 +#: src/slic3r/GUI/PresetHints.cpp:225 msgid "with a volumetric rate" msgstr "의 용적 비율로 " -#: src/slic3r/GUI/PresetHints.cpp:228 +#: src/slic3r/GUI/PresetHints.cpp:229 #, c-format msgid "%3.2f mm³/s at filament speed %3.2f mm/s." msgstr "%3.2f mm³/s 필라멘트 속도는 %3.2f mm/s이다." -#: src/slic3r/GUI/PresetHints.cpp:246 +#: src/slic3r/GUI/PresetHints.cpp:247 msgid "" "Recommended object thin wall thickness: Not available due to invalid layer " "height." msgstr "" "권장 객체(object)의 벽(wall) 두께: 잘못된 레이어 높이 때문에 사용할 수 없음." -#: src/slic3r/GUI/PresetHints.cpp:262 +#: src/slic3r/GUI/PresetHints.cpp:263 #, c-format msgid "Recommended object thin wall thickness for layer height %.2f and" -msgstr "객체 레이어 높이 %.2f 에 권장하는 두깨는 " +msgstr "객체(object) 레이어 높이 %.2f 에 권장하는 두깨는 " -#: src/slic3r/GUI/PresetHints.cpp:268 +#: src/slic3r/GUI/PresetHints.cpp:269 #, c-format msgid "%d lines: %.2f mm" msgstr "%d 라인:%.2f mm" +#: src/slic3r/GUI/PresetHints.cpp:300 +msgid "" +"Top / bottom shell thickness hint: Not available due to invalid layer height." +msgstr "상단/하단 쉘 두께 힌트: 잘못된 레이어 높이로 인해 사용할 수 없습니다." + +#: src/slic3r/GUI/PresetHints.cpp:313 +msgid "Top shell is %1% mm thick for layer height %2% mm." +msgstr "상단 쉘은 층 높이 %2% mm에 대한 두께 %1% mm입니다." + +#: src/slic3r/GUI/PresetHints.cpp:316 +msgid "Minimum top shell thickness is %1% mm." +msgstr "최소 상단 쉘 두께는 %1% mm입니다." + +#: src/slic3r/GUI/PresetHints.cpp:319 +msgid "Top is open." +msgstr "상단이 열려 있습니다." + +#: src/slic3r/GUI/PresetHints.cpp:332 +msgid "Bottom shell is %1% mm thick for layer height %2% mm." +msgstr "바닥 층 높이 %2% mm에 대한 두께 %1% mm입니다." + +#: src/slic3r/GUI/PresetHints.cpp:335 +msgid "Minimum bottom shell thickness is %1% mm." +msgstr "최소 바닥 쉘 두께는 %1% mm입니다." + +#: src/slic3r/GUI/PresetHints.cpp:338 +msgid "Bottom is open." +msgstr "바닥이 열려 있습니다." + #: src/slic3r/GUI/PrintHostDialogs.cpp:33 msgid "Send G-Code to printer host" msgstr "프린터 호스트로 G 코드 보내기" @@ -3847,11 +5015,13 @@ msgstr "전혀 충돌 없음" msgid "Time" msgstr "시간" -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:82 -#: src/libslic3r/PrintConfig.cpp:627 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:686 src/libslic3r/PrintConfig.cpp:2349 -#: src/libslic3r/PrintConfig.cpp:2358 src/libslic3r/PrintConfig.cpp:2418 -#: src/libslic3r/PrintConfig.cpp:2425 +#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83 +#: src/libslic3r/PrintConfig.cpp:645 src/libslic3r/PrintConfig.cpp:689 +#: src/libslic3r/PrintConfig.cpp:704 src/libslic3r/PrintConfig.cpp:2418 +#: src/libslic3r/PrintConfig.cpp:2427 src/libslic3r/PrintConfig.cpp:2528 +#: src/libslic3r/PrintConfig.cpp:2536 src/libslic3r/PrintConfig.cpp:2544 +#: src/libslic3r/PrintConfig.cpp:2551 src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2567 msgid "s" msgstr "s" @@ -3859,11 +5029,55 @@ msgstr "s" msgid "Volumetric speed" msgstr "용적(Volumetric) 스피트" -#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:584 -#: src/libslic3r/PrintConfig.cpp:1234 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:602 +#: src/libslic3r/PrintConfig.cpp:1259 msgid "mm³/s" msgstr "밀리미터 ³/s" +#: src/slic3r/GUI/Selection.cpp:146 +msgid "Selection-Add" +msgstr "선택 추가" + +#: src/slic3r/GUI/Selection.cpp:187 +msgid "Selection-Remove" +msgstr "선택-제거" + +#: src/slic3r/GUI/Selection.cpp:219 +msgid "Selection-Add Object" +msgstr "선택-추가 객체" + +#: src/slic3r/GUI/Selection.cpp:238 +msgid "Selection-Remove Object" +msgstr "선택-제거 개체" + +#: src/slic3r/GUI/Selection.cpp:256 +msgid "Selection-Add Instance" +msgstr "선택-인스턴스 추가" + +#: src/slic3r/GUI/Selection.cpp:275 +msgid "Selection-Remove Instance" +msgstr "선택-제거 인스턴스" + +#: src/slic3r/GUI/Selection.cpp:376 +msgid "Selection-Add All" +msgstr "선택-모두 추가" + +#: src/slic3r/GUI/Selection.cpp:402 +msgid "Selection-Remove All" +msgstr "선택-모두 제거" + +#: src/slic3r/GUI/Selection.cpp:939 +msgid "Scale To Fit" +msgstr "크기에 맞게 조정" + +#: src/slic3r/GUI/Selection.cpp:1475 +msgid "Set Printable Instance" +msgstr "인쇄 가능한 인스턴스 설정" + +#: src/slic3r/GUI/Selection.cpp:1475 +msgid "Set Unprintable Instance" +msgstr "인쇄할 수 없는 인스턴스 설정" + #: src/slic3r/GUI/SysInfoDialog.cpp:78 msgid "System Information" msgstr "시스템 정보" @@ -3872,7 +5086,7 @@ msgstr "시스템 정보" msgid "Copy to Clipboard" msgstr "클립보드에 복사" -#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:239 +#: src/slic3r/GUI/Tab.cpp:52 src/libslic3r/PrintConfig.cpp:255 msgid "Compatible printers" msgstr "호환 가능한 프린터들" @@ -3880,7 +5094,7 @@ msgstr "호환 가능한 프린터들" msgid "Select the printers this profile is compatible with." msgstr "이 프로파일과 호환 가능한 프린터를 선택하세요." -#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:254 +#: src/slic3r/GUI/Tab.cpp:58 src/libslic3r/PrintConfig.cpp:270 msgid "Compatible print profiles" msgstr "호환되는 인쇄 프로 파일" @@ -3889,16 +5103,16 @@ 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:135 #, c-format msgid "Save current %s" msgstr "현재 %s 저장" -#: src/slic3r/GUI/Tab.cpp:134 +#: src/slic3r/GUI/Tab.cpp:136 msgid "Delete this preset" msgstr "이전 설정 삭제" -#: src/slic3r/GUI/Tab.cpp:139 +#: src/slic3r/GUI/Tab.cpp:141 msgid "" "Hover the cursor over buttons to find more information \n" "or click this button." @@ -3906,380 +5120,279 @@ msgstr "" "버튼 위로 커서를 가져 가서 자세한 정보를 찾습니다.\n" "또는이 버튼을 클릭하십시오." -#: src/slic3r/GUI/Tab.cpp:921 +#: src/slic3r/GUI/Tab.cpp:943 msgid "This is a default preset." msgstr "기본 설정입니다." -#: src/slic3r/GUI/Tab.cpp:923 +#: src/slic3r/GUI/Tab.cpp:945 msgid "This is a system preset." msgstr "시스템 설정입니다." -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:947 msgid "Current preset is inherited from the default preset." msgstr "현재 사전 설정은 기본 사전 설정에서 상속됩니다." -#: src/slic3r/GUI/Tab.cpp:928 +#: src/slic3r/GUI/Tab.cpp:950 #, c-format msgid "" "Current preset is inherited from:\n" "\t%s" msgstr "전의 %s 설정에서 가져 옵니다 " -#: src/slic3r/GUI/Tab.cpp:932 +#: src/slic3r/GUI/Tab.cpp:954 msgid "It can't be deleted or modified." msgstr "삭제하거나 수정할 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:933 +#: src/slic3r/GUI/Tab.cpp:955 msgid "" "Any modifications should be saved as a new preset inherited from this one." msgstr "모든 수정 사항은 이 항목에서 받은 기본 설정으로 저장해야합니다." -#: src/slic3r/GUI/Tab.cpp:934 +#: src/slic3r/GUI/Tab.cpp:956 msgid "To do that please specify a new name for the preset." msgstr "그렇게하려면 기본 설정의 새 이름을 지정하십시오." -#: src/slic3r/GUI/Tab.cpp:938 +#: src/slic3r/GUI/Tab.cpp:960 msgid "Additional information:" msgstr "추가 정보:" -#: src/slic3r/GUI/Tab.cpp:944 +#: src/slic3r/GUI/Tab.cpp:966 msgid "printer model" msgstr "프린터 모델" -#: src/slic3r/GUI/Tab.cpp:952 +#: src/slic3r/GUI/Tab.cpp:974 msgid "default print profile" msgstr "기본 인쇄 프로파일" -#: src/slic3r/GUI/Tab.cpp:955 +#: src/slic3r/GUI/Tab.cpp:977 msgid "default filament profile" msgstr "기본 필라멘트 프로파일" -#: src/slic3r/GUI/Tab.cpp:969 +#: src/slic3r/GUI/Tab.cpp:991 msgid "default SLA material profile" msgstr "기본 SLA 재질 프로 파일" -#: src/slic3r/GUI/Tab.cpp:973 +#: src/slic3r/GUI/Tab.cpp:995 msgid "default SLA print profile" msgstr "기본 SLA 인쇄 프로필" -#: src/slic3r/GUI/Tab.cpp:1008 src/slic3r/GUI/Tab.cpp:3649 +#: src/slic3r/GUI/Tab.cpp:1003 +msgid "full profile name" +msgstr "전체 프로필 이름" + +#: src/slic3r/GUI/Tab.cpp:1004 +msgid "symbolic profile name" +msgstr "기호 프로파일 이름" + +#: src/slic3r/GUI/Tab.cpp:1038 src/slic3r/GUI/Tab.cpp:3570 msgid "Layers and perimeters" -msgstr "레이어 및 경계선" +msgstr "레이어 및 둘레" -#: src/slic3r/GUI/Tab.cpp:1009 src/slic3r/GUI/Tab.cpp:1257 -#: src/libslic3r/PrintConfig.cpp:66 -msgid "Layer height" -msgstr "레이어 높이" - -#: src/slic3r/GUI/Tab.cpp:1013 +#: src/slic3r/GUI/Tab.cpp:1043 msgid "Vertical shells" msgstr "쉘 높이" -#: src/slic3r/GUI/Tab.cpp:1024 +#: src/slic3r/GUI/Tab.cpp:1054 msgid "Horizontal shells" msgstr "쉘 너비" -#: src/slic3r/GUI/Tab.cpp:1025 src/libslic3r/PrintConfig.cpp:1759 +#: src/slic3r/GUI/Tab.cpp:1055 src/libslic3r/PrintConfig.cpp:1790 msgid "Solid layers" msgstr "솔리드 레이어" -#: src/slic3r/GUI/Tab.cpp:1030 +#: src/slic3r/GUI/Tab.cpp:1059 +msgid "Minimum shell thickness" +msgstr "최소 쉘 두께" + +#: src/slic3r/GUI/Tab.cpp:1070 msgid "Quality (slower slicing)" msgstr "품질(슬라이싱이 느려짐)" -#: src/slic3r/GUI/Tab.cpp:1048 +#: src/slic3r/GUI/Tab.cpp:1088 msgid "Reducing printing time" msgstr "출력 시간 단축" -#: src/slic3r/GUI/Tab.cpp:1060 +#: src/slic3r/GUI/Tab.cpp:1100 msgid "Skirt and brim" msgstr "스커트와 브림" -#: src/slic3r/GUI/Tab.cpp:1077 +#: src/slic3r/GUI/Tab.cpp:1117 msgid "Raft" msgstr "라프트" -#: src/slic3r/GUI/Tab.cpp:1081 +#: src/slic3r/GUI/Tab.cpp:1121 msgid "Options for support material and raft" msgstr "서포트와 라프트 재료를 선택" -#: src/slic3r/GUI/Tab.cpp:1096 +#: src/slic3r/GUI/Tab.cpp:1136 msgid "Speed for print moves" msgstr "출력중 이동 속도" -#: src/slic3r/GUI/Tab.cpp:1108 +#: src/slic3r/GUI/Tab.cpp:1148 msgid "Speed for non-print moves" msgstr "미출력시 이동속도" -#: src/slic3r/GUI/Tab.cpp:1111 +#: src/slic3r/GUI/Tab.cpp:1151 msgid "Modifiers" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:1114 +#: src/slic3r/GUI/Tab.cpp:1154 msgid "Acceleration control (advanced)" msgstr "가속 제어(고급)" -#: src/slic3r/GUI/Tab.cpp:1121 +#: src/slic3r/GUI/Tab.cpp:1161 msgid "Autospeed (advanced)" msgstr "오토스피트(고급)" -#: src/slic3r/GUI/Tab.cpp:1129 +#: src/slic3r/GUI/Tab.cpp:1169 msgid "Multiple Extruders" msgstr "다중 익스트루더" -#: src/slic3r/GUI/Tab.cpp:1137 +#: src/slic3r/GUI/Tab.cpp:1177 msgid "Ooze prevention" msgstr "오즈 방지(Ooze prevention)" -#: src/slic3r/GUI/Tab.cpp:1154 +#: src/slic3r/GUI/Tab.cpp:1195 msgid "Extrusion width" msgstr "악출 폭(Extrusion width)" -#: src/slic3r/GUI/Tab.cpp:1164 +#: src/slic3r/GUI/Tab.cpp:1205 msgid "Overlap" msgstr "겹침(Overlap)" -#: src/slic3r/GUI/Tab.cpp:1167 +#: src/slic3r/GUI/Tab.cpp:1208 msgid "Flow" msgstr "유량(Flow)" -#: src/slic3r/GUI/Tab.cpp:1176 +#: src/slic3r/GUI/Tab.cpp:1217 msgid "Other" msgstr "그 외" -#: src/slic3r/GUI/Tab.cpp:1179 src/slic3r/GUI/Tab.cpp:3703 +#: src/slic3r/GUI/Tab.cpp:1220 src/slic3r/GUI/Tab.cpp:3637 msgid "Output options" msgstr "출력 옵션" -#: src/slic3r/GUI/Tab.cpp:1180 +#: src/slic3r/GUI/Tab.cpp:1221 msgid "Sequential printing" msgstr "연속 인쇄" -#: src/slic3r/GUI/Tab.cpp:1182 +#: src/slic3r/GUI/Tab.cpp:1223 msgid "Extruder clearance (mm)" msgstr "익스트루더 간격(mm)" -#: src/slic3r/GUI/Tab.cpp:1191 src/slic3r/GUI/Tab.cpp:3704 +#: src/slic3r/GUI/Tab.cpp:1232 src/slic3r/GUI/Tab.cpp:3638 msgid "Output file" msgstr "출력 파일" -#: src/slic3r/GUI/Tab.cpp:1198 src/libslic3r/PrintConfig.cpp:1432 +#: src/slic3r/GUI/Tab.cpp:1239 src/libslic3r/PrintConfig.cpp:1462 msgid "Post-processing scripts" msgstr "사후 처리 스크립트" -#: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1205 -#: src/slic3r/GUI/Tab.cpp:1716 src/slic3r/GUI/Tab.cpp:1717 -#: src/slic3r/GUI/Tab.cpp:2165 src/slic3r/GUI/Tab.cpp:2166 -#: src/slic3r/GUI/Tab.cpp:2273 src/slic3r/GUI/Tab.cpp:2274 -#: src/slic3r/GUI/Tab.cpp:3586 src/slic3r/GUI/Tab.cpp:3587 +#: src/slic3r/GUI/Tab.cpp:1245 src/slic3r/GUI/Tab.cpp:1246 +#: src/slic3r/GUI/Tab.cpp:1531 src/slic3r/GUI/Tab.cpp:1532 +#: src/slic3r/GUI/Tab.cpp:1996 src/slic3r/GUI/Tab.cpp:1997 +#: src/slic3r/GUI/Tab.cpp:2110 src/slic3r/GUI/Tab.cpp:2111 +#: src/slic3r/GUI/Tab.cpp:3507 src/slic3r/GUI/Tab.cpp:3508 msgid "Notes" msgstr "메모" -#: src/slic3r/GUI/Tab.cpp:1211 src/slic3r/GUI/Tab.cpp:1724 -#: src/slic3r/GUI/Tab.cpp:2172 src/slic3r/GUI/Tab.cpp:2280 -#: src/slic3r/GUI/Tab.cpp:3594 src/slic3r/GUI/Tab.cpp:3709 +#: src/slic3r/GUI/Tab.cpp:1252 src/slic3r/GUI/Tab.cpp:1539 +#: src/slic3r/GUI/Tab.cpp:2003 src/slic3r/GUI/Tab.cpp:2117 +#: src/slic3r/GUI/Tab.cpp:3515 src/slic3r/GUI/Tab.cpp:3643 msgid "Dependencies" msgstr "속한 그룹" -#: src/slic3r/GUI/Tab.cpp:1212 src/slic3r/GUI/Tab.cpp:1725 -#: src/slic3r/GUI/Tab.cpp:2173 src/slic3r/GUI/Tab.cpp:2281 -#: src/slic3r/GUI/Tab.cpp:3595 src/slic3r/GUI/Tab.cpp:3710 +#: src/slic3r/GUI/Tab.cpp:1253 src/slic3r/GUI/Tab.cpp:1540 +#: src/slic3r/GUI/Tab.cpp:2004 src/slic3r/GUI/Tab.cpp:2118 +#: src/slic3r/GUI/Tab.cpp:3516 src/slic3r/GUI/Tab.cpp:3644 msgid "Profile dependencies" msgstr "프로파일 속한곳" -#: src/slic3r/GUI/Tab.cpp:1256 -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/Tab.cpp:1268 -msgid "" -"Zero first layer height is not valid.\n" -"\n" -"The first layer height will be reset to 0.01." -msgstr "" -"첫 번째 레이어 높이가 0이면 유효하지 않습니다.\n" -"\n" -"첫 번째 레이어 높이는 0.01로 재설정됩니다." - -#: src/slic3r/GUI/Tab.cpp:1269 src/libslic3r/PrintConfig.cpp:866 -msgid "First layer height" -msgstr "첫 레이어 높이" - -#: src/slic3r/GUI/Tab.cpp:1283 -#, c-format -msgid "" -"The Spiral Vase mode requires:\n" -"- one perimeter\n" -"- no top solid layers\n" -"- 0% fill density\n" -"- no support material\n" -"- no ensure_vertical_shell_thickness\n" -"\n" -"Shall I adjust those settings in order to enable Spiral Vase?" -msgstr "" -"스파이럴 바이스 모드에는 다음이 필요합니다.\n" -"- one 둘레\n" -"- 탑 솔리드 레이어 없음\n" -"- 0% fill density\n" -"- 서포트 재료 없음\n" -"- 수직 벽 두깨를 보장하지 않음\n" -"\n" -"스파이럴 바이스를 사용하려면 이러한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1290 -msgid "Spiral Vase" -msgstr "스파이럴 바이스" - -#: src/slic3r/GUI/Tab.cpp:1311 -msgid "" -"The Wipe Tower currently supports the non-soluble supports only\n" -"if they are printed with the current extruder without triggering a tool " -"change.\n" -"(both support_material_extruder and support_material_interface_extruder need " -"to be set to 0).\n" -"\n" -"Shall I adjust those settings in order to enable the Wipe Tower?" -msgstr "" -"와이퍼 타워는 현재 비 가용성 서포트 만 지원합니다.\n" -"공구 교환을 트리거하지 않고 현재 압출기로 인쇄 한 경우.\n" -"(support_material_extruder 및 support_material_interface_extruder를 모두 0으" -"로 설정해야 함).\n" -"\n" -"와이퍼 타워를 사용하려면 이러한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1315 src/slic3r/GUI/Tab.cpp:1332 -msgid "Wipe Tower" -msgstr "와이프 타워(Wipe Tower)" - -#: src/slic3r/GUI/Tab.cpp:1329 -msgid "" -"For the Wipe Tower to work with the soluble supports, the support layers\n" -"need to be synchronized with the object layers.\n" -"\n" -"Shall I synchronize support layers in order to enable the Wipe Tower?" -msgstr "" -"와이퍼 타워가 가용성 서포트와 함께 작용하기 위해, 서포트 레이어\n" -"객체 레이어와 동기화되어야합니다.\n" -"\n" -"와이퍼 타워를 사용하려면 서포트 레이어를 동기화해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1347 -msgid "" -"Supports work better, if the following feature is enabled:\n" -"- Detect bridging perimeters\n" -"\n" -"Shall I adjust those settings for supports?" -msgstr "" -"다음 기능을 사용하는 경우 더 나은 작업을 지원합니다.\n" -"- 브리지 경계 검출\n" -"\n" -"서포트에 대한 설정을 조정해야합니까?" - -#: src/slic3r/GUI/Tab.cpp:1350 -msgid "Support Generator" -msgstr "서포트 생성" - -#: src/slic3r/GUI/Tab.cpp:1392 -msgid "" -"The %1% infill pattern is not supposed to work at 100%% density.\n" -"\n" -"Shall I switch to rectilinear fill pattern?" -msgstr "" -"%1% 채우기 패턴은 100%의 밀도로 작동 하지 않습니다.\n" -"\n" -"직선 채우기 패턴으로 전환 해야 합니까?" - -#: src/slic3r/GUI/Tab.cpp:1502 src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1317 src/slic3r/GUI/Tab.cpp:1372 msgid "Filament Overrides" msgstr "필라멘트 재정의" -#: src/slic3r/GUI/Tab.cpp:1503 src/slic3r/GUI/Tab.cpp:1562 -#: src/slic3r/GUI/Tab.cpp:2514 +#: src/slic3r/GUI/Tab.cpp:1318 src/slic3r/GUI/Tab.cpp:1377 +#: src/slic3r/GUI/Tab.cpp:2352 msgid "Retraction" msgstr "리트렉션" -#: src/slic3r/GUI/Tab.cpp:1612 src/libslic3r/PrintConfig.cpp:2030 +#: src/slic3r/GUI/Tab.cpp:1427 src/libslic3r/PrintConfig.cpp:2077 msgid "Temperature" msgstr "온도" -#: src/slic3r/GUI/Tab.cpp:1618 +#: src/slic3r/GUI/Tab.cpp:1433 msgid "Bed" msgstr "배드(Bed)" -#: src/slic3r/GUI/Tab.cpp:1623 +#: src/slic3r/GUI/Tab.cpp:1438 msgid "Cooling" msgstr "냉각(Cooling)" -#: src/slic3r/GUI/Tab.cpp:1624 src/libslic3r/PrintConfig.cpp:1335 -#: src/libslic3r/PrintConfig.cpp:2150 +#: src/slic3r/GUI/Tab.cpp:1439 src/libslic3r/PrintConfig.cpp:1364 +#: src/libslic3r/PrintConfig.cpp:2210 msgid "Enable" msgstr "사용" -#: src/slic3r/GUI/Tab.cpp:1635 +#: src/slic3r/GUI/Tab.cpp:1450 msgid "Fan settings" msgstr "팬 설정" -#: src/slic3r/GUI/Tab.cpp:1636 -msgid "Fan speed" -msgstr "팬 속도" - -#: src/slic3r/GUI/Tab.cpp:1644 +#: src/slic3r/GUI/Tab.cpp:1459 msgid "Cooling thresholds" msgstr "냉각 임계 값" -#: src/slic3r/GUI/Tab.cpp:1650 +#: src/slic3r/GUI/Tab.cpp:1465 msgid "Filament properties" msgstr "필라멘트 특성" -#: src/slic3r/GUI/Tab.cpp:1654 +#: src/slic3r/GUI/Tab.cpp:1469 msgid "Print speed override" msgstr "인쇄 속도 중단" -#: src/slic3r/GUI/Tab.cpp:1664 +#: src/slic3r/GUI/Tab.cpp:1479 msgid "Wipe tower parameters" msgstr "타워 매개변수 지우기" -#: src/slic3r/GUI/Tab.cpp:1667 +#: src/slic3r/GUI/Tab.cpp:1482 msgid "Toolchange parameters with single extruder MM printers" -msgstr "싱글 익스트루더 멀티 터리알 프린터를 사용한 공구 교환 매개 변수" +msgstr "MMU 프린터의 툴체인지 매개 변수" -#: src/slic3r/GUI/Tab.cpp:1681 +#: src/slic3r/GUI/Tab.cpp:1496 msgid "Ramming settings" msgstr "래밍 설정" -#: src/slic3r/GUI/Tab.cpp:1703 src/slic3r/GUI/Tab.cpp:2128 +#: src/slic3r/GUI/Tab.cpp:1518 src/slic3r/GUI/Tab.cpp:1959 msgid "Custom G-code" msgstr "수동 G코드" -#: src/slic3r/GUI/Tab.cpp:1704 src/slic3r/GUI/Tab.cpp:2129 -#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1800 +#: src/slic3r/GUI/Tab.cpp:1519 src/slic3r/GUI/Tab.cpp:1960 +#: src/libslic3r/PrintConfig.cpp:1823 src/libslic3r/PrintConfig.cpp:1838 msgid "Start G-code" msgstr "스타트 G코드" -#: src/slic3r/GUI/Tab.cpp:1710 src/slic3r/GUI/Tab.cpp:2135 -#: src/libslic3r/PrintConfig.cpp:369 src/libslic3r/PrintConfig.cpp:379 +#: src/slic3r/GUI/Tab.cpp:1525 src/slic3r/GUI/Tab.cpp:1966 +#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 msgid "End G-code" msgstr "엔드 G코드" -#: src/slic3r/GUI/Tab.cpp:1843 src/slic3r/GUI/Tab.cpp:2068 +#: src/slic3r/GUI/Tab.cpp:1582 +msgid "Volumetric flow hints not available" +msgstr "체적 흐름 힌트를 사용할 수 없음" + +#: src/slic3r/GUI/Tab.cpp:1668 src/slic3r/GUI/Tab.cpp:1899 msgid "Test" msgstr "시험(test)" -#: src/slic3r/GUI/Tab.cpp:1853 +#: src/slic3r/GUI/Tab.cpp:1678 msgid "Could not get a valid Printer Host reference" msgstr "유효한 프린터 호스트 참조를 가져올 수 없습니다" -#: src/slic3r/GUI/Tab.cpp:1859 src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:1684 src/slic3r/GUI/Tab.cpp:1912 msgid "Success!" msgstr "성공!" -#: src/slic3r/GUI/Tab.cpp:1874 +#: src/slic3r/GUI/Tab.cpp:1699 msgid "" "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-" "signed certificate." @@ -4287,194 +5400,203 @@ msgstr "" "HTTPS CA 파일은 선택 사항입니다. 자체 서명 된 인증서로 HTTPS를 사용하는 경우" "에만 필요합니다." -#: src/slic3r/GUI/Tab.cpp:1887 +#: src/slic3r/GUI/Tab.cpp:1712 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "인증서 파일 (* .crt, * .pem) | * .crt; * .pem | 모든 파일 | *. *" -#: src/slic3r/GUI/Tab.cpp:1888 +#: src/slic3r/GUI/Tab.cpp:1713 msgid "Open CA certificate file" msgstr "CA 인증서 파일 열기" -#: src/slic3r/GUI/Tab.cpp:1916 +#: src/slic3r/GUI/Tab.cpp:1741 #, c-format msgid "" -"HTTPS CA File:\n" -" \tOn this system, %s uses HTTPS certificates from the system Certificate " +"On 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 " +msgstr "" +"이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 " +"합니다.\n" + +#: src/slic3r/GUI/Tab.cpp:1741 +msgid "" +"To use a custom CA file, please import your CA file into Certificate " "Store / Keychain." msgstr "" -"HTTPS CA 파일:\n" -"\t이 시스템에서 %s는 시스템 인증서 저장소나 키체인의 HTTPS 인증서를 사용 합니" -"다.\n" -"\t사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져오십" -"시오." +"사용자 지정 CA 파일을 사용 하려면 CA 파일을 인증서 저장소/키체인에 가져" +"오십시오." -#: src/slic3r/GUI/Tab.cpp:1956 src/slic3r/GUI/Tab.cpp:2194 +#: src/slic3r/GUI/Tab.cpp:1781 src/slic3r/GUI/Tab.cpp:2025 msgid "Size and coordinates" msgstr "크기와 좌표" -#: src/slic3r/GUI/Tab.cpp:1961 src/slic3r/GUI/Tab.cpp:2199 -#: src/slic3r/GUI/Tab.cpp:3256 +#: src/slic3r/GUI/Tab.cpp:1786 src/slic3r/GUI/Tab.cpp:2030 +#: src/slic3r/GUI/Tab.cpp:3146 msgid "Set" msgstr "설정" -#: src/slic3r/GUI/Tab.cpp:1993 +#: src/slic3r/GUI/Tab.cpp:1818 msgid "Capabilities" msgstr "기능" -#: src/slic3r/GUI/Tab.cpp:1998 +#: src/slic3r/GUI/Tab.cpp:1823 msgid "Number of extruders of the printer." -msgstr "프린터 익스트루더 숫자." +msgstr "프린터 익스트루더 갯수." -#: src/slic3r/GUI/Tab.cpp:2023 +#: src/slic3r/GUI/Tab.cpp:1851 msgid "" "Single Extruder Multi Material is selected, \n" "and all extruders must have the same diameter.\n" "Do you want to change the diameter for all extruders to first extruder " "nozzle diameter value?" msgstr "" -"단일 압출기 멀티 재질이 선택되고, \n" +"단일 압출기 다중 재질이 선택되고, \n" "모든 압출기는 동일한 직경을 가져야 합니다.\n" "모든 압출기의 지름을 첫 번째 압출기 노즐 값으로 변경하시겠습니까?" -#: src/slic3r/GUI/Tab.cpp:2026 src/slic3r/GUI/Tab.cpp:2484 -#: src/libslic3r/PrintConfig.cpp:1310 +#: src/slic3r/GUI/Tab.cpp:1854 src/slic3r/GUI/Tab.cpp:2322 +#: src/libslic3r/PrintConfig.cpp:1335 msgid "Nozzle diameter" msgstr "노즐 직경" -#: src/slic3r/GUI/Tab.cpp:2053 +#: src/slic3r/GUI/Tab.cpp:1884 msgid "USB/Serial connection" msgstr "USB/시리얼 연결" -#: src/slic3r/GUI/Tab.cpp:2054 src/libslic3r/PrintConfig.cpp:1640 +#: src/slic3r/GUI/Tab.cpp:1885 src/libslic3r/PrintConfig.cpp:1670 msgid "Serial port" msgstr "시리얼 포트" -#: src/slic3r/GUI/Tab.cpp:2059 +#: src/slic3r/GUI/Tab.cpp:1890 msgid "Rescan serial ports" msgstr "시리얼포트 재검색" -#: src/slic3r/GUI/Tab.cpp:2081 +#: src/slic3r/GUI/Tab.cpp:1912 msgid "Connection to printer works correctly." msgstr "프린터 연결이 올바르게 작동합니다." -#: src/slic3r/GUI/Tab.cpp:2084 +#: src/slic3r/GUI/Tab.cpp:1915 msgid "Connection failed." msgstr "연결 실패." -#: src/slic3r/GUI/Tab.cpp:2097 src/slic3r/GUI/Tab.cpp:2268 +#: src/slic3r/GUI/Tab.cpp:1928 src/slic3r/GUI/Tab.cpp:2105 msgid "Print Host upload" msgstr "호스트 업로드 인쇄" -#: src/slic3r/GUI/Tab.cpp:2141 src/libslic3r/PrintConfig.cpp:138 +#: src/slic3r/GUI/Tab.cpp:1972 src/libslic3r/PrintConfig.cpp:143 msgid "Before layer change G-code" msgstr "레이어 변경 전 G 코드" -#: src/slic3r/GUI/Tab.cpp:2147 src/libslic3r/PrintConfig.cpp:1056 +#: src/slic3r/GUI/Tab.cpp:1978 src/libslic3r/PrintConfig.cpp:1081 msgid "After layer change G-code" msgstr "레이어 변경 후 G 코드" -#: src/slic3r/GUI/Tab.cpp:2153 src/libslic3r/PrintConfig.cpp:2056 +#: src/slic3r/GUI/Tab.cpp:1984 src/libslic3r/PrintConfig.cpp:2103 msgid "Tool change G-code" msgstr "툴 채인지 G 코드" -#: src/slic3r/GUI/Tab.cpp:2159 +#: src/slic3r/GUI/Tab.cpp:1990 msgid "Between objects G-code (for sequential printing)" -msgstr "객체 간 G 코드 (순차 인쇄용)" +msgstr "객체(object) 간 G 코드 (순차 인쇄용)" -#: src/slic3r/GUI/Tab.cpp:2231 +#: src/slic3r/GUI/Tab.cpp:2062 msgid "Display" msgstr "표시" -#: src/slic3r/GUI/Tab.cpp:2246 +#: src/slic3r/GUI/Tab.cpp:2077 msgid "Tilt" msgstr "기울이기" -#: src/slic3r/GUI/Tab.cpp:2247 +#: src/slic3r/GUI/Tab.cpp:2078 msgid "Tilt time" msgstr "기울이기 시간" -#: src/slic3r/GUI/Tab.cpp:2253 src/slic3r/GUI/Tab.cpp:3568 +#: src/slic3r/GUI/Tab.cpp:2084 src/slic3r/GUI/Tab.cpp:3489 msgid "Corrections" msgstr "수정" -#: src/slic3r/GUI/Tab.cpp:2333 src/slic3r/GUI/Tab.cpp:2418 -#: src/libslic3r/PrintConfig.cpp:1106 src/libslic3r/PrintConfig.cpp:1124 -#: src/libslic3r/PrintConfig.cpp:1142 src/libslic3r/PrintConfig.cpp:1159 -#: src/libslic3r/PrintConfig.cpp:1170 src/libslic3r/PrintConfig.cpp:1181 -#: src/libslic3r/PrintConfig.cpp:1192 +#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:3485 +msgid "Exposure" +msgstr "노출" + +#: src/slic3r/GUI/Tab.cpp:2170 src/slic3r/GUI/Tab.cpp:2255 +#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1149 +#: src/libslic3r/PrintConfig.cpp:1167 src/libslic3r/PrintConfig.cpp:1184 +#: src/libslic3r/PrintConfig.cpp:1195 src/libslic3r/PrintConfig.cpp:1206 +#: src/libslic3r/PrintConfig.cpp:1217 msgid "Machine limits" msgstr "머신 한계설정" -#: src/slic3r/GUI/Tab.cpp:2347 +#: src/slic3r/GUI/Tab.cpp:2184 msgid "Values in this column are for Normal mode" msgstr "이 열의 값은 일반 모드입니다" -#: src/slic3r/GUI/Tab.cpp:2348 +#: src/slic3r/GUI/Tab.cpp:2185 msgid "Normal" msgstr "보통" -#: src/slic3r/GUI/Tab.cpp:2353 +#: src/slic3r/GUI/Tab.cpp:2190 msgid "Values in this column are for Stealth mode" msgstr "이 열의 값은 무음 모드 용입니다" -#: src/slic3r/GUI/Tab.cpp:2354 +#: src/slic3r/GUI/Tab.cpp:2191 msgid "Stealth" msgstr "스텔스" -#: src/slic3r/GUI/Tab.cpp:2362 +#: src/slic3r/GUI/Tab.cpp:2199 msgid "Maximum feedrates" msgstr "최대 이송속도" -#: src/slic3r/GUI/Tab.cpp:2367 +#: src/slic3r/GUI/Tab.cpp:2204 msgid "Maximum accelerations" msgstr "최고 가속도" -#: src/slic3r/GUI/Tab.cpp:2374 +#: src/slic3r/GUI/Tab.cpp:2211 msgid "Jerk limits" msgstr "저크(Jerk)값 한계" -#: src/slic3r/GUI/Tab.cpp:2379 +#: src/slic3r/GUI/Tab.cpp:2216 msgid "Minimum feedrates" msgstr "최대 이송속도" -#: src/slic3r/GUI/Tab.cpp:2443 src/slic3r/GUI/Tab.cpp:2451 +#: src/slic3r/GUI/Tab.cpp:2280 src/slic3r/GUI/Tab.cpp:2288 msgid "Single extruder MM setup" msgstr "싱글 익스트루더 MM 설정" -#: src/slic3r/GUI/Tab.cpp:2452 +#: src/slic3r/GUI/Tab.cpp:2289 msgid "Single extruder multimaterial parameters" msgstr "싱글 익스트루더 멀티메터리알 파라미터" -#: src/slic3r/GUI/Tab.cpp:2465 src/libslic3r/GCode/PreviewData.cpp:477 -#, c-format -msgid "Extruder %d" -msgstr "익스트루더 %d" +#: src/slic3r/GUI/Tab.cpp:2320 +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:2483 -msgid "Do you want to change the diameter for all extruders?" -msgstr "모든 압출기의 지름을 변경하시겠습니까?" - -#: src/slic3r/GUI/Tab.cpp:2506 +#: src/slic3r/GUI/Tab.cpp:2344 msgid "Layer height limits" msgstr "레이어 높이 한계치" -#: src/slic3r/GUI/Tab.cpp:2511 +#: src/slic3r/GUI/Tab.cpp:2349 msgid "Position (for multi-extruder printers)" -msgstr "위치 (멀티 익스트루더 프린터 포함)" +msgstr "위치 (다중 익스트루더 프린터 포함)" -#: src/slic3r/GUI/Tab.cpp:2517 +#: src/slic3r/GUI/Tab.cpp:2355 msgid "Only lift Z" msgstr "Z축 올림" -#: src/slic3r/GUI/Tab.cpp:2530 +#: src/slic3r/GUI/Tab.cpp:2368 msgid "" "Retraction when tool is disabled (advanced settings for multi-extruder " "setups)" -msgstr "도구 비활성화시 리트렉션 (멀티 익스트루더 고급 설정)" +msgstr "도구 비활성화시 리트렉션 (다중 익스트루더 고급 설정)" -#: src/slic3r/GUI/Tab.cpp:2693 +#: src/slic3r/GUI/Tab.cpp:2376 +msgid "Reset to Filament Color" +msgstr "필라멘트 색상으로 재설정" + +#: src/slic3r/GUI/Tab.cpp:2557 msgid "" "The Wipe option is not available when using the Firmware Retraction mode.\n" "\n" @@ -4484,92 +5606,101 @@ msgstr "" "\n" "펌웨어 리트렉션 하려면 비활성화해야합니까?" -#: src/slic3r/GUI/Tab.cpp:2695 +#: src/slic3r/GUI/Tab.cpp:2559 msgid "Firmware Retraction" msgstr "펌웨어 레트렉션" -#: src/slic3r/GUI/Tab.cpp:3024 +#: src/slic3r/GUI/Tab.cpp:2889 #, c-format msgid "Default preset (%s)" msgstr "시스템 기본값 (%s)" -#: src/slic3r/GUI/Tab.cpp:3025 +#: src/slic3r/GUI/Tab.cpp:2890 #, c-format msgid "Preset (%s)" msgstr "프리셋 ( %s)" -#: src/slic3r/GUI/Tab.cpp:3042 +#: src/slic3r/GUI/Tab.cpp:2907 msgid "has the following unsaved changes:" msgstr "저장되지 않은 수정사항:" -#: src/slic3r/GUI/Tab.cpp:3045 +#: src/slic3r/GUI/Tab.cpp:2910 msgid "is not compatible with printer" msgstr "프린터와 호완 되지 않습니다" -#: src/slic3r/GUI/Tab.cpp:3046 +#: src/slic3r/GUI/Tab.cpp:2911 msgid "is not compatible with print profile" msgstr "인쇄 프로필과 호환 되지 않음" -#: src/slic3r/GUI/Tab.cpp:3048 +#: src/slic3r/GUI/Tab.cpp:2913 msgid "and it has the following unsaved changes:" msgstr "저장되지 않은 변경점은 다음과 같습니다:" -#: src/slic3r/GUI/Tab.cpp:3052 +#: src/slic3r/GUI/Tab.cpp:2917 msgid "Unsaved Changes" msgstr "미 저장된 변경점" -#: src/slic3r/GUI/Tab.cpp:3143 +#: src/slic3r/GUI/Tab.cpp:3015 +msgctxt "PresetName" msgid "%1% - Copy" msgstr "%1%-복사" -#: src/slic3r/GUI/Tab.cpp:3166 +#: src/slic3r/GUI/Tab.cpp:3038 msgid "The supplied name is empty. It can't be saved." msgstr "파일 이름이 비어 있습니다. 저장할 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:3171 +#: src/slic3r/GUI/Tab.cpp:3043 msgid "Cannot overwrite a system profile." msgstr "시스템 프로파일을 겹쳐 쓸 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:3175 +#: src/slic3r/GUI/Tab.cpp:3047 msgid "Cannot overwrite an external profile." msgstr "외부 프로필을 덮어 쓸 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:3201 +#: src/slic3r/GUI/Tab.cpp:3052 +msgid "Preset with name \"%1%\" already exists." +msgstr "이름 \"%1%\"가 있는 사전 설정이 이미 있습니다." + +#: src/slic3r/GUI/Tab.cpp:3053 +msgid "Replace?" +msgstr "교체?" + +#: src/slic3r/GUI/Tab.cpp:3091 msgid "remove" msgstr "제거(remove)" -#: src/slic3r/GUI/Tab.cpp:3201 +#: src/slic3r/GUI/Tab.cpp:3091 msgid "delete" msgstr "지우기" #. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:3203 +#: src/slic3r/GUI/Tab.cpp:3093 msgid "Are you sure you want to %1% the selected preset?" msgstr "선택한 사전 설정의 %1%를 선택 하시겠습니까?" #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:3206 +#: src/slic3r/GUI/Tab.cpp:3096 msgid "%1% Preset" msgstr "%1% 기본설정" -#: src/slic3r/GUI/Tab.cpp:3332 +#: src/slic3r/GUI/Tab.cpp:3222 msgid "LOCKED LOCK" msgstr "잠긴 잠금" #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3334 +#: src/slic3r/GUI/Tab.cpp:3224 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:3336 +#: src/slic3r/GUI/Tab.cpp:3226 msgid "UNLOCKED LOCK" msgstr "잠금 해제 잠금" #. TRN Description for "UNLOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3338 +#: src/slic3r/GUI/Tab.cpp:3228 msgid "" "indicates that some settings were changed and are not equal to the system " "(or default) values for the current option group.\n" @@ -4581,25 +5712,25 @@ msgstr "" "잠금 해제 잠금 아이콘을 클릭하여 현재 옵션 그룹에 대한 모든 설정을 시스템(또" "는 기본값) 값으로 재설정합니다." -#: src/slic3r/GUI/Tab.cpp:3343 +#: src/slic3r/GUI/Tab.cpp:3233 msgid "WHITE BULLET" msgstr "흰색 글머리 기호" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3345 +#: src/slic3r/GUI/Tab.cpp:3235 msgid "" -"for the left button: \tindicates a non-system (or non-default) preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." msgstr "" "왼쪽 단추의 경우: 비시스템(또는 기본이 아닌) 사전 설정을 나타냅니다.\n" "오른쪽 버튼: 설정이 수정되지 않았음을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3348 +#: src/slic3r/GUI/Tab.cpp:3238 msgid "BACK ARROW" msgstr "돌아가기 화살표" #. TRN Description for "BACK ARROW" -#: src/slic3r/GUI/Tab.cpp:3350 +#: src/slic3r/GUI/Tab.cpp:3240 msgid "" "indicates that the settings were changed and are not equal to the last saved " "preset for the current option group.\n" @@ -4611,7 +5742,7 @@ msgstr "" "현재 옵션 그룹의 모든 설정을 시스템 값으로 재설정하려면 자물쇠 잠금 아이콘을 " "클릭하십시오." -#: src/slic3r/GUI/Tab.cpp:3360 +#: src/slic3r/GUI/Tab.cpp:3250 msgid "" "LOCKED LOCK icon indicates that the settings are the same as the system (or " "default) values for the current option group" @@ -4619,7 +5750,7 @@ msgstr "" "LOCKED LOCK 아이콘은 설정이 현재 옵션 그룹의 시스템(또는 기본값) 값과 동일하" "다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3362 +#: src/slic3r/GUI/Tab.cpp:3252 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" @@ -4631,11 +5762,11 @@ msgstr "" "현재 옵션 그룹에 대한 모든 설정을 시스템(또는 기본값) 값으로 재설정하려면 클" "릭합니다." -#: src/slic3r/GUI/Tab.cpp:3365 +#: src/slic3r/GUI/Tab.cpp:3255 msgid "WHITE BULLET icon indicates a non system (or non default) preset." msgstr "WHITE BULLET 아이콘은 시스템 사전 설정이 아닌 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3368 +#: src/slic3r/GUI/Tab.cpp:3258 msgid "" "WHITE BULLET icon indicates that the settings are the same as in the last " "saved preset for the current option group." @@ -4643,7 +5774,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 설정이 현재 옵션 그룹에 대해 마지막으로 저장 된 사" "전 설정과 동일 하다는 것을 나타냅니다." -#: src/slic3r/GUI/Tab.cpp:3370 +#: src/slic3r/GUI/Tab.cpp:3260 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" @@ -4655,7 +5786,7 @@ msgstr "" "마지막 현재 옵션 그룹에 대 한 모든 설정 다시 설정을 클릭 하 여 사전 설정을 저" "장." -#: src/slic3r/GUI/Tab.cpp:3376 +#: src/slic3r/GUI/Tab.cpp:3266 msgid "" "LOCKED LOCK icon indicates that the value is the same as the system (or " "default) value." @@ -4663,7 +5794,7 @@ msgstr "" "LOCKED LOCK 아이콘은 값이 시스템(또는 기본값) 값과 동일하다는 것을 나타냅니" "다." -#: src/slic3r/GUI/Tab.cpp:3377 +#: src/slic3r/GUI/Tab.cpp:3267 msgid "" "UNLOCKED LOCK icon indicates that the value was changed and is not equal to " "the system (or default) value.\n" @@ -4673,7 +5804,7 @@ msgstr "" "을 나타냅니다.\n" "현재 값을 시스템(또는 기본값) 값으로 재설정하려면 클릭합니다." -#: src/slic3r/GUI/Tab.cpp:3383 +#: src/slic3r/GUI/Tab.cpp:3273 msgid "" "WHITE BULLET icon indicates that the value is the same as in the last saved " "preset." @@ -4681,7 +5812,7 @@ msgstr "" "WHITE BULLET 기호 아이콘은 마지막으로 저장 한 사전 설정과 동일한 값을 나타냅" "니다." -#: src/slic3r/GUI/Tab.cpp:3384 +#: src/slic3r/GUI/Tab.cpp:3274 msgid "" "BACK ARROW icon indicates that the value was changed and is not equal to the " "last saved preset.\n" @@ -4692,81 +5823,56 @@ msgstr "" "현재 값을 마지막으로 저장된 사전 설정으로 재설정하려면 클릭합니다." #. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3497 +#: src/slic3r/GUI/Tab.cpp:3387 #, c-format msgid "Save %s as:" msgstr "Save %s as:" -#: src/slic3r/GUI/Tab.cpp:3541 +#: src/slic3r/GUI/Tab.cpp:3431 msgid "the following suffix is not allowed:" msgstr "다음 접미사는 허용되지 않습니다:" -#: src/slic3r/GUI/Tab.cpp:3545 +#: src/slic3r/GUI/Tab.cpp:3435 msgid "The supplied name is not available." msgstr "제공된 이름을 사용할 수 없습니다." -#: src/slic3r/GUI/Tab.cpp:3558 +#: src/slic3r/GUI/Tab.cpp:3448 src/slic3r/GUI/Tab.cpp:3450 msgid "Material" msgstr "재료" -#: src/slic3r/GUI/Tab.cpp:3560 src/slic3r/GUI/Tab.cpp:3651 -#: src/slic3r/GUI/wxExtensions.cpp:454 -msgid "Layers" -msgstr "레이어" - -#: src/slic3r/GUI/Tab.cpp:3564 -msgid "Exposure" -msgstr "노출" - -#: src/slic3r/GUI/Tab.cpp:3659 +#: src/slic3r/GUI/Tab.cpp:3580 msgid "Support head" msgstr "서포트 헤드" -#: src/slic3r/GUI/Tab.cpp:3664 +#: src/slic3r/GUI/Tab.cpp:3585 msgid "Support pillar" msgstr "서포트 기둥" -#: src/slic3r/GUI/Tab.cpp:3675 +#: src/slic3r/GUI/Tab.cpp:3599 msgid "Connection of the support sticks and junctions" msgstr "서포트 기둥 및 접합부 연결" -#: src/slic3r/GUI/Tab.cpp:3680 +#: src/slic3r/GUI/Tab.cpp:3604 msgid "Automatic generation" msgstr "자동 생성" -#: src/slic3r/GUI/Tab.cpp:3747 -msgid "Head penetration should not be greater than the head width." -msgstr "헤드 관통은 헤드 폭 보다 크지 않아야 합니다." - -#: src/slic3r/GUI/Tab.cpp:3751 -msgid "Invalid Head penetration" -msgstr "잘못된 헤드 관통" - -#: src/slic3r/GUI/Tab.cpp:3767 -msgid "Pinhead diameter should be smaller than the pillar diameter." -msgstr "핀헤드 지름은 기둥 지름 보다 작아야 합니다." - -#: src/slic3r/GUI/Tab.cpp:3771 -msgid "Invalid pinhead diameter" -msgstr "잘못된 핀 헤드 지름" - -#: src/slic3r/GUI/Tab.hpp:324 src/slic3r/GUI/Tab.hpp:422 +#: src/slic3r/GUI/Tab.hpp:327 src/slic3r/GUI/Tab.hpp:429 msgid "Print Settings" msgstr "출력 설정" -#: src/slic3r/GUI/Tab.hpp:348 +#: src/slic3r/GUI/Tab.hpp:354 msgid "Filament Settings" msgstr "필라멘트 설정" -#: src/slic3r/GUI/Tab.hpp:383 +#: src/slic3r/GUI/Tab.hpp:390 msgid "Printer Settings" msgstr "프린터 설정" -#: src/slic3r/GUI/Tab.hpp:407 +#: src/slic3r/GUI/Tab.hpp:414 msgid "Material Settings" msgstr "재질 설정" -#: src/slic3r/GUI/Tab.hpp:434 +#: src/slic3r/GUI/Tab.hpp:441 msgid "Save preset" msgstr "사전 설정 저장" @@ -4779,39 +5885,40 @@ msgstr "사용가능한 업데이트" msgid "New version of %s is available" msgstr "%s의 새 버전을 사용할 수 있습니다" -#: src/slic3r/GUI/UpdateDialogs.cpp:45 +#: src/slic3r/GUI/UpdateDialogs.cpp:43 msgid "Current version:" msgstr "현재 버전:" -#: src/slic3r/GUI/UpdateDialogs.cpp:47 +#: src/slic3r/GUI/UpdateDialogs.cpp:45 msgid "New version:" msgstr "새로운 버전:" -#: src/slic3r/GUI/UpdateDialogs.cpp:55 +#: src/slic3r/GUI/UpdateDialogs.cpp:53 msgid "Changelog && Download" msgstr "변경 로그 및 다운로드" -#: src/slic3r/GUI/UpdateDialogs.cpp:62 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: 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:67 +#: src/slic3r/GUI/UpdateDialogs.cpp:65 msgid "Open download page" msgstr "다운로드 페이지 열기" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 +#: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" msgstr "새로운 수정사항에 대해 더 이상 알림 안 함" -#: src/slic3r/GUI/UpdateDialogs.cpp:91 src/slic3r/GUI/UpdateDialogs.cpp:205 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" msgstr "구성 업데이트" -#: src/slic3r/GUI/UpdateDialogs.cpp:91 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 msgid "Configuration update is available" msgstr "구성 업데이트를 사용할 수 있음" -#: src/slic3r/GUI/UpdateDialogs.cpp:94 +#: src/slic3r/GUI/UpdateDialogs.cpp:92 msgid "" "Would you like to install it?\n" "\n" @@ -4827,21 +5934,47 @@ msgstr "" "\n" "업데이트 된 구성 번들 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:115 +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 msgid "Comment:" -msgstr "\"댓글\"" +msgstr "코멘트:" -#: src/slic3r/GUI/UpdateDialogs.cpp:149 +#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 #, c-format msgid "%s incompatibility" msgstr "%s 비 호환성" -#: src/slic3r/GUI/UpdateDialogs.cpp:150 +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +msgid "Configuration update is necessary to install" +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:155 +#: src/slic3r/GUI/UpdateDialogs.cpp:216 #, c-format msgid "" "This version of %s is not compatible with currently installed configuration " @@ -4851,34 +5984,29 @@ msgid "" "\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.\n" +"existing configuration before installing files compatible with this %s." msgstr "" "%s의 이 버전은 현재 설치 된 구성 번들과 호환 되지 않습니다.\n" "이것은 새로운 것을 사용한 후 이전 %s를 실행 한 결과로 발생 했을 것입니다.\n" "\n" " %s를 종료하고 최신 버전으로 다시 시도 하거나 초기 구성을 다시 실행할 수 있습" "니다. 이렇게 하면 %s와 호환 되는 파일을 설치하기 전에 기존 구성의 백업 스냅샷" -"이 생성 됩니다.\n" +"이 생성 됩니다." -#: src/slic3r/GUI/UpdateDialogs.cpp:164 +#: src/slic3r/GUI/UpdateDialogs.cpp:225 #, c-format msgid "This %s version: %s" msgstr "이 %s 버전: %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:169 +#: src/slic3r/GUI/UpdateDialogs.cpp:230 msgid "Incompatible bundles:" msgstr "호환되지 않는 번들 :" -#: src/slic3r/GUI/UpdateDialogs.cpp:185 -#, c-format -msgid "Exit %s" -msgstr "%s Exit" - -#: src/slic3r/GUI/UpdateDialogs.cpp:188 +#: src/slic3r/GUI/UpdateDialogs.cpp:249 msgid "Re-configure" msgstr "재구성" -#: src/slic3r/GUI/UpdateDialogs.cpp:209 +#: src/slic3r/GUI/UpdateDialogs.cpp:270 #, c-format msgid "" "%s now uses an updated configuration structure.\n" @@ -4904,15 +6032,28 @@ msgstr "" "다음의 %s를 계속 진행하여 새 프리셋을 설정하고 자동 프리셋 업데이트를 사용할" "지 여부를 선택하십시오." -#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#: src/slic3r/GUI/UpdateDialogs.cpp:286 msgid "For more information please visit our wiki page:" msgstr "자세한 정보는 위키 페이지를 참조하십시오 :" -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "Configuration updates" +msgstr "구성 업데이트" + +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "No updates aviable" +msgstr "실행 가능한 업데이트없음" + +#: src/slic3r/GUI/UpdateDialogs.cpp:308 +#, c-format +msgid "%s has no configuration updates aviable." +msgstr "%s에는 구성 업데이트가 실행 가능한 업데이트가 없습니다." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" msgstr "사용자 정의 다지기(Ramming)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 +#: src/slic3r/GUI/WipeTowerDialog.cpp:41 msgid "" "Ramming denotes the rapid extrusion just before a tool change in a single-" "extruder MM printer. Its purpose is to properly shape the end of the " @@ -4924,7 +6065,7 @@ msgid "" "This is an expert-level setting, incorrect adjustment will likely lead to " "jams, extruder wheel grinding into filament etc." msgstr "" -"래밍은 단일 압출기 MM 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. " +"래밍은 단일 압출기 MMU 프린터에서 공구 교환 직전의 신속한 압출을 나타냅니다. " "그 목적은 언로드 된 필라멘트의 끝 부분을 적절히 형성하여 새로운 필라멘트의 삽" "입을 방지하고 나중에 다시 삽입 할 수 있도록하기위한 것입니다. 이 단계는 중요" "하며 다른 재료는 좋은 모양을 얻기 위해 다른 압출 속도를 요구할 수 있습니다. " @@ -4933,49 +6074,49 @@ msgstr "" "전문가 수준의 설정이므로 잘못된 조정으로 인해 용지 걸림, 압출기 휠이 필라멘" "트 등에 연삭 될 수 있습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" msgstr "총 래밍 시간" -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 msgid "Total rammed volume" msgstr "총 레미드 양" -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 msgid "Ramming line width" msgstr "래밍 선 너비" -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 msgid "Ramming line spacing" msgstr "래밍 선 간격" -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" msgstr "와이프 타워 - 버려진 필라멘트 조절" -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 msgid "" "Here you can adjust required purging volume (mm³) for any given pair of " "tools." msgstr "여기서 주어진 도구 쌍에 필요한 정화 용량 (mm³)을 조정할 수 있습니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:226 +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" msgstr "익스트루더 번경" -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 msgid "unloaded" msgstr "언로드(unloaded)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" msgstr "로드(loaded)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" msgstr "도구(Tool) #" -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +#: src/slic3r/GUI/WipeTowerDialog.cpp:285 msgid "" "Total purging volume is calculated by summing two values below, depending on " "which tools are loaded/unloaded." @@ -4983,15 +6124,15 @@ msgstr "" "총 정화 량은 어느 공구가로드 / 언로드되는지에 따라 아래의 두 값을 합산하여 계" "산됩니다." -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 msgid "Volume to purge (mm³) when the filament is being" msgstr "제거할 필라멘트 양 (mm³)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 msgid "From" msgstr "From" -#: src/slic3r/GUI/WipeTowerDialog.cpp:327 +#: src/slic3r/GUI/WipeTowerDialog.cpp:365 msgid "" "Switching to simple settings will discard changes done in the advanced " "mode!\n" @@ -5002,108 +6143,62 @@ msgstr "" "\n" "계속하시겠습니까?" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show simplified settings" msgstr "간단한 설정보기" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show advanced settings" msgstr "고급 설정보기" -#: src/slic3r/GUI/wxExtensions.cpp:443 -msgid "Instances" -msgstr "복제본" - -#: src/slic3r/GUI/wxExtensions.cpp:447 src/slic3r/GUI/wxExtensions.cpp:592 -#, c-format -msgid "Instance %d" -msgstr "복제본 %d" - -#: src/slic3r/GUI/wxExtensions.cpp:486 -msgid "Range" -msgstr "범위" - -#: src/slic3r/GUI/wxExtensions.cpp:2570 -msgid "One layer mode" -msgstr "하나의 레이어 모드" - -#: src/slic3r/GUI/wxExtensions.cpp:2571 -msgid "Add/Del color change" -msgstr "현재 레이어의 색상 변경 마커 추가" - -#: src/slic3r/GUI/wxExtensions.cpp:2572 -msgid "Discard all color changes" -msgstr "모든 색상 변경 무시" - -#: src/slic3r/GUI/wxExtensions.cpp:2832 +#: src/slic3r/GUI/wxExtensions.cpp:680 #, c-format msgid "Switch to the %s mode" msgstr "%s 모드로 전환" -#: src/slic3r/GUI/wxExtensions.cpp:2833 +#: src/slic3r/GUI/wxExtensions.cpp:681 #, c-format msgid "Current mode is %s" msgstr "현재 모드는 %s입니다" -#: src/slic3r/Utils/Duet.cpp:51 -msgid "Connection to Duet works correctly." -msgstr "듀엣보드에 대한 연결이 올바르게 작동 합니다." - -#: src/slic3r/Utils/Duet.cpp:56 -msgid "Could not connect to Duet" -msgstr "듀엣보드에 연결할 수 없습니다" - -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 -msgid "Unknown error occured" -msgstr "알 수 없는 오류가 발생 했습니다" - -#: src/slic3r/Utils/Duet.cpp:148 -msgid "Wrong password" -msgstr "잘못된 암호" - -#: src/slic3r/Utils/Duet.cpp:151 -msgid "Could not get resources to create a new connection" -msgstr "새 연결을 만들 리소스를 가져올수 없습니다" - -#: src/slic3r/Utils/OctoPrint.cpp:69 +#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68 #, c-format msgid "Mismatched type of print host: %s" msgstr "일치 하지않는 인쇄 호스트 유형: %s" -#: src/slic3r/Utils/OctoPrint.cpp:84 -msgid "Connection to OctoPrint works correctly." -msgstr "OctoPrint에 연결하면 올바르게 작동합니다." +#: src/slic3r/Utils/AstroBox.cpp:83 +msgid "Connection to AstroBox works correctly." +msgstr "아스트로박스에 대한 연결이 올바르게 작동합니다." -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Could not connect to OctoPrint" -msgstr "OctoPrint에 연결할 수 없습니다" +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Could not connect to AstroBox" +msgstr "아스트로박스에 연결할 수 없습니다." -#: src/slic3r/Utils/OctoPrint.cpp:90 -msgid "Note: OctoPrint version at least 1.1.0 is required." -msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Note: AstroBox version at least 1.1.0 is required." +msgstr "참고: 아스트로박스 버전은 최소 1.1.0이 필요합니다." -#: src/slic3r/Utils/OctoPrint.cpp:195 -msgid "Connection to Prusa SL1 works correctly." -msgstr "Prusa SL1에 대한 연결이 제대로 작동 합니다." +#: src/slic3r/Utils/Duet.cpp:49 +msgid "Connection to Duet works correctly." +msgstr "듀엣보드에 대한 연결이 올바르게 작동 합니다." -#: src/slic3r/Utils/OctoPrint.cpp:200 -msgid "Could not connect to Prusa SLA" -msgstr "Prusa SLA에 연결할 수 없습니다" +#: src/slic3r/Utils/Duet.cpp:54 +msgid "Could not connect to Duet" +msgstr "듀엣보드에 연결할 수 없습니다" -#: src/slic3r/Utils/PresetUpdater.cpp:614 -#, c-format -msgid "requires min. %s and max. %s" -msgstr "최소. %s 와 최대. %s" +#: 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 +msgid "Unknown error occured" +msgstr "알 수 없는 오류가 발생 했습니다" -#: src/slic3r/Utils/PresetUpdater.cpp:619 -#, c-format -msgid "requires min. %s" -msgstr "최소 %s가 필요 합니다" +#: src/slic3r/Utils/Duet.cpp:131 +msgid "Wrong password" +msgstr "잘못된 암호" -#: src/slic3r/Utils/PresetUpdater.cpp:621 -#, c-format -msgid "requires max. %s" -msgstr "최대 필요 합니다. %s" +#: src/slic3r/Utils/Duet.cpp:134 +msgid "Could not get resources to create a new connection" +msgstr "새 연결을 만들 리소스를 가져올수 없습니다" #: src/slic3r/Utils/FixModelByWin10.cpp:219 #: src/slic3r/Utils/FixModelByWin10.cpp:359 @@ -5123,7 +6218,7 @@ msgid "Mesh repair failed." msgstr "메쉬 복구에 실패 했습니다." #: src/slic3r/Utils/FixModelByWin10.cpp:251 -#: src/slic3r/Utils/FixModelByWin10.cpp:378 +#: src/slic3r/Utils/FixModelByWin10.cpp:385 msgid "Loading repaired model" msgstr "복구 된 모델 로드" @@ -5141,50 +6236,110 @@ msgstr "모델 고정" msgid "Exporting model..." msgstr "소스 모델 내보내기..." -#: src/slic3r/Utils/FixModelByWin10.cpp:368 +#: src/slic3r/Utils/FixModelByWin10.cpp:369 +#: src/slic3r/Utils/FixModelByWin10.cpp:374 msgid "Export of a temporary 3mf file failed" msgstr "임시 3mf 파일을 내보내지 못했습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:383 +#: src/slic3r/Utils/FixModelByWin10.cpp:390 msgid "Import of the repaired 3mf file failed" msgstr "복구된 3mf 파일을 가져오지 못했습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:385 +#: src/slic3r/Utils/FixModelByWin10.cpp:392 msgid "Repaired 3MF file does not contain any object" -msgstr "복구된 3MF 파일에 개체가 포함 되어있지 않습니다" +msgstr "복구된 3MF 파일에 객체(object)가 포함 되어있지 않습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:387 +#: src/slic3r/Utils/FixModelByWin10.cpp:394 msgid "Repaired 3MF file contains more than one object" -msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" +msgstr "복구된 3MF 파일에 둘 이상의 객체(object)가 포함되어 있습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:389 +#: src/slic3r/Utils/FixModelByWin10.cpp:396 msgid "Repaired 3MF file does not contain any volume" -msgstr "복구 된 3MF 파일에 개체가 포함 되어있지 않습니다" +msgstr "복구 된 3MF 파일에 객체(object)가 포함 되어있지 않습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:391 +#: src/slic3r/Utils/FixModelByWin10.cpp:398 msgid "Repaired 3MF file contains more than one volume" -msgstr "복구된 3MF 파일에 둘 이상의 개체가 포함되어 있습니다" +msgstr "복구된 3MF 파일에 둘 이상의 객체(object)가 포함되어 있습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:400 +#: src/slic3r/Utils/FixModelByWin10.cpp:407 msgid "Model repair finished" msgstr "모델 수리 완료" -#: src/slic3r/Utils/FixModelByWin10.cpp:406 +#: src/slic3r/Utils/FixModelByWin10.cpp:413 msgid "Model repair canceled" msgstr "모델 복구가 취소 되었습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:423 +#: src/slic3r/Utils/FixModelByWin10.cpp:430 msgid "Model repaired successfully" msgstr "모델이 성공적으로 복구 되었습니다" -#: src/slic3r/Utils/FixModelByWin10.cpp:423 -#: src/slic3r/Utils/FixModelByWin10.cpp:426 +#: src/slic3r/Utils/FixModelByWin10.cpp:430 +#: src/slic3r/Utils/FixModelByWin10.cpp:433 msgid "Model Repair by the Netfabb service" msgstr "Netfabb 서비스에의 한 모델 복구" -#: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" -msgstr "모델 복구 실패:\n" +#: src/slic3r/Utils/FixModelByWin10.cpp:433 +msgid "Model repair failed:" +msgstr "모델 복구 실패:" + +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "FlashAir 카드에서 업로드가 활성화되지 않았습니다." + +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "FlashAir에 대한 연결이 올바르게 작동하고 업로드가 활성화되어 있습니다." + +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "Could not connect to FlashAir" +msgstr "플래시 에어에 연결할 수 없습니다." + +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" +"참고 : 펌웨어 2.00.02 이상 및 활성화 된 업로드 기능이있는 FlashAir가 필요합니" +"다." + +#: 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:89 +msgid "Note: OctoPrint version at least 1.1.0 is required." +msgstr "참고 : OctoPrint 버전 1.1.0 이상이 필요합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:176 +msgid "Connection to Prusa SL1 works correctly." +msgstr "Prusa SL1에 대한 연결이 제대로 작동 합니다." + +#: src/slic3r/Utils/OctoPrint.cpp:181 +msgid "Could not connect to Prusa SLA" +msgstr "Prusa SLA에 연결할 수 없습니다" + +#: src/slic3r/Utils/PresetUpdater.cpp:705 +#, c-format +msgid "requires min. %s and max. %s" +msgstr "최소. %s 와 최대. %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:710 +#, c-format +msgid "requires min. %s" +msgstr "최소 %s가 필요 합니다" + +#: src/slic3r/Utils/PresetUpdater.cpp:713 +#, c-format +msgid "requires max. %s" +msgstr "최대 필요 합니다. %s" + +#: src/libslic3r/SLA/Pad.cpp:691 +msgid "Pad brim size is too small for the current configuration." +msgstr "패드 테두리 크기가 현재 구성에 너무 작습니다." #: src/libslic3r/Zipper.cpp:32 msgid "undefined error" @@ -5224,7 +6379,7 @@ msgstr "잘못 된 헤더 또는 아카이브가 손상 되었습니다" #: src/libslic3r/Zipper.cpp:50 msgid "unsupported multidisk archive" -msgstr "지원 되지 않는 멀티 디스크 아카이브" +msgstr "지원 되지 않는 다중 디스크 아카이브" #: src/libslic3r/Zipper.cpp:52 msgid "decompression failed or archive is corrupted" @@ -5296,7 +6451,7 @@ msgstr "내부 오류" #: src/libslic3r/Zipper.cpp:86 msgid "file not found" -msgstr "파일을 찾을수 없다" +msgstr "파일을 찾을 수 없습니다." #: src/libslic3r/Zipper.cpp:88 msgid "archive is too large" @@ -5314,33 +6469,77 @@ msgstr "쓰기 다시 실패" msgid "Error with zip archive" msgstr "zip 아카이브와 오류가 발생 했습니다" -#: src/libslic3r/Print.cpp:1093 +#: src/libslic3r/GCode.cpp:637 +msgid "Empty layers detected, the output would not be printable." +msgstr "빈 레이어가 감지되면 출력을 인쇄할 수 없습니다." + +#: src/libslic3r/GCode.cpp:638 +msgid "Print z" +msgstr "인쇄 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 "" +"이는 일반적으로 무시할 수 있는 작은 돌출 또는 결함이 있는 모델에 의해 발생합" +"니다. 모델을 수리하거나 배드에서 방향을 변경하십시오." + +#: src/libslic3r/ExtrusionEntity.cpp:323 +msgid "Mixed" +msgstr "혼합" + +#: src/libslic3r/Flow.cpp:55 +msgid "" +"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible." +msgstr "" +"%1%에 대한 압출 폭을 계산할 수 없습니다: 변수 \"%2%\"에 액세스할 수 없습니다." + +#: 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 "선택한 3mf 파일은 %1%의 최신 버전으로 저장되었으며 호환되지 않습니다." + +#: 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 "선택한 amf 파일은 %1%의 최신 버전으로 저장되었으며 호환되지 않습니다." + +#: src/libslic3r/Print.cpp:1158 msgid "All objects are outside of the print volume." -msgstr "모든 개체가 인쇄 볼륨 외부에 있습니다." +msgstr "모든 객체(object)가 인쇄 볼륨 외부에 있습니다." -#: src/libslic3r/Print.cpp:1120 +#: src/libslic3r/Print.cpp:1161 +msgid "The supplied settings will cause an empty print." +msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." + +#: src/libslic3r/Print.cpp:1188 msgid "Some objects are too close; your extruder will collide with them." -msgstr "일부 개체가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." +msgstr "" +"일부 객체(object)가 너무 가깝습니다. 귀하의 압출기가 그들과 충돌합니다." -#: src/libslic3r/Print.cpp:1135 +#: src/libslic3r/Print.cpp:1203 msgid "" "Some objects are too tall and cannot be printed without extruder collisions." -msgstr "일부 개체는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." +msgstr "일부 객체(object)는 너무 크고 익스트루더 충돌없이 인쇄 할 수 없습니다." -#: src/libslic3r/Print.cpp:1145 +#: src/libslic3r/Print.cpp:1213 msgid "The Spiral Vase option can only be used when printing a single object." msgstr "" -"나선형 꽃병(Spiral Vase) 옵션은 단일 개체를 인쇄 할 때만 사용할 수 있습니다." +"나선형 꽃병(Spiral Vase) 옵션은 단일 객체(object)를 인쇄 할 때만 사용할 수 있" +"습니다." -#: src/libslic3r/Print.cpp:1147 +#: src/libslic3r/Print.cpp:1220 msgid "" "The Spiral Vase option can only be used when printing single material " "objects." msgstr "" -"나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체를 인쇄 할 때만 사용할 수 있습" -"니다." +"나선형 꽃병 옵션(Spiral Vase)은 단일 재료 객체(object)를 인쇄 할 때만 사용할 " +"수 있습니다." -#: src/libslic3r/Print.cpp:1155 +#: src/libslic3r/Print.cpp:1233 msgid "" "The wipe tower is only supported if all extruders have the same nozzle " "diameter and use filaments of the same diameter." @@ -5348,15 +6547,15 @@ msgstr "" "모든 압출기 의 노즐 직경이 동일하고 동일한 직경의 필라멘트를 사용하는 경우에" "만 와이프 타워가 지원됩니다." -#: src/libslic3r/Print.cpp:1159 +#: src/libslic3r/Print.cpp:1238 msgid "" "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " "and Repetier G-code flavors." msgstr "" -"와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-코드지원 됩" +"와이프 타워는 현재 말린, RepRap/Sprinter 및 리피티어에 대해서만 G-code지원 됩" "니다." -#: src/libslic3r/Print.cpp:1161 +#: src/libslic3r/Print.cpp:1240 msgid "" "The Wipe Tower is currently only supported with the relative extruder " "addressing (use_relative_e_distances=1)." @@ -5364,58 +6563,76 @@ msgstr "" "와이프 타워는 현재 상대적 압출기 어드레싱 (use_relative_e_distances = 1)에서" "만 지원됩니다." -#: src/libslic3r/Print.cpp:1165 -msgid "All extruders must have the same diameter for the Wipe Tower." -msgstr "모든 압출기는 와이프 타워의 지름이 같아야 합니다." +#: src/libslic3r/Print.cpp:1242 +msgid "Ooze prevention is currently not supported with the wipe tower enabled." +msgstr "" +"현재 와이프 타워를 사용하도록 설정되어 있는 경우 스모즈 방지 기능이 지원되지 " +"않습니다." -#: src/libslic3r/Print.cpp:1186 +#: src/libslic3r/Print.cpp:1244 +msgid "" +"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)." +msgstr "와이프 타워는 현재 볼륨 E(use_volumetric_e=0)를 지원하지 않습니다." + +#: src/libslic3r/Print.cpp:1246 +msgid "" +"The Wipe Tower is currently not supported for multimaterial sequential " +"prints." +msgstr "와이프 타워는 현재 다중 재질 순차 인쇄에 지원되지 않습니다." + +#: src/libslic3r/Print.cpp:1267 msgid "" "The Wipe Tower is only supported for multiple objects if they have equal " "layer heights" msgstr "" -"와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체에 대해서만 지원" -"됩니다" +"와이프 타워 (Wipe Tower)는 같은 레이어 높이에 경우 여러 객체(object)에 대해서" +"만 지원됩니다" -#: src/libslic3r/Print.cpp:1188 +#: src/libslic3r/Print.cpp:1269 msgid "" "The Wipe Tower is only supported for multiple objects if they are printed " "over an equal number of raft layers" msgstr "" -"와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체에 대해서만 " -"지원됩니다" +"와이프 타워는 같은 수의 라프트 레이어 위에 인쇄 된 경우 여러 객체(object)에 " +"대해서만 지원됩니다" -#: src/libslic3r/Print.cpp:1190 +#: src/libslic3r/Print.cpp:1271 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로 인쇄 된 경우 여러 객" -"체에 대해서만 지원됩니다" +"체(object)에 대해서만 지원됩니다" -#: src/libslic3r/Print.cpp:1192 +#: src/libslic3r/Print.cpp:1273 msgid "" "The Wipe Tower is only supported for multiple objects if they are sliced " "equally." msgstr "" -"와이프 타워는 똑같이 슬라이스 된 경우 여러 오브젝트에 대해서만 지원됩니다." +"와이프 타워는 똑같이 슬라이스 된 경우 여러 객체(object)에 대해서만 지원됩니" +"다." -#: src/libslic3r/Print.cpp:1220 +#: src/libslic3r/Print.cpp:1315 msgid "" -"The Wipe tower is only supported if all objects have the same layer height " -"profile" +"The Wipe tower is only supported if all objects have the same variable layer " +"height" msgstr "" -"모든 오브젝트의 레이어 높이 프로필이 동일한 경우에만 와이프 타워가 지원됩니다" +"모든 오브젝트의 가변 레이어 높이가 같은 경우에만 지우기 타워가 지원됩니다." -#: src/libslic3r/Print.cpp:1230 -msgid "The supplied settings will cause an empty print." -msgstr "제공된 설정으로 인해 빈 인쇄가 발생합니다." - -#: src/libslic3r/Print.cpp:1247 +#: src/libslic3r/Print.cpp:1341 msgid "" "One or more object were assigned an extruder that the printer does not have." -msgstr "하나 이상의 개체에 프린터에없는 압출기가 지정되었습니다." +msgstr "하나 이상의 객체(object)에 프린터에없는 압출기가 지정되었습니다." -#: src/libslic3r/Print.cpp:1256 +#: src/libslic3r/Print.cpp:1350 +msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm" +msgstr "%1%=%2% mm가 너무 낮아 레이어 높이 %3% mm에서 인쇄할 수 없습니다." + +#: src/libslic3r/Print.cpp:1353 +msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm" +msgstr "노즐 직경 %3% mm로 인쇄할 수 있는 과도한 %1%=%2% mm" + +#: src/libslic3r/Print.cpp:1364 msgid "" "Printing with multiple extruders of differing nozzle diameters. If support " "is to be printed with the current extruder (support_material_extruder == 0 " @@ -5426,15 +6643,15 @@ msgstr "" "(support_material_extruder == 0 또는 support_material_interface_extruder == " "0)로 인쇄되는 경우 모든 노즐은 동일한 지름이어야합니다." -#: src/libslic3r/Print.cpp:1264 +#: src/libslic3r/Print.cpp:1372 msgid "" "For the Wipe Tower to work with the soluble supports, the support layers " "need to be synchronized with the object layers." msgstr "" -"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 오브젝트 레이" -"어와 동기화 해야 합니다." +"와이프 타워가 가용성 지지체와 함께 작동 하려면 서포트 레이어를 객체(object) " +"레이어와 동기화 해야 합니다." -#: src/libslic3r/Print.cpp:1268 +#: src/libslic3r/Print.cpp:1376 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 " @@ -5445,63 +6662,35 @@ msgstr "" "에만 비가용성 서포트를 지원 합니다. (support_material_extruder과 " "support_material_interface_extruder 모두 0으로 설정 해야 합니다.)" -#: src/libslic3r/Print.cpp:1290 +#: src/libslic3r/Print.cpp:1398 msgid "First layer height can't be greater than nozzle diameter" msgstr "첫번째 레이어 높이는 노즐 직경보다 클 수 없습니다" -#: src/libslic3r/Print.cpp:1294 +#: src/libslic3r/Print.cpp:1403 msgid "Layer height can't be greater than nozzle diameter" msgstr "레이어 높이는 노즐 직경보다 클 수 없습니다" -#: src/libslic3r/Print.cpp:1438 +#: src/libslic3r/Print.cpp:1557 msgid "Infilling layers" msgstr "레이어 채우기" -#: src/libslic3r/Print.cpp:1446 +#: src/libslic3r/Print.cpp:1577 msgid "Generating skirt" msgstr "스커트 생성" -#: src/libslic3r/Print.cpp:1454 +#: src/libslic3r/Print.cpp:1585 msgid "Generating brim" msgstr "브림 생성" -#: src/libslic3r/Print.cpp:1482 +#: src/libslic3r/Print.cpp:1609 msgid "Exporting G-code" msgstr "G 코드 내보내기" -#: src/libslic3r/Print.cpp:1486 +#: src/libslic3r/Print.cpp:1613 msgid "Generating G-code" msgstr "G 코드 생성" -#: src/libslic3r/SLAPrint.cpp:58 -msgid "Slicing model" -msgstr "슬라이싱 모델" - -#: src/libslic3r/SLAPrint.cpp:59 src/libslic3r/SLAPrint.cpp:871 -msgid "Generating support points" -msgstr "서포트 지점 생성" - -#: src/libslic3r/SLAPrint.cpp:60 -msgid "Generating support tree" -msgstr "서포트 트리 생성" - -#: src/libslic3r/SLAPrint.cpp:61 -msgid "Generating pad" -msgstr "패드 생성" - -#: src/libslic3r/SLAPrint.cpp:62 -msgid "Slicing supports" -msgstr "슬라이싱 서포트즈" - -#: src/libslic3r/SLAPrint.cpp:79 -msgid "Merging slices and calculating statistics" -msgstr "슬라이스 병합 및 통계 계산" - -#: src/libslic3r/SLAPrint.cpp:80 -msgid "Rasterizing layers" -msgstr "레이어 래스터화" - -#: src/libslic3r/SLAPrint.cpp:650 +#: src/libslic3r/SLAPrint.cpp:613 msgid "" "Cannot proceed without support points! Add support points or disable support " "generation." @@ -5509,33 +6698,102 @@ msgstr "" "서포트 포인트 없이 진행할 수 없습니다! 서포트 지점을 추가 하거나 서포트 생성" "을 사용 하지 않도록 설정 합니다." -#: src/libslic3r/SLAPrint.cpp:664 -msgid "Elevation is too low for object." -msgstr "객체 고도가 너무 낮습니다." +#: src/libslic3r/SLAPrint.cpp:625 +msgid "" +"Elevation is too low for object. Use the \"Pad around object\" feature to " +"print the object without elevation." +msgstr "" +"객체의 고도가 너무 낮습니다. \"오브젝트 주위 패드\" 피쳐를 사용하여 고도 없" +"이 오브젝트를 인쇄합니다." -#: src/libslic3r/SLAPrint.cpp:670 +#: src/libslic3r/SLAPrint.cpp:631 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 "" -"서포트 기둥 끝은 오브젝트와 패드 사이의 간격에 배치됩니다. 이를 방지하기 위" -"해 '베이스 서포트 안전 거리'는 '패드 오브젝트 갭' 매개변수보다 커야 합니다." +"서포트 기둥 끝은 객체(object)와 패드 사이의 간격에 배치됩니다. 이를 방지하기 " +"위해 '베이스 서포트 안전 거리'는 '패드 객체(object) 갭' 매개변수보다 커야 합" +"니다." -#: src/libslic3r/SLAPrint.cpp:759 +#: src/libslic3r/SLAPrint.cpp:646 +msgid "Exposition time is out of printer profile bounds." +msgstr "박람회 시간이 프린터 프로파일 범위를 벗어났습니다." + +#: src/libslic3r/SLAPrint.cpp:653 +msgid "Initial exposition time is out of printer profile bounds." +msgstr "초기 박람회 시간이 프린터 프로파일 범위를 벗어났습니다." + +#: src/libslic3r/SLAPrint.cpp:760 +msgid "Slicing done" +msgstr "슬라이싱 완료" + +#: src/libslic3r/SLAPrintSteps.cpp:41 +msgid "Hollowing model" +msgstr "속이 빈 모델" + +#: src/libslic3r/SLAPrintSteps.cpp:42 +msgid "Drilling holes into model." +msgstr "모델에 구멍을 드릴링합니다." + +#: src/libslic3r/SLAPrintSteps.cpp:43 +msgid "Slicing model" +msgstr "슬라이싱 모델" + +#: src/libslic3r/SLAPrintSteps.cpp:44 src/libslic3r/SLAPrintSteps.cpp:308 +msgid "Generating support points" +msgstr "서포트 지점 생성" + +#: src/libslic3r/SLAPrintSteps.cpp:45 +msgid "Generating support tree" +msgstr "서포트 트리 생성" + +#: src/libslic3r/SLAPrintSteps.cpp:46 +msgid "Generating pad" +msgstr "패드 생성" + +#: src/libslic3r/SLAPrintSteps.cpp:47 +msgid "Slicing supports" +msgstr "슬라이싱 서포트즈" + +#: src/libslic3r/SLAPrintSteps.cpp:62 +msgid "Merging slices and calculating statistics" +msgstr "슬라이스 병합 및 통계 계산" + +#: src/libslic3r/SLAPrintSteps.cpp:63 +msgid "Rasterizing layers" +msgstr "레이어 래스터화" + +#: src/libslic3r/SLAPrintSteps.cpp:154 +msgid "" +"Drilling holes into the mesh failed. This is usually caused by broken model. " +"Try to fix it first." +msgstr "" +"메시에 구멍을 뚫는 데 실패했습니다. 이는 일반적으로 모델이 손상되어 발생합니" +"다. 먼저 해결해 보십시오." + +#: src/libslic3r/SLAPrintSteps.cpp:202 msgid "" "Slicing had to be stopped due to an internal error: Inconsistent slice index." msgstr "" "내부 오류: 일치하지 않는 슬라이스 인덱스로 인해 슬라이싱을 중지해야 했습니다." -#: src/libslic3r/SLAPrint.cpp:954 src/libslic3r/SLAPrint.cpp:964 -#: src/libslic3r/SLAPrint.cpp:1005 +#: src/libslic3r/SLAPrintSteps.cpp:365 src/libslic3r/SLAPrintSteps.cpp:374 +#: src/libslic3r/SLAPrintSteps.cpp:413 msgid "Visualizing supports" msgstr "시각화 지원" -#: src/libslic3r/SLAPrint.cpp:1537 -msgid "Slicing done" -msgstr "슬라이싱 완료" +#: src/libslic3r/SLAPrintSteps.cpp:405 +msgid "No pad can be generated for this model with the current configuration" +msgstr "현재 구성으로 이 모델에 대해 패드를 생성할 수 없습니다." + +#: src/libslic3r/SLAPrintSteps.cpp:579 +msgid "" +"There are unprintable objects. Try to adjust support settings to make the " +"objects printable." +msgstr "" +"인쇄할 수 없는 개체가 있습니다. 지원 설정을 조정하여 개체를 인쇄할 수 있도록 " +"합니다." #: src/libslic3r/PrintBase.cpp:71 msgid "Failed processing of the output_filename_format template." @@ -5551,13 +6809,17 @@ msgstr "배드 모양" #: src/libslic3r/PrintConfig.cpp:56 msgid "Bed custom texture" -msgstr "침대 사용자 정의 질감" +msgstr "배드 사용자 정의 질감" #: src/libslic3r/PrintConfig.cpp:61 msgid "Bed custom model" -msgstr "침대 사용자 정의 모델" +msgstr "배드 사용자 정의 모델" -#: src/libslic3r/PrintConfig.cpp:68 +#: src/libslic3r/PrintConfig.cpp:66 +msgid "Picture sizes to be stored into a .gcode and .sl1 files" +msgstr ".gcode 및 .sl1 파일에 저장할 그림 크기" + +#: 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." @@ -5565,21 +6827,21 @@ msgstr "" "이 설정은 슬라이스/레이어의 높이(따라서 총 수)를 제어합니다. 얇은 층은 더 나" "은 정확성을 제공하지만 인쇄하는 데는 더 많은 시간이 걸린다." -#: src/libslic3r/PrintConfig.cpp:75 +#: src/libslic3r/PrintConfig.cpp:80 msgid "Max print height" msgstr "최대 프린트 높이" -#: src/libslic3r/PrintConfig.cpp:76 +#: 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:82 +#: src/libslic3r/PrintConfig.cpp:87 msgid "Slice gap closing radius" msgstr "슬라이스 간격 닫힘 반경" -#: src/libslic3r/PrintConfig.cpp:84 +#: src/libslic3r/PrintConfig.cpp:89 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 " @@ -5589,11 +6851,11 @@ msgstr "" "틈 닫기 작업은 최종 인쇄 해상도를 줄일 수 있으므로 값을 합리적으로 낮게 유지 " "하는 것이 좋습니다." -#: src/libslic3r/PrintConfig.cpp:92 +#: src/libslic3r/PrintConfig.cpp:97 msgid "Hostname, IP or URL" msgstr "호스트 이름(Hostname), IP or URL" -#: src/libslic3r/PrintConfig.cpp:93 +#: 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." @@ -5601,11 +6863,11 @@ msgstr "" "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 호스" "트 이름, IP 주소 또는 프린터 호스트 복제본의 URL을 포함 해야 합니다." -#: src/libslic3r/PrintConfig.cpp:99 +#: src/libslic3r/PrintConfig.cpp:104 msgid "API Key / Password" msgstr "API 키/암호" -#: src/libslic3r/PrintConfig.cpp:100 +#: src/libslic3r/PrintConfig.cpp:105 msgid "" "Slic3r can upload G-code files to a printer host. This field should contain " "the API Key or the password required for authentication." @@ -5613,11 +6875,11 @@ msgstr "" "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드는 API " "키 또는 인증에 필요한 암호를 포함 해야 합니다." -#: src/libslic3r/PrintConfig.cpp:106 +#: src/libslic3r/PrintConfig.cpp:111 msgid "HTTPS CA File" msgstr "HTTPS CA 파일" -#: src/libslic3r/PrintConfig.cpp:107 +#: src/libslic3r/PrintConfig.cpp:112 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 " @@ -5626,25 +6888,25 @@ msgstr "" "사용자 지정 CA 인증서 파일은 crt/pem 형식의 HTTPS 옥토 프린트 연결에 대해 지" "정할 수 있습니다. 비워 두면 기본 OS CA 인증서 리포지토리가 사용 됩니다." -#: src/libslic3r/PrintConfig.cpp:121 +#: src/libslic3r/PrintConfig.cpp:126 msgid "Avoid crossing perimeters" -msgstr "출력된 외측을 피하세요" +msgstr "교체된 둘레를 피하세요." -#: src/libslic3r/PrintConfig.cpp:122 +#: src/libslic3r/PrintConfig.cpp:127 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 "" -"둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보 잉 " +"둘레의 교차를 최소화하기 위해 여행 이동을 최적화하십시오. 이것은 보잉 " "(Bowling) 압출기가 흘러 나오기 쉬운 경우에 주로 유용합니다. 이 기능을 사용하" "면 인쇄 및 G 코드 생성 속도가 느려집니다." -#: src/libslic3r/PrintConfig.cpp:129 src/libslic3r/PrintConfig.cpp:2027 +#: src/libslic3r/PrintConfig.cpp:134 src/libslic3r/PrintConfig.cpp:2074 msgid "Other layers" msgstr "다른 레이어" -#: src/libslic3r/PrintConfig.cpp:130 +#: src/libslic3r/PrintConfig.cpp:135 msgid "" "Bed temperature for layers after the first one. Set this to zero to disable " "bed temperature control commands in the output." @@ -5652,11 +6914,11 @@ msgstr "" "첫 번째 레이어 이후의 레이어 온도. 이 값을 0으로 설정하면 출력에서 ​​베드 온도 " "제어 명령을 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:132 +#: src/libslic3r/PrintConfig.cpp:137 msgid "Bed temperature" msgstr "배드 온도" -#: src/libslic3r/PrintConfig.cpp:139 +#: src/libslic3r/PrintConfig.cpp:144 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 " @@ -5666,11 +6928,11 @@ msgstr "" "설정과 [layer_num] 및 [layer_z]에 대한 자리 표시 자 변수를 사용할 수 있습니" "다." -#: src/libslic3r/PrintConfig.cpp:149 +#: src/libslic3r/PrintConfig.cpp:154 msgid "Between objects G-code" -msgstr "객체 간 G 코드" +msgstr "객체(object) 간 G 코드" -#: src/libslic3r/PrintConfig.cpp:150 +#: src/libslic3r/PrintConfig.cpp:155 msgid "" "This code is inserted between objects when using sequential printing. By " "default extruder and bed temperature are reset using non-wait command; " @@ -5679,25 +6941,37 @@ msgid "" "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]\"명령을 넣을 수 있습니다." +"이 코드는 순차 인쇄를 사용할 때 객체(object)간에 삽입됩니다. 기본적으로 익스" +"트루더 및 베드 온도는 대기 모드가 아닌 명령을 사용하여 재설정됩니다. 그러나 " +"이 사용자 코드에서 M104, M109, M140 또는 M190이 감지되면 Slic3r은 온도 명령" +"을 추가하지 않습니다. 모든 Slic3r 설정에 자리 표시 변수를 사용할 수 있으므로 " +"원하는 위치에 \"M109 S [first_layer_temperature]\"명령을 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:161 +#: src/libslic3r/PrintConfig.cpp:166 msgid "Number of solid layers to generate on bottom surfaces." msgstr "바닥면에 생성 할 솔리드 레이어의 수." -#: src/libslic3r/PrintConfig.cpp:162 +#: src/libslic3r/PrintConfig.cpp:167 msgid "Bottom solid layers" msgstr "바닥 단일 레이어" -#: src/libslic3r/PrintConfig.cpp:167 +#: src/libslic3r/PrintConfig.cpp:175 +msgid "" +"The number of bottom solid layers is increased above bottom_solid_layers if " +"necessary to satisfy minimum thickness of bottom shell." +msgstr "" +"바닥 단색 층의 수는 바닥 쉘의 최소 두께를 만족시키기 위해 필요한 경우 " +"bottom_solid_layers 이상으로 증가한다." + +#: src/libslic3r/PrintConfig.cpp:177 +msgid "Minimum bottom shell thickness" +msgstr "최소 하단 쉘 두께" + +#: src/libslic3r/PrintConfig.cpp:183 msgid "Bridge" msgstr "브리지" -#: src/libslic3r/PrintConfig.cpp:168 +#: src/libslic3r/PrintConfig.cpp:184 msgid "" "This is the acceleration your printer will use for bridges. Set zero to " "disable acceleration control for bridges." @@ -5705,18 +6979,18 @@ msgstr "" "이것은 프린터가 브릿지에 사용할 가속도입니다. 브리지의 가속 제어를 사용하지 " "않으려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:170 src/libslic3r/PrintConfig.cpp:313 -#: src/libslic3r/PrintConfig.cpp:840 src/libslic3r/PrintConfig.cpp:961 -#: src/libslic3r/PrintConfig.cpp:1130 src/libslic3r/PrintConfig.cpp:1183 -#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1383 +#: src/libslic3r/PrintConfig.cpp:186 src/libslic3r/PrintConfig.cpp:329 +#: src/libslic3r/PrintConfig.cpp:863 src/libslic3r/PrintConfig.cpp:985 +#: src/libslic3r/PrintConfig.cpp:1155 src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1412 msgid "mm/s²" msgstr "mm/s ²" -#: src/libslic3r/PrintConfig.cpp:176 +#: src/libslic3r/PrintConfig.cpp:192 msgid "Bridging angle" msgstr "브릿지 각도" -#: src/libslic3r/PrintConfig.cpp:178 +#: src/libslic3r/PrintConfig.cpp:194 msgid "" "Bridging angle override. If left to zero, the bridging angle will be " "calculated automatically. Otherwise the provided angle will be used for all " @@ -5726,34 +7000,34 @@ msgstr "" "로 계산됩니다. 그렇지 않으면 제공된 각도가 모든 브리지에 사용됩니다. 각도 제" "로는 180 °를 사용하십시오." -#: src/libslic3r/PrintConfig.cpp:181 src/libslic3r/PrintConfig.cpp:758 -#: src/libslic3r/PrintConfig.cpp:1619 src/libslic3r/PrintConfig.cpp:1629 -#: src/libslic3r/PrintConfig.cpp:1858 src/libslic3r/PrintConfig.cpp:2012 -#: src/libslic3r/PrintConfig.cpp:2197 src/libslic3r/PrintConfig.cpp:2582 -#: src/libslic3r/PrintConfig.cpp:2693 +#: src/libslic3r/PrintConfig.cpp:197 src/libslic3r/PrintConfig.cpp:781 +#: src/libslic3r/PrintConfig.cpp:1649 src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1904 src/libslic3r/PrintConfig.cpp:2059 +#: src/libslic3r/PrintConfig.cpp:2257 src/libslic3r/PrintConfig.cpp:2728 +#: src/libslic3r/PrintConfig.cpp:2849 msgid "°" msgstr "°" -#: src/libslic3r/PrintConfig.cpp:187 +#: src/libslic3r/PrintConfig.cpp:203 msgid "Bridges fan speed" msgstr "브릿지 팬 속도" -#: src/libslic3r/PrintConfig.cpp:188 +#: src/libslic3r/PrintConfig.cpp:204 msgid "This fan speed is enforced during all bridges and overhangs." msgstr "이 팬 속도는 모든 브릿지 및 오버행 중에 적용됩니다." -#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:770 -#: src/libslic3r/PrintConfig.cpp:1203 src/libslic3r/PrintConfig.cpp:1266 -#: src/libslic3r/PrintConfig.cpp:1511 src/libslic3r/PrintConfig.cpp:2366 -#: src/libslic3r/PrintConfig.cpp:2623 +#: src/libslic3r/PrintConfig.cpp:205 src/libslic3r/PrintConfig.cpp:793 +#: src/libslic3r/PrintConfig.cpp:1228 src/libslic3r/PrintConfig.cpp:1291 +#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:2435 +#: src/libslic3r/PrintConfig.cpp:2768 msgid "%" msgstr "%" -#: src/libslic3r/PrintConfig.cpp:196 +#: src/libslic3r/PrintConfig.cpp:212 msgid "Bridge flow ratio" msgstr "브릿지 유량(flow)값" -#: src/libslic3r/PrintConfig.cpp:198 +#: src/libslic3r/PrintConfig.cpp:214 msgid "" "This factor affects the amount of plastic for bridging. You can decrease it " "slightly to pull the extrudates and prevent sagging, although default " @@ -5764,64 +7038,66 @@ msgstr "" "겨 처짐을 방지하기 위해 약간 줄일 수 있지만 기본 설정은 일반적으로 좋지만이 " "문제를 해결하기 전에 냉각 (팬 사용)을 시도해야합니다." -#: src/libslic3r/PrintConfig.cpp:208 +#: src/libslic3r/PrintConfig.cpp:224 msgid "Bridges" msgstr "브릿지(Bridges)" -#: src/libslic3r/PrintConfig.cpp:210 +#: src/libslic3r/PrintConfig.cpp:226 msgid "Speed for printing bridges." msgstr "브릿지 인쇄 속도." -#: src/libslic3r/PrintConfig.cpp:211 src/libslic3r/PrintConfig.cpp:592 -#: src/libslic3r/PrintConfig.cpp:600 src/libslic3r/PrintConfig.cpp:609 -#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:644 -#: src/libslic3r/PrintConfig.cpp:663 src/libslic3r/PrintConfig.cpp:899 -#: src/libslic3r/PrintConfig.cpp:1026 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1161 -#: src/libslic3r/PrintConfig.cpp:1172 src/libslic3r/PrintConfig.cpp:1225 -#: src/libslic3r/PrintConfig.cpp:1284 src/libslic3r/PrintConfig.cpp:1412 -#: src/libslic3r/PrintConfig.cpp:1586 src/libslic3r/PrintConfig.cpp:1595 -#: src/libslic3r/PrintConfig.cpp:1991 src/libslic3r/PrintConfig.cpp:2104 +#: src/libslic3r/PrintConfig.cpp:227 src/libslic3r/PrintConfig.cpp:610 +#: src/libslic3r/PrintConfig.cpp:618 src/libslic3r/PrintConfig.cpp:627 +#: src/libslic3r/PrintConfig.cpp:635 src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:681 src/libslic3r/PrintConfig.cpp:923 +#: src/libslic3r/PrintConfig.cpp:1051 src/libslic3r/PrintConfig.cpp:1137 +#: src/libslic3r/PrintConfig.cpp:1173 src/libslic3r/PrintConfig.cpp:1186 +#: src/libslic3r/PrintConfig.cpp:1197 src/libslic3r/PrintConfig.cpp:1250 +#: src/libslic3r/PrintConfig.cpp:1309 src/libslic3r/PrintConfig.cpp:1442 +#: src/libslic3r/PrintConfig.cpp:1616 src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:2038 src/libslic3r/PrintConfig.cpp:2164 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:218 +#: src/libslic3r/PrintConfig.cpp:234 msgid "Brim width" msgstr "브림 폭" -#: src/libslic3r/PrintConfig.cpp:219 +#: src/libslic3r/PrintConfig.cpp:235 msgid "" "Horizontal width of the brim that will be printed around each object on the " "first layer." -msgstr "첫 번째 레이어의 각 객체 주위에 인쇄 될 가장자리의 가로 폭입니다." +msgstr "" +"첫 번째 레이어의 각 객체(object) 주위에 인쇄 될 가장자리의 가로 폭입니다." -#: src/libslic3r/PrintConfig.cpp:226 +#: src/libslic3r/PrintConfig.cpp:242 msgid "Clip multi-part objects" -msgstr "여러 파트 오브젝트 클립" +msgstr "여러 부품(Part) 객체(object) 클립" -#: src/libslic3r/PrintConfig.cpp:227 +#: src/libslic3r/PrintConfig.cpp:243 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 "" -"멀티 메터리얼(multi-material) 개체를 인쇄 할 때이 설정을 사용하면 겹치는 개" -"체 파트를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분은 첫 번째 부분에서 클" -"리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘립니다)." +"다중 메터리얼(multi-material) 객체(object)를 인쇄 할 때이 설정을 사용하면 겹" +"치는 객체(object) 부품(Part)를 서로 겹쳐서 잘라낼 수 있습니다 (두 번째 부분" +"은 첫 번째 부분에서 클리핑되며 세 번째 부분은 첫 번째 및 두 번째 부분에서 잘" +"립니다)." -#: src/libslic3r/PrintConfig.cpp:234 +#: src/libslic3r/PrintConfig.cpp:250 msgid "Colorprint height" msgstr "컬러 인쇄 높이" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:251 msgid "Heights at which a filament change is to occur." msgstr "필라멘트 체인지가 발생 하는 높이." -#: src/libslic3r/PrintConfig.cpp:245 +#: src/libslic3r/PrintConfig.cpp:261 msgid "Compatible printers condition" msgstr "호환 가능한 프린터 조건" -#: src/libslic3r/PrintConfig.cpp:246 +#: src/libslic3r/PrintConfig.cpp:262 msgid "" "A boolean expression using the configuration values of an active printer " "profile. If this expression evaluates to true, this profile is considered " @@ -5830,11 +7106,11 @@ msgstr "" "활성 프린터 프로파일의 구성 값을 사용하는 부울 표현식. 이 표현식이 true로 평" "가되면이 프로필은 활성 프린터 프로필과 호환되는 것으로 간주됩니다." -#: src/libslic3r/PrintConfig.cpp:260 +#: src/libslic3r/PrintConfig.cpp:276 msgid "Compatible print profiles condition" msgstr "호환 되는 인쇄 프로 파일 조건" -#: src/libslic3r/PrintConfig.cpp:261 +#: src/libslic3r/PrintConfig.cpp:277 msgid "" "A boolean expression using the configuration values of an active print " "profile. If this expression evaluates to true, this profile is considered " @@ -5843,27 +7119,27 @@ msgstr "" "활성 인쇄 프로 파일의 구성 값을 사용하는 부울식입니다. 이 식이 true로 평가 되" "면, 이 프로필이 활성 인쇄 프로필과 호환 되는 것으로 간주 됩니다." -#: src/libslic3r/PrintConfig.cpp:278 +#: src/libslic3r/PrintConfig.cpp:294 msgid "Complete individual objects" -msgstr "개별 개체 완성" +msgstr "개별 객체(object) 완성" -#: src/libslic3r/PrintConfig.cpp:279 +#: src/libslic3r/PrintConfig.cpp:295 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은 압출기 충돌을 경고하고 예방해야하지만 조심하십시" -"오." +"여러 객체(object) 또는 사본을 인쇄 할 때이 객체(object)는 다음 객체(object)" +"로 이동하기 전에 각 객체(object)를 완성합니다 (맨 아래 레이어에서 시작). 이 " +"기능은 인쇄물이 망가지는 위험을 피할 때 유용합니다. Slic3r은 압출기 충돌을 경" +"고하고 예방해야하지만 조재봉선하십시오." -#: src/libslic3r/PrintConfig.cpp:287 +#: src/libslic3r/PrintConfig.cpp:303 msgid "Enable auto cooling" msgstr "자동 냉각 사용" -#: src/libslic3r/PrintConfig.cpp:288 +#: src/libslic3r/PrintConfig.cpp:304 msgid "" "This flag enables the automatic cooling logic that adjusts print speed and " "fan speed according to layer printing time." @@ -5871,23 +7147,23 @@ msgstr "" "이 플래그는 레이어 인쇄 시간에 따라 인쇄 속도와 팬 속도를 조정하는 자동 냉각 " "논리를 활성화합니다." -#: src/libslic3r/PrintConfig.cpp:293 +#: src/libslic3r/PrintConfig.cpp:309 msgid "Cooling tube position" msgstr "냉각 튜브 위치" -#: src/libslic3r/PrintConfig.cpp:294 +#: src/libslic3r/PrintConfig.cpp:310 msgid "Distance of the center-point of the cooling tube from the extruder tip." -msgstr "압출기 팁에서 냉각 튜브의 중심점까지의 거리 " +msgstr "압출기 팁에서 냉각 튜브의 중재봉선점까지의 거리 " -#: src/libslic3r/PrintConfig.cpp:301 +#: src/libslic3r/PrintConfig.cpp:317 msgid "Cooling tube length" msgstr "냉각 튜브 길이" -#: src/libslic3r/PrintConfig.cpp:302 +#: src/libslic3r/PrintConfig.cpp:318 msgid "Length of the cooling tube to limit space for cooling moves inside it." msgstr "내부의 냉각 이동을 위해 공간을 제한하는 냉각 튜브의 길이 " -#: src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:326 msgid "" "This is the acceleration your printer will be reset to after the role-" "specific acceleration values are used (perimeter/infill). Set zero to " @@ -5896,11 +7172,11 @@ msgstr "" "역할 별 가속도 값이 사용 된 후에 프린터가 재설정되는 속도입니다 (둘레 / 충" "전). 가속을 전혀 재설정하지 않으려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:319 +#: src/libslic3r/PrintConfig.cpp:335 msgid "Default filament profile" msgstr "기본 필라멘트 프로파일" -#: src/libslic3r/PrintConfig.cpp:320 +#: src/libslic3r/PrintConfig.cpp:336 msgid "" "Default filament profile associated with the current printer profile. On " "selection of the current printer profile, this filament profile will be " @@ -5909,12 +7185,12 @@ msgstr "" "현재 프린터 프로파일과 연관된 기본 필라멘트 프로파일. 현재 프린터 프로파일을 " "선택하면 이 필라멘트 프로파일이 활성화됩니다." -#: src/libslic3r/PrintConfig.cpp:326 +#: src/libslic3r/PrintConfig.cpp:342 msgid "Default print profile" msgstr "기본 인쇄 프로파일" -#: src/libslic3r/PrintConfig.cpp:327 src/libslic3r/PrintConfig.cpp:2447 -#: src/libslic3r/PrintConfig.cpp:2458 +#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:2593 +#: src/libslic3r/PrintConfig.cpp:2604 msgid "" "Default print profile associated with the current printer profile. On " "selection of the current printer profile, this print profile will be " @@ -5923,11 +7199,11 @@ msgstr "" "현재 프린터 프로파일과 연관된 기본 인쇄 프로파일. 현재 프린터 프로파일을 선택" "하면이 인쇄 프로파일이 활성화됩니다." -#: src/libslic3r/PrintConfig.cpp:333 +#: src/libslic3r/PrintConfig.cpp:349 msgid "Disable fan for the first" msgstr "첫 번째 팬 사용 중지" -#: src/libslic3r/PrintConfig.cpp:334 +#: src/libslic3r/PrintConfig.cpp:350 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." @@ -5935,37 +7211,30 @@ msgstr "" "이 값을 양수 값으로 설정하면 첫 번째 레이어에서 팬을 사용하지 않도록 설정하" "여 접착력을 악화시키지 않습니다." -#: src/libslic3r/PrintConfig.cpp:336 src/libslic3r/PrintConfig.cpp:971 -#: src/libslic3r/PrintConfig.cpp:1484 src/libslic3r/PrintConfig.cpp:1669 -#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1894 -#: src/libslic3r/PrintConfig.cpp:1939 -msgid "layers" -msgstr "레이어" - -#: src/libslic3r/PrintConfig.cpp:343 +#: src/libslic3r/PrintConfig.cpp:359 msgid "Don't support bridges" msgstr "서포트와 브릿지를 사용하지 않음" -#: src/libslic3r/PrintConfig.cpp:345 +#: src/libslic3r/PrintConfig.cpp:361 msgid "" "Experimental option for preventing support material from being generated " "under bridged areas." msgstr "" "브릿지 영역 아래에 서포팅 재료가 생성되는 것을 방지하기위한 실험적 옵션." -#: src/libslic3r/PrintConfig.cpp:351 +#: src/libslic3r/PrintConfig.cpp:367 msgid "Distance between copies" msgstr "복사본 간 거리" -#: src/libslic3r/PrintConfig.cpp:352 +#: src/libslic3r/PrintConfig.cpp:368 msgid "Distance used for the auto-arrange feature of the plater." msgstr "플래이터(plater)의 자동 정렬 기능에 사용되는 거리입니다." -#: src/libslic3r/PrintConfig.cpp:359 +#: src/libslic3r/PrintConfig.cpp:375 msgid "Elephant foot compensation" msgstr "코끼리 발(Elephant foot) 보상값" -#: src/libslic3r/PrintConfig.cpp:361 +#: src/libslic3r/PrintConfig.cpp:377 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." @@ -5973,32 +7242,32 @@ msgstr "" "첫 번째 레이어는 구성 요소 값에 따라 XY 평면에서 수축되어 일층 스 퀴시 코끼리" "발(Elephant Foot) 효과를 보완합니다." -#: src/libslic3r/PrintConfig.cpp:370 +#: src/libslic3r/PrintConfig.cpp:386 msgid "" "This end procedure is inserted at the end of the output file. Note that you " -"can use placeholder variables for all Slic3r settings." +"can use placeholder variables for all PrusaSlicer settings." msgstr "" -"이 종료 절차는 출력 파일의 끝에 삽입된다. 모든 Slic3r 설정에 자리 표시자 변수" -"를 사용할 수 있다는 점에 유의하십시오." +"이 끝 프로시저는 출력 파일의 끝에 삽입됩니다. 모든 PrusaSlicer 설정에 자리 표" +"시자 변수를 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:380 +#: src/libslic3r/PrintConfig.cpp:396 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 " -"Slic3r settings. If you have multiple extruders, the gcode is processed in " -"extruder order." +"PrusaSlicer settings. If you have multiple extruders, the gcode is processed " +"in extruder order." msgstr "" -"이 종료 절차는 출력 파일의 끝, 프린터 종료 gcode 이전 (및 복합 재료 프린터의 " -"경우이 필라멘트에서 도구를 변경하기 전에)에 삽입됩니다. 모든 Slic3r 설정에 자" -"리 표시 자 변수를 사용할 수 있습니다. 압출기가 여러 개인 경우 gcode는 압출기 " -"순서대로 처리됩니다." +"이 끝 프로시저는 프린터가 gcode를 종료하기 전에 출력 파일의 끝에 삽입됩니다" +"(다중 재질 프린터의 경우 이 필라멘트에서 공구를 변경하기 전에). 모든 " +"PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있습니다. 압출기가 여러 개 있" +"는 경우 gcode는 압출기 순서로 처리됩니다." -#: src/libslic3r/PrintConfig.cpp:391 +#: src/libslic3r/PrintConfig.cpp:407 msgid "Ensure vertical shell thickness" msgstr "수직 쉘(shell) 두께 확인" -#: src/libslic3r/PrintConfig.cpp:393 +#: src/libslic3r/PrintConfig.cpp:409 msgid "" "Add solid infill near sloping surfaces to guarantee the vertical shell " "thickness (top+bottom solid layers)." @@ -6006,11 +7275,11 @@ msgstr "" "경사 표면 근처에 솔리드 인필을 추가하여 수직 셸 두께(상단+하단 솔리드 레이어)" "를 보장하십시오." -#: src/libslic3r/PrintConfig.cpp:399 +#: src/libslic3r/PrintConfig.cpp:415 msgid "Top fill pattern" msgstr "상단 채우기 패턴" -#: src/libslic3r/PrintConfig.cpp:401 +#: src/libslic3r/PrintConfig.cpp:417 msgid "" "Fill pattern for top infill. This only affects the top visible layer, and " "not its adjacent solid shells." @@ -6018,32 +7287,32 @@ msgstr "" "상단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 보이는 상위 레이어" "에만 영향을 줍니다." -#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:821 -#: src/libslic3r/PrintConfig.cpp:1972 +#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:844 +#: src/libslic3r/PrintConfig.cpp:2019 msgid "Rectilinear" msgstr "직선면(Rectilinear)" -#: src/libslic3r/PrintConfig.cpp:410 src/libslic3r/PrintConfig.cpp:827 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:850 msgid "Concentric" msgstr "동심원(Concentric)" -#: src/libslic3r/PrintConfig.cpp:411 src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:854 msgid "Hilbert Curve" msgstr "힐버트 곡선(Hilbert Curve)" -#: src/libslic3r/PrintConfig.cpp:412 src/libslic3r/PrintConfig.cpp:832 +#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:855 msgid "Archimedean Chords" msgstr "아르키메데우스(Archimedean Chords)" -#: src/libslic3r/PrintConfig.cpp:413 src/libslic3r/PrintConfig.cpp:833 +#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:856 msgid "Octagram Spiral" msgstr "옥타그램 나선(Octagram Spiral)" -#: src/libslic3r/PrintConfig.cpp:419 +#: src/libslic3r/PrintConfig.cpp:435 msgid "Bottom fill pattern" msgstr "아래쪽 채우기 패턴" -#: src/libslic3r/PrintConfig.cpp:421 +#: src/libslic3r/PrintConfig.cpp:437 msgid "" "Fill pattern for bottom infill. This only affects the bottom external " "visible layer, and not its adjacent solid shells." @@ -6051,11 +7320,11 @@ msgstr "" "하단 채우기의 채우기 패턴. 이는 인접 한 솔리드 쉘이 아니라 아래쪽에 보이는 외" "부 레이어에만 영향을 줍니다." -#: src/libslic3r/PrintConfig.cpp:430 src/libslic3r/PrintConfig.cpp:440 +#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457 msgid "External perimeters" msgstr "외측 둘레" -#: src/libslic3r/PrintConfig.cpp:432 +#: src/libslic3r/PrintConfig.cpp:448 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, " @@ -6066,16 +7335,16 @@ msgstr "" "오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경이 사" "용된다. 백분율(예: 200%)로 표현되는 경우, 레이어 높이에 걸쳐 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:435 src/libslic3r/PrintConfig.cpp:543 -#: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:872 -#: src/libslic3r/PrintConfig.cpp:992 src/libslic3r/PrintConfig.cpp:1017 -#: src/libslic3r/PrintConfig.cpp:1403 src/libslic3r/PrintConfig.cpp:1741 -#: src/libslic3r/PrintConfig.cpp:1847 src/libslic3r/PrintConfig.cpp:1915 -#: src/libslic3r/PrintConfig.cpp:2074 +#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560 +#: src/libslic3r/PrintConfig.cpp:883 src/libslic3r/PrintConfig.cpp:896 +#: src/libslic3r/PrintConfig.cpp:1016 src/libslic3r/PrintConfig.cpp:1042 +#: src/libslic3r/PrintConfig.cpp:1432 src/libslic3r/PrintConfig.cpp:1771 +#: src/libslic3r/PrintConfig.cpp:1893 src/libslic3r/PrintConfig.cpp:1961 +#: src/libslic3r/PrintConfig.cpp:2121 msgid "mm or %" msgstr "mm/s 또는 %" -#: src/libslic3r/PrintConfig.cpp:442 +#: src/libslic3r/PrintConfig.cpp:459 msgid "" "This separate setting will affect the speed of external perimeters (the " "visible ones). If expressed as percentage (for example: 80%) it will be " @@ -6085,17 +7354,17 @@ msgstr "" "(예: 80%)로 표현되는 경우 위의 Perimeter 속도 설정에 따라 계산된다. 자동을 위" "해 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:445 src/libslic3r/PrintConfig.cpp:881 -#: src/libslic3r/PrintConfig.cpp:1700 src/libslic3r/PrintConfig.cpp:1751 -#: src/libslic3r/PrintConfig.cpp:1958 src/libslic3r/PrintConfig.cpp:2086 +#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:905 +#: src/libslic3r/PrintConfig.cpp:1730 src/libslic3r/PrintConfig.cpp:1782 +#: src/libslic3r/PrintConfig.cpp:2005 src/libslic3r/PrintConfig.cpp:2134 msgid "mm/s or %" msgstr "mm/s 또는 %" -#: src/libslic3r/PrintConfig.cpp:452 +#: src/libslic3r/PrintConfig.cpp:469 msgid "External perimeters first" msgstr "외부 경계선 먼저" -#: src/libslic3r/PrintConfig.cpp:454 +#: src/libslic3r/PrintConfig.cpp:471 msgid "" "Print contour perimeters from the outermost one to the innermost one instead " "of the default inverse order." @@ -6103,12 +7372,12 @@ msgstr "" "기본 역순 대신 가장 바깥쪽부터 가장 안쪽까지 윤곽선을 인쇄하십시오. 타겟 TTS" "복사하기번역 저장번역 저장번역 수정." -#: src/libslic3r/PrintConfig.cpp:460 +#: src/libslic3r/PrintConfig.cpp:477 msgid "Extra perimeters if needed" msgstr "필요한 경우 추가 둘레" -#: src/libslic3r/PrintConfig.cpp:462 -#, c-format +#: src/libslic3r/PrintConfig.cpp:479 +#, no-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 " @@ -6118,7 +7387,7 @@ msgstr "" "오. 위의 루프의 70% of 이상이 지지될 때까지 Slic3r는 계속해서 둘ㄹ를 추가한" "다." -#: src/libslic3r/PrintConfig.cpp:472 +#: src/libslic3r/PrintConfig.cpp:489 msgid "" "The extruder to use (unless more specific extruder settings are specified). " "This value overrides perimeter and infill extruders, but not the support " @@ -6127,7 +7396,7 @@ msgstr "" "사용할 압출부(더 구체적인 압출부 설정이 지정되지 않은 경우) 이 값은 경계 및 " "압출부를 초과하지만 지원 압출자를 주입하지는 않는다." -#: src/libslic3r/PrintConfig.cpp:484 +#: src/libslic3r/PrintConfig.cpp:501 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 " @@ -6136,13 +7405,9 @@ msgid "" msgstr "" "이것을 노즐 팁과 (일반적으로) X 캐리지 로드 사이의 수직 거리로 설정하십시오. " "다시 말하면, 이것은 당신의 압출기 주위의 틈새 실린더의 높이이며, 그것은 다른 " -"인쇄된 물체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." +"인쇄된 개체와 충돌하기 전에 압출기가 엿볼 수 있는 최대 깊이를 나타낸다." -#: src/libslic3r/PrintConfig.cpp:494 -msgid "Radius" -msgstr "반지름" - -#: src/libslic3r/PrintConfig.cpp:495 +#: src/libslic3r/PrintConfig.cpp:512 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 " @@ -6152,19 +7417,19 @@ msgstr "" "으면 안전을 위해 가장 큰 값을 선택하십시오. 이 설정은 충돌 여부를 확인하고 플" "래터에 그래픽 미리 보기를 표시하기 위해 사용된다." -#: src/libslic3r/PrintConfig.cpp:505 +#: src/libslic3r/PrintConfig.cpp:522 msgid "Extruder Color" msgstr "익스트루더 컬러" -#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:566 +#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:584 msgid "This is only used in the Slic3r interface as a visual help." -msgstr "이것은 시각적 도움말로 Slic3r 인터페이스에서만 사용된다." +msgstr "이것은 시각적 도움말로 Slic3r 접점에서만 사용된다." -#: src/libslic3r/PrintConfig.cpp:512 +#: src/libslic3r/PrintConfig.cpp:529 msgid "Extruder offset" msgstr "익스트루더 오프셋" -#: src/libslic3r/PrintConfig.cpp:513 +#: src/libslic3r/PrintConfig.cpp:530 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 " @@ -6175,11 +7440,11 @@ msgstr "" "을 사용하면 첫 번째 것에 대한 각 압출기의 변위를 지정할 수 있습니다. 양의 좌" "표가 필요합니다 (XY 좌표에서 뺍니다)." -#: src/libslic3r/PrintConfig.cpp:522 +#: src/libslic3r/PrintConfig.cpp:539 msgid "Extrusion axis" msgstr "압출 축" -#: src/libslic3r/PrintConfig.cpp:523 +#: src/libslic3r/PrintConfig.cpp:540 msgid "" "Use this option to set the axis letter associated to your printer's extruder " "(usually E but some printers use A)." @@ -6187,11 +7452,11 @@ msgstr "" "이 옵션을 사용하여 프린터의 압출기에 연결된 축 문자를 설정합니다 (보통 E이지" "만 일부 프린터는 A를 사용합니다)." -#: src/libslic3r/PrintConfig.cpp:528 +#: src/libslic3r/PrintConfig.cpp:545 msgid "Extrusion multiplier" msgstr "압출 승수" -#: src/libslic3r/PrintConfig.cpp:529 +#: src/libslic3r/PrintConfig.cpp:546 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. " @@ -6203,11 +7468,11 @@ msgstr "" "이입니다. 이 값을 더 변경해야한다고 판단되면 필라멘트 직경과 펌웨어 E 단계를 " "확인하십시오." -#: src/libslic3r/PrintConfig.cpp:537 +#: src/libslic3r/PrintConfig.cpp:554 msgid "Default extrusion width" msgstr "기본 압출 폭" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:556 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 " @@ -6220,11 +7485,11 @@ msgstr "" "의 툴팁 참조). 백분율로 표시되는 경우 (예 : 230 %) 레이어 높이를 기준으로 계" "산됩니다." -#: src/libslic3r/PrintConfig.cpp:548 +#: src/libslic3r/PrintConfig.cpp:566 msgid "Keep fan always on" msgstr "항상 팬 켜기" -#: src/libslic3r/PrintConfig.cpp:549 +#: src/libslic3r/PrintConfig.cpp:567 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." @@ -6232,11 +7497,11 @@ msgstr "" "이 기능을 사용하면 팬이 비활성화되지 않으며 최소한 최소 속도로 계속 회전합니" "다. PLA에 유용하며 ABS에 해롭다." -#: src/libslic3r/PrintConfig.cpp:554 +#: src/libslic3r/PrintConfig.cpp:572 msgid "Enable fan if layer print time is below" msgstr "레이어 인쇄 시간이 미만인 경우 팬 활성화" -#: src/libslic3r/PrintConfig.cpp:555 +#: src/libslic3r/PrintConfig.cpp:573 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 " @@ -6245,27 +7510,23 @@ msgstr "" "레이어 인쇄 시간이이 초 미만으로 예상되는 경우 팬이 활성화되고 속도는 최소 " "및 최대 속도를 보간하여 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:557 src/libslic3r/PrintConfig.cpp:1687 +#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1717 msgid "approximate seconds" msgstr "근사치 초" -#: src/libslic3r/PrintConfig.cpp:565 -msgid "Color" -msgstr "색상" - -#: src/libslic3r/PrintConfig.cpp:571 +#: src/libslic3r/PrintConfig.cpp:589 msgid "Filament notes" msgstr "필라멘트 메모" -#: src/libslic3r/PrintConfig.cpp:572 +#: src/libslic3r/PrintConfig.cpp:590 msgid "You can put your notes regarding the filament here." msgstr "여기에 필라멘트에 관한 메모를 넣을 수 있다." -#: src/libslic3r/PrintConfig.cpp:580 src/libslic3r/PrintConfig.cpp:1231 +#: src/libslic3r/PrintConfig.cpp:598 src/libslic3r/PrintConfig.cpp:1256 msgid "Max volumetric speed" msgstr "최대 체적 속도" -#: src/libslic3r/PrintConfig.cpp:581 +#: src/libslic3r/PrintConfig.cpp:599 msgid "" "Maximum volumetric speed allowed for this filament. Limits the maximum " "volumetric speed of a print to the minimum of print and filament volumetric " @@ -6274,27 +7535,27 @@ msgstr "" "이 필라멘트에 허용되는 최대 체적 속도. 인쇄물의 최대 체적 속도를 인쇄 및 필라" "멘트 체적 속도 최소로 제한한다. 제한 없음에 대해 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:590 +#: src/libslic3r/PrintConfig.cpp:608 msgid "Loading speed" msgstr "로딩 속도" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:609 msgid "Speed used for loading the filament on the wipe tower." -msgstr "와이퍼 탑(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " +msgstr "와이퍼 타워(wipe)에 필라멘트를 장착하는 데 사용되는 속도. " -#: src/libslic3r/PrintConfig.cpp:598 +#: src/libslic3r/PrintConfig.cpp:616 msgid "Loading speed at the start" msgstr "시작시 로딩 속도" -#: src/libslic3r/PrintConfig.cpp:599 +#: src/libslic3r/PrintConfig.cpp:617 msgid "Speed used at the very beginning of loading phase." msgstr "로딩 단계의 시작에 사용 되는 속도." -#: src/libslic3r/PrintConfig.cpp:606 +#: src/libslic3r/PrintConfig.cpp:624 msgid "Unloading speed" msgstr "언로딩 스피드" -#: src/libslic3r/PrintConfig.cpp:607 +#: src/libslic3r/PrintConfig.cpp:625 msgid "" "Speed used for unloading the filament on the wipe tower (does not affect " "initial part of unloading just after ramming)." @@ -6302,20 +7563,20 @@ msgstr "" "와이퍼 타워에서 필라멘트를 언로드하는 데 사용되는 속도(램핑 후 바로 언로딩의 " "초기 부분에는 영향을 주지 않음)." -#: src/libslic3r/PrintConfig.cpp:615 +#: src/libslic3r/PrintConfig.cpp:633 msgid "Unloading speed at the start" msgstr "시작 시 언로드 속도" -#: src/libslic3r/PrintConfig.cpp:616 +#: src/libslic3r/PrintConfig.cpp:634 msgid "" "Speed used for unloading the tip of the filament immediately after ramming." msgstr "속도는 램 밍 직후 필 라 멘 트의 팁을 언로딩 하는 데 사용 됩니다." -#: src/libslic3r/PrintConfig.cpp:623 +#: src/libslic3r/PrintConfig.cpp:641 msgid "Delay after unloading" msgstr "언로드 후 딜레이" -#: src/libslic3r/PrintConfig.cpp:624 +#: src/libslic3r/PrintConfig.cpp:642 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 " @@ -6324,11 +7585,11 @@ msgstr "" "필라멘트를 내린 후 기다리는 시간. 원래 치수로 축소하는 데, 더 많은 시간이 필" "요할 수 있는 유연한 재료로 신뢰할 수있는 공구 교환을 얻을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:633 +#: src/libslic3r/PrintConfig.cpp:651 msgid "Number of cooling moves" msgstr "쿨링 이동 숫자" -#: src/libslic3r/PrintConfig.cpp:634 +#: src/libslic3r/PrintConfig.cpp:652 msgid "" "Filament is cooled by being moved back and forth in the cooling tubes. " "Specify desired number of these moves." @@ -6336,19 +7597,19 @@ msgstr "" "필라멘트는 쿨링 튜브에서 앞뒤로 이동 하여 냉각 됩니다. 이러한 이동의 원하는 " "값을 지정 합니다." -#: src/libslic3r/PrintConfig.cpp:642 +#: src/libslic3r/PrintConfig.cpp:660 msgid "Speed of the first cooling move" msgstr "첫 번째 냉각 이동 속도" -#: src/libslic3r/PrintConfig.cpp:643 +#: src/libslic3r/PrintConfig.cpp:661 msgid "Cooling moves are gradually accelerating beginning at this speed." msgstr "냉각 속도가 서서히 빨라지고 있습니다." -#: src/libslic3r/PrintConfig.cpp:650 +#: src/libslic3r/PrintConfig.cpp:668 msgid "Minimal purge on wipe tower" msgstr "와이프(wipe) 탑의 최소 퍼지" -#: src/libslic3r/PrintConfig.cpp:651 +#: src/libslic3r/PrintConfig.cpp:669 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 " @@ -6358,27 +7619,27 @@ msgid "" msgstr "" "공구가 변경 된 후 노즐 내부에 새로 로드 된 필라멘트의 정확한 위치를 알 수 없" "으며, 필라멘트 압력이 아직 안정적이지 않을 수 있습니다. 프린트 헤드를 인필 또" -"는 희생(sacrificial) 객체로 소거 하기 전에 Slic3r는 항상이 양의 재료를 와이" -"프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체 돌출을 안정적으로 생" -"성 합니다." +"는 희생(sacrificial) 객체(object)로 소거 하기 전에 Slic3r는 항상이 양의 재료" +"를 와이프 탑에 넣어 연속적인 채우기 또는 희생(sacrificial) 객체(object) 돌출" +"을 안정적으로 생성 합니다." -#: src/libslic3r/PrintConfig.cpp:655 +#: src/libslic3r/PrintConfig.cpp:673 msgid "mm³" msgstr "mm ³" -#: src/libslic3r/PrintConfig.cpp:661 +#: src/libslic3r/PrintConfig.cpp:679 msgid "Speed of the last cooling move" msgstr "마지막 냉각 이동 속도" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:680 msgid "Cooling moves are gradually accelerating towards this speed." msgstr "냉각은 이 속도쪽으로 점차 가속화되고 있습니다. " -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:687 msgid "Filament load time" msgstr "필라멘트 로드 시간" -#: src/libslic3r/PrintConfig.cpp:670 +#: src/libslic3r/PrintConfig.cpp:688 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 " @@ -6388,22 +7649,22 @@ msgstr "" "라멘트를 로드하는 시간입니다. 이 시간은 G 코드 시간 추정기에 의해 총 인쇄 시" "간에 추가 됩니다." -#: src/libslic3r/PrintConfig.cpp:677 +#: src/libslic3r/PrintConfig.cpp:695 msgid "Ramming parameters" msgstr "래밍 파라미터" -#: src/libslic3r/PrintConfig.cpp:678 +#: src/libslic3r/PrintConfig.cpp:696 msgid "" "This string is edited by RammingDialog and contains ramming specific " "parameters." msgstr "" "이 문자열은 RammingDialog에 의해 편집되고 래밍 특정 매개 변수를 포함합니다." -#: src/libslic3r/PrintConfig.cpp:684 +#: src/libslic3r/PrintConfig.cpp:702 msgid "Filament unload time" msgstr "필라멘트 언로드 시간" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:703 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 " @@ -6413,7 +7674,7 @@ msgstr "" "입니다 (T 코드를 실행할 때). 이 시간은 G 코드 시간추정기에 의해 총 인쇄 시간" "에 추가 됩니다." -#: src/libslic3r/PrintConfig.cpp:693 +#: src/libslic3r/PrintConfig.cpp:711 msgid "" "Enter your filament diameter here. Good precision is required, so use a " "caliper and do multiple measurements along the filament, then compute the " @@ -6422,11 +7683,12 @@ msgstr "" "여기에 필라멘트 직경을 입력하십시오. 정밀도가 필요하므로 캘리퍼를 사용하여 필" "라멘트를 따라 여러 번 측정 한 다음 평균을 계산하십시오." -#: src/libslic3r/PrintConfig.cpp:700 +#: src/libslic3r/PrintConfig.cpp:718 src/libslic3r/PrintConfig.cpp:2504 +#: src/libslic3r/PrintConfig.cpp:2505 msgid "Density" msgstr "밀도" -#: src/libslic3r/PrintConfig.cpp:701 +#: src/libslic3r/PrintConfig.cpp:719 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 " @@ -6437,41 +7699,45 @@ msgstr "" "은 알려진 길이의 필라멘트의 무게를 측정하고 길이와 볼륨의 비율을 계산하는 것" "입니다. 변위를 통해 직접적으로 부피를 계산하는 것이 더 좋습니다." -#: src/libslic3r/PrintConfig.cpp:704 +#: src/libslic3r/PrintConfig.cpp:722 msgid "g/cm³" msgstr "g/cm³" -#: src/libslic3r/PrintConfig.cpp:709 +#: src/libslic3r/PrintConfig.cpp:727 msgid "Filament type" msgstr "필라멘트 타입" -#: src/libslic3r/PrintConfig.cpp:710 +#: src/libslic3r/PrintConfig.cpp:728 msgid "The filament material type for use in custom G-codes." msgstr "사용자 지정 G 코드에 사용할 필라멘트재료 유형입니다." -#: src/libslic3r/PrintConfig.cpp:736 +#: src/libslic3r/PrintConfig.cpp:755 msgid "Soluble material" msgstr "수용성 재료" -#: src/libslic3r/PrintConfig.cpp:737 +#: src/libslic3r/PrintConfig.cpp:756 msgid "Soluble material is most likely used for a soluble support." msgstr "수용성 재료눈 물에 녹는 서포트에 가장 많이 사용된다." -#: src/libslic3r/PrintConfig.cpp:743 +#: src/libslic3r/PrintConfig.cpp:762 msgid "" "Enter your filament cost per kg here. This is only for statistical " "information." msgstr "필라멘트(kg당) 비용을 여기에 입력하십시오. 통계를 내기 위해서 입니다." -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:763 msgid "money/kg" msgstr "원(\\)/kg" -#: src/libslic3r/PrintConfig.cpp:753 +#: src/libslic3r/PrintConfig.cpp:772 src/libslic3r/PrintConfig.cpp:2588 +msgid "(Unknown)" +msgstr "(알 수 없음)" + +#: src/libslic3r/PrintConfig.cpp:776 msgid "Fill angle" msgstr "채움 각도" -#: src/libslic3r/PrintConfig.cpp:755 +#: src/libslic3r/PrintConfig.cpp:778 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, " @@ -6481,60 +7747,60 @@ msgstr "" "지 할 수있는 최상의 방향을 사용하여 브릿징이 채워지므로이 설정은 영향을 미치" "지 않습니다." -#: src/libslic3r/PrintConfig.cpp:767 +#: src/libslic3r/PrintConfig.cpp:790 msgid "Fill density" msgstr "채우기(fill) 밀도" -#: src/libslic3r/PrintConfig.cpp:769 +#: src/libslic3r/PrintConfig.cpp:792 msgid "Density of internal infill, expressed in the range 0% - 100%." msgstr "0 % - 100 % 범위로 표현 된 내부 채움(infill)의 밀도." -#: src/libslic3r/PrintConfig.cpp:804 +#: src/libslic3r/PrintConfig.cpp:827 msgid "Fill pattern" msgstr "채우기(fill) 패턴" -#: src/libslic3r/PrintConfig.cpp:806 +#: src/libslic3r/PrintConfig.cpp:829 msgid "Fill pattern for general low-density infill." msgstr "일반 낮은 밀도 채움의 패턴." -#: src/libslic3r/PrintConfig.cpp:822 +#: src/libslic3r/PrintConfig.cpp:845 msgid "Grid" msgstr "그리드(Grid)" -#: src/libslic3r/PrintConfig.cpp:823 +#: src/libslic3r/PrintConfig.cpp:846 msgid "Triangles" msgstr "삼각형(Triangles)" -#: src/libslic3r/PrintConfig.cpp:824 +#: src/libslic3r/PrintConfig.cpp:847 msgid "Stars" msgstr "별(Stars)" -#: src/libslic3r/PrintConfig.cpp:825 +#: src/libslic3r/PrintConfig.cpp:848 msgid "Cubic" msgstr "큐빅" -#: src/libslic3r/PrintConfig.cpp:826 +#: src/libslic3r/PrintConfig.cpp:849 msgid "Line" msgstr "선(Line)" -#: src/libslic3r/PrintConfig.cpp:828 src/libslic3r/PrintConfig.cpp:1974 +#: src/libslic3r/PrintConfig.cpp:851 src/libslic3r/PrintConfig.cpp:2021 msgid "Honeycomb" msgstr "벌집" -#: src/libslic3r/PrintConfig.cpp:829 +#: src/libslic3r/PrintConfig.cpp:852 msgid "3D Honeycomb" msgstr "3D 벌집" -#: src/libslic3r/PrintConfig.cpp:830 +#: src/libslic3r/PrintConfig.cpp:853 msgid "Gyroid" msgstr "자이로이드(Gyroid)" -#: src/libslic3r/PrintConfig.cpp:837 src/libslic3r/PrintConfig.cpp:846 -#: src/libslic3r/PrintConfig.cpp:854 src/libslic3r/PrintConfig.cpp:887 +#: src/libslic3r/PrintConfig.cpp:860 src/libslic3r/PrintConfig.cpp:869 +#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:911 msgid "First layer" msgstr "첫 레이어" -#: src/libslic3r/PrintConfig.cpp:838 +#: src/libslic3r/PrintConfig.cpp:861 msgid "" "This is the acceleration your printer will use for first layer. Set zero to " "disable acceleration control for first layer." @@ -6542,7 +7808,7 @@ msgstr "" "이것은 프린터가 첫 번째 레이어에 사용할 가속도입니다. 0을 설정하면 첫 번째 레" "이어에 대한 가속 제어가 사용되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:847 +#: src/libslic3r/PrintConfig.cpp:870 msgid "" "Heated build plate temperature for the first layer. Set this to zero to " "disable bed temperature control commands in the output." @@ -6550,7 +7816,7 @@ msgstr "" "첫 번째 레이어에 대한 빌드 플레이트 온도를 가열. 이 값을 0으로 설정하면 출력" "에서 ​​베드 온도 제어 명령을 비활성화합니다." -#: src/libslic3r/PrintConfig.cpp:856 +#: src/libslic3r/PrintConfig.cpp:879 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 " @@ -6562,7 +7828,7 @@ msgstr "" "수 있습니다. 백분율 (예 : 120 %)로 표현하면 첫 번째 레이어 높이를 기준으로 계" "산됩니다. 0으로 설정하면 기본 압출 폭이 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:868 +#: src/libslic3r/PrintConfig.cpp:892 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 " @@ -6574,11 +7840,11 @@ msgstr "" "다. 이것은 절대값 또는 기본 계층 높이에 대한 백분율(예: 150%)로 표시할 수 있" "다." -#: src/libslic3r/PrintConfig.cpp:877 +#: src/libslic3r/PrintConfig.cpp:901 msgid "First layer speed" msgstr "첫 레이어 속도" -#: src/libslic3r/PrintConfig.cpp:878 +#: src/libslic3r/PrintConfig.cpp:902 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 " @@ -6588,7 +7854,7 @@ msgstr "" "인쇄 이동에 적용된다. 백분율(예: 40%)로 표현되는 경우 기본 속도를 스케일링한" "다." -#: src/libslic3r/PrintConfig.cpp:888 +#: src/libslic3r/PrintConfig.cpp:912 msgid "" "Extruder temperature for first layer. If you want to control temperature " "manually during print, set this to zero to disable temperature control " @@ -6597,7 +7863,7 @@ msgstr "" "첫 번째 층의 외부 온도. 인쇄 중에 온도를 수동으로 제어하려면 출력 파일에서 온" "도 제어 명령을 사용하지 않으려면 이 값을 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:897 +#: src/libslic3r/PrintConfig.cpp:921 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 " @@ -6607,11 +7873,11 @@ msgstr "" "기 위해 이것을 합리적으로 낮게 유지한다. 간격 채우기를 사용하지 않으려면 0을 " "설정하십시오." -#: src/libslic3r/PrintConfig.cpp:905 +#: src/libslic3r/PrintConfig.cpp:929 msgid "Verbose G-code" -msgstr "세부 G-코드" +msgstr "세부 G-code" -#: src/libslic3r/PrintConfig.cpp:906 +#: src/libslic3r/PrintConfig.cpp:930 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 " @@ -6621,46 +7887,46 @@ msgstr "" "을 선택하십시오. 만일 당신이 SD카드로 인쇄한다면, 파일의 추가 무게로 인해 펌" "웨어의 속도가 느려질 수 있다." -#: src/libslic3r/PrintConfig.cpp:913 +#: src/libslic3r/PrintConfig.cpp:937 msgid "G-code flavor" msgstr "G-code 형식" -#: src/libslic3r/PrintConfig.cpp:914 +#: src/libslic3r/PrintConfig.cpp:938 msgid "" "Some G/M-code commands, including temperature control and others, are not " "universal. Set this option to your printer's firmware to get a compatible " -"output. The \"No extrusion\" flavor prevents Slic3r from exporting any " +"output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any " "extrusion value at all." msgstr "" -"온도 조절 등을 포함한 일부 G/M-코드 명령은 보편적이지 않습니다. 호환되는 출력" -"을 얻으려면 보드에 적제된 프린터의 펌웨어로 설정하십시오. \"압출 없음\" 형식" -"은 Slic3r가 어떠한 압출 값도 출력하지 못하게 합니다." +"온도 제어 및 기타 를 포함한 일부 G/M 코드 명령은 범용이 아닙니다. 호환되는 출" +"력을 얻으려면 프린터의 펌웨어로 이 옵션을 설정합니다. \"돌출 없음\" 맛은 " +"PrusaSlicer가 압출 값을 전혀 내보내지 못하게 합니다." -#: src/libslic3r/PrintConfig.cpp:937 +#: src/libslic3r/PrintConfig.cpp:961 msgid "No extrusion" msgstr "압출 없음" -#: src/libslic3r/PrintConfig.cpp:942 +#: src/libslic3r/PrintConfig.cpp:966 msgid "Label objects" -msgstr "레이블 개체" +msgstr "레이블 객체(object)" -#: src/libslic3r/PrintConfig.cpp:943 +#: src/libslic3r/PrintConfig.cpp:967 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 코드 레이블 인쇄에 주석이 속해 있는 객체와 함께 이동 " -"하 여 주석을 추가할 수 있으며,이는 옥 토 프린트 캔 커 작업 플러그인에 유용 합" -"니다. 이 설정은 단일 압출 기 다중 재료 설정과 호환 되지 않으며 객체를 닦아 " -"내 고 채우기로 닦습니다." +"이 기능을 사용 하 여 G 코드 레이블 인쇄에 주석이 속해 있는 객체(object)와 함" +"께 이동 하 여 주석을 추가할 수 있으며,이는 옥 토 프린트 캔 커 작업 플러그인" +"에 유용 합니다. 이 설정은 단일 압출 기 다중 재료 설정과 호환 되지 않으며 객체" +"(object)를 닦아 내 고 채우기로 닦습니다." -#: src/libslic3r/PrintConfig.cpp:950 +#: src/libslic3r/PrintConfig.cpp:974 msgid "High extruder current on filament swap" msgstr "필라멘트스왑에 높은 압출 기 전류" -#: src/libslic3r/PrintConfig.cpp:951 +#: src/libslic3r/PrintConfig.cpp:975 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 " @@ -6670,7 +7936,7 @@ msgstr "" "는 빠른 래밍 공급 속도를 가능 하게하고, 불규칙한 모양의 필라멘트를 로딩할때 " "저항을 극복하기 위한것이다." -#: src/libslic3r/PrintConfig.cpp:959 +#: src/libslic3r/PrintConfig.cpp:983 msgid "" "This is the acceleration your printer will use for infill. Set zero to " "disable acceleration control for infill." @@ -6678,11 +7944,11 @@ msgstr "" "이것은 당신 프린터의 채움 가속력이다. 주입에 대한 가속 제어를 비활성화하려면 " "0을 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:967 +#: src/libslic3r/PrintConfig.cpp:991 msgid "Combine infill every" -msgstr "다음 시간마다 결합" +msgstr "다음 레이어마다 결합" -#: src/libslic3r/PrintConfig.cpp:969 +#: src/libslic3r/PrintConfig.cpp:993 msgid "" "This feature allows to combine infill and speed up your print by extruding " "thicker infill layers while preserving thin perimeters, thus accuracy." @@ -6690,19 +7956,19 @@ msgstr "" "이 기능은 인필을 결합하고 얇은 주변기기를 보존하면서 두꺼운 인필 층을 압출하" "여 인쇄 속도를 높일 수 있도록 하여 정확도를 높인다." -#: src/libslic3r/PrintConfig.cpp:972 +#: src/libslic3r/PrintConfig.cpp:996 msgid "Combine infill every n layers" msgstr "모든 n개 층을 채우기 위해 결합" -#: src/libslic3r/PrintConfig.cpp:978 +#: src/libslic3r/PrintConfig.cpp:1002 msgid "Infill extruder" msgstr "채움(Infill) 익스트루더" -#: src/libslic3r/PrintConfig.cpp:980 +#: src/libslic3r/PrintConfig.cpp:1004 msgid "The extruder to use when printing infill." msgstr "채움으로 사용할 익스트루더." -#: src/libslic3r/PrintConfig.cpp:988 +#: src/libslic3r/PrintConfig.cpp:1012 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 " @@ -6712,25 +7978,25 @@ msgid "" msgstr "" "채움에 수동 압출 폭을 설정하려면이 값을 0이 아닌 값으로 설정합니다. 0으로 설" "정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 1.125 x 노즐 직경이 " -"사용됩니다. 채움 속도를 높이고 부품을 더 강하게 만들려면보다 큰 압출 성형물" -"을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으" -"로 계산됩니다." +"사용됩니다. 채움 속도를 높이고 부품(Part)을 더 강하게 만들려면보다 큰 압출 성" +"형물을 사용하는 것이 좋습니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기" +"준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:997 +#: src/libslic3r/PrintConfig.cpp:1022 msgid "Infill before perimeters" msgstr "둘레보다 앞쪽에 채움" -#: src/libslic3r/PrintConfig.cpp:998 +#: src/libslic3r/PrintConfig.cpp:1023 msgid "" "This option will switch the print order of perimeters and infill, making the " "latter first." msgstr "이 옵션은 외부출력과 채움 인쇄 순서를 바꾸어, 후자를 먼저 만든다." -#: src/libslic3r/PrintConfig.cpp:1003 +#: src/libslic3r/PrintConfig.cpp:1028 msgid "Only infill where needed" -msgstr "필요한 경우 채음" +msgstr "필요한 경우 채움" -#: src/libslic3r/PrintConfig.cpp:1005 +#: src/libslic3r/PrintConfig.cpp:1030 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 " @@ -6740,11 +8006,11 @@ msgstr "" "을 할 것이다). 활성화된 경우 관련된 여러 번의 점검으로 인해 G-code 생성 속도" "를 늦춰라." -#: src/libslic3r/PrintConfig.cpp:1012 +#: src/libslic3r/PrintConfig.cpp:1037 msgid "Infill/perimeters overlap" msgstr "채움/둘레 겹침(perimeters overlap)" -#: src/libslic3r/PrintConfig.cpp:1014 +#: src/libslic3r/PrintConfig.cpp:1039 msgid "" "This setting applies an additional overlap between infill and perimeters for " "better bonding. Theoretically this shouldn't be needed, but backlash might " @@ -6755,23 +8021,23 @@ msgstr "" "론적으로 이것은 필요하지 않아야하지만 백래시가 갭을 유발할 수 있습니다. 백분" "율 (예 : 15 %)로 표시되는 경우 경계 압출 폭을 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1025 +#: src/libslic3r/PrintConfig.cpp:1050 msgid "Speed for printing the internal fill. Set to zero for auto." msgstr "내부 채우기 인쇄 속도. 자동으로 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1033 +#: src/libslic3r/PrintConfig.cpp:1058 msgid "Inherits profile" msgstr "프로필 상속" -#: src/libslic3r/PrintConfig.cpp:1034 +#: src/libslic3r/PrintConfig.cpp:1059 msgid "Name of the profile, from which this profile inherits." msgstr "이 프로파일이 상속되는 프로파일의 이름." -#: src/libslic3r/PrintConfig.cpp:1047 +#: src/libslic3r/PrintConfig.cpp:1072 msgid "Interface shells" -msgstr "인터페이스 셸(shells)" +msgstr "접점 셸(shells)" -#: src/libslic3r/PrintConfig.cpp:1048 +#: src/libslic3r/PrintConfig.cpp:1073 msgid "" "Force the generation of solid shells between adjacent materials/volumes. " "Useful for multi-extruder prints with translucent materials or manual " @@ -6780,7 +8046,7 @@ msgstr "" "인접 재료/볼륨 사이에 고체 쉘 생성을 강제하십시오. 반투명 재료 또는 수동 수용" "성 서포트 재료를 사용한 다중 압ㅊ기 인쇄에 유용함." -#: src/libslic3r/PrintConfig.cpp:1057 +#: src/libslic3r/PrintConfig.cpp:1082 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 " @@ -6792,11 +8058,11 @@ msgstr "" "[layer_num] 및 [layer_z]에 자리 표시자 변수를 사용할 수 있다는 점에 유의하십" "시오." -#: src/libslic3r/PrintConfig.cpp:1068 +#: src/libslic3r/PrintConfig.cpp:1093 msgid "Supports remaining times" msgstr "남은 시간 지원" -#: src/libslic3r/PrintConfig.cpp:1069 +#: src/libslic3r/PrintConfig.cpp:1094 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. " @@ -6808,168 +8074,168 @@ msgstr "" "웨어는 M73를 인식 하 고 있습니다. 또한 i3 MK3 펌웨어는 자동 모드에서 M73 Qxx " "Sxx를 지원 합니다." -#: src/libslic3r/PrintConfig.cpp:1077 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "Supports stealth mode" msgstr "자동 모드 지원" -#: src/libslic3r/PrintConfig.cpp:1078 +#: src/libslic3r/PrintConfig.cpp:1103 msgid "The firmware supports stealth mode" msgstr "펌웨어는 스텔스 모드를 지원 합니다" -#: src/libslic3r/PrintConfig.cpp:1102 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "Maximum feedrate X" msgstr "최대 이송 속도 X" -#: src/libslic3r/PrintConfig.cpp:1103 +#: src/libslic3r/PrintConfig.cpp:1128 msgid "Maximum feedrate Y" msgstr "최대 이송 속도 Y" -#: src/libslic3r/PrintConfig.cpp:1104 +#: src/libslic3r/PrintConfig.cpp:1129 msgid "Maximum feedrate Z" msgstr "최대 이송 속도 Z" -#: src/libslic3r/PrintConfig.cpp:1105 +#: src/libslic3r/PrintConfig.cpp:1130 msgid "Maximum feedrate E" msgstr "최대 이송 속도 E" -#: src/libslic3r/PrintConfig.cpp:1108 +#: src/libslic3r/PrintConfig.cpp:1133 msgid "Maximum feedrate of the X axis" msgstr "X 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1109 +#: src/libslic3r/PrintConfig.cpp:1134 msgid "Maximum feedrate of the Y axis" msgstr "Y 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1110 +#: src/libslic3r/PrintConfig.cpp:1135 msgid "Maximum feedrate of the Z axis" msgstr "Z 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1136 msgid "Maximum feedrate of the E axis" msgstr "E 축의 최대 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1120 +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Maximum acceleration X" msgstr "최대 가속도 X" -#: src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1146 msgid "Maximum acceleration Y" msgstr "최대 가속도 Y" -#: src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1147 msgid "Maximum acceleration Z" msgstr "최대 가속 Z" -#: src/libslic3r/PrintConfig.cpp:1123 +#: src/libslic3r/PrintConfig.cpp:1148 msgid "Maximum acceleration E" msgstr "최대 가속 E" -#: src/libslic3r/PrintConfig.cpp:1126 +#: src/libslic3r/PrintConfig.cpp:1151 msgid "Maximum acceleration of the X axis" msgstr "X 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1127 +#: src/libslic3r/PrintConfig.cpp:1152 msgid "Maximum acceleration of the Y axis" msgstr "Y 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1128 +#: src/libslic3r/PrintConfig.cpp:1153 msgid "Maximum acceleration of the Z axis" msgstr "Z 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1129 +#: src/libslic3r/PrintConfig.cpp:1154 msgid "Maximum acceleration of the E axis" msgstr "E 축의 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1138 +#: src/libslic3r/PrintConfig.cpp:1163 msgid "Maximum jerk X" msgstr "최대 저크(jerk) X" -#: src/libslic3r/PrintConfig.cpp:1139 +#: src/libslic3r/PrintConfig.cpp:1164 msgid "Maximum jerk Y" msgstr "최대 저크(jerk) Y" -#: src/libslic3r/PrintConfig.cpp:1140 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Maximum jerk Z" msgstr "최대 저크(jerk) Z" -#: src/libslic3r/PrintConfig.cpp:1141 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "Maximum jerk E" msgstr "최대 저크(jerk) E" -#: src/libslic3r/PrintConfig.cpp:1144 +#: src/libslic3r/PrintConfig.cpp:1169 msgid "Maximum jerk of the X axis" msgstr "X축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1145 +#: src/libslic3r/PrintConfig.cpp:1170 msgid "Maximum jerk of the Y axis" msgstr "Y축 최대 저크는(jerk)" -#: src/libslic3r/PrintConfig.cpp:1146 +#: src/libslic3r/PrintConfig.cpp:1171 msgid "Maximum jerk of the Z axis" msgstr "Z축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1172 msgid "Maximum jerk of the E axis" msgstr "E축 최대 저크(jerk)" -#: src/libslic3r/PrintConfig.cpp:1158 +#: src/libslic3r/PrintConfig.cpp:1183 msgid "Minimum feedrate when extruding" msgstr "압출시 최소 공급 속도" -#: src/libslic3r/PrintConfig.cpp:1160 +#: src/libslic3r/PrintConfig.cpp:1185 msgid "Minimum feedrate when extruding (M205 S)" msgstr "압출 시 최소 이송 속도 (M205 S)" -#: src/libslic3r/PrintConfig.cpp:1169 +#: src/libslic3r/PrintConfig.cpp:1194 msgid "Minimum travel feedrate" msgstr "최소 이송 속도" -#: src/libslic3r/PrintConfig.cpp:1171 +#: src/libslic3r/PrintConfig.cpp:1196 msgid "Minimum travel feedrate (M205 T)" msgstr "최소 이동 이송 속도 (M205 T)" -#: src/libslic3r/PrintConfig.cpp:1180 +#: src/libslic3r/PrintConfig.cpp:1205 msgid "Maximum acceleration when extruding" msgstr "압출시 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:1207 msgid "Maximum acceleration when extruding (M204 S)" msgstr "압출 시 최대 가속도 (M204 S)" -#: src/libslic3r/PrintConfig.cpp:1191 +#: src/libslic3r/PrintConfig.cpp:1216 msgid "Maximum acceleration when retracting" msgstr "리트렉션 최대 가속도" -#: src/libslic3r/PrintConfig.cpp:1193 +#: src/libslic3r/PrintConfig.cpp:1218 msgid "Maximum acceleration when retracting (M204 T)" msgstr "후퇴 시 최대 가속도 (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1201 src/libslic3r/PrintConfig.cpp:1210 +#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1235 msgid "Max" msgstr "최대" -#: src/libslic3r/PrintConfig.cpp:1202 +#: src/libslic3r/PrintConfig.cpp:1227 msgid "This setting represents the maximum speed of your fan." msgstr "이 설정은 팬의 최대 속도를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:1211 -#, c-format +#: src/libslic3r/PrintConfig.cpp:1236 +#, no-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 "" -"이것은이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지" +"이것은 이 익스트루더의 가장 높은 인쇄 가능 층 높이이며, 가변 층 높이 및 지지" "층 높이를 캡하는 데 사용됩니다. 합당한 층간 접착력을 얻기 위해 최대 권장 높이" "는 압출 폭의 75% of 입니다. 0으로 설정하면 층 높이가 노즐 지름의 75% of로 제" "한됩니다." -#: src/libslic3r/PrintConfig.cpp:1221 +#: src/libslic3r/PrintConfig.cpp:1246 msgid "Max print speed" msgstr "최대 프린트 속도" -#: src/libslic3r/PrintConfig.cpp:1222 +#: src/libslic3r/PrintConfig.cpp:1247 msgid "" "When setting other speed settings to 0 Slic3r will autocalculate the optimal " "speed in order to keep constant extruder pressure. This experimental setting " @@ -6979,18 +8245,18 @@ msgstr "" "의 속도를 자동 계산한다. 이 실험 설정은 허용할 최대 인쇄 속도를 설정하는 데 " "사용된다." -#: src/libslic3r/PrintConfig.cpp:1232 +#: src/libslic3r/PrintConfig.cpp:1257 msgid "" "This experimental setting is used to set the maximum volumetric speed your " "extruder supports." msgstr "" "이 실험 설정은 압출기가 지원하는 최대 체적 속도를 설정하기 위해 사용된다." -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1266 msgid "Max volumetric slope positive" msgstr "최대 체적 기울기 양" -#: src/libslic3r/PrintConfig.cpp:1242 src/libslic3r/PrintConfig.cpp:1253 +#: src/libslic3r/PrintConfig.cpp:1267 src/libslic3r/PrintConfig.cpp:1278 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 " @@ -7001,23 +8267,23 @@ msgstr "" "1.8mm3/s(0.45mm 압출 폭, 0.2mm 압출 높이, 공급 속도 20mm/s)에서 5.4mm3/s(공" "급 속도 60mm/s)로 변경하는 데 최소 2초 이상 걸린다." -#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1257 +#: src/libslic3r/PrintConfig.cpp:1271 src/libslic3r/PrintConfig.cpp:1282 msgid "mm³/s²" msgstr "mm³/s²" -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1277 msgid "Max volumetric slope negative" msgstr "최대 체적 기울기 음수" -#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1273 +#: src/libslic3r/PrintConfig.cpp:1289 src/libslic3r/PrintConfig.cpp:1298 msgid "Min" msgstr "최소" -#: src/libslic3r/PrintConfig.cpp:1265 +#: src/libslic3r/PrintConfig.cpp:1290 msgid "This setting represents the minimum PWM your fan needs to work." msgstr "이 설정은 최소 PWM팬이 활동하는데 필요한를 나타냅니다." -#: src/libslic3r/PrintConfig.cpp:1274 +#: src/libslic3r/PrintConfig.cpp:1299 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 " @@ -7026,32 +8292,32 @@ msgstr "" "이것은 이 압출기에 대한 가장 낮은 인쇄 가능한 층 높이이고 가변 층 높이에 대" "한 분해능을 제한한다. 대표적인 값은 0.05mm와 0.1mm이다." -#: src/libslic3r/PrintConfig.cpp:1282 +#: src/libslic3r/PrintConfig.cpp:1307 msgid "Min print speed" msgstr "최소 인쇄 속도" -#: src/libslic3r/PrintConfig.cpp:1283 +#: src/libslic3r/PrintConfig.cpp:1308 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r는 이 속도 이하로 속도를 낮추지 않을 것이다." -#: src/libslic3r/PrintConfig.cpp:1290 +#: src/libslic3r/PrintConfig.cpp:1315 msgid "Minimal filament extrusion length" msgstr "최소 필라멘트 압출 길이" -#: src/libslic3r/PrintConfig.cpp:1291 +#: src/libslic3r/PrintConfig.cpp:1316 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:1300 +#: src/libslic3r/PrintConfig.cpp:1325 msgid "Configuration notes" msgstr "구성 노트" -#: src/libslic3r/PrintConfig.cpp:1301 +#: src/libslic3r/PrintConfig.cpp:1326 msgid "" "You can put here your personal notes. This text will be added to the G-code " "header comments." @@ -7059,16 +8325,16 @@ msgstr "" "여기에 개인 노트를 넣을 수 있다. 이 텍스트는 G-code 헤더 코멘트에 추가될 것이" "다." -#: src/libslic3r/PrintConfig.cpp:1311 +#: src/libslic3r/PrintConfig.cpp:1336 msgid "" "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)" -msgstr "이 지름은 엑스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." +msgstr "이 지름은 익스트루더 노즐의 직경이다(예: 0.5, 0.35 등)." -#: src/libslic3r/PrintConfig.cpp:1316 +#: src/libslic3r/PrintConfig.cpp:1341 msgid "Host Type" msgstr "호스트 유형" -#: src/libslic3r/PrintConfig.cpp:1317 +#: src/libslic3r/PrintConfig.cpp:1342 msgid "" "Slic3r can upload G-code files to a printer host. This field must contain " "the kind of the host." @@ -7076,11 +8342,11 @@ msgstr "" "Slic3r는 프린터 호스트에 G 코드 파일을 업로드할 수 있습니다. 이 필드에는 호스" "트의 종류가 포함 되어야 합니다." -#: src/libslic3r/PrintConfig.cpp:1328 +#: src/libslic3r/PrintConfig.cpp:1357 msgid "Only retract when crossing perimeters" msgstr "둘레를 횡단 할 때만 수축" -#: src/libslic3r/PrintConfig.cpp:1329 +#: src/libslic3r/PrintConfig.cpp:1358 msgid "" "Disables retraction when the travel path does not exceed the upper layer's " "perimeters (and thus any ooze will be probably invisible)." @@ -7088,7 +8354,7 @@ msgstr "" "이동 경로가 상위 레이어의 경계를 초과하지 않는 경우 리트랙션을 비활성화합니" "다. 따라서 모든 오즈가 보이지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1336 +#: src/libslic3r/PrintConfig.cpp:1365 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 " @@ -7098,11 +8364,11 @@ msgstr "" "변경할 때 키가 큰 스커트를 자동으로 사용하고 스커트 외부로 압출기를 이동합니" "다." -#: src/libslic3r/PrintConfig.cpp:1343 +#: src/libslic3r/PrintConfig.cpp:1372 msgid "Output filename format" msgstr "출력 파일이름 형식" -#: src/libslic3r/PrintConfig.cpp:1344 +#: src/libslic3r/PrintConfig.cpp:1373 msgid "" "You can use all configuration options as variables inside this template. For " "example: [layer_height], [fill_density] etc. You can also use [timestamp], " @@ -7113,11 +8379,11 @@ msgstr "" "[layer_height], [fill_density] 등 또한 [타임 스탬프], [연도], [월], [일], [시" "간], [input_filename], [input_filename_base]을 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1353 +#: src/libslic3r/PrintConfig.cpp:1382 msgid "Detect bridging perimeters" msgstr "브릿 징 경계선 감지" -#: src/libslic3r/PrintConfig.cpp:1355 +#: src/libslic3r/PrintConfig.cpp:1384 msgid "" "Experimental option to adjust flow for overhangs (bridge flow will be used), " "to apply bridge speed to them and enable fan." @@ -7125,11 +8391,11 @@ msgstr "" "오버행에 대한 유량을 조정하는 실험 옵션 (브리지 흐름(flow)이 사용됨)에 브릿" "지 속도를 적용하고 팬을 활성화합니다." -#: src/libslic3r/PrintConfig.cpp:1361 +#: src/libslic3r/PrintConfig.cpp:1390 msgid "Filament parking position" msgstr "필라멘트 멈춤 위치" -#: src/libslic3r/PrintConfig.cpp:1362 +#: src/libslic3r/PrintConfig.cpp:1391 msgid "" "Distance of the extruder tip from the position where the filament is parked " "when unloaded. This should match the value in printer firmware." @@ -7137,11 +8403,11 @@ msgstr "" "언로딩시 필라멘트 위치에서 압출기 팁의 거리. 이 값은 프린터 펌웨어의 값과 일" "치해야합니다." -#: src/libslic3r/PrintConfig.cpp:1370 +#: src/libslic3r/PrintConfig.cpp:1399 msgid "Extra loading distance" msgstr "추가 로딩 거리" -#: src/libslic3r/PrintConfig.cpp:1371 +#: src/libslic3r/PrintConfig.cpp:1400 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 " @@ -7152,12 +8418,12 @@ msgstr "" "이동 한 거리와 동일합니다. 양수이면 음수가 더 많이 로드되고 로드가 음수 인 경" "우 언로드보다 짧습니다." -#: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1397 -#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1419 +#: src/libslic3r/PrintConfig.cpp:1408 src/libslic3r/PrintConfig.cpp:1426 +#: src/libslic3r/PrintConfig.cpp:1439 src/libslic3r/PrintConfig.cpp:1449 msgid "Perimeters" msgstr "둘레" -#: src/libslic3r/PrintConfig.cpp:1380 +#: src/libslic3r/PrintConfig.cpp:1409 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 " @@ -7167,17 +8433,17 @@ msgstr "" "작동하면 좋은 결과를 제공합니다. 주변을 가속 제어하지 않으려면 0으로 설정하십" "시오." -#: src/libslic3r/PrintConfig.cpp:1388 +#: src/libslic3r/PrintConfig.cpp:1417 msgid "Perimeter extruder" -msgstr "주변 익스트루더" +msgstr "가장자리(Perimeter) 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1390 +#: src/libslic3r/PrintConfig.cpp:1419 msgid "" "The extruder to use when printing perimeters and brim. First extruder is 1." msgstr "" "둘레와 가장자리를 인쇄 할 때 사용할 압출기입니다. 첫 번째 압출기는 1입니다." -#: src/libslic3r/PrintConfig.cpp:1399 +#: src/libslic3r/PrintConfig.cpp:1428 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 " @@ -7191,12 +8457,12 @@ msgstr "" "직경이 사용됩니다. 백분율 (예 : 200 %)로 표현하면 레이어 높이를 기준으로 계산" "됩니다." -#: src/libslic3r/PrintConfig.cpp:1411 +#: src/libslic3r/PrintConfig.cpp:1441 msgid "" "Speed for perimeters (contours, aka vertical shells). Set to zero for auto." msgstr "둘레의 속도 (등고선, 일명 세로 셸). 자동으로 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1421 +#: src/libslic3r/PrintConfig.cpp:1451 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 " @@ -7207,11 +8473,11 @@ msgstr "" "사용하면 더 큰 주변 수를 사용하는 경사면을 감지 할 때 Slic3r이이 수를 자동으" "로 증가시킬 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1425 +#: src/libslic3r/PrintConfig.cpp:1455 msgid "(minimum)" msgstr "(최소)" -#: src/libslic3r/PrintConfig.cpp:1433 +#: src/libslic3r/PrintConfig.cpp:1463 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. " @@ -7224,35 +8490,35 @@ msgstr "" "파일의 절대 경로를 첫 번째 인수로 전달되며 환경 변수를 읽음으로써 Slic3r 구" "성 설정에 액세스 할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1445 +#: src/libslic3r/PrintConfig.cpp:1475 msgid "Printer type" msgstr "프린터 타입" -#: src/libslic3r/PrintConfig.cpp:1446 +#: src/libslic3r/PrintConfig.cpp:1476 msgid "Type of the printer." msgstr "프린터 유형." -#: src/libslic3r/PrintConfig.cpp:1451 +#: src/libslic3r/PrintConfig.cpp:1481 msgid "Printer notes" msgstr "프린터 노트" -#: src/libslic3r/PrintConfig.cpp:1452 +#: src/libslic3r/PrintConfig.cpp:1482 msgid "You can put your notes regarding the printer here." msgstr "프린터 관련 메모를 여기에 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1490 msgid "Printer vendor" msgstr "제조 회사" -#: src/libslic3r/PrintConfig.cpp:1461 +#: src/libslic3r/PrintConfig.cpp:1491 msgid "Name of the printer vendor." msgstr "프린터 공급 업체의 이름입니다." -#: src/libslic3r/PrintConfig.cpp:1466 +#: src/libslic3r/PrintConfig.cpp:1496 msgid "Printer variant" msgstr "프린터 변형" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1497 msgid "" "Name of the printer variant. For example, the printer variants may be " "differentiated by a nozzle diameter." @@ -7260,22 +8526,22 @@ msgstr "" "프린터 변종 이름입니다. 예를 들어, 프린터 변형은 노즐 지름으로 구별 될 수 있" "습니다." -#: src/libslic3r/PrintConfig.cpp:1480 +#: src/libslic3r/PrintConfig.cpp:1510 msgid "Raft layers" msgstr "라프트(Raft) 레이어" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1512 msgid "" "The object will be raised by this number of layers, and support material " "will be generated under it." msgstr "" -"물체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." +"개체는 이 개수의 층에 의해 상승되며, 그 아래에서 서포트 재료가 생성될 것이다." -#: src/libslic3r/PrintConfig.cpp:1490 +#: src/libslic3r/PrintConfig.cpp:1520 msgid "Resolution" -msgstr "해결" +msgstr "해상도" -#: src/libslic3r/PrintConfig.cpp:1491 +#: src/libslic3r/PrintConfig.cpp:1521 msgid "" "Minimum detail resolution, used to simplify the input file for speeding up " "the slicing job and reducing memory usage. High-resolution models often " @@ -7287,20 +8553,20 @@ msgstr "" "있는 것보다 더 많은 디테일을 가지고 있다. 단순화를 사용하지 않고 입력에서 전" "체 해상도를 사용하려면 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1501 +#: src/libslic3r/PrintConfig.cpp:1531 msgid "Minimum travel after retraction" msgstr "리트랙션 후 최소 이동 거리" -#: src/libslic3r/PrintConfig.cpp:1502 +#: src/libslic3r/PrintConfig.cpp:1532 msgid "" "Retraction is not triggered when travel moves are shorter than this length." msgstr "이동 거리가 이 길이보다 짧으면 리트렉션이 트리거되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1538 msgid "Retract amount before wipe" msgstr "닦아 내기 전의 수축량" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1539 msgid "" "With bowden extruders, it may be wise to do some amount of quick retract " "before doing the wipe movement." @@ -7308,23 +8574,23 @@ msgstr "" "보우 덴 압출기를 사용하면 와이퍼 동작을하기 전에 약간의 빠른 리트랙션 를하는 " "것이 좋습니다." -#: src/libslic3r/PrintConfig.cpp:1516 +#: src/libslic3r/PrintConfig.cpp:1546 msgid "Retract on layer change" msgstr "레이어 변경 후퇴" -#: src/libslic3r/PrintConfig.cpp:1517 +#: src/libslic3r/PrintConfig.cpp:1547 msgid "This flag enforces a retraction whenever a Z move is done." msgstr "이 플래그는 Z 이동이 완료 될 때마다 취소를 강제 실행합니다." -#: src/libslic3r/PrintConfig.cpp:1522 src/libslic3r/PrintConfig.cpp:1530 +#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1560 msgid "Length" msgstr "길이" -#: src/libslic3r/PrintConfig.cpp:1523 +#: src/libslic3r/PrintConfig.cpp:1553 msgid "Retraction Length" msgstr "리트랙션 길이" -#: src/libslic3r/PrintConfig.cpp:1524 +#: src/libslic3r/PrintConfig.cpp:1554 msgid "" "When retraction is triggered, filament is pulled back by the specified " "amount (the length is measured on raw filament, before it enters the " @@ -7333,15 +8599,15 @@ msgstr "" "후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니다 (길이는 압출기에 " "들어가기 전에 원시 필라멘트에서 측정됩니다)." -#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1556 src/libslic3r/PrintConfig.cpp:1565 msgid "mm (zero to disable)" msgstr "mm (0은 비활성화)" -#: src/libslic3r/PrintConfig.cpp:1531 +#: src/libslic3r/PrintConfig.cpp:1561 msgid "Retraction Length (Toolchange)" msgstr "리트랙션 길이 (툴 체인지)" -#: src/libslic3r/PrintConfig.cpp:1532 +#: src/libslic3r/PrintConfig.cpp:1562 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 " @@ -7350,11 +8616,11 @@ msgstr "" "공구를 교체하기 전에 후퇴가 트리거되면 필라멘트가 지정된 양만큼 뒤로 당겨집니" "다 (길이는 압출기에 들어가기 전에 원시 필라멘트에서 측정됩니다)." -#: src/libslic3r/PrintConfig.cpp:1540 +#: src/libslic3r/PrintConfig.cpp:1570 msgid "Lift Z" msgstr "Z축 올림" -#: src/libslic3r/PrintConfig.cpp:1541 +#: src/libslic3r/PrintConfig.cpp:1571 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 " @@ -7363,15 +8629,15 @@ msgstr "" "이 값을 양수 값으로 설정하면 철회가 트리거 될 때마다 Z가 빠르게 올라갑니다. " "여러 개의 압출기를 사용하는 경우 첫 번째 압출기의 설정 만 고려됩니다." -#: src/libslic3r/PrintConfig.cpp:1548 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Above Z" msgstr "Z 위" -#: src/libslic3r/PrintConfig.cpp:1549 +#: src/libslic3r/PrintConfig.cpp:1579 msgid "Only lift Z above" msgstr "오직 Z축 위로만" -#: src/libslic3r/PrintConfig.cpp:1550 +#: src/libslic3r/PrintConfig.cpp:1580 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 " @@ -7380,15 +8646,15 @@ msgstr "" "이것을 양의 값으로 설정하면, Z 리프트는 지정된 절대 Z 위로만 발생한다. 첫 번" "째 층에서 리프트를 건너뛸 수 있도록 이 설정을 조정할 수 있다." -#: src/libslic3r/PrintConfig.cpp:1557 +#: src/libslic3r/PrintConfig.cpp:1587 msgid "Below Z" msgstr "Z 아래" -#: src/libslic3r/PrintConfig.cpp:1558 +#: src/libslic3r/PrintConfig.cpp:1588 msgid "Only lift Z below" msgstr "Z값 아래만" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1589 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 " @@ -7397,11 +8663,11 @@ msgstr "" "이것을 양수 값으로 설정하면 Z 리프트가 지정된 절대 Z 아래에서만 발생합니다. " "첫 번째 레이어로 리프트를 제한하기 위해이 설정을 조정할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1567 src/libslic3r/PrintConfig.cpp:1575 +#: src/libslic3r/PrintConfig.cpp:1597 src/libslic3r/PrintConfig.cpp:1605 msgid "Extra length on restart" msgstr "재시작시 여분의 길이" -#: src/libslic3r/PrintConfig.cpp:1568 +#: src/libslic3r/PrintConfig.cpp:1598 msgid "" "When the retraction is compensated after the travel move, the extruder will " "push this additional amount of filament. This setting is rarely needed." @@ -7409,7 +8675,7 @@ msgstr "" "이동 후 리트렉셔이 보정되면 익스트루더가 추가 양의 필라멘트를 밀어냅니다. 이 " "설정은 거의 필요하지 않습니다." -#: src/libslic3r/PrintConfig.cpp:1576 +#: src/libslic3r/PrintConfig.cpp:1606 msgid "" "When the retraction is compensated after changing tool, the extruder will " "push this additional amount of filament." @@ -7417,19 +8683,19 @@ msgstr "" "도구를 교환 한 후 리트렉션를 보정하면 익스트루더가 추가 양의 필라멘트를 밀게" "됩니다." -#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1584 +#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:1614 msgid "Retraction Speed" msgstr "리트랙션 속도" -#: src/libslic3r/PrintConfig.cpp:1585 +#: src/libslic3r/PrintConfig.cpp:1615 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "리트랙션 속도 (익스트루더 모터에만 적용됨)." -#: src/libslic3r/PrintConfig.cpp:1591 src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1621 src/libslic3r/PrintConfig.cpp:1622 msgid "Deretraction Speed" msgstr "감속 속도" -#: src/libslic3r/PrintConfig.cpp:1593 +#: src/libslic3r/PrintConfig.cpp:1623 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 " @@ -7438,79 +8704,79 @@ msgstr "" "리트랙션 후 압출기에 필라멘트를 로드하는 속도 (압출기 모터에만 적용됨). 0으" "로 방치하면 리트랙션 속도가 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:1600 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Seam position" msgstr "재봉선 위치" -#: src/libslic3r/PrintConfig.cpp:1602 +#: src/libslic3r/PrintConfig.cpp:1632 msgid "Position of perimeters starting points." msgstr "둘레의 시작점의 위치." -#: src/libslic3r/PrintConfig.cpp:1608 +#: src/libslic3r/PrintConfig.cpp:1638 msgid "Random" msgstr "무작위" -#: src/libslic3r/PrintConfig.cpp:1609 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Nearest" msgstr "가장 가까운" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1640 msgid "Aligned" msgstr "정렬" -#: src/libslic3r/PrintConfig.cpp:1618 +#: src/libslic3r/PrintConfig.cpp:1648 msgid "Direction" msgstr "방향" -#: src/libslic3r/PrintConfig.cpp:1620 +#: src/libslic3r/PrintConfig.cpp:1650 msgid "Preferred direction of the seam" -msgstr "선호하는 심(seam)의 방향" +msgstr "선호하는 재봉선(seam)의 방향" -#: src/libslic3r/PrintConfig.cpp:1621 +#: src/libslic3r/PrintConfig.cpp:1651 msgid "Seam preferred direction" -msgstr "심(Seam) 선호 방향" +msgstr "재봉선(Seam) 선호 방향" -#: src/libslic3r/PrintConfig.cpp:1628 +#: src/libslic3r/PrintConfig.cpp:1658 msgid "Jitter" msgstr "지터(Jitter)" -#: src/libslic3r/PrintConfig.cpp:1630 +#: src/libslic3r/PrintConfig.cpp:1660 msgid "Seam preferred direction jitter" -msgstr "(Seam) 선호 방향 지터(Jitter)" +msgstr "재봉선 선호 방향 지터(Jitter)" -#: src/libslic3r/PrintConfig.cpp:1631 +#: src/libslic3r/PrintConfig.cpp:1661 msgid "Preferred direction of the seam - jitter" msgstr "재봉선 지터의 선호 방향" -#: src/libslic3r/PrintConfig.cpp:1641 +#: src/libslic3r/PrintConfig.cpp:1671 msgid "USB/serial port for printer connection." msgstr "프린터 연결을 위한 USB/시리얼 포트." -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1678 msgid "Serial port speed" msgstr "시리얼 포트 속도" -#: src/libslic3r/PrintConfig.cpp:1649 +#: src/libslic3r/PrintConfig.cpp:1679 msgid "Speed (baud) of USB/serial port for printer connection." msgstr "프린터 연결을 위한 USB/시리얼 포트의 속도(보드)" -#: src/libslic3r/PrintConfig.cpp:1658 +#: src/libslic3r/PrintConfig.cpp:1688 msgid "Distance from object" -msgstr "객체로부터의 거리" +msgstr "객체(object)로부터의 거리" -#: src/libslic3r/PrintConfig.cpp:1659 +#: src/libslic3r/PrintConfig.cpp:1689 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으로 설정한다." +"스커트와 객체(object) 사이의 거리. 스커트를 객체(object)에 부착하고 접착력을 " +"높이기 위해 이를 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:1666 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Skirt height" msgstr "스커트(Skirt) 높이" -#: src/libslic3r/PrintConfig.cpp:1667 +#: src/libslic3r/PrintConfig.cpp:1697 msgid "" "Height of skirt expressed in layers. Set this to a tall value to use skirt " "as a shield against drafts." @@ -7518,15 +8784,15 @@ msgstr "" "스커트의 높이 레이어로 표현된다. 이를 높은 값으로 설정하여 스커트를 드래프트" "에 대한 쉴ㄷ로 활용하십시오." -#: src/libslic3r/PrintConfig.cpp:1674 +#: src/libslic3r/PrintConfig.cpp:1704 msgid "Loops (minimum)" msgstr "루프 (최소)" -#: src/libslic3r/PrintConfig.cpp:1675 +#: src/libslic3r/PrintConfig.cpp:1705 msgid "Skirt Loops" msgstr "스커트 루프" -#: src/libslic3r/PrintConfig.cpp:1676 +#: src/libslic3r/PrintConfig.cpp:1706 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 " @@ -7535,11 +8801,11 @@ msgstr "" "스커트의 루프 수입니다. 최소 압출 길이 옵션을 설정한 경우 여기에 구성된 루프 " "수보다 클 수 있다. 스커트를 완전히 비활성화하려면 이 값을 0으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1684 +#: src/libslic3r/PrintConfig.cpp:1714 msgid "Slow down if layer print time is below" msgstr "레이어 인쇄 시간이 다음과 같은 경우 속도를 낮추십시오" -#: src/libslic3r/PrintConfig.cpp:1685 +#: src/libslic3r/PrintConfig.cpp:1715 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." @@ -7547,11 +8813,11 @@ msgstr "" "층 인쇄 시간이 이 시간보다 낮게 추정될 경우, 인쇄 이동 속도는 이 값으로 지속" "되도록 축소된다." -#: src/libslic3r/PrintConfig.cpp:1695 +#: src/libslic3r/PrintConfig.cpp:1725 msgid "Small perimeters" msgstr "작은 둘레" -#: src/libslic3r/PrintConfig.cpp:1697 +#: src/libslic3r/PrintConfig.cpp:1727 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 " @@ -7561,34 +8827,34 @@ msgstr "" "분율로 표시되는 경우 (예 : 80 %) 위의 속도 설정에서 계산됩니다. 자동으로 0으" "로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1707 +#: src/libslic3r/PrintConfig.cpp:1737 msgid "Solid infill threshold area" -msgstr "솔리드 채우기 임계값 영역" +msgstr "솔리드 채우기 임계값" -#: src/libslic3r/PrintConfig.cpp:1709 +#: src/libslic3r/PrintConfig.cpp:1739 msgid "" "Force solid infill for regions having a smaller area than the specified " "threshold." msgstr "" "지정된 한계값보다 작은 영역을 가진 영역에 대해 솔리드 인필을 강제 적용." -#: src/libslic3r/PrintConfig.cpp:1710 +#: src/libslic3r/PrintConfig.cpp:1740 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:1716 +#: src/libslic3r/PrintConfig.cpp:1746 msgid "Solid infill extruder" msgstr "솔리드 인필 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1718 +#: src/libslic3r/PrintConfig.cpp:1748 msgid "The extruder to use when printing solid infill." msgstr "꽉찬 면을 인쇄할 때 사용하는 익스트루더." -#: src/libslic3r/PrintConfig.cpp:1724 +#: src/libslic3r/PrintConfig.cpp:1754 msgid "Solid infill every" msgstr "솔리드 인필 간격" -#: src/libslic3r/PrintConfig.cpp:1726 +#: src/libslic3r/PrintConfig.cpp:1756 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 " @@ -7599,7 +8865,7 @@ msgstr "" "음. 당신은 이것을 어떤 값으로도 설정할 수 있다(예: 9999). Slic3r는 노즐 직경" "과 층 높이에 따라 결합할 최대 가능한 층 수를 자동으로 선택한다." -#: src/libslic3r/PrintConfig.cpp:1738 +#: src/libslic3r/PrintConfig.cpp:1768 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, " @@ -7610,7 +8876,7 @@ msgstr "" "하십시오. 0인 경우 기본 압출 너비가 사용되며, 그렇지 않으면 1.125 x 노즐 직경" "이 사용된다. 백분율(예: 90%)로 표현되는 경우, 계층 높이에 걸쳐 계산된다." -#: src/libslic3r/PrintConfig.cpp:1748 +#: src/libslic3r/PrintConfig.cpp:1779 msgid "" "Speed for printing solid regions (top/bottom/internal horizontal shells). " "This can be expressed as a percentage (for example: 80%) over the default " @@ -7619,15 +8885,19 @@ msgstr "" "솔리드 영역(상단/하부/내부 수평 셸) 인쇄 속도 이는 위의 기본 주입 속도에 대" "한 백분율(예: 80%)로 표시할 수 있다. 자동을 위해 0으로 설정한다." -#: src/libslic3r/PrintConfig.cpp:1760 +#: src/libslic3r/PrintConfig.cpp:1791 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "상단 및 하단 표면에 생성할 솔리드 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:1766 -msgid "Spiral vase" -msgstr "스파이럴 바이스" +#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:1798 +msgid "Minimum thickness of a top / bottom shell" +msgstr "상부/하부 쉘의 최소 두께" -#: src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1804 +msgid "Spiral vase" +msgstr "꽃병 모드(Spiral vase)" + +#: src/libslic3r/PrintConfig.cpp:1805 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, " @@ -7635,17 +8905,17 @@ msgid "" "any number of bottom solid layers as well as skirt/brim loops. It won't work " "when printing more than an object." msgstr "" -"이 기능은 단일 벽 물체를 인쇄하는 동안 눈에 보이는 심을 제거하기 위해 Z를 점" -"진적으로 상승시킨다. 이 옵션은 단일 둘레, 주입, 상단 솔리드 레이어 및 지지 재" -"료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리드 레이어의 " -"수에 상관없이 설정할 수 있다. 그것은 물체보다 더 많이 인쇄할 때는 작동하지 않" -"을 것이다." +"이 기능은 단일 벽 개체를 인쇄하는 동안 눈에 보이는 재봉선을 제거하기 위해 Z" +"를 점진적으로 상승시킨다. 이 옵션은 단일 둘레, 주입, 상단 솔리드 레이어 및 지" +"지 재료가 필요하지 않다. 당신은 스커트/브림 루프뿐만 아니라 아래 솔리드 레이" +"어의 수에 상관없이 설정할 수 있다. 그것은 개체보다 더 많이 인쇄할 때는 작동하" +"지 않을 것이다." -#: src/libslic3r/PrintConfig.cpp:1775 +#: src/libslic3r/PrintConfig.cpp:1813 msgid "Temperature variation" msgstr "온도 변화" -#: src/libslic3r/PrintConfig.cpp:1776 +#: src/libslic3r/PrintConfig.cpp:1814 msgid "" "Temperature difference to be applied when an extruder is not active. Enables " "a full-height \"sacrificial\" skirt on which the nozzles are periodically " @@ -7654,57 +8924,57 @@ msgstr "" "돌출부가 활성화되지 않은 경우 적용되는 온도 차이. 노즐을 주기적으로 닦는 전" "체 높이 \"인공\" 스커트가 가능하다." -#: src/libslic3r/PrintConfig.cpp:1786 +#: src/libslic3r/PrintConfig.cpp:1824 msgid "" "This start procedure is inserted at the beginning, after bed has reached the " "target temperature and extruder just started heating, and before extruder " -"has finished heating. If Slic3r detects M104 or M190 in your custom codes, " -"such commands will not be prepended automatically so you're free to " +"has finished heating. If PrusaSlicer detects M104 or M190 in your custom " +"codes, such commands will not be prepended automatically so you're free to " "customize the order of heating commands and other custom actions. Note that " -"you can use placeholder variables for all Slic3r settings, so you can put a " -"\"M109 S[first_layer_temperature]\" command wherever you want." +"you can use placeholder variables for all PrusaSlicer settings, so you can " +"put a \"M109 S[first_layer_temperature]\" command wherever you want." msgstr "" -"이 시작 절차는 침대가 목표 온도에 도달하고 압출기가 막 가열을 시작한 직후 및 " -"압출기가 가열을 완료하기 전에 처음에 삽입됩니다. Slic3r이 사용자 지정 코드에" -"서 M104 또는 M190을 감지하면 이러한 명령은 자동으로 추가되지 않으므로 가열 명" -"령 및 기타 사용자 지정 동작의 순서를 자유롭게 사용자 지정할 수 있습니다. 모" -"든 Slic3r 설정에 자리 표시 자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 " -"S [first_layer_temperature]\"명령을 넣을 수 있습니다." +"이 시작 절차는 배드가 목표 온도에 도달하고 압출기가 방금 가열을 시작한 후 압" +"출기가열가 완료되기 전에 처음에 삽입됩니다. PrusaSlicer사용자 지정 코드에서 " +"M104 또는 M190을 감지하는 경우 이러한 명령이 자동으로 준비되지 않으므로 가열 " +"명령 및 기타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모" +"든 PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 " +"\"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:1801 +#: src/libslic3r/PrintConfig.cpp:1839 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 " -"Slic3r detects M104, M109, M140 or M190 in your custom codes, such commands " -"will not be prepended automatically so you're free to customize the order of " -"heating commands and other custom actions. Note that you can use placeholder " -"variables for all Slic3r settings, so you can put a \"M109 " +"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 "" "이 시작 절차는 프린터가 gcode를 시작한 후(그리고 다중 재질 프린터의 경우 이 " "필라멘트에 대한 도구 변경 후) 처음에 삽입됩니다. 특정 필라멘트에 대한 설정을 " -"재정의하는 데 사용됩니다. Slic3r가 사용자 지정 코드에서 M104, M109, M140 또" -"는 M190을 감지하면 이러한 명령이 자동으로 준비되지 않으므로 가열 명령 및 기" -"타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 Slic3r " -"설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 \"M109 " -"S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기가 여러 개 있는 " -"경우 gcode는 압출기 순서로 처리됩니다." +"재정의하는 데 사용됩니다. PrusaSlicer가 사용자 지정 코드에서 M104, M109, " +"M140 또는 M190을 감지하면 이러한 명령이 자동으로 준비되지 않으므로 가열 명령 " +"및 기타 사용자 지정 작업의 순서를 자유롭게 사용자 지정할 수 있습니다. 모든 " +"PrusaSlicer 설정에 자리 표시자 변수를 사용할 수 있으므로 원하는 위치에 " +"\"M109 S[first_layer_temperature]\" 명령을 넣을 수 있습니다. 압출기가 여러 " +"개 있는 경우 gcode는 압출기 순서로 처리됩니다." -#: src/libslic3r/PrintConfig.cpp:1817 +#: src/libslic3r/PrintConfig.cpp:1855 msgid "Single Extruder Multi Material" -msgstr "싱글 익스트루더 멀티메터리얼" +msgstr "싱글 익스트루더 다중메터리얼" -#: src/libslic3r/PrintConfig.cpp:1818 +#: src/libslic3r/PrintConfig.cpp:1856 msgid "The printer multiplexes filaments into a single hot end." -msgstr "프린터는 필라멘트를 하나의 핫 엔드에 멀티플렉싱합니다." +msgstr "프린터는 필라멘트를 하나의 핫 엔드에 다중플렉싱합니다." -#: src/libslic3r/PrintConfig.cpp:1823 +#: src/libslic3r/PrintConfig.cpp:1861 msgid "Prime all printing extruders" msgstr "모든 인쇄 압출기 프라임" -#: src/libslic3r/PrintConfig.cpp:1824 +#: src/libslic3r/PrintConfig.cpp:1862 msgid "" "If enabled, all printing extruders will be primed at the front edge of the " "print bed at the start of the print." @@ -7712,19 +8982,34 @@ msgstr "" "활성화 된 경우, 모든 인쇄 압출기는 인쇄 시작시 프린트 베드의 전면 가장자리에 " "프라이밍 됩니다." -#: src/libslic3r/PrintConfig.cpp:1829 +#: src/libslic3r/PrintConfig.cpp:1867 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "숨겨진 레이어층 없음(실험적)" + +#: src/libslic3r/PrintConfig.cpp:1868 +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:1875 msgid "Generate support material" msgstr "서포트 재료 생성" -#: src/libslic3r/PrintConfig.cpp:1831 +#: src/libslic3r/PrintConfig.cpp:1877 msgid "Enable support material generation." msgstr "서포트 재료를 사용합니다." -#: src/libslic3r/PrintConfig.cpp:1835 +#: src/libslic3r/PrintConfig.cpp:1881 msgid "Auto generated supports" msgstr "자동 생성 지원" -#: src/libslic3r/PrintConfig.cpp:1837 +#: src/libslic3r/PrintConfig.cpp:1883 msgid "" "If checked, supports will be generated automatically based on the overhang " "threshold value. If unchecked, supports will be generated inside the " @@ -7734,29 +9019,29 @@ msgstr "" "인란을 선택 하지 않으면 \"서포트 지원 영역\" 볼륨 내 에서만 지원이 생성 됩니" "다." -#: src/libslic3r/PrintConfig.cpp:1843 +#: src/libslic3r/PrintConfig.cpp:1889 msgid "XY separation between an object and its support" -msgstr "물체와 그 서포트 사이 XY 분리" +msgstr "개체와 그 서포트 사이 XY 분리" -#: src/libslic3r/PrintConfig.cpp:1845 +#: src/libslic3r/PrintConfig.cpp:1891 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 분리. 백분율 (예 : 50 %)로 표시되는 경우 외부 둘" -"레 너비를 기준으로 계산됩니다." +"객체(object)와 그 서포트 사이의 XY 분리. 백분율 (예 : 50 %)로 표시되는 경우 " +"외부 둘레 너비를 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1855 +#: src/libslic3r/PrintConfig.cpp:1901 msgid "Pattern angle" msgstr "채움 각도" -#: src/libslic3r/PrintConfig.cpp:1857 +#: src/libslic3r/PrintConfig.cpp:1903 msgid "" "Use this setting to rotate the support material pattern on the horizontal " "plane." msgstr "이 설정을 사용하여지지 평면 패턴을 수평면으로 회전시킵니다." -#: src/libslic3r/PrintConfig.cpp:1867 src/libslic3r/PrintConfig.cpp:2531 +#: src/libslic3r/PrintConfig.cpp:1913 src/libslic3r/PrintConfig.cpp:2677 msgid "" "Only create support if it lies on a build plate. Don't create support on a " "print." @@ -7764,32 +9049,32 @@ msgstr "" "그것이 빌드 플레이트에있는 경우에만 지원을 작성하십시오. 인쇄물에 대한 지원" "을 작성하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:1873 +#: src/libslic3r/PrintConfig.cpp:1919 msgid "Contact Z distance" msgstr "Z 거리 문의" -#: src/libslic3r/PrintConfig.cpp:1875 +#: src/libslic3r/PrintConfig.cpp:1921 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이 첫 번째 객체 " -"레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." +"개체와 서포트 사이의 수직 거리. 이 값을 0으로 설정하면 Slic3r이 첫 번째 객체" +"(object) 레이어에 브리지 흐름과 속도를 사용하지 못하게됩니다." -#: src/libslic3r/PrintConfig.cpp:1882 +#: src/libslic3r/PrintConfig.cpp:1928 msgid "0 (soluble)" msgstr "0 (수용성)" -#: src/libslic3r/PrintConfig.cpp:1883 +#: src/libslic3r/PrintConfig.cpp:1929 msgid "0.2 (detachable)" msgstr "0.2 (분리 가능)" -#: src/libslic3r/PrintConfig.cpp:1888 +#: src/libslic3r/PrintConfig.cpp:1934 msgid "Enforce support for the first" msgstr "첫 번째 서포트 더 강화" -#: src/libslic3r/PrintConfig.cpp:1890 +#: src/libslic3r/PrintConfig.cpp:1936 msgid "" "Generate support material for the specified number of layers counting from " "bottom, regardless of whether normal support material is enabled or not and " @@ -7798,17 +9083,17 @@ msgid "" msgstr "" "일반적인 서포트 소재의 활성화 여부와, 각도 임계 값에 관계없이 하단에서부터 세" "어 지정된 레이어 수에 대한지지 자료를 생성합니다. 이것은 빌드 플레이트에 매" -"우 얇거나 부족한 풋 프린트를 가진 물체를 더 많이 부착 할 때 유용합니다." +"우 얇거나 부족한 풋 프린트를 가진 개체를 더 많이 부착 할 때 유용합니다." -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:1941 msgid "Enforce support for the first n layers" msgstr "첫 번째 n 개의 레이어에 대한 서포트 강화" -#: src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:1947 msgid "Support material/raft/skirt extruder" msgstr "서포트 재료 / 라프트 / 스커트 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1903 +#: src/libslic3r/PrintConfig.cpp:1949 msgid "" "The extruder to use when printing support material, raft and skirt (1+, 0 to " "use the current extruder to minimize tool changes)." @@ -7816,7 +9101,7 @@ msgstr "" "서포트 재료, 라프트 및 스커트를 인쇄 할 때 사용하는 압출기 (도구 변경을 최소" "화하기 위해 현재 압출기를 사용하려면 1+, 0)." -#: src/libslic3r/PrintConfig.cpp:1912 +#: src/libslic3r/PrintConfig.cpp:1958 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, " @@ -7827,97 +9112,95 @@ msgstr "" "0으로 설정하면 설정된 경우 기본 압출 폭이 사용되고 그렇지 않으면 노즐 지름이 " "사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:1920 +#: src/libslic3r/PrintConfig.cpp:1967 msgid "Interface loops" -msgstr "인터페이스 루프" +msgstr "접점 루프" -#: src/libslic3r/PrintConfig.cpp:1922 +#: src/libslic3r/PrintConfig.cpp:1969 msgid "" "Cover the top contact layer of the supports with loops. Disabled by default." msgstr "지지대의 상단 접촉 층을 루프로 덮으십시오. 기본적으로 사용 안 함." -#: src/libslic3r/PrintConfig.cpp:1927 +#: src/libslic3r/PrintConfig.cpp:1974 msgid "Support material/raft interface extruder" -msgstr "서포트 재료/라프트 인터페이스 익스트루더" +msgstr "서포트 재료/라프트 접점 익스트루더" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:1976 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). 이것은 라프트에도 영향을 미칩니" -"다." +"서포트 재료 접점를 인쇄 할 때 사용할 익스트루더 (도구 변경을 최소화하기 위해 " +"현재 익스트루더를 사용하려면 1+, 0). 이것은 라프트에도 영향을 미칩니다." -#: src/libslic3r/PrintConfig.cpp:1936 +#: src/libslic3r/PrintConfig.cpp:1983 msgid "Interface layers" -msgstr "인터페이스 레이어" +msgstr "접점 레이어" -#: src/libslic3r/PrintConfig.cpp:1938 +#: src/libslic3r/PrintConfig.cpp:1985 msgid "" "Number of interface layers to insert between the object(s) and support " "material." -msgstr "객체와 서포트 재료 사이에 삽입할 인터페이스 레이어 수입니다." +msgstr "객체(object)와 서포트 재료 사이에 삽입할 접점 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:1945 +#: src/libslic3r/PrintConfig.cpp:1992 msgid "Interface pattern spacing" -msgstr "인터페이스 패턴 간격" +msgstr "접점 패턴 간격" -#: src/libslic3r/PrintConfig.cpp:1947 +#: src/libslic3r/PrintConfig.cpp:1994 msgid "Spacing between interface lines. Set zero to get a solid interface." -msgstr "" -"인터페이스 라인 간 간격. 솔리드 인터페이스를 가져오려면 0을 설정하십시오." +msgstr "접점 라인 간 간격. 솔리드 접점를 가져오려면 0을 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:1956 +#: src/libslic3r/PrintConfig.cpp:2003 msgid "" "Speed for printing support material interface layers. If expressed as " "percentage (for example 50%) it will be calculated over support material " "speed." msgstr "" -"서포트 재료 인터페이스 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 " -"재료 속도에 따라 계산된다." +"서포트 재료 접점 레이어 인쇄 속도 백분율(예: 50%)로 표현될 경우 서포트 재료 " +"속도에 따라 계산된다." -#: src/libslic3r/PrintConfig.cpp:1965 +#: src/libslic3r/PrintConfig.cpp:2012 msgid "Pattern" msgstr "패턴" -#: src/libslic3r/PrintConfig.cpp:1967 +#: src/libslic3r/PrintConfig.cpp:2014 msgid "Pattern used to generate support material." msgstr "서포트 재료를 생성하는 데 사용되는 패턴." -#: src/libslic3r/PrintConfig.cpp:1973 +#: src/libslic3r/PrintConfig.cpp:2020 msgid "Rectilinear grid" msgstr "직선 그리드" -#: src/libslic3r/PrintConfig.cpp:1979 +#: src/libslic3r/PrintConfig.cpp:2026 msgid "Pattern spacing" msgstr "패턴 간격" -#: src/libslic3r/PrintConfig.cpp:1981 +#: src/libslic3r/PrintConfig.cpp:2028 msgid "Spacing between support material lines." msgstr "서포트 재료 라인 사이의 간격." -#: src/libslic3r/PrintConfig.cpp:1990 +#: src/libslic3r/PrintConfig.cpp:2037 msgid "Speed for printing support material." msgstr "서포트 재료를 인쇄하는 속도." -#: src/libslic3r/PrintConfig.cpp:1997 +#: src/libslic3r/PrintConfig.cpp:2044 msgid "Synchronize with object layers" -msgstr "객체 레이어와 동기화" +msgstr "객체(object) 레이어와 동기화" -#: src/libslic3r/PrintConfig.cpp:1999 +#: src/libslic3r/PrintConfig.cpp:2046 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:2005 +#: src/libslic3r/PrintConfig.cpp:2052 msgid "Overhang threshold" msgstr "오버행 한계점" -#: src/libslic3r/PrintConfig.cpp:2007 +#: src/libslic3r/PrintConfig.cpp:2054 msgid "" "Support material will not be generated for overhangs whose slope angle (90° " "= vertical) is above the given threshold. In other words, this value " @@ -7929,11 +9212,11 @@ msgstr "" "성되지 않는다. 즉, 이 값은 서포트 재료 없이 인쇄할 수 있는 가장 수평 경사(수" "평면에서 측정됨)를 나타낸다. 자동 감지를 위해 0으로 설정하십시오(권장)." -#: src/libslic3r/PrintConfig.cpp:2019 +#: src/libslic3r/PrintConfig.cpp:2066 msgid "With sheath around the support" msgstr "서포트 주변이나 외부로" -#: src/libslic3r/PrintConfig.cpp:2021 +#: src/libslic3r/PrintConfig.cpp:2068 msgid "" "Add a sheath (a single perimeter line) around the base support. This makes " "the support more reliable, but also more difficult to remove." @@ -7941,7 +9224,7 @@ msgstr "" "기본 서포트 주위에 외장 (단일 주변 선)을 추가하십시오. 이것은 페이스 업을보" "다 신뢰성있게 만들뿐만 아니라 제거하기도 어렵습니다." -#: src/libslic3r/PrintConfig.cpp:2028 +#: src/libslic3r/PrintConfig.cpp:2075 msgid "" "Extruder temperature for layers after the first one. Set this to zero to " "disable temperature control commands in the output." @@ -7949,21 +9232,21 @@ msgstr "" "첫 번째 것 이후에 레이어에 대한 더 낮은 온도. 이 값을 0으로 설정하면 출력에" "서 ​​온도 제어 명령을 비활성화 할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2036 +#: src/libslic3r/PrintConfig.cpp:2083 msgid "Detect thin walls" msgstr "얇은 벽(walls) 감지" -#: src/libslic3r/PrintConfig.cpp:2038 +#: src/libslic3r/PrintConfig.cpp:2085 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:2044 +#: src/libslic3r/PrintConfig.cpp:2091 msgid "Threads" msgstr "스레드(Threads)" -#: src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2092 msgid "" "Threads are used to parallelize long-running tasks. Optimal threads number " "is slightly above the number of available cores/processors." @@ -7971,22 +9254,22 @@ msgstr "" "스레드는 장기 실행 태스크를 병렬 처리하는 데 사용됩니다. 최적의 스레드 수는 " "사용 가능한 코어 / 프로세서 수보다 약간 높습니다." -#: src/libslic3r/PrintConfig.cpp:2057 +#: src/libslic3r/PrintConfig.cpp:2104 msgid "" -"This custom code is inserted at every extruder change. If you don't leave " -"this empty, you are expected to take care of the toolchange yourself - " -"PrusaSlicer will not output any other G-code to change the filament. You can " -"use placeholder variables for all Slic3r settings as well as " -"[previous_extruder] and [next_extruder], so e.g. the standard toolchange " -"command can be scripted as T[next_extruder]." +"This custom code is inserted before every toolchange. Placeholder variables " +"for all PrusaSlicer settings as well as {previous_extruder} and " +"{next_extruder} can be used. When a tool-changing command which changes to " +"the correct extruder is included (such as T{next_extruder}), PrusaSlicer " +"will emit no other such command. It is therefore possible to script custom " +"behaviour both before and after the toolchange." msgstr "" -"이 사용자 지정 코드는 모든 압출기 변경 시 삽입됩니다. 이 것을 비워 두지 않으" -"면 도구 변경을 직접 처리해야합니다 - PrusaSlicer는 필라멘트를 변경하기 위해 " -"다른 G 코드를 출력하지 않습니다. 모든 Slic3r 설정과 [이전_압출기] 및 " -"[next_extruder]에 대해 자리 표시자 변수를 사용할 수 있으므로 표준 도구 변경 " -"명령을 T[next_extruder]로 스크립팅할 수 있습니다." +"이 사용자 지정 코드는 모든 도구 변경 전에 삽입됩니다. 모든 PrusaSlicer 설정" +"과 {previous_extruder} 및 {next_extruder}에 대한 자리 표시자 변수를 사용할 " +"수 있습니다. 올바른 압출기로 변경되는 도구 변경 명령(예: T{next_extruder})이 " +"포함되면 PrusaSlicer는 다른 명령을 내림차순을 내보릅니다. 따라서 도구 변경 전" +"후에 사용자 지정 동작을 스크립팅할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2070 +#: src/libslic3r/PrintConfig.cpp:2117 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 " @@ -8000,7 +9283,7 @@ msgstr "" "으면 노즐 지름이 사용됩니다. 백분율 (예 : 90 %)로 표현하면 레이어 높이를 기준" "으로 계산됩니다." -#: src/libslic3r/PrintConfig.cpp:2081 +#: src/libslic3r/PrintConfig.cpp:2129 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 " @@ -8013,23 +9296,37 @@ msgstr "" "전 속도에 대한 백분율 (예 : 80 %)로 나타낼 수 있습니다. 자동으로 0으로 설정하" "십시오." -#: src/libslic3r/PrintConfig.cpp:2096 +#: src/libslic3r/PrintConfig.cpp:2144 msgid "Number of solid layers to generate on top surfaces." msgstr "상단 표면에 생성 할 솔리드 레이어 수입니다." -#: src/libslic3r/PrintConfig.cpp:2097 +#: src/libslic3r/PrintConfig.cpp:2145 msgid "Top solid layers" msgstr "탑 솔리드 레이어" -#: src/libslic3r/PrintConfig.cpp:2103 +#: src/libslic3r/PrintConfig.cpp:2153 +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:2156 +msgid "Minimum top shell thickness" +msgstr "최소 상단 쉘 두께" + +#: src/libslic3r/PrintConfig.cpp:2163 msgid "Speed for travel moves (jumps between distant extrusion points)." msgstr "이동 속도 (먼 돌출 점 사이의 점프)." -#: src/libslic3r/PrintConfig.cpp:2111 +#: src/libslic3r/PrintConfig.cpp:2171 msgid "Use firmware retraction" msgstr "펌웨어 철회" -#: src/libslic3r/PrintConfig.cpp:2112 +#: src/libslic3r/PrintConfig.cpp:2172 msgid "" "This experimental setting uses G10 and G11 commands to have the firmware " "handle the retraction. This is only supported in recent Marlin." @@ -8037,11 +9334,11 @@ msgstr "" "이 실험 설정은 G10 및 G11 명령을 사용하여 펌웨어에서 취소를 처리하도록합니" "다. 이것은 최근의 말린에서만 지원됩니다." -#: src/libslic3r/PrintConfig.cpp:2118 +#: src/libslic3r/PrintConfig.cpp:2178 msgid "Use relative E distances" msgstr "상대적인 E 거리 사용" -#: src/libslic3r/PrintConfig.cpp:2119 +#: src/libslic3r/PrintConfig.cpp:2179 msgid "" "If your firmware requires relative E values, check this, otherwise leave it " "unchecked. Most firmwares use absolute values." @@ -8049,11 +9346,11 @@ msgstr "" "펌웨어에 상대 E 값이 필요한 경우이 값을 선택하고, 그렇지 않으면 선택하지 마십" "시오. 대부분의 회사는 절대 값을 사용합니다." -#: src/libslic3r/PrintConfig.cpp:2125 +#: src/libslic3r/PrintConfig.cpp:2185 msgid "Use volumetric E" -msgstr "용적 E 사용" +msgstr "용적(volumetric) E 사용" -#: src/libslic3r/PrintConfig.cpp:2126 +#: src/libslic3r/PrintConfig.cpp:2186 msgid "" "This experimental setting uses outputs the E values in cubic millimeters " "instead of linear millimeters. If your firmware doesn't already know " @@ -8068,11 +9365,11 @@ msgstr "" "[filament_diameter_0] T0'과 같은 명령을 입력 할 수 있습니다 Slic3r. 이것은 최" "근의 말린에서만 지원됩니다." -#: src/libslic3r/PrintConfig.cpp:2136 +#: src/libslic3r/PrintConfig.cpp:2196 msgid "Enable variable layer height feature" msgstr "가변 레이어 높이 기능 사용" -#: src/libslic3r/PrintConfig.cpp:2137 +#: src/libslic3r/PrintConfig.cpp:2197 msgid "" "Some printers or printer setups may have difficulties printing with a " "variable layer height. Enabled by default." @@ -8080,11 +9377,11 @@ msgstr "" "일부 프린터 또는 프린터 설정은 가변 레이어 높이로 인쇄하는 데 어려움이있을 " "수 있습니다. 기본적으로 사용됩니다." -#: src/libslic3r/PrintConfig.cpp:2143 +#: src/libslic3r/PrintConfig.cpp:2203 msgid "Wipe while retracting" msgstr "수축시 닦아내십시오" -#: src/libslic3r/PrintConfig.cpp:2144 +#: src/libslic3r/PrintConfig.cpp:2204 msgid "" "This flag will move the nozzle while retracting to minimize the possible " "blob on leaky extruders." @@ -8092,19 +9389,19 @@ msgstr "" "이 플래그는 누출된 리트랙싱의 블럽 가능성을 최소화하기 위해 수축하는 동안 노" "즐을 이동시킨다." -#: src/libslic3r/PrintConfig.cpp:2151 +#: src/libslic3r/PrintConfig.cpp:2211 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:2157 +#: src/libslic3r/PrintConfig.cpp:2217 msgid "Purging volumes - load/unload volumes" msgstr "볼륨 삭제 - 볼륨 로드/언로드" -#: src/libslic3r/PrintConfig.cpp:2158 +#: src/libslic3r/PrintConfig.cpp:2218 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 " @@ -8114,11 +9411,11 @@ msgstr "" "을 저장 합니다. 이러한 값은 아래의 전체 퍼징 볼륨의 생성을 단순화 하는 데 사" "용 됩니다." -#: src/libslic3r/PrintConfig.cpp:2164 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Purging volumes - matrix" msgstr "볼륨 삭제 - 행렬" -#: src/libslic3r/PrintConfig.cpp:2165 +#: src/libslic3r/PrintConfig.cpp:2225 msgid "" "This matrix describes volumes (in cubic milimetres) required to purge the " "new filament on the wipe tower for any given pair of tools." @@ -8126,154 +9423,155 @@ msgstr "" "이 매트릭스는 지정 된 도구 쌍에 대해 와이퍼 타워의 새필라멘트를 제거 하는 데 " "필요한 체적 (입방 밀리 미터)을 설명 합니다." -#: src/libslic3r/PrintConfig.cpp:2174 +#: src/libslic3r/PrintConfig.cpp:2234 msgid "Position X" msgstr "X축 위치" -#: src/libslic3r/PrintConfig.cpp:2175 +#: src/libslic3r/PrintConfig.cpp:2235 msgid "X coordinate of the left front corner of a wipe tower" msgstr "와이프 타워의 좌측 전면 모서리의 X 좌표" -#: src/libslic3r/PrintConfig.cpp:2181 +#: src/libslic3r/PrintConfig.cpp:2241 msgid "Position Y" msgstr "Y축 위치" -#: src/libslic3r/PrintConfig.cpp:2182 +#: src/libslic3r/PrintConfig.cpp:2242 msgid "Y coordinate of the left front corner of a wipe tower" msgstr "와이퍼 작동 타워의 좌측 전방 모서리의 Y 좌표" -#: src/libslic3r/PrintConfig.cpp:2189 +#: src/libslic3r/PrintConfig.cpp:2249 msgid "Width of a wipe tower" msgstr "와이퍼 타워 폭" -#: src/libslic3r/PrintConfig.cpp:2195 +#: src/libslic3r/PrintConfig.cpp:2255 msgid "Wipe tower rotation angle" msgstr "와이퍼 타워 회전각도" -#: src/libslic3r/PrintConfig.cpp:2196 +#: src/libslic3r/PrintConfig.cpp:2256 msgid "Wipe tower rotation angle with respect to x-axis." msgstr "X 축에 대해 타워 회전 각도를 닦습니다." -#: src/libslic3r/PrintConfig.cpp:2203 +#: src/libslic3r/PrintConfig.cpp:2263 msgid "Wipe into this object's infill" -msgstr "이 오브젝트의 채우기로 지우기" +msgstr "이 객체(object)의 채우기로 지우기" -#: src/libslic3r/PrintConfig.cpp:2204 +#: src/libslic3r/PrintConfig.cpp:2264 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 "" -"도구 변경 후 제거는 이 개체의 채우기 내부에서 수행 됩니다. 이렇게 하면 낭비 " -"되는 양이 줄어들지만 추가적인 이동으로 인해 인쇄 시간이 길어질 수 있습니다." +"도구 변경 후 제거는 이 객체(object)의 채우기 내부에서 수행 됩니다. 이렇게 하" +"면 낭비 되는 양이 줄어들지만 추가적인 이동으로 인해 인쇄 시간이 길어질 수 있" +"습니다." -#: src/libslic3r/PrintConfig.cpp:2211 +#: src/libslic3r/PrintConfig.cpp:2271 msgid "Wipe into this object" -msgstr "이 개체로 지우기" +msgstr "이 객체(object)로 지우기" -#: src/libslic3r/PrintConfig.cpp:2212 +#: src/libslic3r/PrintConfig.cpp:2272 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 "" -"객체는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이프 타워" -"에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 개체의 색상이 " -"혼합 됩니다." +"객체(object)는 도구 변경 후 노즐을 소거 하는 데 사용 되며, 그렇지 않으면 와이" +"프 타워에서 종료 되는 재료를 저장 하고 인쇄 시간을 줄입니다. 그 결과 객체" +"(object)의 색상이 혼합 됩니다." -#: src/libslic3r/PrintConfig.cpp:2218 +#: src/libslic3r/PrintConfig.cpp:2278 msgid "Maximal bridging distance" msgstr "최대 브리징 거리" -#: src/libslic3r/PrintConfig.cpp:2219 +#: src/libslic3r/PrintConfig.cpp:2279 msgid "Maximal distance between supports on sparse infill sections." msgstr "드문드문한 인필 섹션에서 지지대 사이의 최대 거리." -#: src/libslic3r/PrintConfig.cpp:2225 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "XY Size Compensation" -msgstr "XY 크기 보정" +msgstr "XY 수평 확장" -#: src/libslic3r/PrintConfig.cpp:2227 +#: src/libslic3r/PrintConfig.cpp:2287 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 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체가 증가/정격된다. 이" -"는 구멍 크기를 미세 조정하는데 유용할 수 있다." +"XY 평면에서 설정된 값(음수 = 안, 양 = 바깥쪽)에 따라 객체(object)가 증가/정격" +"된다. 이는 구멍 크기를 미세 조정하는데 유용할 수 있다." -#: src/libslic3r/PrintConfig.cpp:2235 +#: src/libslic3r/PrintConfig.cpp:2295 msgid "Z offset" msgstr "Z 오프셋" -#: src/libslic3r/PrintConfig.cpp:2236 +#: src/libslic3r/PrintConfig.cpp:2296 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 "" -"이 값은 출력 G-코드의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스" +"이 값은 출력 G-code의 모든 Z 좌표에서 추가(또는 감산)된다. 예를 들어, 엔드 스" "톱 0이 실제로 노즐을 프린트 베드에서 0.3mm 떨어진 곳에 둔 경우, 이를 -0.3(또" "는 엔드 스톱을 고정)으로 설정하십시오." -#: src/libslic3r/PrintConfig.cpp:2294 +#: src/libslic3r/PrintConfig.cpp:2363 msgid "Display width" msgstr "디스플레이 너비" -#: src/libslic3r/PrintConfig.cpp:2295 +#: src/libslic3r/PrintConfig.cpp:2364 msgid "Width of the display" msgstr "디스플레이의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:2300 +#: src/libslic3r/PrintConfig.cpp:2369 msgid "Display height" msgstr "표시 높이" -#: src/libslic3r/PrintConfig.cpp:2301 +#: src/libslic3r/PrintConfig.cpp:2370 msgid "Height of the display" msgstr "디스플레이의 높이" -#: src/libslic3r/PrintConfig.cpp:2306 +#: src/libslic3r/PrintConfig.cpp:2375 msgid "Number of pixels in" msgstr "의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:2308 +#: src/libslic3r/PrintConfig.cpp:2377 msgid "Number of pixels in X" msgstr "X의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:2314 +#: src/libslic3r/PrintConfig.cpp:2383 msgid "Number of pixels in Y" msgstr "Y의 픽셀 수" -#: src/libslic3r/PrintConfig.cpp:2319 +#: src/libslic3r/PrintConfig.cpp:2388 msgid "Display horizontal mirroring" msgstr "수평 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:2320 +#: src/libslic3r/PrintConfig.cpp:2389 msgid "Mirror horizontally" msgstr "수평으로 미러" -#: src/libslic3r/PrintConfig.cpp:2321 +#: src/libslic3r/PrintConfig.cpp:2390 msgid "Enable horizontal mirroring of output images" msgstr "출력 이미지의 수평 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2395 msgid "Display vertical mirroring" msgstr "수직 미러링 표시" -#: src/libslic3r/PrintConfig.cpp:2327 +#: src/libslic3r/PrintConfig.cpp:2396 msgid "Mirror vertically" msgstr "수직으로 미러" -#: src/libslic3r/PrintConfig.cpp:2328 +#: src/libslic3r/PrintConfig.cpp:2397 msgid "Enable vertical mirroring of output images" msgstr "출력 이미지의 수직 미러링 사용" -#: src/libslic3r/PrintConfig.cpp:2333 +#: src/libslic3r/PrintConfig.cpp:2402 msgid "Display orientation" msgstr "디스플레이 방향" -#: src/libslic3r/PrintConfig.cpp:2334 +#: src/libslic3r/PrintConfig.cpp:2403 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 " @@ -8283,72 +9581,72 @@ msgstr "" "레이 너비 및 높이 매개 변수의 의미를 반전 하 고 출력 이미지는 90도 회전 합니" "다." -#: src/libslic3r/PrintConfig.cpp:2340 +#: src/libslic3r/PrintConfig.cpp:2409 msgid "Landscape" msgstr "가로" -#: src/libslic3r/PrintConfig.cpp:2341 +#: src/libslic3r/PrintConfig.cpp:2410 msgid "Portrait" msgstr "세로모드" -#: src/libslic3r/PrintConfig.cpp:2346 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "Fast" msgstr "빠른" -#: src/libslic3r/PrintConfig.cpp:2347 +#: src/libslic3r/PrintConfig.cpp:2416 msgid "Fast tilt" msgstr "빠른 기울기" -#: src/libslic3r/PrintConfig.cpp:2348 +#: src/libslic3r/PrintConfig.cpp:2417 msgid "Time of the fast tilt" msgstr "기울이기 시간" -#: src/libslic3r/PrintConfig.cpp:2355 +#: src/libslic3r/PrintConfig.cpp:2424 msgid "Slow" msgstr "느리게" -#: src/libslic3r/PrintConfig.cpp:2356 +#: src/libslic3r/PrintConfig.cpp:2425 msgid "Slow tilt" -msgstr "슬로우 틸트" +msgstr "천천히 기울이기" -#: src/libslic3r/PrintConfig.cpp:2357 +#: src/libslic3r/PrintConfig.cpp:2426 msgid "Time of the slow tilt" -msgstr "느린 기울기의 시간" +msgstr "천천히 기울이는 속도" -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2433 msgid "Area fill" msgstr "영역 채우기" -#: src/libslic3r/PrintConfig.cpp:2365 +#: src/libslic3r/PrintConfig.cpp:2434 msgid "" "The percentage of the bed area. \n" "If the print area exceeds the specified value, \n" "then a slow tilt will be used, otherwise - a fast tilt" msgstr "" -"침대 영역의 비율입니다. \n" +"배드 영역의 비율입니다. \n" "인쇄 영역이 지정 된 값을 초과 하면 \n" "그런 다음 느린 기울기가 사용 됩니다, 그렇지 않으면-빠른 기울기가 됩니다" -#: src/libslic3r/PrintConfig.cpp:2372 src/libslic3r/PrintConfig.cpp:2373 -#: src/libslic3r/PrintConfig.cpp:2374 +#: src/libslic3r/PrintConfig.cpp:2441 src/libslic3r/PrintConfig.cpp:2442 +#: src/libslic3r/PrintConfig.cpp:2443 msgid "Printer scaling correction" msgstr "프린터 스케일링 보정" -#: src/libslic3r/PrintConfig.cpp:2380 src/libslic3r/PrintConfig.cpp:2381 +#: src/libslic3r/PrintConfig.cpp:2449 src/libslic3r/PrintConfig.cpp:2450 msgid "Printer absolute correction" msgstr "프린터 절대 보정" -#: src/libslic3r/PrintConfig.cpp:2382 +#: src/libslic3r/PrintConfig.cpp:2451 msgid "" "Will inflate or deflate the sliced 2D polygons according to the sign of the " "correction." msgstr "교정 기호에 따라 슬라이스된 2D 폴리곤을 팽창 하거나 수축 합니다." -#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2457 src/libslic3r/PrintConfig.cpp:2458 msgid "Printer gamma correction" msgstr "프린터 감마 보정" -#: src/libslic3r/PrintConfig.cpp:2390 +#: src/libslic3r/PrintConfig.cpp:2459 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 " @@ -8358,89 +9656,133 @@ msgstr "" "중간에 임계값이 임계화 의미입니다. 이 동작은 폴리곤의 구멍을 잃지 않고 안티알" "리아싱을 제거 합니다." -#: src/libslic3r/PrintConfig.cpp:2401 src/libslic3r/PrintConfig.cpp:2402 +#: src/libslic3r/PrintConfig.cpp:2471 src/libslic3r/PrintConfig.cpp:2472 +msgid "SLA material type" +msgstr "SLA 재질 유형" + +#: src/libslic3r/PrintConfig.cpp:2483 src/libslic3r/PrintConfig.cpp:2484 msgid "Initial layer height" msgstr "초기 레이어 높이" -#: src/libslic3r/PrintConfig.cpp:2408 +#: src/libslic3r/PrintConfig.cpp:2490 src/libslic3r/PrintConfig.cpp:2491 +msgid "Bottle volume" +msgstr "병 볼륨" + +#: src/libslic3r/PrintConfig.cpp:2492 +msgid "ml" +msgstr "" + +#: src/libslic3r/PrintConfig.cpp:2497 src/libslic3r/PrintConfig.cpp:2498 +msgid "Bottle weight" +msgstr "병 무게" + +#: src/libslic3r/PrintConfig.cpp:2499 +msgid "kg" +msgstr "kg" + +#: src/libslic3r/PrintConfig.cpp:2506 +msgid "g/ml" +msgstr "g /ml" + +#: src/libslic3r/PrintConfig.cpp:2513 +msgid "money/bottle" +msgstr "가격 /병" + +#: src/libslic3r/PrintConfig.cpp:2518 msgid "Faded layers" msgstr "페이드 레이어" -#: src/libslic3r/PrintConfig.cpp:2409 +#: src/libslic3r/PrintConfig.cpp:2519 msgid "" "Number of the layers needed for the exposure time fade from initial exposure " "time to the exposure time" msgstr "노출 시간에 필요한 레이어 수는 초기 노출 시간에서 노출 시간으로 페이드" -#: src/libslic3r/PrintConfig.cpp:2416 src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2526 src/libslic3r/PrintConfig.cpp:2527 +msgid "Minimum exposure time" +msgstr "최소 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2534 src/libslic3r/PrintConfig.cpp:2535 +msgid "Maximum exposure time" +msgstr "최대 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2542 src/libslic3r/PrintConfig.cpp:2543 msgid "Exposure time" msgstr "노출 시간" -#: src/libslic3r/PrintConfig.cpp:2423 src/libslic3r/PrintConfig.cpp:2424 +#: src/libslic3r/PrintConfig.cpp:2549 src/libslic3r/PrintConfig.cpp:2550 +msgid "Minimum initial exposure time" +msgstr "최소 초기 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2557 src/libslic3r/PrintConfig.cpp:2558 +msgid "Maximum initial exposure time" +msgstr "최대 초기 노출 시간" + +#: src/libslic3r/PrintConfig.cpp:2565 src/libslic3r/PrintConfig.cpp:2566 msgid "Initial exposure time" msgstr "초기 노출 시간" -#: src/libslic3r/PrintConfig.cpp:2430 src/libslic3r/PrintConfig.cpp:2431 +#: src/libslic3r/PrintConfig.cpp:2572 src/libslic3r/PrintConfig.cpp:2573 msgid "Correction for expansion" msgstr "확장 보정" -#: src/libslic3r/PrintConfig.cpp:2437 +#: src/libslic3r/PrintConfig.cpp:2579 msgid "SLA print material notes" msgstr "SLA 인쇄 재료 참고 사항" -#: src/libslic3r/PrintConfig.cpp:2438 +#: src/libslic3r/PrintConfig.cpp:2580 msgid "You can put your notes regarding the SLA print material here." msgstr "여기에서 SLA 인쇄 자료에 대한 메모를 넣을 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2446 src/libslic3r/PrintConfig.cpp:2457 +#: src/libslic3r/PrintConfig.cpp:2592 src/libslic3r/PrintConfig.cpp:2603 msgid "Default SLA material profile" msgstr "기본 SLA 재질 프로 파일" -#: src/libslic3r/PrintConfig.cpp:2468 +#: src/libslic3r/PrintConfig.cpp:2614 msgid "Generate supports" msgstr "지원 생성" -#: src/libslic3r/PrintConfig.cpp:2470 +#: src/libslic3r/PrintConfig.cpp:2616 msgid "Generate supports for the models" msgstr "모델에 대한 지원 생성" -#: src/libslic3r/PrintConfig.cpp:2475 +#: src/libslic3r/PrintConfig.cpp:2621 msgid "Support head front diameter" msgstr "서포트 헤드 전면 지름" -#: src/libslic3r/PrintConfig.cpp:2477 +#: src/libslic3r/PrintConfig.cpp:2623 msgid "Diameter of the pointing side of the head" msgstr "헤드 포인팅 측면 지름" -#: src/libslic3r/PrintConfig.cpp:2484 +#: src/libslic3r/PrintConfig.cpp:2630 msgid "Support head penetration" msgstr "서포트 헤드 관통" -#: src/libslic3r/PrintConfig.cpp:2486 +#: src/libslic3r/PrintConfig.cpp:2632 msgid "How much the pinhead has to penetrate the model surface" msgstr "핀 헤드가 모델 표면에 침투 하는 정도" -#: src/libslic3r/PrintConfig.cpp:2493 +#: src/libslic3r/PrintConfig.cpp:2639 msgid "Support head width" msgstr "서포트 헤드 폭" -#: src/libslic3r/PrintConfig.cpp:2495 +#: src/libslic3r/PrintConfig.cpp:2641 msgid "Width from the back sphere center to the front sphere center" -msgstr "뒤쪽 구 중심에서 앞쪽 구 중심 까지의 폭입니다" +msgstr "뒤쪽 구 중재봉선에서 앞쪽 구 중재봉선 까지의 폭입니다" -#: src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:2649 msgid "Support pillar diameter" msgstr "서포트 기둥 지름" -#: src/libslic3r/PrintConfig.cpp:2505 +#: src/libslic3r/PrintConfig.cpp:2651 msgid "Diameter in mm of the support pillars" msgstr "서포트 기둥의 지름 (mm)" -#: src/libslic3r/PrintConfig.cpp:2513 +#: src/libslic3r/PrintConfig.cpp:2659 msgid "Support pillar connection mode" msgstr "기둥 연결 모드 지원" -#: src/libslic3r/PrintConfig.cpp:2514 +#: src/libslic3r/PrintConfig.cpp:2660 msgid "" "Controls the bridge type between two neighboring pillars. Can be zig-zag, " "cross (double zig-zag) or dynamic which will automatically switch between " @@ -8450,23 +9792,23 @@ msgstr "" "로 처음 두 사이를 전환 하는 지그재그, 크로스 (지그재그 더블 지그재그) 또는 동" "적 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2668 msgid "Zig-Zag" msgstr "지그재그" -#: src/libslic3r/PrintConfig.cpp:2523 +#: src/libslic3r/PrintConfig.cpp:2669 msgid "Cross" msgstr "크로스" -#: src/libslic3r/PrintConfig.cpp:2524 +#: src/libslic3r/PrintConfig.cpp:2670 msgid "Dynamic" msgstr "동적" -#: src/libslic3r/PrintConfig.cpp:2536 +#: src/libslic3r/PrintConfig.cpp:2682 msgid "Pillar widening factor" msgstr "기둥 확장 계수" -#: src/libslic3r/PrintConfig.cpp:2538 +#: src/libslic3r/PrintConfig.cpp:2684 msgid "" "Merging bridges or pillars into another pillars can increase the radius. " "Zero means no increase, one means full increase." @@ -8474,27 +9816,27 @@ msgstr "" "브릿지 또는 기둥을 다른 기둥에 병합 하면 반지름을 늘릴 수 있습니다. 0은 증가 " "없음을 의미 하나는 전체 증가를 의미 합니다." -#: src/libslic3r/PrintConfig.cpp:2547 +#: src/libslic3r/PrintConfig.cpp:2693 msgid "Support base diameter" msgstr "서포트 베이스 지름" -#: src/libslic3r/PrintConfig.cpp:2549 +#: src/libslic3r/PrintConfig.cpp:2695 msgid "Diameter in mm of the pillar base" msgstr "기둥 베이스의 mm 직경" -#: src/libslic3r/PrintConfig.cpp:2557 +#: src/libslic3r/PrintConfig.cpp:2703 msgid "Support base height" msgstr "서포트 기준 높이" -#: src/libslic3r/PrintConfig.cpp:2559 +#: src/libslic3r/PrintConfig.cpp:2705 msgid "The height of the pillar base cone" msgstr "서포트 베이스 원추의 높이" -#: src/libslic3r/PrintConfig.cpp:2566 +#: src/libslic3r/PrintConfig.cpp:2712 msgid "Support base safety distance" msgstr "지지기본 안전 거리" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2715 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 " @@ -8503,78 +9845,78 @@ msgstr "" "모델에서 기둥 베이스의 최소 거리(mm.mm.)는 이 매개변수에 따른 간격이 모델과 " "패드 사이에 삽입되는 제로 고도 모드에서 의미가 있습니다." -#: src/libslic3r/PrintConfig.cpp:2579 +#: src/libslic3r/PrintConfig.cpp:2725 msgid "Critical angle" msgstr "임계 각도" -#: src/libslic3r/PrintConfig.cpp:2581 +#: src/libslic3r/PrintConfig.cpp:2727 msgid "The default angle for connecting support sticks and junctions." msgstr "서포트 스틱과 접합부를 연결 하는 기본 각도입니다." -#: src/libslic3r/PrintConfig.cpp:2589 +#: src/libslic3r/PrintConfig.cpp:2735 msgid "Max bridge length" msgstr "최대 브리지 길이" -#: src/libslic3r/PrintConfig.cpp:2591 +#: src/libslic3r/PrintConfig.cpp:2737 msgid "The max length of a bridge" msgstr "브릿지의 최대 길이" -#: src/libslic3r/PrintConfig.cpp:2598 +#: src/libslic3r/PrintConfig.cpp:2744 msgid "Max pillar linking distance" msgstr "최대 기둥 연결 거리" -#: src/libslic3r/PrintConfig.cpp:2600 +#: src/libslic3r/PrintConfig.cpp:2746 msgid "" "The max distance of two pillars to get linked with each other. A zero value " "will prohibit pillar cascading." msgstr "" "서로 연결 되는 두기둥의 최대 거리. 0 값은 기둥을 계단식으로 금지 합니다." -#: src/libslic3r/PrintConfig.cpp:2608 +#: src/libslic3r/PrintConfig.cpp:2754 msgid "Object elevation" -msgstr "객체 고도" +msgstr "객체(object) 고도" -#: src/libslic3r/PrintConfig.cpp:2610 +#: src/libslic3r/PrintConfig.cpp:2756 msgid "" -"How much the supports should lift up the supported object. If this value is " -"zero, the bottom of the model geometry will be considered as part of the pad." +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." msgstr "" -"지원 대상을 들어 올려야 하는 양입니다. 이 값이 0이면 모델 형상의 맨 아래가 패" -"드의 일부로 간주됩니다." +"지원 대상을 들어 올려야 하는 양입니다. \"개체 주위 패드\"를 사용하도록 설정하" +"면 이 값은 무시됩니다." -#: src/libslic3r/PrintConfig.cpp:2622 +#: src/libslic3r/PrintConfig.cpp:2767 msgid "This is a relative measure of support points density." msgstr "이는 서포트 점 밀도의 상대적인 척도입니다." -#: src/libslic3r/PrintConfig.cpp:2628 +#: src/libslic3r/PrintConfig.cpp:2773 msgid "Minimal distance of the support points" msgstr "서포트 지점의 최소 거리" -#: src/libslic3r/PrintConfig.cpp:2630 +#: src/libslic3r/PrintConfig.cpp:2775 msgid "No support points will be placed closer than this threshold." msgstr "서포트 지점은 이 임계값 보다 더 가깝게 배치 되지 않습니다." -#: src/libslic3r/PrintConfig.cpp:2636 +#: src/libslic3r/PrintConfig.cpp:2781 msgid "Use pad" msgstr "패드 사용" -#: src/libslic3r/PrintConfig.cpp:2638 +#: src/libslic3r/PrintConfig.cpp:2783 msgid "Add a pad underneath the supported model" msgstr "서포트 되는 모델 아래에 패드 추가" -#: src/libslic3r/PrintConfig.cpp:2643 +#: src/libslic3r/PrintConfig.cpp:2788 msgid "Pad wall thickness" msgstr "패드 벽 두께" -#: src/libslic3r/PrintConfig.cpp:2645 +#: src/libslic3r/PrintConfig.cpp:2790 msgid "The thickness of the pad and its optional cavity walls." msgstr "패드의 두께와 옵션 캐비티 벽." -#: src/libslic3r/PrintConfig.cpp:2653 +#: src/libslic3r/PrintConfig.cpp:2798 msgid "Pad wall height" msgstr "패드 벽 높이" -#: src/libslic3r/PrintConfig.cpp:2654 +#: src/libslic3r/PrintConfig.cpp:2799 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 " @@ -8585,228 +9927,278 @@ msgstr "" "이 기능을 활성화 할 때 주의 해야할, 일부 수 캐비티 내부 극단적인 흡입 효과를 " "생성 할 수도 있기 때문에, vat 호일 인쇄를 벗겨 어렵게 만든다." -#: src/libslic3r/PrintConfig.cpp:2667 +#: src/libslic3r/PrintConfig.cpp:2812 +msgid "Pad brim size" +msgstr "패드 브럼 사이즈" + +#: src/libslic3r/PrintConfig.cpp:2813 +msgid "How far should the pad extend around the contained geometry" +msgstr "패드가 포함된 형상 주위로 얼마나 확장되어야 하는지" + +#: src/libslic3r/PrintConfig.cpp:2823 msgid "Max merge distance" msgstr "최대 병합 거리" -#: src/libslic3r/PrintConfig.cpp:2669 +#: src/libslic3r/PrintConfig.cpp:2825 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 "" -"일부 개체는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. 이 매개 " -"변수는 두 개의 작은 패드의 중심이 얼마나 되어야 하는지 정의 합니다. 그들은 하" -"나의 패드에 병합을 얻을 것이다." +"일부 객체(object)는 큰 하나 대신 몇 가지 작은 패드와 함께 얻을 수 있습니다. " +"이 매개 변수는 두 개의 작은 패드의 중재봉선이 얼마나 되어야 하는지 정의 합니" +"다. 그들은 하나의 패드에 병합을 얻을 것이다." -#: src/libslic3r/PrintConfig.cpp:2680 -msgid "Pad edge radius" -msgstr "패드 가장자리 반경" - -#: src/libslic3r/PrintConfig.cpp:2689 +#: src/libslic3r/PrintConfig.cpp:2845 msgid "Pad wall slope" msgstr "패드 벽 경사" -#: src/libslic3r/PrintConfig.cpp:2691 +#: src/libslic3r/PrintConfig.cpp:2847 msgid "" "The slope of the pad wall relative to the bed plane. 90 degrees means " "straight walls." msgstr "" -"침대 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니" +"배드 평면을 기준으로 하는 패드 벽의 기울기입니다. 90도는 직선 벽을 의미 합니" "다." -#: src/libslic3r/PrintConfig.cpp:2700 -msgid "Pad object gap" -msgstr "패드 오브젝트 갭" +#: src/libslic3r/PrintConfig.cpp:2856 +msgid "Pad around object" +msgstr "개체 주위패드" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2858 +msgid "Create pad around object and ignore the support elevation" +msgstr "오브젝트 주위에 패드를 작성하고 지지 고도를 무시합니다." + +#: src/libslic3r/PrintConfig.cpp:2863 +msgid "Pad around object everywhere" +msgstr "어디서나 개체 주위에 패드" + +#: src/libslic3r/PrintConfig.cpp:2865 +msgid "Force pad around object everywhere" +msgstr "사방 오브젝트 주위의 포스 패드" + +#: src/libslic3r/PrintConfig.cpp:2870 +msgid "Pad object gap" +msgstr "패드 객체(object) 갭" + +#: src/libslic3r/PrintConfig.cpp:2872 msgid "" "The gap between the object bottom and the generated pad in zero elevation " "mode." -msgstr "0 고도 모드에서 오브젝트 바닥과 생성된 패드 사이의 간격입니다." +msgstr "0 고도 모드에서 객체(object) 바닥과 생성된 패드 사이의 간격입니다." -#: src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2881 msgid "Pad object connector stride" -msgstr "패드 오브젝트 커넥터 보폭" +msgstr "패드 객체(object) 커넥터 보폭" -#: src/libslic3r/PrintConfig.cpp:2713 +#: src/libslic3r/PrintConfig.cpp:2883 msgid "" -"Distance between two connector sticks between the object pad and the " +"Distance between two connector sticks which connect the object and the " "generated pad." -msgstr "오브젝트 패드와 생성된 패드 사이의 두 커넥터 스틱 사이의 거리입니다." +msgstr "오브젝트와 생성된 패드를 연결하는 두 커넥터 스틱 사이의 거리입니다." -#: src/libslic3r/PrintConfig.cpp:2721 +#: src/libslic3r/PrintConfig.cpp:2890 msgid "Pad object connector width" -msgstr "패드 오브젝트 커넥터 너비" +msgstr "패드 객체(object) 커넥터 너비" -#: src/libslic3r/PrintConfig.cpp:2723 +#: src/libslic3r/PrintConfig.cpp:2892 msgid "" -"The width of the connectors sticks which connect the object pad and the " -"generated pad." -msgstr "커넥터의 너비는 오브젝트 패드와 생성된 패드를 연결하는 스틱입니다." +"Width of the connector sticks which connect the object and the generated pad." +msgstr "개체와 생성된 패드를 연결하는 커넥터 스틱의 너비입니다." -#: src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:2899 msgid "Pad object connector penetration" -msgstr "패드 오브젝트 커넥터 침투" +msgstr "패드 객체(object) 커넥터 침투" -#: src/libslic3r/PrintConfig.cpp:2734 +#: src/libslic3r/PrintConfig.cpp:2902 msgid "How much should the tiny connectors penetrate into the model body." msgstr "작은 커넥터가 모델 본체에 얼마나 침투해야 하는가?" -#: src/libslic3r/PrintConfig.cpp:3094 +#: src/libslic3r/PrintConfig.cpp:2909 +msgid "Enable hollowing" +msgstr "속빈 공동 사용" + +#: src/libslic3r/PrintConfig.cpp:2911 +msgid "Hollow out a model to have an empty interior" +msgstr "빈 내부를 가지고 모델을 비우기" + +#: src/libslic3r/PrintConfig.cpp:2916 +msgid "Hollowing thickness" +msgstr "속빈 공동 두께" + +#: src/libslic3r/PrintConfig.cpp:2918 +msgid "Minimum wall thickness of a hollowed model." +msgstr "속이 빈 모델의 최소 벽 두께입니다." + +#: src/libslic3r/PrintConfig.cpp:2926 +msgid "Hollowing accuracy" +msgstr "속빈 공동 정확도" + +#: src/libslic3r/PrintConfig.cpp:2928 +msgid "" +"Performance vs accuracy of calculation. Lower values may produce unwanted " +"artifacts." +msgstr "" +"성능 계산의 정확성. 값이 낮을수록 원치 않는 아티팩트가 생성될 수 있습니다." + +#: src/libslic3r/PrintConfig.cpp:2935 +msgid "Hollowing closing distance" +msgstr "속비움된 닫힘 반경" + +#: src/libslic3r/PrintConfig.cpp:3315 msgid "Export OBJ" msgstr "OBJ 내보내기" -#: src/libslic3r/PrintConfig.cpp:3095 +#: src/libslic3r/PrintConfig.cpp:3316 msgid "Export the model(s) as OBJ." msgstr "모델을 OBJ로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3106 +#: src/libslic3r/PrintConfig.cpp:3327 msgid "Export SLA" msgstr "STL로 내보내기" -#: src/libslic3r/PrintConfig.cpp:3107 +#: src/libslic3r/PrintConfig.cpp:3328 msgid "Slice the model and export SLA printing layers as PNG." msgstr "모델을 분할하고 SLA 인쇄 레이어를 PNG로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3112 +#: src/libslic3r/PrintConfig.cpp:3333 msgid "Export 3MF" msgstr "3MF 내보내기" -#: src/libslic3r/PrintConfig.cpp:3113 +#: src/libslic3r/PrintConfig.cpp:3334 msgid "Export the model(s) as 3MF." msgstr "모델을 3MF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3117 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Export AMF" msgstr "AMF 내보내기" -#: src/libslic3r/PrintConfig.cpp:3118 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "Export the model(s) as AMF." msgstr "모델을 AMF로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3122 +#: src/libslic3r/PrintConfig.cpp:3343 msgid "Export STL" msgstr "STL 내보내기" -#: src/libslic3r/PrintConfig.cpp:3123 +#: src/libslic3r/PrintConfig.cpp:3344 msgid "Export the model(s) as STL." msgstr "모델을 STL로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3128 +#: src/libslic3r/PrintConfig.cpp:3349 msgid "Slice the model and export toolpaths as G-code." msgstr "모델을 슬라이스하고 공구 경로를 G 코드로 내보냅니다." -#: src/libslic3r/PrintConfig.cpp:3133 +#: src/libslic3r/PrintConfig.cpp:3354 msgid "Slice" msgstr "슬라이스" -#: src/libslic3r/PrintConfig.cpp:3134 +#: src/libslic3r/PrintConfig.cpp:3355 msgid "" "Slice the model as FFF or SLA based on the printer_technology configuration " "value." msgstr "" " printer_technology 구성 값을 기반으로 모델을 FFF 또는 SLA로 슬라이스합니다." -#: src/libslic3r/PrintConfig.cpp:3139 +#: src/libslic3r/PrintConfig.cpp:3360 msgid "Help" msgstr "도움말" -#: src/libslic3r/PrintConfig.cpp:3140 +#: src/libslic3r/PrintConfig.cpp:3361 msgid "Show this help." msgstr "이 도움말을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:3145 +#: src/libslic3r/PrintConfig.cpp:3366 msgid "Help (FFF options)" msgstr "도움말 (FFF 옵션)" -#: src/libslic3r/PrintConfig.cpp:3146 +#: src/libslic3r/PrintConfig.cpp:3367 msgid "Show the full list of print/G-code configuration options." msgstr "인쇄/G 코드 구성 옵션의 전체 목록을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:3150 +#: src/libslic3r/PrintConfig.cpp:3371 msgid "Help (SLA options)" msgstr "도움말 (SLA 옵션)" -#: src/libslic3r/PrintConfig.cpp:3151 +#: src/libslic3r/PrintConfig.cpp:3372 msgid "Show the full list of SLA print configuration options." msgstr "SLA 인쇄 구성 옵션의 전체 목록을 표시 합니다." -#: src/libslic3r/PrintConfig.cpp:3155 +#: src/libslic3r/PrintConfig.cpp:3376 msgid "Output Model Info" msgstr "출력 모델 정보" -#: src/libslic3r/PrintConfig.cpp:3156 +#: src/libslic3r/PrintConfig.cpp:3377 msgid "Write information about the model to the console." msgstr "모델에 대한 정보를 콘솔에 씁니다." -#: src/libslic3r/PrintConfig.cpp:3160 +#: src/libslic3r/PrintConfig.cpp:3381 msgid "Save config file" msgstr "구성 파일 저장" -#: src/libslic3r/PrintConfig.cpp:3161 +#: src/libslic3r/PrintConfig.cpp:3382 msgid "Save configuration to the specified file." msgstr "지정 된 파일에 구성을 저장 합니다." -#: src/libslic3r/PrintConfig.cpp:3171 +#: src/libslic3r/PrintConfig.cpp:3392 msgid "Align XY" msgstr "XY 정렬" -#: src/libslic3r/PrintConfig.cpp:3172 +#: src/libslic3r/PrintConfig.cpp:3393 msgid "Align the model to the given point." msgstr "모델을 지정된 점에 맞춥니다." -#: src/libslic3r/PrintConfig.cpp:3177 +#: src/libslic3r/PrintConfig.cpp:3398 msgid "Cut model at the given Z." msgstr "지정된 Z에서 모델을 잘라냅니다." -#: src/libslic3r/PrintConfig.cpp:3198 +#: src/libslic3r/PrintConfig.cpp:3419 msgid "Center" msgstr "중앙" -#: src/libslic3r/PrintConfig.cpp:3199 +#: src/libslic3r/PrintConfig.cpp:3420 msgid "Center the print around the given center." -msgstr "지정된 점을 중심으로 인쇄 합니다." +msgstr "지정된 점을 중재봉선으로 인쇄 합니다." -#: src/libslic3r/PrintConfig.cpp:3203 +#: src/libslic3r/PrintConfig.cpp:3424 msgid "Don't arrange" msgstr "준비하지 마십시오" -#: src/libslic3r/PrintConfig.cpp:3204 +#: src/libslic3r/PrintConfig.cpp:3425 msgid "" "Do not rearrange the given models before merging and keep their original XY " "coordinates." msgstr "" "병합하기 전에 지정된 모델을 재정렬하고 원래 XY 좌표를 유지하지 마십시오." -#: src/libslic3r/PrintConfig.cpp:3207 +#: src/libslic3r/PrintConfig.cpp:3428 msgid "Duplicate" msgstr "복사" -#: src/libslic3r/PrintConfig.cpp:3208 +#: src/libslic3r/PrintConfig.cpp:3429 msgid "Multiply copies by this factor." msgstr "이 계수로 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:3212 +#: src/libslic3r/PrintConfig.cpp:3433 msgid "Duplicate by grid" msgstr "모눈에 따라 복제" -#: src/libslic3r/PrintConfig.cpp:3213 +#: src/libslic3r/PrintConfig.cpp:3434 msgid "Multiply copies by creating a grid." msgstr "그리드를 만들어 복사본을 곱합니다." -#: src/libslic3r/PrintConfig.cpp:3216 +#: src/libslic3r/PrintConfig.cpp:3437 msgid "Merge" msgstr "병합" -#: src/libslic3r/PrintConfig.cpp:3217 +#: src/libslic3r/PrintConfig.cpp:3438 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:3222 +#: src/libslic3r/PrintConfig.cpp:3443 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)." @@ -8814,58 +10206,59 @@ msgstr "" "메쉬를 복구 하십시오 (요청 된 작업을 수행 하기 위해 모델을 슬라이스 해야 할때" "마다 이 옵션이 암시적으로 추가 됨)." -#: src/libslic3r/PrintConfig.cpp:3226 +#: src/libslic3r/PrintConfig.cpp:3447 msgid "Rotation angle around the Z axis in degrees." msgstr "Z 축 주위 회전 각도입니다." -#: src/libslic3r/PrintConfig.cpp:3230 +#: src/libslic3r/PrintConfig.cpp:3451 msgid "Rotate around X" msgstr "X 주위 회전" -#: src/libslic3r/PrintConfig.cpp:3231 +#: src/libslic3r/PrintConfig.cpp:3452 msgid "Rotation angle around the X axis in degrees." -msgstr "X 축을 중심 회전 각도 입니다." +msgstr "X 축을 중재봉선 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:3235 +#: src/libslic3r/PrintConfig.cpp:3456 msgid "Rotate around Y" msgstr "Y 주위로 회전" -#: src/libslic3r/PrintConfig.cpp:3236 +#: src/libslic3r/PrintConfig.cpp:3457 msgid "Rotation angle around the Y axis in degrees." -msgstr "Y 축을 중심 회전 각도 입니다." +msgstr "Y 축을 중재봉선 회전 각도 입니다." -#: src/libslic3r/PrintConfig.cpp:3241 +#: src/libslic3r/PrintConfig.cpp:3462 msgid "Scaling factor or percentage." msgstr "배율 인수 또는 백분율입니다." -#: src/libslic3r/PrintConfig.cpp:3246 +#: src/libslic3r/PrintConfig.cpp:3467 msgid "" "Detect unconnected parts in the given model(s) and split them into separate " "objects." msgstr "" -"지정 된 모델에서 연결 되지 않은 부품을 감지 하여 별도의 객체로 분할 합니다." +"지정 된 모델에서 연결 되지 않은 부품(Part)을 감지 하여 별도의 객체(object)로 " +"분할 합니다." -#: src/libslic3r/PrintConfig.cpp:3249 +#: src/libslic3r/PrintConfig.cpp:3470 msgid "Scale to Fit" msgstr "크기에 맞게 조정" -#: src/libslic3r/PrintConfig.cpp:3250 +#: src/libslic3r/PrintConfig.cpp:3471 msgid "Scale to fit the given volume." msgstr "지정 된 볼륨에 맞게 크기를 조정 합니다." -#: src/libslic3r/PrintConfig.cpp:3259 +#: src/libslic3r/PrintConfig.cpp:3480 msgid "Ignore non-existent config files" msgstr "존재 하지 않는 구성 파일 무시" -#: src/libslic3r/PrintConfig.cpp:3260 +#: src/libslic3r/PrintConfig.cpp:3481 msgid "Do not fail if a file supplied to --load does not exist." msgstr "로드에 제공 된 파일이 없는 경우 실패 하지 않습니다." -#: src/libslic3r/PrintConfig.cpp:3263 +#: src/libslic3r/PrintConfig.cpp:3484 msgid "Load config file" msgstr "구성 파일 로드" -#: src/libslic3r/PrintConfig.cpp:3264 +#: src/libslic3r/PrintConfig.cpp:3485 msgid "" "Load configuration from the specified file. It can be used more than once to " "load options from multiple files." @@ -8873,22 +10266,22 @@ msgstr "" "지정 된 파일에서 구성을 로드 합니다. 여러 파일에서 옵션을 로드 하는 데 두 번 " "이상 사용할 수 있습니다." -#: src/libslic3r/PrintConfig.cpp:3267 +#: src/libslic3r/PrintConfig.cpp:3488 msgid "Output File" -msgstr "출력 파일" +msgstr "출력파일" -#: src/libslic3r/PrintConfig.cpp:3268 +#: src/libslic3r/PrintConfig.cpp:3489 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:3278 +#: src/libslic3r/PrintConfig.cpp:3499 msgid "Data directory" msgstr "데이터 디렉터리" -#: src/libslic3r/PrintConfig.cpp:3279 +#: src/libslic3r/PrintConfig.cpp:3500 msgid "" "Load and store settings at the given directory. This is useful for " "maintaining different profiles or including configurations from a network " @@ -8897,23 +10290,25 @@ msgstr "" "지정 된 디렉터리에 설정을 로드 하 고 저장 합니다. 이 기능은 다른 프로 파일을 " "유지 관리 하거나 네트워크 스토리지의 구성을 포함 하는 데 유용 합니다." -#: src/libslic3r/PrintConfig.cpp:3282 +#: src/libslic3r/PrintConfig.cpp:3503 msgid "Logging level" msgstr "로깅 수준" -#: src/libslic3r/PrintConfig.cpp:3283 +#: src/libslic3r/PrintConfig.cpp:3504 msgid "" -"Messages with severity lower or eqal to the loglevel will be printed out. 0:" -"trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal" +"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:" +"trace\n" +"For example. loglevel=2 logs fatal, error and warning level messages." msgstr "" -"로그 수준에 대한 심각도가 낮거나 eqal인 메시지가 인쇄됩니다. 0:추적, 1:디버" -"그, 2:정보, 3:경고, 4:오류, 5:치명적" +"로깅 민감도를 설정합니다. 0:치명적, 1:오류, 2:경고, 3:info, 4:디버그, 5:" +"trace\n" +"예를 들어. loglevel=2 치명적인, 오류 및 경고 수준 메시지를 기록합니다." -#: src/libslic3r/PrintConfig.cpp:3288 +#: src/libslic3r/PrintConfig.cpp:3510 msgid "Render with a software renderer" msgstr "소프트웨어 렌더러를 사용 하 여 렌더링" -#: src/libslic3r/PrintConfig.cpp:3289 +#: src/libslic3r/PrintConfig.cpp:3511 msgid "" "Render with a software renderer. The bundled MESA software renderer is " "loaded instead of the default OpenGL driver." @@ -8921,57 +10316,38 @@ msgstr "" "소프트웨어 렌더러를 사용 하여 렌더링 합니다. 번들 메사 소프트웨어 렌더러는 기" "본 OpenGL 드라이버 대신 로드 됩니다." -#: src/libslic3r/PrintObject.cpp:110 +#: src/libslic3r/PrintObject.cpp:108 msgid "Processing triangulated mesh" -msgstr "삼각 측정 메시 처리" +msgstr "삼각 측정 메쉬 처리" -#: src/libslic3r/PrintObject.cpp:141 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "둘레 생성" -#: src/libslic3r/PrintObject.cpp:251 +#: src/libslic3r/PrintObject.cpp:255 msgid "Preparing infill" msgstr "채우기 준비" -#: src/libslic3r/PrintObject.cpp:391 +#: src/libslic3r/PrintObject.cpp:395 msgid "Generating support material" msgstr "지원할 서포트 생성" -#: src/libslic3r/GCode/PreviewData.cpp:176 -msgid "Mixed" -msgstr "혼합" - -#: src/libslic3r/GCode/PreviewData.cpp:396 +#: src/libslic3r/GCode/PreviewData.cpp:347 msgid "Height (mm)" msgstr "높이 (mm)" -#: src/libslic3r/GCode/PreviewData.cpp:398 +#: src/libslic3r/GCode/PreviewData.cpp:349 msgid "Width (mm)" msgstr "폭 (mm)" -#: src/libslic3r/GCode/PreviewData.cpp:400 +#: src/libslic3r/GCode/PreviewData.cpp:351 msgid "Speed (mm/s)" msgstr "속도 (mm/s)" -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "용적 유량값 (mm3/s)" +#: src/libslic3r/GCode/PreviewData.cpp:353 +msgid "Fan Speed (%)" +msgstr "팬 속도(%)" -#: src/libslic3r/GCode/PreviewData.cpp:493 -msgid "Default print color" -msgstr "기본 인쇄 색상" - -#: src/libslic3r/GCode/PreviewData.cpp:500 -#, c-format -msgid "up to %.2f mm" -msgstr "최대%.2f mm" - -#: src/libslic3r/GCode/PreviewData.cpp:504 -#, c-format -msgid "above %.2f mm" -msgstr "above %.2f mm" - -#: src/libslic3r/GCode/PreviewData.cpp:509 -#, c-format -msgid "%.2f - %.2f mm" -msgstr "%.2f - %.2f mm" \ No newline at end of file +#: src/libslic3r/GCode/PreviewData.cpp:355 +msgid "Volumetric flow rate (mm³/s)" +msgstr "체적 유량(mm³/s)" diff --git a/resources/localization/list.txt b/resources/localization/list.txt index aa2f938b7e..64d50591a7 100644 --- a/resources/localization/list.txt +++ b/resources/localization/list.txt @@ -4,55 +4,88 @@ src/slic3r/GUI/BedShapeDialog.cpp src/slic3r/GUI/BedShapeDialog.hpp src/slic3r/GUI/BonjourDialog.cpp src/slic3r/GUI/ButtonsDescription.cpp +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/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 +src/slic3r/Utils/AstroBox.cpp src/slic3r/Utils/Duet.cpp -src/slic3r/Utils/OctoPrint.cpp -src/slic3r/Utils/FlashAir.cpp -src/slic3r/Utils/PresetUpdater.cpp src/slic3r/Utils/FixModelByWin10.cpp -src/libslic3r/Zipper.cpp -src/libslic3r/SLA/SLASupportTree.cpp +src/slic3r/Utils/FlashAir.cpp +src/slic3r/Utils/OctoPrint.cpp +src/slic3r/Utils/PresetUpdater.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 new file mode 100644 index 0000000000..6c68f3922b Binary files /dev/null and b/resources/localization/nl/PrusaSlicer.mo differ diff --git a/resources/localization/nl/PrusaSlicer_nl.po b/resources/localization/nl/PrusaSlicer_nl.po new file mode 100644 index 0000000000..d0f065e527 --- /dev/null +++ b/resources/localization/nl/PrusaSlicer_nl.po @@ -0,0 +1,10768 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +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" +"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 \n" +"Language: nl\n" + +#: src/slic3r/GUI/AboutDialog.cpp:41 src/slic3r/GUI/AboutDialog.cpp:294 +msgid "Portions copyright" +msgstr "Gedeeltelijk auteursrecht" + +#: src/slic3r/GUI/AboutDialog.cpp:129 src/slic3r/GUI/AboutDialog.cpp:258 +msgid "Copyright" +msgstr "Auteursrecht" + +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:131 +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" + +#: src/slic3r/GUI/AboutDialog.cpp:201 +#, c-format +msgid "About %s" +msgstr "Over %s" + +#: src/slic3r/GUI/AboutDialog.cpp:233 src/slic3r/GUI/MainFrame.cpp:65 +msgid "Version" +msgstr "Versie" + +#. TRN "Slic3r _is licensed under the_ License" +#: src/slic3r/GUI/AboutDialog.cpp:260 +msgid "is licensed under the" +msgstr "is gelicenseerd onder de" + +#: src/slic3r/GUI/AboutDialog.cpp:261 +msgid "GNU Affero General Public License, version 3" +msgstr "GNU Affero General Public License, versie 3" + +#: src/slic3r/GUI/AboutDialog.cpp:262 +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 " +"community." + +#: src/slic3r/GUI/AboutDialog.cpp:263 +msgid "" +"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, " +"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and " +"numerous others." +msgstr "" +"Bijdragen van Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr " +"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik, Simon " +"Tillema en vele anderen." + +#: src/slic3r/GUI/AppConfig.cpp:114 +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 configuratiebestand. Het is waarschijnlijk beschadigd. Probeer " +"de fout handmatig te verwijderen om het te herstellen. Dit heeft geen effect " +"op uw gebruikersprofielen." + +#: 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 "" +"Kopiëren van de tijdelijke G-code naar de output is mislukt. Is de SD-kaart " +"geblokkeerd?" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112 +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." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115 +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." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118 +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." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121 +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." + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478 +msgid "Running post-processing scripts" +msgstr "Uitvoeren van nabewerkingsscripts" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:130 +msgid "G-code file exported to %1%" +msgstr "gcode-bestand geëxporteerd naar %1%" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184 +msgid "Slicing complete" +msgstr "Slicen compleet" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180 +msgid "Masked SLA file exported to %1%" +msgstr "Verborgen 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 +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" + +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505 +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" + +#: 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 +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 +msgid "Origin" +msgstr "Nulpunt" + +#: src/slic3r/GUI/BedShapeDialog.cpp:85 +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 +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 +msgid "" +"Diameter of the print bed. It is assumed that origin (0,0) is located in the " +"center." +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 +msgid "Custom" +msgstr "Custom" + +#: src/slic3r/GUI/BedShapeDialog.cpp:102 +msgid "Load shape from STL..." +msgstr "Laad vorm van STL-bestand..." + +#: src/slic3r/GUI/BedShapeDialog.cpp:155 +msgid "Settings" +msgstr "Instellingen" + +#: src/slic3r/GUI/BedShapeDialog.cpp:172 +msgid "Texture" +msgstr "Textuur" + +#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261 +msgid "Load..." +msgstr "Laad..." + +#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 +#: src/slic3r/GUI/Tab.cpp:3144 +msgid "Remove" +msgstr "Verwijder" + +#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302 +msgid "Not found:" +msgstr "Niet gevonden:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:251 +msgid "Model" +msgstr "Model" + +#: src/slic3r/GUI/BedShapeDialog.cpp:487 +msgid "Choose an STL file to import bed shape from:" +msgstr "Kies een STL-bestand om te importeren als vorm van het bed:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:566 +msgid "Invalid file format." +msgstr "Ongeldig bestandsformaat." + +#: src/slic3r/GUI/BedShapeDialog.cpp:505 +msgid "Error! Invalid model" +msgstr "Fout! Ongeldig model" + +#: src/slic3r/GUI/BedShapeDialog.cpp:513 +msgid "The selected file contains no geometry." +msgstr "Het geselecteerde bestand bevat geen geometrie." + +#: src/slic3r/GUI/BedShapeDialog.cpp:517 +msgid "" +"The selected file contains several disjoint areas. This is not supported." +msgstr "" +"Het geselecteerde bestand bevat niet-verbonden delen. Dit wordt niet " +"ondersteund." + +#: src/slic3r/GUI/BedShapeDialog.cpp:532 +msgid "Choose a file to import bed texture from (PNG/SVG):" +msgstr "Kies een PNG- of SVG-bestand als textuur voor het bed:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:555 +msgid "Choose an STL file to import bed model from:" +msgstr "Kies een STL-bestand als vorm voor het bed:" + +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:944 +msgid "Bed Shape" +msgstr "Vorm van het bed" + +#: src/slic3r/GUI/BonjourDialog.cpp:55 +msgid "Network lookup" +msgstr "Zoeken naar netwerk" + +#: src/slic3r/GUI/BonjourDialog.cpp:72 +msgid "Address" +msgstr "Adres" + +#: src/slic3r/GUI/BonjourDialog.cpp:73 +msgid "Hostname" +msgstr "Hostnaam" + +#: src/slic3r/GUI/BonjourDialog.cpp:74 +msgid "Service name" +msgstr "Servicenaam" + +#: src/slic3r/GUI/BonjourDialog.cpp:76 +msgid "OctoPrint version" +msgstr "OctoPrint-versie" + +#: src/slic3r/GUI/BonjourDialog.cpp:218 +msgid "Searching for devices" +msgstr "Zoeken naar apparaten" + +#: src/slic3r/GUI/BonjourDialog.cpp:225 +msgid "Finished" +msgstr "Voltooid" + +#: src/slic3r/GUI/ButtonsDescription.cpp:16 +msgid "Buttons And Text Colors Description" +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" + +#: 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" + +#: 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 "" +"Een laagdikte van 0 is niet mogelijk.\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 +msgid "Layer height" +msgstr "Laagdikte" + +#: 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 "" +"Een laagdikte voor de eerste laag van 0 is niet mogelijk.\n" +"\n" +"De laagdikte voor de eerste laag wordt ingesteld op 0,01." + +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889 +msgid "First layer height" +msgstr "Laagdikte eerste laag" + +#: 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 "" +"De spiraalmodus vereist:\n" +"- één perimeter\n" +"- geen dichte toplagen\n" +"- vullingsdichtheid van 0%\n" +"- geen supportmateriaal\n" +"- 'Garandeer verticale shelldikte' aan\n" +"- 'Detecteer dunne wanden' uit" + +#: src/slic3r/GUI/ConfigManipulation.cpp:89 +msgid "Shall I adjust those settings in order to enable Spiral Vase?" +msgstr "" +"Moeten deze instellingen aangepast worden om de spiraalmodus te activeren?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:90 +msgid "Spiral Vase" +msgstr "Spiraalmodus" + +#: 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 "" +"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)." + +#: src/slic3r/GUI/ConfigManipulation.cpp:119 +msgid "Shall I adjust those settings in order to enable the Wipe Tower?" +msgstr "" +"Moeten deze instellingen aangepast worden om het afveegblok te activeren?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:120 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 +msgid "Wipe Tower" +msgstr "Afveegblok" + +#: 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 "" +"De supportlagen voor het afveegblok moeten gesynchroniseerd zijn met de\n" +"objectlagen om met oplosbaar support te 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?" + +#: 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" + +#: src/slic3r/GUI/ConfigManipulation.cpp:162 +msgid "Shall I adjust those settings for supports?" +msgstr "Moeten deze instellingen aangepast worden voor het support?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:163 +msgid "Support Generator" +msgstr "Supportgenerator" + +#: src/slic3r/GUI/ConfigManipulation.cpp:208 +msgid "The %1% infill pattern is not supposed to work at 100%% density." +msgstr "Het %1% vullingspatroon werkt niet bij een dichtheid van 100%%." + +#: src/slic3r/GUI/ConfigManipulation.cpp:210 +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 +msgid "Infill" +msgstr "Vulling" + +#: src/slic3r/GUI/ConfigManipulation.cpp:317 +msgid "Head penetration should not be greater than the head width." +msgstr "De kopinsteek mag niet groter zijn dan de kopbreedte." + +#: src/slic3r/GUI/ConfigManipulation.cpp:319 +msgid "Invalid Head penetration" +msgstr "Ongeldige kopinsteek" + +#: src/slic3r/GUI/ConfigManipulation.cpp:330 +msgid "Pinhead diameter should be smaller than the pillar diameter." +msgstr "De pinkopdiameter moet kleiner zijn dan de pijlerdiameter." + +#: src/slic3r/GUI/ConfigManipulation.cpp:332 +msgid "Invalid pinhead diameter" +msgstr "Ongeldige pinkopdiameter" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18 +msgid "Upgrade" +msgstr "Upgrade" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20 +msgid "Downgrade" +msgstr "Downgrade" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22 +msgid "Before roll back" +msgstr "Voor het teruggaan" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 +msgid "User" +msgstr "Gebruiker" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27 +msgid "Unknown" +msgstr "Onbekend" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 +msgid "Active" +msgstr "Actief" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50 +msgid "PrusaSlicer version" +msgstr "PrusaSlicer-versie" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1551 +msgid "print" +msgstr "print" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +msgid "filaments" +msgstr "filamenten" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1555 +msgid "printer" +msgstr "printer" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1027 +msgid "vendor" +msgstr "leverancier" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 +msgid "version" +msgstr "versie" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "min PrusaSlicer version" +msgstr "minimale PrusaSlicer-versie" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +msgid "max PrusaSlicer version" +msgstr "maximale PrusaSlicer-versie" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 +msgid "model" +msgstr "model" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 +msgid "variants" +msgstr "varianten" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#, c-format +msgid "Incompatible with this %s" +msgstr "Incompatibel met deze %s" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 +msgid "Activate" +msgstr "Activeer" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104 +msgid "Configuration Snapshots" +msgstr "Configuratiesnapshots" + +#: src/slic3r/GUI/ConfigWizard.cpp:233 +msgid "nozzle" +msgstr "nozzle" + +#: src/slic3r/GUI/ConfigWizard.cpp:237 +msgid "Alternate nozzles:" +msgstr "Alternatieve nozzles:" + +#: src/slic3r/GUI/ConfigWizard.cpp:304 +msgid "All standard" +msgstr "Alle standaard" + +#: src/slic3r/GUI/ConfigWizard.cpp:304 +msgid "Standard" +msgstr "Standaard" + +#: src/slic3r/GUI/ConfigWizard.cpp:305 src/slic3r/GUI/ConfigWizard.cpp:588 +#: src/slic3r/GUI/Tab.cpp:3203 +msgid "All" +msgstr "Alle" + +#: 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 +msgid "None" +msgstr "Geen" + +#: src/slic3r/GUI/ConfigWizard.cpp:442 +#, c-format +msgid "Welcome to the %s Configuration Assistant" +msgstr "Welkom bij de %s configuratie-assistent" + +#: src/slic3r/GUI/ConfigWizard.cpp:444 +#, c-format +msgid "Welcome to the %s Configuration Wizard" +msgstr "Welkom bij de %s configuratiewizard" + +#: src/slic3r/GUI/ConfigWizard.cpp:446 +msgid "Welcome" +msgstr "Welkom" + +#: src/slic3r/GUI/ConfigWizard.cpp:448 +#, 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." + +#: 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:496 +#, c-format +msgid "%s Family" +msgstr "%s serie" + +#: src/slic3r/GUI/ConfigWizard.cpp:580 +msgid "Vendor:" +msgstr "Leverancier:" + +#: src/slic3r/GUI/ConfigWizard.cpp:581 +msgid "Profile:" +msgstr "Profiel:" + +#: src/slic3r/GUI/ConfigWizard.cpp:618 src/slic3r/GUI/ConfigWizard.cpp:646 +msgid "(All)" +msgstr "(Alle)" + +#: src/slic3r/GUI/ConfigWizard.cpp:747 +msgid "Custom Printer Setup" +msgstr "Custom printersetup" + +#: src/slic3r/GUI/ConfigWizard.cpp:747 +msgid "Custom Printer" +msgstr "Custom printer" + +#: src/slic3r/GUI/ConfigWizard.cpp:749 +msgid "Define a custom printer profile" +msgstr "Definieer een custom-printerprofiel" + +#: src/slic3r/GUI/ConfigWizard.cpp:751 +msgid "Custom profile name:" +msgstr "Custom-profielnaam:" + +#: src/slic3r/GUI/ConfigWizard.cpp:776 +msgid "Automatic updates" +msgstr "Automatische updates" + +#: src/slic3r/GUI/ConfigWizard.cpp:776 +msgid "Updates" +msgstr "Updates" + +#: src/slic3r/GUI/ConfigWizard.cpp:784 src/slic3r/GUI/Preferences.cpp:64 +msgid "Check for application updates" +msgstr "Controleer op programma-updates" + +#: src/slic3r/GUI/ConfigWizard.cpp:788 +#, 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 "" +"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." + +#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/Preferences.cpp:80 +msgid "Update built-in Presets automatically" +msgstr "Update ingebouwde presets automatisch" + +#: src/slic3r/GUI/ConfigWizard.cpp:798 +#, 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 "" +"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." + +#: src/slic3r/GUI/ConfigWizard.cpp:801 +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." + +#: src/slic3r/GUI/ConfigWizard.cpp:806 +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." + +#: 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 +msgid "Reload from disk" +msgstr "Herlaad vanaf schijf" + +#: src/slic3r/GUI/ConfigWizard.cpp:816 +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" + +#: src/slic3r/GUI/ConfigWizard.cpp:820 +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." + +#: src/slic3r/GUI/ConfigWizard.cpp:828 +msgid "View mode" +msgstr "Weergavemodus" + +#: src/slic3r/GUI/ConfigWizard.cpp:830 +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 "" +"De gebruikersinterface 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." + +#: src/slic3r/GUI/ConfigWizard.cpp:835 +msgid "Simple mode" +msgstr "Eenvoudige modus" + +#: src/slic3r/GUI/ConfigWizard.cpp:836 +msgid "Advanced mode" +msgstr "Geavanceerde modus" + +#: src/slic3r/GUI/ConfigWizard.cpp:837 +msgid "Expert mode" +msgstr "Expertmodus" + +#: src/slic3r/GUI/ConfigWizard.cpp:871 +msgid "Other Vendors" +msgstr "Overige leveranciers" + +#: src/slic3r/GUI/ConfigWizard.cpp:875 +#, 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 +msgid "Firmware Type" +msgstr "Firmwaretype" + +#: src/slic3r/GUI/ConfigWizard.cpp:906 src/slic3r/GUI/Tab.cpp:1969 +msgid "Firmware" +msgstr "Firmware" + +#: src/slic3r/GUI/ConfigWizard.cpp:910 +msgid "Choose the type of firmware used by your printer." +msgstr "Kies het firmwaretype dat de printer gebruikt." + +#: src/slic3r/GUI/ConfigWizard.cpp:944 +msgid "Bed Shape and Size" +msgstr "Grootte en vorm van het bed" + +#: src/slic3r/GUI/ConfigWizard.cpp:947 +msgid "Set the shape of your printer's bed." +msgstr "Stel de vorm van het printbed in." + +#: src/slic3r/GUI/ConfigWizard.cpp:967 +msgid "Filament and Nozzle Diameters" +msgstr "Filament- en nozzlediameters" + +#: src/slic3r/GUI/ConfigWizard.cpp:967 +msgid "Print Diameters" +msgstr "Printdiameters" + +#: src/slic3r/GUI/ConfigWizard.cpp:981 +msgid "Enter the diameter of your printer's hot end nozzle." +msgstr "Voer de nozzlediameter in." + +#: src/slic3r/GUI/ConfigWizard.cpp:984 +msgid "Nozzle Diameter:" +msgstr "Nozzlediameter:" + +#: src/slic3r/GUI/ConfigWizard.cpp:994 +msgid "Enter the diameter of your filament." +msgstr "Voer de filamentdiameter in." + +#: src/slic3r/GUI/ConfigWizard.cpp:995 +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." + +#: src/slic3r/GUI/ConfigWizard.cpp:998 +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:1032 +msgid "Temperatures" +msgstr "Temperaturen" + +#: src/slic3r/GUI/ConfigWizard.cpp:1048 +msgid "Enter the temperature needed for extruding your filament." +msgstr "Voer de benodigde temperatuur in om het filament te extruderen." + +#: src/slic3r/GUI/ConfigWizard.cpp:1049 +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." + +#: src/slic3r/GUI/ConfigWizard.cpp:1052 +msgid "Extrusion Temperature:" +msgstr "Extrusietemperatuur:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1053 src/slic3r/GUI/ConfigWizard.cpp:1067 +msgid "°C" +msgstr "°C" + +#: src/slic3r/GUI/ConfigWizard.cpp:1062 +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." + +#: src/slic3r/GUI/ConfigWizard.cpp:1063 +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." + +#: src/slic3r/GUI/ConfigWizard.cpp:1066 +msgid "Bed Temperature:" +msgstr "Bedtemperatuur:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1486 src/slic3r/GUI/ConfigWizard.cpp:2028 +msgid "Filaments" +msgstr "Filamenten" + +#: src/slic3r/GUI/ConfigWizard.cpp:1486 src/slic3r/GUI/ConfigWizard.cpp:2030 +msgid "SLA Materials" +msgstr "SLA-materialen" + +#: src/slic3r/GUI/ConfigWizard.cpp:1540 +msgid "FFF Technology Printers" +msgstr "FFF-technologie printers" + +#: src/slic3r/GUI/ConfigWizard.cpp:1545 +msgid "SLA Technology Printers" +msgstr "SLA-technologie 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 +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:1776 +msgid "Do you want to automatic select default filaments?" +msgstr "Wilt u automatisch de standaard filamenten selecteren?" + +#: 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:1787 +msgid "Do you want to automatic select default materials?" +msgstr "Wilt u automatisch de standaard materialen selecteren?" + +#: src/slic3r/GUI/ConfigWizard.cpp:1991 +msgid "Select all standard printers" +msgstr "Selecteer alle standaard printers" + +#: src/slic3r/GUI/ConfigWizard.cpp:1994 +msgid "< &Back" +msgstr "< Terug" + +#: src/slic3r/GUI/ConfigWizard.cpp:1995 +msgid "&Next >" +msgstr "Volgende >" + +#: src/slic3r/GUI/ConfigWizard.cpp:1996 +msgid "&Finish" +msgstr "Voltooien" + +#: src/slic3r/GUI/ConfigWizard.cpp:1997 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 +msgid "Cancel" +msgstr "Annuleren" + +#: src/slic3r/GUI/ConfigWizard.cpp:2010 +msgid "Prusa FFF Technology Printers" +msgstr "Prusa FFF-technologie printers" + +#: src/slic3r/GUI/ConfigWizard.cpp:2013 +msgid "Prusa MSLA Technology Printers" +msgstr "Prusa MSLA-technologie printers" + +#: src/slic3r/GUI/ConfigWizard.cpp:2028 +msgid "Filament Profiles Selection" +msgstr "Profielselectie voor filament" + +#: src/slic3r/GUI/ConfigWizard.cpp:2028 src/slic3r/GUI/GUI_ObjectList.cpp:3581 +msgid "Type:" +msgstr "Type:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2030 +msgid "SLA Material Profiles Selection" +msgstr "Profielselectie voor SLA materialen" + +#: src/slic3r/GUI/ConfigWizard.cpp:2030 +msgid "Layer height:" +msgstr "Laagdikte:" + +#: src/slic3r/GUI/ConfigWizard.cpp:2124 +msgid "Configuration Assistant" +msgstr "Configuratie-assistent" + +#: src/slic3r/GUI/ConfigWizard.cpp:2125 +msgid "Configuration &Assistant" +msgstr "Configuratie-assistent" + +#: src/slic3r/GUI/ConfigWizard.cpp:2127 +msgid "Configuration Wizard" +msgstr "Configuratiewizard" + +#: src/slic3r/GUI/ConfigWizard.cpp:2128 +msgid "Configuration &Wizard" +msgstr "Configuratiewizard" + +#: src/slic3r/GUI/DoubleSlider.cpp:79 +msgid "Place bearings in slots and resume printing" +msgstr "Plaats inserts in gaten en ga door met printen" + +#: src/slic3r/GUI/DoubleSlider.cpp:950 +msgid "One layer mode" +msgstr "Een-laagsmodus" + +#: src/slic3r/GUI/DoubleSlider.cpp:952 +msgid "Discard all custom changes" +msgstr "Alle aangepaste wijzigingen afwijzen" + +#: src/slic3r/GUI/DoubleSlider.cpp:955 +#, 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" + +#: 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:960 +msgid "Edit current color - Right click the colored slider segment" +msgstr "Wijzig huidige kleur; klik op het gekleurde segment" + +#: src/slic3r/GUI/DoubleSlider.cpp:970 +msgid "Print mode" +msgstr "Printmodus" + +#: src/slic3r/GUI/DoubleSlider.cpp:984 +msgid "Add extruder change - Left click" +msgstr "Voeg extruderwissel toe; linkermuisknop" + +#: src/slic3r/GUI/DoubleSlider.cpp:986 +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" + +#: src/slic3r/GUI/DoubleSlider.cpp:988 +msgid "Add color change - Left click" +msgstr "Voeg kleurwissel toe; linkermuisknop" + +#: src/slic3r/GUI/DoubleSlider.cpp:989 +msgid "or press \"+\" key" +msgstr "of druk op de '+'-toets" + +#: src/slic3r/GUI/DoubleSlider.cpp:991 +msgid "Add another code - Ctrl + Left click" +msgstr "Voeg nog een code toe; CTRL + linkermuisknop" + +#: src/slic3r/GUI/DoubleSlider.cpp:992 +msgid "Add another code - Right click" +msgstr "Voeg nog een code toe; rechtermuisknop" + +#: 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 "" +"Het achtereenvolgens printen staat aan.\n" +"Het is niet mogelijk om custom G-codes aan objecten toe te voegen voor het " +"achtereenvolgens printen.\n" +"Deze code wordt niet uitgevoerd bij de generatie van de G-code." + +#: src/slic3r/GUI/DoubleSlider.cpp:1005 +msgid "Color change (\"%1%\")" +msgstr "Kleurwissel (%1%)" + +#: src/slic3r/GUI/DoubleSlider.cpp:1006 +msgid "Color change (\"%1%\") for Extruder %2%" +msgstr "Kleurwissel (%1%) voor extruder %2%" + +#: src/slic3r/GUI/DoubleSlider.cpp:1009 +msgid "Pause print (\"%1%\")" +msgstr "Pauzeer print (%1%)" + +#: src/slic3r/GUI/DoubleSlider.cpp:1011 +msgid "Extruder (tool) is changed to Extruder \"%1%\"" +msgstr "Extruder (tool) is veranderd naar extruder %1%" + +#: src/slic3r/GUI/DoubleSlider.cpp:1019 +msgid "Note" +msgstr "Let op" + +#: 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 "" +"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." + +#: 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 "" +"Er is een kleurwissel voor een extruder die niet wordt gebruikt tot het eind " +"van de print.\n" +"Deze code wordt niet toegevoegd bij de generatie van de 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 "" +"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 +msgid "" +"There is a color change for extruder that has not been used before.\n" +"Check your settings to avoid redundant color changes." +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 +msgid "Delete tick mark - Left click or press \"-\" key" +msgstr "Verwijder markering; linkermuisknop of druk op de '-'-knop" + +#: src/slic3r/GUI/DoubleSlider.cpp:1037 +msgid "Edit tick mark - Ctrl + Left click" +msgstr "Bewerk markering; CTRL + linkermuisknop" + +#: src/slic3r/GUI/DoubleSlider.cpp:1038 +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 +#, c-format +msgid "Extruder %d" +msgstr "Extruder %d" + +#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1721 +msgid "active" +msgstr "actief" + +#: src/slic3r/GUI/DoubleSlider.cpp:1144 +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 +msgid "Change extruder" +msgstr "Wissel extruder" + +#: src/slic3r/GUI/DoubleSlider.cpp:1145 +msgid "Change extruder (N/A)" +msgstr "Wissel extruder (n.v.t.)" + +#: src/slic3r/GUI/DoubleSlider.cpp:1147 +msgid "Use another extruder" +msgstr "Gebruik een andere extruder" + +#: src/slic3r/GUI/DoubleSlider.cpp:1171 +msgid "used" +msgstr "gebruikt" + +#: src/slic3r/GUI/DoubleSlider.cpp:1179 +msgid "Switch code to Color change (%1%) for:" +msgstr "Code om naar kleur %1% te wisselen voor:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1180 +msgid "Add color change (%1%) for:" +msgstr "Voeg kleurwissel (%1%) toe voor:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1477 +msgid "Add color change" +msgstr "Voeg kleurwissel toe" + +#: src/slic3r/GUI/DoubleSlider.cpp:1487 +msgid "Add pause print" +msgstr "Voeg printpauze toe" + +#: src/slic3r/GUI/DoubleSlider.cpp:1490 +msgid "Add custom G-code" +msgstr "Voeg custom G-code toe" + +#: src/slic3r/GUI/DoubleSlider.cpp:1508 +msgid "Edit color" +msgstr "Bewerk kleur" + +#: src/slic3r/GUI/DoubleSlider.cpp:1509 +msgid "Edit pause print message" +msgstr "Bewerk printpauze-bericht" + +#: src/slic3r/GUI/DoubleSlider.cpp:1510 +msgid "Edit custom G-code" +msgstr "Bewerk custom G-code" + +#: src/slic3r/GUI/DoubleSlider.cpp:1516 +msgid "Delete color change" +msgstr "Verwijder kleurwissel" + +#: src/slic3r/GUI/DoubleSlider.cpp:1517 +msgid "Delete tool change" +msgstr "Verwijder toolwissel" + +#: src/slic3r/GUI/DoubleSlider.cpp:1518 +msgid "Delete pause print" +msgstr "Verwijder printpauze" + +#: src/slic3r/GUI/DoubleSlider.cpp:1519 +msgid "Delete custom G-code" +msgstr "Verwijder custom G-code" + +#: src/slic3r/GUI/DoubleSlider.cpp:1532 +msgid "Set extruder sequence for the entire print" +msgstr "Stel extrudervolgorde in voor de hele print" + +#: src/slic3r/GUI/DoubleSlider.cpp:1618 +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 +msgid "Custom G-code on current layer (%1% mm)." +msgstr "Custom G-code voor huidige laag (%1% mm)." + +#: src/slic3r/GUI/DoubleSlider.cpp:1634 +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 +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 +msgid "Enter the height you want to jump to" +msgstr "Voer de hoogte in waar u naartoe wilt" + +#: src/slic3r/GUI/DoubleSlider.cpp:1899 +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 +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 +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 +msgid "Are you sure you want to continue?" +msgstr "Weet u zeker dat u wilt doorgaan?" + +#: 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 "" +"Selecteer JA als u alle toolwisselingen wil opslaan,\n" +"of NEE als u alle toolwisselingen wilt veranderen in kleurwisselingen\n" +"of klik op annuleren om wijzingen ongedaan te maken." + +#: src/slic3r/GUI/DoubleSlider.cpp:1920 +msgid "Do you want to delete all saved tool changes?" +msgstr "Wilt u alle opgeslagen toolwisselingen verwijderen?" + +#: src/slic3r/GUI/DoubleSlider.cpp:1922 +msgid "" +"The last color change data was saved for a multi extruder printing with tool " +"changes for whole print." +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 +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 +msgid "Set extruder sequence" +msgstr "Stel extrudervolgorde in" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +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 +msgid "layers" +msgstr "lagen" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "Stel toolvolgorde in" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182 +msgid "Remove extruder from sequence" +msgstr "Verwijder extruder uit de reeks" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 +msgid "Add extruder to sequence" +msgstr "Voeg extruder toe aan de reeks" + +#: src/slic3r/GUI/Field.cpp:136 +msgid "default value" +msgstr "standaardwaarde" + +#: src/slic3r/GUI/Field.cpp:139 +msgid "parameter name" +msgstr "parameternaam" + +#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:598 +msgid "N/A" +msgstr "n.v.t." + +#: src/slic3r/GUI/Field.cpp:175 +#, 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 +msgid "Invalid numeric input." +msgstr "Ongeldige numerieke invoer." + +#: src/slic3r/GUI/Field.cpp:204 +msgid "Input value is out of range" +msgstr "Ingevoerde waarde valt buiten het bereik" + +#: 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 "" +"Wordt %s%% bedoeld in plaats van %s %s?\n" +"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/FirmwareDialog.cpp:150 +msgid "Flash!" +msgstr "Flash!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:152 +msgid "Flashing in progress. Please do not disconnect the printer!" +msgstr "Flashen in uitvoering. Ontkoppel de printer niet!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:199 +msgid "Flashing failed" +msgstr "Flashen mislukt" + +#: src/slic3r/GUI/FirmwareDialog.cpp:282 +msgid "Flashing succeeded!" +msgstr "Flashen succesvol!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:283 +msgid "Flashing failed. Please see the avrdude log below." +msgstr "Flashen mislukt. Check het AVRDUDE-logboek hieronder." + +#: src/slic3r/GUI/FirmwareDialog.cpp:284 +msgid "Flashing cancelled." +msgstr "Flashen geannuleerd." + +#: 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 "" +"Dit HEX-bestand is niet geschikt voor deze printer.\n" +"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." + +#: 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 "" +"Meerdere %s apparaten gevonden. Verbind één printer per keer voor het " +"flashen." + +#: 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 "" +"Het %s apparaat is niet gevonden.\n" +"Klik op de reset-knop naast de USB-aansluiting als het apparaat is verbonden." + +#: src/slic3r/GUI/FirmwareDialog.cpp:548 +#, c-format +msgid "The %s device could not have been found" +msgstr "Het %s apparaat kon niet gevonden worden" + +#: src/slic3r/GUI/FirmwareDialog.cpp:645 +#, c-format +msgid "Error accessing port at %s: %s" +msgstr "Fout bij het openen van de poort op %s: %s" + +#: src/slic3r/GUI/FirmwareDialog.cpp:647 +#, c-format +msgid "Error: %s" +msgstr "Fout: %s" + +#: src/slic3r/GUI/FirmwareDialog.cpp:777 +msgid "Firmware flasher" +msgstr "Firmwareflasher" + +#: src/slic3r/GUI/FirmwareDialog.cpp:802 +msgid "Firmware image:" +msgstr "Firmwarebestand:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1705 +#: src/slic3r/GUI/Tab.cpp:1767 +msgid "Browse" +msgstr "Zoek" + +#: src/slic3r/GUI/FirmwareDialog.cpp:807 +msgid "Serial port:" +msgstr "Seriële poort:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:809 +msgid "Autodetected" +msgstr "Automatisch gedetecteerd" + +#: src/slic3r/GUI/FirmwareDialog.cpp:810 +msgid "Rescan" +msgstr "Opnieuw scannen" + +#: src/slic3r/GUI/FirmwareDialog.cpp:817 +msgid "Progress:" +msgstr "Voortgang:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:820 +msgid "Status:" +msgstr "Status:" + +#: src/slic3r/GUI/FirmwareDialog.cpp:821 +msgid "Ready" +msgstr "Klaar" + +#: src/slic3r/GUI/FirmwareDialog.cpp:841 +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 +msgid "Close" +msgstr "Sluit" + +#: 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 "" +"Weet u zeker dat u het firmware flashen wilt stoppen?\n" +"Dit kan er voor zorgen dat de printer onbruikbaar wordt!" + +#: src/slic3r/GUI/FirmwareDialog.cpp:903 +msgid "Confirmation" +msgstr "Bevestiging" + +#: src/slic3r/GUI/FirmwareDialog.cpp:906 +msgid "Cancelling..." +msgstr "Annuleren..." + +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4572 +msgid "Variable layer height" +msgstr "Variabele laagdikte" + +#: src/slic3r/GUI/GLCanvas3D.cpp:237 +msgid "Left mouse button:" +msgstr "Linkermuisknop:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:240 +msgid "Add detail" +msgstr "Voeg detail toe" + +#: src/slic3r/GUI/GLCanvas3D.cpp:243 +msgid "Right mouse button:" +msgstr "Rechtermuisknop:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:246 +msgid "Remove detail" +msgstr "Verwijder detail" + +#: src/slic3r/GUI/GLCanvas3D.cpp:249 +msgid "Shift + Left mouse button:" +msgstr "Shift + linkermuisknop:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:252 +msgid "Reset to base" +msgstr "Reset" + +#: src/slic3r/GUI/GLCanvas3D.cpp:255 +msgid "Shift + Right mouse button:" +msgstr "Shift + rechtermuisknop:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:258 +msgid "Smoothing" +msgstr "Egaliseren" + +#: src/slic3r/GUI/GLCanvas3D.cpp:261 +msgid "Mouse wheel:" +msgstr "Scrollwieltje:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:264 +msgid "Increase/decrease edit area" +msgstr "Vergroot/verklein bewerkgebied" + +#: src/slic3r/GUI/GLCanvas3D.cpp:267 +msgid "Adaptive" +msgstr "Adaptief" + +#: src/slic3r/GUI/GLCanvas3D.cpp:273 +msgid "Quality / Speed" +msgstr "Kwaliteit / Snelheid" + +#: src/slic3r/GUI/GLCanvas3D.cpp:277 +msgid "Higher print quality versus higher print speed." +msgstr "Hogere printkwaliteit tegenover een hogere printsnelheid." + +#: src/slic3r/GUI/GLCanvas3D.cpp:288 +msgid "Smooth" +msgstr "Egaliseer" + +#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511 +msgid "Radius" +msgstr "Radius" + +#: src/slic3r/GUI/GLCanvas3D.cpp:304 +msgid "Keep min" +msgstr "Behoud min" + +#: src/slic3r/GUI/GLCanvas3D.cpp:313 +msgid "Reset" +msgstr "Reset" + +#: src/slic3r/GUI/GLCanvas3D.cpp:599 +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:686 +msgid "A toolpath outside the print area was detected" +msgstr "Er is een printbeweging 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:688 +msgid "Some objects are not visible" +msgstr "Sommige objecten zijn niet zichtbaar" + +#: src/slic3r/GUI/GLCanvas3D.cpp:690 +msgid "" +"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" + +#: 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 +msgid "Seq." +msgstr "Volgorde" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1701 +msgid "Variable layer height - Reset" +msgstr "Variabele laagdikte - reset" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1709 +msgid "Variable layer height - Adaptive" +msgstr "Variabele laagdikte - adaptief" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1717 +msgid "Variable layer height - Smooth all" +msgstr "Variable laagdikte - egaliseer alles" + +#: src/slic3r/GUI/GLCanvas3D.cpp:2053 +msgid "Mirror Object" +msgstr "Spiegel object" + +#: src/slic3r/GUI/GLCanvas3D.cpp:2921 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:570 +msgid "Gizmo-Move" +msgstr "Verplaatsen" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3001 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:572 +msgid "Gizmo-Rotate" +msgstr "Roteren" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3505 +msgid "Move Object" +msgstr "Verplaats object" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4046 +msgid "Undo History" +msgstr "Geschiedenis ongedaan maken" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4046 +msgid "Redo History" +msgstr "Geschiedenis opnieuw doen" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4064 +#, 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 +#, 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 +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 +msgid "Delete" +msgstr "Verwijder" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4483 src/slic3r/GUI/KBShortcutsDialog.cpp:131 +#: src/slic3r/GUI/Plater.cpp:4725 +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 +msgid "Arrange selection" +msgstr "Schik selectie" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4504 +msgid "Copy" +msgstr "Kopieer" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4513 +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 +msgid "Add instance" +msgstr "Voeg instantie toe" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4536 src/slic3r/GUI/Plater.cpp:3994 +msgid "Remove instance" +msgstr "Verwijder instantie" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4549 +msgid "Split to objects" +msgstr "Verdeel in objecten" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4559 src/slic3r/GUI/GUI_ObjectList.cpp:1503 +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 +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: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 +msgid "Redo" +msgstr "Doe opnieuw" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4672 +msgid "Next Redo action: %1%" +msgstr "Volgende opnieuw doen: %1%" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6586 +msgid "Selection-Add from rectangle" +msgstr "Selectie - Voeg toe van boxselectie" + +#: src/slic3r/GUI/GLCanvas3D.cpp:6605 +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 +msgid "Cut" +msgstr "Snij door" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168 +msgid "Keep upper part" +msgstr "Behoud bovenste deel" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 +msgid "Keep lower part" +msgstr "Behoud onderste deel" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 +msgid "Rotate lower part upwards" +msgstr "Roteer onderste deel naar boven" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175 +msgid "Perform cut" +msgstr "Toepassen" + +#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45 +msgid "Place on face" +msgstr "Plaats op vlak" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40 +msgid "Hollow this object" +msgstr "Dit object uithollen" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41 +msgid "Preview hollowed and drilled model" +msgstr "Toon voorbeeld van uitgehold model met gat" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Offset" +msgstr "Shelldikte" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +msgid "Quality" +msgstr "Kwaliteit" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +#: src/libslic3r/PrintConfig.cpp:2944 +msgid "Closing distance" +msgstr "Sluitafstand" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +msgid "Hole diameter" +msgstr "Gatdiameter" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +msgid "Hole depth" +msgstr "Gatdiepte" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Remove selected holes" +msgstr "Verwijder geselecteerde gaten" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +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 +msgid "Add drainage hole" +msgstr "Voeg afvoergat toe" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:541 +msgid "Delete drainage hole" +msgstr "Verwijder afvoergat" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:815 +msgid "Hollowing parameter change" +msgstr "Verandering van uitholparameter" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:887 +msgid "Change drainage hole diameter" +msgstr "Verander afvoergatdiameter" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:979 +msgid "Hollow and drill" +msgstr "Uithollen en gat toevoegen" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1061 +msgid "Move drainage hole" +msgstr "Verplaats afvoergat" + +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 +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 +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 +msgid "Scale" +msgstr "Verschaal" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47 +msgid "Head diameter" +msgstr "Kopdiameter" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 +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 +msgid "Remove selected points" +msgstr "Verwijder geselecteerde punten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +msgid "Remove all points" +msgstr "Verwijdere alle punten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 +msgid "Apply changes" +msgstr "Wijzigingen toepassen" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365 +msgid "Discard changes" +msgstr "Wijzigingen afwijzen" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +msgid "Minimal points distance" +msgstr "Minimale puntafstand" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 +#: src/libslic3r/PrintConfig.cpp:2774 +msgid "Support points density" +msgstr "Dichtheid van supportpunten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 +msgid "Auto-generate points" +msgstr "Genereer automatisch punten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +msgid "Manual editing" +msgstr "Handmatig bewerken" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:484 +msgid "Add support point" +msgstr "Voeg supportpunt toe" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:621 +msgid "Delete support point" +msgstr "Verwijder supportpunt" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:810 +msgid "Change point head diameter" +msgstr "Wijzig puntkopdiameter" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:878 +msgid "Support parameter change" +msgstr "Wijzig supportparameter" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:986 +msgid "SLA Support Points" +msgstr "SLA-supportpunten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1007 +msgid "SLA gizmo turned on" +msgstr "SLA-bewerker aangezet" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1035 +msgid "Do you want to save your manually edited support points?" +msgstr "Wilt u handmatig aangepaste supportpunten opslaan?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1036 +msgid "Save changes?" +msgstr "Wijzigingen opslaan?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048 +msgid "SLA gizmo turned off" +msgstr "SLA-bewerker uitgezet" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1087 +msgid "Move support point" +msgstr "Verplaats supportpunt" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186 +msgid "Support points edit" +msgstr "Bewerk supportpunten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1258 +msgid "Autogeneration will erase all manually edited points." +msgstr "" +"Automatisch genereren zal alle handmatig aangepaste punten verwijderen." + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1259 +msgid "Are you sure you want to do it?" +msgstr "Weet u zeker dat u dit wilt 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 +msgid "Warning" +msgstr "Waarschuwing" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263 +msgid "Autogenerate support points" +msgstr "Automatisch gegenereerde supportpunten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1324 +msgid "SLA gizmo keyboard shortcuts" +msgstr "SLA sneltoetsen" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1335 +msgid "Note: some shortcuts work in (non)editing mode only." +msgstr "Let op: sommige sneltoetsen werken alleen in bewerkmodus." + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1357 +msgid "Left click" +msgstr "Linkermuisknop" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353 +msgid "Add point" +msgstr "Voeg punt toe" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354 +msgid "Right click" +msgstr "Rechtermuisknop" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354 +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 +msgid "Drag" +msgstr "Versleep" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355 +msgid "Move point" +msgstr "Verplaats punt" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356 +msgid "Add point to selection" +msgstr "Voeg punt toe aan selectie" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1357 +msgid "Remove point from selection" +msgstr "Verwijder punt uit selectie" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1358 +msgid "Select by rectangle" +msgstr "Selecteer met boxselectie" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1359 +msgid "Deselect by rectangle" +msgstr "Deselecteer met boxselectie" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1360 +msgid "Select all points" +msgstr "Selecteer alle punten" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1362 +msgid "Mouse wheel" +msgstr "Scrollwieltje" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1362 +msgid "Move clipping plane" +msgstr "Verplaats snijvlak" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 +msgid "Reset clipping plane" +msgstr "Reset snijvlak" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 +msgid "Switch to editing mode" +msgstr "Schakel over naar bewerkmodus" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:497 +msgid "Gizmo-Place on Face" +msgstr "Plaats op vlak" + +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:571 +msgid "Gizmo-Scale" +msgstr "Verschalen" + +#: 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 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" +"\n" +"Het programma zal nu afsluiten." + +#: src/slic3r/GUI/GUI_App.cpp:141 +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:441 src/slic3r/GUI/GUI_App.cpp:449 +msgid "Recreating" +msgstr "Opnieuw aanmaken" + +#: src/slic3r/GUI/GUI_App.cpp:454 +msgid "Loading of current presets" +msgstr "Laden van huidige presets" + +#: src/slic3r/GUI/GUI_App.cpp:459 +msgid "Loading of a mode view" +msgstr "Laden van de weergavemodus" + +#: src/slic3r/GUI/GUI_App.cpp:538 +msgid "Choose one file (3MF/AMF):" +msgstr "Kies een 3MF- of AMF-bestand:" + +#: src/slic3r/GUI/GUI_App.cpp:550 +msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):" +msgstr "Kies één of meer STL-, OBJ-, AMF-, 3MF-, of PRUSA-bestanden:" + +#: src/slic3r/GUI/GUI_App.cpp:611 +msgid "Select the language" +msgstr "Taalselectie" + +#: src/slic3r/GUI/GUI_App.cpp:611 +msgid "Language" +msgstr "Taal" + +#: src/slic3r/GUI/GUI_App.cpp:779 +#, c-format +msgid "Run %s" +msgstr "Voer %s uit" + +#: src/slic3r/GUI/GUI_App.cpp:782 +msgid "&Configuration Snapshots" +msgstr "Configuratiesnapshots" + +#: src/slic3r/GUI/GUI_App.cpp:782 +msgid "Inspect / activate configuration snapshots" +msgstr "Inspecteer/activeer configuratiesnapshots" + +#: src/slic3r/GUI/GUI_App.cpp:783 +msgid "Take Configuration &Snapshot" +msgstr "Neem configuratiesnapshot" + +#: src/slic3r/GUI/GUI_App.cpp:783 +msgid "Capture a configuration snapshot" +msgstr "Neem een configuratiesnapshot op" + +#: src/slic3r/GUI/GUI_App.cpp:784 +msgid "Check for updates" +msgstr "Controleer op updates" + +#: src/slic3r/GUI/GUI_App.cpp:784 +msgid "Check for configuration updates" +msgstr "Controleer op configuratie-updates" + +#: src/slic3r/GUI/GUI_App.cpp:786 +msgid "&Preferences" +msgstr "Voorkeuren" + +#: src/slic3r/GUI/GUI_App.cpp:792 +msgid "Application preferences" +msgstr "Programmavoorkeuren" + +#: src/slic3r/GUI/GUI_App.cpp:795 src/slic3r/GUI/wxExtensions.cpp:756 +msgid "Simple" +msgstr "Eenvoudig" + +#: src/slic3r/GUI/GUI_App.cpp:795 +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 +msgid "Advanced" +msgstr "Geavanceerd" + +#: src/slic3r/GUI/GUI_App.cpp:796 +msgid "Advanced View Mode" +msgstr "Geavanceerde weergave" + +#: src/slic3r/GUI/GUI_App.cpp:797 src/slic3r/GUI/wxExtensions.cpp:758 +msgid "Expert" +msgstr "Expert" + +#: src/slic3r/GUI/GUI_App.cpp:797 +msgid "Expert View Mode" +msgstr "Expertweergave" + +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Mode" +msgstr "Modus" + +#: src/slic3r/GUI/GUI_App.cpp:802 +#, c-format +msgid "%s View Mode" +msgstr "%s-weergavemodus" + +#: src/slic3r/GUI/GUI_App.cpp:804 +msgid "&Language" +msgstr "Taal" + +#: src/slic3r/GUI/GUI_App.cpp:806 +msgid "Flash printer &firmware" +msgstr "Flash printerfirmware" + +#: src/slic3r/GUI/GUI_App.cpp:806 +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 +msgid "Taking configuration snapshot" +msgstr "Neem configuratiesnapshot" + +#: src/slic3r/GUI/GUI_App.cpp:821 +msgid "Snapshot name" +msgstr "Snapshotnaam" + +#: src/slic3r/GUI/GUI_App.cpp:868 +msgid "" +"Switching the language will trigger application restart.\n" +"You will lose content of the plater." +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 +msgid "Do you want to proceed?" +msgstr "" +"Weet u zeker dat u door wilt 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 +msgid "&Configuration" +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:919 src/slic3r/GUI/Tab.cpp:2934 +msgid "Discard changes and continue anyway?" +msgstr "Wijzigingen afwijzen en doorgaan?" + +#: src/slic3r/GUI/GUI_App.cpp:922 +msgid "Unsaved Presets" +msgstr "Niet-opgeslagen presets" + +#: src/slic3r/GUI/GUI_App.cpp:1071 src/slic3r/GUI/Tab.cpp:2946 +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 +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 +msgid "Attention!" +msgstr "Attentie!" + +#: src/slic3r/GUI/GUI_App.cpp:1090 +msgid "Select a gcode file:" +msgstr "Selecteer een gcode-bestand:" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +msgid "Start at height" +msgstr "Start op hoogte" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 +msgid "Stop at height" +msgstr "Stop op hoogte" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:158 +msgid "Remove layer range" +msgstr "Verwijder laagbereik" + +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:160 +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 +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 +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 +msgid "Wipe options" +msgstr "Afveegopties" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 +msgid "Pad and Support" +msgstr "Basisplaat en support" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 +msgid "Add part" +msgstr "Voeg onderdeel toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 +msgid "Add modifier" +msgstr "Voeg modificator toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 +msgid "Add support enforcer" +msgstr "Voeg supportforcering toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 +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 +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 +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 +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 +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 +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 +msgid "Hollowing" +msgstr "Uithollen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:275 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 +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 +msgid "Editing" +msgstr "Bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:345 +#, c-format +msgid "Auto-repaired (%d errors):" +msgstr "Automatisch gerepareerd (%d fouten):" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:352 +msgid "degenerate facets" +msgstr "vlakken gedegenereerd" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:353 +msgid "edges fixed" +msgstr "randen vastgezet" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:354 +msgid "facets removed" +msgstr "vlakken verwijderd" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:355 +msgid "facets added" +msgstr "vlakken toegevoegd" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:356 +msgid "facets reversed" +msgstr "vlakken omgekeerd" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:357 +msgid "backwards edges" +msgstr "omgekeerde lijnen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:365 +msgid "Right button click the icon to fix STL through Netfabb" +msgstr "" +"Rechtermuisklik op het pictogram om het STL-bestand met NetFabb te repareren" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 +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 +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 +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 +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 +msgid "Change Extruder" +msgstr "Wijzig extruder" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:557 +msgid "Rename Object" +msgstr "Hernoem object" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:557 +msgid "Rename Sub-object" +msgstr "Hernoem subobject" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1107 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3809 +msgid "Instances to Separated Objects" +msgstr "Zet instanties om in objecten" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1122 +msgid "Volumes in Object reordered" +msgstr "Volumes in object opnieuw geordend" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1122 +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 +#, c-format +msgid "Quick Add Settings (%s)" +msgstr "Snel instellingen toevoegen (%s)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1281 +msgid "Select showing settings" +msgstr "Selecteer getoonde instellingen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1330 +msgid "Add Settings for Layers" +msgstr "Voeg laaginstellingen toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +msgid "Add Settings for Sub-object" +msgstr "Voeg instellingen voor subobject toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1332 +msgid "Add Settings for Object" +msgstr "Voeg instellingen voor object toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1402 +msgid "Add Settings Bundle for Height range" +msgstr "Voeg instellingen voor hoogtebereik toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1403 +msgid "Add Settings Bundle for Sub-object" +msgstr "Voeg instellingen voor subobject toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1404 +msgid "Add Settings Bundle for Object" +msgstr "Voeg instellingen voor een object toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1443 +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 +msgid "Box" +msgstr "Blok" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1448 +msgid "Cylinder" +msgstr "Cilinder" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1448 +msgid "Sphere" +msgstr "Bol" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1448 +msgid "Slab" +msgstr "Plaat" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1516 +msgid "Height range Modifier" +msgstr "Modificator voor hoogtebereik" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1525 +msgid "Add settings" +msgstr "Voeg instellingen toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1605 +msgid "Change type" +msgstr "Wijzig type" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1615 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1627 +msgid "Set as a Separated Object" +msgstr "Stel in als apart object" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1627 +msgid "Set as a Separated Objects" +msgstr "Stel in als aparte objecten" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1637 +msgid "Printable" +msgstr "Printbaar" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1652 +msgid "Rename" +msgstr "Hernoem" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1663 +msgid "Fix through the Netfabb" +msgstr "Repareer met NetFabb" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1673 src/slic3r/GUI/Plater.cpp:4018 +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 +msgid "Reload the selected volumes from disk" +msgstr "Herlaad de geselecteerde volumes vanaf schijf" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1687 +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 +msgid "Default" +msgstr "Standaard" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1740 +msgid "Scale to print volume" +msgstr "Verschaal tot printvolume" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1740 +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 +msgid "Add Shape" +msgstr "Voeg vorm toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1895 +msgid "Load Part" +msgstr "Laad onderdeel" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1934 +msgid "Error!" +msgstr "Fout!" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2009 +msgid "Add Generic Subobject" +msgstr "Voeg algemene subobjecten toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2038 +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 +msgid "Delete Settings" +msgstr "Verwijder instellingen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2192 +msgid "Delete All Instances from Object" +msgstr "Verwijder alle instanties van het object" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2208 +msgid "Delete Height Range" +msgstr "Verwijder hoogtebereik" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2239 +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 +msgid "Delete Subobject" +msgstr "Verwijder subobject" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2262 +msgid "Delete Instance" +msgstr "Verwijder instantie" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2286 src/slic3r/GUI/Plater.cpp:3035 +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 +msgid "Split to Parts" +msgstr "Splits naar onderdelen" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2344 +msgid "Add Layers" +msgstr "Voeg lagen toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2470 +msgid "Group manipulation" +msgstr "Groep bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2482 +msgid "Object manipulation" +msgstr "Object bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2495 +msgid "Object Settings to modify" +msgstr "Objectinstellingen om te bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2499 +msgid "Part Settings to modify" +msgstr "Onderdeelinstellingen om te bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2504 +msgid "Layer range Settings to modify" +msgstr "Laagbereikinstellingen om te bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2510 +msgid "Part manipulation" +msgstr "Onderdeel bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2516 +msgid "Instance manipulation" +msgstr "Instantie bewerken" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2523 +msgid "Height ranges" +msgstr "Hoogtebereik" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2523 +msgid "Settings for height range" +msgstr "Instellingen voor hoogtebereik" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 +msgid "Delete Selected Item" +msgstr "Verwijder geselecteerd item" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2846 +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 +msgid "Add Height Range" +msgstr "Voeg hoogtebereik toe" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3027 +msgid "Edit Height Range" +msgstr "Bewerk hoogtebereik" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3319 +msgid "Selection-Remove from list" +msgstr "Selectie - Verwijder van lijst" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3327 +msgid "Selection-Add from list" +msgstr "Selectie - Voeg toe aan lijst" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3445 +msgid "Object or Instance" +msgstr "Object of instantie" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3446 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3579 +msgid "Part" +msgstr "Onderdeel" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3446 +msgid "Layer" +msgstr "Laag" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3448 +msgid "Unsupported selection" +msgstr "Niet-ondersteunde selectie" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3449 +#, 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 +#, 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" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3453 +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 +msgid "Info" +msgstr "Info" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3574 +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 +msgid "Modifier" +msgstr "Modificator" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3579 +msgid "Support Enforcer" +msgstr "Supportforcering" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3579 +msgid "Support Blocker" +msgstr "Supportblokkering" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3581 +msgid "Select type of part" +msgstr "Selecteer onderdeeltype" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3586 +msgid "Change Part Type" +msgstr "Wijzig onderdeeltype" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3831 +msgid "Enter new name" +msgstr "Voer nieuwe naam in" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3831 +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 +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 +msgid "the following characters are not allowed:" +msgstr "de volgende karakters zijn niet toegestaan:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3999 +msgid "Select extruder number:" +msgstr "Selecteer extrudernummer:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4000 +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 +msgid "Change Extruders" +msgstr "Wijzig extruders" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4122 src/slic3r/GUI/Selection.cpp:1475 +msgid "Set Printable" +msgstr "Stel in op printbaar" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:4122 src/slic3r/GUI/Selection.cpp:1475 +msgid "Set Unprintable" +msgstr "Stel in op niet-printbaar" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 +msgid "World coordinates" +msgstr "Wereldcoördinaten" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106 +msgid "Local coordinates" +msgstr "Lokale coördinaten" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82 +msgid "Select coordinate space, in which the transformation will be performed." +msgstr "" +"Stel een coördinatenstelsel in. Hierin wordt de verandering uitgevoerd." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:641 +msgid "Object name" +msgstr "Objectnaam" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457 +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 +msgid "Rotation" +msgstr "Rotatie" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 +#, c-format +msgid "Toggle %c axis mirroring" +msgstr "Zet %c-asspiegeling aan" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297 +msgid "Set Mirror" +msgstr "Stel spiegeling in" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349 +msgid "Drop to bed" +msgstr "Plaats op het bed" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 +msgid "Reset rotation" +msgstr "Reset rotatie" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 +msgid "Reset Rotation" +msgstr "Reset rotatie" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 +msgid "Reset scale" +msgstr "Reset verschaling" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 +msgid "Scale factors" +msgstr "Verschalingsfactoren" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 +msgid "Translate" +msgstr "Verplaats" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578 +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 +msgid "Set Position" +msgstr "Stel positie in" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781 +msgid "Set Orientation" +msgstr "Stel oriëntatie in" + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846 +msgid "Set Scale" +msgstr "Stel verschaling in" + +#: 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 "" +"Het huidige aangepaste object is gekanteld (rotatiehoeken zijn geen " +"veelvouden van 90°).\n" +"Niet-gelijke verschaling van gekantelde objecten is alleen mogelijk in het " +"wereldcoördinatensysteem\n" +"als de rotatie is ingebouwd in de objectcoördinaten." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878 +msgid "" +"This operation is irreversible.\n" +"Do you want to proceed?" +msgstr "" +"Deze bewerking werkt onomkeerbaar.\n" +"Weet u zeker dat u wilt doorgaan?" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59 +msgid "Additional Settings" +msgstr "Extra instellingen" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95 +msgid "Remove parameter" +msgstr "Verwijder parameter" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 +#, c-format +msgid "Delete Option %s" +msgstr "Verwijder optie %s" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 +#, c-format +msgid "Change Option %s" +msgstr "Wijzig optie %s" + +#: src/slic3r/GUI/GUI_Preview.cpp:218 +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 +msgid "Height" +msgstr "Hoogte" + +#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238 +msgid "Width" +msgstr "Breedte" + +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1512 +msgid "Fan speed" +msgstr "Ventilatorsnelheid" + +#: src/slic3r/GUI/GUI_Preview.cpp:226 +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 +msgid "Show" +msgstr "Toon" + +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235 +msgid "Feature types" +msgstr "Featuretypes" + +#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:310 +msgid "Perimeter" +msgstr "Perimeter" + +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311 +msgid "External perimeter" +msgstr "Buitenste perimeter" + +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312 +msgid "Overhang perimeter" +msgstr "Overhangende perimeter" + +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313 +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 +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 +msgid "Top solid infill" +msgstr "Bovenste dichte vulling" + +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316 +msgid "Bridge infill" +msgstr "Brugvulling" + +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/PrintConfig.cpp:918 +msgid "Gap fill" +msgstr "Gatenvulling" + +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1171 +#: src/libslic3r/ExtrusionEntity.cpp:318 +msgid "Skirt" +msgstr "Skirt" + +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/libslic3r/PrintConfig.cpp:1991 +msgid "Support material interface" +msgstr "Supportinterface" + +#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1251 +#: src/libslic3r/ExtrusionEntity.cpp:321 +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:254 +msgid "Retractions" +msgstr "Retracties" + +#: src/slic3r/GUI/GUI_Preview.cpp:255 +msgid "Unretractions" +msgstr "Deretracties" + +#: src/slic3r/GUI/GUI_Preview.cpp:256 +msgid "Shells" +msgstr "Shells" + +#: src/slic3r/GUI/GUI_Preview.cpp:257 +msgid "Legend" +msgstr "Legenda" + +#: src/slic3r/GUI/Job.hpp:123 +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 +msgid "Keyboard Shortcuts" +msgstr "Sneltoetsen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +msgid "New project, clear plater" +msgstr "Start nieuw project, verwijder modellen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +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 +msgid "Save project (3mf)" +msgstr "3MF-project opslaan" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +msgid "Save project as (3mf)" +msgstr "3MF-project opslaan als" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 +msgid "(Re)slice" +msgstr "(Her)slice" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +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 +msgid "Import Config from ini/amf/3mf/gcode" +msgstr "Importeer configuratie van INI-, AMF-, 3MF- of gcode-bestand" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +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 +msgid "Export G-code" +msgstr "Exporteer gcode-bestand" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5547 +msgid "Send G-code" +msgstr "Stuur G-code" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +msgid "Export config" +msgstr "Exporteer configuratie" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 src/slic3r/GUI/Plater.cpp:885 +msgid "Export to SD card / Flash drive" +msgstr "Exporteer naar SD-kaart / USB-stick" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Eject SD card / Flash drive" +msgstr "SD-kaart/USB-stick uitwerpen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +msgid "Select all objects" +msgstr "Selecteer alle objecten" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 +msgid "Deselect all" +msgstr "Deselecteer alles" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 +msgid "Delete selected" +msgstr "Deselecteer selectie" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +msgid "Copy to clipboard" +msgstr "Kopieer naar klembord" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +msgid "Paste from clipboard" +msgstr "Plak van klembord" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 +msgid "Reload plater from disk" +msgstr "Herlaad modellen van schijf" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 +msgid "Select Plater Tab" +msgstr "Selecteer 3D-weergave" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +msgid "Select Print Settings Tab" +msgstr "Selecteer printinstellingentab" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +msgid "Select Filament Settings Tab" +msgstr "Selecteer filamentinstellingentab" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +msgid "Select Printer Settings Tab" +msgstr "Selecteer printerinstellingentab" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +msgid "Switch to 3D" +msgstr "Schakel over naar 3D" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +msgid "Switch to Preview" +msgstr "Schakel over naar voorbeeldweergave" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/PrintHostDialogs.cpp:136 +msgid "Print host upload queue" +msgstr "Printhost uploadwachtrij" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +msgid "Camera view" +msgstr "Weergave" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +msgid "Show/Hide object/instance labels" +msgstr "Toon/verberg objecten- of instantielabels" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 src/slic3r/GUI/Preferences.cpp:10 +msgid "Preferences" +msgstr "Voorkeuren" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +msgid "Show keyboard shortcuts list" +msgstr "Toon lijst met sneltoetsen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 +msgid "Commands" +msgstr "Commando's" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:161 +msgid "Add Instance of the selected object" +msgstr "Voeg instantie van het geselecteerde object toe" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +msgid "Remove Instance of the selected object" +msgstr "Verwijder instanties van het geselecteerde object" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:163 +msgid "" +"Press to select multiple objects\n" +"or move multiple objects with mouse" +msgstr "" +"Druk om meerdere objecten te selecteren\n" +"of beweeg meerdere objecten met de muis" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +msgid "Press to activate selection rectangle" +msgstr "Druk om selectiebox te activeren" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +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 +msgid "Arrow Up" +msgstr "Pijltje naar boven" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +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 +msgid "Arrow Down" +msgstr "Pijltje naar beneden" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +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 +msgid "Arrow Left" +msgstr "Pijltje naar links" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +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 +msgid "Arrow Right" +msgstr "Pijltje naar rechts" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +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 +msgid "Any arrow" +msgstr "Elke pijl" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Movement step set to 1 mm" +msgstr "Verplaatsingsstap instellen op 1 mm" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +msgid "Movement in camera space" +msgstr "Verplaatsing in cameraruimte" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +msgid "Page Up" +msgstr "Page Up" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 +msgid "Rotate selection 45 degrees CCW" +msgstr "Roteer selectie 45° tegen de klok in" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +msgid "Page Down" +msgstr "Page Down" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +msgid "Rotate selection 45 degrees CW" +msgstr "Roteer selectie 45° met de klok mee" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +msgid "Gizmo move" +msgstr "Verplaats" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 +msgid "Gizmo scale" +msgstr "Verschaal" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 +msgid "Gizmo rotate" +msgstr "Roteer" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +msgid "Gizmo cut" +msgstr "Snijden" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 +msgid "Gizmo Place face on bed" +msgstr "Plaats vlak op bed" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Gizmo SLA hollow" +msgstr "SLA uithollen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 +msgid "Gizmo SLA support points" +msgstr "SLA-supportpunten" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 +msgid "Unselect gizmo or clear selection" +msgstr "Deselecteer bewerker of selectie" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +msgid "Change camera type (perspective, orthographic)" +msgstr "Wijzig weergavetype (perspectief of orthografisch)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +msgid "Zoom to Bed" +msgstr "Zoom in op bed" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +msgid "" +"Zoom to selected object\n" +"or all objects in scene, if none selected" +msgstr "" +"Zoom in op geselecteerde objecten\n" +"of alle objecten in de 3D-weergave als niets is geselecteerd" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +msgid "Zoom in" +msgstr "Zoom in" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:186 +msgid "Zoom out" +msgstr "Zoom uit" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +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 +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" +msgstr "" +"Druk om stapsgewijs per 5% te verschalen\n" +"of om per 1 mm te verplaatsen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:198 +msgid "" +"Scale selection to fit print volume\n" +"in Gizmo scale" +msgstr "" +"Zorg dat selectie past in het printvolume\n" +"door deze te verschalen" + +#: 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:200 +msgid "" +"Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\n" +"selected objects around their own center" +msgstr "" +"Druk om de selectie te verschalen of roteren\n" +"om hun eigen middelpunt" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:203 +msgid "Gizmos" +msgstr "Bewerkers" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +msgid "Upper Layer" +msgstr "Bovenste laag" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:209 +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:213 src/slic3r/GUI/Plater.cpp:4157 +#: src/slic3r/GUI/Tab.cpp:2374 +msgid "Preview" +msgstr "Voorbeeldweergave" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 +msgid "Move current slider thumb Up" +msgstr "Verplaats huidige schuif naar boven" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 +msgid "Move current slider thumb Down" +msgstr "Verplaats huidige schuif naar beneden" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:218 +msgid "Set upper thumb to current slider thumb" +msgstr "Stel de bovenste schuif in op het huidige punt" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 +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:221 +msgid "Delete color change marker for current layer" +msgstr "Verwijder kleurwisseling voor de huidige laag" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:224 +msgid "Layers Slider" +msgstr "Schuif voor lagen" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:247 +msgid "Keyboard shortcuts" +msgstr "Sneltoetsen" + +#: src/slic3r/GUI/MainFrame.cpp:67 +msgid "" +" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/" +"releases" +msgstr "" +" - Vergeet niet op updates te checken op http://github.com/prusa3d/" +"PrusaSlicer/releases" + +#: src/slic3r/GUI/MainFrame.cpp:192 +msgid "based on Slic3r" +msgstr "gebaseerd op Slic3r" + +#: src/slic3r/GUI/MainFrame.cpp:444 +msgid "&New Project" +msgstr "Nieuw project" + +#: src/slic3r/GUI/MainFrame.cpp:444 +msgid "Start a new project" +msgstr "Start nieuw project" + +#: src/slic3r/GUI/MainFrame.cpp:447 +msgid "&Open Project" +msgstr "Open project" + +#: src/slic3r/GUI/MainFrame.cpp:447 +msgid "Open a project file" +msgstr "Open een projectbestand" + +#: src/slic3r/GUI/MainFrame.cpp:452 +msgid "Recent projects" +msgstr "Huidige projecten" + +#: 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 "" +"Het geselecteerde project is niet langer beschikbaar.\n" +"Wilt u 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 +msgid "Error" +msgstr "Fout" + +#: src/slic3r/GUI/MainFrame.cpp:486 +msgid "&Save Project" +msgstr "Project opslaan" + +#: src/slic3r/GUI/MainFrame.cpp:486 +msgid "Save current project file" +msgstr "Projectbestand opslaan" + +#: src/slic3r/GUI/MainFrame.cpp:490 src/slic3r/GUI/MainFrame.cpp:492 +msgid "Save Project &as" +msgstr "Project opslaan als" + +#: src/slic3r/GUI/MainFrame.cpp:490 src/slic3r/GUI/MainFrame.cpp:492 +msgid "Save current project file as" +msgstr "Projectbestand opslaan als" + +#: src/slic3r/GUI/MainFrame.cpp:500 +msgid "Import STL/OBJ/AM&F/3MF" +msgstr "Importeer STL-, OBJ-, AMF- of 3MF-bestanden" + +#: src/slic3r/GUI/MainFrame.cpp:500 +msgid "Load a model" +msgstr "Laad een model" + +#: src/slic3r/GUI/MainFrame.cpp:504 +msgid "Import &Config" +msgstr "Importeer configuratiebestand" + +#: src/slic3r/GUI/MainFrame.cpp:504 +msgid "Load exported configuration file" +msgstr "Laad geëxporteerd configuratiebestand" + +#: src/slic3r/GUI/MainFrame.cpp:507 +msgid "Import Config from &project" +msgstr "Importeer configuratie van projectbestand" + +#: src/slic3r/GUI/MainFrame.cpp:507 +msgid "Load configuration from project file" +msgstr "Laad configuratie van projectbestand" + +#: src/slic3r/GUI/MainFrame.cpp:511 +msgid "Import Config &Bundle" +msgstr "Importeer configuratiebundel" + +#: src/slic3r/GUI/MainFrame.cpp:511 +msgid "Load presets from a bundle" +msgstr "Laad presets van een bundel" + +#: src/slic3r/GUI/MainFrame.cpp:514 +msgid "&Import" +msgstr "Importeer" + +#: src/slic3r/GUI/MainFrame.cpp:517 src/slic3r/GUI/MainFrame.cpp:796 +msgid "Export &G-code" +msgstr "Exporteer G-code" + +#: src/slic3r/GUI/MainFrame.cpp:517 +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 +msgid "S&end G-code" +msgstr "Stuur G-code" + +#: src/slic3r/GUI/MainFrame.cpp:521 +msgid "Send to print current plate as G-code" +msgstr "Stuur huidige weergave als G-code" + +#: src/slic3r/GUI/MainFrame.cpp:525 +msgid "Export G-code to SD card / Flash drive" +msgstr "Exporteer G-code naar SD-kaart/USB-stick" + +#: src/slic3r/GUI/MainFrame.cpp:525 +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 +msgid "Export plate as &STL" +msgstr "Exporteer modellen als STL-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:529 +msgid "Export current plate as STL" +msgstr "Exporteer modellen als STL-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:532 +msgid "Export plate as STL &including supports" +msgstr "Exporteer modellen met support als STL-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:532 +msgid "Export current plate as STL including supports" +msgstr "Exporteer modellen met support als STL-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:535 +msgid "Export plate as &AMF" +msgstr "Exporteer modellen als AMF-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:535 +msgid "Export current plate as AMF" +msgstr "Exporteer modellen als AMF-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:539 +msgid "Export &toolpaths as OBJ" +msgstr "Exporteer paden als OBJ-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:539 +msgid "Export toolpaths as OBJ" +msgstr "Exporteer toolpaden als OBJ-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:543 +msgid "Export &Config" +msgstr "Exporteer configuratie" + +#: src/slic3r/GUI/MainFrame.cpp:543 +msgid "Export current configuration to file" +msgstr "Exporteer huidige configuratie naar bestand" + +#: src/slic3r/GUI/MainFrame.cpp:546 +msgid "Export Config &Bundle" +msgstr "Exporteer configuratiebundel" + +#: src/slic3r/GUI/MainFrame.cpp:546 +msgid "Export all presets to file" +msgstr "Exporteer alle presets naar bestand" + +#: src/slic3r/GUI/MainFrame.cpp:549 +msgid "&Export" +msgstr "Exporteer" + +#: src/slic3r/GUI/MainFrame.cpp:551 +msgid "Ejec&t SD card / Flash drive" +msgstr "SD-kaart/USB-stick uitwerpen" + +#: src/slic3r/GUI/MainFrame.cpp:551 +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 +msgid "Quick Slice" +msgstr "Snel slicen" + +#: src/slic3r/GUI/MainFrame.cpp:559 +msgid "Slice a file into a G-code" +msgstr "Slice naar een gcode-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:565 +msgid "Quick Slice and Save As" +msgstr "Snel slicen en opslaan als" + +#: src/slic3r/GUI/MainFrame.cpp:565 +msgid "Slice a file into a G-code, save as" +msgstr "Slice naar gcode-bestand, opslaan als" + +#: src/slic3r/GUI/MainFrame.cpp:571 +msgid "Repeat Last Quick Slice" +msgstr "Herhaal laatste snelle slice" + +#: src/slic3r/GUI/MainFrame.cpp:571 +msgid "Repeat last quick slice" +msgstr "Herhaal laatste snelle slice" + +#: src/slic3r/GUI/MainFrame.cpp:579 +msgid "(Re)Slice No&w" +msgstr "(Her)slice nu" + +#: src/slic3r/GUI/MainFrame.cpp:579 +msgid "Start new slicing process" +msgstr "Start nieuw sliceproces" + +#: src/slic3r/GUI/MainFrame.cpp:583 +msgid "&Repair STL file" +msgstr "Repareer STL-bestand" + +#: src/slic3r/GUI/MainFrame.cpp:583 +msgid "Automatically repair an STL file" +msgstr "Automatisch een STL-bestand repareren" + +#: src/slic3r/GUI/MainFrame.cpp:587 +msgid "&Quit" +msgstr "Afsluiten" + +#: src/slic3r/GUI/MainFrame.cpp:587 +#, c-format +msgid "Quit %s" +msgstr "%s afsluiten" + +#: src/slic3r/GUI/MainFrame.cpp:612 +msgid "&Select all" +msgstr "Selecteer alles" + +#: src/slic3r/GUI/MainFrame.cpp:613 +msgid "Selects all objects" +msgstr "Selecteer alle objecten" + +#: src/slic3r/GUI/MainFrame.cpp:615 +msgid "D&eselect all" +msgstr "Deselecteer alles" + +#: src/slic3r/GUI/MainFrame.cpp:616 +msgid "Deselects all objects" +msgstr "Deselecteer alle objecten" + +#: src/slic3r/GUI/MainFrame.cpp:619 +msgid "&Delete selected" +msgstr "Deselecteer selectie" + +#: src/slic3r/GUI/MainFrame.cpp:620 +msgid "Deletes the current selection" +msgstr "Verwijdert huidige selectie" + +#: src/slic3r/GUI/MainFrame.cpp:622 +msgid "Delete &all" +msgstr "Verwijder alles" + +#: src/slic3r/GUI/MainFrame.cpp:623 +msgid "Deletes all objects" +msgstr "Verwijdert alle objecten" + +#: src/slic3r/GUI/MainFrame.cpp:627 +msgid "&Undo" +msgstr "Ongedaan maken" + +#: src/slic3r/GUI/MainFrame.cpp:630 +msgid "&Redo" +msgstr "Opnieuw doen" + +#: src/slic3r/GUI/MainFrame.cpp:635 +msgid "&Copy" +msgstr "Kopieer" + +#: src/slic3r/GUI/MainFrame.cpp:636 +msgid "Copy selection to clipboard" +msgstr "Kopieer selectie naar klembord" + +#: src/slic3r/GUI/MainFrame.cpp:638 +msgid "&Paste" +msgstr "Plak" + +#: src/slic3r/GUI/MainFrame.cpp:639 +msgid "Paste clipboard" +msgstr "Plak van klembord" + +#: src/slic3r/GUI/MainFrame.cpp:643 +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:653 +msgid "&Plater Tab" +msgstr "Tabblad 3D-weergave" + +#: src/slic3r/GUI/MainFrame.cpp:653 +msgid "Show the plater" +msgstr "Toon de 3D-weergave" + +#: src/slic3r/GUI/MainFrame.cpp:661 +msgid "P&rint Settings Tab" +msgstr "Tabblad printinstellingen" + +#: src/slic3r/GUI/MainFrame.cpp:661 +msgid "Show the print settings" +msgstr "Toon de printinstellingen" + +#: src/slic3r/GUI/MainFrame.cpp:664 src/slic3r/GUI/MainFrame.cpp:799 +msgid "&Filament Settings Tab" +msgstr "Tabblad filamentinstellingen" + +#: src/slic3r/GUI/MainFrame.cpp:664 +msgid "Show the filament settings" +msgstr "Toon de filamentinstellingen" + +#: src/slic3r/GUI/MainFrame.cpp:668 +msgid "Print&er Settings Tab" +msgstr "Tabblad printerinstellingen" + +#: src/slic3r/GUI/MainFrame.cpp:668 +msgid "Show the printer settings" +msgstr "Toon de printerinstellingen" + +#: src/slic3r/GUI/MainFrame.cpp:673 +msgid "3&D" +msgstr "3D-bewerkingsweergave" + +#: src/slic3r/GUI/MainFrame.cpp:673 +msgid "Show the 3D editing view" +msgstr "Toon de 3D-bewerkingsweergave" + +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Pre&view" +msgstr "Voorbeeldweergave" + +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Show the 3D slices preview" +msgstr "Toon de 3D-weergave van de slice" + +#: src/slic3r/GUI/MainFrame.cpp:695 +msgid "Print &Host Upload Queue" +msgstr "Printhost uploadwachtrij" + +#: src/slic3r/GUI/MainFrame.cpp:695 +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 +msgid "Show &labels" +msgstr "Toon labels" + +#: src/slic3r/GUI/MainFrame.cpp:723 +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: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: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 +msgid "&File" +msgstr "Bestand" + +#: src/slic3r/GUI/MainFrame.cpp:769 +msgid "&Edit" +msgstr "Bewerk" + +#: src/slic3r/GUI/MainFrame.cpp:770 +msgid "&Window" +msgstr "Venster" + +#: src/slic3r/GUI/MainFrame.cpp:771 +msgid "&View" +msgstr "Toon" + +#: src/slic3r/GUI/MainFrame.cpp:774 +msgid "&Help" +msgstr "Help" + +#: src/slic3r/GUI/MainFrame.cpp:796 +msgid "E&xport" +msgstr "Exporteer" + +#: src/slic3r/GUI/MainFrame.cpp:797 +msgid "S&end to print" +msgstr "Stuur om te printen" + +#: src/slic3r/GUI/MainFrame.cpp:799 +msgid "Mate&rial Settings Tab" +msgstr "Materiaalinstellingentab" + +#: src/slic3r/GUI/MainFrame.cpp:820 +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 +msgid "No previously sliced file." +msgstr "Niet eerder gesliced bestand." + +#: src/slic3r/GUI/MainFrame.cpp:837 +msgid "Previously sliced file (" +msgstr "Eerder gesliced bestand (" + +#: src/slic3r/GUI/MainFrame.cpp:837 +msgid ") not found." +msgstr ") niet gevonden." + +#: src/slic3r/GUI/MainFrame.cpp:838 +msgid "File Not Found" +msgstr "Bestand niet gevonden" + +#: src/slic3r/GUI/MainFrame.cpp:873 +#, c-format +msgid "Save %s file as:" +msgstr "%s-bestand opslaan als:" + +#: src/slic3r/GUI/MainFrame.cpp:873 +msgid "SVG" +msgstr "SVG" + +#: src/slic3r/GUI/MainFrame.cpp:873 +msgid "G-code" +msgstr "G-code" + +#: src/slic3r/GUI/MainFrame.cpp:885 +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 +msgid "Slicing" +msgstr "Slicen" + +#. TRN "Processing input_file_basename" +#: src/slic3r/GUI/MainFrame.cpp:896 +#, 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:921 +msgid "Slicing Done!" +msgstr "Slicen klaar!" + +#: src/slic3r/GUI/MainFrame.cpp:936 +msgid "Select the STL file to repair:" +msgstr "Selecteer het STL-bestand om te repareren:" + +#: src/slic3r/GUI/MainFrame.cpp:946 +msgid "Save OBJ file (less prone to coordinate errors than STL) as:" +msgstr "OBJ-bestand opslaan als:" + +#: src/slic3r/GUI/MainFrame.cpp:958 +msgid "Your file was repaired." +msgstr "Het bestand is gerepareerd." + +#: src/slic3r/GUI/MainFrame.cpp:958 src/libslic3r/PrintConfig.cpp:3457 +msgid "Repair" +msgstr "Repareer" + +#: src/slic3r/GUI/MainFrame.cpp:972 +msgid "Save configuration as:" +msgstr "Configuratie opslaan als:" + +#: src/slic3r/GUI/MainFrame.cpp:991 src/slic3r/GUI/MainFrame.cpp:1053 +msgid "Select configuration to load:" +msgstr "Selecteer configuratie om te laden:" + +#: src/slic3r/GUI/MainFrame.cpp:1027 +msgid "Save presets bundle as:" +msgstr "Presetbundel opslaan als:" + +#: src/slic3r/GUI/MainFrame.cpp:1074 +#, c-format +msgid "%d presets successfully imported." +msgstr "%d presets succesvol geïmporteerd." + +#: src/slic3r/GUI/Mouse3DController.cpp:239 +msgid "3Dconnexion settings" +msgstr "3Dconnexion-instellingen" + +#: src/slic3r/GUI/Mouse3DController.cpp:254 +msgid "Device:" +msgstr "Apparaat:" + +#: src/slic3r/GUI/Mouse3DController.cpp:261 +msgid "Speed:" +msgstr "Snelheid:" + +#: src/slic3r/GUI/Mouse3DController.cpp:265 +#: src/slic3r/GUI/Mouse3DController.cpp:288 +msgid "Translation" +msgstr "Verplaatsing" + +#: src/slic3r/GUI/Mouse3DController.cpp:277 +#: src/slic3r/GUI/Mouse3DController.cpp:288 +msgid "Zoom" +msgstr "Zoom" + +#: src/slic3r/GUI/Mouse3DController.cpp:284 +msgid "Deadzone:" +msgstr "Deadzone:" + +#: src/slic3r/GUI/MsgDialog.cpp:73 +#, c-format +msgid "%s error" +msgstr "%s fout" + +#: src/slic3r/GUI/MsgDialog.cpp:74 +#, c-format +msgid "%s has encountered an error" +msgstr "%s heeft een fout veroorzaakt" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:56 +msgid "Instances" +msgstr "Instanties" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:60 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:216 +#, 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 +msgid "Layers" +msgstr "Lagen" + +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 +msgid "Range" +msgstr "Bereik" + +#: src/slic3r/GUI/OptionsGroup.cpp:274 +msgctxt "Layers" +msgid "Top" +msgstr "Bovenkant" + +#: src/slic3r/GUI/OptionsGroup.cpp:274 +msgctxt "Layers" +msgid "Bottom" +msgstr "Onderkant" + +#: src/slic3r/GUI/Plater.cpp:161 +msgid "Volume" +msgstr "Volume" + +#: src/slic3r/GUI/Plater.cpp:162 +msgid "Facets" +msgstr "Vlakken" + +#: src/slic3r/GUI/Plater.cpp:163 +msgid "Materials" +msgstr "Materialen" + +#: src/slic3r/GUI/Plater.cpp:166 +msgid "Manifold" +msgstr "Gesloten model" + +#: src/slic3r/GUI/Plater.cpp:216 +msgid "Sliced Info" +msgstr "Slice info" + +#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1234 +msgid "Used Filament (m)" +msgstr "Filamentverbruik (m)" + +#: src/slic3r/GUI/Plater.cpp:236 +msgid "Used Filament (mm³)" +msgstr "Filamentverbruik (mm³)" + +#: src/slic3r/GUI/Plater.cpp:237 +msgid "Used Filament (g)" +msgstr "Filamentverbruik (g)" + +#: src/slic3r/GUI/Plater.cpp:238 +msgid "Used Material (unit)" +msgstr "Materiaalverbruik (eenheid)" + +#: src/slic3r/GUI/Plater.cpp:239 +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 +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 +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 +msgid "Support on build plate only" +msgstr "Support alleen op het bed" + +#: src/slic3r/GUI/Plater.cpp:506 src/slic3r/GUI/Plater.cpp:629 +msgid "For support enforcers only" +msgstr "Alleen voor supportforceringen" + +#: src/slic3r/GUI/Plater.cpp:507 +msgid "Everywhere" +msgstr "Overal" + +#: src/slic3r/GUI/Plater.cpp:539 src/slic3r/GUI/Tab.cpp:1177 +msgid "Brim" +msgstr "Brim" + +#: src/slic3r/GUI/Plater.cpp:541 +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 +msgid "Purging volumes" +msgstr "Afveegvolume" + +#: src/slic3r/GUI/Plater.cpp:643 +msgid "Select what kind of pad do you need" +msgstr "Selecteer welk soort basisplaat nodig is" + +#: src/slic3r/GUI/Plater.cpp:645 +msgid "Below object" +msgstr "Onder het object" + +#: src/slic3r/GUI/Plater.cpp:646 +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 +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 +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 +msgid "Slice now" +msgstr "Slice nu" + +#: src/slic3r/GUI/Plater.cpp:1047 +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 +#, c-format +msgid "%d (%d shells)" +msgstr "%d (%d shells)" + +#: src/slic3r/GUI/Plater.cpp:1162 +#, c-format +msgid "Auto-repaired (%d errors)" +msgstr "Automatisch gerepareerd (%d fouten)" + +#: src/slic3r/GUI/Plater.cpp:1165 +#, 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 " +"vlakken toegevoegd, %d vlakken omgekeerd, %d randen omgekeerd" + +#: src/slic3r/GUI/Plater.cpp:1175 +msgid "Yes" +msgstr "JA" + +#: src/slic3r/GUI/Plater.cpp:1196 +msgid "Used Material (ml)" +msgstr "Materiaalgebruik (ml)" + +#: src/slic3r/GUI/Plater.cpp:1199 +msgid "object(s)" +msgstr "object(en)" + +#: src/slic3r/GUI/Plater.cpp:1199 +msgid "supports and pad" +msgstr "support en basisplaat" + +#: src/slic3r/GUI/Plater.cpp:1236 src/slic3r/GUI/Plater.cpp:1250 +msgid "objects" +msgstr "objecten" + +#: src/slic3r/GUI/Plater.cpp:1236 src/slic3r/GUI/Plater.cpp:1250 +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:1265 src/libslic3r/PrintConfig.cpp:582 +msgid "Color" +msgstr "Kleur" + +#: src/slic3r/GUI/Plater.cpp:1266 +msgid "Pause" +msgstr "Pauzeer" + +#: src/slic3r/GUI/Plater.cpp:1291 +msgid "normal mode" +msgstr "normale modus" + +#: src/slic3r/GUI/Plater.cpp:1296 +msgid "stealth mode" +msgstr "stille modus" + +#: src/slic3r/GUI/Plater.cpp:1400 +msgid "Load File" +msgstr "Laad bestand" + +#: src/slic3r/GUI/Plater.cpp:1404 +msgid "Load Files" +msgstr "Laad bestanden" + +#: src/slic3r/GUI/Plater.cpp:2196 +#, c-format +msgid "" +"Unmounting successful. 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." + +#: src/slic3r/GUI/Plater.cpp:2204 +msgid "New Project" +msgstr "Nieuw project" + +#: src/slic3r/GUI/Plater.cpp:2325 +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: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: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:2409 +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 "" +"Dit bestand bevat meerdere objecten die op meerdere hoogten zijn " +"gepositioneerd.\n" +"Moet dit bestand beschouwd worden als een enkel object met meerdere " +"onderdelen\n" +"in plaats van als meerdere objecten?" + +#: src/slic3r/GUI/Plater.cpp:2412 src/slic3r/GUI/Plater.cpp:2465 +msgid "Multi-part object detected" +msgstr "Meerdelig object gedetecteerd" + +#: src/slic3r/GUI/Plater.cpp:2419 +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 " +"op geavanceerde modus?" + +#: src/slic3r/GUI/Plater.cpp:2420 +msgid "Detected advanced data" +msgstr "Geavanceerde data gedetecteerd" + +#: src/slic3r/GUI/Plater.cpp:2442 +#, 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 "" +"U kan geen objecten toevoegen van %s, omdat sommige daarvan meerdelig kunnen " +"zijn" + +#: src/slic3r/GUI/Plater.cpp:2462 +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 "" +"Meerdere objecten zijn geladen voor een multi-materialprinter.\n" +"Moeten deze objecten beschouwd worden als één object\n" +"met meerdere onderdelen, of als meerdere objecten?" + +#: src/slic3r/GUI/Plater.cpp:2478 +msgid "Loaded" +msgstr "Geladen" + +#: src/slic3r/GUI/Plater.cpp:2580 +msgid "" +"Your object appears to be too large, so it was automatically scaled down to " +"fit your print bed." +msgstr "" +"Het object is te groot. Daarom is het automatisch verschaald tot de grootte " +"van het printbed." + +#: src/slic3r/GUI/Plater.cpp:2581 +msgid "Object too large?" +msgstr "Object te groot?" + +#: src/slic3r/GUI/Plater.cpp:2643 +msgid "Export STL file:" +msgstr "Exporteer STL-bestand:" + +#: src/slic3r/GUI/Plater.cpp:2650 +msgid "Export AMF file:" +msgstr "Exporteer AMF-bestand:" + +#: src/slic3r/GUI/Plater.cpp:2656 +msgid "Save file as:" +msgstr "Bestand opslaan als:" + +#: src/slic3r/GUI/Plater.cpp:2662 +msgid "Export OBJ file:" +msgstr "Exporteer OBJ-bestand:" + +#: src/slic3r/GUI/Plater.cpp:2764 +msgid "Delete Object" +msgstr "Verwijder object" + +#: src/slic3r/GUI/Plater.cpp:2775 +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 +msgid "" +"The selected object can't be split because it contains more than one volume/" +"material." +msgstr "" +"Het geselecteerde object kan niet opgedeeld worden omdat het meer dan één " +"volume bevat." + +#: src/slic3r/GUI/Plater.cpp:3038 +msgid "Split to Objects" +msgstr "Splits op naar objecten" + +#: src/slic3r/GUI/Plater.cpp:3163 +msgid "Invalid data" +msgstr "Ongeldige data" + +#: src/slic3r/GUI/Plater.cpp:3172 +msgid "Ready to slice" +msgstr "Klaar om te slicen" + +#: src/slic3r/GUI/Plater.cpp:3210 src/slic3r/GUI/PrintHostDialogs.cpp:232 +msgid "Cancelling" +msgstr "Annuleren" + +#: src/slic3r/GUI/Plater.cpp:3227 +msgid "Another export job is currently running." +msgstr "Een andere export loopt op dit moment." + +#: src/slic3r/GUI/Plater.cpp:3343 +msgid "Please select the file to reload" +msgstr "Selecteer het bestand om te herladen" + +#: src/slic3r/GUI/Plater.cpp:3378 +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 +msgid "Do you want to retry" +msgstr "Wilt u dit opnieuw proberen" + +#: src/slic3r/GUI/Plater.cpp:3396 +msgid "Reload from:" +msgstr "Herladen van:" + +#: src/slic3r/GUI/Plater.cpp:3485 +msgid "Unable to reload:" +msgstr "Niet in staat om te herladen:" + +#: src/slic3r/GUI/Plater.cpp:3490 +msgid "Error during reload" +msgstr "Fout tijdens herladen" + +#: src/slic3r/GUI/Plater.cpp:3509 +msgid "Reload all from disk" +msgstr "Herlaad alles van schijf" + +#: src/slic3r/GUI/Plater.cpp:3530 +msgid "Fix Throught NetFabb" +msgstr "Repareer met NetFabb" + +#: src/slic3r/GUI/Plater.cpp:3721 +msgid "Export failed" +msgstr "Exporteren mislukt" + +#: src/slic3r/GUI/Plater.cpp:3726 src/slic3r/GUI/PrintHostDialogs.cpp:233 +msgid "Cancelled" +msgstr "Geannuleerd" + +#: src/slic3r/GUI/Plater.cpp:3983 src/slic3r/GUI/Plater.cpp:4005 +msgid "Remove the selected object" +msgstr "Verwijder het geselecteerde object" + +#: src/slic3r/GUI/Plater.cpp:3992 +msgid "Add one more instance of the selected object" +msgstr "Voeg een instantie van het geselecteerde object toe" + +#: src/slic3r/GUI/Plater.cpp:3994 +msgid "Remove one instance of the selected object" +msgstr "Verwijder een instantie van het geselecteerde object" + +#: src/slic3r/GUI/Plater.cpp:3996 +msgid "Set number of instances" +msgstr "Stel aantal instanties in" + +#: src/slic3r/GUI/Plater.cpp:3996 +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 +msgid "Reload the selected object from disk" +msgstr "Herlaad het geselecteerde object van de schijf" + +#: src/slic3r/GUI/Plater.cpp:4018 +msgid "Export the selected object as STL file" +msgstr "Exporteer de geselecteerde objecten als STL-bestand" + +#: src/slic3r/GUI/Plater.cpp:4047 +msgid "Along X axis" +msgstr "Over de X-as" + +#: src/slic3r/GUI/Plater.cpp:4047 +msgid "Mirror the selected object along the X axis" +msgstr "Spiegel het geselecteerde object over de X-as" + +#: src/slic3r/GUI/Plater.cpp:4049 +msgid "Along Y axis" +msgstr "Over de Y-as" + +#: src/slic3r/GUI/Plater.cpp:4049 +msgid "Mirror the selected object along the Y axis" +msgstr "Spiegel het geselecteerde object over de Y-as" + +#: src/slic3r/GUI/Plater.cpp:4051 +msgid "Along Z axis" +msgstr "Over de Z-as" + +#: src/slic3r/GUI/Plater.cpp:4051 +msgid "Mirror the selected object along the Z axis" +msgstr "Spiegel het geselecteerde object over de Z-as" + +#: src/slic3r/GUI/Plater.cpp:4054 +msgid "Mirror" +msgstr "Spiegelen" + +#: src/slic3r/GUI/Plater.cpp:4054 +msgid "Mirror the selected object" +msgstr "Spiegel het geselecteerde object" + +#: src/slic3r/GUI/Plater.cpp:4066 +msgid "To objects" +msgstr "Aan objecten" + +#: src/slic3r/GUI/Plater.cpp:4066 src/slic3r/GUI/Plater.cpp:4086 +msgid "Split the selected object into individual objects" +msgstr "Verdeel het geselecteerde object in individuele objecten" + +#: src/slic3r/GUI/Plater.cpp:4068 +msgid "To parts" +msgstr "Aan onderdelen" + +#: src/slic3r/GUI/Plater.cpp:4068 src/slic3r/GUI/Plater.cpp:4100 +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 +msgid "Split" +msgstr "Verdeel" + +#: src/slic3r/GUI/Plater.cpp:4071 +msgid "Split the selected object" +msgstr "Verdeel het geselecteerde object" + +#: src/slic3r/GUI/Plater.cpp:4092 +msgid "Optimize orientation" +msgstr "Optimaliseer oriëntatie" + +#: src/slic3r/GUI/Plater.cpp:4092 +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 +msgid "3D editor view" +msgstr "3D bewerkingsweergave" + +#: src/slic3r/GUI/Plater.cpp:4456 +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." + +#: src/slic3r/GUI/Plater.cpp:4631 +msgid "Load Project" +msgstr "Laad project" + +#: src/slic3r/GUI/Plater.cpp:4659 +msgid "Import Object" +msgstr "Importeer object" + +#: src/slic3r/GUI/Plater.cpp:4663 +msgid "Import Objects" +msgstr "Importeer objecten" + +#: src/slic3r/GUI/Plater.cpp:4725 +msgid "All objects will be removed, continue?" +msgstr "Alle objecten worden verwijderd. Doorgaan?" + +#: src/slic3r/GUI/Plater.cpp:4733 +msgid "Delete Selected Objects" +msgstr "Verwijder geselecteerde objecten" + +#: src/slic3r/GUI/Plater.cpp:4741 +msgid "Increase Instances" +msgstr "Verhoog aantal instanties" + +#: src/slic3r/GUI/Plater.cpp:4776 +msgid "Decrease Instances" +msgstr "Verlaag aantal instanties" + +#: src/slic3r/GUI/Plater.cpp:4807 +msgid "Enter the number of copies:" +msgstr "Voer het aantal kopieën in:" + +#: src/slic3r/GUI/Plater.cpp:4808 +msgid "Copies of the selected object" +msgstr "Kopieën van het geselecteerde object" + +#: src/slic3r/GUI/Plater.cpp:4812 +#, c-format +msgid "Set numbers of copies to %d" +msgstr "Stel aantal kopieën in voor %d" + +#: src/slic3r/GUI/Plater.cpp:4842 +msgid "Cut by Plane" +msgstr "Snij met behulp van vlak" + +#: src/slic3r/GUI/Plater.cpp:4893 +msgid "Save G-code file as:" +msgstr "gcode-bestand opslaan als:" + +#: src/slic3r/GUI/Plater.cpp:4893 +msgid "Save SL1 file as:" +msgstr "SL1-bestand opslaan als:" + +#: src/slic3r/GUI/Plater.cpp:5028 +#, c-format +msgid "STL file exported to %s" +msgstr "STL-bestand geëxporteerd naar %s" + +#: src/slic3r/GUI/Plater.cpp:5045 +#, c-format +msgid "AMF file exported to %s" +msgstr "AMF-bestand geëxporteerd naar %s" + +#: src/slic3r/GUI/Plater.cpp:5048 +#, c-format +msgid "Error exporting AMF file %s" +msgstr "Fout bij het exporteren van AMF-bestand %s" + +#: src/slic3r/GUI/Plater.cpp:5081 +#, c-format +msgid "3MF file exported to %s" +msgstr "3MF-bestand geëxporteerd naar %s" + +#: src/slic3r/GUI/Plater.cpp:5086 +#, c-format +msgid "Error exporting 3MF file %s" +msgstr "Fout bij het exporteren van 3MF-bestand %s" + +#: src/slic3r/GUI/Plater.cpp:5546 +msgid "Export" +msgstr "Exporteer" + +#: src/slic3r/GUI/Plater.cpp:5632 +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 +msgid "General" +msgstr "Algemeen" + +#: src/slic3r/GUI/Preferences.cpp:39 +msgid "Remember output directory" +msgstr "Onthoud de opslaglocatie" + +#: src/slic3r/GUI/Preferences.cpp:41 +msgid "" +"If this is enabled, Slic3r will prompt the last output directory instead of " +"the one containing the input files." +msgstr "" +"Als dit aan staat zal PrusaSlicer de opslaglocatie gebruiken in plaats van " +"de originele locatie." + +#: src/slic3r/GUI/Preferences.cpp:47 +msgid "Auto-center parts" +msgstr "Centreer onderdelen automatisch" + +#: src/slic3r/GUI/Preferences.cpp:49 +msgid "" +"If this is enabled, Slic3r will auto-center objects around the print bed " +"center." +msgstr "" +"Als dit aan staat zal PrusaSlicer objecten automatisch centreren rond het " +"midden." + +#: src/slic3r/GUI/Preferences.cpp:55 +msgid "Background processing" +msgstr "Slicen op de achtergrond" + +#: src/slic3r/GUI/Preferences.cpp:57 +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 "" +"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 +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 "" +"Als dit aanstaat zal PrusaSlicer zelf controleren op nieuwe versies. Als een " +"nieuwe versie beschikbaar is, wordt een melding weergegeven bij de volgende " +"keer opstarten. Dit is slechts een melding; er wordt niets automatisch " +"geïnstalleerd." + +#: src/slic3r/GUI/Preferences.cpp:72 +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 +msgid "" +"If enabled, allows the Reload from disk command to automatically find and " +"load the files when invoked." +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 +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 " +"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." + +#: src/slic3r/GUI/Preferences.cpp:87 +msgid "Suppress \" - default - \" presets" +msgstr "Verberg standaardpresets" + +#: src/slic3r/GUI/Preferences.cpp:89 +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." + +#: src/slic3r/GUI/Preferences.cpp:95 +msgid "Show incompatible print and filament presets" +msgstr "Toon incompatibele print- en filamentpresets" + +#: src/slic3r/GUI/Preferences.cpp:97 +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" + +#: src/slic3r/GUI/Preferences.cpp:104 +msgid "Use Retina resolution for the 3D scene" +msgstr "Gebruik hoge resolutie voor de 3D-scène" + +#: src/slic3r/GUI/Preferences.cpp:106 +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 " +"optie mogelijk helpen." + +#: src/slic3r/GUI/Preferences.cpp:113 +msgid "Camera" +msgstr "Camera" + +#: src/slic3r/GUI/Preferences.cpp:119 +msgid "Use perspective camera" +msgstr "Gebruik perspectiefweergave" + +#: src/slic3r/GUI/Preferences.cpp:121 +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 +msgid "Use free camera" +msgstr "Gebruik vrij beweegbare camera" + +#: src/slic3r/GUI/Preferences.cpp:128 +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 +msgid "GUI" +msgstr "GUI" + +#: src/slic3r/GUI/Preferences.cpp:143 +msgid "Use custom size for toolbar icons" +msgstr "Aangepaste pictogramgrootte in de 3D-weergave" + +#: src/slic3r/GUI/Preferences.cpp:145 +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 +#, 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 +msgid "Icon size in a respect to the default size" +msgstr "Pictogramgrootte vergeleken met de originele grootte" + +#: src/slic3r/GUI/Preferences.cpp:237 +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/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 +msgid "System presets" +msgstr "Systeempresets" + +#: src/slic3r/GUI/Preset.cpp:1198 src/slic3r/GUI/Preset.cpp:1318 +#: src/slic3r/GUI/PresetBundle.cpp:1694 +msgid "User presets" +msgstr "Presets van de gebruiker" + +#: src/slic3r/GUI/Preset.cpp:1231 +msgid "Add/Remove materials" +msgstr "Verwijder of voeg materialen toe" + +#: src/slic3r/GUI/Preset.cpp:1233 +msgid "Add/Remove printers" +msgstr "Voeg toe/verwijder printers" + +#: src/slic3r/GUI/Preset.cpp:1552 +msgid "filament" +msgstr "filament" + +#: src/slic3r/GUI/Preset.cpp:1553 +msgid "SLA print" +msgstr "SLA-print" + +#: src/slic3r/GUI/PresetBundle.cpp:1721 +msgid "Add/Remove filaments" +msgstr "Verwijder of voeg filamenten toe" + +#: src/slic3r/GUI/PresetHints.cpp:29 +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 "" +"Als de geschatte laagtijd onder de ~%1%s komt, zal de ventilator draaien op " +"%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 +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 "" +"Als de geschatte laagtijd groter is, maar nog steeds onder de ~%1%s, zal de " +"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:48 +msgid "will always run at %1%%%" +msgstr "altijd draaien op %1%%%" + +#: src/slic3r/GUI/PresetHints.cpp:51 +msgid "except for the first %1% layers." +msgstr "behalve voor de eerste %1% lagen." + +#: src/slic3r/GUI/PresetHints.cpp:53 +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:156 +msgid "external perimeters" +msgstr "buitenperimeters" + +#: src/slic3r/GUI/PresetHints.cpp:165 +msgid "perimeters" +msgstr "perimeters" + +#: src/slic3r/GUI/PresetHints.cpp:174 +msgid "infill" +msgstr "vulling" + +#: src/slic3r/GUI/PresetHints.cpp:184 +msgid "solid infill" +msgstr "dichte vulling" + +#: src/slic3r/GUI/PresetHints.cpp:192 +msgid "top solid infill" +msgstr "bovenste dichte vulling" + +#: src/slic3r/GUI/PresetHints.cpp:203 +msgid "support" +msgstr "support" + +#: src/slic3r/GUI/PresetHints.cpp:213 +msgid "support interface" +msgstr "supportinterface" + +#: src/slic3r/GUI/PresetHints.cpp:219 +msgid "First layer volumetric" +msgstr "Eerste laag volumetrisch" + +#: src/slic3r/GUI/PresetHints.cpp:219 +msgid "Bridging volumetric" +msgstr "Volumetrische bruggen" + +#: src/slic3r/GUI/PresetHints.cpp:219 +msgid "Volumetric" +msgstr "Volumetrisch" + +#: src/slic3r/GUI/PresetHints.cpp:220 +msgid "flow rate is maximized" +msgstr "debiet is gemaximaliseerd" + +#: src/slic3r/GUI/PresetHints.cpp:223 +msgid "by the print profile maximum" +msgstr "door het printprofiel maximaal" + +#: src/slic3r/GUI/PresetHints.cpp:224 +msgid "when printing" +msgstr "tijdens het printen" + +#: src/slic3r/GUI/PresetHints.cpp:225 +msgid "with a volumetric rate" +msgstr "met een volumetrische ratio" + +#: src/slic3r/GUI/PresetHints.cpp:229 +#, 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 +msgid "" +"Recommended object thin wall thickness: Not available due to invalid layer " +"height." +msgstr "" +"Aanbevolen minimale wanddikte. Niet beschikbaar in verband met ongeldige " +"laagdikte." + +#: src/slic3r/GUI/PresetHints.cpp:263 +#, 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 +#, c-format +msgid "%d lines: %.2f mm" +msgstr "%d lijnen: %.2fmm" + +#: src/slic3r/GUI/PresetHints.cpp:274 +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 +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 +msgid "Top shell is %1% mm thick for layer height %2% mm." +msgstr "Topzijde is %1% mm dik bij een laagdikte van %2% mm." + +#: src/slic3r/GUI/PresetHints.cpp:320 +msgid "Minimum top shell thickness is %1% mm." +msgstr "Minimale dikte van de bovenzijde is %1% mm." + +#: src/slic3r/GUI/PresetHints.cpp:323 +msgid "Top is open." +msgstr "Bovenzijde is open." + +#: src/slic3r/GUI/PresetHints.cpp:336 +msgid "Bottom shell is %1% mm thick for layer height %2% mm." +msgstr "Bodemzijde is %1% mm dik bij een laagdikte van %2% mm." + +#: src/slic3r/GUI/PresetHints.cpp:339 +msgid "Minimum bottom shell thickness is %1% mm." +msgstr "Minimale dikte van onderzijde is %1% mm." + +#: src/slic3r/GUI/PresetHints.cpp:342 +msgid "Bottom is open." +msgstr "Onderzijde is open." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:33 +msgid "Send G-Code to printer host" +msgstr "Stuur G-code naar printerhost" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:33 +msgid "Upload to Printer Host with the following filename:" +msgstr "Upload naar printerhost met de volgende bestandsnaam:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:35 +msgid "Start printing after upload" +msgstr "Print starten na het uploaden" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:42 +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 +msgid "ID" +msgstr "ID" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:150 +msgid "Progress" +msgstr "Voortgang" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:151 +msgid "Status" +msgstr "Status" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:152 +msgid "Host" +msgstr "Host" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:153 +msgid "Filename" +msgstr "Bestandsnaam" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:154 +msgid "Error Message" +msgstr "Foutbericht" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:157 +msgid "Cancel selected" +msgstr "Annuleren geselecteerd" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:159 +msgid "Show error message" +msgstr "Toon foutbericht" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:198 +#: src/slic3r/GUI/PrintHostDialogs.cpp:229 +msgid "Enqueued" +msgstr "In de wachtrij geplaatst" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:230 +msgid "Uploading" +msgstr "Uploaden" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:234 +msgid "Completed" +msgstr "Voltooid" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:272 +msgid "Error uploading to print host:" +msgstr "Fout bij het uploaden naar de printhost:" + +#: src/slic3r/GUI/RammingChart.cpp:23 +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 +msgid "s" +msgstr "s" + +#: src/slic3r/GUI/RammingChart.cpp:81 +msgid "Volumetric speed" +msgstr "Volumetrische snelheid" + +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601 +#: src/libslic3r/PrintConfig.cpp:1250 +msgid "mm³/s" +msgstr "mm³/s" + +#: src/slic3r/GUI/Selection.cpp:147 +msgid "Selection-Add" +msgstr "Selectie - Voeg toe" + +#: src/slic3r/GUI/Selection.cpp:188 +msgid "Selection-Remove" +msgstr "Selectie - Verwijder" + +#: src/slic3r/GUI/Selection.cpp:220 +msgid "Selection-Add Object" +msgstr "Selectie - Voeg object toe" + +#: src/slic3r/GUI/Selection.cpp:239 +msgid "Selection-Remove Object" +msgstr "Selectie - Verwijder object" + +#: src/slic3r/GUI/Selection.cpp:257 +msgid "Selection-Add Instance" +msgstr "Selectie - Voeg instantie toe" + +#: src/slic3r/GUI/Selection.cpp:276 +msgid "Selection-Remove Instance" +msgstr "Selectie - Verwijder instantie" + +#: src/slic3r/GUI/Selection.cpp:377 +msgid "Selection-Add All" +msgstr "Selectie - Voeg alle toe" + +#: src/slic3r/GUI/Selection.cpp:403 +msgid "Selection-Remove All" +msgstr "Selectie - Verwijder alle" + +#: src/slic3r/GUI/Selection.cpp:940 +msgid "Scale To Fit" +msgstr "Verschaal tot het past" + +#: src/slic3r/GUI/Selection.cpp:1477 +msgid "Set Printable Instance" +msgstr "Stel printbare instanties in" + +#: src/slic3r/GUI/Selection.cpp:1477 +msgid "Set Unprintable Instance" +msgstr "Stel instantie in op niet-printbaar" + +#: src/slic3r/GUI/SysInfoDialog.cpp:78 +msgid "System Information" +msgstr "Systeeminformatie" + +#: src/slic3r/GUI/SysInfoDialog.cpp:154 +msgid "Copy to Clipboard" +msgstr "Kopieer van klembord" + +#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265 +msgid "Compatible printers" +msgstr "Compatibele printers" + +#: src/slic3r/GUI/Tab.cpp:51 +msgid "Select the printers this profile is compatible with." +msgstr "Selecteer de printers die compatibel met dit profiel zijn." + +#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280 +msgid "Compatible print profiles" +msgstr "Compatibele printprofielen" + +#: src/slic3r/GUI/Tab.cpp:57 +msgid "Select the print profiles this profile is compatible with." +msgstr "Selecteer de printprofielen die compatibel met dit profiel zijn." + +#. TRN "Save current Settings" +#: src/slic3r/GUI/Tab.cpp:133 +#, c-format +msgid "Save current %s" +msgstr "Huidige %s opslaan" + +#: src/slic3r/GUI/Tab.cpp:134 +msgid "Delete this preset" +msgstr "Verwijder preset" + +#: src/slic3r/GUI/Tab.cpp:139 +msgid "" +"Hover the cursor over buttons to find more information \n" +"or click this button." +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:963 +msgid "Detach from system preset" +msgstr "Ontkoppel van systeempreset" + +#: src/slic3r/GUI/Tab.cpp:975 +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 " +"ontkoppeld van het origineel." + +#: src/slic3r/GUI/Tab.cpp:976 +msgid "" +"The current custom preset will be detached from the parent system preset." +msgstr "De huidige custom preset wordt ontkoppeld van de originele preset." + +#: src/slic3r/GUI/Tab.cpp:979 +msgid "Modifications to the current profile will be saved." +msgstr "Aanpassingen aan het huidige profiel worden opgeslagen." + +#: src/slic3r/GUI/Tab.cpp:982 +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?" + +#: src/slic3r/GUI/Tab.cpp:984 +msgid "Detach preset" +msgstr "Ontkoppel preset" + +#: src/slic3r/GUI/Tab.cpp:1010 +msgid "This is a default preset." +msgstr "Dit is een standaard preset." + +#: src/slic3r/GUI/Tab.cpp:1012 +msgid "This is a system preset." +msgstr "Dit is een systeempreset." + +#: src/slic3r/GUI/Tab.cpp:1014 +msgid "Current preset is inherited from the default preset." +msgstr "Huidige preset is gebaseerd op de standaard preset." + +#: src/slic3r/GUI/Tab.cpp:1016 +msgid "Current preset is inherited from" +msgstr "Huidige preset is afgeleid van" + +#: src/slic3r/GUI/Tab.cpp:1020 +msgid "It can't be deleted or modified." +msgstr "Kan niet verwijderd of aangepast worden." + +#: src/slic3r/GUI/Tab.cpp:1021 +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." + +#: src/slic3r/GUI/Tab.cpp:1022 +msgid "To do that please specify a new name for the preset." +msgstr "Geef daarvoor een nieuwe naam aan de preset." + +#: src/slic3r/GUI/Tab.cpp:1026 +msgid "Additional information:" +msgstr "Additionele informatie:" + +#: src/slic3r/GUI/Tab.cpp:1032 +msgid "printer model" +msgstr "printermodel" + +#: src/slic3r/GUI/Tab.cpp:1040 +msgid "default print profile" +msgstr "standaard printprofiel" + +#: src/slic3r/GUI/Tab.cpp:1043 +msgid "default filament profile" +msgstr "standaard filamentprofiel" + +#: src/slic3r/GUI/Tab.cpp:1057 +msgid "default SLA material profile" +msgstr "standaard SLA-materiaalprofiel" + +#: src/slic3r/GUI/Tab.cpp:1061 +msgid "default SLA print profile" +msgstr "standaard SLA-printprofiel" + +#: src/slic3r/GUI/Tab.cpp:1069 +msgid "full profile name" +msgstr "volledige profielnaam" + +#: src/slic3r/GUI/Tab.cpp:1070 +msgid "symbolic profile name" +msgstr "symbolische profielnaam" + +#: src/slic3r/GUI/Tab.cpp:1108 src/slic3r/GUI/Tab.cpp:3654 +msgid "Layers and perimeters" +msgstr "Lagen en perimeters" + +#: src/slic3r/GUI/Tab.cpp:1113 +msgid "Vertical shells" +msgstr "Verticale shells" + +#: src/slic3r/GUI/Tab.cpp:1124 +msgid "Horizontal shells" +msgstr "Horizontale shells" + +#: src/slic3r/GUI/Tab.cpp:1125 src/libslic3r/PrintConfig.cpp:1780 +msgid "Solid layers" +msgstr "Dichte lagen" + +#: src/slic3r/GUI/Tab.cpp:1129 +msgid "Minimum shell thickness" +msgstr "Minimale shelldikte" + +#: src/slic3r/GUI/Tab.cpp:1140 +msgid "Quality (slower slicing)" +msgstr "Kwaliteit (slicen kan langer duren)" + +#: src/slic3r/GUI/Tab.cpp:1158 +msgid "Reducing printing time" +msgstr "Printtijd verkorten" + +#: src/slic3r/GUI/Tab.cpp:1170 +msgid "Skirt and brim" +msgstr "Skirt en brim" + +#: src/slic3r/GUI/Tab.cpp:1187 +msgid "Raft" +msgstr "Raft" + +#: src/slic3r/GUI/Tab.cpp:1191 +msgid "Options for support material and raft" +msgstr "Opties voor support en raft" + +#: src/slic3r/GUI/Tab.cpp:1206 +msgid "Speed for print moves" +msgstr "Snelheid voor printbewegingen" + +#: src/slic3r/GUI/Tab.cpp:1218 +msgid "Speed for non-print moves" +msgstr "Snelheid voor niet-print bewegingen" + +#: src/slic3r/GUI/Tab.cpp:1221 +msgid "Modifiers" +msgstr "Modificators" + +#: src/slic3r/GUI/Tab.cpp:1224 +msgid "Acceleration control (advanced)" +msgstr "Acceleraties (geavanceerd)" + +#: src/slic3r/GUI/Tab.cpp:1231 +msgid "Autospeed (advanced)" +msgstr "Automatische snelheid (geavanceerd)" + +#: src/slic3r/GUI/Tab.cpp:1239 +msgid "Multiple Extruders" +msgstr "Meerdere extruders" + +#: src/slic3r/GUI/Tab.cpp:1247 +msgid "Ooze prevention" +msgstr "Druippreventie" + +#: src/slic3r/GUI/Tab.cpp:1265 +msgid "Extrusion width" +msgstr "Extrusiebreedte" + +#: src/slic3r/GUI/Tab.cpp:1275 +msgid "Overlap" +msgstr "Overlapping" + +#: src/slic3r/GUI/Tab.cpp:1278 +msgid "Flow" +msgstr "Stroom" + +#: src/slic3r/GUI/Tab.cpp:1287 +msgid "Other" +msgstr "Overige" + +#: src/slic3r/GUI/Tab.cpp:1290 src/slic3r/GUI/Tab.cpp:3723 +msgid "Output options" +msgstr "Output-opties" + +#: src/slic3r/GUI/Tab.cpp:1291 +msgid "Sequential printing" +msgstr "Achtereenvolgens printen" + +#: src/slic3r/GUI/Tab.cpp:1293 +msgid "Extruder clearance (mm)" +msgstr "Extruderruimte (mm)" + +#: src/slic3r/GUI/Tab.cpp:1298 src/slic3r/GUI/Tab.cpp:3724 +msgid "Output file" +msgstr "Outputbestand" + +#: src/slic3r/GUI/Tab.cpp:1305 src/libslic3r/PrintConfig.cpp:1453 +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 +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 +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 +msgid "Profile dependencies" +msgstr "Profielafhankelijkheden" + +#: src/slic3r/GUI/Tab.cpp:1378 src/slic3r/GUI/Tab.cpp:1433 +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 +msgid "Temperature" +msgstr "Temperatuur" + +#: src/slic3r/GUI/Tab.cpp:1494 +msgid "Bed" +msgstr "Bed" + +#: src/slic3r/GUI/Tab.cpp:1499 +msgid "Cooling" +msgstr "Koeling" + +#: src/slic3r/GUI/Tab.cpp:1500 src/libslic3r/PrintConfig.cpp:1355 +#: src/libslic3r/PrintConfig.cpp:2200 +msgid "Enable" +msgstr "Toestaan" + +#: src/slic3r/GUI/Tab.cpp:1511 +msgid "Fan settings" +msgstr "Ventilatorinstellingen" + +#: src/slic3r/GUI/Tab.cpp:1520 +msgid "Cooling thresholds" +msgstr "Koeldrempels" + +#: src/slic3r/GUI/Tab.cpp:1526 +msgid "Filament properties" +msgstr "Filamenteigenschappen" + +#: src/slic3r/GUI/Tab.cpp:1533 +msgid "Print speed override" +msgstr "Printsnelheid overschrijven" + +#: src/slic3r/GUI/Tab.cpp:1543 +msgid "Wipe tower parameters" +msgstr "Afveegblokparameters" + +#: src/slic3r/GUI/Tab.cpp:1546 +msgid "Toolchange parameters with single extruder MM printers" +msgstr "Toolwisselparameter voor multi-materialprinters met één extruder" + +#: src/slic3r/GUI/Tab.cpp:1560 +msgid "Ramming settings" +msgstr "Ramming-instellingen" + +#: src/slic3r/GUI/Tab.cpp:1582 src/slic3r/GUI/Tab.cpp:1997 +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 +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 +msgid "End G-code" +msgstr "Eind G-code" + +#: src/slic3r/GUI/Tab.cpp:1638 +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 +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 +msgid "Size and coordinates" +msgstr "Grootte en coördinaten" + +#: src/slic3r/GUI/Tab.cpp:1856 +msgid "Capabilities" +msgstr "Mogelijkheden" + +#: src/slic3r/GUI/Tab.cpp:1861 +msgid "Number of extruders of the printer." +msgstr "Aantal extruders van de printer." + +#: src/slic3r/GUI/Tab.cpp:1889 +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 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 " +"eerste extruder?" + +#: src/slic3r/GUI/Tab.cpp:1892 src/slic3r/GUI/Tab.cpp:2324 +#: src/libslic3r/PrintConfig.cpp:1326 +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 +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 +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 +msgid "Tool change G-code" +msgstr "Toolwisseling G-code" + +#: src/slic3r/GUI/Tab.cpp:2028 +msgid "Between objects G-code (for sequential printing)" +msgstr "G-code die komt tussen objecten (bij achtereenvolgens printen)" + +#: src/slic3r/GUI/Tab.cpp:2066 +msgid "Display" +msgstr "Scherm" + +#: src/slic3r/GUI/Tab.cpp:2081 +msgid "Tilt" +msgstr "Kanteling" + +#: src/slic3r/GUI/Tab.cpp:2082 +msgid "Tilt time" +msgstr "Kanteltijd" + +#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:3581 +msgid "Corrections" +msgstr "Correcties" + +#: src/slic3r/GUI/Tab.cpp:2105 src/slic3r/GUI/Tab.cpp:3577 +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 +msgid "Machine limits" +msgstr "Machinelimieten" + +#: src/slic3r/GUI/Tab.cpp:2186 +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 +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 +msgid "Maximum feedrates" +msgstr "Maximale voedingssnelheden" + +#: src/slic3r/GUI/Tab.cpp:2206 +msgid "Maximum accelerations" +msgstr "Maximale acceleraties" + +#: src/slic3r/GUI/Tab.cpp:2213 +msgid "Jerk limits" +msgstr "Ruklimieten" + +#: src/slic3r/GUI/Tab.cpp:2218 +msgid "Minimum feedrates" +msgstr "Minimale voedingssnelheden" + +#: src/slic3r/GUI/Tab.cpp:2282 src/slic3r/GUI/Tab.cpp:2290 +msgid "Single extruder MM setup" +msgstr "Multi-materialsetup met één extruder" + +#: src/slic3r/GUI/Tab.cpp:2291 +msgid "Single extruder multimaterial parameters" +msgstr "Parameter voor multi-material met één extruder" + +#: src/slic3r/GUI/Tab.cpp:2322 +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?" + +#: src/slic3r/GUI/Tab.cpp:2346 +msgid "Layer height limits" +msgstr "Laagdiktelimieten" + +#: src/slic3r/GUI/Tab.cpp:2351 +msgid "Position (for multi-extruder printers)" +msgstr "Positie (voor multi-extruderprinters)" + +#: src/slic3r/GUI/Tab.cpp:2357 +msgid "Only lift Z" +msgstr "Beweeg alleen Z omhoog" + +#: src/slic3r/GUI/Tab.cpp:2370 +msgid "" +"Retraction when tool is disabled (advanced settings for multi-extruder " +"setups)" +msgstr "" +"Retractie als de tool uit staat (geavanceerde instelling voor multi-" +"extrudersetups)" + +#: src/slic3r/GUI/Tab.cpp:2378 +msgid "Reset to Filament Color" +msgstr "Reset naar filamentkleur" + +#: src/slic3r/GUI/Tab.cpp:2559 +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 "" +"De afveegoptie is niet beschikbaar als firmwareretractie aanstaat.\n" +"\n" +"Moet deze uitgezet worden om firmwareretractie te gebruiken?" + +#: src/slic3r/GUI/Tab.cpp:2561 +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 +msgid "Detached" +msgstr "Ontkoppeld" + +#: src/slic3r/GUI/Tab.cpp:3029 +msgctxt "PresetName" +msgid "Copy" +msgstr "Kopieer" + +#: 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:3063 +msgid "Cannot overwrite a system profile." +msgstr "Een systeemprofiel kan niet overschreven worden." + +#: 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:3072 +msgid "Preset with name \"%1%\" already exists." +msgstr "Preset met de naam '%1%' bestaat al." + +#: src/slic3r/GUI/Tab.cpp:3073 +msgid "Replace?" +msgstr "Vervangen?" + +#: src/slic3r/GUI/Tab.cpp:3141 +msgid "remove" +msgstr "verwijderen" + +#: src/slic3r/GUI/Tab.cpp:3141 +msgid "delete" +msgstr "verwijderen" + +#. TRN remove/delete +#: src/slic3r/GUI/Tab.cpp:3143 +msgid "Are you sure you want to %1% the selected preset?" +msgstr "Weet u zeker dat u de geselecteerde preset %1% wilt?" + +#. TRN Remove/Delete +#: src/slic3r/GUI/Tab.cpp:3146 +msgid "%1% Preset" +msgstr "Preset %1%" + +#: src/slic3r/GUI/Tab.cpp:3205 src/slic3r/GUI/Tab.cpp:3275 +msgid "Set" +msgstr "Stel in" + +#: src/slic3r/GUI/Tab.cpp:3314 +msgid "LOCKED LOCK" +msgstr "Vergrendeld" + +#. TRN Description for "LOCKED LOCK" +#: src/slic3r/GUI/Tab.cpp:3316 +msgid "" +"indicates that the settings are the same as the system (or default) values " +"for the current option group" +msgstr "" +"geeft aan dat de instellingen gelijk zijn aan de systeemwaarden voor de " +"huidige optiegroep" + +#: src/slic3r/GUI/Tab.cpp:3318 +msgid "UNLOCKED LOCK" +msgstr "Ontgrendeld" + +#. TRN Description for "UNLOCKED LOCK" +#: src/slic3r/GUI/Tab.cpp:3320 +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 "" +"geeft aan dat sommige instellingen zijn veranderd en niet gelijk zijn aan de " +"standaardwaarde voor de huidige optiegroep.\n" +"Klik op het ontgrendeld-pictogram om de instelling te resetten naar de " +"systeemwaarden voor de huidige optiegroep." + +#: src/slic3r/GUI/Tab.cpp:3325 +msgid "WHITE BULLET" +msgstr "Wit bolletje" + +#. TRN Description for "WHITE BULLET" +#: src/slic3r/GUI/Tab.cpp:3327 +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 rechterknop geeft aan of de instelling is gewijzigd." + +#: src/slic3r/GUI/Tab.cpp:3330 +msgid "BACK ARROW" +msgstr "Pijltje terug" + +#. TRN Description for "BACK ARROW" +#: src/slic3r/GUI/Tab.cpp:3332 +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 "" +"geeft aan dat de instellingen zijn veranderd en niet gelijk zijn aan de " +"laatst opgeslagen preset 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." + +#: src/slic3r/GUI/Tab.cpp:3342 +msgid "" +"LOCKED LOCK icon indicates that the settings are the same as the system (or " +"default) values for the current option group" +msgstr "" +"Vergrendeld-pictogram geeft aan dat de instellingen gelijk zijn aan de " +"systeemwaarde van de huidige optiegroep" + +#: src/slic3r/GUI/Tab.cpp:3344 +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 "" +"Ontgrendeld-pictogram geeft aan dat sommige instellingen zijn veranderd en " +"niet gelijk zijn aan de systeemwaarde voor de huidige optiegroep.\n" +"Klik om alle instellingen voor de huidige optiegroep te resetten naar " +"systeemwaarden." + +#: src/slic3r/GUI/Tab.cpp:3347 +msgid "WHITE BULLET icon indicates a non system (or non default) preset." +msgstr "Het witte bolletje geeft aan dat het geen systeempreset betreft." + +#: src/slic3r/GUI/Tab.cpp:3350 +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." + +#: src/slic3r/GUI/Tab.cpp:3352 +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 "" +"Het pijltje-terug-pictogram geeft aan dat de instellingen zijn gewijzigd en " +"niet gelijk zijn aan de laatst opgeslagen preset voor de huidige " +"optiegroep.\n" +"Klik om alle instellingen terug te zetten voor de huidige optiegroep naar de " +"laatst opgeslagen preset." + +#: src/slic3r/GUI/Tab.cpp:3358 +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 +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 "" +"Ontgrendeld-pictogram geeft aan dat de waarde is veranderd en niet gelijk is " +"aan de systeemwaarde.\n" +"Klik om de huidige waarde te resetten naar de systeemwaarde." + +#: src/slic3r/GUI/Tab.cpp:3365 +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." + +#: src/slic3r/GUI/Tab.cpp:3366 +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." + +#: src/slic3r/GUI/Tab.cpp:3540 src/slic3r/GUI/Tab.cpp:3542 +msgid "Material" +msgstr "Materiaal" + +#: src/slic3r/GUI/Tab.cpp:3664 +msgid "Support head" +msgstr "Supportkop" + +#: src/slic3r/GUI/Tab.cpp:3669 +msgid "Support pillar" +msgstr "Supportpijler" + +#: src/slic3r/GUI/Tab.cpp:3685 +msgid "Connection of the support sticks and junctions" +msgstr "Verbindingen van de supporttakken en kruisingen" + +#: src/slic3r/GUI/Tab.cpp:3690 +msgid "Automatic generation" +msgstr "Automatisch genereren" + +#: src/slic3r/GUI/Tab.hpp:336 src/slic3r/GUI/Tab.hpp:441 +msgid "Print Settings" +msgstr "Printinstellingen" + +#: src/slic3r/GUI/Tab.hpp:363 +msgid "Filament Settings" +msgstr "Filamentinstellingen" + +#: src/slic3r/GUI/Tab.hpp:399 +msgid "Printer Settings" +msgstr "Printerinstellingen" + +#: src/slic3r/GUI/Tab.hpp:426 +msgid "Material Settings" +msgstr "Materiaalinstellingen" + +#: src/slic3r/GUI/Tab.hpp:453 +msgid "Save preset" +msgstr "Preset opslaan" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +msgid "Update available" +msgstr "Update beschikbaar" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +#, c-format +msgid "New version of %s is available" +msgstr "Nieuwe versie van %s beschikbaar" + +#: src/slic3r/GUI/UpdateDialogs.cpp:43 +msgid "Current version:" +msgstr "Huidige versie:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:45 +msgid "New version:" +msgstr "Nieuwe versie:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:53 +msgid "Changelog && Download" +msgstr "Wijzigingslogboek && Download" + +#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:183 +msgid "Open changelog page" +msgstr "Open wijzigingslogboekpagina" + +#: src/slic3r/GUI/UpdateDialogs.cpp:65 +msgid "Open download page" +msgstr "Open downloadpagina" + +#: src/slic3r/GUI/UpdateDialogs.cpp:71 +msgid "Don't notify about new releases any more" +msgstr "Geef geen meldingen over nieuwe versies meer" + +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 +msgid "Configuration update" +msgstr "Configuratie-update" + +#: src/slic3r/GUI/UpdateDialogs.cpp:89 +msgid "Configuration update is available" +msgstr "Er is een configuratie-update beschikbaar" + +#: 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 "" +"Wilt u 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" +"\n" +"Geüpdatete configuratiebundels:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 +msgid "Comment:" +msgstr "Opmerking:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210 +#, c-format +msgid "%s incompatibility" +msgstr "%s incompatibiliteit" + +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +msgid "You must install a configuration update." +msgstr "U moet een configuratie-update installeren." + +#: 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 zal nu updates starten, anders is het niet mogelijk dit programma correct " +"te draaien.\n" +"\n" +"Vooraf wordt een volledige configuratiesnapshot gemaakt. Het kan dan altijd " +"hersteld worden, mochten de updates problemen geven met de nieuwe versie.\n" +"\n" +"Geüpdatete configuratiebundels:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 +#, c-format +msgid "Exit %s" +msgstr "%s afsluiten" + +#: src/slic3r/GUI/UpdateDialogs.cpp:211 +#, c-format +msgid "%s configuration is incompatible" +msgstr "%s configuratie is niet compatibel" + +#: 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 "" +"Deze versie van %s is niet compatibel met 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" +"\n" +"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." + +#: src/slic3r/GUI/UpdateDialogs.cpp:225 +#, c-format +msgid "This %s version: %s" +msgstr "Deze %s versie: %s" + +#: src/slic3r/GUI/UpdateDialogs.cpp:230 +msgid "Incompatible bundles:" +msgstr "Incompatibele bundels:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:249 +msgid "Re-configure" +msgstr "Herconfigureer" + +#: 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 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 " +"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." + +#: 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:" + +#: src/slic3r/GUI/UpdateDialogs.cpp:304 +msgid "Configuration updates" +msgstr "Configuratie-updates" + +#: src/slic3r/GUI/UpdateDialogs.cpp:304 +msgid "No updates available" +msgstr "Geen updates beschikbaar" + +#: src/slic3r/GUI/UpdateDialogs.cpp:309 +#, c-format +msgid "%s has no configuration updates available." +msgstr "%s heeft geen configuratie-updates beschikbaar." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 +msgid "Ramming customization" +msgstr "Ramming aanpassen" + +#: 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 wordt gebruikt voor het snel extruderen vlak voor een toolwisseling " +"bij multi-materialprinters met één extruder. Het doel daarvan is om het " +"einde van het ongeladen filament goed te vormen (zodat het later weer " +"geladen kan worden) en nieuw filament niet verhinderd wordt. Deze fase is " +"belangrijk. Verschillende materialen vereisen verschillende " +"extrusiesnelheden voor de juiste vorm. Daarom zijn de waarden tijdens de " +"ramming aan te passen.\n" +"\n" +"Dit is een expert-level instelling. Onjuiste aanpassingen kunnen zorgen voor " +"verstoppingen en andere problemen." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 +msgid "Total ramming time" +msgstr "Totale ramming-tijd" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 +msgid "Total rammed volume" +msgstr "Totaal ramming-volume" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 +msgid "Ramming line width" +msgstr "Lijnbreedte voor ramming" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 +msgid "Ramming line spacing" +msgstr "Lijnafstand voor ramming" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 +msgid "Wipe tower - Purging volume adjustment" +msgstr "Afveegblok - afveegvolume aanpassen" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 +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." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 +msgid "Extruder changed to" +msgstr "Extruder veranderd naar" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 +msgid "unloaded" +msgstr "ontladen" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 +msgid "loaded" +msgstr "geladen" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 +msgid "Tool #" +msgstr "Tool #" + +#: 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 "" +"Totaal afveegvolume dat de som is van de twee onderstaande waarden, " +"afhankelijk van welke tools zijn geladen/ontladen." + +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 +msgid "Volume to purge (mm³) when the filament is being" +msgstr "Afveegvolume (mm³) als het filament wordt gebruikt" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 +msgid "From" +msgstr "Van" + +#: 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 "" +"Overschakelen naar eenvoudige modus zorgt dat de gewijzigde instellingen uit " +"de geavanceerde modus vervallen!\n" +"\n" +"Weet u zeker dat u wilt doorgaan?" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 +msgid "Show simplified settings" +msgstr "Toon eenvoudige instellingen" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 +msgid "Show advanced settings" +msgstr "Toon geavanceerde instellingen" + +#: src/slic3r/GUI/wxExtensions.cpp:706 +#, c-format +msgid "Switch to the %s mode" +msgstr "Schakel over naar de %s modus" + +#: src/slic3r/GUI/wxExtensions.cpp:707 +#, c-format +msgid "Current mode is %s" +msgstr "Huidige modus is: %s" + +#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:69 +#, c-format +msgid "Mismatched type of print host: %s" +msgstr "Onjuist type printhost: %s" + +#: src/slic3r/Utils/AstroBox.cpp:84 +msgid "Connection to AstroBox works correctly." +msgstr "Verbinding met AstroBox werkt naar behoren." + +#: src/slic3r/Utils/AstroBox.cpp:90 +msgid "Could not connect to AstroBox" +msgstr "Kan niet verbinden met AstroBox" + +#: src/slic3r/Utils/AstroBox.cpp:92 +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 +msgid "Connection to Duet works correctly." +msgstr "Verbinding met Duet werkt naar behoren." + +#: src/slic3r/Utils/Duet.cpp:55 +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/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 +msgid "Wrong password" +msgstr "Verkeerd wachtwoord" + +#: src/slic3r/Utils/Duet.cpp:136 +msgid "Could not get resources to create a new connection" +msgstr "Kan geen middelen krijgen om nieuwe verbinding te maken" + +#: src/slic3r/Utils/FixModelByWin10.cpp:219 +#: src/slic3r/Utils/FixModelByWin10.cpp:359 +msgid "Exporting source model" +msgstr "Exporteer bronmodel" + +#: src/slic3r/Utils/FixModelByWin10.cpp:235 +msgid "Failed loading the input model." +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" + +#: src/slic3r/Utils/FixModelByWin10.cpp:248 +msgid "Mesh repair failed." +msgstr "Mesh-reparatie mislukt." + +#: src/slic3r/Utils/FixModelByWin10.cpp:251 +#: src/slic3r/Utils/FixModelByWin10.cpp:378 +msgid "Loading repaired model" +msgstr "Gerepareerd model aan het laden" + +#: 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 "Opslaan van mesh in 3MF-container mislukt." + +#: src/slic3r/Utils/FixModelByWin10.cpp:340 +msgid "Model fixing" +msgstr "Model repareren" + +#: src/slic3r/Utils/FixModelByWin10.cpp:341 +msgid "Exporting model..." +msgstr "Model exporteren..." + +#: src/slic3r/Utils/FixModelByWin10.cpp:368 +msgid "Export of a temporary 3mf file failed" +msgstr "Exporteren van tijdelijk 3MF-bestand mislukt" + +#: src/slic3r/Utils/FixModelByWin10.cpp:383 +msgid "Import of the repaired 3mf file failed" +msgstr "Importeren van het gerepareerde 3MF-bestand mislukt" + +#: src/slic3r/Utils/FixModelByWin10.cpp:385 +msgid "Repaired 3MF file does not contain any object" +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" + +#: src/slic3r/Utils/FixModelByWin10.cpp:389 +msgid "Repaired 3MF file does not contain any volume" +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" + +#: src/slic3r/Utils/FixModelByWin10.cpp:400 +msgid "Model repair finished" +msgstr "Model repareren voltooid" + +#: src/slic3r/Utils/FixModelByWin10.cpp:406 +msgid "Model repair canceled" +msgstr "Model repareren geannuleerd" + +#: src/slic3r/Utils/FixModelByWin10.cpp:423 +msgid "Model repaired successfully" +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" + +#: src/slic3r/Utils/FixModelByWin10.cpp:426 +msgid "Model repair failed:" +msgstr "Model repareren mislukt:" + +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "Uploaden naar een FlashAir-kaart niet toegestaan." + +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "Verbinding met FlashAir werkt naar behoren en uploaden is toegestaan." + +#: src/slic3r/Utils/FlashAir.cpp:74 +msgid "Could not connect to FlashAir" +msgstr "Kan niet verbinden met FlashAir" + +#: src/slic3r/Utils/FlashAir.cpp:76 +msgid "" +"Note: FlashAir with firmware 2.00.02 or newer and activated upload function " +"is required." +msgstr "" +"Let op: FlashAir met firmware 2.00.02 (of nieuwer) en een geactiveerde " +"upload zijn vereist." + +#: src/slic3r/Utils/OctoPrint.cpp:84 +msgid "Connection to OctoPrint works correctly." +msgstr "Verbinding met OctoPrint werkt naar behoren." + +#: src/slic3r/Utils/OctoPrint.cpp:90 +msgid "Could not connect to OctoPrint" +msgstr "Kan niet verbinden met OctoPrint" + +#: src/slic3r/Utils/OctoPrint.cpp:92 +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 +msgid "Connection to Prusa SL1 works correctly." +msgstr "Verbinding met Prusa SL1 werkt naar behoren." + +#: src/slic3r/Utils/OctoPrint.cpp:185 +msgid "Could not connect to Prusa SLA" +msgstr "Kan niet verbinden met Prusa SLA" + +#: src/slic3r/Utils/PresetUpdater.cpp:705 +#, c-format +msgid "requires min. %s and max. %s" +msgstr "vereist minimaal %s en maximaal %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:710 +#, c-format +msgid "requires min. %s" +msgstr "vereist minimaal %s" + +#: src/slic3r/Utils/PresetUpdater.cpp:713 +#, 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/libslic3r/Zipper.cpp:32 +msgid "undefined error" +msgstr "onbekende fout" + +#: src/libslic3r/Zipper.cpp:34 +msgid "too many files" +msgstr "te veel bestanden" + +#: src/libslic3r/Zipper.cpp:36 +msgid "file too large" +msgstr "bestand te groot" + +#: src/libslic3r/Zipper.cpp:38 +msgid "unsupported method" +msgstr "niet-ondersteunde methode" + +#: src/libslic3r/Zipper.cpp:40 +msgid "unsupported encryption" +msgstr "niet-ondersteunde encryptie" + +#: src/libslic3r/Zipper.cpp:42 +msgid "unsupported feature" +msgstr "niet-ondersteunde optie" + +#: src/libslic3r/Zipper.cpp:44 +msgid "failed finding central directory" +msgstr "centrale map niet gevonden" + +#: src/libslic3r/Zipper.cpp:46 +msgid "not a ZIP archive" +msgstr "geen ZIP-archief" + +#: src/libslic3r/Zipper.cpp:48 +msgid "invalid header or archive is corrupted" +msgstr "ongeldige koptekst of het archief is beschadigd" + +#: src/libslic3r/Zipper.cpp:50 +msgid "unsupported multidisk archive" +msgstr "niet-ondersteund multi-disk archief" + +#: src/libslic3r/Zipper.cpp:52 +msgid "decompression failed or archive is corrupted" +msgstr "decompressie mislukt of archief is beschadigd" + +#: src/libslic3r/Zipper.cpp:54 +msgid "compression failed" +msgstr "compressie mislukt" + +#: src/libslic3r/Zipper.cpp:56 +msgid "unexpected decompressed size" +msgstr "onverwachte gedecomprimeerde grootte" + +#: src/libslic3r/Zipper.cpp:58 +msgid "CRC-32 check failed" +msgstr "CRC-32 check mislukt" + +#: src/libslic3r/Zipper.cpp:60 +msgid "unsupported central directory size" +msgstr "niet-ondersteunde centrale mapgrootte" + +#: src/libslic3r/Zipper.cpp:62 +msgid "allocation failed" +msgstr "toewijzing mislukt" + +#: src/libslic3r/Zipper.cpp:64 +msgid "file open failed" +msgstr "bestand openen mislukt" + +#: src/libslic3r/Zipper.cpp:66 +msgid "file create failed" +msgstr "bestand creëren mislukt" + +#: src/libslic3r/Zipper.cpp:68 +msgid "file write failed" +msgstr "bestand schrijven mislukt" + +#: src/libslic3r/Zipper.cpp:70 +msgid "file read failed" +msgstr "bestand lezen mislukt" + +#: src/libslic3r/Zipper.cpp:72 +msgid "file close failed" +msgstr "bestand sluiten mislukt" + +#: src/libslic3r/Zipper.cpp:74 +msgid "file seek failed" +msgstr "bestand zoeken mislukt" + +#: src/libslic3r/Zipper.cpp:76 +msgid "file stat failed" +msgstr "bestandsstatus mislukt" + +#: src/libslic3r/Zipper.cpp:78 +msgid "invalid parameter" +msgstr "ongeldige parameter" + +#: src/libslic3r/Zipper.cpp:80 +msgid "invalid filename" +msgstr "ongeldige bestandsnaam" + +#: src/libslic3r/Zipper.cpp:82 +msgid "buffer too small" +msgstr "buffer te klein" + +#: src/libslic3r/Zipper.cpp:84 +msgid "internal error" +msgstr "interne fout" + +#: src/libslic3r/Zipper.cpp:86 +msgid "file not found" +msgstr "bestand niet gevonden" + +#: src/libslic3r/Zipper.cpp:88 +msgid "archive is too large" +msgstr "archief te groot" + +#: src/libslic3r/Zipper.cpp:90 +msgid "validation failed" +msgstr "validatie mislukt" + +#: src/libslic3r/Zipper.cpp:92 +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/Print.cpp:1219 +msgid "All objects are outside of the print volume." +msgstr "Alle objecten bevinden zich buiten het printvolume." + +#: src/libslic3r/Print.cpp:1222 +msgid "The supplied settings will cause an empty print." +msgstr "De ingevoerde instellingen resulteren in een lege print." + +#: src/libslic3r/Print.cpp:1226 +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 +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:1244 +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 +msgid "" +"The wipe tower is only supported if all extruders have the same nozzle " +"diameter and use filaments of the same diameter." +msgstr "" +"Het afveegblok wordt alleen ondersteunt als alle extruders dezelfde nozzle- " +"en filamentdiameter hebben." + +#: src/libslic3r/Print.cpp:1262 +msgid "" +"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter " +"and Repetier G-code flavors." +msgstr "" +"Het afveegblok wordt alleen ondersteunt in Marlin, RepRap/Sprinter en " +"Repetier G-code-soorten." + +#: src/libslic3r/Print.cpp:1264 +msgid "" +"The Wipe Tower is currently only supported with the relative extruder " +"addressing (use_relative_e_distances=1)." +msgstr "" +"Het afveegblok wordt alleen ondersteunt met de relatieve extruderinstelling " +"('use_relative_e_distances' = 1)." + +#: src/libslic3r/Print.cpp:1266 +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 +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 +msgid "" +"The Wipe Tower is currently not supported for multimaterial sequential " +"prints." +msgstr "" +"Het afveegblok wordt momenteel niet ondersteund voor multi-materiaal " +"achtereenvolgens printen." + +#: src/libslic3r/Print.cpp:1291 +msgid "" +"The Wipe Tower is only supported for multiple objects if they have equal " +"layer heights" +msgstr "" +"Het afveegblok wordt alleen ondersteunt voor meerdere objecten als deze een " +"gelijke laagdikte hebben" + +#: src/libslic3r/Print.cpp:1293 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"over an equal number of raft layers" +msgstr "" +"Het afveegblok wordt alleen ondersteunt voor meerdere objecten als deze op " +"een gelijk aantal raftlagen zijn geplaatst" + +#: src/libslic3r/Print.cpp:1295 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are printed " +"with the same support_material_contact_distance" +msgstr "" +"Het afveegblok wordt alleen ondersteunt voor meerdere objecten als de " +"instelling 'support_material_contact_distance' gelijk staat" + +#: src/libslic3r/Print.cpp:1297 +msgid "" +"The Wipe Tower is only supported for multiple objects if they are sliced " +"equally." +msgstr "" +"Het afveegblok wordt alleen ondersteunt voor meerdere objecten als ze " +"tegelijk gesliced worden." + +#: src/libslic3r/Print.cpp:1339 +msgid "" +"The Wipe tower is only supported if all objects have the same variable layer " +"height" +msgstr "" +"Het afveegblok wordt alleen ondersteunt als alle objecten dezelfde variabele " +"laagdikte hebben" + +#: src/libslic3r/Print.cpp:1365 +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 +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 +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 +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 "" +"Printen met meerdere extruders met verschillende nozzlediameters. Als " +"support met de huidige extruder geprint moet worden, moeten alle nozzles " +"dezelfde diameter hebben ('support_material_extruder' = 0 of " +"'support_material_interface_extruder' = 0)." + +#: src/libslic3r/Print.cpp:1396 +msgid "" +"For the Wipe Tower to work with the soluble supports, the support layers " +"need to be synchronized with the object layers." +msgstr "" +"Om het afveegblok te laten samenwerken met oplosbare support, moeten de " +"supportlagen gesynchroniseerd worden met de objectlagen." + +#: src/libslic3r/Print.cpp:1400 +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 "" +"Het afveegblok ondersteunt alleen niet-oplosbaar support als dat geprint " +"worden met de huidige extruder zonder toolwissel (Zet zowel " +"'support_material_extruder' en 'support_material_interface_extruder' op 0)." + +#: src/libslic3r/Print.cpp:1422 +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 +msgid "Layer height can't be greater than nozzle diameter" +msgstr "Laagdikte kan niet groter zijn dan de nozzlediameter" + +#: src/libslic3r/Print.cpp:1584 +msgid "Infilling layers" +msgstr "Vullingslagen" + +#: src/libslic3r/Print.cpp:1606 +msgid "Generating skirt" +msgstr "Skirt genereren" + +#: src/libslic3r/Print.cpp:1614 +msgid "Generating brim" +msgstr "Brim genereren" + +#: src/libslic3r/Print.cpp:1638 +msgid "Exporting G-code" +msgstr "G-code exporteren" + +#: src/libslic3r/Print.cpp:1642 +msgid "Generating G-code" +msgstr "G-code genereren" + +#: src/libslic3r/SLAPrint.cpp:615 +msgid "" +"Cannot proceed without support points! Add support points or disable support " +"generation." +msgstr "" +"Kan niet doorgaan zonder supportpunten! Voeg supportpunten toe of schakel " +"supportgeneratie uit." + +#: src/libslic3r/SLAPrint.cpp:627 +msgid "" +"Elevation is too low for object. Use the \"Pad around object\" feature to " +"print the object without elevation." +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 +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 "" +"De uiteinden van de pijlers worden ingezet op de gaten tussen het object en " +"de basisplaat. De instelling 'Veilige afstand voor supportbasis' moet groter " +"zijn dan de 'Basisplaat-objectgat'-parameter hiervoor." + +#: src/libslic3r/SLAPrint.cpp:648 +msgid "Exposition time is out of printer profile bounds." +msgstr "De belichtingstijd valt buiten de grenzen van het printerprofiel." + +#: src/libslic3r/SLAPrint.cpp:655 +msgid "Initial exposition time is out of printer profile bounds." +msgstr "Initiële belichtingstijd valt buiten de printerprofielgrenzen." + +#: src/libslic3r/SLAPrint.cpp:762 +msgid "Slicing done" +msgstr "Slicen voltooid" + +#: src/libslic3r/SLAPrintSteps.cpp:43 +msgid "Hollowing model" +msgstr "Model uithollen" + +#: src/libslic3r/SLAPrintSteps.cpp:44 +msgid "Drilling holes into model." +msgstr "Afvoergaten toevoegen." + +#: src/libslic3r/SLAPrintSteps.cpp:45 +msgid "Slicing model" +msgstr "Model slicen" + +#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356 +msgid "Generating support points" +msgstr "Supportpunten genereren" + +#: src/libslic3r/SLAPrintSteps.cpp:47 +msgid "Generating support tree" +msgstr "Supportboom genereren" + +#: src/libslic3r/SLAPrintSteps.cpp:48 +msgid "Generating pad" +msgstr "Basisplaat genereren" + +#: src/libslic3r/SLAPrintSteps.cpp:49 +msgid "Slicing supports" +msgstr "Support slicen" + +#: src/libslic3r/SLAPrintSteps.cpp:64 +msgid "Merging slices and calculating statistics" +msgstr "Slices samenvoegen en statistieken berekenen" + +#: src/libslic3r/SLAPrintSteps.cpp:65 +msgid "Rasterizing layers" +msgstr "Lagen roosteren" + +#: src/libslic3r/SLAPrintSteps.cpp:190 +msgid "Too much overlapping holes." +msgstr "Te veel overlappende gaten." + +#: src/libslic3r/SLAPrintSteps.cpp:199 +msgid "" +"Drilling holes into the mesh failed. This is usually caused by broken model. " +"Try to fix it first." +msgstr "" +"Afvoergaten toevoegen mislukt. Dit komt meestal door een incorrect model. " +"Probeer die eerst te repareren." + +#: src/libslic3r/SLAPrintSteps.cpp:245 +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 +msgid "Visualizing supports" +msgstr "Visualiseer support" + +#: src/libslic3r/SLAPrintSteps.cpp:453 +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 +msgid "" +"There are unprintable objects. Try to adjust support settings to make the " +"objects printable." +msgstr "" +"Er zijn niet-printbare objecten. Probeer de supportinstellingen te " +"veranderen om het object printbaar te maken." + +#: src/libslic3r/PrintBase.cpp:71 +msgid "Failed processing of the output_filename_format template." +msgstr "Verwerken van de 'output_filename_format'-template mislukt." + +#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 +msgid "Printer technology" +msgstr "Printertechnologie" + +#: src/libslic3r/PrintConfig.cpp:51 +msgid "Bed shape" +msgstr "Bedvorm" + +#: src/libslic3r/PrintConfig.cpp:56 +msgid "Bed custom texture" +msgstr "Custom bedtextuur" + +#: src/libslic3r/PrintConfig.cpp:61 +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" + +#: 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 "" +"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 +msgid "Max print height" +msgstr "Maximale printhoogte" + +#: src/libslic3r/PrintConfig.cpp:81 +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 +msgid "Slice gap closing radius" +msgstr "Gatvulradius" + +#: src/libslic3r/PrintConfig.cpp:89 +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 "" +"Gaten die kleiner zijn dan tweemaal de gatvulradius worden opgevuld tijdens " +"het slicen. Het vullen kan zorgen dat de printresolutie minder wordt. Daarom " +"wordt geadviseerd de waarde laag te houden." + +#: src/libslic3r/PrintConfig.cpp:97 +msgid "Hostname, IP or URL" +msgstr "Hostnaam, IP of URL" + +#: 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 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 +msgid "API Key / Password" +msgstr "API-key / wachtwoord" + +#: src/libslic3r/PrintConfig.cpp:105 +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 kan gcode-bestanden naar een printerhost uploaden. Dit veld moet " +"de API-key of het wachtwoord voor authenticatie bevatten." + +#: src/libslic3r/PrintConfig.cpp:112 +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 "" +"Aangepast CA-certificaatbestand kan gespecificeerd worden voor HTTPS-" +"OctoPrint verbindingen in CRT/PEM-formaat. Als er niets wordt ingevuld, " +"wordt de standaard OS-CA-certificaatopslaglocatie gebruikt." + +#: src/libslic3r/PrintConfig.cpp:118 +msgid "Elephant foot compensation" +msgstr "Squishcompensatie" + +#: src/libslic3r/PrintConfig.cpp:120 +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 "" +"De eerste laag wordt verkleind in horizontale richting met de ingestelde " +"waarde ter compensatie van het platdrukken." + +#: src/libslic3r/PrintConfig.cpp:136 +msgid "Avoid crossing perimeters" +msgstr "Vermijd kruisende perimeters" + +#: src/libslic3r/PrintConfig.cpp:137 +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 "" +"Optimaliseer de bewegingen om kruisende perimeters te minimaliseren. Dit is " +"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 +msgid "Other layers" +msgstr "Overige lagen" + +#: src/libslic3r/PrintConfig.cpp:145 +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." + +#: src/libslic3r/PrintConfig.cpp:147 +msgid "Bed temperature" +msgstr "Bedtemperatuur" + +#: src/libslic3r/PrintConfig.cpp:154 +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 " +"'layer_num' en 'layer_z'." + +#: src/libslic3r/PrintConfig.cpp:164 +msgid "Between objects G-code" +msgstr "G-code die komt tussen objecten" + +#: src/libslic3r/PrintConfig.cpp:165 +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 "" +"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 " +"variabelen voor alle instellingen gebruikt kunnen worden." + +#: src/libslic3r/PrintConfig.cpp:176 +msgid "Number of solid layers to generate on bottom surfaces." +msgstr "Aantal te genereren dichte lagen voor ondervlakken." + +#: src/libslic3r/PrintConfig.cpp:177 +msgid "Bottom solid layers" +msgstr "Dichte bodemlagen" + +#: src/libslic3r/PrintConfig.cpp:185 +msgid "" +"The number of bottom solid layers is increased above bottom_solid_layers if " +"necessary to satisfy minimum thickness of bottom shell." +msgstr "" +"Het aantal dichte bodemlagen wordt verhoogd als blijkt dat het nodig is om " +"de minimale bodemshelldikte te garanderen." + +#: src/libslic3r/PrintConfig.cpp:187 +msgid "Minimum bottom shell thickness" +msgstr "Minimale shelldikte aan de onderzijde" + +#: src/libslic3r/PrintConfig.cpp:193 +msgid "Bridge" +msgstr "Brug" + +#: src/libslic3r/PrintConfig.cpp:194 +msgid "" +"This is the acceleration your printer will use for bridges. Set zero to " +"disable acceleration control for bridges." +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 +msgid "mm/s²" +msgstr "mm/s²" + +#: src/libslic3r/PrintConfig.cpp:202 +msgid "Bridging angle" +msgstr "Brughoek" + +#: src/libslic3r/PrintConfig.cpp:204 +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 "" +"Brughoek overschrijven. Als dit ingesteld is op 0, wordt de optimale hoek " +"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 +msgid "°" +msgstr "°" + +#: src/libslic3r/PrintConfig.cpp:213 +msgid "Bridges fan speed" +msgstr "Ventilatorsnelheid voor bruggen" + +#: src/libslic3r/PrintConfig.cpp:214 +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 +msgid "%" +msgstr "%" + +#: src/libslic3r/PrintConfig.cpp:222 +msgid "Bridge flow ratio" +msgstr "Brugextrusieverhouding" + +#: src/libslic3r/PrintConfig.cpp:224 +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 "" +"Deze factor beïnvloedt de hoeveelheid plastic voor bruggen. Deze kan " +"verlaagd worden om het extrudaat strak te trekken en doorzakking te " +"voorkomen. Hoewel de systeemwaarden goed zijn, kan geëxperimenteerd worden " +"met de koeling voor dit aangepast wordt." + +#: src/libslic3r/PrintConfig.cpp:234 +msgid "Bridges" +msgstr "Bruggen" + +#: src/libslic3r/PrintConfig.cpp:236 +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 +msgid "mm/s" +msgstr "mm/s" + +#: src/libslic3r/PrintConfig.cpp:244 +msgid "Brim width" +msgstr "Breedte van de brim" + +#: src/libslic3r/PrintConfig.cpp:245 +msgid "" +"Horizontal width of the brim that will be printed around each object on the " +"first layer." +msgstr "" +"Horizontale breedte van de brim die rond elk object op de eerste laag wordt " +"geprint." + +#: src/libslic3r/PrintConfig.cpp:252 +msgid "Clip multi-part objects" +msgstr "Meerdelige objecten samenvoegen" + +#: src/libslic3r/PrintConfig.cpp:253 +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 "" +"Als meerdere multi-materialobjecten worden geprint, zorgt deze instelling " +"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 +msgid "Colorprint height" +msgstr "Kleurenprinthoogte" + +#: src/libslic3r/PrintConfig.cpp:261 +msgid "Heights at which a filament change is to occur." +msgstr "Hoogte waarbij de filamentwissel plaatsvindt." + +#: src/libslic3r/PrintConfig.cpp:271 +msgid "Compatible printers condition" +msgstr "Voorwaarden compatibele printers" + +#: src/libslic3r/PrintConfig.cpp:272 +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 "" +"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." + +#: src/libslic3r/PrintConfig.cpp:286 +msgid "Compatible print profiles condition" +msgstr "Voorwaarden compatibele printprofielen" + +#: src/libslic3r/PrintConfig.cpp:287 +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 "" +"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." + +#: src/libslic3r/PrintConfig.cpp:304 +msgid "Complete individual objects" +msgstr "Voltooi individuele objecten" + +#: src/libslic3r/PrintConfig.cpp:305 +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 "" +"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." + +#: src/libslic3r/PrintConfig.cpp:313 +msgid "Enable auto cooling" +msgstr "Automatisch koelen toestaan" + +#: src/libslic3r/PrintConfig.cpp:314 +msgid "" +"This flag enables the automatic cooling logic that adjusts print speed and " +"fan speed according to layer printing time." +msgstr "" +"Dit vinkje zorgt dat automatisch gekoeld wordt; de print- en " +"ventilatorsnelheid worden aangepast op basis van de laagprinttijd." + +#: src/libslic3r/PrintConfig.cpp:319 +msgid "Cooling tube position" +msgstr "Koelbuispositie" + +#: src/libslic3r/PrintConfig.cpp:320 +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 +msgid "Cooling tube length" +msgstr "Koelbuislengte" + +#: src/libslic3r/PrintConfig.cpp:328 +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 +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 "" +"Dit is de acceleratie waarop uw printer wordt ingesteld na een specifieke " +"acceleratiewaarde (perimeters/vulling). Als dit ingesteld is op 0, worden " +"geen acceleratiewaarden opnieuw ingesteld." + +#: src/libslic3r/PrintConfig.cpp:345 +msgid "Default filament profile" +msgstr "Standaard filamentprofiel" + +#: src/libslic3r/PrintConfig.cpp:346 +msgid "" +"Default filament profile associated with the current printer profile. On " +"selection of the current printer profile, this filament profile will be " +"activated." +msgstr "" +"Standaard filamentprofiel dat geassocieerd wordt met huidig printerprofiel. " +"Bij selectie van het huidige printerprofiel wordt dit filamentprofiel " +"geactiveerd." + +#: src/libslic3r/PrintConfig.cpp:352 +msgid "Default print profile" +msgstr "Standaard printprofiel" + +#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592 +#: src/libslic3r/PrintConfig.cpp:2603 +msgid "" +"Default print profile associated with the current printer profile. On " +"selection of the current printer profile, this print profile will be " +"activated." +msgstr "" +"Standaard printprofiel dat geassocieerd wordt met huidig printerprofiel. Bij " +"selectie van het huidige printerprofiel wordt dit printprofiel geactiveerd." + +#: src/libslic3r/PrintConfig.cpp:359 +msgid "Disable fan for the first" +msgstr "Zet ventilator uit voor de eerste" + +#: src/libslic3r/PrintConfig.cpp:360 +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 "" +"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 +msgid "Don't support bridges" +msgstr "Geen support voor bruggen" + +#: src/libslic3r/PrintConfig.cpp:371 +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 +msgid "Distance between copies" +msgstr "Ruimte tussen kopieën" + +#: src/libslic3r/PrintConfig.cpp:378 +msgid "Distance used for the auto-arrange feature of the plater." +msgstr "" +"Afstand die gebruikt wordt tussen objecten bij automatisch rangschikken." + +#: src/libslic3r/PrintConfig.cpp:386 +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 "" +"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 +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 "" +"Deze eindprocedure is ingevoegd aan het eind van het outputbestand, nog voor " +"de eind G-code (en voor de toolwisselingen). Merk op dat variabelen voor " +"alle instellingen gebruikt kunnen worden. Als de printer meerdere extruders " +"heeft, wordt deze G-code in de extrudervolgorde uitgevoerd." + +#: src/libslic3r/PrintConfig.cpp:407 +msgid "Ensure vertical shell thickness" +msgstr "Garandeer verticale shelldikte" + +#: src/libslic3r/PrintConfig.cpp:409 +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 " +"garanderen." + +#: src/libslic3r/PrintConfig.cpp:415 +msgid "Top fill pattern" +msgstr "Vulpatroon voor bovenzijde" + +#: src/libslic3r/PrintConfig.cpp:417 +msgid "" +"Fill pattern for top infill. This only affects the top visible layer, and " +"not its adjacent solid shells." +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 +msgid "Rectilinear" +msgstr "Rechtlijnig" + +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849 +msgid "Concentric" +msgstr "Concentrisch" + +#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:853 +msgid "Hilbert Curve" +msgstr "Hilbert-kromme" + +#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854 +msgid "Archimedean Chords" +msgstr "Archimedes-spiraal" + +#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 +msgid "Octagram Spiral" +msgstr "Octagramspiraal" + +#: src/libslic3r/PrintConfig.cpp:435 +msgid "Bottom fill pattern" +msgstr "Vulpatroon voor onderzijde" + +#: src/libslic3r/PrintConfig.cpp:437 +msgid "" +"Fill pattern for bottom infill. This only affects the bottom external " +"visible layer, and not its adjacent solid shells." +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 +msgid "External perimeters" +msgstr "Buitenste perimeters" + +#: src/libslic3r/PrintConfig.cpp:448 +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 "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte voor " +"de buitenste perimeters. Als die op 0 blijft staan, zal PrusaSlicer de " +"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 +msgid "mm or %" +msgstr "mm of %" + +#: src/libslic3r/PrintConfig.cpp:459 +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 "" +"Deze instelling heeft effect op de snelheid van buitenste perimeters. Als " +"dit is uitgedrukt als percentage, wordt deze genomen over de snelheid van de " +"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 +msgid "mm/s or %" +msgstr "mm/s of %" + +#: src/libslic3r/PrintConfig.cpp:469 +msgid "External perimeters first" +msgstr "Buitenste perimeters eerst" + +#: src/libslic3r/PrintConfig.cpp:471 +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 +msgid "Extra perimeters if needed" +msgstr "Extra perimeters indien nodig" + +#: src/libslic3r/PrintConfig.cpp:479 +#, no-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 "" +"Voeg meer perimeters toe als dat nodig is voor het voorkomen van gaten in " +"hellende wanden. PrusaSlicer blijft perimeters toevoegen tot meer dan 70% " +"van de perimeters daarboven direct is ondersteund." + +#: src/libslic3r/PrintConfig.cpp:489 +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 "" +"De extruder die gebruikt wordt (behalve als meer specifieke " +"extruderinstellingen zijn aangegeven). Deze waarde overschrijft de " +"perimeter- en vullingsextruder, maar niet de supportextruders." + +#: src/libslic3r/PrintConfig.cpp:501 +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 "" +"Stel dit in als verticale afstand tussen de nozzlepunt en de geleidestangen " +"van de X-as. In andere woorden; dit is de hoogte van de vrijloopcilinder " +"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 +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 "" +"Stel dit in als vrijloopradius rond de extruder. Kies de hoogste waarde " +"(voor de veiligheid) als de extruder niet is gecentreerd. Deze instelling " +"wordt gebruikt om te controleren op botsingen en om te tonen in de 3D-" +"weergave." + +#: src/libslic3r/PrintConfig.cpp:522 +msgid "Extruder Color" +msgstr "Extruderkleur" + +#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583 +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 +msgid "Extruder offset" +msgstr "Extruder-offset" + +#: src/libslic3r/PrintConfig.cpp:530 +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 "" +"Als uw firmware extrudercompensatie niet toestaat, kan daar rekening mee " +"gehouden worden in de G-code. Met deze optie kunt u 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 +msgid "Extrusion axis" +msgstr "Extrusie-as" + +#: src/libslic3r/PrintConfig.cpp:540 +msgid "" +"Use this option to set the axis letter associated to your printer's extruder " +"(usually E but some printers use A)." +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 +msgid "Extrusion multiplier" +msgstr "Extrusie vermenigvuldigingsfactor" + +#: src/libslic3r/PrintConfig.cpp:546 +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 " +"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." + +#: src/libslic3r/PrintConfig.cpp:554 +msgid "Default extrusion width" +msgstr "Standaard extrusiebreedte" + +#: src/libslic3r/PrintConfig.cpp:556 +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 "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte. Als " +"die op 0 blijft staan, zal PrusaSlicer de extrusiebreedte aanpassen op basis " +"van de nozzlediameter. Als dit is uitgedrukt als percentage, wordt dit " +"berekend over de laagdikte." + +#: src/libslic3r/PrintConfig.cpp:566 +msgid "Keep fan always on" +msgstr "Laat ventilator altijd aan" + +#: src/libslic3r/PrintConfig.cpp:567 +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 "" +"Als dit is ingeschakeld zal de ventilator nooit uitgezet worden, maar " +"tenminste de ingestelde minimale snelheid aanhouden." + +#: src/libslic3r/PrintConfig.cpp:572 +msgid "Enable fan if layer print time is below" +msgstr "Schakel de ventilator in bij een printtijd korter dan" + +#: src/libslic3r/PrintConfig.cpp:573 +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 "" +"Als de printtijd voor een laag onder dit aantal seconden komt, zal de " +"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 +msgid "approximate seconds" +msgstr "geschat aantal seconden" + +#: src/libslic3r/PrintConfig.cpp:588 +msgid "Filament notes" +msgstr "Filamentopmerkingen" + +#: src/libslic3r/PrintConfig.cpp:589 +msgid "You can put your notes regarding the filament here." +msgstr "Hier kunt u opmerkingen over het filament plaatsen." + +#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247 +msgid "Max volumetric speed" +msgstr "Maximale volumetrische snelheid" + +#: src/libslic3r/PrintConfig.cpp:598 +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 snelheid is toegestaan voor dit filament. Dit beperkt " +"de maximale volumetrische snelheid van een print tot het minimum van de " +"maximale volumetrische snelheid van de print en het filament. Als dit " +"ingesteld is op 0, geldt er geen limiet." + +#: src/libslic3r/PrintConfig.cpp:607 +msgid "Loading speed" +msgstr "Laadsnelheid" + +#: src/libslic3r/PrintConfig.cpp:608 +msgid "Speed used for loading the filament on the wipe tower." +msgstr "Snelheid die gebruikt wordt voor het afveegblok." + +#: src/libslic3r/PrintConfig.cpp:615 +msgid "Loading speed at the start" +msgstr "Laadsnelheid aan het begin" + +#: src/libslic3r/PrintConfig.cpp:616 +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 +msgid "Unloading speed" +msgstr "Ontlaadsnelheid" + +#: src/libslic3r/PrintConfig.cpp:624 +msgid "" +"Speed used for unloading the filament on the wipe tower (does not affect " +"initial part of unloading just after ramming)." +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 +msgid "Unloading speed at the start" +msgstr "Ontlaadsnelheid in het begin" + +#: src/libslic3r/PrintConfig.cpp:633 +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 +msgid "Delay after unloading" +msgstr "Vertraging na het ontladen" + +#: src/libslic3r/PrintConfig.cpp:641 +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 "" +"Wachttijd voor het ontladen van het filament. Dit kan helpen om betrouwbare " +"toolwisselingen te krijgen met flexibele materialen die meer tijd nodig " +"hebben om te krimpen naar de originele afmetingen." + +#: src/libslic3r/PrintConfig.cpp:650 +msgid "Number of cooling moves" +msgstr "Aantal koelbewegingen" + +#: src/libslic3r/PrintConfig.cpp:651 +msgid "" +"Filament is cooled by being moved back and forth in the cooling tubes. " +"Specify desired number of these moves." +msgstr "" +"Het filament wordt gekoeld tijdens het terug en voorwaarts bewegen in de " +"koelbuis. Specificeer het benodigd aantal bewegingen." + +#: src/libslic3r/PrintConfig.cpp:659 +msgid "Speed of the first cooling move" +msgstr "Snelheid voor de eerste koelbeweging" + +#: src/libslic3r/PrintConfig.cpp:660 +msgid "Cooling moves are gradually accelerating beginning at this speed." +msgstr "" +"Koelbewegingen worden gelijkmatig versneld, beginnend vanaf deze snelheid." + +#: src/libslic3r/PrintConfig.cpp:667 +msgid "Minimal purge on wipe tower" +msgstr "Minimale afstand op afveegblok" + +#: src/libslic3r/PrintConfig.cpp:668 +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 "" +"Na een toolwissel is de exacte locatie van het geladen filament onbekend en " +"zal de druk op het filament niet stabiel zijn. Voor het afvegen van de " +"printkop in de vulling zal PrusaSlicer eerst deze hoeveelheid materiaal " +"afvegen aan het afveegblok om vervolgens de vulling of overige objecten goed " +"te kunnen printen." + +#: src/libslic3r/PrintConfig.cpp:672 +msgid "mm³" +msgstr "mm³" + +#: src/libslic3r/PrintConfig.cpp:678 +msgid "Speed of the last cooling move" +msgstr "Snelheid voor de laatste koelbeweging" + +#: src/libslic3r/PrintConfig.cpp:679 +msgid "Cooling moves are gradually accelerating towards this speed." +msgstr "Koelbewegingen versnellen gelijkmatig tot aan deze snelheid." + +#: src/libslic3r/PrintConfig.cpp:686 +msgid "Filament load time" +msgstr "Laadtijd van het filament" + +#: src/libslic3r/PrintConfig.cpp:687 +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 "" +"Tijd voor de printerfirmware (of de MMU 2.0) om nieuw filament te laden " +"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 +msgid "Ramming parameters" +msgstr "Rammingparameters" + +#: src/libslic3r/PrintConfig.cpp:695 +msgid "" +"This string is edited by RammingDialog and contains ramming specific " +"parameters." +msgstr "" +"Deze frase is bewerkt door het Rammingdialoog en bevat parameters voor de " +"ramming." + +#: src/libslic3r/PrintConfig.cpp:701 +msgid "Filament unload time" +msgstr "Ontlaadtijd voor filament" + +#: src/libslic3r/PrintConfig.cpp:702 +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 "" +"Tijd voor de printerfirmware (of de MMU 2.0) om filament te ontladen 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:710 +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 "" +"Stel hier de filamentdiameter in. De juiste precisie is benodigd. Gebruik " +"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 +msgid "Density" +msgstr "Dichtheid" + +#: src/libslic3r/PrintConfig.cpp:718 +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 "" +"Stel hier de dichtheid van het filament in. Dit is slechts voor de " +"statistieken. Formule voor dichtheid: dichtheid[g/cm³] = massa[g] / " +"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 +msgid "g/cm³" +msgstr "g/cm³" + +#: src/libslic3r/PrintConfig.cpp:726 +msgid "Filament type" +msgstr "Filamenttype" + +#: src/libslic3r/PrintConfig.cpp:727 +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 +msgid "Soluble material" +msgstr "Oplosbaar materiaal" + +#: src/libslic3r/PrintConfig.cpp:755 +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 +msgid "" +"Enter your filament cost per kg here. This is only for statistical " +"information." +msgstr "" +"Voer hier de filamentkosten per kilogram in. Dit is alleen voor statistische " +"informatie." + +#: src/libslic3r/PrintConfig.cpp:762 +msgid "money/kg" +msgstr "€/kg" + +#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587 +msgid "(Unknown)" +msgstr "(Onbekend)" + +#: src/libslic3r/PrintConfig.cpp:775 +msgid "Fill angle" +msgstr "Vullingshoek" + +#: src/libslic3r/PrintConfig.cpp:777 +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 "" +"Standaard basishoek voor de vullingsrichting. Hier wordt kruislings overheen " +"geprint. Bruggen worden geprint met de optimale richting. Deze instelling " +"zal die richting niet beïnvloeden." + +#: src/libslic3r/PrintConfig.cpp:789 +msgid "Fill density" +msgstr "Vullingsdichtheid" + +#: src/libslic3r/PrintConfig.cpp:791 +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 +msgid "Fill pattern" +msgstr "Vullingspatroon" + +#: src/libslic3r/PrintConfig.cpp:828 +msgid "Fill pattern for general low-density infill." +msgstr "Vulpatroon voor algemene lagere-dichtheidsvulling." + +#: src/libslic3r/PrintConfig.cpp:844 +msgid "Grid" +msgstr "Raster" + +#: src/libslic3r/PrintConfig.cpp:845 +msgid "Triangles" +msgstr "Driehoeken" + +#: src/libslic3r/PrintConfig.cpp:846 +msgid "Stars" +msgstr "Sterren" + +#: src/libslic3r/PrintConfig.cpp:847 +msgid "Cubic" +msgstr "Kubisch" + +#: src/libslic3r/PrintConfig.cpp:848 +msgid "Line" +msgstr "Lijnen" + +#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011 +msgid "Honeycomb" +msgstr "Honingraat" + +#: src/libslic3r/PrintConfig.cpp:851 +msgid "3D Honeycomb" +msgstr "3D-honingraat" + +#: src/libslic3r/PrintConfig.cpp:852 +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 +msgid "First layer" +msgstr "Eerste laag" + +#: src/libslic3r/PrintConfig.cpp:860 +msgid "" +"This is the acceleration your printer will use for first layer. Set zero to " +"disable acceleration control for first layer." +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 +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." + +#: src/libslic3r/PrintConfig.cpp:878 +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 "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte voor " +"de eerste laag. Dit kan gebruikt worden om dikkere lagen voor een betere " +"hechting aan het bed te gebruiken. Als dit is uitgedrukt als percentage, " +"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 +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 "" +"Als geprint wordt met hele kleine laagdiktes, moet de eerste laag iets " +"dikker geprint worden voor een betere bedhechting en tolerantie voor " +"imperfecte printplatformen. Dit kan uitgedrukt worden als een absolute " +"waarde of als percentage (bijvoorbeeld 150%) over de standaard laagdikte." + +#: src/libslic3r/PrintConfig.cpp:900 +msgid "First layer speed" +msgstr "Snelheid eerste laag" + +#: src/libslic3r/PrintConfig.cpp:901 +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 "" +"Als dit uitgedrukt wordt als absolute waarde (in mm/s), zal deze snelheid " +"toegepast worden bij alle printbewegingen van de eerste laag, onafhankelijk " +"van het type. Als dit is uitgedrukt als percentage, wordt dit berekend over " +"de standaardsnelheid." + +#: 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 "" +"Printtemperatuur voor de eerste laag. Als dit ingesteld is op 0, worden " +"extrudertemperatuur-commando's weggelaten in de output." + +#: src/libslic3r/PrintConfig.cpp:920 +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 "" +"Printsnelheid voor het gatvullen waarbij zigzag-bewegingen worden gebruikt. " +"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 +msgid "Verbose G-code" +msgstr "Opmerkingen in G-code" + +#: src/libslic3r/PrintConfig.cpp:929 +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 " +"grootte van het bestand de firmware vertragen." + +#: src/libslic3r/PrintConfig.cpp:936 +msgid "G-code flavor" +msgstr "G-code-variant" + +#: src/libslic3r/PrintConfig.cpp:937 +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." + +#: src/libslic3r/PrintConfig.cpp:960 +msgid "No extrusion" +msgstr "Geen extrusie" + +#: src/libslic3r/PrintConfig.cpp:965 +msgid "Label objects" +msgstr "Label objecten" + +#: src/libslic3r/PrintConfig.cpp:966 +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 "" +"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 " +"extruder en 'Afvegen in object' en 'Afvegen in vulling'." + +#: src/libslic3r/PrintConfig.cpp:973 +msgid "High extruder current on filament swap" +msgstr "Hoge stroomsterkte bij extruder voor filamentwissel" + +#: src/libslic3r/PrintConfig.cpp:974 +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 "" +"Het kan nuttig zijn om de stroomsterkte van de extrudermotor te verhogen " +"tijdens het uitvoeren van de filamentwisseling om snelle ramming mogelijk te " +"maken en om weerstand te overwinnen tijdens het laden van filament met een " +"misvormde kop." + +#: src/libslic3r/PrintConfig.cpp:982 +msgid "" +"This is the acceleration your printer will use for infill. Set zero to " +"disable acceleration control for infill." +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 +msgid "Combine infill every" +msgstr "Combineer vulling elke" + +#: src/libslic3r/PrintConfig.cpp:992 +msgid "" +"This feature allows to combine infill and speed up your print by extruding " +"thicker infill layers while preserving thin perimeters, thus accuracy." +msgstr "" +"Deze optie staat vullingslagen combineren toe voor een snellere print door " +"de vullingslagen stapsgewijs dikker te maken, terwijl de laagdikte van " +"perimeters behouden wordt." + +#: src/libslic3r/PrintConfig.cpp:995 +msgid "Combine infill every n layers" +msgstr "Combineer vulling elke n lagen" + +#: src/libslic3r/PrintConfig.cpp:1001 +msgid "Infill extruder" +msgstr "Vullingsextruder" + +#: src/libslic3r/PrintConfig.cpp:1003 +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 +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 "" +"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 " +"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 +msgid "Infill before perimeters" +msgstr "Vulling vóór perimeters" + +#: src/libslic3r/PrintConfig.cpp:1022 +msgid "" +"This option will switch the print order of perimeters and infill, making the " +"latter first." +msgstr "" +"Deze optie verandert de printvolgorde van perimeters en vulling; de " +"laatstgenoemde eerst." + +#: src/libslic3r/PrintConfig.cpp:1027 +msgid "Only infill where needed" +msgstr "Alleen vulling waar nodig" + +#: src/libslic3r/PrintConfig.cpp:1029 +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 "" +"Deze optie beperkt de vulling tot gebieden waar dit nodig is voor " +"ondersteuning van bovenvlakken (het fungeert als inwendig support). Let op: " +"deze optie vertraagt de G-code-generatie." + +#: src/libslic3r/PrintConfig.cpp:1036 +msgid "Infill/perimeters overlap" +msgstr "Overlapping van vulling/perimeters" + +#: src/libslic3r/PrintConfig.cpp:1038 +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 "" +"Deze instelling zorgt voor een extra overlapping tussen vulling en " +"perimeters voor een betere hechting. Theoretisch gezien is dit niet nodig, " +"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 +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 +msgid "Inherits profile" +msgstr "Afgeleid profiel" + +#: src/libslic3r/PrintConfig.cpp:1058 +msgid "Name of the profile, from which this profile inherits." +msgstr "Profielnaam waar profiel op is gebaseerd." + +#: src/libslic3r/PrintConfig.cpp:1071 +msgid "Interface shells" +msgstr "Interfaceshells" + +#: src/libslic3r/PrintConfig.cpp:1072 +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 "" +"Forceer de generatie van dichte shells tussen aangrenzende materialen/" +"volumes. Dit is handig voor multi-extruderprints met transparante materialen " +"of handmatig oplosbaar support." + +#: src/libslic3r/PrintConfig.cpp:1081 +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 "" +"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 " +"variabelen gebruiken voor alle instellingen zoals 'layer_num' en 'layer_z'." + +#: src/libslic3r/PrintConfig.cpp:1092 +msgid "Supports remaining times" +msgstr "Ondersteunt resterende tijd" + +#: src/libslic3r/PrintConfig.cpp:1093 +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 "" +"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." + +#: src/libslic3r/PrintConfig.cpp:1101 +msgid "Supports stealth mode" +msgstr "Ondersteunt stille modus" + +#: src/libslic3r/PrintConfig.cpp:1102 +msgid "The firmware supports stealth mode" +msgstr "De firmware ondersteunt stille modus" + +#: src/libslic3r/PrintConfig.cpp:1125 +msgid "Maximum feedrate X" +msgstr "Maximale voedingssnelheid van de X-as" + +#: src/libslic3r/PrintConfig.cpp:1126 +msgid "Maximum feedrate Y" +msgstr "Maximale voedingssnelheid van de Y-as" + +#: src/libslic3r/PrintConfig.cpp:1127 +msgid "Maximum feedrate Z" +msgstr "Maximale voedingssnelheid van de Z-as" + +#: src/libslic3r/PrintConfig.cpp:1128 +msgid "Maximum feedrate E" +msgstr "Maximale extrusievoedingssnelheid" + +#: src/libslic3r/PrintConfig.cpp:1131 +msgid "Maximum feedrate of the X axis" +msgstr "Maximale voedingssnelheid van de X-as" + +#: src/libslic3r/PrintConfig.cpp:1132 +msgid "Maximum feedrate of the Y axis" +msgstr "Maximale voedingssnelheid van de Y-as" + +#: src/libslic3r/PrintConfig.cpp:1133 +msgid "Maximum feedrate of the Z axis" +msgstr "Maximale voedingssnelheid van de Z-as" + +#: src/libslic3r/PrintConfig.cpp:1134 +msgid "Maximum feedrate of the E axis" +msgstr "Maximale extrusievoedingssnelheid" + +#: src/libslic3r/PrintConfig.cpp:1142 +msgid "Maximum acceleration X" +msgstr "Maximale acceleratie X" + +#: src/libslic3r/PrintConfig.cpp:1143 +msgid "Maximum acceleration Y" +msgstr "Maximale acceleratie Y" + +#: src/libslic3r/PrintConfig.cpp:1144 +msgid "Maximum acceleration Z" +msgstr "Maximale acceleratie Z" + +#: src/libslic3r/PrintConfig.cpp:1145 +msgid "Maximum acceleration E" +msgstr "Maximale acceleratie E" + +#: src/libslic3r/PrintConfig.cpp:1148 +msgid "Maximum acceleration of the X axis" +msgstr "Maximale acceleratie van de X-as" + +#: src/libslic3r/PrintConfig.cpp:1149 +msgid "Maximum acceleration of the Y axis" +msgstr "Maximale acceleratie van de Y-as" + +#: src/libslic3r/PrintConfig.cpp:1150 +msgid "Maximum acceleration of the Z axis" +msgstr "Maximale acceleratie van de Z-as" + +#: src/libslic3r/PrintConfig.cpp:1151 +msgid "Maximum acceleration of the E axis" +msgstr "Maximale extrusie-acceleratie" + +#: src/libslic3r/PrintConfig.cpp:1159 +msgid "Maximum jerk X" +msgstr "Maximale ruk X" + +#: src/libslic3r/PrintConfig.cpp:1160 +msgid "Maximum jerk Y" +msgstr "Maximale ruk Y" + +#: src/libslic3r/PrintConfig.cpp:1161 +msgid "Maximum jerk Z" +msgstr "Maximale ruk Z" + +#: src/libslic3r/PrintConfig.cpp:1162 +msgid "Maximum jerk E" +msgstr "Maximale ruk E" + +#: src/libslic3r/PrintConfig.cpp:1165 +msgid "Maximum jerk of the X axis" +msgstr "Maximale ruk van de X-as" + +#: src/libslic3r/PrintConfig.cpp:1166 +msgid "Maximum jerk of the Y axis" +msgstr "Maximale ruk van de Y-as" + +#: src/libslic3r/PrintConfig.cpp:1167 +msgid "Maximum jerk of the Z axis" +msgstr "Maximale ruk van de Z-as" + +#: src/libslic3r/PrintConfig.cpp:1168 +msgid "Maximum jerk of the E axis" +msgstr "Maximale extrusie-ruk" + +#: src/libslic3r/PrintConfig.cpp:1178 +msgid "Minimum feedrate when extruding" +msgstr "Minimale voedingssnelheid tijdens extruderen" + +#: src/libslic3r/PrintConfig.cpp:1180 +msgid "Minimum feedrate when extruding (M205 S)" +msgstr "Minimale voedingssnelheid tijdens extruderen (M205 S)" + +#: src/libslic3r/PrintConfig.cpp:1188 +msgid "Minimum travel feedrate" +msgstr "Minimale voedingssnelheid voor bewegingen" + +#: src/libslic3r/PrintConfig.cpp:1190 +msgid "Minimum travel feedrate (M205 T)" +msgstr "Minimale voedingssnelheid voor bewegingen (M205 T)" + +#: src/libslic3r/PrintConfig.cpp:1198 +msgid "Maximum acceleration when extruding" +msgstr "Maximale acceleratie tijdens extruderen" + +#: src/libslic3r/PrintConfig.cpp:1200 +msgid "Maximum acceleration when extruding (M204 S)" +msgstr "Maximale acceleratie tijdens extruderen (M204 S)" + +#: src/libslic3r/PrintConfig.cpp:1208 +msgid "Maximum acceleration when retracting" +msgstr "Maximale acceleratie tijdens retracten" + +#: src/libslic3r/PrintConfig.cpp:1210 +msgid "Maximum acceleration when retracting (M204 T)" +msgstr "Maximale acceleratie tijdens retracten (M204 T)" + +#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226 +msgid "Max" +msgstr "Max" + +#: src/libslic3r/PrintConfig.cpp:1218 +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 +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 "" +"Dit is de hoogst printbare laagdikte voor deze extruder en wordt gebruikt " +"voor de variabele laagdikte en supportlaagdikte. De maximaal aanbevolen " +"laagdikte is 75% van de extrusiebreedte om nog een redelijke laaghechting te " +"krijgen. Als dit ingesteld is op 0, wordt de waarde op 75% van de " +"nozzlediameter genomen." + +#: src/libslic3r/PrintConfig.cpp:1237 +msgid "Max print speed" +msgstr "Maximale printsnelheid" + +#: src/libslic3r/PrintConfig.cpp:1238 +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 "" +"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 " +"toestaat." + +#: src/libslic3r/PrintConfig.cpp:1248 +msgid "" +"This experimental setting is used to set the maximum volumetric speed your " +"extruder supports." +msgstr "" +"Deze experimentele instelling wordt gebruikt voor de maximale volumetrische " +"snelheid van de extruder." + +#: src/libslic3r/PrintConfig.cpp:1257 +msgid "Max volumetric slope positive" +msgstr "Maximale volumetrische stijging" + +#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269 +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 "" +"Deze experimentele instelling wordt gebruikt om de snelheidsveranderingen te " +"limiteren. Een waarde van 1.8mm³/s² zorgt voor een extrusieratio van 1.8mm³/" +"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 +msgid "mm³/s²" +msgstr "mm³/s²" + +#: src/libslic3r/PrintConfig.cpp:1268 +msgid "Max volumetric slope negative" +msgstr "Maximale volumetrische daling" + +#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289 +msgid "Min" +msgstr "Min" + +#: src/libslic3r/PrintConfig.cpp:1281 +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 +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 "" +"Dit is de kleinst printbare laagdikte voor deze extruder en limiteert de " +"resolutie voor variabele laagdikte. Typische waarden zijn tussen 0,05 en 0,1 " +"mm." + +#: src/libslic3r/PrintConfig.cpp:1298 +msgid "Min print speed" +msgstr "Minimale printsnelheid" + +#: src/libslic3r/PrintConfig.cpp:1299 +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 +msgid "Minimal filament extrusion length" +msgstr "Minimale extrusielengte" + +#: src/libslic3r/PrintConfig.cpp:1307 +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 "" +"Genereer meer dan dit aantal skirtlijnen dat nodig is om de aangegeven " +"hoeveelheid filament op de eerste laag te verbruiken. Voor multi-" +"extruderprinters is dit het minimum voor elke extruder." + +#: src/libslic3r/PrintConfig.cpp:1316 +msgid "Configuration notes" +msgstr "Configuratie-opmerkingen" + +#: src/libslic3r/PrintConfig.cpp:1317 +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." + +#: src/libslic3r/PrintConfig.cpp:1327 +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 +msgid "Host Type" +msgstr "Hosttype" + +#: src/libslic3r/PrintConfig.cpp:1333 +msgid "" +"Slic3r can upload G-code files to a printer host. This field must contain " +"the kind of the host." +msgstr "" +"PrusaSlicer kan gcode-bestanden uploaden naar een printerhost. Dit veld moet " +"het type host bevatten." + +#: src/libslic3r/PrintConfig.cpp:1348 +msgid "Only retract when crossing perimeters" +msgstr "Alleen retracten bij kruisende perimeters" + +#: src/libslic3r/PrintConfig.cpp:1349 +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 " +"laag niet overschrijdt (en maakt eventueel druipen dus onzichtbaar)." + +#: src/libslic3r/PrintConfig.cpp:1356 +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 "" +"Deze optie verlaagt de temperatuur van de inactieve extruders om druipen te " +"voorkomen. Het staat een smalle skirt automatisch toe en beweegt extruders " +"buiten zo'n skirt als de temperatuur verandert." + +#: src/libslic3r/PrintConfig.cpp:1363 +msgid "Output filename format" +msgstr "Formaat van bestandsnaam" + +#: src/libslic3r/PrintConfig.cpp:1364 +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 " +"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 +msgid "Detect bridging perimeters" +msgstr "Detecteer brugperimeters" + +#: src/libslic3r/PrintConfig.cpp:1375 +msgid "" +"Experimental option to adjust flow for overhangs (bridge flow will be used), " +"to apply bridge speed to them and enable fan." +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 +msgid "Filament parking position" +msgstr "Filament parkeerpositie" + +#: src/libslic3r/PrintConfig.cpp:1382 +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 "" +"Afstand van de nozzlepunt tot de positie waar het filament wordt geparkeerd " +"wanneer dat niet geladen is. Deze moet overeenkomen met de waarde in de " +"firmware." + +#: src/libslic3r/PrintConfig.cpp:1390 +msgid "Extra loading distance" +msgstr "Extra laadafstand" + +#: src/libslic3r/PrintConfig.cpp:1391 +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 "" +"Als dit ingesteld is op 0, zal de afstand die het filament tijdens het laden " +"uit de parkeerpositie even groot zijn als wanneer het filament " +"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 +msgid "Perimeters" +msgstr "Perimeters" + +#: 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 "" +"Deze acceleratie zal uw printer gebruiken voor perimeters. Als dit ingesteld " +"is op 0, worden acceleratie-instellingen voor perimeters uitgezet." + +#: src/libslic3r/PrintConfig.cpp:1408 +msgid "Perimeter extruder" +msgstr "Perimeterextruder" + +#: src/libslic3r/PrintConfig.cpp:1410 +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 +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 "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte voor " +"de perimeters. Dit kan gebruikt worden voor nauwkeurigere details. Als dit " +"op 0 blijft staan, zal PrusaSlicer de breedte instellen op 1,125x de " +"nozzlediameter. Als dit is uitgedrukt als percentage, wordt dit berekend " +"over de laagdikte." + +#: src/libslic3r/PrintConfig.cpp:1432 +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 +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 "" +"Instelling voor het te genereren aantal perimeters per laag. PrusaSlicer kan " +"dit aantal verhogen als het schuine vlakken detecteert die gebruik maken van " +"een hoger aantal perimeters als de optie voor extra perimeters is " +"ingeschakeld." + +#: src/libslic3r/PrintConfig.cpp:1446 +msgid "(minimum)" +msgstr "(minimum)" + +#: src/libslic3r/PrintConfig.cpp:1454 +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 "" +"Als u de output-G-code via custom scripts wilt verwerken, hoeft u 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 +msgid "Printer type" +msgstr "Printertype" + +#: src/libslic3r/PrintConfig.cpp:1467 +msgid "Type of the printer." +msgstr "Type van de printer." + +#: src/libslic3r/PrintConfig.cpp:1472 +msgid "Printer notes" +msgstr "Printeropmerkingen" + +#: src/libslic3r/PrintConfig.cpp:1473 +msgid "You can put your notes regarding the printer here." +msgstr "Hier kunnen opmerkingen over de printer geplaatst worden." + +#: src/libslic3r/PrintConfig.cpp:1481 +msgid "Printer vendor" +msgstr "Printerleverancier" + +#: src/libslic3r/PrintConfig.cpp:1482 +msgid "Name of the printer vendor." +msgstr "Naam van de printerleverancier." + +#: src/libslic3r/PrintConfig.cpp:1487 +msgid "Printer variant" +msgstr "Printervariant" + +#: src/libslic3r/PrintConfig.cpp:1488 +msgid "" +"Name of the printer variant. For example, the printer variants may be " +"differentiated by a nozzle diameter." +msgstr "" +"Naam van de printervariant. De nozzlediameter kan bijvoorbeeld afwijken voor " +"verschillende varianten." + +#: src/libslic3r/PrintConfig.cpp:1501 +msgid "Raft layers" +msgstr "Raftlagen" + +#: src/libslic3r/PrintConfig.cpp:1503 +msgid "" +"The object will be raised by this number of layers, and support material " +"will be generated under it." +msgstr "" +"Het object wordt verhoogd met dit aantal lagen. Support wordt onder het " +"object gegenereerd." + +#: src/libslic3r/PrintConfig.cpp:1511 +msgid "Resolution" +msgstr "Resolutie" + +#: src/libslic3r/PrintConfig.cpp:1512 +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 resolutie van details. Dit wordt gebruikt om het geïmporteerde " +"bestand sneller te slicen, evenals de grootte van de G-code. Modellen met " +"een hoge resolutie vragen meer van een printer dan mogelijk. Als dit " +"ingesteld is op 0, wordt simplificatie uitgeschakeld." + +#: src/libslic3r/PrintConfig.cpp:1522 +msgid "Minimum travel after retraction" +msgstr "Minimale beweging na retracten" + +#: src/libslic3r/PrintConfig.cpp:1523 +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 +msgid "Retract amount before wipe" +msgstr "Retracthoeveelheid voor het afvegen" + +#: src/libslic3r/PrintConfig.cpp:1530 +msgid "" +"With bowden extruders, it may be wise to do some amount of quick retract " +"before doing the wipe movement." +msgstr "" +"Met Bowden-extruders is het verstandig om een aantal maal snel te retracten " +"voor het afvegen." + +#: src/libslic3r/PrintConfig.cpp:1537 +msgid "Retract on layer change" +msgstr "Retracten bij laagwisselingen" + +#: src/libslic3r/PrintConfig.cpp:1538 +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 +msgid "Length" +msgstr "Lengte" + +#: src/libslic3r/PrintConfig.cpp:1544 +msgid "Retraction Length" +msgstr "Retractielengte" + +#: src/libslic3r/PrintConfig.cpp:1545 +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 "" +"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 +msgid "mm (zero to disable)" +msgstr "mm (stel in op 0 om uit te schakelen)" + +#: src/libslic3r/PrintConfig.cpp:1552 +msgid "Retraction Length (Toolchange)" +msgstr "Retractielengte (toolwissel)" + +#: src/libslic3r/PrintConfig.cpp:1553 +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 "" +"Als retracten is geactiveerd voor toolwisseling wordt filament " +"teruggetrokken op de ingestelde waarde (filamentlengte voor het de extruder " +"in gaat)." + +#: src/libslic3r/PrintConfig.cpp:1561 +msgid "Lift Z" +msgstr "Beweeg Z omhoog" + +#: src/libslic3r/PrintConfig.cpp:1562 +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 " +"enigszins omhoog bij het retracten. Als meerdere extruders worden gebruikt, " +"wordt alleen de instelling van de eerste extruder aangehouden." + +#: src/libslic3r/PrintConfig.cpp:1569 +msgid "Above Z" +msgstr "Boven Z" + +#: src/libslic3r/PrintConfig.cpp:1570 +msgid "Only lift Z above" +msgstr "Beweeg Z alleen omhoog boven" + +#: src/libslic3r/PrintConfig.cpp:1571 +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 "" +"Als dit ingesteld is op een positieve waarde, zal de nozzle alleen boven de " +"ingestelde waarde omhoog bewegen voor het retracten. Deze kan aangepast " +"worden om warping te voorkomen bij de eerste lagen." + +#: src/libslic3r/PrintConfig.cpp:1578 +msgid "Below Z" +msgstr "Onder Z" + +#: src/libslic3r/PrintConfig.cpp:1579 +msgid "Only lift Z below" +msgstr "Beweeg Z alleen omhoog onder" + +#: src/libslic3r/PrintConfig.cpp:1580 +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 "" +"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 +msgid "Extra length on restart" +msgstr "Extra lengte bij een herstart" + +#: src/libslic3r/PrintConfig.cpp:1589 +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 "" +"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 +msgid "" +"When the retraction is compensated after changing tool, the extruder will " +"push this additional amount of filament." +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 +msgid "Retraction Speed" +msgstr "Retractiesnelheid" + +#: src/libslic3r/PrintConfig.cpp:1606 +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 +msgid "Deretraction Speed" +msgstr "Deretractiesnelheid" + +#: src/libslic3r/PrintConfig.cpp:1614 +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 "" +"De laadsnelheid van filament in de extruder na het retracten (geldt alleen " +"voor de extrudermotor). Als dit ingesteld is op 0, wordt de " +"retractiesnelheid gebruikt." + +#: src/libslic3r/PrintConfig.cpp:1621 +msgid "Seam position" +msgstr "Naadpositie" + +#: src/libslic3r/PrintConfig.cpp:1623 +msgid "Position of perimeters starting points." +msgstr "Startpuntpositie van perimeters." + +#: src/libslic3r/PrintConfig.cpp:1629 +msgid "Random" +msgstr "Willekeurig" + +#: src/libslic3r/PrintConfig.cpp:1630 +msgid "Nearest" +msgstr "Dichstbijzijnd" + +#: src/libslic3r/PrintConfig.cpp:1631 +msgid "Aligned" +msgstr "Uitgelijnd" + +#: src/libslic3r/PrintConfig.cpp:1639 +msgid "Direction" +msgstr "Richting" + +#: src/libslic3r/PrintConfig.cpp:1641 +msgid "Preferred direction of the seam" +msgstr "Richtingsvoorkeur voor de naad" + +#: src/libslic3r/PrintConfig.cpp:1642 +msgid "Seam preferred direction" +msgstr "Richtingsvoorkeur voor de naad" + +#: src/libslic3r/PrintConfig.cpp:1649 +msgid "Jitter" +msgstr "Jitter" + +#: src/libslic3r/PrintConfig.cpp:1651 +msgid "Seam preferred direction jitter" +msgstr "Voorkeursrichting voor de naad - jitter" + +#: src/libslic3r/PrintConfig.cpp:1652 +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 +msgid "Distance from object" +msgstr "Afstand vanaf het object" + +#: src/libslic3r/PrintConfig.cpp:1680 +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 "" +"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 +msgid "Skirt height" +msgstr "Skirthoogte" + +#: src/libslic3r/PrintConfig.cpp:1688 +msgid "" +"Height of skirt expressed in layers. Set this to a tall value to use skirt " +"as a shield against drafts." +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 +msgid "Loops (minimum)" +msgstr "Rondgangen (minimaal)" + +#: src/libslic3r/PrintConfig.cpp:1696 +msgid "Skirt Loops" +msgstr "Rondgangen voor de skirt" + +#: src/libslic3r/PrintConfig.cpp:1697 +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 "" +"Het aantal rondgangen van de skirt. Als de minimale extrusielengte is " +"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 +msgid "Slow down if layer print time is below" +msgstr "Vertraag bij een kortere laagprinttijd dan" + +#: src/libslic3r/PrintConfig.cpp:1706 +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 "" +"Als de laagprinttijd wordt berekend onder dit aantal seconden, wordt de " +"printsnelheid verlaagd om de laagprinttijd te verlengen." + +#: src/libslic3r/PrintConfig.cpp:1715 +msgid "Small perimeters" +msgstr "Smalle perimeters" + +#: src/libslic3r/PrintConfig.cpp:1717 +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 "" +"Deze instelling heeft effect op de snelheid van perimeters met een radius " +"die kleiner of gelijk is aan 6.5mm. Als dit is uitgedrukt als percentage, " +"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 +msgid "Solid infill threshold area" +msgstr "Dichte vulling bij oppervlak" + +#: src/libslic3r/PrintConfig.cpp:1729 +msgid "" +"Force solid infill for regions having a smaller area than the specified " +"threshold." +msgstr "" +"Forceer dichte vulling voor delen met een kleiner doorsnee-oppervlak dan de " +"hier ingestelde waarde." + +#: src/libslic3r/PrintConfig.cpp:1730 +msgid "mm²" +msgstr "mm²" + +#: src/libslic3r/PrintConfig.cpp:1736 +msgid "Solid infill extruder" +msgstr "Extruder voor dichte vulling" + +#: src/libslic3r/PrintConfig.cpp:1738 +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 +msgid "Solid infill every" +msgstr "Dichte vulling elke" + +#: src/libslic3r/PrintConfig.cpp:1746 +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 "" +"Deze optie staat het genereren van een dichte laag tussen het ingestelde " +"aantal lagen toe. Stel in op 0 om dit uit te schakelen. Stel dit in op een " +"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 +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 "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte voor " +"de vulling van dichte lagen. Als die op 0 blijft staan, zal PrusaSlicer de " +"breedte instellen op 1,125x de nozzlediameter. Als dit is uitgedrukt als " +"percentage, wordt dit berekend over de laagdikte." + +#: src/libslic3r/PrintConfig.cpp:1769 +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 "" +"Printsnelheid van dichte delen. Als dit is uitgedrukt als percentage, wordt " +"dit berekend over de standaard vullingssnelheid. Als dit ingesteld is op 0, " +"worden automatische waarden genomen." + +#: src/libslic3r/PrintConfig.cpp:1781 +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 +msgid "Minimum thickness of a top / bottom shell" +msgstr "Minimale dikte van top-/bodemshell" + +#: src/libslic3r/PrintConfig.cpp:1794 +msgid "Spiral vase" +msgstr "Spiraalmodus" + +#: 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 "" +"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." + +#: src/libslic3r/PrintConfig.cpp:1803 +msgid "Temperature variation" +msgstr "Temperatuurverschil" + +#: src/libslic3r/PrintConfig.cpp:1804 +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 "" +"Temperatuurverschil dat wordt toegepast als een extruder niet actief is. Dit " +"genereert een afveegblok waarop de nozzle wordt schoongeveegd." + +#: src/libslic3r/PrintConfig.cpp:1814 +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 "" +"Deze startprocedure wordt aan het begin ingevoegd, nadat het bed de gewenste " +"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." + +#: src/libslic3r/PrintConfig.cpp:1829 +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 "" +"Deze startprocedure wordt aan het begin ingevoegd, na een eventuele " +"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 +msgid "Single Extruder Multi Material" +msgstr "Multi-material met één extruder" + +#: src/libslic3r/PrintConfig.cpp:1846 +msgid "The printer multiplexes filaments into a single hot end." +msgstr "De printer mengt filament in een enkele extruder." + +#: src/libslic3r/PrintConfig.cpp:1851 +msgid "Prime all printing extruders" +msgstr "Veeg alle printextruders af" + +#: src/libslic3r/PrintConfig.cpp:1852 +msgid "" +"If enabled, all printing extruders will be primed at the front edge of the " +"print bed at the start of the print." +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 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "Geen smalle lagen (experimenteel)" + +#: src/libslic3r/PrintConfig.cpp:1858 +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 "" +"Het afveegblok wordt niet geprint bij lagen zonder toolwisselingen als dit " +"is ingeschakeld. Op lagen met een toolwissel zal de extruder neerwaarts " +"bewegen naar het afveegblok. De gebruiker is verantwoordelijk voor eventuele " +"botsingen met de print." + +#: src/libslic3r/PrintConfig.cpp:1865 +msgid "Generate support material" +msgstr "Genereer support" + +#: src/libslic3r/PrintConfig.cpp:1867 +msgid "Enable support material generation." +msgstr "Sta de generatie van support toe." + +#: src/libslic3r/PrintConfig.cpp:1871 +msgid "Auto generated supports" +msgstr "Automatisch gegenereerd support" + +#: src/libslic3r/PrintConfig.cpp:1873 +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 wordt automatisch gegenereerd als dit aan staat. Als dit niet " +"aanstaat zal support alleen bij supportforceringen gegenereerd worden." + +#: src/libslic3r/PrintConfig.cpp:1879 +msgid "XY separation between an object and its support" +msgstr "Horizontale ruimte tussen het object en het support" + +#: src/libslic3r/PrintConfig.cpp:1881 +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 "" +"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 +msgid "Pattern angle" +msgstr "Patroonhoek" + +#: src/libslic3r/PrintConfig.cpp:1893 +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 +msgid "" +"Only create support if it lies on a build plate. Don't create support on a " +"print." +msgstr "" +"Genereer alleen support als dit op het bed geplaatst wordt, dus niet op de " +"print zelf." + +#: src/libslic3r/PrintConfig.cpp:1909 +msgid "Contact Z distance" +msgstr "Contact Z-afstand" + +#: src/libslic3r/PrintConfig.cpp:1911 +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 "" +"De afstand tussen objecten en het support. Stel in op 0 om te voorkomen dat " +"PrusaSlicer bruginstellingen gebruikt voor de eerste laag boven het " +"supportdak." + +#: src/libslic3r/PrintConfig.cpp:1918 +msgid "0 (soluble)" +msgstr "0 (oplosbaar)" + +#: src/libslic3r/PrintConfig.cpp:1919 +msgid "0.2 (detachable)" +msgstr "0.2 (losbreekbaar)" + +#: src/libslic3r/PrintConfig.cpp:1924 +msgid "Enforce support for the first" +msgstr "Forceer support voor de eerste" + +#: src/libslic3r/PrintConfig.cpp:1926 +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 "" +"Genereer support voor het ingevoerd aantal lagen, tellend vanaf de bodem, " +"ongeacht de plekken waar standaard support al dan niet is toegestaan, " +"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 +msgid "Enforce support for the first n layers" +msgstr "Forceer support voor de eerste n lagen" + +#: src/libslic3r/PrintConfig.cpp:1937 +msgid "Support material/raft/skirt extruder" +msgstr "Extruder voor support/raft/skirt" + +#: src/libslic3r/PrintConfig.cpp:1939 +msgid "" +"The extruder to use when printing support material, raft and skirt (1+, 0 to " +"use the current extruder to minimize tool changes)." +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 +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 "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte voor " +"het support. Als die op 0 blijft staan, zal PrusaSlicer de breedte instellen " +"zelf bepalen op basis van de nozzlediameter. Als dit is uitgedrukt als " +"percentage, wordt dit berekend over de laagdikte." + +#: src/libslic3r/PrintConfig.cpp:1957 +msgid "Interface loops" +msgstr "Interface rondgangen" + +#: src/libslic3r/PrintConfig.cpp:1959 +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 +msgid "Support material/raft interface extruder" +msgstr "Extruder voor supportdak en de bovenlaag van de raft" + +#: src/libslic3r/PrintConfig.cpp:1966 +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 "" +"De extruder die gebruikt wordt voor de supportinterface (stel in op hoger " +"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 +msgid "Interface layers" +msgstr "Supportinterface-lagen" + +#: src/libslic3r/PrintConfig.cpp:1975 +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 +msgid "Interface pattern spacing" +msgstr "Tussenafstand voor interface" + +#: src/libslic3r/PrintConfig.cpp:1984 +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 +msgid "" +"Speed for printing support material interface layers. If expressed as " +"percentage (for example 50%) it will be calculated over support material " +"speed." +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 +msgid "Pattern" +msgstr "Patroon" + +#: src/libslic3r/PrintConfig.cpp:2004 +msgid "Pattern used to generate support material." +msgstr "Patroon dat gebruikt wordt voor het support." + +#: src/libslic3r/PrintConfig.cpp:2010 +msgid "Rectilinear grid" +msgstr "Rechtlijnig raster" + +#: src/libslic3r/PrintConfig.cpp:2016 +msgid "Pattern spacing" +msgstr "Tussenafstand van het patroon" + +#: src/libslic3r/PrintConfig.cpp:2018 +msgid "Spacing between support material lines." +msgstr "Afstand tussen supportlijnen." + +#: src/libslic3r/PrintConfig.cpp:2027 +msgid "Speed for printing support material." +msgstr "Printsnelheid voor support." + +#: src/libslic3r/PrintConfig.cpp:2034 +msgid "Synchronize with object layers" +msgstr "Synchroniseer met objectlagen" + +#: src/libslic3r/PrintConfig.cpp:2036 +msgid "" +"Synchronize support layers with the object print layers. This is useful with " +"multi-material printers, where the extruder switch is expensive." +msgstr "" +"Synchroniseer de supportlagen met de objectlagen. Dit is handig voor multi-" +"materialprinters waar een toolwissel duur is." + +#: src/libslic3r/PrintConfig.cpp:2042 +msgid "Overhang threshold" +msgstr "Maximale overhanghoek" + +#: src/libslic3r/PrintConfig.cpp:2044 +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 "" +"Support wordt niet gegenereerd als de overhanghoek boven de gegeven waarde " +"ligt. In andere woorden; deze waarde geeft de hoek met het bed aan die " +"geprint moet worden met support. Als dit ingesteld is op 0, wordt dit " +"automatisch gedetecteerd (aanbevolen)." + +#: src/libslic3r/PrintConfig.cpp:2056 +msgid "With sheath around the support" +msgstr "Met schild rond het support" + +#: src/libslic3r/PrintConfig.cpp:2058 +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 "" +"Voeg een schild (één perimeterlijn) rondom het support toe. Dit maakt het " +"support betrouwbaarder maar ook moeilijker te verwijderen." + +#: 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 "" +"Extrudertemperatuur voor lager direct na de eerste laag. Als dit ingesteld " +"is op 0, voorkomt dit een verschil in de output." + +#: src/libslic3r/PrintConfig.cpp:2073 +msgid "Detect thin walls" +msgstr "Detecteer dunne wanden" + +#: src/libslic3r/PrintConfig.cpp:2075 +msgid "" +"Detect single-width walls (parts where two extrusions don't fit and we need " +"to collapse them into a single trace)." +msgstr "" +"Detecteer éénlijnige wanden (delen waar 2 extrusielijnen niet passen en dit " +"geprint moet worden met 1 lijn)." + +#: src/libslic3r/PrintConfig.cpp:2081 +msgid "Threads" +msgstr "Meerdere processen" + +#: src/libslic3r/PrintConfig.cpp:2082 +msgid "" +"Threads are used to parallelize long-running tasks. Optimal threads number " +"is slightly above the number of available cores/processors." +msgstr "" +"Meerdere processen worden gebruikt om langdurige commando's parallel te " +"draaien. Het optimaal aantal processen is vlak boven het aanwezige aantal " +"kernen/processoren." + +#: src/libslic3r/PrintConfig.cpp:2094 +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 "" +"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." + +#: src/libslic3r/PrintConfig.cpp:2107 +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 "" +"Stel in op een niet-nulwaarde om te werken met manuele extrusiebreedte voor " +"de vulling van bovenvlakken. Dit kan gebruikt worden voor een dunner " +"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 +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 "" +"Printsnelheid voor dichte toplagen (alleen de buitenste zichtbare laag). Als " +"deze waarde lager wordt gezet, resulteert dit in een gladder oppervlak. Als " +"dit is uitgedrukt als percentage, wordt dit berekend over de " +"vullingssnelheid. Als dit ingesteld is op 0, wordt een automatische snelheid " +"genomen." + +#: src/libslic3r/PrintConfig.cpp:2134 +msgid "Number of solid layers to generate on top surfaces." +msgstr "Aantal te genereren dichte lagen voor bovenvlakken." + +#: src/libslic3r/PrintConfig.cpp:2135 +msgid "Top solid layers" +msgstr "Bovenste dichte vulling" + +#: src/libslic3r/PrintConfig.cpp:2143 +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 "" +"Het aantal dichte bovenlagen wordt verhoogd als blijkt dat dit nodig is om " +"de minimale shelldikte te garanderen. Dit is handig om kussenvorming te " +"voorkomen bij het printen met variabele laagdikte." + +#: src/libslic3r/PrintConfig.cpp:2146 +msgid "Minimum top shell thickness" +msgstr "Minimale shelldikte aan de bovenzijde" + +#: src/libslic3r/PrintConfig.cpp:2153 +msgid "Speed for travel moves (jumps between distant extrusion points)." +msgstr "Bewegingssnelheid als niet geëxtrudeerd wordt." + +#: src/libslic3r/PrintConfig.cpp:2161 +msgid "Use firmware retraction" +msgstr "Gebruik de firmware-retractie" + +#: src/libslic3r/PrintConfig.cpp:2162 +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." + +#: src/libslic3r/PrintConfig.cpp:2168 +msgid "Use relative E distances" +msgstr "Gebruik relatieve E-waarden" + +#: src/libslic3r/PrintConfig.cpp:2169 +msgid "" +"If your firmware requires relative E values, check this, otherwise leave it " +"unchecked. Most firmwares use absolute values." +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 +msgid "Use volumetric E" +msgstr "Gebruik volumetrische E-waarden" + +#: src/libslic3r/PrintConfig.cpp:2176 +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 "" +"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 " +"variabele gebruikt de filamentdiameter zoals ingevoerd bij de " +"filamentinstellingen. Dit wordt alleen ondersteund in de recente Marlin-" +"variant." + +#: src/libslic3r/PrintConfig.cpp:2186 +msgid "Enable variable layer height feature" +msgstr "Sta variabele laagdikte toe" + +#: src/libslic3r/PrintConfig.cpp:2187 +msgid "" +"Some printers or printer setups may have difficulties printing with a " +"variable layer height. Enabled by default." +msgstr "" +"Sommige printers of printersetups kunnen niet printen met een variabele " +"laagdikte. Staat standaard aan." + +#: src/libslic3r/PrintConfig.cpp:2193 +msgid "Wipe while retracting" +msgstr "Veeg af bij het retracten" + +#: src/libslic3r/PrintConfig.cpp:2194 +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 " +"lekkende extruders tegen te gaan." + +#: src/libslic3r/PrintConfig.cpp:2201 +msgid "" +"Multi material printers may need to prime or purge extruders on tool " +"changes. Extrude the excess material into the wipe tower." +msgstr "" +"Multi-materialprinters moeten afvegen bij toolwisselingen. Extrudeer het " +"overtollige materiaal op het afveegblok." + +#: src/libslic3r/PrintConfig.cpp:2207 +msgid "Purging volumes - load/unload volumes" +msgstr "Afveegvolume - laad/ontlaad volumes" + +#: src/libslic3r/PrintConfig.cpp:2208 +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 "" +"Deze vector bespaart de benodigde volumes om van/naar elke extruder dat op " +"het afveegblok wordt gebruikt te wisselen. Deze waarden worden gebruikt om " +"het creëren van de onderstaande volledige reinigingsvolumes te " +"vereenvoudigen." + +#: src/libslic3r/PrintConfig.cpp:2214 +msgid "Purging volumes - matrix" +msgstr "Afveegvolume - matrix" + +#: src/libslic3r/PrintConfig.cpp:2215 +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 "" +"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 +msgid "Position X" +msgstr "X-positie" + +#: src/libslic3r/PrintConfig.cpp:2225 +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 +msgid "Position Y" +msgstr "Y-positie" + +#: src/libslic3r/PrintConfig.cpp:2232 +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 +msgid "Width of a wipe tower" +msgstr "Breedte van het afveegblok" + +#: src/libslic3r/PrintConfig.cpp:2245 +msgid "Wipe tower rotation angle" +msgstr "Rotatie van het afveegblok" + +#: src/libslic3r/PrintConfig.cpp:2246 +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 +msgid "Wipe into this object's infill" +msgstr "Afvegen in de vulling van het object" + +#: src/libslic3r/PrintConfig.cpp:2254 +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 "" +"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 +msgid "Wipe into this object" +msgstr "Afvegen in dit object" + +#: src/libslic3r/PrintConfig.cpp:2262 +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 "" +"Het object wordt gebruikt om de nozzle af te vegen bij een toolwissel om " +"materiaal dat anders in het afveegblok gebruikt wordt te besparen. Kleuren " +"kunnen dan gemengd worden." + +#: src/libslic3r/PrintConfig.cpp:2268 +msgid "Maximal bridging distance" +msgstr "Maximale brugafstand" + +#: src/libslic3r/PrintConfig.cpp:2269 +msgid "Maximal distance between supports on sparse infill sections." +msgstr "Maximale afstand tussen support op dunne vullingsdelen." + +#: src/libslic3r/PrintConfig.cpp:2275 +msgid "XY Size Compensation" +msgstr "Compensatie voor X- en Y-grootte" + +#: src/libslic3r/PrintConfig.cpp:2277 +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 "" +"Het object wordt in horizontale richting verbreed/versmald in de ingestelde " +"waarde (negatief = naar binnen, positief = naar buiten). Dit kan handig zijn " +"voor het verfijnen van gaten." + +#: src/libslic3r/PrintConfig.cpp:2285 +msgid "Z offset" +msgstr "Z-hoogte" + +#: src/libslic3r/PrintConfig.cpp:2286 +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 "" +"Deze waarde wordt toegevoegd (of afgetrokken) van alle Z-coördinaten in de G-" +"code. Het wordt gebruikt voor een slechte Z-eindstop positie. Als de Z-" +"eindstop bijvoorbeeld een waarde gebruikt die 0.3mm van het printbed is, kan " +"dit ingesteld worden op -0.3mm." + +#: src/libslic3r/PrintConfig.cpp:2353 +msgid "Display width" +msgstr "Schermbreedte" + +#: src/libslic3r/PrintConfig.cpp:2354 +msgid "Width of the display" +msgstr "Breedte van het scherm" + +#: src/libslic3r/PrintConfig.cpp:2359 +msgid "Display height" +msgstr "Schermhoogte" + +#: src/libslic3r/PrintConfig.cpp:2360 +msgid "Height of the display" +msgstr "Hoogte van het scherm" + +#: src/libslic3r/PrintConfig.cpp:2365 +msgid "Number of pixels in" +msgstr "Aantal pixels" + +#: src/libslic3r/PrintConfig.cpp:2367 +msgid "Number of pixels in X" +msgstr "Aantal pixels in de breedte" + +#: src/libslic3r/PrintConfig.cpp:2373 +msgid "Number of pixels in Y" +msgstr "Aantal pixels in de hoogte" + +#: src/libslic3r/PrintConfig.cpp:2378 +msgid "Display horizontal mirroring" +msgstr "Scherm horizontaal spiegelen" + +#: src/libslic3r/PrintConfig.cpp:2379 +msgid "Mirror horizontally" +msgstr "Spiegel horizontaal" + +#: src/libslic3r/PrintConfig.cpp:2380 +msgid "Enable horizontal mirroring of output images" +msgstr "Horizontaal spiegelen" + +#: src/libslic3r/PrintConfig.cpp:2385 +msgid "Display vertical mirroring" +msgstr "Scherm verticaal spiegelen" + +#: src/libslic3r/PrintConfig.cpp:2386 +msgid "Mirror vertically" +msgstr "Verticaal spiegelen" + +#: src/libslic3r/PrintConfig.cpp:2387 +msgid "Enable vertical mirroring of output images" +msgstr "Verticaal spiegelen" + +#: src/libslic3r/PrintConfig.cpp:2392 +msgid "Display orientation" +msgstr "Schermoriëntatie" + +#: src/libslic3r/PrintConfig.cpp:2393 +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 "" +"Stel de werkelijke oriëntatie van het LCD-scherm van de SLA-printer in. " +"Staande modus zal de breedte- en hoogteparameters omwisselen en de output " +"wordt 90 graden gedraaid." + +#: src/libslic3r/PrintConfig.cpp:2399 +msgid "Landscape" +msgstr "Liggend" + +#: src/libslic3r/PrintConfig.cpp:2400 +msgid "Portrait" +msgstr "Staand" + +#: src/libslic3r/PrintConfig.cpp:2405 +msgid "Fast" +msgstr "Snel" + +#: src/libslic3r/PrintConfig.cpp:2406 +msgid "Fast tilt" +msgstr "Snelle kanteling" + +#: src/libslic3r/PrintConfig.cpp:2407 +msgid "Time of the fast tilt" +msgstr "Tijd van de snelle kanteling" + +#: src/libslic3r/PrintConfig.cpp:2414 +msgid "Slow" +msgstr "Langzaam" + +#: src/libslic3r/PrintConfig.cpp:2415 +msgid "Slow tilt" +msgstr "Langzaam kantelen" + +#: src/libslic3r/PrintConfig.cpp:2416 +msgid "Time of the slow tilt" +msgstr "Tijd van de langzame kanteling" + +#: src/libslic3r/PrintConfig.cpp:2423 +msgid "Area fill" +msgstr "Vulgebied" + +#: 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 "" +"Percentage van het printbed. \n" +"Als het printgebied buiten een specifieke waarde valt \n" +"wordt een korte kanteling gebruikt, anders een snelle kanteling" + +#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2433 +msgid "Printer scaling correction" +msgstr "Verschalingscorrectie voor printer" + +#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 +msgid "Printer absolute correction" +msgstr "Absolute correctie voor printer" + +#: src/libslic3r/PrintConfig.cpp:2441 +msgid "" +"Will inflate or deflate the sliced 2D polygons according to the sign of the " +"correction." +msgstr "" +"Zal de geslicede veelhoeken uitrekken of laten krimpen, afhankelijk van de " +"correctiewaarde." + +#: src/libslic3r/PrintConfig.cpp:2447 +msgid "Elephant foot minimum width" +msgstr "Squishcompensatiebreedte" + +#: src/libslic3r/PrintConfig.cpp:2449 +msgid "" +"Minimum width of features to maintain when doing elephant foot compensation." +msgstr "Minimale breedte van delen waarop squishcompensatie wordt toegepast." + +#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457 +msgid "Printer gamma correction" +msgstr "Gammacorrectie voor printer" + +#: src/libslic3r/PrintConfig.cpp:2458 +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 "" +"Dit zorgt voor een gammacorrectie voor de veelhoeken. Een gammawaarde van 0 " +"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 +msgid "SLA material type" +msgstr "SLA-materiaaltype" + +#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483 +msgid "Initial layer height" +msgstr "Laagdikte eerste laag" + +#: src/libslic3r/PrintConfig.cpp:2489 src/libslic3r/PrintConfig.cpp:2490 +msgid "Bottle volume" +msgstr "Flesinhoud (volume)" + +#: src/libslic3r/PrintConfig.cpp:2491 +msgid "ml" +msgstr "ml" + +#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497 +msgid "Bottle weight" +msgstr "Flesinhoud (gewicht)" + +#: src/libslic3r/PrintConfig.cpp:2498 +msgid "kg" +msgstr "kg" + +#: src/libslic3r/PrintConfig.cpp:2505 +msgid "g/ml" +msgstr "g/ml" + +#: src/libslic3r/PrintConfig.cpp:2512 +msgid "money/bottle" +msgstr "€/fles" + +#: src/libslic3r/PrintConfig.cpp:2517 +msgid "Faded layers" +msgstr "Transitielagen" + +#: src/libslic3r/PrintConfig.cpp:2518 +msgid "" +"Number of the layers needed for the exposure time fade from initial exposure " +"time to the exposure time" +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 +msgid "Minimum exposure time" +msgstr "Minimale belichtingstijd" + +#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534 +msgid "Maximum exposure time" +msgstr "Maximale belichtingstijd" + +#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542 +msgid "Exposure time" +msgstr "Belichtingstijd" + +#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549 +msgid "Minimum initial exposure time" +msgstr "Minimale initiële belichtingstijd" + +#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557 +msgid "Maximum initial exposure time" +msgstr "Maximale initiële belichtingstijd" + +#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565 +msgid "Initial exposure time" +msgstr "Initiële belichtingstijd" + +#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572 +msgid "Correction for expansion" +msgstr "Vergrotingscorrectie" + +#: src/libslic3r/PrintConfig.cpp:2578 +msgid "SLA print material notes" +msgstr "SLA-printmateriaal opmerkingen" + +#: src/libslic3r/PrintConfig.cpp:2579 +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 +msgid "Default SLA material profile" +msgstr "Standaard SLA-materiaalprofiel" + +#: src/libslic3r/PrintConfig.cpp:2613 +msgid "Generate supports" +msgstr "Genereer support" + +#: src/libslic3r/PrintConfig.cpp:2615 +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:2622 +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:2631 +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:2640 +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:2650 +msgid "Diameter in mm of the support pillars" +msgstr "Diameter van de supportpijlers (in mm)" + +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "Maximaal aantal bruggen op een pijler" + +#: src/libslic3r/PrintConfig.cpp:2660 +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 "" +"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:2669 +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 "" +"Geeft het type brug tussen twee aangrenzende pijlers aan. Dit kan zigzag, " +"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 +msgid "Zig-Zag" +msgstr "Zigzag" + +#: src/libslic3r/PrintConfig.cpp:2678 +msgid "Cross" +msgstr "Kruisend" + +#: src/libslic3r/PrintConfig.cpp:2679 +msgid "Dynamic" +msgstr "Dynamisch" + +#: src/libslic3r/PrintConfig.cpp:2691 +msgid "Pillar widening factor" +msgstr "Pijlervergrotingsfactor" + +#: src/libslic3r/PrintConfig.cpp:2693 +msgid "" +"Merging bridges or pillars into another pillars can increase the radius. " +"Zero means no increase, one means full increase." +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 +msgid "Support base diameter" +msgstr "Supportbasis - diameter" + +#: src/libslic3r/PrintConfig.cpp:2704 +msgid "Diameter in mm of the pillar base" +msgstr "Diameter van de pijlerbasis (in mm)" + +#: src/libslic3r/PrintConfig.cpp:2712 +msgid "Support base height" +msgstr "Supportbasis - hoogte" + +#: src/libslic3r/PrintConfig.cpp:2714 +msgid "The height of the pillar base cone" +msgstr "Hoogte van de pijlerbasiskegel" + +#: src/libslic3r/PrintConfig.cpp:2721 +msgid "Support base safety distance" +msgstr "Supportbasis - veilige afstand" + +#: src/libslic3r/PrintConfig.cpp:2724 +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 "" +"Minimale afstand tussen pijlerbasis en model (in mm). Dit is handig bij de " +"modus zonder verhoging waar een gat volgens deze parameter wordt ingevoegd " +"tussen het model en de basisplaat." + +#: src/libslic3r/PrintConfig.cpp:2734 +msgid "Critical angle" +msgstr "Kritische hoek" + +#: src/libslic3r/PrintConfig.cpp:2736 +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 +msgid "Max bridge length" +msgstr "Maximale bruglengte" + +#: src/libslic3r/PrintConfig.cpp:2746 +msgid "The max length of a bridge" +msgstr "Maximale bruglengte" + +#: src/libslic3r/PrintConfig.cpp:2753 +msgid "Max pillar linking distance" +msgstr "Maximale pijler-verbindafstand" + +#: src/libslic3r/PrintConfig.cpp:2755 +msgid "" +"The max distance of two pillars to get linked with each other. A zero value " +"will prohibit pillar cascading." +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 +msgid "" +"How much the supports should lift up the supported object. If \"Pad around " +"object\" is enabled, this value is ignored." +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 +msgid "This is a relative measure of support points density." +msgstr "Relatieve waarde van de dichtheid van supportpunten." + +#: src/libslic3r/PrintConfig.cpp:2782 +msgid "Minimal distance of the support points" +msgstr "Minimale supportpuntafstand" + +#: src/libslic3r/PrintConfig.cpp:2784 +msgid "No support points will be placed closer than this threshold." +msgstr "Minimale afstand tussen supportpunten." + +#: src/libslic3r/PrintConfig.cpp:2790 +msgid "Use pad" +msgstr "Gebruik basisplaat" + +#: src/libslic3r/PrintConfig.cpp:2792 +msgid "Add a pad underneath the supported model" +msgstr "Voeg een basisplaat toe onder het model met support" + +#: src/libslic3r/PrintConfig.cpp:2797 +msgid "Pad wall thickness" +msgstr "Basisplaat - wanddikte" + +#: src/libslic3r/PrintConfig.cpp:2799 +msgid "The thickness of the pad and its optional cavity walls." +msgstr "Dikte van de basisplaat en optionele wanden." + +#: src/libslic3r/PrintConfig.cpp:2807 +msgid "Pad wall height" +msgstr "Basisplaat - wandhoogte" + +#: src/libslic3r/PrintConfig.cpp:2808 +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 "" +"Geeft de basisplaat-wandhoogte aan. Als dit ingesteld is op 0, wordt dit " +"uitgeschakeld. Wees voorzichtig met het aanzetten van deze optie, omdat " +"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 +msgid "Pad brim size" +msgstr "Basisplaat - expansie" + +#: src/libslic3r/PrintConfig.cpp:2822 +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 +msgid "Max merge distance" +msgstr "Maximale combineerafstand" + +#: src/libslic3r/PrintConfig.cpp:2834 +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 "" +"Sommige objecten werken beter met een aantal kleinere basisplaten in plaats " +"van één grote. Deze parameter bepaalt hoe ver de tussenafstand van de " +"kleinere basisplaten mogen zijn." + +#: src/libslic3r/PrintConfig.cpp:2854 +msgid "Pad wall slope" +msgstr "Basisplaat - zijhoek" + +#: src/libslic3r/PrintConfig.cpp:2856 +msgid "" +"The slope of the pad wall relative to the bed plane. 90 degrees means " +"straight walls." +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 +msgid "Create pad around object and ignore the support elevation" +msgstr "Genereer basisplaat rondom object en schakel objectverhoging uit" + +#: src/libslic3r/PrintConfig.cpp:2872 +msgid "Pad around object everywhere" +msgstr "Overal basisplaat rondom object" + +#: src/libslic3r/PrintConfig.cpp:2874 +msgid "Force pad around object everywhere" +msgstr "Forceer basisplaat overal rondom het object" + +#: src/libslic3r/PrintConfig.cpp:2879 +msgid "Pad object gap" +msgstr "Basisplaat - gat" + +#: src/libslic3r/PrintConfig.cpp:2881 +msgid "" +"The gap between the object bottom and the generated pad in zero elevation " +"mode." +msgstr "" +"Het gat tussen de onderkant van het object en de gegenereerde basisplaat in " +"de modus zonder verhoging." + +#: src/libslic3r/PrintConfig.cpp:2890 +msgid "Pad object connector stride" +msgstr "Basisplaat - verbindingstakafstand" + +#: src/libslic3r/PrintConfig.cpp:2892 +msgid "" +"Distance between two connector sticks which connect the object and the " +"generated pad." +msgstr "" +"Afstand tussen twee verbindingstakken die het object verbinden aan de " +"basisplaat." + +#: src/libslic3r/PrintConfig.cpp:2899 +msgid "Pad object connector width" +msgstr "Basisplaat - verbindingstakbreedte" + +#: src/libslic3r/PrintConfig.cpp:2901 +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 +msgid "Pad object connector penetration" +msgstr "Basisplaat - Verbindingstakinsteek" + +#: src/libslic3r/PrintConfig.cpp:2911 +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 +msgid "Enable hollowing" +msgstr "Uithollen toestaan" + +#: src/libslic3r/PrintConfig.cpp:2920 +msgid "Hollow out a model to have an empty interior" +msgstr "Hol een model uit voor een leeg binnenste" + +#: src/libslic3r/PrintConfig.cpp:2925 +msgid "Wall thickness" +msgstr "Wanddikte" + +#: src/libslic3r/PrintConfig.cpp:2927 +msgid "Minimum wall thickness of a hollowed model." +msgstr "Minimale wanddikte van een uitgehold model." + +#: src/libslic3r/PrintConfig.cpp:2935 +msgid "Accuracy" +msgstr "Nauwkeurigheid" + +#: src/libslic3r/PrintConfig.cpp:2937 +msgid "" +"Performance vs accuracy of calculation. Lower values may produce unwanted " +"artifacts." +msgstr "" +"Prestatie tegenover nauwkeurigheid van berekenen. Lagere waarde kunnen " +"ongewenste artefacten produceren." + +#: src/libslic3r/PrintConfig.cpp:2947 +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 "" +"Uithollen voltooid in twee stappen: eerst is een denkbeeldig binnenste in " +"het model berekend (wanddikte + sluitafstand). Daarna is het opgeblazen, " +"terug naar de aangegeven wanddikte. Een grotere sluitafstand maakt het " +"binnenste ronder. Bij een waarde van 0 is het binnenste vrijwel gelijk aan " +"de buitenzijde." + +#: src/libslic3r/PrintConfig.cpp:3330 +msgid "Export OBJ" +msgstr "Exporteer OBJ" + +#: src/libslic3r/PrintConfig.cpp:3331 +msgid "Export the model(s) as OBJ." +msgstr "Exporteer de modellen als OBJ-bestand." + +#: src/libslic3r/PrintConfig.cpp:3342 +msgid "Export SLA" +msgstr "Exporteer SLA" + +#: src/libslic3r/PrintConfig.cpp:3343 +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 +msgid "Export 3MF" +msgstr "Exporteer 3MF" + +#: src/libslic3r/PrintConfig.cpp:3349 +msgid "Export the model(s) as 3MF." +msgstr "Exporteer de modellen als 3MF-bestanden." + +#: src/libslic3r/PrintConfig.cpp:3353 +msgid "Export AMF" +msgstr "Exporteer AMF" + +#: src/libslic3r/PrintConfig.cpp:3354 +msgid "Export the model(s) as AMF." +msgstr "Exporteer de modellen als AMF-bestanden." + +#: src/libslic3r/PrintConfig.cpp:3358 +msgid "Export STL" +msgstr "Exporteer STL" + +#: src/libslic3r/PrintConfig.cpp:3359 +msgid "Export the model(s) as STL." +msgstr "Exporteer de modellen als STL-bestand." + +#: src/libslic3r/PrintConfig.cpp:3364 +msgid "Slice the model and export toolpaths as G-code." +msgstr "Slice het model en exporteer de bewegingen als gcode-bestand." + +#: src/libslic3r/PrintConfig.cpp:3369 +msgid "Slice" +msgstr "Slice" + +#: src/libslic3r/PrintConfig.cpp:3370 +msgid "" +"Slice the model as FFF or SLA based on the printer_technology configuration " +"value." +msgstr "" +"Slice het model als FFF of SLA, gebaseerd op de 'printer_technology'-" +"configuratiewaarde." + +#: src/libslic3r/PrintConfig.cpp:3375 +msgid "Help" +msgstr "Help" + +#: src/libslic3r/PrintConfig.cpp:3376 +msgid "Show this help." +msgstr "Toon deze hulp zien." + +#: src/libslic3r/PrintConfig.cpp:3381 +msgid "Help (FFF options)" +msgstr "Help (FFF-opties)" + +#: src/libslic3r/PrintConfig.cpp:3382 +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 +msgid "Help (SLA options)" +msgstr "Help (SLA opties)" + +#: src/libslic3r/PrintConfig.cpp:3387 +msgid "Show the full list of SLA print configuration options." +msgstr "Toon de volledige lijst van SLA-printconfiguratie-opties." + +#: src/libslic3r/PrintConfig.cpp:3391 +msgid "Output Model Info" +msgstr "Output model-info" + +#: src/libslic3r/PrintConfig.cpp:3392 +msgid "Write information about the model to the console." +msgstr "Schrijf informatie over het model naar de console." + +#: src/libslic3r/PrintConfig.cpp:3396 +msgid "Save config file" +msgstr "Sla configuratiebestand op" + +#: src/libslic3r/PrintConfig.cpp:3397 +msgid "Save configuration to the specified file." +msgstr "Sla configuratie op in aangegeven bestand." + +#: src/libslic3r/PrintConfig.cpp:3407 +msgid "Align XY" +msgstr "XY uitlijnen" + +#: src/libslic3r/PrintConfig.cpp:3408 +msgid "Align the model to the given point." +msgstr "Lijn de modellen uit op het gegeven punt." + +#: src/libslic3r/PrintConfig.cpp:3413 +msgid "Cut model at the given Z." +msgstr "Snijdt model op de ingestelde hoogte." + +#: src/libslic3r/PrintConfig.cpp:3434 +msgid "Center" +msgstr "Centreer" + +#: src/libslic3r/PrintConfig.cpp:3435 +msgid "Center the print around the given center." +msgstr "Centreer de print op het middelpunt." + +#: src/libslic3r/PrintConfig.cpp:3439 +msgid "Don't arrange" +msgstr "Niet schikken" + +#: src/libslic3r/PrintConfig.cpp:3440 +msgid "" +"Do not rearrange the given models before merging and keep their original XY " +"coordinates." +msgstr "" +"Herschik de modellen niet voor het samenvoegen en behoudt de originele X- en " +"Y-coördinaten." + +#: src/libslic3r/PrintConfig.cpp:3443 +msgid "Duplicate" +msgstr "Dupliceer" + +#: src/libslic3r/PrintConfig.cpp:3444 +msgid "Multiply copies by this factor." +msgstr "Meerdere kopieën van dit aantal." + +#: src/libslic3r/PrintConfig.cpp:3448 +msgid "Duplicate by grid" +msgstr "Dupliceer in raster" + +#: src/libslic3r/PrintConfig.cpp:3449 +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 +msgid "" +"Arrange the supplied models in a plate and merge them in a single model in " +"order to perform actions once." +msgstr "" +"Schik de toegevoegde modellen en combineer ze tot één model om eenmalig " +"acties uit te voeren." + +#: src/libslic3r/PrintConfig.cpp:3458 +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 "" +"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 +msgid "Rotation angle around the Z axis in degrees." +msgstr "Rotatiehoek rond de Z-as in graden." + +#: src/libslic3r/PrintConfig.cpp:3466 +msgid "Rotate around X" +msgstr "Draai over de X-as" + +#: src/libslic3r/PrintConfig.cpp:3467 +msgid "Rotation angle around the X axis in degrees." +msgstr "Rotatiehoek rond de X-as in graden." + +#: src/libslic3r/PrintConfig.cpp:3471 +msgid "Rotate around Y" +msgstr "Draai over de Y-as" + +#: src/libslic3r/PrintConfig.cpp:3472 +msgid "Rotation angle around the Y axis in degrees." +msgstr "Rotatiehoek rond de Y-as in graden." + +#: src/libslic3r/PrintConfig.cpp:3477 +msgid "Scaling factor or percentage." +msgstr "Schalingsfactor of percentage." + +#: src/libslic3r/PrintConfig.cpp:3482 +msgid "" +"Detect unconnected parts in the given model(s) and split them into separate " +"objects." +msgstr "" +"Detecteer niet-verbonden onderdelen in het model en deel ze op in " +"verschillende objecten." + +#: src/libslic3r/PrintConfig.cpp:3485 +msgid "Scale to Fit" +msgstr "Verschaal naar passing" + +#: src/libslic3r/PrintConfig.cpp:3486 +msgid "Scale to fit the given volume." +msgstr "Verschaal naar passing in het gegeven volume." + +#: src/libslic3r/PrintConfig.cpp:3495 +msgid "Ignore non-existent config files" +msgstr "Negeer niet-bestaande configuratiebestanden" + +#: src/libslic3r/PrintConfig.cpp:3496 +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 +msgid "Load config file" +msgstr "Laad configuratiebestand" + +#: src/libslic3r/PrintConfig.cpp:3500 +msgid "" +"Load configuration from the specified file. It can be used more than once to " +"load options from multiple files." +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 +msgid "Output File" +msgstr "Outputbestand" + +#: src/libslic3r/PrintConfig.cpp:3504 +msgid "" +"The file where the output will be written (if not specified, it will be " +"based on the input file)." +msgstr "" +"Het bestand waaroverheen wordt geschreven (als dit niet aangegeven is, wort " +"dit gebaseerd op het inputbestand)." + +#: src/libslic3r/PrintConfig.cpp:3514 +msgid "Data directory" +msgstr "Bestandslocatie voor de data" + +#: src/libslic3r/PrintConfig.cpp:3515 +msgid "" +"Load and store settings at the given directory. This is useful for " +"maintaining different profiles or including configurations from a network " +"storage." +msgstr "" +"Laad fabrieksinstellingen en sla op. Dit is handig voor het onderhouden van " +"verschillende profielen of het opnemen van configuraties van een " +"netwerkopslag." + +#: src/libslic3r/PrintConfig.cpp:3518 +msgid "Logging level" +msgstr "Logboekniveau" + +#: src/libslic3r/PrintConfig.cpp:3519 +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 "" +"Stel log-gevoeligheid in. 0: fataal, 1: fout, 2: waarschuwing, 3: info, 4: " +"debug, 5: traceer\n" +"Voorbeeld: loglevel = 2 geeft fataal-, fout- en waarschuwingslevelberichten." + +#: src/libslic3r/PrintConfig.cpp:3525 +msgid "Render with a software renderer" +msgstr "Render met software-renderer" + +#: src/libslic3r/PrintConfig.cpp:3526 +msgid "" +"Render with a software renderer. The bundled MESA software renderer is " +"loaded instead of the default OpenGL driver." +msgstr "" +"Render met software-renderer. De meegeleverde MESA-software-renderer is " +"geladen in plaats van het standaard OpenGL stuurprogramma." + +#: src/libslic3r/PrintObject.cpp:108 +msgid "Processing triangulated mesh" +msgstr "Mesh aan het verwerken" + +#: src/libslic3r/PrintObject.cpp:152 +msgid "Generating perimeters" +msgstr "Perimeters genereren" + +#: src/libslic3r/PrintObject.cpp:255 +msgid "Preparing infill" +msgstr "Vulling voorbereiden" + +#: src/libslic3r/PrintObject.cpp:395 +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 e7683ee03c..b81f880a1b 100644 Binary files a/resources/localization/pl/PrusaSlicer.mo and b/resources/localization/pl/PrusaSlicer.mo differ diff --git a/resources/localization/pl/PrusaSlicer_pl.po b/resources/localization/pl/PrusaSlicer_pl.po index e09c143c2e..d360128fcc 100644 --- a/resources/localization/pl/PrusaSlicer_pl.po +++ b/resources/localization/pl/PrusaSlicer_pl.po @@ -5,460 +5,582 @@ 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: PhraseApp (phraseapp.com)\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/PresetHints.cpp:39 -msgid "\nDuring the other layers, fan" -msgstr "\nNa pozostałych warstwach, wentylator" - -#: src/slic3r/GUI/PresetHints.cpp:35 -msgid "\nIf estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%." -msgstr "\nJeś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/slic3r/GUI/MainFrame.cpp:61 +#: 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:727 +#: src/slic3r/GUI/MainFrame.cpp:872 msgid " was successfully sliced." msgstr " został pomyślnie pocięty." -#: src/libslic3r/PrintConfig.cpp:179 src/libslic3r/PrintConfig.cpp:745 -#: src/libslic3r/PrintConfig.cpp:1154 src/libslic3r/PrintConfig.cpp:1217 -#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:2260 -#: src/libslic3r/PrintConfig.cpp:2502 +#: 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 msgid "%" msgstr "%" -#: src/libslic3r/GCode/PreviewData.cpp:504 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:963 +#, c-format msgid "%.2f - %.2f mm" msgstr "%.2f - %.2f mm" -#: src/slic3r/GUI/Tab.cpp:2895 -msgid "%1% - Copy" -msgstr "%1% - Kopiuj" - #. TRN Remove/Delete -#: src/slic3r/GUI/Tab.cpp:2958 +#: src/slic3r/GUI/Tab.cpp:3126 msgid "%1% Preset" msgstr "%1% Zestaw ustawień" -#: src/slic3r/GUI/Plater.cpp:3831 +#: src/slic3r/GUI/Plater.cpp:4400 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:1282 +#: src/libslic3r/Print.cpp:1374 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:228 -#, possible-c-format +#: src/slic3r/GUI/PresetHints.cpp:229 +#, 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:974 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1152 +#, c-format msgid "%d (%d shells)" msgstr "%d (%d obrysów)" -#: src/slic3r/GUI/Plater.cpp:982 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1160 +#, 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:268 -#, possible-c-format +#: src/slic3r/GUI/PresetHints.cpp:270 +#, c-format msgid "%d lines: %.2f mm" msgstr "%d linii: %.2f mm" -#: src/slic3r/GUI/MainFrame.cpp:894 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:1027 +#, c-format msgid "%d presets successfully imported." msgstr "pomyślnie zaimportowano %d zestawów ustawień." -#: src/slic3r/GUI/MainFrame.cpp:550 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:692 +#, c-format msgid "%s &Website" msgstr "Strona &WWW %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:113 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:211 +#, c-format msgid "%s configuration is incompatible" msgstr "Konfiguracja niekompatybilna: %s" -#: src/slic3r/GUI/Field.cpp:136 -#, possible-c-format +#: src/slic3r/GUI/Field.cpp:175 +#, c-format msgid "%s doesn't support percentage" msgstr "%s nie może być wartością procentową" #: src/slic3r/GUI/MsgDialog.cpp:73 -#, possible-c-format +#, c-format msgid "%s error" msgstr "błąd %s" -#: src/slic3r/GUI/ConfigWizard.cpp:336 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:481 +#, c-format msgid "%s Family" msgstr "Rodzina %s" #: src/slic3r/GUI/MsgDialog.cpp:74 -#, possible-c-format +#, c-format msgid "%s has encountered an error" msgstr "%s napotkał błąd" -#: src/slic3r/GUI/GUI_App.cpp:132 -#, 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/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/BackgroundSlicingProcess.cpp:155 -#, possible-c-format +#: 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 "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:112 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:308 +#, 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 msgid "%s incompatibility" msgstr "niekompatybilność: %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:172 -#, 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/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:681 -#, possible-c-format +#: src/slic3r/GUI/GUI_App.cpp:820 +#, c-format msgid "%s View Mode" msgstr "Tryb %s" -#: src/slic3r/GUI/MainFrame.cpp:563 -#, possible-c-format +#: 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 msgid "&About %s" msgstr "&O %s" -#: src/slic3r/GUI/GUI_App.cpp:769 +#: src/slic3r/GUI/GUI_App.cpp:908 msgid "&Configuration" msgstr "&Konfiguracja" -#: src/slic3r/GUI/GUI_App.cpp:661 +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "&Configuration Snapshots" -msgstr "Zrzuty &Konfiguracji" +msgstr "Zrzuty Konfigura&cji" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:588 msgid "&Copy" msgstr "&Kopiuj" -#: src/slic3r/GUI/MainFrame.cpp:447 +#: src/slic3r/GUI/MainFrame.cpp:572 msgid "&Delete selected" -msgstr "&Usuń wybrane" +msgstr "Usuń &zaznaczone" -#: src/slic3r/GUI/MainFrame.cpp:575 +#: src/slic3r/GUI/MainFrame.cpp:722 msgid "&Edit" msgstr "&Edytuj" -#: src/slic3r/GUI/MainFrame.cpp:377 +#: src/slic3r/GUI/MainFrame.cpp:506 msgid "&Export" msgstr "&Eksport" -#: src/slic3r/GUI/MainFrame.cpp:480 src/slic3r/GUI/MainFrame.cpp:604 +#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:752 msgid "&Filament Settings Tab" msgstr "Ustawienia &Filamentu" -#: src/slic3r/GUI/MainFrame.cpp:574 +#: src/slic3r/GUI/MainFrame.cpp:721 msgid "&File" msgstr "&Plik" -#: src/slic3r/GUI/ConfigWizard.cpp:1094 +#: src/slic3r/GUI/ConfigWizard.cpp:1981 msgid "&Finish" msgstr "&Zakończ" -#: src/slic3r/GUI/MainFrame.cpp:580 +#: src/slic3r/GUI/MainFrame.cpp:727 msgid "&Help" msgstr "Pomo&c" -#: src/slic3r/GUI/MainFrame.cpp:359 +#: src/slic3r/GUI/MainFrame.cpp:474 msgid "&Import" msgstr "&Import" -#: src/slic3r/GUI/MainFrame.cpp:376 +#: src/slic3r/GUI/GUI_App.cpp:822 +msgid "&Language" +msgstr "Język ap&likacji" + +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "&New Project" msgstr "&Nowy Projekt" -#: src/slic3r/GUI/ConfigWizard.cpp:1093 +#: src/slic3r/GUI/ConfigWizard.cpp:1980 msgid "&Next >" msgstr "&Dalej>" -#: src/slic3r/GUI/MainFrame.cpp:339 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "&Open Project" msgstr "&Otwórz Projekt" -#: src/slic3r/GUI/MainFrame.cpp:456 +#: src/slic3r/GUI/MainFrame.cpp:591 msgid "&Paste" msgstr "Wkle&j" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "&Plater Tab" -msgstr "Podgląd Stoł&u" +msgstr "&Podgląd Stołu" -#: src/slic3r/GUI/GUI_App.cpp:665 +#: src/slic3r/GUI/GUI_App.cpp:804 msgid "&Preferences" msgstr "&Preferencje" -#: src/slic3r/GUI/MainFrame.cpp:409 +#: src/slic3r/GUI/MainFrame.cpp:540 msgid "&Quit" -msgstr "&Wyjście" +msgstr "Wyjś&cie" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/MainFrame.cpp:583 msgid "&Redo" msgstr "Powtó&rz" -#: src/slic3r/GUI/MainFrame.cpp:406 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "&Repair STL file" -msgstr "&Naprawa pliku STL" +msgstr "Nap&rawa pliku STL" -#: src/slic3r/GUI/MainFrame.cpp:341 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "&Save Project" -msgstr "&Zapisz projekt" +msgstr "Zapi&sz Projekt" -#: src/slic3r/GUI/MainFrame.cpp:444 +#: src/slic3r/GUI/MainFrame.cpp:565 msgid "&Select all" -msgstr "&Zaznacz wszystko" +msgstr "Zaznacz w&szystko" -#: src/slic3r/GUI/MainFrame.cpp:558 +#: src/slic3r/GUI/MainFrame.cpp:580 msgid "&Undo" msgstr "Co&fnij" -#: src/slic3r/GUI/MainFrame.cpp:577 +#: src/slic3r/GUI/MainFrame.cpp:724 msgid "&View" msgstr "&Widok" -#: src/slic3r/GUI/MainFrame.cpp:576 +#: src/slic3r/GUI/MainFrame.cpp:723 msgid "&Window" msgstr "&Okno" -#: src/libslic3r/PrintConfig.cpp:1376 +#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631 +msgid "(All)" +msgstr "(Wszystko)" + +#: src/libslic3r/PrintConfig.cpp:1446 msgid "(minimum)" msgstr "(minimum)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:111 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 msgid "(Re)slice" msgstr "(Ponowne) Cięcie" -#: src/slic3r/GUI/MainFrame.cpp:455 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "(Re)Slice No&w" msgstr "(Pono&wne) Cięcie" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587 +msgid "(Unknown)" +msgstr "(Nieznane)" + +#: src/slic3r/GUI/MainFrame.cpp:790 msgid ") not found." msgstr ") nie znaleziono." -#: src/libslic3r/PrintConfig.cpp:1857 +#: src/libslic3r/PrintConfig.cpp:1918 msgid "0 (soluble)" msgstr "0 (rozpuszczalne)" -#: src/libslic3r/PrintConfig.cpp:1858 +#: src/libslic3r/PrintConfig.cpp:1919 msgid "0.2 (detachable)" msgstr "0.2 (odłączane)" -#: src/slic3r/GUI/MainFrame.cpp:487 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "3&D" msgstr "3&D" -#: src/slic3r/GUI/Plater.cpp:3074 +#: src/slic3r/GUI/Plater.cpp:4097 msgid "3D editor view" -msgstr "Podgląd edycji 3D" +msgstr "Edytowanie 3D" -#: src/libslic3r/PrintConfig.cpp:804 +#: src/libslic3r/PrintConfig.cpp:851 msgid "3D Honeycomb" msgstr "Plaster miodu 3D" -#: src/slic3r/GUI/Plater.cpp:3590 -#, possible-c-format +#: src/slic3r/GUI/Mouse3DController.cpp:274 +msgid "3Dconnexion settings" +msgstr "Ustawienia 3Dconnexion" + +#: src/slic3r/GUI/Plater.cpp:5038 +#, c-format msgid "3MF file exported to %s" msgstr "Plik 3MF wyeksportowany do %s" -#: src/slic3r/GUI/ConfigWizard.cpp:1092 +#: src/slic3r/GUI/ConfigWizard.cpp:1979 msgid "< &Back" msgstr "<&Wstecz" -#: src/libslic3r/PrintConfig.cpp:251 +#: src/libslic3r/PrintConfig.cpp:287 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:236 +#: src/libslic3r/PrintConfig.cpp:272 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/ConfigWizard.cpp:609 +#: src/slic3r/GUI/Tab.cpp:975 +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 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:623 +#: src/slic3r/GUI/ConfigWizard.cpp:1048 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." -#: src/slic3r/GUI/GLCanvas3D.cpp:721 +#: 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/AboutDialog.cpp:35 -#, possible-c-format +#: src/slic3r/GUI/AboutDialog.cpp:199 +#, c-format msgid "About %s" msgstr "O %s" -#: src/libslic3r/GCode/PreviewData.cpp:499 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:959 +#, c-format msgid "above %.2f mm" msgstr "powyżej %.2f mm" -#: src/libslic3r/PrintConfig.cpp:1499 +#: src/libslic3r/PrintConfig.cpp:1569 msgid "Above Z" msgstr "Powyżej Z" -#: src/slic3r/GUI/Tab.cpp:1103 +#: src/slic3r/GUI/Tab.cpp:1164 msgid "Acceleration control (advanced)" msgstr "Ustawienia przyspieszeń (zaawansowane)" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:73 +#: src/libslic3r/PrintConfig.cpp:2925 +msgid "Accuracy" +msgstr "Dokładność" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78 msgid "Activate" msgstr "Aktywacja" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:39 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43 msgid "Active" msgstr "Aktywny" -#: src/slic3r/GUI/Preset.cpp:1003 src/slic3r/GUI/Tab.cpp:237 +#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1705 +msgid "active" +msgstr "aktywny" + +#: src/slic3r/GUI/GLCanvas3D.cpp:267 +msgid "Adaptive" +msgstr "Adaptacyjny" + +#: src/slic3r/GUI/Tab.cpp:241 msgid "Add a new printer" msgstr "Dodaj nową drukarkę" -#: src/libslic3r/PrintConfig.cpp:2517 +#: src/libslic3r/PrintConfig.cpp:2782 msgid "Add a pad underneath the supported model" msgstr "Dodaj podkładkę pod podporami modelu" -#: src/libslic3r/PrintConfig.cpp:1971 +#: src/libslic3r/PrintConfig.cpp:2058 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/KBShortcutsDialog.cpp:186 +#: src/slic3r/GUI/DoubleSlider.cpp:991 +msgid "Add another code - Ctrl + Left click" +msgstr "Dodaj kolejny kod - Ctrl + kliknij lewym przyciskiem" + +#: src/slic3r/GUI/DoubleSlider.cpp:992 +msgid "Add another code - Right click" +msgstr "Dodaj kolejny kod - kliknij prawym przyciskiem" + +#: src/slic3r/GUI/DoubleSlider.cpp:1477 +msgid "Add color change" +msgstr "Dodaj zmianę koloru" + +#: src/slic3r/GUI/DoubleSlider.cpp:1180 +msgid "Add color change (%1%) for:" +msgstr "Dodaj zmianę koloru (%1%) dla:" + +#: src/slic3r/GUI/DoubleSlider.cpp:988 +msgid "Add color change - Left click" +msgstr "Dodaj zmianę koloru - kliknij lewym przyciskiem" + +#: src/slic3r/GUI/DoubleSlider.cpp:986 +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 msgid "Add color change marker for current layer" msgstr "Dodaj punkt zmiany filamentu na obecnej warstwie" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1662 +#: src/slic3r/GUI/DoubleSlider.cpp:1490 +msgid "Add custom G-code" +msgstr "Dodaj własny G-code" + +#: src/slic3r/GUI/GLCanvas3D.cpp:240 +msgid "Add detail" +msgstr "Wyższa szczegółowość" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:421 +msgid "Add drainage hole" +msgstr "Dodaj otwór odpływowy" + +#: src/slic3r/GUI/DoubleSlider.cpp:984 +msgid "Add extruder change - Left click" +msgstr "Dodaj zmianę ekstrudera - kliknij lewym przyciskiem" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192 +msgid "Add extruder to sequence" +msgstr "Dodaj ekstruder do sekwencji" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1993 msgid "Add Generic Subobject" msgstr "Dodaj Standardowy Model Podrzędny" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2584 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2613 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2631 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2896 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2925 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2943 msgid "Add Height Range" msgstr "Dodaj zakres wysokości" -#: src/slic3r/GUI/GLCanvas3D.cpp:3463 +#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3788 +#: src/slic3r/GUI/Plater.cpp:3800 src/slic3r/GUI/Plater.cpp:3940 msgid "Add instance" -msgstr "Dodaj kopię" +msgstr "Dodaj instancję" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:159 msgid "Add Instance of the selected object" -msgstr "Dodaj kopię wybranego modelu" +msgstr "Dodaj instancję wybranego modelu" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:162 msgid "Add layer range" msgstr "Dodaj zakres warstw" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1950 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2328 msgid "Add Layers" msgstr "Dodaj Warstwy" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1067 +#: src/slic3r/GUI/GUI_ObjectList.cpp:52 msgid "Add modifier" msgstr "Dodaj modyfikator" -#: src/libslic3r/PrintConfig.cpp:447 +#: src/libslic3r/PrintConfig.cpp:479 #, no-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." -#: src/slic3r/GUI/Plater.cpp:3516 +#: src/slic3r/GUI/Plater.cpp:3940 msgid "Add one more instance of the selected object" -msgstr "Dodaj kolejną kopię wybranego modelu" +msgstr "Dodaj kolejną instancję wybranego modelu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1066 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1082 +#: src/slic3r/GUI/GUI_ObjectList.cpp:51 msgid "Add part" msgstr "Dodaj część" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1229 +#: src/slic3r/GUI/DoubleSlider.cpp:1487 +msgid "Add pause print" +msgstr "Dodaj pauzę podczas druku" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 msgid "Add point" msgstr "Dodaj punkt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1232 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 msgid "Add point to selection" msgstr "Dodaj punkt do zaznaczenia" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1118 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1509 msgid "Add settings" msgstr "Dodaj ustawienia" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1252 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1386 msgid "Add Settings Bundle for Height range" msgstr "Dodaj Paczkę Ustawień dla Zakresu Wysokości" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1191 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1388 msgid "Add Settings Bundle for Object" msgstr "Dodaj Paczkę Ustawień dla Modelu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1190 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1387 msgid "Add Settings Bundle for Sub-object" msgstr "Dodaj Paczkę Ustawień dla Modelu Podrzędnego" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1126 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1314 msgid "Add Settings for Layers" msgstr "Dodaj Ustawienia dla Warstw" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1128 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1316 msgid "Add Settings for Object" msgstr "Dodaj Ustawienia dla Modelu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1127 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1315 msgid "Add Settings for Sub-object" msgstr "Dodaj Ustawienia dla Modelu Podrzędnego" -#: src/libslic3r/PrintConfig.cpp:382 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1793 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2051 +msgid "Add Shape" +msgstr "Dodaj kształt" + +#: src/libslic3r/PrintConfig.cpp:409 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)." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1069 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1089 +#: src/slic3r/GUI/GUI_ObjectList.cpp:54 msgid "Add support blocker" msgstr "Dodaj blokadę podpór" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1068 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1086 +#: src/slic3r/GUI/GUI_ObjectList.cpp:53 msgid "Add support enforcer" msgstr "Dodaj wymuszenie podpór" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:531 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:494 msgid "Add support point" msgstr "Dodaj punkt podpory" -#: src/slic3r/GUI/GLCanvas3D.cpp:3392 +#: src/slic3r/GUI/GLCanvas3D.cpp:4467 msgid "Add..." msgstr "Dodaj..." -#: src/slic3r/GUI/wxExtensions.cpp:2571 -msgid "Add/Del color change" -msgstr "Dodaj/usuń zmianę koloru" +#: src/slic3r/GUI/PresetBundle.cpp:1704 +msgid "Add/Remove filaments" +msgstr "Dodaj/usuń filamenty" -#: src/slic3r/GUI/Tab.cpp:920 +#: src/slic3r/GUI/Preset.cpp:1201 +msgid "Add/Remove materials" +msgstr "Dodaj/usuń materiały" + +#: src/slic3r/GUI/Preset.cpp:1203 +msgid "Add/Remove printers" +msgstr "Dodaj/usuń drukarki" + +#: src/slic3r/GUI/Tab.cpp:970 msgid "Additional information:" msgstr "Dodatkowe informacje:" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:58 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59 msgid "Additional Settings" msgstr "Ustawienia Dodatkowe" -#: src/slic3r/GUI/ConfigWizard.cpp:431 +#: src/slic3r/GUI/ConfigWizard.cpp:791 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." @@ -466,279 +588,319 @@ msgstr "Dodatkowa kopia zrzutu całej konfiguracji jest tworzona przed zainstalo msgid "Address" msgstr "Adres" -#: src/slic3r/GUI/GUI_App.cpp:675 src/slic3r/GUI/GUI_ObjectList.cpp:76 -#: src/slic3r/GUI/GUI_ObjectList.cpp:517 src/slic3r/GUI/Tab.cpp:1026 -#: src/slic3r/GUI/Tab.cpp:1041 src/slic3r/GUI/Tab.cpp:1139 -#: src/slic3r/GUI/Tab.cpp:1142 src/slic3r/GUI/Tab.cpp:1515 -#: src/slic3r/GUI/Tab.cpp:1940 src/slic3r/GUI/Tab.cpp:3435 -#: src/slic3r/GUI/wxExtensions.cpp:2460 src/libslic3r/PrintConfig.cpp:72 -#: src/libslic3r/PrintConfig.cpp:187 src/libslic3r/PrintConfig.cpp:350 -#: src/libslic3r/PrintConfig.cpp:988 src/libslic3r/PrintConfig.cpp:2175 +#: 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 msgid "Advanced" -msgstr "Zaawansowane" +msgstr "Zaawansowany" -#: src/slic3r/GUI/GUI_App.cpp:675 +#: src/slic3r/GUI/ConfigWizard.cpp:821 +msgid "Advanced mode" +msgstr "Tryb Zaawansowany" + +#: src/slic3r/GUI/GUI_App.cpp:814 msgid "Advanced View Mode" msgstr "Widok Zaawansowany" -#: src/slic3r/GUI/FirmwareDialog.cpp:803 +#: src/slic3r/GUI/FirmwareDialog.cpp:841 msgid "Advanced: Output log" msgstr "Zaawansowane: log wyjściowy" -#: src/libslic3r/PrintConfig.cpp:636 +#: src/libslic3r/PrintConfig.cpp:668 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." -#: src/slic3r/GUI/Tab.cpp:1967 src/libslic3r/PrintConfig.cpp:1031 +#: src/slic3r/GUI/Tab.cpp:1994 src/libslic3r/PrintConfig.cpp:1080 msgid "After layer change G-code" msgstr "G-code wykonywany po zmianie warstwy" -#: src/libslic3r/PrintConfig.cpp:3009 +#: src/libslic3r/PrintConfig.cpp:3398 msgid "Align the model to the given point." msgstr "Wyrównaj model z danym punktem." -#: src/libslic3r/PrintConfig.cpp:3008 +#: src/libslic3r/PrintConfig.cpp:3397 msgid "Align XY" msgstr "Wyrównaj XY" -#: src/libslic3r/PrintConfig.cpp:1561 +#: src/libslic3r/PrintConfig.cpp:1631 msgid "Aligned" msgstr "Wyrównany" -#: src/slic3r/GUI/ConfigWizard.cpp:189 src/slic3r/GUI/Tab.cpp:2986 +#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573 +#: src/slic3r/GUI/Tab.cpp:3174 msgid "All" msgstr "Wszystko" -#: src/libslic3r/Print.cpp:1135 +#: src/libslic3r/Print.cpp:1219 msgid "All objects are outside of the print volume." msgstr "Wszystkie modele znajdują się poza obszarem roboczym." -#: src/slic3r/GUI/Plater.cpp:3298 -msgid "All objects will be removed, continue ?" +#: src/slic3r/GUI/Plater.cpp:4669 +msgid "All objects will be removed, continue?" msgstr "Wszystkie modele zostaną usunięte. Kontynuować?" -#: src/slic3r/GUI/ConfigWizard.cpp:188 +#: src/slic3r/GUI/ConfigWizard.cpp:289 msgid "All standard" msgstr "Wszystkie podstawowe" -#: src/libslic3r/Zipper.cpp:65 +#: src/libslic3r/Zipper.cpp:62 msgid "allocation failed" msgstr "niepowodzenie alokacji" -#: src/slic3r/GUI/Plater.cpp:2939 +#: src/slic3r/GUI/Plater.cpp:3995 msgid "Along X axis" msgstr "Wzdłuż osi X" -#: src/slic3r/GUI/Plater.cpp:2941 +#: src/slic3r/GUI/Plater.cpp:3997 msgid "Along Y axis" msgstr "Wzdłuż osi Y" -#: src/slic3r/GUI/Plater.cpp:2943 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Along Z axis" msgstr "Wzdłuż osi Z" -#: src/slic3r/GUI/ConfigWizard.cpp:122 +#: src/slic3r/GUI/ConfigWizard.cpp:222 msgid "Alternate nozzles:" msgstr "Inne rozmiary dysz:" -#: src/slic3r/GUI/Plater.cpp:3561 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:5002 +#, c-format msgid "AMF file exported to %s" msgstr "Plik AMF wyeksportowany do %s" -#: src/slic3r/GUI/GLCanvas3D.cpp:725 -msgid "An object outside the print area was detected\nResolve the current problem to continue slicing" -msgstr "Wykryto model poza obszarem roboczym\nUsuń problem, aby kontynuować cięcie" +#: 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:720 +#: src/slic3r/GUI/GLCanvas3D.cpp:685 msgid "An object outside the print area was detected" msgstr "Wykryto model poza obszarem roboczym" -#: src/slic3r/GUI/Tab.cpp:2781 +#: 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:2461 +#: src/slic3r/GUI/Plater.cpp:3170 msgid "Another export job is currently running." msgstr "W tej chwili trwa inny proces eksportu." -#: src/slic3r/GUI/Tab.cpp:926 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Any arrow" +msgstr "Jakakolwiek strzałka" + +#: src/slic3r/GUI/Tab.cpp:965 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:88 +#: src/libslic3r/PrintConfig.cpp:104 msgid "API Key / Password" -msgstr "Klucz API / Hasło" +msgstr "Klucz API / hasło" -#: src/slic3r/GUI/GUI_App.cpp:671 +#: src/slic3r/GUI/GUI_App.cpp:810 msgid "Application preferences" msgstr "Preferencje aplikacji" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:864 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1240 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1374 msgid "Apply changes" msgstr "Zastosuj zmiany" -#: src/libslic3r/PrintConfig.cpp:542 src/libslic3r/PrintConfig.cpp:1638 +#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708 msgid "approximate seconds" msgstr "szacowane sekundy" -#: src/libslic3r/PrintConfig.cpp:401 src/libslic3r/PrintConfig.cpp:807 +#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854 msgid "Archimedean Chords" msgstr "Spirala Archimedesa" -#: src/libslic3r/Zipper.cpp:91 +#: src/libslic3r/Zipper.cpp:88 msgid "archive is too large" msgstr "archiwum jest zbyt duże" #. TRN remove/delete -#: src/slic3r/GUI/Tab.cpp:2955 +#: src/slic3r/GUI/Tab.cpp:3123 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:862 -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/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ą!" -#: src/libslic3r/PrintConfig.cpp:2258 +#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924 +msgid "Are you sure you want to continue?" +msgstr "Czy na pewno chcesz kontynuować?" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269 +msgid "Are you sure you want to do it?" +msgstr "Czy na pewno chcesz to zrobić?" + +#: src/libslic3r/PrintConfig.cpp:2423 msgid "Area fill" msgstr "Wypełnienie obszaru" -#: src/slic3r/GUI/Plater.cpp:609 +#: src/slic3r/GUI/Plater.cpp:641 msgid "Around object" msgstr "Wokół modelu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 +#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157 +#: src/slic3r/GUI/Plater.cpp:2754 msgid "Arrange" msgstr "Rozmieść" -#: src/slic3r/GUI/GLCanvas3D.cpp:3486 +#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:158 msgid "Arrange selection" msgstr "Rozmieść zaznaczone" -#: src/libslic3r/PrintConfig.cpp:3054 +#: src/libslic3r/PrintConfig.cpp:3443 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:2106 +#: src/slic3r/GUI/Plater.cpp:2813 msgid "Arranging" msgstr "Układanie" -#: src/slic3r/GUI/Plater.cpp:2718 +#: src/slic3r/GUI/Plater.cpp:2841 msgid "Arranging canceled." msgstr "Układanie anulowane." -#: src/slic3r/GUI/Plater.cpp:2144 +#: src/slic3r/GUI/Plater.cpp:2842 msgid "Arranging done." msgstr "Układanie zakończone." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Arrow Down" msgstr "Strzałka w dół" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 msgid "Arrow Left" msgstr "Strzałka w lewo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 msgid "Arrow Right" msgstr "Strzałka w prawo" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 msgid "Arrow Up" msgstr "Strzałka w górę" -#: src/slic3r/GUI/GUI_App.cpp:303 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:290 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.cpp:144 src/slic3r/GUI/GUI_App.cpp:743 -#: src/slic3r/GUI/Tab.cpp:2798 +#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2313 +#: src/slic3r/GUI/Tab.cpp:2960 msgid "Attention!" msgstr "Uwaga!" -#: src/libslic3r/PrintConfig.cpp:1785 +#: src/libslic3r/PrintConfig.cpp:1871 msgid "Auto generated supports" msgstr "Automatyczne generowanie podpór" -#: src/slic3r/GUI/Preferences.cpp:44 +#: src/slic3r/GUI/Preferences.cpp:47 msgid "Auto-center parts" msgstr "Rozmieść modele automatycznie" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:902 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1243 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1377 msgid "Auto-generate points" msgstr "Generuj punkty automatycznie" -#: src/slic3r/GUI/Plater.cpp:979 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:1157 +#, c-format msgid "Auto-repaired (%d errors)" msgstr "Naprawiono automatycznie (%d błędów)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:230 -#, possible-c-format -msgid "Auto-repaired (%d errors):\n" -msgstr "Naprawiono automatycznie (%d błędów):\n" +#: src/slic3r/GUI/GUI_ObjectList.cpp:339 +#, c-format +msgid "Auto-repaired (%d errors):" +msgstr "Naprawiono automatycznie (%d błędów):" -#: src/slic3r/GUI/FirmwareDialog.cpp:771 +#: src/slic3r/GUI/FirmwareDialog.cpp:809 msgid "Autodetected" msgstr "Wykryto automatycznie" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1338 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273 msgid "Autogenerate support points" msgstr "Automatycznie generuj punkty podpór" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1166 -msgid "Autogeneration will erase all manually edited points.\n\nAre you sure you want to do it?\n" -msgstr "Generowanie automatyczne usunie wszystkie ręcznie ustawione punkty.\n\nCzy chcesz kontynować?\n" +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268 +msgid "Autogeneration will erase all manually edited points." +msgstr "Generowanie automatyczne usunie wszystkie ręcznie ustawione punkty." -#: src/slic3r/GUI/Tab.cpp:3421 +#: src/slic3r/GUI/Tab.cpp:3632 msgid "Automatic generation" msgstr "Generowanie automatyczne" -#: src/slic3r/GUI/ConfigWizard.cpp:401 +#: src/slic3r/GUI/ConfigWizard.cpp:761 msgid "Automatic updates" msgstr "Automatyczne aktualizacje" -#: src/slic3r/GUI/MainFrame.cpp:406 +#: src/slic3r/GUI/MainFrame.cpp:536 msgid "Automatically repair an STL file" msgstr "Automatyczna naprawa pliku STL" -#: src/slic3r/GUI/Tab.cpp:1110 +#: src/slic3r/GUI/Tab.cpp:1171 msgid "Autospeed (advanced)" msgstr "Automatyczne dostosowanie prędkości (zaawansowane)" -#: src/libslic3r/PrintConfig.cpp:111 +#: src/libslic3r/PrintConfig.cpp:136 msgid "Avoid crossing perimeters" msgstr "Unikaj ruchów nad obrysami" -#: src/slic3r/GUI/Tab.cpp:3081 +#: src/slic3r/GUI/Tab.cpp:3268 msgid "BACK ARROW" msgstr "STRZAŁKA W TYŁ" -#: src/slic3r/GUI/Tab.cpp:3113 -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: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:3127 -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/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/Preferences.cpp:52 +#: src/slic3r/GUI/Preferences.cpp:55 msgid "Background processing" msgstr "Przetwarzanie w tle" -#: src/slic3r/GUI/GUI_ObjectList.cpp:242 +#: src/slic3r/GUI/GUI_ObjectList.cpp:351 msgid "backwards edges" msgstr "odwrócone krawędzie" -#: src/slic3r/GUI/MainFrame.cpp:152 +#: src/slic3r/GUI/MainFrame.cpp:174 msgid "based on Slic3r" msgstr "bazuje na projekcie Slic3r" -#: src/slic3r/GUI/Tab.cpp:1484 +#: src/slic3r/GUI/Tab.cpp:1439 msgid "Bed" msgstr "Stół" @@ -750,31 +912,31 @@ msgstr "Własny model stołu" msgid "Bed custom texture" msgstr "Własna tekstura stołu" -#: src/slic3r/GUI/BedShapeDialog.hpp:45 src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:929 msgid "Bed Shape" msgstr "Kształt stołu" -#: src/libslic3r/PrintConfig.cpp:50 +#: src/libslic3r/PrintConfig.cpp:51 msgid "Bed shape" msgstr "Kształt stołu" -#: src/slic3r/GUI/ConfigWizard.cpp:524 +#: src/slic3r/GUI/ConfigWizard.cpp:929 msgid "Bed Shape and Size" msgstr "Kształt i rozmiar stołu roboczego" -#: src/libslic3r/PrintConfig.cpp:122 +#: src/libslic3r/PrintConfig.cpp:147 msgid "Bed temperature" msgstr "Temperatura stołu" -#: src/libslic3r/PrintConfig.cpp:120 +#: src/libslic3r/PrintConfig.cpp:145 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." -#: src/slic3r/GUI/ConfigWizard.cpp:626 +#: src/slic3r/GUI/ConfigWizard.cpp:1051 msgid "Bed Temperature:" msgstr "Temperatura stołu:" -#: src/slic3r/GUI/Tab.cpp:1961 src/libslic3r/PrintConfig.cpp:128 +#: src/slic3r/GUI/Tab.cpp:1988 src/libslic3r/PrintConfig.cpp:153 msgid "Before layer change G-code" msgstr "G-code wykonywany przed zmianą warstwy" @@ -782,90 +944,110 @@ msgstr "G-code wykonywany przed zmianą warstwy" msgid "Before roll back" msgstr "Przez zmianą" -#: src/slic3r/GUI/Plater.cpp:608 +#: src/slic3r/GUI/Plater.cpp:640 msgid "Below object" msgstr "Pod modelem" -#: src/libslic3r/PrintConfig.cpp:1508 +#: src/libslic3r/PrintConfig.cpp:1578 msgid "Below Z" msgstr "Poniżej Z" -#: src/libslic3r/PrintConfig.cpp:139 +#: src/libslic3r/PrintConfig.cpp:164 msgid "Between objects G-code" msgstr "G-code wykonywany przy przejściach pomiędzy modelami" -#: src/slic3r/GUI/Tab.cpp:1979 +#: src/slic3r/GUI/Tab.cpp:2006 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 +msgid "Bottle volume" +msgstr "Objętość butelki" + +#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497 +msgid "Bottle weight" +msgstr "Waga butelki" + #. TRN To be shown in the main menu View->Bottom -#: src/slic3r/GUI/MainFrame.cpp:524 +#. 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 msgid "Bottom" msgstr "Dolne" -#: src/libslic3r/PrintConfig.cpp:409 +#: src/libslic3r/PrintConfig.cpp:435 msgid "Bottom fill pattern" msgstr "Wzór wypełnienia dolnej warstwy" -#: src/libslic3r/PrintConfig.cpp:152 +#: src/slic3r/GUI/PresetHints.cpp:342 +msgid "Bottom is open." +msgstr "Dół jest otwarty." + +#: src/slic3r/GUI/PresetHints.cpp:336 +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 msgid "Bottom solid layers" msgstr "Zwarte warstwy dolne" -#: src/slic3r/GUI/MainFrame.cpp:524 +#: src/slic3r/GUI/MainFrame.cpp:665 msgid "Bottom View" msgstr "Widok od dołu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1087 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1090 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1464 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1468 msgid "Box" msgstr "Sześcian" -#: src/libslic3r/PrintConfig.cpp:157 +#: src/libslic3r/PrintConfig.cpp:193 msgid "Bridge" msgstr "Most" -#: src/libslic3r/PrintConfig.cpp:186 +#: src/libslic3r/PrintConfig.cpp:222 msgid "Bridge flow ratio" msgstr "Współczynnik przepływu przy mostach" -#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/GCode/PreviewData.cpp:169 +#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316 msgid "Bridge infill" msgstr "Wypełnienie mostu" -#: src/libslic3r/PrintConfig.cpp:198 +#: src/libslic3r/PrintConfig.cpp:234 msgid "Bridges" msgstr "Mosty" -#: src/libslic3r/PrintConfig.cpp:177 +#: src/libslic3r/PrintConfig.cpp:213 msgid "Bridges fan speed" msgstr "Prędkość wentylatora przy mostach" -#: src/libslic3r/PrintConfig.cpp:166 +#: src/libslic3r/PrintConfig.cpp:202 msgid "Bridging angle" msgstr "Kąt linii mostów" -#: src/libslic3r/PrintConfig.cpp:168 +#: src/libslic3r/PrintConfig.cpp:204 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:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Bridging volumetric" msgstr "Mosty objętościowe" -#: src/slic3r/GUI/Plater.cpp:446 src/slic3r/GUI/Tab.cpp:1056 +#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117 msgid "Brim" -msgstr "Brim (obramowanie)" +msgstr "Brim" -#: src/libslic3r/PrintConfig.cpp:208 +#: src/libslic3r/PrintConfig.cpp:244 msgid "Brim width" msgstr "Szerokość brim" -#: src/slic3r/GUI/Tab.cpp:1681 +#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1658 +#: src/slic3r/GUI/Tab.cpp:1721 msgid "Browse" msgstr "Przeglądaj" -#: src/libslic3r/Zipper.cpp:85 +#: src/libslic3r/Zipper.cpp:82 msgid "buffer too small" msgstr "niewystarczający bufor" @@ -873,850 +1055,1044 @@ msgstr "niewystarczający bufor" msgid "Buttons And Text Colors Description" msgstr "Opis Przycisków i Kolorów Tekstu" -#: src/slic3r/GUI/PresetHints.cpp:220 +#: src/slic3r/GUI/PresetHints.cpp:223 msgid "by the print profile maximum" msgstr "maksimum zależny od profilu wydruku" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 +#: src/slic3r/GUI/Preferences.cpp:113 +msgid "Camera" +msgstr "Widok" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 msgid "Camera view" msgstr "Widok kamery" -#: src/slic3r/GUI/ConfigWizard.cpp:1095 src/slic3r/GUI/FirmwareDialog.cpp:147 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:37 -#: src/slic3r/GUI/ProgressStatusBar.cpp:28 +#: src/slic3r/GUI/ConfigWizard.cpp:1982 src/slic3r/GUI/FirmwareDialog.cpp:151 +#: src/slic3r/GUI/ProgressStatusBar.cpp:26 msgid "Cancel" msgstr "Anuluj" -#: src/slic3r/GUI/PrintHostDialogs.cpp:156 +#: src/slic3r/GUI/PrintHostDialogs.cpp:157 msgid "Cancel selected" msgstr "Anuluj wybrane" -#: src/slic3r/GUI/Plater.cpp:2727 src/slic3r/GUI/PrintHostDialogs.cpp:232 +#: src/slic3r/GUI/Plater.cpp:3669 src/slic3r/GUI/PrintHostDialogs.cpp:233 msgid "Cancelled" msgstr "Anulowano" -#: src/slic3r/GUI/Plater.cpp:2444 src/slic3r/GUI/PrintHostDialogs.cpp:231 +#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232 msgid "Cancelling" msgstr "Anulowanie" -#: src/slic3r/GUI/FirmwareDialog.cpp:866 +#: src/slic3r/GUI/FirmwareDialog.cpp:906 msgid "Cancelling..." msgstr "Anulowanie..." -#: src/slic3r/GUI/Tab.cpp:2905 +#: src/libslic3r/Flow.cpp:61 +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: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: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/Tab.cpp:3073 msgid "Cannot overwrite a system profile." msgstr "Nie można nadpisać profilu systemowego." -#: src/slic3r/GUI/Tab.cpp:2909 +#: src/slic3r/GUI/Tab.cpp:3077 msgid "Cannot overwrite an external profile." msgstr "Nie można nadpisać profilu zewnętrznego." -#: src/libslic3r/SLAPrint.cpp:612 +#: src/libslic3r/SLAPrint.cpp:613 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:1840 +#: src/slic3r/GUI/Tab.cpp:1834 msgid "Capabilities" msgstr "Możliwości" -#: src/slic3r/GUI/GUI_App.cpp:662 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Capture a configuration snapshot" msgstr "Zapisz zrzut konfiguracji" -#: src/libslic3r/PrintConfig.cpp:3035 +#: src/libslic3r/PrintConfig.cpp:3424 msgid "Center" msgstr "Punkt centralny" -#: src/libslic3r/PrintConfig.cpp:3036 +#: src/libslic3r/PrintConfig.cpp:3425 msgid "Center the print around the given center." msgstr "Wyśrodkuj model wokół podanego punktu centralnego." -#: src/slic3r/GUI/Tab.cpp:1744 +#: src/slic3r/GUI/Tab.cpp:1728 msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*" msgstr "Pliki certyfikatów (*.crt, *.pem)|*.crt;*.pem|Wszystkie pliki|*.*" -#: src/slic3r/GUI/GUI_App.cpp:683 -msgid "Change Application &Language" -msgstr "Zmień &Język Aplikacji" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:180 msgid "Change camera type (perspective, orthographic)" msgstr "Zmień rodzaj widoku (perspektywiczny/ortograficzny)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1226 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:885 +msgid "Change drainage hole diameter" +msgstr "Zmień średnicę otworu odpływowego" + +#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1671 msgid "Change extruder" msgstr "Zmiana ekstrudera" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:144 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectList.cpp:536 +msgid "Change Extruder" +msgstr "Zmień Ekstruder" + +#: src/slic3r/GUI/DoubleSlider.cpp:1145 +msgid "Change extruder (N/A)" +msgstr "Zmień ekstruder (N/A)" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3997 +msgid "Change Extruders" +msgstr "Zmień Ekstrudery" + +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152 +#, c-format msgid "Change Option %s" msgstr "Zmień Opcję %s" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3134 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3558 msgid "Change Part Type" msgstr "Zmień Rodzaj Elementu" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:925 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820 msgid "Change point head diameter" msgstr "Zmień średnicę łącznika" -#: src/slic3r/GUI/Plater.cpp:3520 +#: src/slic3r/GUI/Plater.cpp:3944 msgid "Change the number of instances of the selected object" msgstr "Zmień liczbę kopii wybranego modelu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1185 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1589 msgid "Change type" msgstr "Zmiana rodzaju" -#: src/slic3r/GUI/UpdateDialogs.cpp:56 +#: src/slic3r/GUI/UpdateDialogs.cpp:53 msgid "Changelog && Download" msgstr "Pobierz && Listę Zmian" -#: src/slic3r/GUI/GUI_App.cpp:378 +#: src/slic3r/GUI/GUI_App.cpp:442 msgid "Changing of an application language" msgstr "Zmiana języka aplikacji" -#: src/slic3r/GUI/ConfigWizard.cpp:409 src/slic3r/GUI/Preferences.cpp:61 +#: src/slic3r/GUI/ConfigWizard.cpp:769 src/slic3r/GUI/Preferences.cpp:64 msgid "Check for application updates" msgstr "Sprawdź aktualizacje aplikacji" -#: src/slic3r/GUI/BedShapeDialog.cpp:509 +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for configuration updates" +msgstr "Sprawdzaj aktualizacje konfiguracji" + +#: src/slic3r/GUI/GUI_App.cpp:802 +msgid "Check for updates" +msgstr "Sprawdź akt&ualizacje" + +#: src/slic3r/GUI/BedShapeDialog.cpp:532 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:621 +#: src/slic3r/GUI/MainFrame.cpp:773 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:532 +#: src/slic3r/GUI/BedShapeDialog.cpp:555 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:464 +#: src/slic3r/GUI/BedShapeDialog.cpp:487 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:510 +#: src/slic3r/GUI/GUI_App.cpp:555 msgid "Choose one file (3MF/AMF):" msgstr "Wybierz jeden plik (3MF/AMF):" -#: src/slic3r/GUI/GUI_App.cpp:501 +#: src/slic3r/GUI/GUI_App.cpp:567 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:490 +#: src/slic3r/GUI/ConfigWizard.cpp:895 msgid "Choose the type of firmware used by your printer." msgstr "Wybierz rodzaj firmware używanego przez Twoją drukarkę." -#: src/slic3r/GUI/BedShapeDialog.cpp:84 +#: src/slic3r/GUI/BedShapeDialog.cpp:89 msgid "Circular" msgstr "Okrągły" -#: src/slic3r/GUI/GLCanvas3D.cpp:3701 src/slic3r/GUI/GLCanvas3D.cpp:3734 +#: 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/GUI_ObjectList.cpp:383 +#: src/slic3r/GUI/GUI_ObjectList.cpp:404 msgid "Click the icon to change the object printable property" -msgstr "Kliknij na ikonę, aby zmienić możliwą do wydrukowania właściwość modelu" +msgstr "Kliknij na ikonę, aby włączyć/wyłączyć drukowanie modelu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:377 +#: src/slic3r/GUI/GUI_ObjectList.cpp:398 msgid "Click the icon to change the object settings" msgstr "Kliknij na ikonę, aby zmienić ustawienia modelu" -#: src/slic3r/GUI/Plater.cpp:292 +#: src/slic3r/GUI/Plater.cpp:343 msgid "Click to edit preset" msgstr "Kliknij aby edytować zestaw ustawień" -#: src/libslic3r/PrintConfig.cpp:216 +#: src/libslic3r/PrintConfig.cpp:252 msgid "Clip multi-part objects" -msgstr "Przycinaj modele złożone z kilku części" +msgstr "Przycinaj modele kilkuczęściowe" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:928 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58 msgid "Clipping of view" msgstr "Widok przecinania" -#: src/slic3r/GUI/FirmwareDialog.cpp:814 -#: src/slic3r/GUI/PrintHostDialogs.cpp:160 +#: src/slic3r/GUI/FirmwareDialog.cpp:852 +#: src/slic3r/GUI/Mouse3DController.cpp:364 +#: src/slic3r/GUI/PrintHostDialogs.cpp:161 msgid "Close" msgstr "Zamknij" -#: src/libslic3r/PrintConfig.cpp:550 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45 +#: src/libslic3r/PrintConfig.cpp:2934 +msgid "Closing distance" +msgstr "Dystans domykania" + +#: src/slic3r/GUI/Plater.cpp:1260 src/libslic3r/PrintConfig.cpp:582 msgid "Color" msgstr "Kolor" -#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/GUI_Preview.cpp:535 -#: src/libslic3r/GCode/PreviewData.cpp:406 +#: src/slic3r/GUI/DoubleSlider.cpp:1005 +msgid "Color change (\"%1%\")" +msgstr "Zmiana koloru (\"%1%\")" + +#: src/slic3r/GUI/DoubleSlider.cpp:1006 +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/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572 +#: src/libslic3r/GCode/PreviewData.cpp:359 msgid "Color Print" msgstr "Zmiana Koloru" -#: src/libslic3r/PrintConfig.cpp:224 +#: src/libslic3r/PrintConfig.cpp:260 msgid "Colorprint height" msgstr "Wysokość (warstwa) zmiany koloru" -#: src/libslic3r/PrintConfig.cpp:942 +#: src/libslic3r/PrintConfig.cpp:990 msgid "Combine infill every" msgstr "Scalaj wypełnienie co" -#: src/libslic3r/PrintConfig.cpp:947 +#: src/libslic3r/PrintConfig.cpp:995 msgid "Combine infill every n layers" msgstr "Scalaj wypełnienie co n warstw" -#: src/slic3r/GUI/UpdateDialogs.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 +msgid "Commands" +msgstr "Komendy" + +#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173 msgid "Comment:" msgstr "Komentarz:" -#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:244 +#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280 msgid "Compatible print profiles" msgstr "Kompatybilne profile druku" -#: src/libslic3r/PrintConfig.cpp:250 +#: src/libslic3r/PrintConfig.cpp:286 msgid "Compatible print profiles condition" msgstr "Warunki kompatybilności profili druku" -#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:229 +#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265 msgid "Compatible printers" msgstr "Kompatybilne drukarki" -#: src/libslic3r/PrintConfig.cpp:235 +#: src/libslic3r/PrintConfig.cpp:271 msgid "Compatible printers condition" msgstr "Warunki kompatybilności z drukarką" -#: src/libslic3r/PrintConfig.cpp:268 +#: src/libslic3r/PrintConfig.cpp:304 msgid "Complete individual objects" msgstr "Druk sekwencyjny (model po modelu)" -#: src/slic3r/GUI/PrintHostDialogs.cpp:233 +#: src/slic3r/GUI/PrintHostDialogs.cpp:234 msgid "Completed" msgstr "Zakończono" -#: src/libslic3r/Zipper.cpp:57 +#: src/libslic3r/Zipper.cpp:54 msgid "compression failed" msgstr "niepowodzenie kompresji" -#: src/libslic3r/PrintConfig.cpp:399 src/libslic3r/PrintConfig.cpp:802 +#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849 msgid "Concentric" msgstr "Koncentryczny" -#: src/slic3r/GUI/ConfigWizard.cpp:1185 +#: src/slic3r/GUI/ConfigWizard.cpp:2110 msgid "Configuration &Assistant" msgstr "&Asystent Konfiguracji" -#: src/slic3r/GUI/ConfigWizard.cpp:1182 +#: src/slic3r/GUI/ConfigWizard.cpp:2113 msgid "Configuration &Wizard" -msgstr "&Asystent Konfiguracji" +msgstr "Asystent Ko&nfiguracji" -#: src/slic3r/GUI/ConfigWizard.cpp:1184 +#: src/slic3r/GUI/ConfigWizard.cpp:2109 msgid "Configuration Assistant" msgstr "Asystent konfiguracji" -#: src/libslic3r/PrintConfig.cpp:1251 +#: src/libslic3r/PrintConfig.cpp:1316 msgid "Configuration notes" msgstr "Notatki konfiguracyjne" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:99 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104 msgid "Configuration Snapshots" msgstr "Zrzuty konfiguracji" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 src/slic3r/GUI/UpdateDialogs.cpp:168 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266 msgid "Configuration update" msgstr "Aktualizacja konfiguracji" -#: src/slic3r/GUI/UpdateDialogs.cpp:73 +#: src/slic3r/GUI/UpdateDialogs.cpp:89 msgid "Configuration update is available" msgstr "Dostępna jest aktualizacja konfiguracji" -#: src/slic3r/GUI/ConfigWizard.cpp:1181 +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +msgid "Configuration updates" +msgstr "Aktualizacje konfiguracji" + +#: src/slic3r/GUI/ConfigWizard.cpp:2112 msgid "Configuration Wizard" msgstr "Asystent Konfiguracji" -#: src/slic3r/GUI/FirmwareDialog.cpp:863 +#: src/slic3r/GUI/FirmwareDialog.cpp:903 msgid "Confirmation" msgstr "Potwierdzenie" -#: src/slic3r/GUI/Tab.cpp:1904 +#: src/slic3r/GUI/Tab.cpp:1931 msgid "Connection failed." msgstr "Błąd połączenia." -#: src/slic3r/GUI/Tab.cpp:3416 +#: src/slic3r/GUI/Tab.cpp:3627 msgid "Connection of the support sticks and junctions" msgstr "Łączenia słupków i skrzyżowań podpór" -#: src/slic3r/Utils/Duet.cpp:51 +#: src/slic3r/Utils/AstroBox.cpp:83 +msgid "Connection to AstroBox works correctly." +msgstr "Połączenie z AstroBox pomyślne." + +#: src/slic3r/Utils/Duet.cpp:49 msgid "Connection to Duet works correctly." msgstr "Połączenie z Duet pomyślne." -#: src/slic3r/Utils/OctoPrint.cpp:84 +#: src/slic3r/Utils/FlashAir.cpp:68 +msgid "Connection to FlashAir works correctly and upload is enabled." +msgstr "Połączenie z FlashAir działa poprawnie a przesyłanie jest włączone." + +#: src/slic3r/Utils/OctoPrint.cpp:83 msgid "Connection to OctoPrint works correctly." msgstr "Połączenie z OctoPrint pomyślne." -#: src/slic3r/GUI/Tab.cpp:1901 +#: src/slic3r/GUI/Tab.cpp:1928 msgid "Connection to printer works correctly." msgstr "Połączenie z drukarką pomyślne." -#: src/slic3r/Utils/OctoPrint.cpp:195 +#: src/slic3r/Utils/OctoPrint.cpp:176 msgid "Connection to Prusa SL1 works correctly." msgstr "Połączenie z Prusa SL1 działa prawidłowo." -#: src/libslic3r/PrintConfig.cpp:1823 +#: src/libslic3r/PrintConfig.cpp:1909 msgid "Contact Z distance" msgstr "Odstęp w osi Z" -#: src/slic3r/GUI/AboutDialog.cpp:96 +#: src/slic3r/GUI/AboutDialog.cpp:261 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:2433 +#: src/libslic3r/PrintConfig.cpp:2659 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:1489 +#: src/slic3r/GUI/Tab.cpp:1444 msgid "Cooling" msgstr "Chłodzenie" -#: src/libslic3r/PrintConfig.cpp:629 +#: src/libslic3r/PrintConfig.cpp:660 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:648 +#: src/libslic3r/PrintConfig.cpp:679 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:1510 +#: src/slic3r/GUI/Tab.cpp:1465 msgid "Cooling thresholds" msgstr "Progi chłodzenia" -#: src/libslic3r/PrintConfig.cpp:291 +#: src/libslic3r/PrintConfig.cpp:327 msgid "Cooling tube length" msgstr "Długość rurki chłodzącej" -#: src/libslic3r/PrintConfig.cpp:283 +#: src/libslic3r/PrintConfig.cpp:319 msgid "Cooling tube position" msgstr "Pozycja rurki chłodzącej" -#: src/slic3r/GUI/Tab.cpp:2878 +#: src/slic3r/GUI/Plater.cpp:4752 +msgid "Copies of the selected object" +msgstr "Kopie wybranego modelu" + +#: src/slic3r/GUI/GLCanvas3D.cpp:4505 msgid "Copy" msgstr "Kopiuj" -#: src/slic3r/GUI/MainFrame.cpp:454 +#: src/slic3r/GUI/MainFrame.cpp:589 msgid "Copy selection to clipboard" msgstr "Skopiuj zaznaczenie do schowka" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:132 msgid "Copy to clipboard" msgstr "Skopiuj do schowka" -#: src/slic3r/GUI/SysInfoDialog.cpp:120 +#: src/slic3r/GUI/SysInfoDialog.cpp:154 msgid "Copy to Clipboard" msgstr "Kopiuj do Schowka" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:84 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:400 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121 +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 +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 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:92 +#: 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/AboutDialog.cpp:92 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112 +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 msgid "Copyright" msgstr "Prawa autorskie" -#: src/libslic3r/PrintConfig.cpp:2324 src/libslic3r/PrintConfig.cpp:2325 +#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572 msgid "Correction for expansion" msgstr "Korekcja rozszerzania" -#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:3310 +#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:3519 msgid "Corrections" msgstr "Korekcje" -#: src/slic3r/GUI/Plater.cpp:216 src/slic3r/GUI/Plater.cpp:1056 -#: src/libslic3r/PrintConfig.cpp:717 +#: src/slic3r/GUI/Plater.cpp:1243 src/libslic3r/PrintConfig.cpp:760 +#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511 msgid "Cost" msgstr "Koszt" -#: src/slic3r/GUI/Plater.cpp:2140 +#: src/slic3r/GUI/Plater.cpp:239 +msgid "Cost (money)" +msgstr "Koszt (pieniędzy)" + +#: src/slic3r/GUI/Plater.cpp:2835 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/Duet.cpp:56 +#: src/slic3r/Utils/AstroBox.cpp:89 +msgid "Could not connect to AstroBox" +msgstr "Nie można połączyć się z AstroBox" + +#: src/slic3r/Utils/Duet.cpp:54 msgid "Could not connect to Duet" msgstr "Nie można połączyć się z Duet" -#: src/slic3r/Utils/OctoPrint.cpp:90 +#: src/slic3r/Utils/FlashAir.cpp:73 +msgid "Could not connect to FlashAir" +msgstr "Nie można połączyć z FlashAir" + +#: src/slic3r/Utils/OctoPrint.cpp:89 msgid "Could not connect to OctoPrint" msgstr "Nie można połączyć się z OctoPrint" -#: src/slic3r/Utils/OctoPrint.cpp:200 +#: src/slic3r/Utils/OctoPrint.cpp:181 msgid "Could not connect to Prusa SLA" msgstr "Nie można połączyć się z Prusa SLA" -#: src/slic3r/GUI/Tab.cpp:1710 +#: src/slic3r/GUI/Tab.cpp:1687 msgid "Could not get a valid Printer Host reference" msgstr "Brak prawidłowego odwołania do serwera druku" -#: src/slic3r/Utils/Duet.cpp:151 +#: src/slic3r/Utils/Duet.cpp:134 msgid "Could not get resources to create a new connection" msgstr "Brak zasobów do utworzenia nowego połączenia" -#: src/libslic3r/PrintConfig.cpp:1872 +#: src/libslic3r/PrintConfig.cpp:1959 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:73 +#: src/libslic3r/PrintConfig.cpp:89 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:61 +#: src/libslic3r/Zipper.cpp:58 msgid "CRC-32 check failed" msgstr "Weryfikacja CRC-32 nie powiodła się" -#: src/libslic3r/PrintConfig.cpp:2734 +#: src/libslic3r/PrintConfig.cpp:2857 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:2460 +#: src/libslic3r/PrintConfig.cpp:2724 msgid "Critical angle" msgstr "Kąt krytyczny" -#: src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2668 msgid "Cross" msgstr "Krzyżowy" -#: src/libslic3r/PrintConfig.cpp:800 +#: src/libslic3r/PrintConfig.cpp:847 msgid "Cubic" msgstr "Sześcienny" -#: src/slic3r/GUI/wxExtensions.cpp:2413 -#, possible-c-format +#: src/slic3r/GUI/wxExtensions.cpp:704 +#, c-format msgid "Current mode is %s" msgstr "Obecny tryb to %s" -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:959 +msgid "Current preset is inherited from" +msgstr "Obecny zestaw ustawień jest dziedziczony z" + +#: src/slic3r/GUI/Tab.cpp:957 msgid "Current preset is inherited from the default preset." msgstr "Obecny zestaw ustawień jest dziedziczony z zestawu domyślnego." -#: src/slic3r/GUI/Tab.cpp:928 -#, possible-c-format -msgid "Current preset is inherited from:\n\t%s" -msgstr "Obecny zestaw ustawień jest dziedziczony z:\n%s" - -#: src/slic3r/GUI/UpdateDialogs.cpp:45 +#: src/slic3r/GUI/UpdateDialogs.cpp:43 msgid "Current version:" msgstr "Obecna wersja:" -#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/slic3r/GUI/GUI_Preview.cpp:239 -#: src/libslic3r/GCode/PreviewData.cpp:175 +#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249 +#: src/libslic3r/ExtrusionEntity.cpp:322 msgid "Custom" msgstr "Własny" -#: src/libslic3r/PrintConfig.cpp:96 +#: src/libslic3r/PrintConfig.cpp:112 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:1563 src/slic3r/GUI/Tab.cpp:1948 +#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1975 msgid "Custom G-code" msgstr "Własny G-code" -#: src/slic3r/GUI/ConfigWizard.cpp:373 +#: src/slic3r/GUI/DoubleSlider.cpp:1619 +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 msgid "Custom Printer" msgstr "Własna Drukarka" -#: src/slic3r/GUI/ConfigWizard.cpp:373 +#: src/slic3r/GUI/ConfigWizard.cpp:732 msgid "Custom Printer Setup" msgstr "Ustawienie Własnej Drukarki" -#: src/slic3r/GUI/ConfigWizard.cpp:377 +#: src/slic3r/GUI/ConfigWizard.cpp:736 msgid "Custom profile name:" msgstr "Nazwa własnego profilu:" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:188 src/libslic3r/PrintConfig.cpp:3013 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3402 msgid "Cut" msgstr "Przetnij" -#: src/slic3r/GUI/Plater.cpp:4193 +#: src/slic3r/GUI/Plater.cpp:4786 msgid "Cut by Plane" msgstr "Tnij Płaszczyzną" -#: src/libslic3r/PrintConfig.cpp:3014 +#: src/libslic3r/PrintConfig.cpp:3403 msgid "Cut model at the given Z." -msgstr "Przetnij model na zadanej wysokości Z." +msgstr "Przetnij model na wysokości Z." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Cylinder" msgstr "Cylinder" -#: src/slic3r/GUI/MainFrame.cpp:491 +#: src/slic3r/GUI/MainFrame.cpp:568 msgid "D&eselect all" -msgstr "O&dznacz wszystko" +msgstr "&Odznacz wszystko" -#: src/libslic3r/PrintConfig.cpp:3115 +#: src/libslic3r/PrintConfig.cpp:3504 msgid "Data directory" msgstr "Katalog danych" -#: src/libslic3r/Zipper.cpp:55 +#: src/slic3r/GUI/Mouse3DController.cpp:313 +msgid "Deadzone:" +msgstr "Martwa strefa:" + +#: src/libslic3r/Zipper.cpp:52 msgid "decompression failed or archive is corrupted" msgstr "niepowodzenie rozpakowywania lub uszkodzone archiwum" -#: src/slic3r/GUI/Plater.cpp:4127 +#: src/slic3r/GUI/Plater.cpp:4720 msgid "Decrease Instances" -msgstr "Zmniejsz ilość kopii" +msgstr "Zmniejsz ilość instancji" -#: src/slic3r/GUI/GUI_App.cpp:594 src/slic3r/GUI/GUI_ObjectList.cpp:1245 -#: src/libslic3r/PrintConfig.cpp:299 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1704 src/libslic3r/PrintConfig.cpp:335 msgid "Default" msgstr "Domyślnie" -#: xs/src/slic3r/GUI/Field.cpp:98 +#: 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 msgid "default" msgstr "domyślnie" -#: src/libslic3r/PrintConfig.cpp:730 +#: src/libslic3r/PrintConfig.cpp:777 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:522 +#: src/libslic3r/PrintConfig.cpp:554 msgid "Default extrusion width" msgstr "Domyślna szerokość linii" -#: src/slic3r/GUI/Tab.cpp:937 +#: src/slic3r/GUI/Tab.cpp:987 msgid "default filament profile" msgstr "domyślny profil filamentu" -#: src/libslic3r/PrintConfig.cpp:309 +#: src/libslic3r/PrintConfig.cpp:345 msgid "Default filament profile" msgstr "Domyślny profil filamentu" -#: src/libslic3r/PrintConfig.cpp:310 +#: src/libslic3r/PrintConfig.cpp:346 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:2757 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:2919 +#, c-format msgid "Default preset (%s)" msgstr "Domyślny zestaw ustawień (%s)" -#: src/libslic3r/GCode/PreviewData.cpp:491 +#: 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:934 +#: src/slic3r/GUI/Tab.cpp:984 msgid "default print profile" msgstr "domyślny profil druku" -#: src/libslic3r/PrintConfig.cpp:316 +#: src/libslic3r/PrintConfig.cpp:352 msgid "Default print profile" msgstr "Domyślny profil druku" -#: src/libslic3r/PrintConfig.cpp:317 src/libslic3r/PrintConfig.cpp:2341 -#: src/libslic3r/PrintConfig.cpp:2352 +#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592 +#: src/libslic3r/PrintConfig.cpp:2603 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:951 +#: src/slic3r/GUI/Tab.cpp:1001 msgid "default SLA material profile" msgstr "domyślny profil materiału SLA" -#: src/libslic3r/PrintConfig.cpp:2340 src/libslic3r/PrintConfig.cpp:2351 +#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602 msgid "Default SLA material profile" msgstr "Domyślny profil materiału SLA" -#: src/slic3r/GUI/Tab.cpp:955 +#: src/slic3r/GUI/Tab.cpp:1005 msgid "default SLA print profile" msgstr "domyślny profil druku SLA" -#: src/slic3r/GUI/Field.cpp:105 +#: src/slic3r/GUI/Field.cpp:136 msgid "default value" msgstr "wartość domyślna" -#: src/slic3r/GUI/ConfigWizard.cpp:375 +#: src/slic3r/GUI/ConfigWizard.cpp:734 msgid "Define a custom printer profile" msgstr "Zdefiniuj własny profil drukarki" -#: src/libslic3r/PrintConfig.cpp:2558 +#: src/libslic3r/PrintConfig.cpp:2798 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." -#: src/slic3r/GUI/GUI_ObjectList.cpp:237 +#: src/slic3r/GUI/GUI_ObjectList.cpp:346 msgid "degenerate facets" msgstr "ponowne generowanie ścianek" -#: src/libslic3r/PrintConfig.cpp:608 +#: src/libslic3r/PrintConfig.cpp:640 msgid "Delay after unloading" msgstr "Opóźnienie po rozładowaniu" -#: src/slic3r/GUI/Tab.cpp:2935 +#: src/slic3r/GUI/Tab.cpp:3121 msgid "delete" msgstr "usuń" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1257 src/slic3r/GUI/Plater.cpp:2891 -#: src/slic3r/GUI/Plater.cpp:2909 src/slic3r/GUI/Tab.cpp:2937 +#: 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 msgid "Delete" msgstr "Usuń" -#: src/slic3r/GUI/MainFrame.cpp:449 +#: src/slic3r/GUI/MainFrame.cpp:575 msgid "Delete &all" msgstr "Usuń &wszystko" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 -msgid "Delete All" -msgstr "Usuń wszystko" - -#: src/slic3r/GUI/Plater.cpp:3298 +#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129 +#: src/slic3r/GUI/Plater.cpp:4669 msgid "Delete all" msgstr "Usuń wszystko" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1806 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2176 msgid "Delete All Instances from Object" msgstr "Usuń wszystkie kopie modelu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:187 +#: src/slic3r/GUI/DoubleSlider.cpp:1516 +msgid "Delete color change" +msgstr "Usuń zmianę koloru" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:219 msgid "Delete color change marker for current layer" msgstr "Usuń punkt zmiany filamentu na obecnej warstwie" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1898 +#: src/slic3r/GUI/DoubleSlider.cpp:1519 +msgid "Delete custom G-code" +msgstr "Usuń własny G-code" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:539 +msgid "Delete drainage hole" +msgstr "Usuń otwór odpływowy" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2192 msgid "Delete Height Range" msgstr "Usuń zakres wysokości" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1876 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2246 msgid "Delete Instance" -msgstr "Usuń Kopię" +msgstr "Usuń instancję" -#: src/slic3r/GUI/Plater.cpp:2592 +#: src/slic3r/GUI/Plater.cpp:2712 msgid "Delete Object" msgstr "Usuń Model" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:100 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101 +#, c-format msgid "Delete Option %s" msgstr "Usuń Opcję %s" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 -msgid "Delete selected" -msgstr "Usuń wybrane" +#: src/slic3r/GUI/DoubleSlider.cpp:1518 +msgid "Delete pause print" +msgstr "Usuń pauzę wydruku" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2415 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:128 +msgid "Delete selected" +msgstr "Usuń zaznaczone" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2830 msgid "Delete Selected" msgstr "Usuń Zaznaczone" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2303 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2693 msgid "Delete Selected Item" msgstr "Usuń Wybrany Obiekt" -#: src/slic3r/GUI/Plater.cpp:4083 +#: src/slic3r/GUI/Plater.cpp:4677 msgid "Delete Selected Objects" msgstr "Usuń Zaznaczone Modele" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1782 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2152 msgid "Delete Settings" msgstr "Usuń Ustawienia" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1857 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2227 msgid "Delete Subobject" msgstr "Usuń Model Podrzędny" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:720 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631 msgid "Delete support point" msgstr "Usuń punkt podpory" -#: src/slic3r/GUI/Tab.cpp:131 +#: src/slic3r/GUI/Tab.cpp:134 msgid "Delete this preset" msgstr "Usuń ten zestaw ustawień" -#: src/slic3r/GUI/MainFrame.cpp:449 +#: src/slic3r/GUI/DoubleSlider.cpp:1035 +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 +msgid "Delete tool change" +msgstr "Usuń zmianę narzędzia" + +#: src/slic3r/GUI/MainFrame.cpp:576 msgid "Deletes all objects" msgstr "Usuwa wszystkie modele" -#: src/slic3r/GUI/MainFrame.cpp:447 +#: src/slic3r/GUI/MainFrame.cpp:573 msgid "Deletes the current selection" msgstr "Usuwa zaznaczenie" -#: src/libslic3r/PrintConfig.cpp:685 +#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503 +#: src/libslic3r/PrintConfig.cpp:2504 msgid "Density" msgstr "Gęstość" -#: src/libslic3r/PrintConfig.cpp:744 +#: src/libslic3r/PrintConfig.cpp:791 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:1200 src/slic3r/GUI/Tab.cpp:1584 -#: src/slic3r/GUI/Tab.cpp:1992 src/slic3r/GUI/Tab.cpp:2086 -#: src/slic3r/GUI/Tab.cpp:3336 src/slic3r/GUI/Tab.cpp:3445 +#: 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 msgid "Dependencies" msgstr "Zależności" -#: src/libslic3r/PrintConfig.cpp:1542 src/libslic3r/PrintConfig.cpp:1543 +#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613 msgid "Deretraction Speed" msgstr "Prędkość powrotu retrakcji" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1235 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:127 +msgid "Deselect all" +msgstr "Odznacz wszystko" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369 msgid "Deselect by rectangle" msgstr "Odznaczenie prostokątem" -#: src/slic3r/GUI/MainFrame.cpp:492 +#: src/slic3r/GUI/MainFrame.cpp:569 msgid "Deselects all objects" msgstr "Odznacza wszystkie modele" -#: src/libslic3r/PrintConfig.cpp:1304 +#: src/slic3r/GUI/Tab.cpp:963 +msgid "Detach from system preset" +msgstr "Odłącz od ustawień systemowych" + +#: src/slic3r/GUI/Tab.cpp:984 +msgid "Detach preset" +msgstr "Odłącz zestaw ustawień" + +#: src/slic3r/GUI/Tab.cpp:3029 +msgid "Detached" +msgstr "Odłączono" + +#: src/libslic3r/PrintConfig.cpp:1373 msgid "Detect bridging perimeters" msgstr "Wykrywanie mostów przy obrysach" -#: src/libslic3r/PrintConfig.cpp:1988 +#: src/libslic3r/PrintConfig.cpp:2075 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:1986 +#: src/libslic3r/PrintConfig.cpp:2073 msgid "Detect thin walls" msgstr "Wykrywanie cienkich ścian" -#: src/libslic3r/PrintConfig.cpp:3083 +#: src/libslic3r/PrintConfig.cpp:3472 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:1713 +#: src/slic3r/GUI/Plater.cpp:2368 msgid "Detected advanced data" msgstr "Wykryto zaawansowane dane" -#: src/slic3r/GUI/BedShapeDialog.cpp:88 src/libslic3r/PrintConfig.cpp:677 +#: src/slic3r/GUI/Mouse3DController.cpp:289 +msgid "Device:" +msgstr "Urządzenie:" + +#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709 msgid "Diameter" msgstr "Średnica" -#: src/libslic3r/PrintConfig.cpp:2443 +#: src/libslic3r/PrintConfig.cpp:2694 msgid "Diameter in mm of the pillar base" msgstr "Średnica podstawy słupka w mm" -#: src/libslic3r/PrintConfig.cpp:2399 +#: src/libslic3r/PrintConfig.cpp:2650 msgid "Diameter in mm of the support pillars" msgstr "Średnica słupków podpór w mm" -#: src/libslic3r/PrintConfig.cpp:2371 +#: src/libslic3r/PrintConfig.cpp:2622 msgid "Diameter of the pointing side of the head" msgstr "Średnica spiczastej części łącznika" -#: src/slic3r/GUI/BedShapeDialog.cpp:89 +#: src/slic3r/GUI/BedShapeDialog.cpp:94 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:1569 +#: src/libslic3r/PrintConfig.cpp:1639 msgid "Direction" msgstr "Kierunek" -#: src/libslic3r/PrintConfig.cpp:323 +#: src/libslic3r/PrintConfig.cpp:359 msgid "Disable fan for the first" msgstr "Wyłącz wentylator przy pierwszych" -#: src/libslic3r/PrintConfig.cpp:1280 +#: src/libslic3r/PrintConfig.cpp:1349 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/wxExtensions.cpp:2572 -msgid "Discard all color changes" -msgstr "Odrzuć wszystkie zmiany koloru" +#: src/slic3r/GUI/DoubleSlider.cpp:952 +msgid "Discard all custom changes" +msgstr "Odrzuć wszystkie własne zmiany" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1241 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1375 msgid "Discard changes" msgstr "Odrzuć zmiany" -#: src/slic3r/GUI/Tab.cpp:2784 +#: 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/Gizmos/GLGizmoMove.cpp:177 -msgid "Displacement (mm)" -msgstr "Rozmieszczenie (mm)" - -#: src/slic3r/GUI/Tab.cpp:2041 +#: src/slic3r/GUI/Tab.cpp:2078 msgid "Display" msgstr "Wyświetlacz" -#: src/libslic3r/PrintConfig.cpp:2208 +#: src/libslic3r/PrintConfig.cpp:2359 msgid "Display height" msgstr "Wysokość wyświetlacza" -#: src/libslic3r/PrintConfig.cpp:2319 +#: src/libslic3r/PrintConfig.cpp:2378 msgid "Display horizontal mirroring" msgstr "Pokaż odbicie poziome" -#: src/libslic3r/PrintConfig.cpp:2227 +#: src/libslic3r/PrintConfig.cpp:2392 msgid "Display orientation" msgstr "Pokaż orientację" -#: src/slic3r/GUI/MainFrame.cpp:510 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Display the Print Host Upload Queue window" -msgstr "Wyświetl okno kolejki Serwera Druku" +msgstr "Wyświetl okno kolejki serwera druku" -#: src/libslic3r/PrintConfig.cpp:2326 +#: src/libslic3r/PrintConfig.cpp:2385 msgid "Display vertical mirroring" msgstr "Pokaż odbicie pionowe" -#: src/libslic3r/PrintConfig.cpp:2202 +#: src/libslic3r/PrintConfig.cpp:2353 msgid "Display width" msgstr "Orientacja wyświetlacza" -#: src/libslic3r/PrintConfig.cpp:341 +#: src/libslic3r/PrintConfig.cpp:377 msgid "Distance between copies" msgstr "Odstęp pomiędzy kopiami" -#: src/libslic3r/PrintConfig.cpp:1610 +#: src/libslic3r/PrintConfig.cpp:1680 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." -#: src/libslic3r/PrintConfig.cpp:2752 +#: src/libslic3r/PrintConfig.cpp:2882 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:1609 +#: src/libslic3r/PrintConfig.cpp:1679 msgid "Distance from object" msgstr "Odstęp od modelu" -#: src/slic3r/GUI/BedShapeDialog.cpp:80 +#: src/slic3r/GUI/BedShapeDialog.cpp:85 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:285 +#: src/libslic3r/PrintConfig.cpp:320 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:1338 +#: src/libslic3r/PrintConfig.cpp:1382 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:342 +#: src/libslic3r/PrintConfig.cpp:378 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:3097 +#: src/libslic3r/PrintConfig.cpp:3486 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:3041 +#: src/libslic3r/PrintConfig.cpp:3430 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:206 -#, 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/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/GUI_App.cpp:754 +#: src/slic3r/GUI/DoubleSlider.cpp:1920 +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 msgid "Do you want to proceed?" msgstr "Czy chcesz kontynuować?" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1024 +#: src/slic3r/GUI/Plater.cpp:3321 +msgid "Do you want to retry" +msgstr "Czy chcesz spróbować ponownie" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1045 msgid "Do you want to save your manually edited support points?" msgstr "Czy chcesz zapisać ręcznie edytowane punkty podpór?" -#: src/libslic3r/PrintConfig.cpp:3040 +#: src/slic3r/GUI/ConfigWizard.cpp:1834 +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 +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 msgid "Don't arrange" msgstr "Nie układaj" -#: src/slic3r/GUI/UpdateDialogs.cpp:55 +#: src/slic3r/GUI/UpdateDialogs.cpp:71 msgid "Don't notify about new releases any more" msgstr "Nie powiadamiaj o nowych wersjach" -#: src/libslic3r/PrintConfig.cpp:333 +#: src/libslic3r/PrintConfig.cpp:369 msgid "Don't support bridges" msgstr "Nie używaj podpór pod mostami" @@ -1724,316 +2100,426 @@ msgstr "Nie używaj podpór pod mostami" msgid "Downgrade" msgstr "Deaktualizacja" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1233 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1236 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1237 +#: src/libslic3r/PrintConfig.cpp:1695 +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 msgid "Drag" msgstr "Przeciągnij" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:340 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:355 +#: src/libslic3r/SLAPrintSteps.cpp:44 +msgid "Drilling holes into model." +msgstr "Wiercenie otworów odpływowych w modelu." + +#: src/libslic3r/SLAPrintSteps.cpp:199 +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 msgid "Drop to bed" msgstr "Upuść na stół" -#: src/libslic3r/PrintConfig.cpp:3044 +#: src/libslic3r/PrintConfig.cpp:3433 msgid "Duplicate" msgstr "Duplikuj" -#: src/libslic3r/PrintConfig.cpp:3049 +#: src/libslic3r/PrintConfig.cpp:3438 msgid "Duplicate by grid" msgstr "Duplikuj wg siatki" -#: src/libslic3r/PrintConfig.cpp:2418 +#: src/slic3r/GUI/PresetHints.cpp:40 +msgid "During the other layers, fan" +msgstr "Na pozostałych warstwach, wentylator" + +#: src/libslic3r/PrintConfig.cpp:2669 msgid "Dynamic" msgstr "Dynamicznie" -#: src/slic3r/GUI/MainFrame.cpp:708 +#: src/slic3r/GUI/MainFrame.cpp:749 msgid "E&xport" msgstr "&Eksport" -#: src/slic3r/GUI/GUI_ObjectList.cpp:238 +#: src/slic3r/GUI/GUI_ObjectList.cpp:347 msgid "edges fixed" msgstr "naprawiono krawędzie" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2690 +#: src/slic3r/GUI/DoubleSlider.cpp:1508 +msgid "Edit color" +msgstr "Edytuj kolor" + +#: src/slic3r/GUI/DoubleSlider.cpp:960 +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 +msgid "Edit custom G-code" +msgstr "Edytuj własny G-code" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:3003 msgid "Edit Height Range" msgstr "Edytuj Zakres Wysokości" -#: src/slic3r/GUI/GUI_ObjectList.cpp:373 +#: src/slic3r/GUI/DoubleSlider.cpp:1509 +msgid "Edit pause print message" +msgstr "Edytuj komunikat wstrzymania wydruku" + +#: src/slic3r/GUI/DoubleSlider.cpp:1037 +msgid "Edit tick mark - Ctrl + Left click" +msgstr "Edytuj zaznaczenie - Ctrl + Klik lewym przyciskiem" + +#: src/slic3r/GUI/DoubleSlider.cpp:1038 +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 msgid "Editing" msgstr "Edytowanie" -#: src/libslic3r/PrintConfig.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:547 +msgid "Ejec&t SD card / Flash drive" +msgstr "Wysuń kar&tę SD / pamięć flash" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Eject SD card / Flash drive" +msgstr "Wysuń kartę SD / pamięć flash" + +#: src/slic3r/GUI/MainFrame.cpp:547 +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 +msgid "Ejecting of device %s(%s) has failed." +msgstr "Wysuwanie urządzenia %s(%s) nie powiodło się." + +#: src/libslic3r/PrintConfig.cpp:118 msgid "Elephant foot compensation" msgstr "Kompensacja \"stopy słonia\"" -#: src/libslic3r/SLAPrint.cpp:681 -msgid "Elevation is too low for object. Use the \"Pad around obect\" 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:2447 +msgid "Elephant foot minimum width" +msgstr "Minimalna szerokość stopy słonia" -#: src/libslic3r/SLAPrint.cpp:678 +#: src/libslic3r/SLAPrint.cpp:625 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:1044 +#: src/libslic3r/PrintConfig.cpp:1093 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/slic3r/GUI/Tab.cpp:1490 src/libslic3r/PrintConfig.cpp:1286 -#: src/libslic3r/PrintConfig.cpp:2099 +#: src/libslic3r/GCode.cpp:637 +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 msgid "Enable" msgstr "Włącz" -#: src/libslic3r/PrintConfig.cpp:277 +#: src/libslic3r/PrintConfig.cpp:313 msgid "Enable auto cooling" msgstr "Włącz automatyczne chłodzenie" -#: src/libslic3r/PrintConfig.cpp:539 +#: src/libslic3r/PrintConfig.cpp:572 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:2321 +#: src/libslic3r/PrintConfig.cpp:2908 +msgid "Enable hollowing" +msgstr "Włącz drążenie" + +#: src/libslic3r/PrintConfig.cpp:2380 msgid "Enable horizontal mirroring of output images" msgstr "Włącz odbicie poziome dla obrazów wyjściowych" -#: src/libslic3r/PrintConfig.cpp:1781 +#: src/libslic3r/PrintConfig.cpp:1867 msgid "Enable support material generation." msgstr "Włącz generowanie materiału podporowego." -#: src/libslic3r/PrintConfig.cpp:918 +#: src/libslic3r/PrintConfig.cpp:966 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." -#: src/libslic3r/PrintConfig.cpp:881 +#: src/libslic3r/PrintConfig.cpp:929 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." -#: src/libslic3r/PrintConfig.cpp:2085 +#: src/libslic3r/PrintConfig.cpp:2186 msgid "Enable variable layer height feature" msgstr "Zmienna wysokość warstwy" -#: src/libslic3r/PrintConfig.cpp:2328 +#: src/libslic3r/PrintConfig.cpp:2387 msgid "Enable vertical mirroring of output images" msgstr "Włącz odbicie pionowe dla obrazów wyjściowych" -#: src/slic3r/GUI/Tab.cpp:1570 src/slic3r/GUI/Tab.cpp:1955 -#: src/libslic3r/PrintConfig.cpp:359 src/libslic3r/PrintConfig.cpp:369 +#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:1982 +#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395 msgid "End G-code" -msgstr "Końcowy G-code" +msgstr "G-code końcowy" -#: src/libslic3r/PrintConfig.cpp:1838 +#: src/libslic3r/PrintConfig.cpp:1924 msgid "Enforce support for the first" msgstr "Wymuś podpory dla pierwszych" -#: src/libslic3r/PrintConfig.cpp:1845 +#: src/libslic3r/PrintConfig.cpp:1931 msgid "Enforce support for the first n layers" msgstr "Wymuś podpory dla pierwszych n warstw" -#: src/slic3r/GUI/PrintHostDialogs.cpp:197 -#: src/slic3r/GUI/PrintHostDialogs.cpp:228 +#: src/slic3r/GUI/PrintHostDialogs.cpp:198 +#: src/slic3r/GUI/PrintHostDialogs.cpp:229 msgid "Enqueued" msgstr "Zakolejkowano" -#: src/libslic3r/PrintConfig.cpp:380 +#: src/libslic3r/PrintConfig.cpp:407 msgid "Ensure vertical shell thickness" msgstr "Zagwarantuj odpowiednią grubość ścianki" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 +#: src/slic3r/GUI/DoubleSlider.cpp:1618 +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 msgid "Enter new name" msgstr "Wprowadź nową nazwę" -#: src/slic3r/GUI/ConfigWizard.cpp:622 +#: src/slic3r/GUI/DoubleSlider.cpp:1634 +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 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:570 +#: src/slic3r/GUI/ConfigWizard.cpp:979 msgid "Enter the diameter of your filament." msgstr "Wprowadź średnicę filamentu." -#: src/slic3r/GUI/ConfigWizard.cpp:557 +#: src/slic3r/GUI/ConfigWizard.cpp:966 msgid "Enter the diameter of your printer's hot end nozzle." msgstr "Wprowadź średnicę dyszy hotendu." -#: src/slic3r/GUI/ConfigWizard.cpp:608 +#: src/slic3r/GUI/DoubleSlider.cpp:1650 +msgid "Enter the height you want to jump to" +msgstr "Wprowadź wysokość, do której chcesz przejść" + +#: src/slic3r/GUI/Plater.cpp:4751 +msgid "Enter the number of copies:" +msgstr "Wpisz liczbę kopii:" + +#: src/slic3r/GUI/ConfigWizard.cpp:1033 msgid "Enter the temperature needed for extruding your filament." msgstr "Wprowadź temperaturę potrzebną do ekstruzji filamentu." -#: src/libslic3r/PrintConfig.cpp:718 +#: src/libslic3r/PrintConfig.cpp:761 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:686 +#: src/libslic3r/PrintConfig.cpp:718 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:678 +#: src/libslic3r/PrintConfig.cpp:710 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:636 src/slic3r/GUI/PrintHostDialogs.cpp:230 +#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:785 +#: src/slic3r/GUI/PrintHostDialogs.cpp:231 msgid "Error" msgstr "Błąd" -#: src/slic3r/GUI/FirmwareDialog.cpp:608 -#, possible-c-format +#: src/slic3r/GUI/FirmwareDialog.cpp:645 +#, c-format msgid "Error accessing port at %s: %s" msgstr "Brak dostępu do portu %s: %s" -#: src/slic3r/GUI/Plater.cpp:3593 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:3433 +msgid "Error during reload" +msgstr "Błąd podczas przeładowywania" + +#: src/slic3r/GUI/Plater.cpp:5043 +#, c-format msgid "Error exporting 3MF file %s" msgstr "Błąd eksportowania pliku 3MF %s" -#: src/slic3r/GUI/Plater.cpp:3564 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:5005 +#, c-format msgid "Error exporting AMF file %s" msgstr "Błąd eksportu pliku AMF %s" -#: src/slic3r/GUI/PrintHostDialogs.cpp:153 +#: src/slic3r/GUI/PrintHostDialogs.cpp:154 msgid "Error Message" msgstr "Komunikat o błędzie" -#: src/slic3r/GUI/PrintHostDialogs.cpp:271 +#: src/slic3r/GUI/AppConfig.cpp:114 +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." + +#: src/slic3r/GUI/PrintHostDialogs.cpp:272 msgid "Error uploading to print host:" msgstr "Błąd wysyłania do serwera druku:" -#: src/libslic3r/Zipper.cpp:105 +#: src/libslic3r/Zipper.cpp:102 msgid "Error with zip archive" msgstr "Błąd archiwum .zip" -#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/GUI_ObjectList.cpp:1443 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1918 msgid "Error!" msgstr "Błąd!" -#: src/slic3r/GUI/BedShapeDialog.cpp:482 +#: src/slic3r/GUI/BedShapeDialog.cpp:505 msgid "Error! Invalid model" msgstr "Błąd! Nieprawidłowy model" -#: src/slic3r/GUI/FirmwareDialog.cpp:610 -#, possible-c-format +#: src/slic3r/GUI/FirmwareDialog.cpp:647 +#, c-format msgid "Error: %s" msgstr "Błąd: %s" -#: src/slic3r/GUI/Plater.cpp:1503 +#: src/slic3r/GUI/Job.hpp:123 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:217 src/slic3r/GUI/Plater.cpp:1028 -#: src/slic3r/GUI/Plater.cpp:1070 +#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1216 +#: src/slic3r/GUI/Plater.cpp:1258 msgid "Estimated printing time" msgstr "Szacowany czas druku" -#: src/slic3r/GUI/Plater.cpp:424 +#: src/slic3r/GUI/Plater.cpp:502 msgid "Everywhere" msgstr "Wszędzie" -#: src/slic3r/GUI/PresetHints.cpp:50 +#: src/slic3r/GUI/PresetHints.cpp:51 msgid "except for the first %1% layers." msgstr "za wyjątkiem pierwszych %1% warstw." -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:53 msgid "except for the first layer." msgstr "za wyjątkiem pierwszej warstwy." -#: src/libslic3r/Print.cpp:1285 +#: src/libslic3r/Print.cpp:1377 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:148 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246 +#, c-format msgid "Exit %s" msgstr "Wyjście %s" -#: src/libslic3r/PrintConfig.cpp:335 +#: src/libslic3r/PrintConfig.cpp:371 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:1306 +#: src/libslic3r/PrintConfig.cpp:1375 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:676 src/slic3r/GUI/wxExtensions.cpp:2461 +#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755 msgid "Expert" msgstr "Ekspert" -#: src/slic3r/GUI/GUI_App.cpp:676 +#: src/slic3r/GUI/ConfigWizard.cpp:822 +msgid "Expert mode" +msgstr "Tryb Eksperta" + +#: src/slic3r/GUI/GUI_App.cpp:815 msgid "Expert View Mode" msgstr "Tryb Widoku Eksperta" -#: src/slic3r/GUI/MainFrame.cpp:602 src/slic3r/GUI/Plater.cpp:3821 +#: src/slic3r/GUI/Plater.cpp:5521 msgid "Export" msgstr "Eksport" -#: src/slic3r/GUI/MainFrame.cpp:373 +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export &Config" msgstr "Eksport Konfigura&cji" -#: src/slic3r/GUI/MainFrame.cpp:362 src/slic3r/GUI/MainFrame.cpp:602 +#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:749 msgid "Export &G-code" msgstr "Eksport &G-code" -#: src/slic3r/GUI/MainFrame.cpp:488 +#: src/slic3r/GUI/MainFrame.cpp:496 msgid "Export &toolpaths as OBJ" msgstr "Ekspor&t ścieżek narzędzi jako OBJ" -#: src/libslic3r/PrintConfig.cpp:2949 +#: src/libslic3r/PrintConfig.cpp:3338 msgid "Export 3MF" msgstr "Eksport 3MF" -#: src/slic3r/GUI/MainFrame.cpp:375 +#: src/slic3r/GUI/MainFrame.cpp:503 msgid "Export all presets to file" msgstr "Eksport wszystkich zestawów ustawień do pliku" -#: src/libslic3r/PrintConfig.cpp:2954 +#: src/libslic3r/PrintConfig.cpp:3343 msgid "Export AMF" msgstr "Eksport AMF" -#: src/slic3r/GUI/Plater.cpp:1932 +#: src/slic3r/GUI/Plater.cpp:2598 msgid "Export AMF file:" msgstr "Eksport pliku AMF:" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1219 src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1657 src/slic3r/GUI/Plater.cpp:3966 msgid "Export as STL" msgstr "Eksport jako STL" -#: src/slic3r/GUI/MainFrame.cpp:375 -msgid "Export Config &Bundle" -msgstr "Eksport Paczki Konfi&guracyjnej" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:124 +msgid "Export config" +msgstr "Eksport konfiguracji" -#: src/slic3r/GUI/MainFrame.cpp:373 +#: src/slic3r/GUI/MainFrame.cpp:503 +msgid "Export Config &Bundle" +msgstr "Eks&port Paczki Konfiguracyjnej" + +#: src/slic3r/GUI/MainFrame.cpp:500 msgid "Export current configuration to file" msgstr "Eksport obecnej konfiguracji do pliku" -#: src/slic3r/GUI/MainFrame.cpp:370 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export current plate as AMF" msgstr "Eksport zawartości stołu jako AMF" -#: src/slic3r/GUI/MainFrame.cpp:362 +#: src/slic3r/GUI/MainFrame.cpp:477 msgid "Export current plate as G-code" msgstr "Eksport zawartości stołu jako G-code" -#: src/slic3r/GUI/MainFrame.cpp:366 +#: src/slic3r/GUI/MainFrame.cpp:521 +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 msgid "Export current plate as STL" msgstr "Eksport zawartości stołu jako STL" -#: src/slic3r/GUI/MainFrame.cpp:368 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export current plate as STL including supports" msgstr "Eksport zawartości stołu jako STL wraz z podporami" -#: src/slic3r/GUI/Plater.cpp:2722 +#: src/slic3r/GUI/Plater.cpp:3664 msgid "Export failed" msgstr "Niepowodzenie eksportu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/Plater.cpp:733 -#: src/slic3r/GUI/Plater.cpp:3821 src/libslic3r/PrintConfig.cpp:2964 +#: src/slic3r/GUI/ConfigWizard.cpp:801 +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 msgid "Export G-code" msgstr "Eksport G-code" -#: src/libslic3r/PrintConfig.cpp:2931 +#: src/slic3r/GUI/MainFrame.cpp:521 +msgid "Export G-code to SD card / Flash drive" +msgstr "Eksport G-gode na kartę SD / pamięć flash" + +#: src/libslic3r/PrintConfig.cpp:3320 msgid "Export OBJ" msgstr "Eksport OBJ" -#: src/slic3r/GUI/Plater.cpp:2531 +#: src/slic3r/GUI/Plater.cpp:2610 msgid "Export OBJ file:" msgstr "Eksport pliku OBJ:" @@ -2041,55 +2527,63 @@ msgstr "Eksport pliku OBJ:" msgid "Export of a temporary 3mf file failed" msgstr "Niepowodzenie eksportu tymczasowego pliku 3MF" -#: src/slic3r/GUI/MainFrame.cpp:370 +#: src/slic3r/GUI/MainFrame.cpp:492 msgid "Export plate as &AMF" msgstr "Eksport zawartości stołu jako &AMF" -#: src/slic3r/GUI/MainFrame.cpp:366 +#: src/slic3r/GUI/MainFrame.cpp:486 msgid "Export plate as &STL" msgstr "Eksport zawartości stołu jako &STL" -#: src/slic3r/GUI/MainFrame.cpp:481 +#: src/slic3r/GUI/MainFrame.cpp:489 msgid "Export plate as STL &including supports" -msgstr "Eksportuj zawartość stołu do STL zaw&ierając podpory" +msgstr "Eksport zawartośc&i stołu z podporami do STL" -#: src/libslic3r/PrintConfig.cpp:2943 +#: src/libslic3r/PrintConfig.cpp:3332 msgid "Export SLA" msgstr "Eksport SLA" -#: src/libslic3r/PrintConfig.cpp:2959 +#: src/slic3r/GUI/Preferences.cpp:72 +msgid "Export sources full pathnames to 3mf and amf" +msgstr "Eksport pełnych ścieżek do 3MF i AMF" + +#: src/libslic3r/PrintConfig.cpp:3348 msgid "Export STL" msgstr "Eksport STL" -#: src/slic3r/GUI/Plater.cpp:1925 +#: src/slic3r/GUI/Plater.cpp:2591 msgid "Export STL file:" msgstr "Eksport pliku STL:" -#: src/libslic3r/PrintConfig.cpp:2950 +#: src/libslic3r/PrintConfig.cpp:3339 msgid "Export the model(s) as 3MF." msgstr "Eksport model(i) jako 3MF." -#: src/libslic3r/PrintConfig.cpp:2955 +#: src/libslic3r/PrintConfig.cpp:3344 msgid "Export the model(s) as AMF." msgstr "Eksport model(i) jako AMF." -#: src/libslic3r/PrintConfig.cpp:2932 +#: src/libslic3r/PrintConfig.cpp:3321 msgid "Export the model(s) as OBJ." msgstr "Eksport model(i) jako OBJ." -#: src/libslic3r/PrintConfig.cpp:2960 +#: src/libslic3r/PrintConfig.cpp:3349 msgid "Export the model(s) as STL." msgstr "Eksport modeli jako STL." -#: src/slic3r/GUI/Plater.cpp:2927 +#: src/slic3r/GUI/Plater.cpp:3966 msgid "Export the selected object as STL file" msgstr "Eksport wybranego modelu jako plik STL" -#: src/slic3r/GUI/MainFrame.cpp:488 +#: src/slic3r/GUI/Plater.cpp:880 +msgid "Export to SD card / Flash drive" +msgstr "Eksport na kartę SD / pamięć flash" + +#: src/slic3r/GUI/MainFrame.cpp:496 msgid "Export toolpaths as OBJ" msgstr "Eksport ścieżek narzędzi jako OBJ" -#: src/libslic3r/Print.cpp:1517 +#: src/libslic3r/Print.cpp:1638 msgid "Exporting G-code" msgstr "Eksportowanie G-code" @@ -2102,139 +2596,143 @@ msgstr "Eksportowanie modelu..." msgid "Exporting source model" msgstr "Eksport modelu źródłowego" -#: src/libslic3r/SLAPrint.cpp:700 +#: src/libslic3r/SLAPrint.cpp:646 msgid "Exposition time is out of printer profile bounds." msgstr "Czas naświetlania jest poza zakresem profilu drukarki." -#: src/slic3r/GUI/Tab.cpp:3306 +#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:3515 msgid "Exposure" msgstr "Naświetlanie" -#: src/libslic3r/PrintConfig.cpp:2310 src/libslic3r/PrintConfig.cpp:2311 +#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542 msgid "Exposure time" msgstr "Czas naświetlania" -#: src/slic3r/GUI/GUI_Preview.cpp:228 src/libslic3r/GCode/PreviewData.cpp:164 +#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311 msgid "External perimeter" msgstr "Obrys zewnętrzny" -#: src/slic3r/GUI/PresetHints.cpp:153 +#: src/slic3r/GUI/PresetHints.cpp:156 msgid "external perimeters" msgstr "obrysów zewnętrznych" -#: src/libslic3r/PrintConfig.cpp:415 src/libslic3r/PrintConfig.cpp:425 +#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457 msgid "External perimeters" msgstr "Obrysy zewnętrzne" -#: src/libslic3r/PrintConfig.cpp:437 +#: src/libslic3r/PrintConfig.cpp:469 msgid "External perimeters first" msgstr "Najpierw obrysy zewnętrzne" -#: src/libslic3r/PrintConfig.cpp:1518 src/libslic3r/PrintConfig.cpp:1526 +#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596 msgid "Extra length on restart" msgstr "Dodatkowa ilość dla powrotu" -#: src/libslic3r/PrintConfig.cpp:1321 +#: src/libslic3r/PrintConfig.cpp:1390 msgid "Extra loading distance" msgstr "Dodatkowa długość ładowania" -#: src/libslic3r/PrintConfig.cpp:445 +#: src/libslic3r/PrintConfig.cpp:477 msgid "Extra perimeters if needed" msgstr "Dodatkowe obrysy jeśli potrzebne" -#: src/slic3r/GUI/GUI_ObjectList.cpp:335 src/slic3r/GUI/Tab.cpp:1479 -#: src/libslic3r/PrintConfig.cpp:455 +#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1434 +#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487 msgid "Extruder" msgstr "Ekstruder" -#: src/slic3r/GUI/Tab.cpp:2253 src/libslic3r/GCode/PreviewData.cpp:475 -#, possible-c-format +#: 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 msgid "Extruder %d" msgstr "Ekstruder %d" -#: src/slic3r/GUI/ConfigWizard.cpp:592 +#: src/slic3r/GUI/DoubleSlider.cpp:1011 +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:226 +#: src/slic3r/GUI/WipeTowerDialog.cpp:255 msgid "Extruder changed to" msgstr "Ekstruder zmieniony na" -#: src/slic3r/GUI/Tab.cpp:1171 +#: src/slic3r/GUI/Tab.cpp:1233 msgid "Extruder clearance (mm)" msgstr "Odstęp od ekstrudera (mm)" -#: src/libslic3r/PrintConfig.cpp:490 +#: src/libslic3r/PrintConfig.cpp:522 msgid "Extruder Color" msgstr "Kolor ekstrudera" -#: src/libslic3r/PrintConfig.cpp:497 +#: src/libslic3r/PrintConfig.cpp:529 msgid "Extruder offset" msgstr "Margines ekstrudera" -#: src/libslic3r/PrintConfig.cpp:863 +#: 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:1978 +#: 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:33 src/slic3r/GUI/GUI_ObjectList.cpp:72 -#: src/slic3r/GUI/GUI_ObjectList.cpp:513 src/slic3r/GUI/Tab.cpp:1119 -#: src/slic3r/GUI/Tab.cpp:1844 src/libslic3r/PrintConfig.cpp:456 -#: src/libslic3r/PrintConfig.cpp:954 src/libslic3r/PrintConfig.cpp:1340 -#: src/libslic3r/PrintConfig.cpp:1668 src/libslic3r/PrintConfig.cpp:1852 -#: src/libslic3r/PrintConfig.cpp:1878 src/libslic3r/PrintConfig.cpp:2151 -#: src/libslic3r/PrintConfig.cpp:2159 +#: 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 msgid "Extruders" msgstr "Ekstrudery" -#: src/libslic3r/PrintConfig.cpp:507 +#: src/libslic3r/PrintConfig.cpp:539 msgid "Extrusion axis" msgstr "Oś ekstruzji" -#: src/libslic3r/PrintConfig.cpp:513 +#: src/libslic3r/PrintConfig.cpp:545 msgid "Extrusion multiplier" msgstr "Współczynnik ekstruzji" -#: src/slic3r/GUI/ConfigWizard.cpp:612 +#: src/slic3r/GUI/ConfigWizard.cpp:1037 msgid "Extrusion Temperature:" msgstr "Temperatura ekstrudera:" -#: src/slic3r/GUI/Tab.cpp:1143 +#: src/slic3r/GUI/Tab.cpp:1205 msgid "Extrusion width" msgstr "Szerokość ekstruzji" -#: src/slic3r/GUI/GUI_ObjectList.cpp:73 src/slic3r/GUI/GUI_ObjectList.cpp:514 -#: src/libslic3r/PrintConfig.cpp:416 src/libslic3r/PrintConfig.cpp:523 -#: src/libslic3r/PrintConfig.cpp:830 src/libslic3r/PrintConfig.cpp:962 -#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1688 -#: src/libslic3r/PrintConfig.cpp:1861 src/libslic3r/PrintConfig.cpp:2018 +#: 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 msgid "Extrusion Width" msgstr "Szerokość Ekstruzji" -#: src/slic3r/GUI/Plater.cpp:139 +#: src/slic3r/GUI/Plater.cpp:162 msgid "Facets" msgstr "Powierzchnie" -#: src/slic3r/GUI/GUI_ObjectList.cpp:240 +#: src/slic3r/GUI/GUI_ObjectList.cpp:349 msgid "facets added" msgstr "dodano powierzchnie" -#: src/slic3r/GUI/GUI_ObjectList.cpp:239 +#: src/slic3r/GUI/GUI_ObjectList.cpp:348 msgid "facets removed" msgstr "usunięto powierzchnie" -#: src/slic3r/GUI/GUI_ObjectList.cpp:241 +#: src/slic3r/GUI/GUI_ObjectList.cpp:350 msgid "facets reversed" msgstr "odwrócono powierzchnie" -#: src/libslic3r/PrintConfig.cpp:2302 +#: src/libslic3r/PrintConfig.cpp:2517 msgid "Faded layers" msgstr "Warstwy przejściowe" -#: src/libslic3r/Zipper.cpp:47 +#: src/libslic3r/Zipper.cpp:44 msgid "failed finding central directory" msgstr "nie odnaleziono katalogu centralnego" @@ -2242,165 +2740,181 @@ msgstr "nie odnaleziono katalogu centralnego" msgid "Failed loading the input model." msgstr "Niepowodzenie ładowania modelu wejściowego." -#: src/libslic3r/PrintBase.cpp:65 +#: src/libslic3r/PrintBase.cpp:71 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:41 +#: src/slic3r/GUI/PresetHints.cpp:42 msgid "Fan" msgstr "Wentylator" -#: src/slic3r/GUI/Tab.cpp:1501 +#: src/slic3r/GUI/Tab.cpp:1456 msgid "Fan settings" msgstr "Ustawienia wentylatora" -#: src/slic3r/GUI/Tab.cpp:1502 +#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1457 msgid "Fan speed" msgstr "Prędkość wentylatora" -#: src/libslic3r/PrintConfig.cpp:2240 +#: src/libslic3r/GCode/PreviewData.cpp:353 +msgid "Fan Speed (%)" +msgstr "Prędkość wentylatora (%)" + +#: src/libslic3r/PrintConfig.cpp:2405 msgid "Fast" msgstr "Szybkie" -#: src/libslic3r/PrintConfig.cpp:2241 +#: src/libslic3r/PrintConfig.cpp:2406 msgid "Fast tilt" msgstr "Szybkie przechylanie" -#: src/slic3r/GUI/GUI_App.cpp:135 +#: src/slic3r/GUI/GUI_App.cpp:141 msgid "Fatal error" msgstr "Błąd krytyczny" -#: src/slic3r/GUI/GUI_Preview.cpp:212 src/slic3r/GUI/GUI_Preview.cpp:537 -#: src/libslic3r/GCode/PreviewData.cpp:394 +#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/GUI_Preview.cpp:575 +#: src/libslic3r/GCode/PreviewData.cpp:345 msgid "Feature type" msgstr "Rodzaj funkcji" -#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/GUI_Preview.cpp:225 +#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235 msgid "Feature types" msgstr "Rodzaje funkcji" -#: src/slic3r/GUI/Plater.cpp:682 src/slic3r/GUI/Tab.cpp:1470 -#: src/slic3r/GUI/Tab.cpp:1471 +#: src/slic3r/GUI/ConfigWizard.cpp:1525 +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 msgid "Filament" msgstr "Filament" -#: src/slic3r/GUI/Preset.cpp:1275 +#: src/slic3r/GUI/Preset.cpp:1522 msgid "filament" msgstr "filament" -#: src/slic3r/GUI/ConfigWizard.cpp:541 +#: src/slic3r/GUI/ConfigWizard.cpp:952 msgid "Filament and Nozzle Diameters" msgstr "Średnice filamentu i dyszy" -#: src/slic3r/GUI/ConfigWizard.cpp:574 +#: src/slic3r/GUI/ConfigWizard.cpp:983 msgid "Filament Diameter:" msgstr "Średnica Filamentu:" -#: src/libslic3r/PrintConfig.cpp:620 +#: src/libslic3r/PrintConfig.cpp:651 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:654 +#: src/libslic3r/PrintConfig.cpp:686 msgid "Filament load time" msgstr "Czas ładowania filamentu" -#: src/libslic3r/PrintConfig.cpp:556 +#: src/libslic3r/PrintConfig.cpp:588 msgid "Filament notes" msgstr "Notatki do filamentu" -#: src/slic3r/GUI/Tab.cpp:1502 src/slic3r/GUI/Tab.cpp:1557 +#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1378 msgid "Filament Overrides" msgstr "Nadpisywane Ustawienia" -#: src/libslic3r/PrintConfig.cpp:1312 +#: src/libslic3r/PrintConfig.cpp:1381 msgid "Filament parking position" msgstr "Pozycja zatrzymania filamentu" -#: src/slic3r/GUI/Tab.cpp:1516 +#: src/slic3r/GUI/ConfigWizard.cpp:2013 +msgid "Filament Profiles Selection" +msgstr "Wybór profili filamentu" + +#: src/slic3r/GUI/Tab.cpp:1471 msgid "Filament properties" msgstr "Właściwości filamentu" -#: src/slic3r/GUI/Tab.hpp:335 +#: src/slic3r/GUI/Tab.hpp:355 msgid "Filament Settings" msgstr "Ustawienia Filamentu" -#: src/libslic3r/PrintConfig.cpp:694 +#: src/libslic3r/PrintConfig.cpp:726 msgid "Filament type" msgstr "Typ filamentu" -#: src/libslic3r/PrintConfig.cpp:669 +#: src/libslic3r/PrintConfig.cpp:701 msgid "Filament unload time" msgstr "Czas rozładowania filamentu" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:47 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 msgid "filaments" msgstr "filamenty" -#: src/libslic3r/Zipper.cpp:75 +#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2013 +msgid "Filaments" +msgstr "Filamenty" + +#: src/libslic3r/Zipper.cpp:72 msgid "file close failed" msgstr "niepowodzenia zamykania pliku" -#: src/libslic3r/Zipper.cpp:69 +#: src/libslic3r/Zipper.cpp:66 msgid "file create failed" msgstr "niepowodzenie tworzenia pliku" -#: src/slic3r/GUI/MainFrame.cpp:642 +#: src/slic3r/GUI/MainFrame.cpp:791 msgid "File Not Found" msgstr "Nie znaleziono pliku" -#: src/libslic3r/Zipper.cpp:89 +#: src/libslic3r/Zipper.cpp:86 msgid "file not found" msgstr "nie znaleziono pliku" -#: src/libslic3r/Zipper.cpp:67 +#: src/libslic3r/Zipper.cpp:64 msgid "file open failed" msgstr "niepowodzenie otwierania pliku" -#: src/libslic3r/Zipper.cpp:73 +#: src/libslic3r/Zipper.cpp:70 msgid "file read failed" msgstr "niepowodzenie odczytu pliku" -#: src/libslic3r/Zipper.cpp:77 +#: src/libslic3r/Zipper.cpp:74 msgid "file seek failed" msgstr "niepowodzenie szukania pliku" -#: src/libslic3r/Zipper.cpp:79 +#: src/libslic3r/Zipper.cpp:76 msgid "file stat failed" msgstr "niepowodzenie odczytu statystyk pliku" -#: src/libslic3r/Zipper.cpp:39 +#: src/libslic3r/Zipper.cpp:36 msgid "file too large" msgstr "plik jest zbyt duży" -#: src/libslic3r/Zipper.cpp:71 +#: src/libslic3r/Zipper.cpp:68 msgid "file write failed" msgstr "niepowodzenie zapisywania do pliku" -#: src/slic3r/GUI/PrintHostDialogs.cpp:152 +#: src/slic3r/GUI/PrintHostDialogs.cpp:153 msgid "Filename" msgstr "Nazwa pliku" -#: src/libslic3r/PrintConfig.cpp:728 +#: src/libslic3r/PrintConfig.cpp:775 msgid "Fill angle" msgstr "Kąt wypełnienia" -#: src/libslic3r/PrintConfig.cpp:742 +#: src/libslic3r/PrintConfig.cpp:789 msgid "Fill density" msgstr "Gęstość wypełnienia" -#: src/libslic3r/PrintConfig.cpp:779 +#: src/libslic3r/PrintConfig.cpp:826 msgid "Fill pattern" msgstr "Wzór wypełnienia" -#: src/libslic3r/PrintConfig.cpp:410 +#: src/libslic3r/PrintConfig.cpp:437 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:781 +#: src/libslic3r/PrintConfig.cpp:828 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:390 +#: src/libslic3r/PrintConfig.cpp:417 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." @@ -2408,527 +2922,671 @@ msgstr "Wzór wypełnienia górnej warstwy. Ma wpływ jedynie na zewnętrzne wid msgid "Finished" msgstr "Zakończono" -#: src/slic3r/GUI/ConfigWizard.cpp:486 src/slic3r/GUI/Tab.cpp:1920 +#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1947 msgid "Firmware" msgstr "Firmware" -#: src/slic3r/GUI/FirmwareDialog.cpp:740 +#: src/slic3r/GUI/FirmwareDialog.cpp:777 msgid "Firmware flasher" msgstr "Flasher firmware" -#: src/slic3r/GUI/FirmwareDialog.cpp:765 +#: src/slic3r/GUI/FirmwareDialog.cpp:802 msgid "Firmware image:" msgstr "Obraz firmware:" -#: src/slic3r/GUI/Tab.cpp:2431 +#: src/slic3r/GUI/Tab.cpp:2577 msgid "Firmware Retraction" msgstr "Retrakcja z firmware" -#: src/slic3r/GUI/ConfigWizard.cpp:486 +#: src/slic3r/GUI/ConfigWizard.cpp:891 msgid "Firmware Type" msgstr "Typ firmware" -#: src/libslic3r/PrintConfig.cpp:812 src/libslic3r/PrintConfig.cpp:821 -#: src/libslic3r/PrintConfig.cpp:829 src/libslic3r/PrintConfig.cpp:862 +#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868 +#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910 msgid "First layer" msgstr "Pierwsza warstwa" -#: src/libslic3r/PrintConfig.cpp:841 +#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889 msgid "First layer height" msgstr "Wysokość pierwszej warstwy" -#: src/libslic3r/Print.cpp:1328 +#: src/libslic3r/Print.cpp:1422 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:852 +#: src/libslic3r/PrintConfig.cpp:900 msgid "First layer speed" msgstr "Prędkość pierwszej warstwy" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "First layer volumetric" msgstr "Na pierwszej warstwie" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1210 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1647 msgid "Fix through the Netfabb" msgstr "Napraw używając Netfabb" -#: src/slic3r/GUI/Plater.cpp:3072 +#: src/slic3r/GUI/Plater.cpp:3473 msgid "Fix Throught NetFabb" msgstr "Napraw przez NetFabb" -#: src/slic3r/GUI/GUI_App.cpp:685 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Flash printer &firmware" msgstr "Flash &firmware drukarki" -#: src/slic3r/GUI/FirmwareDialog.cpp:146 +#: src/slic3r/GUI/FirmwareDialog.cpp:150 msgid "Flash!" msgstr "Flash!" -#: src/slic3r/GUI/FirmwareDialog.cpp:275 +#: src/slic3r/GUI/FirmwareDialog.cpp:284 msgid "Flashing cancelled." msgstr "Flashowanie anulowane." -#: src/slic3r/GUI/FirmwareDialog.cpp:192 +#: src/slic3r/GUI/FirmwareDialog.cpp:199 msgid "Flashing failed" msgstr "Niepowodzenie flashowania" -#: src/slic3r/GUI/FirmwareDialog.cpp:274 +#: src/slic3r/GUI/FirmwareDialog.cpp:283 msgid "Flashing failed. Please see the avrdude log below." msgstr "Flashowanie nie powiodło się. Zobacz log z avrdude poniżej." -#: src/slic3r/GUI/FirmwareDialog.cpp:148 +#: src/slic3r/GUI/FirmwareDialog.cpp:152 msgid "Flashing in progress. Please do not disconnect the printer!" msgstr "Flashowanie w toku. Proszę nie odłączać drukarki!" -#: src/slic3r/GUI/FirmwareDialog.cpp:273 +#: src/slic3r/GUI/FirmwareDialog.cpp:282 msgid "Flashing succeeded!" msgstr "Flashowanie pomyślne!" -#: src/slic3r/GUI/Tab.cpp:1156 +#: src/slic3r/GUI/Tab.cpp:1218 msgid "Flow" msgstr "Przepływ" -#: src/slic3r/GUI/PresetHints.cpp:219 +#: src/slic3r/GUI/PresetHints.cpp:220 msgid "flow rate is maximized" msgstr "przepływ osiąga wartości szczytowe" -#: src/slic3r/GUI/UpdateDialogs.cpp:188 +#: src/slic3r/GUI/UpdateDialogs.cpp:286 msgid "For more information please visit our wiki page:" msgstr "Aby uzyskać więcej informacji odwiedź naszą wiki:" -#: src/slic3r/GUI/Plater.cpp:435 src/slic3r/GUI/Plater.cpp:528 +#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Plater.cpp:624 msgid "For support enforcers only" msgstr "Tylko dla wymuszania podpór" #. TRN Description for "WHITE BULLET" -#: src/slic3r/GUI/Tab.cpp:3345 -msgid "for the left button: \tindicates a non-system (or non-default) preset,\nfor the right button: \tindicates 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/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/libslic3r/Print.cpp:1302 +#: 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 "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 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." +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:1660 +#: src/libslic3r/PrintConfig.cpp:2864 +msgid "Force pad around object everywhere" +msgstr "Wymuś podkładkę wokół wszystkich modeli, wszędzie" + +#: src/libslic3r/PrintConfig.cpp:1729 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:1023 +#: src/libslic3r/PrintConfig.cpp:1072 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." -#: src/slic3r/GUI/WipeTowerDialog.cpp:262 +#: src/slic3r/GUI/WipeTowerDialog.cpp:300 msgid "From" msgstr "Od" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1853 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2223 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:525 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front" msgstr "Przód" -#: src/slic3r/GUI/MainFrame.cpp:525 +#: src/slic3r/GUI/MainFrame.cpp:667 msgid "Front View" msgstr "Widok przodu" -#: src/slic3r/GUI/MainFrame.cpp:677 +#: src/slic3r/GUI/Tab.cpp:1013 +msgid "full profile name" +msgstr "pełna nazwa profilu" + +#: src/slic3r/GUI/MainFrame.cpp:826 msgid "G-code" msgstr "G-code" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:87 +#: 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/BackgroundSlicingProcess.cpp:130 msgid "G-code file exported to %1%" msgstr "Plik G-code wyeksportowany do %1%" -#: src/libslic3r/PrintConfig.cpp:888 +#: src/libslic3r/PrintConfig.cpp:936 msgid "G-code flavor" msgstr "Rodzaj G-code" -#: src/libslic3r/PrintConfig.cpp:689 +#: src/libslic3r/PrintConfig.cpp:721 msgid "g/cm³" msgstr "g/cm³" -#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/PrintConfig.cpp:870 -#: src/libslic3r/GCode/PreviewData.cpp:170 +#: src/libslic3r/PrintConfig.cpp:2505 +msgid "g/ml" +msgstr "g/ml" + +#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317 +#: src/libslic3r/PrintConfig.cpp:918 msgid "Gap fill" msgstr "Wypełnienie szpar" -#: src/slic3r/GUI/Preferences.cpp:19 src/slic3r/GUI/Tab.cpp:1812 -#: src/slic3r/GUI/Tab.cpp:2013 +#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1796 +#: src/slic3r/GUI/Tab.cpp:2040 msgid "General" msgstr "Ogólne" -#: src/libslic3r/PrintConfig.cpp:1242 +#: src/libslic3r/PrintConfig.cpp:1307 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." -#: src/libslic3r/PrintConfig.cpp:1779 +#: src/libslic3r/PrintConfig.cpp:1865 msgid "Generate support material" msgstr "Generuj materiał podporowy" -#: src/libslic3r/PrintConfig.cpp:1840 +#: src/libslic3r/PrintConfig.cpp:1926 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." -#: src/libslic3r/PrintConfig.cpp:2362 +#: src/libslic3r/PrintConfig.cpp:2613 msgid "Generate supports" msgstr "Generowanie podpór" -#: src/libslic3r/PrintConfig.cpp:2364 +#: src/libslic3r/PrintConfig.cpp:2615 msgid "Generate supports for the models" msgstr "Generowanie podpór dla modeli" -#: src/libslic3r/Print.cpp:1492 +#: src/libslic3r/Print.cpp:1614 msgid "Generating brim" msgstr "Generowanie obramowania (brim)" -#: src/libslic3r/Print.cpp:1524 +#: src/libslic3r/Print.cpp:1642 msgid "Generating G-code" msgstr "Generowanie G-code" -#: src/libslic3r/SLAPrint.cpp:58 +#: src/libslic3r/SLAPrintSteps.cpp:48 msgid "Generating pad" msgstr "Generowanie podkładki" -#: src/libslic3r/PrintObject.cpp:141 +#: src/libslic3r/PrintObject.cpp:152 msgid "Generating perimeters" msgstr "Generowanie obrysów" -#: src/libslic3r/Print.cpp:1484 +#: src/libslic3r/Print.cpp:1606 msgid "Generating skirt" msgstr "Generowanie skirtu" -#: src/libslic3r/PrintObject.cpp:391 +#: src/libslic3r/PrintObject.cpp:395 msgid "Generating support material" msgstr "Generowanie materiału podporowego" -#: src/libslic3r/SLAPrint.cpp:56 src/libslic3r/SLAPrint.cpp:809 +#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356 msgid "Generating support points" msgstr "Generowanie punktów podpór" -#: src/libslic3r/SLAPrint.cpp:57 +#: src/libslic3r/SLAPrintSteps.cpp:47 msgid "Generating support tree" msgstr "Generowanie drzewa podpór" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1551 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2022 msgid "Generic" msgstr "Źródłowy" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:144 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:175 msgid "Gizmo cut" msgstr "Cięcie przy pomocy \"uchwytów\"" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 msgid "Gizmo move" msgstr "Przemieszczanie przy pomocy \"uchwytów\"" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:145 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 msgid "Gizmo Place face on bed" msgstr "Położenie na płaszczyźnie przy pomocy \"uchwytów\"" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 msgid "Gizmo rotate" msgstr "Obracanie przy pomocy \"uchwytów\"" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 msgid "Gizmo scale" msgstr "Skalowanie przy pomocy \"uchwytów\"" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:177 +msgid "Gizmo SLA hollow" +msgstr "Drążenie SLA z uchwytem" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:178 msgid "Gizmo SLA support points" msgstr "Punkty podpór SLA przy pomocy \"uchwytów\"" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:641 +#: src/slic3r/GUI/GLCanvas3D.cpp:2921 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562 msgid "Gizmo-Move" msgstr "Uchwyt-Przesuń" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:569 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:489 msgid "Gizmo-Place on Face" msgstr "Uchwyt-Połóż na Płaszczyźnie" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:651 +#: src/slic3r/GUI/GLCanvas3D.cpp:3001 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:564 msgid "Gizmo-Rotate" msgstr "Uchwyt-Obróć" -#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:646 +#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:563 msgid "Gizmo-Scale" msgstr "Uchwyt-Skaluj" -#: src/slic3r/GUI/AboutDialog.cpp:95 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:201 +msgid "Gizmos" +msgstr "Uchwyty" + +#: src/slic3r/GUI/AboutDialog.cpp:259 msgid "GNU Affero General Public License, version 3" msgstr "Ogólna Licencja Publiczna (GPL) GNU Affero, wersja 3" -#: src/slic3r/GUI/ConfigWizard.cpp:571 +#: src/slic3r/GUI/ConfigWizard.cpp:980 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ą." -#: src/libslic3r/PrintConfig.cpp:797 +#: src/libslic3r/PrintConfig.cpp:844 msgid "Grid" msgstr "Kratka" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1846 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2454 msgid "Group manipulation" msgstr "Manipulacja grupą" -#: src/libslic3r/PrintConfig.cpp:805 +#: src/slic3r/GUI/Preferences.cpp:133 +msgid "GUI" +msgstr "GUI" + +#: src/libslic3r/PrintConfig.cpp:852 msgid "Gyroid" msgstr "Gyroidalny" -#: src/slic3r/GUI/Tab.cpp:2775 +#: 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:840 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48 msgid "Head diameter" msgstr "Średnica łącznika" -#: src/libslic3r/PrintConfig.cpp:822 +#: src/slic3r/GUI/ConfigManipulation.cpp:317 +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 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." -#: src/slic3r/GUI/GUI_Preview.cpp:213 src/libslic3r/PrintConfig.cpp:468 +#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500 msgid "Height" msgstr "Wysokość" -#: src/libslic3r/GCode/PreviewData.cpp:396 +#: src/libslic3r/GCode/PreviewData.cpp:347 msgid "Height (mm)" msgstr "Wysokość (mm)" -#: src/libslic3r/PrintConfig.cpp:1618 +#: src/libslic3r/PrintConfig.cpp:1688 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:2209 +#: src/libslic3r/PrintConfig.cpp:2360 msgid "Height of the display" msgstr "Wysokość wyświetlacza" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1350 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1500 msgid "Height range Modifier" msgstr "Modyfikator zakresu wysokości" -#: src/slic3r/GUI/GLCanvas3D.cpp:3650 src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 msgid "Height ranges" msgstr "Zakres wysokości" -#: src/libslic3r/PrintConfig.cpp:226 +#: src/libslic3r/PrintConfig.cpp:261 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:300 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:433 +#, 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:2976 +#: src/libslic3r/PrintConfig.cpp:3365 msgid "Help" msgstr "Pomoc" -#: src/libslic3r/PrintConfig.cpp:2982 +#: src/libslic3r/PrintConfig.cpp:3371 msgid "Help (FFF options)" msgstr "Pomoc (opcje FFF)" -#: src/libslic3r/PrintConfig.cpp:2987 +#: src/libslic3r/PrintConfig.cpp:3376 msgid "Help (SLA options)" msgstr "Pomoc (opcje SLA)" -#: src/slic3r/GUI/WipeTowerDialog.cpp:225 +#: src/slic3r/GUI/WipeTowerDialog.cpp:254 msgid "Here you can adjust required purging volume (mm³) for any given pair of tools." msgstr "To ustawienie odpowiada za objętość czyszczonego filamentu w (mm³) dla danej pary ekstruderów." -#: src/libslic3r/PrintConfig.cpp:925 +#: src/libslic3r/PrintConfig.cpp:973 msgid "High extruder current on filament swap" msgstr "Zwiększenie prądu ekstrudera przy zmianie filamentu" -#: src/libslic3r/PrintConfig.cpp:400 src/libslic3r/PrintConfig.cpp:806 +#: src/slic3r/GUI/GLCanvas3D.cpp:277 +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 msgid "Hilbert Curve" msgstr "Krzywa Hilberta" -#: src/slic3r/GUI/Plater.cpp:873 +#: src/slic3r/GUI/Plater.cpp:1042 msgid "Hold Shift to Slice & Export G-code" msgstr "Przytrzymaj Shift aby Pociąć i Wyeksportować G-code" -#: src/libslic3r/PrintConfig.cpp:803 src/libslic3r/PrintConfig.cpp:1924 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47 +msgid "Hole depth" +msgstr "Głębokość otworu" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46 +msgid "Hole diameter" +msgstr "Średnica otworu" + +#: src/slic3r/GUI/Plater.cpp:2760 +msgid "Hollow" +msgstr "Drążenie" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:977 +msgid "Hollow and drill" +msgstr "Drążenie i wiercenie" + +#: src/libslic3r/PrintConfig.cpp:2910 +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 +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 +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 +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 +msgid "Hollowing model" +msgstr "Drążenie modelu" + +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:813 +msgid "Hollowing parameter change" +msgstr "Zmiana parametrów drążenia" + +#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011 msgid "Honeycomb" msgstr "Plaster miodu" -#: src/slic3r/GUI/Tab.cpp:1013 +#: src/slic3r/GUI/Tab.cpp:1064 msgid "Horizontal shells" msgstr "Powłoka pozioma" -#: src/libslic3r/PrintConfig.cpp:209 +#: src/libslic3r/PrintConfig.cpp:245 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:151 +#: src/slic3r/GUI/PrintHostDialogs.cpp:152 msgid "Host" msgstr "Host" -#: src/libslic3r/PrintConfig.cpp:1267 +#: src/libslic3r/PrintConfig.cpp:1332 msgid "Host Type" -msgstr "Rodzaj Serwera" +msgstr "Rodzaj serwera" #: src/slic3r/GUI/BonjourDialog.cpp:73 msgid "Hostname" msgstr "Nazwa hosta" -#: src/libslic3r/PrintConfig.cpp:81 +#: src/libslic3r/PrintConfig.cpp:97 msgid "Hostname, IP or URL" -msgstr "Nazwa Hosta, IP lub URL" +msgstr "Nazwa hosta, IP lub URL" -#: src/slic3r/GUI/Tab.cpp:136 -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/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/libslic3r/PrintConfig.cpp:2734 +#: src/libslic3r/PrintConfig.cpp:2812 +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 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:2380 +#: src/libslic3r/PrintConfig.cpp:2631 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:2642 +#: src/libslic3r/PrintConfig.cpp:2755 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:95 +#: src/libslic3r/PrintConfig.cpp:111 msgid "HTTPS CA File" msgstr "Plik certyfikatu HTTPS CA" -#: src/slic3r/GUI/Tab.cpp:1731 +#: src/slic3r/GUI/Tab.cpp:1713 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/Tab.cpp:1773 -#, possible-c-format -msgid "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." -msgstr "Plik certyfikatu HTTPS:\nW tym systemie, %s używa certyfikatu HTTPS z magazynu systemowego (Certificate Store) lub Keychain. Aby użyć własnego certyfikatu, zaimportuj plik do Certificate Store / Keychain." - -#: src/slic3r/GUI/Preferences.cpp:192 +#: src/slic3r/GUI/Preferences.cpp:222 msgid "Icon size in a respect to the default size" msgstr "Rozmiar ikon w odniesieniu do domyślnego" -#: src/slic3r/GUI/PrintHostDialogs.cpp:148 +#: src/slic3r/GUI/PrintHostDialogs.cpp:149 msgid "ID" msgstr "ID" -#: src/libslic3r/PrintConfig.cpp:1787 +#: src/libslic3r/PrintConfig.cpp:1873 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:413 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:773 +#, 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:423 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:783 +#, 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:1774 +#: src/libslic3r/PrintConfig.cpp:1852 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 powierzchni roboczej na początku wydruku." +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/Preferences.cpp:63 +#: 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/Preferences.cpp:74 +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 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:71 +#: src/slic3r/GUI/Preferences.cpp:82 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:105 +#: src/slic3r/GUI/Preferences.cpp:106 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/slic3r/GUI/Preferences.cpp:112 +#: src/libslic3r/PrintConfig.cpp:1696 +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 +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 +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 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:119 +#: src/slic3r/GUI/Preferences.cpp:145 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:28 +#: src/slic3r/GUI/PresetHints.cpp:29 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/libslic3r/PrintConfig.cpp:853 +#: src/slic3r/GUI/PresetHints.cpp:36 +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 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:540 +#: src/libslic3r/PrintConfig.cpp:573 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:1636 +#: src/libslic3r/PrintConfig.cpp:1706 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." -#: src/libslic3r/PrintConfig.cpp:534 +#: src/libslic3r/PrintConfig.cpp:567 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:46 +#: src/slic3r/GUI/Preferences.cpp:49 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." -#: src/slic3r/GUI/Preferences.cpp:54 +#: src/slic3r/GUI/Preferences.cpp:57 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." -#: src/slic3r/GUI/Preferences.cpp:38 +#: src/slic3r/GUI/Preferences.cpp:41 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:1492 +#: src/libslic3r/PrintConfig.cpp:1562 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:1501 +#: src/libslic3r/PrintConfig.cpp:1571 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:1510 +#: src/libslic3r/PrintConfig.cpp:1580 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:1384 +#: src/libslic3r/PrintConfig.cpp:1454 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:498 +#: src/libslic3r/PrintConfig.cpp:530 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:2068 +#: src/libslic3r/PrintConfig.cpp:2169 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:3096 +#: src/libslic3r/PrintConfig.cpp:3485 msgid "Ignore non-existent config files" msgstr "Ignoruj nieistniejące pliki konfiguracyjne" -#: src/slic3r/GUI/MainFrame.cpp:352 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Import &Config" msgstr "Import Konfigura&cji" -#: src/slic3r/GUI/MainFrame.cpp:357 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Import Config &Bundle" msgstr "Import Paczki Konfi&guracyjnej" -#: src/slic3r/GUI/MainFrame.cpp:354 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Import Config from &project" msgstr "Import Konfiguracji z &projektu" -#: src/slic3r/GUI/Plater.cpp:4016 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +msgid "Import Config from ini/amf/3mf/gcode" +msgstr "Importuj konfigurację z ini/amf/3mf/gcode" + +#: src/slic3r/GUI/Plater.cpp:4603 msgid "Import Object" msgstr "Import Modelu" -#: src/slic3r/GUI/Plater.cpp:4020 +#: src/slic3r/GUI/Plater.cpp:4607 msgid "Import Objects" msgstr "Importuj Modele" @@ -2936,439 +3594,496 @@ msgstr "Importuj Modele" msgid "Import of the repaired 3mf file failed" msgstr "Niepowodzenie importu naprawionego pliku 3MF" -#: src/slic3r/GUI/MainFrame.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Import STL/OBJ/AM&F/3MF" msgstr "Import STL/OBJ/AM&F/3MF" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:106 -msgid "Import STL/OBJ/AMF/3MF without config, keep bed" -msgstr "Otwórz projekt STL/OBJ/AMF/3MF bez konfiguracji, zachowaj stół" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +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:2416 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectList.cpp:3422 +#, 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/UpdateDialogs.cpp:132 +#: src/slic3r/GUI/UpdateDialogs.cpp:230 msgid "Incompatible bundles:" msgstr "Niekompatybilne zestawy ustawień:" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:70 -#, possible-c-format +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75 +#, c-format msgid "Incompatible with this %s" msgstr "Brak kompatybilności z %s" -#: src/slic3r/GUI/Plater.cpp:4091 +#: src/slic3r/GUI/Plater.cpp:4685 msgid "Increase Instances" -msgstr "Zwiększ ilość kopii" +msgstr "Zwiększ ilość instancji" + +#: src/slic3r/GUI/GLCanvas3D.cpp:264 +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:3338 -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)." +#: 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)." #. TRN Description for "LOCKED LOCK" -#: src/slic3r/GUI/Tab.cpp:3334 +#: src/slic3r/GUI/Tab.cpp:3254 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:3083 -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/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/GUI_ObjectList.cpp:29 src/slic3r/GUI/GUI_ObjectList.cpp:69 -#: src/slic3r/GUI/GUI_ObjectList.cpp:510 src/slic3r/GUI/Plater.cpp:439 -#: src/slic3r/GUI/Tab.cpp:1030 src/slic3r/GUI/Tab.cpp:1031 -#: src/slic3r/GUI/Tab.cpp:1360 src/libslic3r/PrintConfig.cpp:167 -#: src/libslic3r/PrintConfig.cpp:389 src/libslic3r/PrintConfig.cpp:729 -#: src/libslic3r/PrintConfig.cpp:743 src/libslic3r/PrintConfig.cpp:780 -#: src/libslic3r/PrintConfig.cpp:933 src/libslic3r/PrintConfig.cpp:943 -#: src/libslic3r/PrintConfig.cpp:961 src/libslic3r/PrintConfig.cpp:979 -#: src/libslic3r/PrintConfig.cpp:998 src/libslic3r/PrintConfig.cpp:1659 -#: src/libslic3r/PrintConfig.cpp:1676 +#: 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 msgid "Infill" msgstr "Wypełnienie" -#: src/slic3r/GUI/PresetHints.cpp:171 +#: src/slic3r/GUI/PresetHints.cpp:174 msgid "infill" msgstr "wypełnienia" -#: src/libslic3r/PrintConfig.cpp:972 +#: src/libslic3r/PrintConfig.cpp:1021 msgid "Infill before perimeters" msgstr "Wypełnienie przed obrysami" -#: src/libslic3r/PrintConfig.cpp:953 +#: src/libslic3r/PrintConfig.cpp:1001 msgid "Infill extruder" msgstr "Ekstruder dla wypełnienia" -#: src/libslic3r/PrintConfig.cpp:987 +#: src/libslic3r/PrintConfig.cpp:1036 msgid "Infill/perimeters overlap" msgstr "Nakładanie wypełnienia na obrysy" -#: src/libslic3r/Print.cpp:1476 +#: src/libslic3r/Print.cpp:1584 msgid "Infilling layers" msgstr "Warstwy wypełniające" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2424 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:118 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3430 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 src/slic3r/GUI/Plater.cpp:141 msgid "Info" msgstr "Info" -#: src/libslic3r/PrintConfig.cpp:1008 +#: src/libslic3r/PrintConfig.cpp:1057 msgid "Inherits profile" msgstr "Dziedziczy profil" -#: src/libslic3r/SLAPrint.cpp:707 +#: src/libslic3r/SLAPrint.cpp:653 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:2317 src/libslic3r/PrintConfig.cpp:2318 +#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565 msgid "Initial exposure time" msgstr "Początkowy czas naświetlania" -#: src/libslic3r/PrintConfig.cpp:2295 src/libslic3r/PrintConfig.cpp:2296 +#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483 msgid "Initial layer height" msgstr "Wysokość pierwszej warstwy" -#: src/slic3r/GUI/Field.cpp:155 +#: src/slic3r/GUI/Field.cpp:204 msgid "Input value is out of range" msgstr "Wartość poza zakresem" -#: src/slic3r/GUI/GUI_App.cpp:661 +#: src/slic3r/GUI/GUI_App.cpp:800 msgid "Inspect / activate configuration snapshots" msgstr "Sprawdzenie / aktywacja zrzutów konfiguracji" -#: src/slic3r/GUI/wxExtensions.cpp:407 src/slic3r/GUI/wxExtensions.cpp:474 -#, possible-c-format +#: src/slic3r/GUI/ObjectDataViewModel.cpp:60 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:216 +#, c-format msgid "Instance %d" msgstr "Kopia %d" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1887 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2500 msgid "Instance manipulation" msgstr "Manipulacja kopią modelu" -#: src/slic3r/GUI/wxExtensions.cpp:358 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:56 msgid "Instances" msgstr "Instancje (kopie)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:934 src/slic3r/GUI/GUI_ObjectList.cpp:3346 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1091 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3781 msgid "Instances to Separated Objects" msgstr "Kopie jako Osobne Modele" -#: src/libslic3r/PrintConfig.cpp:1886 +#: src/libslic3r/PrintConfig.cpp:1973 msgid "Interface layers" msgstr "Warstwy łączące" -#: src/libslic3r/PrintConfig.cpp:1870 +#: src/libslic3r/PrintConfig.cpp:1957 msgid "Interface loops" -msgstr "Warstwy łączące" +msgstr "Warstwy łączące (pętle)" -#: src/libslic3r/PrintConfig.cpp:1895 +#: src/libslic3r/PrintConfig.cpp:1982 msgid "Interface pattern spacing" -msgstr "Rozmieszczenie wzoru warstw łączących" +msgstr "Rozstaw wzoru warstw łączących" -#: src/libslic3r/PrintConfig.cpp:1022 +#: src/libslic3r/PrintConfig.cpp:1071 msgid "Interface shells" msgstr "Powłoki łączące" -#: src/libslic3r/Zipper.cpp:87 +#: src/libslic3r/Zipper.cpp:84 msgid "internal error" msgstr "błąd wewnętrzny" -#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/GCode/PreviewData.cpp:166 +#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313 msgid "Internal infill" msgstr "Wypełnienie wewnętrzne" -#: src/slic3r/GUI/Plater.cpp:2397 +#: src/slic3r/GUI/Plater.cpp:3106 msgid "Invalid data" msgstr "Nieprawidłowe dane" -#: src/slic3r/GUI/BedShapeDialog.cpp:471 src/slic3r/GUI/BedShapeDialog.cpp:520 -#: src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543 +#: src/slic3r/GUI/BedShapeDialog.cpp:566 msgid "Invalid file format." msgstr "Nieprawidłowy format pliku." -#: src/libslic3r/Zipper.cpp:83 +#: src/libslic3r/Zipper.cpp:80 msgid "invalid filename" msgstr "nieprawidłowa nazwa" -#: src/libslic3r/Zipper.cpp:51 +#: src/slic3r/GUI/ConfigManipulation.cpp:319 +msgid "Invalid Head penetration" +msgstr "Nieprawidłowe przenikanie łączników podpór" + +#: src/libslic3r/Zipper.cpp:48 msgid "invalid header or archive is corrupted" msgstr "niewłaściwy nagłówek lub uszkodzone archiwum" -#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/Field.cpp:173 +#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376 msgid "Invalid numeric input." msgstr "Nieprawidłowa wartość numeryczna." -#: src/libslic3r/Zipper.cpp:81 +#: src/libslic3r/Zipper.cpp:78 msgid "invalid parameter" msgstr "nieprawidłowy parametr" +#: src/slic3r/GUI/ConfigManipulation.cpp:332 +msgid "Invalid pinhead diameter" +msgstr "Błędna średnica łącznika" + #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:94 +#: src/slic3r/GUI/AboutDialog.cpp:258 msgid "is licensed under the" msgstr "ma licencję na warunkach" -#: src/slic3r/GUI/Tab.cpp:2779 +#: 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:2778 +#: src/slic3r/GUI/Tab.cpp:2940 msgid "is not compatible with printer" msgstr "nie jest kompatybilne z drukarką" -#: src/slic3r/GUI/MainFrame.cpp:519 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso" msgstr "Izometryczny" -#: src/slic3r/GUI/MainFrame.cpp:519 +#: src/slic3r/GUI/MainFrame.cpp:658 msgid "Iso View" msgstr "Widok izometryczny" -#: src/slic3r/GUI/Tab.cpp:925 +#: src/slic3r/GUI/Tab.cpp:964 msgid "It can't be deleted or modified." msgstr "Nie można usunąć ani zmodyfikować." -#: src/libslic3r/PrintConfig.cpp:926 +#: src/slic3r/GUI/Plater.cpp:3321 +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 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.cpp:142 src/slic3r/GUI/Tab.cpp:2796 +#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2958 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:2177 +#: src/slic3r/GUI/Tab.cpp:2229 msgid "Jerk limits" msgstr "Limity jerku" -#: src/libslic3r/PrintConfig.cpp:1579 +#: src/libslic3r/PrintConfig.cpp:1649 msgid "Jitter" msgstr "Jitter" -#: src/libslic3r/PrintConfig.cpp:533 +#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529 +#: src/slic3r/GUI/DoubleSlider.cpp:1651 +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/libslic3r/PrintConfig.cpp:566 msgid "Keep fan always on" msgstr "Wentylator zawsze włączony" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:194 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169 msgid "Keep lower part" msgstr "Zachowaj dolną część" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:193 +#: src/slic3r/GUI/GLCanvas3D.cpp:304 +msgid "Keep min" +msgstr "Zachowaj min" + +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168 msgid "Keep upper part" msgstr "Zachowaj górną część" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:13 src/slic3r/GUI/MainFrame.cpp:566 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:708 msgid "Keyboard Shortcuts" -msgstr "Skróty Klawiszowe" +msgstr "Skróty klawiszowe" -#: src/libslic3r/PrintConfig.cpp:917 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:245 +msgid "Keyboard shortcuts" +msgstr "Skróty klawiszowe" + +#: src/libslic3r/PrintConfig.cpp:2498 +msgid "kg" +msgstr "kg" + +#: src/libslic3r/PrintConfig.cpp:965 msgid "Label objects" msgstr "Oznacz modele" -#: src/libslic3r/PrintConfig.cpp:2234 +#: src/libslic3r/PrintConfig.cpp:2399 msgid "Landscape" msgstr "Tryb krajobrazu" -#: src/slic3r/GUI/GUI_App.cpp:524 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Language" msgstr "Język" -#: src/slic3r/GUI/GUI_App.cpp:755 +#: src/slic3r/GUI/GUI_App.cpp:885 msgid "Language selection" msgstr "Wybór języka" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1770 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2140 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2242 msgid "Last instance of an object cannot be deleted." msgstr "Ostatnia kopia modelu nie może zostać usunięta." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2994 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 msgid "Layer" msgstr "Warstwa" -#: src/slic3r/GUI/Tab.cpp:998 src/libslic3r/PrintConfig.cpp:55 +#: src/slic3r/GUI/ConfigManipulation.cpp:49 +#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1049 +#: src/libslic3r/PrintConfig.cpp:71 msgid "Layer height" msgstr "Wysokość warstwy" -#: src/libslic3r/Print.cpp:1332 +#: src/libslic3r/Print.cpp:1427 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:2260 +#: src/slic3r/GUI/Tab.cpp:2362 msgid "Layer height limits" msgstr "Limit wysokości warstw" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2109 +#: src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "Layer height:" +msgstr "Wysokość warstwy:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:2488 msgid "Layer range Settings to modify" msgstr "Zakres warstw dla modyfikacji ustawień" -#: src/libslic3r/PrintConfig.cpp:326 src/libslic3r/PrintConfig.cpp:946 -#: src/libslic3r/PrintConfig.cpp:1435 src/libslic3r/PrintConfig.cpp:1620 -#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1844 -#: src/libslic3r/PrintConfig.cpp:1889 +#: 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 msgid "layers" msgstr "warstwy" -#: src/slic3r/GUI/Tab.cpp:3302 src/slic3r/GUI/Tab.cpp:3393 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3512 +#: src/slic3r/GUI/Tab.cpp:3600 msgid "Layers" msgstr "Warstwy" -#: src/slic3r/GUI/Tab.cpp:997 src/slic3r/GUI/Tab.cpp:3391 +#: src/slic3r/GUI/Tab.cpp:1048 src/slic3r/GUI/Tab.cpp:3598 msgid "Layers and perimeters" msgstr "Warstwy i obrysy" -#: src/slic3r/GUI/GUI_ObjectList.cpp:28 src/slic3r/GUI/GUI_ObjectList.cpp:68 -#: src/slic3r/GUI/GUI_ObjectList.cpp:509 src/libslic3r/PrintConfig.cpp:56 -#: src/libslic3r/PrintConfig.cpp:150 src/libslic3r/PrintConfig.cpp:381 -#: src/libslic3r/PrintConfig.cpp:438 src/libslic3r/PrintConfig.cpp:446 -#: src/libslic3r/PrintConfig.cpp:842 src/libslic3r/PrintConfig.cpp:1026 -#: src/libslic3r/PrintConfig.cpp:1305 src/libslic3r/PrintConfig.cpp:1371 -#: src/libslic3r/PrintConfig.cpp:1552 src/libslic3r/PrintConfig.cpp:1987 -#: src/libslic3r/PrintConfig.cpp:2044 +#: 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 msgid "Layers and Perimeters" msgstr "Warstwy i Obrysy" -#: src/slic3r/GUI/GLCanvas3D.cpp:526 -msgid "Layers heights" -msgstr "Wysokości warstw" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:222 +msgid "Layers Slider" +msgstr "Suwak warstw" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:189 -msgid "Layers Slider Shortcuts" -msgstr "Skróty Suwaka Warstw" - -#. TRN To be shown in Print Settings "Bottom solid layers" -#: rc/libslic3r/PrintConfig.cpp:149 +#: src/slic3r/GUI/OptionsGroup.cpp:258 msgctxt "Layers" msgid "Bottom" msgstr "Spód" -#. TRN To be shown in Print Settings "Top solid layers" -#: src/libslic3r/PrintConfig.cpp:2043 +#: src/slic3r/GUI/OptionsGroup.cpp:258 msgctxt "Layers" msgid "Top" msgstr "Góra" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left" msgstr "Lewo" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1234 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1235 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 msgid "Left click" msgstr "Lewy przycisk" -#: src/slic3r/GUI/MainFrame.cpp:527 +#: src/slic3r/GUI/GLCanvas3D.cpp:237 +msgid "Left mouse button:" +msgstr "Lewy przycisk myszki:" + +#: src/slic3r/GUI/MainFrame.cpp:671 msgid "Left View" msgstr "Widok lewy" -#: src/slic3r/GUI/GUI_Preview.cpp:255 +#: src/slic3r/GUI/GUI_Preview.cpp:257 msgid "Legend" msgstr "Legenda" -#: src/libslic3r/PrintConfig.cpp:1473 src/libslic3r/PrintConfig.cpp:1481 +#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551 msgid "Length" msgstr "Długość" -#: src/libslic3r/PrintConfig.cpp:293 +#: src/libslic3r/PrintConfig.cpp:328 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." #. TRN "Slic3r _is licensed under the_ License" -#: src/slic3r/GUI/AboutDialog.cpp:124 +#: src/slic3r/GUI/AboutDialog.cpp:129 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:1491 +#: src/libslic3r/PrintConfig.cpp:1561 msgid "Lift Z" msgstr "Z-hop" -#: src/libslic3r/PrintConfig.cpp:801 +#: src/libslic3r/PrintConfig.cpp:848 msgid "Line" msgstr "Linia" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1050 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1427 msgid "Load" msgstr "Załaduj" -#: src/slic3r/GUI/MainFrame.cpp:349 +#: src/slic3r/GUI/MainFrame.cpp:460 msgid "Load a model" msgstr "Wczytaj model" -#: src/libslic3r/PrintConfig.cpp:3116 +#: src/libslic3r/PrintConfig.cpp:3505 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:3100 +#: src/libslic3r/PrintConfig.cpp:3489 msgid "Load config file" msgstr "Wczytaj plik konfiguracyjny" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 -msgid "Load Config from .ini/amf/3mf/gcode" -msgstr "Wczytaj Konfigurację z .ini/amf/3mf/gcode" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +msgid "Load Config from ini/amf/3mf/gcode and merge" +msgstr "Wczytaj Konfigurację z ini/amf/3mf/gcode i złącz" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 -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:354 +#: src/slic3r/GUI/MainFrame.cpp:467 msgid "Load configuration from project file" msgstr "Wczytaj konfigurację z pliku projektu" -#: src/libslic3r/PrintConfig.cpp:3101 +#: src/libslic3r/PrintConfig.cpp:3490 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:352 +#: src/slic3r/GUI/MainFrame.cpp:464 msgid "Load exported configuration file" msgstr "Wczytaj wyeksportowany plik konfiguracyjny" -#: src/slic3r/GUI/Plater.cpp:1271 +#: src/slic3r/GUI/Plater.cpp:1395 msgid "Load File" msgstr "Wczytaj Plik" -#: src/slic3r/GUI/Plater.cpp:1275 +#: src/slic3r/GUI/Plater.cpp:1399 msgid "Load Files" msgstr "Wczytaj Pliki" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1585 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1879 msgid "Load Part" msgstr "Wczytaj Element" -#: src/slic3r/GUI/MainFrame.cpp:357 +#: src/slic3r/GUI/MainFrame.cpp:471 msgid "Load presets from a bundle" msgstr "Wczytaj zestaw ustawień" -#: src/slic3r/GUI/Plater.cpp:3992 +#: src/slic3r/GUI/Plater.cpp:4575 msgid "Load Project" msgstr "Wczytaj Projekt" -#: src/slic3r/GUI/BedShapeDialog.cpp:97 +#: src/slic3r/GUI/BedShapeDialog.cpp:102 msgid "Load shape from STL..." msgstr "Wczytaj kształt z STL..." -#: src/slic3r/GUI/BedShapeDialog.cpp:181 src/slic3r/GUI/BedShapeDialog.cpp:249 +#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261 msgid "Load..." -msgstr "Załaduje..." +msgstr "Otwórz..." -#: src/slic3r/GUI/WipeTowerDialog.cpp:235 +#: src/slic3r/GUI/WipeTowerDialog.cpp:264 msgid "loaded" msgstr "załadowano" -#: src/slic3r/GUI/Plater.cpp:1782 +#: src/slic3r/GUI/Plater.cpp:2426 msgid "Loaded" msgstr "Wczytano" -#: src/slic3r/GUI/Plater.cpp:1590 +#: src/slic3r/GUI/Plater.cpp:2273 msgid "Loading" msgstr "Ładowanie" -#: src/slic3r/GUI/GUI_App.cpp:407 +#: src/slic3r/GUI/GUI_App.cpp:474 msgid "Loading of a mode view" msgstr "Ładowanie trybu wyświetlania" -#: src/slic3r/GUI/GUI_App.cpp:399 +#: src/slic3r/GUI/GUI_App.cpp:466 msgid "Loading of current presets" msgstr "Wczytywanie aktualnych zestawów ustawień" @@ -3377,277 +4092,281 @@ msgstr "Wczytywanie aktualnych zestawów ustawień" msgid "Loading repaired model" msgstr "Ładowanie naprawionego modelu" -#: src/libslic3r/PrintConfig.cpp:575 +#: src/libslic3r/PrintConfig.cpp:607 msgid "Loading speed" msgstr "Prędkość ładowania" -#: src/libslic3r/PrintConfig.cpp:583 +#: src/libslic3r/PrintConfig.cpp:615 msgid "Loading speed at the start" msgstr "Początkowa prędkość ładowania" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:41 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:84 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106 msgid "Local coordinates" msgstr "Lokalny układ współrzędnych" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:851 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49 msgid "Lock supports under new islands" msgstr "Zablokuj podpory pod nowymi wyspami" -#: src/slic3r/GUI/Tab.cpp:3065 +#: src/slic3r/GUI/Tab.cpp:3252 msgid "LOCKED LOCK" msgstr "ZAMKNIĘTA KŁÓDKA" -#: src/slic3r/GUI/Tab.cpp:3360 +#: src/slic3r/GUI/Tab.cpp:3280 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:3376 +#: src/slic3r/GUI/Tab.cpp:3296 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:3119 +#: src/libslic3r/PrintConfig.cpp:3508 msgid "Logging level" msgstr "Poziom logowania" -#: src/libslic3r/PrintConfig.cpp:1625 +#: src/libslic3r/PrintConfig.cpp:1695 msgid "Loops (minimum)" msgstr "Pętle (minimum)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:172 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:174 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:205 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:207 msgid "Lower Layer" msgstr "Dolna Warstwa" -#: src/slic3r/GUI/Tab.cpp:2136 src/slic3r/GUI/Tab.cpp:2209 -#: src/libslic3r/PrintConfig.cpp:1077 src/libslic3r/PrintConfig.cpp:1087 -#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1110 -#: src/libslic3r/PrintConfig.cpp:1121 src/libslic3r/PrintConfig.cpp:1132 -#: src/libslic3r/PrintConfig.cpp:1143 +#: 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 msgid "Machine limits" msgstr "Limity maszynowe" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:129 -msgid "Main Shortcuts" -msgstr "Główne Skróty" - -#: src/slic3r/GUI/Plater.cpp:143 +#: src/slic3r/GUI/Plater.cpp:166 msgid "Manifold" msgstr "Model zamknięty" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:908 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57 msgid "Manual editing" msgstr "Edycja ręczna" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:105 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180 msgid "Masked SLA file exported to %1%" msgstr "Maskowany plik SLA wyeksportowany do %1%" -#: src/slic3r/GUI/MainFrame.cpp:604 +#: src/slic3r/GUI/MainFrame.cpp:752 msgid "Mate&rial Settings Tab" msgstr "Ustawienia Mate&riału" -#: src/slic3r/GUI/Tab.cpp:3300 +#: src/slic3r/GUI/Tab.cpp:3478 src/slic3r/GUI/Tab.cpp:3480 msgid "Material" msgstr "Materiał" -#: src/slic3r/GUI/Tab.hpp:391 +#: src/slic3r/GUI/Tab.hpp:416 msgid "Material Settings" msgstr "Ustawienia Materiału" -#: src/slic3r/GUI/Plater.cpp:140 +#: src/slic3r/GUI/Plater.cpp:163 msgid "Materials" msgstr "Materiały" -#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1161 +#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226 msgid "Max" msgstr "Max" -#: src/libslic3r/PrintConfig.cpp:2470 +#: src/libslic3r/PrintConfig.cpp:2734 msgid "Max bridge length" msgstr "Maksymalna długość mostu" -#: src/libslic3r/PrintConfig.cpp:2546 +#: src/libslic3r/PrintConfig.cpp:2658 +msgid "Max bridges on a pillar" +msgstr "Maks. liczba mostków na słupku" + +#: src/libslic3r/PrintConfig.cpp:2822 msgid "Max merge distance" msgstr "Maksymalny dystans łączenia" -#: src/libslic3r/PrintConfig.cpp:2479 +#: src/libslic3r/PrintConfig.cpp:2743 msgid "Max pillar linking distance" msgstr "Maksymalny dystans łączenia słupków" -#: src/libslic3r/PrintConfig.cpp:64 +#: src/libslic3r/PrintConfig.cpp:80 msgid "Max print height" msgstr "Maksymalna wysokość wydruku" -#: src/libslic3r/PrintConfig.cpp:1172 +#: src/libslic3r/PrintConfig.cpp:1237 msgid "Max print speed" msgstr "Maksymalna prędkość druku" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 -msgid "max slic3r version" -msgstr "maksymalna wersja Slic3r" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 +msgid "max PrusaSlicer version" +msgstr "max wersja PrusaSlicer" -#: src/libslic3r/PrintConfig.cpp:1203 +#: src/libslic3r/PrintConfig.cpp:1268 msgid "Max volumetric slope negative" msgstr "Maksymalny negatywny kąt zwisu" -#: src/libslic3r/PrintConfig.cpp:1192 +#: src/libslic3r/PrintConfig.cpp:1257 msgid "Max volumetric slope positive" msgstr "Maksymalny objętościowo kąt pozytywny" -#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:1182 +#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247 msgid "Max volumetric speed" msgstr "Maksymalny przepływ" -#: src/libslic3r/PrintConfig.cpp:2167 +#: src/libslic3r/PrintConfig.cpp:2268 msgid "Maximal bridging distance" msgstr "Maksymalna odległość drukowania mostów" -#: src/libslic3r/PrintConfig.cpp:2193 +#: src/libslic3r/PrintConfig.cpp:2269 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:1099 +#: src/libslic3r/PrintConfig.cpp:1145 msgid "Maximum acceleration E" msgstr "Maksymalne przyspieszenie E" -#: src/libslic3r/PrintConfig.cpp:1105 +#: src/libslic3r/PrintConfig.cpp:1151 msgid "Maximum acceleration of the E axis" msgstr "Maksymalne przyspieszenie osi E (ekstrudera)" -#: src/libslic3r/PrintConfig.cpp:1102 +#: src/libslic3r/PrintConfig.cpp:1148 msgid "Maximum acceleration of the X axis" msgstr "Maksymalne przyspieszenie osi X" -#: src/libslic3r/PrintConfig.cpp:1103 +#: src/libslic3r/PrintConfig.cpp:1149 msgid "Maximum acceleration of the Y axis" msgstr "Maksymalne przyspieszenie osi Y" -#: src/libslic3r/PrintConfig.cpp:1104 +#: src/libslic3r/PrintConfig.cpp:1150 msgid "Maximum acceleration of the Z axis" msgstr "Maksymalne przyspieszenie osi Z" -#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133 +#: src/libslic3r/PrintConfig.cpp:1198 msgid "Maximum acceleration when extruding" msgstr "Maksymalne przyspieszenie podczas ekstruzji" -#: src/libslic3r/PrintConfig.cpp:1158 +#: src/libslic3r/PrintConfig.cpp:1200 msgid "Maximum acceleration when extruding (M204 S)" msgstr "Maksymalne przyspieszenie podczas ekstrudowania (M204 S)" -#: src/libslic3r/PrintConfig.cpp:1142 src/libslic3r/PrintConfig.cpp:1144 +#: src/libslic3r/PrintConfig.cpp:1208 msgid "Maximum acceleration when retracting" msgstr "Maksymalne przyspieszenie podczas retrakcji" -#: src/libslic3r/PrintConfig.cpp:1169 +#: src/libslic3r/PrintConfig.cpp:1210 msgid "Maximum acceleration when retracting (M204 T)" msgstr "Maksymalne przyspieszenie podczas retrakcji (M204 T)" -#: src/libslic3r/PrintConfig.cpp:1096 +#: src/libslic3r/PrintConfig.cpp:1142 msgid "Maximum acceleration X" msgstr "Maksymalne przyspieszenie X" -#: src/libslic3r/PrintConfig.cpp:1097 +#: src/libslic3r/PrintConfig.cpp:1143 msgid "Maximum acceleration Y" msgstr "Maksymalne przyspieszenie Y" -#: src/libslic3r/PrintConfig.cpp:1098 +#: src/libslic3r/PrintConfig.cpp:1144 msgid "Maximum acceleration Z" msgstr "Maksymalne przyspieszenie Z" -#: src/slic3r/GUI/Tab.cpp:2170 +#: src/slic3r/GUI/Tab.cpp:2222 msgid "Maximum accelerations" msgstr "Maksymalne przyspieszenia" -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534 msgid "Maximum exposure time" msgstr "Maksymalny czas naświetlania" -#: src/libslic3r/PrintConfig.cpp:1081 +#: src/libslic3r/PrintConfig.cpp:1128 msgid "Maximum feedrate E" msgstr "Maksymalny posuw E" -#: src/libslic3r/PrintConfig.cpp:1087 +#: src/libslic3r/PrintConfig.cpp:1134 msgid "Maximum feedrate of the E axis" msgstr "Maksymalny posuw (prędkość ruchu) osi E (ekstrudera)" -#: src/libslic3r/PrintConfig.cpp:1084 +#: src/libslic3r/PrintConfig.cpp:1131 msgid "Maximum feedrate of the X axis" msgstr "Maksymalny posuw (prędkość ruchu) osi X" -#: src/libslic3r/PrintConfig.cpp:1085 +#: src/libslic3r/PrintConfig.cpp:1132 msgid "Maximum feedrate of the Y axis" msgstr "Maksymalny posuw (prędkość ruchu) osi Y" -#: src/libslic3r/PrintConfig.cpp:1086 +#: src/libslic3r/PrintConfig.cpp:1133 msgid "Maximum feedrate of the Z axis" msgstr "Maksymalny posuw (prędkość ruchu) osi Z" -#: src/libslic3r/PrintConfig.cpp:1078 +#: src/libslic3r/PrintConfig.cpp:1125 msgid "Maximum feedrate X" msgstr "Maksymalny posuw osi X" -#: src/libslic3r/PrintConfig.cpp:1079 +#: src/libslic3r/PrintConfig.cpp:1126 msgid "Maximum feedrate Y" msgstr "Maksymalny posuw Y" -#: src/libslic3r/PrintConfig.cpp:1080 +#: src/libslic3r/PrintConfig.cpp:1127 msgid "Maximum feedrate Z" msgstr "Maksymalny posuw Z" -#: src/slic3r/GUI/Tab.cpp:2165 +#: src/slic3r/GUI/Tab.cpp:2217 msgid "Maximum feedrates" msgstr "Maksymalne prędkości posuwu" -#: src/libslic3r/PrintConfig.cpp:2447 src/libslic3r/PrintConfig.cpp:2448 +#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557 msgid "Maximum initial exposure time" msgstr "Maksymalny początkowy czas naświetlania" -#: src/libslic3r/PrintConfig.cpp:1117 +#: src/libslic3r/PrintConfig.cpp:1162 msgid "Maximum jerk E" msgstr "Maksymalny jerk E" -#: src/libslic3r/PrintConfig.cpp:1123 +#: src/libslic3r/PrintConfig.cpp:1168 msgid "Maximum jerk of the E axis" msgstr "Maksymalny jerk dla osi E (ekstrudera)" -#: src/libslic3r/PrintConfig.cpp:1120 +#: src/libslic3r/PrintConfig.cpp:1165 msgid "Maximum jerk of the X axis" msgstr "Maksymalny jerk osi X" -#: src/libslic3r/PrintConfig.cpp:1121 +#: src/libslic3r/PrintConfig.cpp:1166 msgid "Maximum jerk of the Y axis" msgstr "Maksymalny jerk osi Y" -#: src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1167 msgid "Maximum jerk of the Z axis" msgstr "Maksymalny jerk dla osi Z" -#: src/libslic3r/PrintConfig.cpp:1114 +#: src/libslic3r/PrintConfig.cpp:1159 msgid "Maximum jerk X" msgstr "Maksymalny jerk X" -#: src/libslic3r/PrintConfig.cpp:1115 +#: src/libslic3r/PrintConfig.cpp:1160 msgid "Maximum jerk Y" msgstr "Maksymalny jerk Y" -#: src/libslic3r/PrintConfig.cpp:1116 +#: src/libslic3r/PrintConfig.cpp:1161 msgid "Maximum jerk Z" msgstr "Maksymalny jerk Z" -#: src/libslic3r/PrintConfig.cpp:566 +#: src/libslic3r/PrintConfig.cpp:2660 +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 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." -#: src/libslic3r/PrintConfig.cpp:3053 +#: src/libslic3r/PrintConfig.cpp:3442 msgid "Merge" msgstr "Łączenie" -#: src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2683 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/SLAPrint.cpp:71 +#: src/libslic3r/SLAPrintSteps.cpp:64 msgid "Merging slices and calculating statistics" msgstr "Łączenie cięć i obliczanie statystyk" @@ -3655,207 +4374,256 @@ msgstr "Łączenie cięć i obliczanie statystyk" msgid "Mesh repair failed." msgstr "Niepowodzenie naprawy siatki." -#: src/libslic3r/PrintConfig.cpp:3120 -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" -msgstr "Komunikaty o ważności niższej lub równej loglevel będą zapisywane: 0:śledzenie, 1:debugowanie, 2:info, 3:ostrzeżenie, 4:błąd, 5:krytyczny" +#: src/slic3r/GUI/DoubleSlider.cpp:1635 +msgid "Message for pause print on current layer (%1% mm)." +msgstr "Komenda pauzująca wydruk na danej warstwie (%1% mm)." -#: src/libslic3r/PrintConfig.cpp:1215 src/libslic3r/PrintConfig.cpp:1224 +#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289 msgid "Min" msgstr "Min" -#: src/libslic3r/PrintConfig.cpp:1233 +#: src/libslic3r/PrintConfig.cpp:1298 msgid "Min print speed" msgstr "Minimalna prędkość druku" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 -msgid "min slic3r version" -msgstr "minimalna wersja slic3r" +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +msgid "min PrusaSlicer version" +msgstr "min wersja PrusaSlicer" -#: src/libslic3r/PrintConfig.cpp:2507 +#: src/libslic3r/PrintConfig.cpp:2772 msgid "Minimal distance of the support points" msgstr "Minimalne rozmieszczenie punktów podpór" -#: src/libslic3r/PrintConfig.cpp:1241 +#: src/libslic3r/PrintConfig.cpp:1306 msgid "Minimal filament extrusion length" msgstr "Minimalna długość ekstruzji" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:879 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54 msgid "Minimal points distance" msgstr "Minimalny dystans pomiędzy punktami" -#: src/libslic3r/PrintConfig.cpp:635 +#: src/libslic3r/PrintConfig.cpp:667 msgid "Minimal purge on wipe tower" msgstr "Minimalna objętość czyszczenia" -#: src/libslic3r/PrintConfig.cpp:1442 +#: src/libslic3r/PrintConfig.cpp:187 +msgid "Minimum bottom shell thickness" +msgstr "Minimalna grubość dolnej powłoki" + +#: src/slic3r/GUI/PresetHints.cpp:339 +msgid "Minimum bottom shell thickness is %1% mm." +msgstr "Minimalna grubość dolnej powłoki to %1% mm." + +#: src/libslic3r/PrintConfig.cpp:1512 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." -#: src/libslic3r/PrintConfig.cpp:2416 src/libslic3r/PrintConfig.cpp:2417 +#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526 msgid "Minimum exposure time" msgstr "Minimalny czas naświetlania" -#: src/libslic3r/PrintConfig.cpp:1109 src/libslic3r/PrintConfig.cpp:1111 +#: src/libslic3r/PrintConfig.cpp:1178 msgid "Minimum feedrate when extruding" msgstr "Minimalna prędkość posuwu z ekstruzją" -#: src/libslic3r/PrintConfig.cpp:1136 +#: src/libslic3r/PrintConfig.cpp:1180 msgid "Minimum feedrate when extruding (M205 S)" msgstr "Minimalna prędkość posuwu z ekstruzją (M205 S)" -#: src/slic3r/GUI/Tab.cpp:2182 +#: src/slic3r/GUI/Tab.cpp:2234 msgid "Minimum feedrates" msgstr "Minimalna prędkość posuwu" -#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 +#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549 msgid "Minimum initial exposure time" msgstr "Minimalny początkowy czas naświetlania" -#: src/libslic3r/PrintConfig.cpp:1452 +#: src/slic3r/GUI/Tab.cpp:1069 +msgid "Minimum shell thickness" +msgstr "Minimalna grubość powłoki" + +#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788 +msgid "Minimum thickness of a top / bottom shell" +msgstr "Minimalna grubość górnej/dolnej powłoki" + +#: src/libslic3r/PrintConfig.cpp:2146 +msgid "Minimum top shell thickness" +msgstr "Minimalna grubość górnej powłoki" + +#: src/slic3r/GUI/PresetHints.cpp:320 +msgid "Minimum top shell thickness is %1% mm." +msgstr "Minimalna grubość górnej powłoki to %1% mm." + +#: src/libslic3r/PrintConfig.cpp:1522 msgid "Minimum travel after retraction" msgstr "Minimalny ruch jałowy po retrakcji" -#: src/libslic3r/PrintConfig.cpp:1120 src/libslic3r/PrintConfig.cpp:1122 +#: src/libslic3r/PrintConfig.cpp:1188 msgid "Minimum travel feedrate" msgstr "Minimalna prędkość posuwu ruchu jałowego" -#: src/libslic3r/PrintConfig.cpp:1147 +#: src/libslic3r/PrintConfig.cpp:1190 msgid "Minimum travel feedrate (M205 T)" msgstr "Minimalna prędkość posuwu ruchu jałowego (M205 T)" -#: src/slic3r/GUI/Plater.cpp:2946 +#: src/libslic3r/PrintConfig.cpp:2917 +msgid "Minimum wall thickness of a hollowed model." +msgstr "Minimalna grubość ścianki drążonego modelu." + +#: src/libslic3r/PrintConfig.cpp:2449 +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 msgid "Mirror" msgstr "Lustrzane" -#: src/libslic3r/PrintConfig.cpp:2320 +#: src/libslic3r/PrintConfig.cpp:2379 msgid "Mirror horizontally" msgstr "Odbij w poziomie" -#: src/slic3r/GUI/GLCanvas3D.cpp:1711 +#: src/slic3r/GUI/GLCanvas3D.cpp:2053 msgid "Mirror Object" msgstr "Odbicie Lustrzane" -#: src/slic3r/GUI/Plater.cpp:2946 +#: src/slic3r/GUI/Plater.cpp:4002 msgid "Mirror the selected object" msgstr "Odbicie lustrzane wybranego modelu" -#: src/slic3r/GUI/Plater.cpp:2939 +#: src/slic3r/GUI/Plater.cpp:3995 msgid "Mirror the selected object along the X axis" msgstr "Odbicie lustrzane wybranego modelu w osi X" -#: src/slic3r/GUI/Plater.cpp:2941 +#: src/slic3r/GUI/Plater.cpp:3997 msgid "Mirror the selected object along the Y axis" msgstr "Odbicie lustrzane wybranego modelu w osi Y" -#: src/slic3r/GUI/Plater.cpp:2943 +#: src/slic3r/GUI/Plater.cpp:3999 msgid "Mirror the selected object along the Z axis" msgstr "Odbicie lustrzane wybranego modelu w osi Z" -#: src/libslic3r/PrintConfig.cpp:2327 +#: src/libslic3r/PrintConfig.cpp:2386 msgid "Mirror vertically" msgstr "Odbij w poziomie" -#: src/slic3r/Utils/OctoPrint.cpp:69 -#, possible-c-format +#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68 +#, c-format msgid "Mismatched type of print host: %s" msgstr "Niepasujący typ serwera wydruku: %s" -#: src/libslic3r/GCode/PreviewData.cpp:176 +#: src/libslic3r/ExtrusionEntity.cpp:323 msgid "Mixed" msgstr "Mieszane" -#: src/slic3r/GUI/BedShapeDialog.cpp:87 src/slic3r/GUI/ConfigWizard.cpp:118 -#: src/slic3r/GUI/ConfigWizard.cpp:561 src/slic3r/GUI/ConfigWizard.cpp:575 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 -#: src/slic3r/GUI/RammingChart.cpp:81 src/slic3r/GUI/WipeTowerDialog.cpp:84 -#: src/libslic3r/PrintConfig.cpp:59 src/libslic3r/PrintConfig.cpp:66 -#: src/libslic3r/PrintConfig.cpp:75 src/libslic3r/PrintConfig.cpp:210 -#: src/libslic3r/PrintConfig.cpp:285 src/libslic3r/PrintConfig.cpp:293 -#: src/libslic3r/PrintConfig.cpp:343 src/libslic3r/PrintConfig.cpp:353 -#: src/libslic3r/PrintConfig.cpp:473 src/libslic3r/PrintConfig.cpp:484 -#: src/libslic3r/PrintConfig.cpp:502 src/libslic3r/PrintConfig.cpp:680 -#: src/libslic3r/PrintConfig.cpp:1166 src/libslic3r/PrintConfig.cpp:1227 -#: src/libslic3r/PrintConfig.cpp:1245 src/libslic3r/PrintConfig.cpp:1263 -#: src/libslic3r/PrintConfig.cpp:1315 src/libslic3r/PrintConfig.cpp:1325 -#: src/libslic3r/PrintConfig.cpp:1446 src/libslic3r/PrintConfig.cpp:1454 -#: src/libslic3r/PrintConfig.cpp:1495 src/libslic3r/PrintConfig.cpp:1503 -#: src/libslic3r/PrintConfig.cpp:1513 src/libslic3r/PrintConfig.cpp:1521 -#: src/libslic3r/PrintConfig.cpp:1529 src/libslic3r/PrintConfig.cpp:1612 -#: src/libslic3r/PrintConfig.cpp:1828 src/libslic3r/PrintConfig.cpp:1898 -#: src/libslic3r/PrintConfig.cpp:1932 src/libslic3r/PrintConfig.cpp:2125 -#: src/libslic3r/PrintConfig.cpp:2132 src/libslic3r/PrintConfig.cpp:2139 -#: src/libslic3r/PrintConfig.cpp:2169 src/libslic3r/PrintConfig.cpp:2179 -#: src/libslic3r/PrintConfig.cpp:2189 src/libslic3r/PrintConfig.cpp:2297 -#: src/libslic3r/PrintConfig.cpp:2372 src/libslic3r/PrintConfig.cpp:2381 -#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2400 -#: src/libslic3r/PrintConfig.cpp:2444 src/libslic3r/PrintConfig.cpp:2454 -#: src/libslic3r/PrintConfig.cpp:2473 src/libslic3r/PrintConfig.cpp:2483 -#: src/libslic3r/PrintConfig.cpp:2492 src/libslic3r/PrintConfig.cpp:2510 -#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2539 -#: src/libslic3r/PrintConfig.cpp:2552 src/libslic3r/PrintConfig.cpp:2562 +#: src/libslic3r/PrintConfig.cpp:2491 +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/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: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 msgid "mm" msgstr "mm" -#: src/libslic3r/PrintConfig.cpp:1477 src/libslic3r/PrintConfig.cpp:1486 +#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556 msgid "mm (zero to disable)" msgstr "mm (zero aby wyłączyć)" -#: src/libslic3r/PrintConfig.cpp:847 src/libslic3r/PrintConfig.cpp:992 -#: src/libslic3r/PrintConfig.cpp:1797 +#: 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 msgid "mm or %" msgstr "mm lub %" -#: src/libslic3r/PrintConfig.cpp:201 src/libslic3r/PrintConfig.cpp:577 -#: src/libslic3r/PrintConfig.cpp:585 src/libslic3r/PrintConfig.cpp:594 -#: src/libslic3r/PrintConfig.cpp:602 src/libslic3r/PrintConfig.cpp:629 -#: src/libslic3r/PrintConfig.cpp:648 src/libslic3r/PrintConfig.cpp:874 -#: src/libslic3r/PrintConfig.cpp:1001 src/libslic3r/PrintConfig.cpp:1079 -#: src/libslic3r/PrintConfig.cpp:1099 src/libslic3r/PrintConfig.cpp:1112 -#: src/libslic3r/PrintConfig.cpp:1123 src/libslic3r/PrintConfig.cpp:1176 -#: src/libslic3r/PrintConfig.cpp:1235 src/libslic3r/PrintConfig.cpp:1363 -#: src/libslic3r/PrintConfig.cpp:1537 src/libslic3r/PrintConfig.cpp:1546 -#: src/libslic3r/PrintConfig.cpp:1941 src/libslic3r/PrintConfig.cpp:2053 +#: 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 msgid "mm/s" msgstr "mm/s" -#: src/libslic3r/PrintConfig.cpp:430 src/libslic3r/PrintConfig.cpp:856 -#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1702 -#: src/libslic3r/PrintConfig.cpp:1908 src/libslic3r/PrintConfig.cpp:2035 +#: 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 msgid "mm/s or %" msgstr "mm/s lub %" -#: src/libslic3r/PrintConfig.cpp:160 src/libslic3r/PrintConfig.cpp:303 -#: src/libslic3r/PrintConfig.cpp:815 src/libslic3r/PrintConfig.cpp:936 -#: src/libslic3r/PrintConfig.cpp:1089 src/libslic3r/PrintConfig.cpp:1134 -#: src/libslic3r/PrintConfig.cpp:1145 src/libslic3r/PrintConfig.cpp:1334 +#: 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 msgid "mm/s²" msgstr "mm/s²" -#: src/libslic3r/PrintConfig.cpp:1661 +#: src/libslic3r/PrintConfig.cpp:1730 msgid "mm²" msgstr "mm²" -#: src/libslic3r/PrintConfig.cpp:640 +#: src/libslic3r/PrintConfig.cpp:672 msgid "mm³" msgstr "mm³" -#: src/libslic3r/PrintConfig.cpp:569 src/libslic3r/PrintConfig.cpp:1185 +#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601 +#: src/libslic3r/PrintConfig.cpp:1250 msgid "mm³/s" msgstr "mm³/s" -#: src/libslic3r/PrintConfig.cpp:1197 src/libslic3r/PrintConfig.cpp:1208 +#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273 msgid "mm³/s²" msgstr "mm³/s²" -#: src/slic3r/GUI/GUI_App.cpp:681 +#: src/slic3r/GUI/GUI_App.cpp:820 msgid "Mode" -msgstr "Tryb" +msgstr "&Tryb" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "model" msgstr "model" -#: src/slic3r/GUI/BedShapeDialog.cpp:239 +#: src/slic3r/GUI/BedShapeDialog.cpp:251 msgid "Model" msgstr "Model" @@ -3873,8 +4641,8 @@ msgid "Model repair canceled" msgstr "Anulowano naprawę modelu" #: src/slic3r/Utils/FixModelByWin10.cpp:426 -msgid "Model repair failed: \n" -msgstr "Niepowodzenie naprawy modelu:\n" +msgid "Model repair failed:" +msgstr "Niepowodzenie naprawy modelu:" #: src/slic3r/Utils/FixModelByWin10.cpp:400 msgid "Model repair finished" @@ -3884,104 +4652,150 @@ msgstr "Ukończono naprawę modelu" msgid "Model repaired successfully" msgstr "Model naprawiono pomyślnie" -#: src/slic3r/GUI/Preset.cpp:207 +#: src/slic3r/GUI/Tab.cpp:979 +msgid "Modifications to the current profile will be saved." +msgstr "Modyfikacje zostaną zapisane na obecnym profilu." + +#: src/slic3r/GUI/Preset.cpp:247 msgid "modified" msgstr "zmodyfikowano" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Modifier" msgstr "Modyfikator" -#: src/slic3r/GUI/Tab.cpp:1100 +#: src/slic3r/GUI/Tab.cpp:1161 msgid "Modifiers" msgstr "Modyfikatory" -#: src/libslic3r/PrintConfig.cpp:719 +#: src/libslic3r/PrintConfig.cpp:2512 +msgid "money/bottle" +msgstr "pieniędzy/butelkę" + +#: src/libslic3r/PrintConfig.cpp:762 msgid "money/kg" msgstr "pieniędzy/kg" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1240 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 msgid "Mouse wheel" msgstr "Kółko myszy" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:51 -msgid "Move" -msgstr "Przesuwaj" +#: src/slic3r/GUI/GLCanvas3D.cpp:261 +msgid "Mouse wheel:" +msgstr "Kółko myszy:" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1238 +#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48 +msgid "Move" +msgstr "Przesuń" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372 msgid "Move clipping plane" msgstr "Przesunięcie płaszczyzny przecinania" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 msgid "Move current slider thumb Down" msgstr "Przesuń suwak w dół" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:182 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:214 msgid "Move current slider thumb Up" msgstr "Przesuń suwak w górę" -#: src/slic3r/GUI/GLCanvas3D.cpp:2872 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1059 +msgid "Move drainage hole" +msgstr "Przesuń otwór odpływowy" + +#: src/slic3r/GUI/GLCanvas3D.cpp:3505 msgid "Move Object" msgstr "Przesuń Model" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1231 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365 msgid "Move point" msgstr "Przesuń punkt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1183 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:166 +msgid "Move selection 10 mm in negative X direction" +msgstr "Przesuń zaznaczenie o -10 mm w osi X" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:165 +msgid "Move selection 10 mm in negative Y direction" +msgstr "Przesuń zaznaczenie o -10 mm w osi Y" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 +msgid "Move selection 10 mm in positive X direction" +msgstr "Przesuń zaznaczenie o +10 mm w osi X" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:164 +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 msgid "Move support point" msgstr "Przenieś plik podpory" -#: src/libslic3r/PrintConfig.cpp:2100 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:169 +msgid "Movement in camera space" +msgstr "Ruch w przestrzeni widoku" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:168 +msgid "Movement step set to 1 mm" +msgstr "Krok przesunięcia ustawiony na 1 mm" + +#: src/libslic3r/PrintConfig.cpp:2201 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:1661 src/slic3r/GUI/Plater.cpp:1769 +#: src/slic3r/GUI/Plater.cpp:2360 src/slic3r/GUI/Plater.cpp:2413 msgid "Multi-part object detected" msgstr "Wykryto obiekt wieloczęściowy" -#: src/slic3r/GUI/FirmwareDialog.cpp:400 src/slic3r/GUI/FirmwareDialog.cpp:436 -#, possible-c-format +#: 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 "Wiele urządzeń %s znaleziono. Proszę zostawić tylko jedno podłączone podczas flashowania." -#: src/slic3r/GUI/Tab.cpp:1118 +#: src/slic3r/GUI/Tab.cpp:1179 msgid "Multiple Extruders" msgstr "Kilka ekstruderów" -#: src/slic3r/GUI/Plater.cpp:1766 -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?\n" -msgstr "Kilka obiektów zostało załadowanych dla drukarki typu multi-material.\nTraktować je jako jeden model zawierający kilka części?\n" +#: 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/libslic3r/PrintConfig.cpp:3050 +#: src/libslic3r/PrintConfig.cpp:3439 msgid "Multiply copies by creating a grid." msgstr "Pomnóż ilość kopii przez stworzenie siatki." -#: src/libslic3r/PrintConfig.cpp:3045 +#: src/libslic3r/PrintConfig.cpp:3434 msgid "Multiply copies by this factor." msgstr "Pomnóż ilość kopii przez tę wartość." -#: src/slic3r/GUI/Field.cpp:139 +#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:580 msgid "N/A" msgstr "N/D" -#: src/slic3r/GUI/GUI_ObjectList.cpp:176 +#: src/slic3r/GUI/GUI_ObjectList.cpp:270 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 msgid "Name" msgstr "Nazwa" -#: src/libslic3r/PrintConfig.cpp:1418 +#: src/libslic3r/PrintConfig.cpp:1488 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:1412 +#: src/libslic3r/PrintConfig.cpp:1482 msgid "Name of the printer vendor." msgstr "Nazwa dostawcy drukarki." -#: src/libslic3r/PrintConfig.cpp:1009 +#: src/libslic3r/PrintConfig.cpp:1058 msgid "Name of the profile, from which this profile inherits." msgstr "Nazwa profilu, z którego dziedziczy ten profil." -#: src/libslic3r/PrintConfig.cpp:1560 +#: src/libslic3r/PrintConfig.cpp:1630 msgid "Nearest" msgstr "Najbliższy" @@ -3989,32 +4803,40 @@ msgstr "Najbliższy" msgid "Network lookup" msgstr "Podgląd sieci" -#: src/slic3r/GUI/Plater.cpp:2056 +#: src/slic3r/GUI/Plater.cpp:2151 msgid "New Project" msgstr "Nowy Projekt" -#: src/slic3r/GUI/UpdateDialogs.cpp:30 -#, possible-c-format +#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 +msgid "New project, clear plater" +msgstr "Nowy projekt, wyczyść stół" + +#: src/slic3r/GUI/UpdateDialogs.cpp:38 +#, c-format msgid "New version of %s is available" msgstr "Dostępna jest nowa wersja: %s" -#: src/slic3r/GUI/UpdateDialogs.cpp:47 +#: src/slic3r/GUI/UpdateDialogs.cpp:45 msgid "New version:" msgstr "Nowa wersja:" -#: src/slic3r/GUI/GLCanvas3D.cpp:3750 +#: src/slic3r/GUI/GLCanvas3D.cpp:4673 msgid "Next Redo action: %1%" msgstr "Następna akcja do powtórzenia: %1%" -#: src/slic3r/GUI/GLCanvas3D.cpp:3718 +#: src/slic3r/GUI/GLCanvas3D.cpp:4641 msgid "Next Undo action: %1%" msgstr "Następna akcja do cofnięcia: %1%" -#: src/libslic3r/PrintConfig.cpp:912 +#: src/libslic3r/PrintConfig.cpp:960 msgid "No extrusion" msgstr "Brak ekstruzji" -#: src/slic3r/GUI/MainFrame.cpp:635 +#: src/libslic3r/SLAPrintSteps.cpp:453 +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 msgid "No previously sliced file." msgstr "Brak poprzednio pociętych plików." @@ -4022,152 +4844,175 @@ msgstr "Brak poprzednio pociętych plików." msgid "NO RAMMING AT ALL" msgstr "BRAK WYCISKANIA" -#: src/libslic3r/PrintConfig.cpp:2509 +#: src/libslic3r/PrintConfig.cpp:1857 +msgid "No sparse layers (EXPERIMENTAL)" +msgstr "Brak warstw bez czyszczenia (EKSPERYMENTALNE)" + +#: src/libslic3r/PrintConfig.cpp:2774 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/ConfigWizard.cpp:190 src/slic3r/GUI/Plater.cpp:422 -#: src/libslic3r/GCode/PreviewData.cpp:162 +#: src/slic3r/GUI/UpdateDialogs.cpp:303 +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 msgid "None" msgstr "Brak" -#: src/slic3r/GUI/Tab.cpp:2152 +#: src/slic3r/GUI/Tab.cpp:2203 msgid "Normal" msgstr "Normalny" -#: src/slic3r/GUI/Plater.cpp:1073 +#: src/slic3r/GUI/Plater.cpp:1286 msgid "normal mode" msgstr "tryb normalny" -#: src/libslic3r/Zipper.cpp:49 +#: src/libslic3r/Zipper.cpp:46 msgid "not a ZIP archive" msgstr "nie jest archiwum ZIP" -#: src/slic3r/Utils/OctoPrint.cpp:90 +#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302 +msgid "Not found:" +msgstr "Nie znaleziono:" + +#: src/slic3r/GUI/DoubleSlider.cpp:1019 +msgid "Note" +msgstr "Uwaga" + +#: src/slic3r/Utils/AstroBox.cpp:89 +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 +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 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:1213 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345 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:1193 src/slic3r/GUI/Tab.cpp:1194 -#: src/slic3r/GUI/Tab.cpp:1576 src/slic3r/GUI/Tab.cpp:1577 -#: src/slic3r/GUI/Tab.cpp:1985 src/slic3r/GUI/Tab.cpp:1986 -#: src/slic3r/GUI/Tab.cpp:2079 src/slic3r/GUI/Tab.cpp:2080 -#: src/slic3r/GUI/Tab.cpp:3328 src/slic3r/GUI/Tab.cpp:3329 +#: 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 msgid "Notes" msgstr "Notatki" -#: src/slic3r/GUI/GUI.cpp:277 +#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905 +#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:245 msgid "Notice" msgstr "Uwaga" -#: src/slic3r/GUI/ConfigWizard.cpp:118 +#: src/slic3r/GUI/ConfigWizard.cpp:218 msgid "nozzle" msgstr "dysza" -#: src/libslic3r/PrintConfig.cpp:1261 +#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2340 +#: src/libslic3r/PrintConfig.cpp:1326 msgid "Nozzle diameter" msgstr "Średnica dyszy" -#: src/slic3r/GUI/ConfigWizard.cpp:560 +#: src/slic3r/GUI/ConfigWizard.cpp:969 msgid "Nozzle Diameter:" msgstr "Średnica dyszy:" -#: src/libslic3r/PrintConfig.cpp:618 +#: src/libslic3r/PrintConfig.cpp:650 msgid "Number of cooling moves" msgstr "Ilość ruchów chłodzących" -#: src/slic3r/GUI/Tab.cpp:1845 +#: src/slic3r/GUI/Tab.cpp:1839 msgid "Number of extruders of the printer." msgstr "Liczba ekstruderów drukarki." -#: src/libslic3r/PrintConfig.cpp:1888 +#: src/libslic3r/PrintConfig.cpp:1975 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:1627 +#: src/libslic3r/PrintConfig.cpp:1697 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." -#: src/libslic3r/PrintConfig.cpp:2214 +#: src/libslic3r/PrintConfig.cpp:2365 msgid "Number of pixels in" msgstr "Liczba pikseli" -#: src/libslic3r/PrintConfig.cpp:2216 +#: src/libslic3r/PrintConfig.cpp:2367 msgid "Number of pixels in X" msgstr "Liczba pikseli w osi X" -#: src/libslic3r/PrintConfig.cpp:2222 +#: src/libslic3r/PrintConfig.cpp:2373 msgid "Number of pixels in Y" msgstr "Liczba pikseli w osi Y" -#: src/libslic3r/PrintConfig.cpp:151 +#: src/libslic3r/PrintConfig.cpp:176 msgid "Number of solid layers to generate on bottom surfaces." msgstr "Liczba zwartych warstw dolnych." -#: src/libslic3r/PrintConfig.cpp:1711 +#: src/libslic3r/PrintConfig.cpp:1781 msgid "Number of solid layers to generate on top and bottom surfaces." msgstr "Liczba zwartych warstw górnych i dolnych." -#: src/libslic3r/PrintConfig.cpp:2045 +#: src/libslic3r/PrintConfig.cpp:2134 msgid "Number of solid layers to generate on top surfaces." msgstr "Liczba zwartych warstw górnych." -#: src/libslic3r/PrintConfig.cpp:2303 +#: src/libslic3r/PrintConfig.cpp:2518 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:218 +#: src/slic3r/GUI/Plater.cpp:241 msgid "Number of tool changes" msgstr "Ilość zmian narzędzi" -#: src/libslic3r/PrintConfig.cpp:2489 +#: src/libslic3r/PrintConfig.cpp:2753 msgid "Object elevation" msgstr "Podniesienie modelu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2466 msgid "Object manipulation" msgstr "Manipulowanie modelem" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:27 -msgid "Object Manipulation" -msgstr "Manipulowanie Modelem" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:78 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638 msgid "Object name" msgstr "Nazwa modelu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3417 msgid "Object or Instance" msgstr "Model lub Kopia" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1010 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 msgid "Object reordered" msgstr "Model przeorganizowany" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1868 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2479 msgid "Object Settings to modify" msgstr "Ustawienia Modelu do modyfikacji" -#: src/slic3r/GUI/Plater.cpp:1875 +#: src/slic3r/GUI/Plater.cpp:2529 msgid "Object too large?" msgstr "Model zbyt duży?" -#: src/libslic3r/PrintConfig.cpp:2161 +#: src/libslic3r/PrintConfig.cpp:2262 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." -#: src/slic3r/GUI/Plater.cpp:1018 +#: src/slic3r/GUI/Plater.cpp:1194 msgid "object(s)" msgstr "model(e)" -#: src/slic3r/GUI/Plater.cpp:1043 src/slic3r/GUI/Plater.cpp:1058 +#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245 msgid "objects" msgstr "modele" -#: src/libslic3r/PrintConfig.cpp:402 src/libslic3r/PrintConfig.cpp:808 +#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855 msgid "Octagram Spiral" msgstr "Spirala ośmiokątna" @@ -4175,702 +5020,844 @@ msgstr "Spirala ośmiokątna" msgid "OctoPrint version" msgstr "Wersja OctoPrint" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2419 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3425 msgid "of a current Object" msgstr "obecnego Modelu" -#: src/slic3r/GUI/wxExtensions.cpp:2570 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43 +msgid "Offset" +msgstr "Offset" + +#: src/slic3r/GUI/Tab.cpp:1755 +#, 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 msgid "One layer mode" msgstr "Tryb jednej warstwy" -#: src/libslic3r/Print.cpp:1285 +#: src/libslic3r/Print.cpp:1365 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:1817 src/libslic3r/PrintConfig.cpp:2425 +#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2676 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:978 +#: src/libslic3r/PrintConfig.cpp:1027 msgid "Only infill where needed" msgstr "Tylko potrzebne wypełnienie" -#: src/slic3r/GUI/Tab.cpp:2271 +#: src/slic3r/GUI/Tab.cpp:2373 msgid "Only lift Z" -msgstr "Tylko z-hop" +msgstr "Z-hop tylko" -#: src/libslic3r/PrintConfig.cpp:1500 +#: src/libslic3r/PrintConfig.cpp:1570 msgid "Only lift Z above" msgstr "Z-hop tylko powyżej" -#: src/libslic3r/PrintConfig.cpp:1509 +#: src/libslic3r/PrintConfig.cpp:1579 msgid "Only lift Z below" msgstr "Z-hop tylko poniżej" -#: src/libslic3r/PrintConfig.cpp:1279 +#: src/libslic3r/PrintConfig.cpp:1348 msgid "Only retract when crossing perimeters" msgstr "Retrakcja tylko przy przechodzeniu nad obrysami" -#: src/slic3r/GUI/Tab.cpp:1126 +#: src/slic3r/GUI/Tab.cpp:1187 msgid "Ooze prevention" msgstr "Zapobieganie wyciekom (ooze)" -#: src/libslic3r/Print.cpp:1193 +#: src/libslic3r/Print.cpp:1266 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:339 +#: src/slic3r/GUI/MainFrame.cpp:408 msgid "Open a project file" msgstr "Otwórz plik projektu" -#: src/slic3r/GUI/Tab.cpp:1745 +#: src/slic3r/GUI/Tab.cpp:1729 msgid "Open CA certificate file" msgstr "Otwórz plik certyfikatu CA" -#: src/slic3r/GUI/UpdateDialogs.cpp:63 src/slic3r/GUI/UpdateDialogs.cpp:126 +#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125 +#: src/slic3r/GUI/UpdateDialogs.cpp:183 msgid "Open changelog page" msgstr "Otwórz stronę z listami zmian" -#: src/slic3r/GUI/UpdateDialogs.cpp:68 +#: src/slic3r/GUI/UpdateDialogs.cpp:65 msgid "Open download page" msgstr "Otwórz stronę pobierania" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:105 -msgid "Open project STL/OBJ/AMF/3MF with config, delete bed" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:113 +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:551 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:693 +#, c-format msgid "Open the %s website in your browser" msgstr "Otwórz stronę %s w przeglądarce" -#: src/slic3r/GUI/MainFrame.cpp:542 +#: src/slic3r/GUI/MainFrame.cpp:684 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:549 +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Open the software releases page in your browser" msgstr "Otwórz stronę z wersjami oprogramowania w przeglądarce" -#: src/slic3r/GUI/Plater.cpp:2994 +#: src/slic3r/GUI/Plater.cpp:4040 msgid "Optimize orientation" msgstr "Optymalizuj orientację" -#: src/slic3r/GUI/Plater.cpp:2643 +#: src/slic3r/GUI/Plater.cpp:2767 msgid "Optimize Rotation" msgstr "Optymalizuj obrót" -#: src/slic3r/GUI/Plater.cpp:2994 +#: src/slic3r/GUI/Plater.cpp:4040 msgid "Optimize the rotation of the object for better print results." msgstr "Optymalizuj obrót modelu dla lepszych efektów." -#: src/libslic3r/PrintConfig.cpp:112 +#: src/libslic3r/PrintConfig.cpp:137 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." -#: src/slic3r/GUI/Tab.cpp:1070 +#: src/slic3r/GUI/Tab.cpp:1131 msgid "Options for support material and raft" msgstr "Opcje materiału podporowego i tratwy (raft)" -#: src/slic3r/GUI/Plater.cpp:2251 +#: src/slic3r/GUI/DoubleSlider.cpp:989 +msgid "or press \"+\" key" +msgstr "lub naciśnij klawisz \"+\"" + +#: src/slic3r/GUI/Plater.cpp:2892 msgid "Orientation found." msgstr "Znaleziono orientację." -#: src/slic3r/GUI/Plater.cpp:2768 +#: src/slic3r/GUI/Plater.cpp:2891 msgid "Orientation search canceled." msgstr "Anulowano ustawianie orientacji." -#: src/slic3r/GUI/BedShapeDialog.cpp:79 +#: src/slic3r/GUI/BedShapeDialog.cpp:84 msgid "Origin" msgstr "Punkt zerowy" -#: src/slic3r/GUI/Tab.cpp:1165 +#: src/slic3r/GUI/Tab.cpp:1227 msgid "Other" msgstr "Inne" -#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:1977 +#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064 msgid "Other layers" msgstr "Inne warstwy" -#: src/slic3r/GUI/ConfigWizard.cpp:438 +#: src/slic3r/GUI/ConfigWizard.cpp:856 msgid "Other Vendors" msgstr "Inni dostawcy" -#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:3440 +#: src/slic3r/GUI/Tab.cpp:1238 src/slic3r/GUI/Tab.cpp:3666 msgid "Output file" msgstr "Plik wyjściowy" -#: src/libslic3r/PrintConfig.cpp:3104 +#: src/libslic3r/PrintConfig.cpp:3493 msgid "Output File" msgstr "Plik Wyjściowy" -#: src/libslic3r/PrintConfig.cpp:1294 +#: src/libslic3r/PrintConfig.cpp:1363 msgid "Output filename format" msgstr "Format pliku wyjściowego" -#: src/libslic3r/PrintConfig.cpp:2992 +#: src/libslic3r/PrintConfig.cpp:3381 msgid "Output Model Info" msgstr "Informacje o Modelu wyjściowym" -#: src/slic3r/GUI/Tab.cpp:1168 src/slic3r/GUI/Tab.cpp:3439 +#: src/slic3r/GUI/Tab.cpp:1230 src/slic3r/GUI/Tab.cpp:3665 msgid "Output options" msgstr "Opcje wyjściowe" -#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/GCode/PreviewData.cpp:165 +#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312 msgid "Overhang perimeter" msgstr "Obrys zwisu" -#: src/libslic3r/PrintConfig.cpp:1955 +#: src/libslic3r/PrintConfig.cpp:2042 msgid "Overhang threshold" msgstr "Próg zwisu" -#: src/slic3r/GUI/Tab.cpp:1153 +#: src/slic3r/GUI/Tab.cpp:1215 msgid "Overlap" msgstr "Nakładanie" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "P&rint Settings Tab" msgstr "Ustawienia D&ruku" -#: src/slic3r/GUI/GUI_ObjectList.cpp:79 src/slic3r/GUI/GUI_ObjectList.cpp:520 -#: src/slic3r/GUI/Tab.cpp:3425 src/slic3r/GUI/Tab.cpp:3426 -#: src/libslic3r/PrintConfig.cpp:2516 src/libslic3r/PrintConfig.cpp:2523 -#: src/libslic3r/PrintConfig.cpp:2537 src/libslic3r/PrintConfig.cpp:2547 -#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2569 +#: 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 msgid "Pad" msgstr "Podkładka" -#: src/slic3r/GUI/GUI_ObjectList.cpp:39 +#: src/slic3r/GUI/GUI_ObjectList.cpp:45 msgid "Pad and Support" msgstr "Podkładka i Podpory" -#: src/libslic3r/PrintConfig.cpp:2732 +#: src/libslic3r/PrintConfig.cpp:2855 msgid "Pad around object" msgstr "Podkładka wokół modelu" -#: src/libslic3r/PrintConfig.cpp:2731 +#: src/libslic3r/PrintConfig.cpp:2862 +msgid "Pad around object everywhere" +msgstr "Podkładka wokół wszystkich modeli" + +#: src/libslic3r/PrintConfig.cpp:2811 +msgid "Pad brim size" +msgstr "Rozmiar brimu dla podkładki" + +#: src/libslic3r/SLA/Pad.cpp:691 +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 msgid "Pad object connector penetration" msgstr "Przenikanie łącznika podkładki z modelem" -#: src/libslic3r/PrintConfig.cpp:2711 +#: src/libslic3r/PrintConfig.cpp:2880 msgid "Pad object connector stride" msgstr "Rozmieszczenie łączników podkładki z modelem" -#: src/libslic3r/PrintConfig.cpp:2721 +#: src/libslic3r/PrintConfig.cpp:2889 msgid "Pad object connector width" msgstr "Szerokość łącznika podkładki z modelem" -#: src/libslic3r/PrintConfig.cpp:2700 +#: src/libslic3r/PrintConfig.cpp:2869 msgid "Pad object gap" msgstr "Odstęp modelu od podkładki" -#: src/libslic3r/PrintConfig.cpp:2532 +#: src/libslic3r/PrintConfig.cpp:2797 msgid "Pad wall height" msgstr "Wysokość ścianki podkładki" -#: src/libslic3r/PrintConfig.cpp:2568 +#: src/libslic3r/PrintConfig.cpp:2844 msgid "Pad wall slope" msgstr "Kąt pochylenia ścianki podkładki" -#: src/libslic3r/PrintConfig.cpp:2522 +#: src/libslic3r/PrintConfig.cpp:2787 msgid "Pad wall thickness" msgstr "Grubość ścianki podkładki" -#: src/slic3r/GUI/Field.cpp:108 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +msgid "Page Down" +msgstr "Page Down" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Page Up" +msgstr "Page Up" + +#: src/slic3r/GUI/Field.cpp:139 msgid "parameter name" msgstr "nazwa parametru" -#: src/slic3r/GUI/Field.cpp:184 +#: src/slic3r/GUI/Field.cpp:243 msgid "Parameter validation" msgstr "Weryfikacja parametru" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2412 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3418 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Part" msgstr "Część" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1881 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2494 msgid "Part manipulation" msgstr "Manipulacja częścią" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1872 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2483 msgid "Part Settings to modify" msgstr "Ustawienia Części do modyfikacji" -#: src/slic3r/GUI/GLCanvas3D.cpp:3449 +#: src/slic3r/GUI/GLCanvas3D.cpp:4514 msgid "Paste" msgstr "Wklej" -#: src/slic3r/GUI/MainFrame.cpp:456 +#: src/slic3r/GUI/MainFrame.cpp:592 msgid "Paste clipboard" msgstr "Wklej zawartość schowka" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:133 msgid "Paste from clipboard" msgstr "Wklej ze schowka" -#: src/slic3r/GUI/Plater.cpp:4772 +#: src/slic3r/GUI/Plater.cpp:5606 msgid "Paste From Clipboard" msgstr "Wklej Ze Schowka" -#: src/libslic3r/PrintConfig.cpp:1915 +#: src/libslic3r/PrintConfig.cpp:2002 msgid "Pattern" msgstr "Wzór" -#: src/libslic3r/PrintConfig.cpp:1805 +#: src/libslic3r/PrintConfig.cpp:1891 msgid "Pattern angle" msgstr "Kąt wzoru" -#: src/libslic3r/PrintConfig.cpp:1929 +#: src/libslic3r/PrintConfig.cpp:2016 msgid "Pattern spacing" -msgstr "Rozmieszczenie wzoru" +msgstr "Rozstaw wzoru" -#: src/libslic3r/PrintConfig.cpp:1917 +#: src/libslic3r/PrintConfig.cpp:2004 msgid "Pattern used to generate support material." msgstr "Wzór podpór." -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:36 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:198 +#: src/slic3r/GUI/Plater.cpp:1261 +msgid "Pause" +msgstr "Pauza" + +#: src/slic3r/GUI/DoubleSlider.cpp:1009 +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/Gizmos/GLGizmoCut.cpp:175 msgid "Perform cut" msgstr "Przetnij" -#: src/slic3r/GUI/GUI_Preview.cpp:227 src/libslic3r/GCode/PreviewData.cpp:163 +#: src/libslic3r/PrintConfig.cpp:2927 +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 msgid "Perimeter" msgstr "Obrys" -#: src/libslic3r/PrintConfig.cpp:1339 +#: src/libslic3r/PrintConfig.cpp:1408 msgid "Perimeter extruder" msgstr "Ekstruder dla obrysów" -#: src/slic3r/GUI/PresetHints.cpp:162 +#: src/slic3r/GUI/PresetHints.cpp:165 msgid "perimeters" msgstr "obrysy" -#: src/libslic3r/PrintConfig.cpp:1330 src/libslic3r/PrintConfig.cpp:1348 -#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1370 +#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440 msgid "Perimeters" msgstr "Obrysy" -#: src/slic3r/GUI/ConfigWizard.cpp:440 -#, possible-c-format -msgid "Pick another vendor supported by %s:" -msgstr "Wybierz producenta wspieranego przez %s:" +#: src/slic3r/GUI/ConfigWizard.cpp:860 +#, c-format +msgid "Pick another vendor supported by %s" +msgstr "Wybierz innego producenta obsługiwanego przez %s" -#: src/libslic3r/PrintConfig.cpp:2430 +#: 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:2681 msgid "Pillar widening factor" msgstr "Współczynnik rozszerzania słupka" -#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:32 +#: src/slic3r/GUI/ConfigManipulation.cpp:330 +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 +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 msgid "Place on face" msgstr "Połóż na płaszczyźnie" -#: src/slic3r/GUI/MainFrame.cpp:161 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:204 msgid "Plater" msgstr "Zawartość Stołu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:156 -msgid "Plater Shortcuts" -msgstr "Skróty Podglądu Stołu" - -#: src/slic3r/GUI/GUI.cpp:143 +#: src/slic3r/GUI/GUI_App.cpp:1085 msgid "Please check and fix your object list." msgstr "Sprawdź i popraw listę modeli." -#: src/slic3r/GUI/Tab.cpp:2797 +#: src/slic3r/GUI/Plater.cpp:2312 src/slic3r/GUI/Tab.cpp:2959 msgid "Please check your object list before preset changing." msgstr "Sprawdź listę modeli przed zmianą zestawu ustawień." -#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:286 +#: src/slic3r/GUI/Plater.cpp:3286 +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 msgid "Portions copyright" msgstr "Częściowe prawa autorskie" -#: src/libslic3r/PrintConfig.cpp:2235 +#: src/libslic3r/PrintConfig.cpp:2400 msgid "Portrait" msgstr "Tryb Portretowy" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:150 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:193 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457 msgid "Position" msgstr "Pozycja" -#: src/slic3r/GUI/Tab.cpp:2265 +#: src/slic3r/GUI/Tab.cpp:2367 msgid "Position (for multi-extruder printers)" msgstr "Pozycja (dla drukarek z kilkoma ekstruderami)" -#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:177 -msgid "Position (mm)" -msgstr "Pozycja (mm)" - -#: src/libslic3r/PrintConfig.cpp:1553 +#: src/libslic3r/PrintConfig.cpp:1623 msgid "Position of perimeters starting points." msgstr "Pozycja startowa druku obrysów." -#: src/libslic3r/PrintConfig.cpp:2123 +#: src/libslic3r/PrintConfig.cpp:2224 msgid "Position X" msgstr "Pozycja X" -#: src/libslic3r/PrintConfig.cpp:2130 +#: src/libslic3r/PrintConfig.cpp:2231 msgid "Position Y" msgstr "Pozycja Y" -#: src/slic3r/GUI/Tab.cpp:1187 src/libslic3r/PrintConfig.cpp:1383 +#: src/slic3r/GUI/Tab.cpp:1245 src/libslic3r/PrintConfig.cpp:1453 msgid "Post-processing scripts" msgstr "Skrypty do przetwarzania końcowego" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Pre&view" msgstr "Pod&gląd" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:121 src/slic3r/GUI/Preferences.cpp:10 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10 msgid "Preferences" msgstr "Preferencje" -#: src/libslic3r/PrintConfig.cpp:1571 +#: src/libslic3r/PrintConfig.cpp:1641 msgid "Preferred direction of the seam" msgstr "Preferowane ustawienie szwu" -#: src/libslic3r/PrintConfig.cpp:1582 +#: src/libslic3r/PrintConfig.cpp:1652 msgid "Preferred direction of the seam - jitter" msgstr "Preferowany kierunek szwu - jitter" -#: src/libslic3r/PrintObject.cpp:251 +#: src/libslic3r/PrintObject.cpp:255 msgid "Preparing infill" msgstr "Przygotowywanie wypełnienia" -#: src/slic3r/GUI/Tab.cpp:2758 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:2920 +#, c-format msgid "Preset (%s)" msgstr "Zestaw ustawień (%s)" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Press to activate deselection rectangle\nor to scale or rotate selected objects\naround their own center" -msgstr "Naciśnij aby aktywować prostokąt odznaczający\nlub skalować bądź obracać wybrane modele\nwokół ich środka" +#: src/slic3r/GUI/Tab.cpp:3082 +msgid "Preset with name \"%1%\" already exists." +msgstr "Zestaw ustawień o nazwie \"%1%\" już istnieje." -#: src/slic3r/GUI/KBShortcutsDialog.cpp:148 +#: src/slic3r/GUI/Tab.cpp:3029 +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/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:146 -#, possible-c-format -msgid "Press to activate selection rectangle\nor to snap by 5% in Gizmo scale\nor to snap by 1mm in Gizmo move" -msgstr "Naciśnij aby aktywować prostokąt zaznaczający\nlub przyciągać co 5% podczas skalowania z uchwytem\nlub przyciągać co 1 mm podczas przemieszczania z uchwytem" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:162 +msgid "Press to activate selection rectangle" +msgstr "Naciśnij, aby aktywować prostokąt zaznaczający" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:147 -msgid "Press to scale selection to fit print volume\nin Gizmo scale" -msgstr "Naciśnij aby skalować zaznaczenie do wielkości przestrzeni roboczej\nw skalowaniu z uchwytem" +#: 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:127 -msgid "Press to select multiple object or move multiple object with mouse" -msgstr "Kliknij aby wybrać wiele modeli lub przesunąć je przy pomocy myszki" +#: 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/Tab.cpp:2288 +#: 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:211 src/slic3r/GUI/Plater.cpp:4105 +#: src/slic3r/GUI/Tab.cpp:2390 msgid "Preview" -msgstr "Podgląd" +msgstr "Podgląd cięcia" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:176 -msgid "Preview Shortcuts" -msgstr "Podgląd Skrótów" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42 +msgid "Preview hollowed and drilled model" +msgstr "Podgląd wydrążonego modelu z otworem" -#: src/slic3r/GUI/MainFrame.cpp:641 +#: src/slic3r/GUI/MainFrame.cpp:790 msgid "Previously sliced file (" msgstr "Poprzednio pocięty plik (" -#: src/libslic3r/PrintConfig.cpp:1773 +#: src/libslic3r/PrintConfig.cpp:1851 msgid "Prime all printing extruders" msgstr "Wyczyść wszystkie używane ekstrudery" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:46 src/slic3r/GUI/Preset.cpp:1274 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1521 msgid "print" msgstr "druk" -#: src/slic3r/GUI/MainFrame.cpp:510 +#: src/slic3r/GUI/MainFrame.cpp:648 msgid "Print &Host Upload Queue" -msgstr "Kolej&ka Zadań Serwera Druku" +msgstr "Kolej&ka zadań serwera druku" -#: src/libslic3r/PrintConfig.cpp:439 +#: src/libslic3r/PrintConfig.cpp:471 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:541 +#: src/slic3r/GUI/ConfigWizard.cpp:952 msgid "Print Diameters" msgstr "Średnice wydruku" -#: src/slic3r/GUI/Tab.cpp:1917 src/slic3r/GUI/Tab.cpp:2074 +#: src/slic3r/GUI/Tab.cpp:1944 src/slic3r/GUI/Tab.cpp:2123 msgid "Print Host upload" -msgstr "Wysyłanie do Serwera Druku" +msgstr "Wysyłanie do serwera druku" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 -#: src/slic3r/GUI/PrintHostDialogs.cpp:135 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:142 +#: src/slic3r/GUI/PrintHostDialogs.cpp:136 msgid "Print host upload queue" msgstr "Kolejka serwera druku" -#: src/slic3r/GUI/Tab.hpp:317 src/slic3r/GUI/Tab.hpp:405 +#: src/slic3r/GUI/DoubleSlider.cpp:970 +msgid "Print mode" +msgstr "Tryb drukowania" + +#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:431 msgid "Print Settings" msgstr "Ustawienia Druku" -#: src/slic3r/GUI/Plater.cpp:681 +#: src/slic3r/GUI/Plater.cpp:815 msgid "Print settings" msgstr "Ustawienia druku" -#: src/slic3r/GUI/Tab.cpp:1520 +#: src/slic3r/GUI/Tab.cpp:1478 msgid "Print speed override" msgstr "Nadpisanie prędkości druku" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/libslic3r/GCode.cpp:638 +msgid "Print z" +msgstr "Druk z" + +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Print&er Settings Tab" msgstr "Ustawi&enia Drukarki" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1438 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1621 msgid "Printable" msgstr "Do druku" -#: src/slic3r/GUI/Plater.cpp:685 +#: src/slic3r/GUI/Plater.cpp:819 msgid "Printer" msgstr "Drukarka" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:48 src/slic3r/GUI/Preset.cpp:1278 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1525 msgid "printer" msgstr "drukarka" -#: src/libslic3r/PrintConfig.cpp:2274 src/libslic3r/PrintConfig.cpp:2275 +#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440 msgid "Printer absolute correction" msgstr "Korekcje bezwzględne drukarki" -#: src/libslic3r/PrintConfig.cpp:2282 src/libslic3r/PrintConfig.cpp:2283 +#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457 msgid "Printer gamma correction" msgstr "Korekcja gamma drukarki" -#: src/slic3r/GUI/Tab.cpp:926 +#: src/slic3r/GUI/Tab.cpp:976 msgid "printer model" msgstr "model drukarki" -#: src/libslic3r/PrintConfig.cpp:1402 +#: src/libslic3r/PrintConfig.cpp:1472 msgid "Printer notes" msgstr "Notatki o drukarce" -#: src/libslic3r/PrintConfig.cpp:2266 src/libslic3r/PrintConfig.cpp:2267 -#: src/libslic3r/PrintConfig.cpp:2268 +#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432 +#: src/libslic3r/PrintConfig.cpp:2433 msgid "Printer scaling correction" msgstr "Korekcja skalowania drukarki" -#: src/slic3r/GUI/Tab.hpp:368 +#: src/slic3r/GUI/Tab.hpp:391 msgid "Printer Settings" msgstr "Ustawienia Drukarki" -#: src/libslic3r/PrintConfig.cpp:42 src/libslic3r/PrintConfig.cpp:43 +#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44 msgid "Printer technology" msgstr "Technologia druku" -#: src/libslic3r/PrintConfig.cpp:1396 +#: src/libslic3r/PrintConfig.cpp:1466 msgid "Printer type" msgstr "Rodzaj drukarki" -#: src/libslic3r/PrintConfig.cpp:1417 +#: src/libslic3r/PrintConfig.cpp:1487 msgid "Printer variant" msgstr "Wariant drukarki" -#: src/libslic3r/PrintConfig.cpp:1411 +#: src/libslic3r/PrintConfig.cpp:1481 msgid "Printer vendor" msgstr "Dostawca drukarki" -#: src/libslic3r/Print.cpp:1294 +#: src/libslic3r/Print.cpp:1388 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:715 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:849 +#, c-format msgid "Processing %s" msgstr "Przetwarzanie %s" -#: src/slic3r/GUI/Plater.cpp:1600 -#, possible-c-format -msgid "Processing input file %s\n" -msgstr "Przetwarzanie pliku wejściowego %s\n" +#: src/slic3r/GUI/Plater.cpp:2283 +#, c-format +msgid "Processing input file %s" +msgstr "Przetwarzanie pliku wejściowego %s" -#: src/libslic3r/PrintObject.cpp:110 +#: src/libslic3r/PrintObject.cpp:108 msgid "Processing triangulated mesh" msgstr "Przetwarzanie siatki trójkątów" -#: src/slic3r/GUI/Tab.cpp:1201 src/slic3r/GUI/Tab.cpp:1585 -#: src/slic3r/GUI/Tab.cpp:1993 src/slic3r/GUI/Tab.cpp:2087 -#: src/slic3r/GUI/Tab.cpp:3337 src/slic3r/GUI/Tab.cpp:3446 +#: 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 msgid "Profile dependencies" msgstr "Zależności profilowe" -#: src/slic3r/GUI/PrintHostDialogs.cpp:149 +#: src/slic3r/GUI/ConfigWizard.cpp:566 +msgid "Profile:" +msgstr "Profil:" + +#: src/slic3r/GUI/PrintHostDialogs.cpp:150 msgid "Progress" msgstr "Postęp" -#: src/slic3r/GUI/FirmwareDialog.cpp:779 +#: src/slic3r/GUI/FirmwareDialog.cpp:817 msgid "Progress:" msgstr "Postęp:" -#: src/slic3r/GUI/MainFrame.cpp:542 +#: src/slic3r/GUI/MainFrame.cpp:684 msgid "Prusa 3D &Drivers" msgstr "Sterowniki Prusa 3&D" -#: src/slic3r/GUI/ConfigWizard.cpp:1109 +#: src/slic3r/GUI/ConfigWizard.cpp:1995 msgid "Prusa FFF Technology Printers" msgstr "Drukarki Prusa w technologii FFF" -#: src/slic3r/GUI/ConfigWizard.cpp:1112 +#: src/slic3r/GUI/ConfigWizard.cpp:1998 msgid "Prusa MSLA Technology Printers" msgstr "Drukarki Prusa w technologii MSLA" -#: src/slic3r/GUI/AboutDialog.cpp:255 +#: src/slic3r/GUI/AboutDialog.cpp:260 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." -#: src/slic3r/GUI/GUI_App.cpp:297 -#, 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/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/libslic3r/PrintConfig.cpp:2153 +#: 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/libslic3r/PrintConfig.cpp:2254 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:456 +#: src/slic3r/GUI/Plater.cpp:544 msgid "Purging volumes" msgstr "Objętości czyszczenia" -#: src/libslic3r/PrintConfig.cpp:2106 +#: src/libslic3r/PrintConfig.cpp:2207 msgid "Purging volumes - load/unload volumes" msgstr "Objętość czyszczenia - objętość ładowania/rozładowania" -#: src/libslic3r/PrintConfig.cpp:2113 +#: src/libslic3r/PrintConfig.cpp:2214 msgid "Purging volumes - matrix" msgstr "Objętości czyszczenia - formuła" -#: src/slic3r/GUI/Tab.cpp:1019 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 +msgid "Quality" +msgstr "Jakość" + +#: src/slic3r/GUI/Tab.cpp:1080 msgid "Quality (slower slicing)" msgstr "Jakość (wolniejsze cięcie)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:854 src/slic3r/GUI/GUI_ObjectList.cpp:1139 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1145 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1377 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:273 +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 msgid "Quick Add Settings (%s)" msgstr "Szybkie Dodanie Ustawień (%s)" -#: src/slic3r/GUI/MainFrame.cpp:383 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Quick Slice" msgstr "Szybkie Cięcie" -#: src/slic3r/GUI/MainFrame.cpp:389 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Quick Slice and Save As" msgstr "Szybkie cięcie i Zapis jako" -#: src/slic3r/GUI/MainFrame.cpp:409 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:540 +#, c-format msgid "Quit %s" msgstr "Wyjście z %s" -#: src/libslic3r/PrintConfig.cpp:479 +#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511 msgid "Radius" msgstr "Promień" -#: src/slic3r/GUI/Tab.cpp:1066 +#: src/slic3r/GUI/Tab.cpp:1127 msgid "Raft" msgstr "Tratwa (raft)" -#: src/libslic3r/PrintConfig.cpp:1431 +#: src/libslic3r/PrintConfig.cpp:1501 msgid "Raft layers" msgstr "Warstwy tratwy" -#: src/slic3r/GUI/WipeTowerDialog.cpp:14 +#: src/slic3r/GUI/WipeTowerDialog.cpp:15 msgid "Ramming customization" msgstr "Dostosowywanie wyciskania" -#: src/slic3r/GUI/WipeTowerDialog.cpp:40 -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: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." -#: src/slic3r/GUI/WipeTowerDialog.cpp:90 +#: src/slic3r/GUI/WipeTowerDialog.cpp:91 msgid "Ramming line spacing" -msgstr "Rozmieszczenie linii wyciskania" +msgstr "Rozstaw linii wyciskania" -#: src/slic3r/GUI/WipeTowerDialog.cpp:88 +#: src/slic3r/GUI/WipeTowerDialog.cpp:89 msgid "Ramming line width" msgstr "Szerokość linii wyciskania" -#: src/libslic3r/PrintConfig.cpp:662 +#: src/libslic3r/PrintConfig.cpp:694 msgid "Ramming parameters" msgstr "Parametry wyciskania" -#: src/slic3r/GUI/Tab.cpp:1545 +#: src/slic3r/GUI/Tab.cpp:1505 msgid "Ramming settings" msgstr "Ustawienia wyciskania" -#: src/libslic3r/PrintConfig.cpp:1559 +#: src/libslic3r/PrintConfig.cpp:1629 msgid "Random" msgstr "Dowolny" -#: src/slic3r/GUI/wxExtensions.cpp:486 +#: src/slic3r/GUI/ObjectDataViewModel.cpp:94 msgid "Range" msgstr "Zakres" -#: src/libslic3r/SLAPrint.cpp:72 +#: src/libslic3r/SLAPrintSteps.cpp:65 msgid "Rasterizing layers" msgstr "Rasteryzowanie warstw" -#: src/slic3r/GUI/UpdateDialogs.cpp:151 +#: src/slic3r/GUI/MainFrame.cpp:596 +msgid "Re&load from disk" +msgstr "Wczytaj ponownie z d&ysku" + +#: src/slic3r/GUI/UpdateDialogs.cpp:249 msgid "Re-configure" msgstr "Ponowna konfiguracja" -#: src/slic3r/GUI/FirmwareDialog.cpp:783 +#: src/slic3r/GUI/FirmwareDialog.cpp:821 msgid "Ready" msgstr "Gotowe" -#: src/slic3r/GUI/Plater.cpp:2406 +#: src/slic3r/GUI/Plater.cpp:3115 msgid "Ready to slice" msgstr "Gotowość do cięcia" -#: src/slic3r/GUI/MainFrame.cpp:526 src/libslic3r/PrintConfig.cpp:1562 +#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632 msgid "Rear" msgstr "Tył" -#: src/slic3r/GUI/MainFrame.cpp:526 +#: src/slic3r/GUI/MainFrame.cpp:669 msgid "Rear View" msgstr "Widok z tyłu" -#: src/slic3r/GUI/MainFrame.cpp:401 +#: src/slic3r/GUI/MainFrame.cpp:413 msgid "Recent projects" -msgstr "Ostatnie projekty" +msgstr "Ostatni&e projekty" -#: src/slic3r/GUI/PresetHints.cpp:262 -#, possible-c-format +#: src/slic3r/GUI/PresetHints.cpp:263 +#, 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 +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 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:386 src/slic3r/GUI/GUI_App.cpp:395 +#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459 msgid "Recreating" msgstr "Odtwarzanie" -#: src/slic3r/GUI/BedShapeDialog.cpp:68 +#: src/slic3r/GUI/BedShapeDialog.cpp:73 msgid "Rectangular" msgstr "Prostokątny" -#: src/libslic3r/PrintConfig.cpp:398 src/libslic3r/PrintConfig.cpp:796 -#: src/libslic3r/PrintConfig.cpp:1922 +#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843 +#: src/libslic3r/PrintConfig.cpp:2009 msgid "Rectilinear" msgstr "Linie równoległe" -#: src/libslic3r/PrintConfig.cpp:1923 +#: src/libslic3r/PrintConfig.cpp:2010 msgid "Rectilinear grid" msgstr "Linie równoległe - kratka" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3639 -#: src/slic3r/GUI/MainFrame.cpp:562 +#: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131 +#: src/slic3r/GUI/MainFrame.cpp:584 msgid "Redo" msgstr "Powtórz" -#: src/slic3r/GUI/GLCanvas3D.cpp:3497 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 +#, c-format msgid "Redo %1$d Action" msgid_plural "Redo %1$d Actions" msgstr[0] "Powtórz %1$d akcję" @@ -4878,105 +5865,152 @@ 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:3479 +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 msgid "Redo History" msgstr "Historia Powtórzeń" -#: src/slic3r/GUI/Tab.cpp:1037 +#: src/slic3r/GUI/Tab.cpp:1098 msgid "Reducing printing time" msgstr "Obniżanie czasu wydruku" -#: src/slic3r/GUI/Plater.cpp:2924 -msgid "Reload from Disk" +#: src/slic3r/GUI/Plater.cpp:3452 +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 +msgid "Reload from disk" msgstr "Wczytaj ponownie z dysku" -#: src/slic3r/GUI/Plater.cpp:2924 -msgid "Reload the selected file from Disk" -msgstr "Wczytaj ponownie wybrany plik z dysku" +#: src/slic3r/GUI/Plater.cpp:3339 +msgid "Reload from:" +msgstr "Wczytaj z:" -#: src/slic3r/GUI/Preferences.cpp:36 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:134 +msgid "Reload plater from disk" +msgstr "Przeładuj wirtualny stół z dysku" + +#: src/slic3r/GUI/MainFrame.cpp:597 +msgid "Reload the plater from disk" +msgstr "Przeładuj wirtualny stół z dysku" + +#: src/slic3r/GUI/Plater.cpp:3963 +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 +msgid "Reload the selected volumes from disk" +msgstr "Wczytaj wybrane kształty ponownie z dysku" + +#: src/slic3r/GUI/Preferences.cpp:39 msgid "Remember output directory" msgstr "Zapamiętaj katalog wyjściowy" -#: src/slic3r/GUI/Tab.cpp:2935 +#: src/slic3r/GUI/Tab.cpp:3121 msgid "remove" msgstr "usuń" -#: src/slic3r/GUI/Tab.cpp:2937 +#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269 +#: src/slic3r/GUI/Tab.cpp:3124 msgid "Remove" msgstr "Usuń" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:859 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49 +msgid "Remove all holes" +msgstr "Usuń wszystkie otwory" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51 msgid "Remove all points" msgstr "Usuń wszystkie punkty" -#: src/slic3r/GUI/GLCanvas3D.cpp:3475 -msgid "Remove instance" -msgstr "Usuń kopię" +#: src/slic3r/GUI/GLCanvas3D.cpp:246 +msgid "Remove detail" +msgstr "Niższa szczegółowość" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 +#: 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 +msgid "Remove instance" +msgstr "Usuń instancję" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:160 msgid "Remove Instance of the selected object" -msgstr "Usuń kopię wybranego modelu" +msgstr "Usuń instancję zaznaczonego modelu" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:153 msgid "Remove layer range" msgstr "Usuń zakres warstw" -#: src/slic3r/GUI/Plater.cpp:3518 +#: src/slic3r/GUI/Plater.cpp:3942 msgid "Remove one instance of the selected object" -msgstr "Usuń jedną kopię wybranego modelu" +msgstr "Usuń jedną instancję zaznaczonego modelu" -#: src/slic3r/GUI/GUI_ObjectSettings.cpp:83 +#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95 msgid "Remove parameter" msgstr "Usuń parametr" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1230 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 msgid "Remove point" msgstr "Usuń punkt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1233 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367 msgid "Remove point from selection" msgstr "Usuń punkt z zaznaczenia" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:855 -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1237 -msgid "Remove selected points" -msgstr "Usuń wybrane punkty" +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48 +msgid "Remove selected holes" +msgstr "Usuń zaznaczone otwory" -#: src/slic3r/GUI/Plater.cpp:2891 src/slic3r/GUI/Plater.cpp:2909 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1371 +msgid "Remove selected points" +msgstr "Usuń zaznaczone punkty" + +#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953 msgid "Remove the selected object" msgstr "Usuń wybrany model" -#: src/slic3r/GUI/ConfigWizard.cpp:305 -msgid "Remove user profiles - install from scratch (a snapshot will be taken beforehand)" -msgstr "Usuń profile użytkownika - czysta instalacja (najpierw zostanie wykonany zrzut)" +#: src/slic3r/GUI/ConfigWizard.cpp:453 +msgid "Remove user profiles (a snapshot will be taken beforehand)" +msgstr "Usuń profile użytkownika (zostanie wykonany zrzut)" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1200 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1636 msgid "Rename" msgstr "Zmień nazwę" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:551 msgid "Rename Object" msgstr "Zmień Nazwę Modelu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:493 +#: src/slic3r/GUI/GUI_ObjectList.cpp:551 msgid "Rename Sub-object" msgstr "Zmień Nazwę Modelu Podrzędnego" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2709 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3803 msgid "Renaming" msgstr "Zmiana nazwy" -#: src/libslic3r/PrintConfig.cpp:3125 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115 +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 msgid "Render with a software renderer" msgstr "Renderuj programowo" -#: src/libslic3r/PrintConfig.cpp:3126 +#: src/libslic3r/PrintConfig.cpp:3516 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:772 src/libslic3r/PrintConfig.cpp:3058 +#: src/slic3r/GUI/MainFrame.cpp:911 src/libslic3r/PrintConfig.cpp:3447 msgid "Repair" msgstr "Naprawa" @@ -5000,279 +6034,310 @@ 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/KBShortcutsDialog.cpp:113 src/slic3r/GUI/MainFrame.cpp:395 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat last quick slice" msgstr "Powtórz ostatnie szybkie cięcie" -#: src/slic3r/GUI/MainFrame.cpp:395 +#: src/slic3r/GUI/MainFrame.cpp:524 msgid "Repeat Last Quick Slice" msgstr "Powtórz Ostatnie Szybkie Cięcie" -#: src/slic3r/GUI/MainFrame.cpp:561 +#: src/slic3r/GUI/Tab.cpp:3083 +msgid "Replace?" +msgstr "Zamienić?" + +#: src/slic3r/GUI/MainFrame.cpp:703 msgid "Report an I&ssue" msgstr "Zgło&szenie problemu" -#: src/slic3r/GUI/MainFrame.cpp:561 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:703 +#, c-format msgid "Report an issue on %s" msgstr "Zgłoś problem z %s" -#: src/slic3r/Utils/PresetUpdater.cpp:590 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:713 +#, c-format msgid "requires max. %s" msgstr "wymaga max %s" -#: src/slic3r/Utils/PresetUpdater.cpp:588 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:710 +#, c-format msgid "requires min. %s" msgstr "wymaga min. %s" -#: src/slic3r/Utils/PresetUpdater.cpp:583 -#, possible-c-format +#: src/slic3r/Utils/PresetUpdater.cpp:705 +#, c-format msgid "requires min. %s and max. %s" msgstr "wymaga min. %s i max. %s" -#: src/slic3r/GUI/FirmwareDialog.cpp:772 +#: src/slic3r/GUI/FirmwareDialog.cpp:810 msgid "Rescan" msgstr "Skanuj ponownie" -#: src/slic3r/GUI/Tab.cpp:1879 +#: src/slic3r/GUI/Tab.cpp:1906 msgid "Rescan serial ports" msgstr "Przeskanuj porty szeregowe" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1239 +#: src/slic3r/GUI/GLCanvas3D.cpp:313 +msgid "Reset" +msgstr "Reset" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1373 msgid "Reset clipping plane" msgstr "Reset płaszczyzny przecinania" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:928 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59 msgid "Reset direction" msgstr "Reset kierunku" -#: src/slic3r/GUI/Plater.cpp:2603 +#: src/slic3r/GUI/Plater.cpp:2723 msgid "Reset Project" msgstr "Resetuj Projekt" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:303 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363 msgid "Reset rotation" msgstr "Resetuj obrót" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:328 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385 msgid "Reset Rotation" msgstr "Resetuj Obrót" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:285 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:290 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399 msgid "Reset scale" msgstr "Resetuj skalę" -#: src/slic3r/GUI/Tab.cpp:2584 +#: src/slic3r/GUI/GLCanvas3D.cpp:252 +msgid "Reset to base" +msgstr "Resetuj do bazowego ust" + +#: src/slic3r/GUI/Tab.cpp:2394 msgid "Reset to Filament Color" msgstr "Zresetuj do koloru filamentu" -#: src/libslic3r/PrintConfig.cpp:1441 +#: src/libslic3r/PrintConfig.cpp:1511 msgid "Resolution" msgstr "Rozdzielczość" -#: src/libslic3r/PrintConfig.cpp:1459 +#: src/libslic3r/PrintConfig.cpp:1529 msgid "Retract amount before wipe" msgstr "Długość retrakcji przed ruchem czyszczącym" -#: src/libslic3r/PrintConfig.cpp:1467 +#: src/libslic3r/PrintConfig.cpp:1537 msgid "Retract on layer change" msgstr "Retrakcja przy zmianie warstwy" -#: src/slic3r/GUI/Tab.cpp:2268 +#: src/slic3r/GUI/Tab.cpp:1324 src/slic3r/GUI/Tab.cpp:1383 +#: src/slic3r/GUI/Tab.cpp:2370 msgid "Retraction" msgstr "Retrakcja" -#: src/libslic3r/PrintConfig.cpp:1453 +#: src/libslic3r/PrintConfig.cpp:1523 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:1474 +#: src/libslic3r/PrintConfig.cpp:1544 msgid "Retraction Length" msgstr "Długość retrakcji" -#: src/libslic3r/PrintConfig.cpp:1482 +#: src/libslic3r/PrintConfig.cpp:1552 msgid "Retraction Length (Toolchange)" msgstr "Długość Retrakcji (zmiana narzędzia)" -#: src/libslic3r/PrintConfig.cpp:1534 src/libslic3r/PrintConfig.cpp:1535 +#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605 msgid "Retraction Speed" msgstr "Prędkość retrakcji" -#: src/slic3r/GUI/Tab.cpp:2284 +#: src/slic3r/GUI/Tab.cpp:2386 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:244 +#: src/slic3r/GUI/GUI_Preview.cpp:254 msgid "Retractions" msgstr "Retrakcje" -#: src/slic3r/GUI/MainFrame.cpp:528 +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right" msgstr "Prawo" -#: src/slic3r/GUI/GUI_ObjectList.cpp:381 +#: src/slic3r/GUI/GUI_ObjectList.cpp:402 msgid "Right button click the icon to change the object printable property" -msgstr "Kliknij na ikonę prawym przyciskiem, aby zmienić możliwą do wydrukowania właściwość modelu" +msgstr "Kliknij na ikonę prawym przyciskiem, aby włączyć/wyłączyć drukowanie modelu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:396 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:250 +#: src/slic3r/GUI/GUI_ObjectList.cpp:359 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:1232 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364 msgid "Right click" msgstr "Prawy przycisk" -#: src/slic3r/GUI/MainFrame.cpp:528 +#: src/slic3r/GUI/GLCanvas3D.cpp:243 +msgid "Right mouse button:" +msgstr "Prawy przycisk myszki:" + +#: src/slic3r/GUI/MainFrame.cpp:673 msgid "Right View" msgstr "Widok prawy" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:233 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:253 -#: src/libslic3r/PrintConfig.cpp:3062 +#: 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 msgid "Rotate" msgstr "Obróć" -#: src/libslic3r/PrintConfig.cpp:3067 +#: src/libslic3r/PrintConfig.cpp:3456 msgid "Rotate around X" msgstr "Obróć wokół osi X" -#: src/libslic3r/PrintConfig.cpp:3072 +#: src/libslic3r/PrintConfig.cpp:3461 msgid "Rotate around Y" msgstr "Obróć wokół osi Y" -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:35 -#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:195 +#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170 msgid "Rotate lower part upwards" msgstr "Obróć dolną część do góry nogami" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:151 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:194 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:170 +msgid "Rotate selection 45 degrees CCW" +msgstr "Obróć zaznaczone o 45 stopni w lewo" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 +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 msgid "Rotation" msgstr "Obrót" -#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:491 -msgid "Rotation (deg)" -msgstr "Obrót (stopnie)" - -#: src/libslic3r/PrintConfig.cpp:3068 +#: src/libslic3r/PrintConfig.cpp:3457 msgid "Rotation angle around the X axis in degrees." msgstr "Kąt obrotu w stopniach wokół osi X." -#: src/libslic3r/PrintConfig.cpp:3073 +#: src/libslic3r/PrintConfig.cpp:3462 msgid "Rotation angle around the Y axis in degrees." msgstr "Kąt obrotu w stopniach wokół osi Y." -#: src/libslic3r/PrintConfig.cpp:3063 +#: src/libslic3r/PrintConfig.cpp:3452 msgid "Rotation angle around the Z axis in degrees." msgstr "Kąt obrotu w stopniach wokół osi Z." -#: src/slic3r/GUI/ConfigWizard.cpp:298 src/slic3r/GUI/GUI_App.cpp:658 -#, possible-c-format +#: src/slic3r/GUI/GUI_App.cpp:797 +#, c-format msgid "Run %s" msgstr "Uruchom %s" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:85 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:398 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478 msgid "Running post-processing scripts" msgstr "Wykonywanie skryptów przetwarzania końcowego (post-processing)" -#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/RammingChart.cpp:81 -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 src/libslic3r/PrintConfig.cpp:612 -#: src/libslic3r/PrintConfig.cpp:656 src/libslic3r/PrintConfig.cpp:671 -#: src/libslic3r/PrintConfig.cpp:2243 src/libslic3r/PrintConfig.cpp:2252 -#: src/libslic3r/PrintConfig.cpp:2312 src/libslic3r/PrintConfig.cpp:2319 +#: 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 msgid "s" msgstr "" -#: src/slic3r/GUI/MainFrame.cpp:466 src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:750 msgid "S&end G-code" -msgstr "W&yślij G-code" +msgstr "Wyślij G-cod&e" -#: src/slic3r/GUI/MainFrame.cpp:709 +#: src/slic3r/GUI/MainFrame.cpp:750 msgid "S&end to print" msgstr "W&yślij do druku" #. TRN Preset -#: src/slic3r/GUI/Tab.cpp:3264 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:3417 +#, c-format msgid "Save %s as:" msgstr "Zapisz %s jako:" -#: src/slic3r/GUI/MainFrame.cpp:686 -#, possible-c-format +#: src/slic3r/GUI/MainFrame.cpp:826 +#, c-format msgid "Save %s file as:" msgstr "Zapisz plik %s jako:" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1023 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046 msgid "Save changes?" msgstr "Zapisać zmiany?" -#: src/libslic3r/PrintConfig.cpp:2997 +#: src/libslic3r/PrintConfig.cpp:3386 msgid "Save config file" msgstr "Zapisz plik konfiguracyjny" -#: src/slic3r/GUI/MainFrame.cpp:786 +#: src/slic3r/GUI/MainFrame.cpp:925 msgid "Save configuration as:" msgstr "Zapisz konfigurację jako:" -#: src/libslic3r/PrintConfig.cpp:2998 +#: src/libslic3r/PrintConfig.cpp:3387 msgid "Save configuration to the specified file." msgstr "Zapisz konfigurację jako wskazany plik." #. TRN "Save current Settings" #: src/slic3r/GUI/Tab.cpp:133 -#, possible-c-format +#, c-format msgid "Save current %s" msgstr "Zapisz bieżące %s" -#: src/slic3r/GUI/MainFrame.cpp:341 +#: src/slic3r/GUI/MainFrame.cpp:446 msgid "Save current project file" msgstr "Zapisz obecny projekt" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save current project file as" msgstr "Zapisz obecny projekt jako" -#: src/slic3r/GUI/Plater.cpp:1938 +#: src/slic3r/GUI/Plater.cpp:2604 msgid "Save file as:" msgstr "Zapisz plik jako:" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/Plater.cpp:4839 msgid "Save G-code file as:" msgstr "Zapisz plik G-code jako:" -#: src/slic3r/GUI/MainFrame.cpp:757 +#: src/slic3r/GUI/MainFrame.cpp:899 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:417 +#: src/slic3r/GUI/Tab.hpp:443 msgid "Save preset" msgstr "Zapisz zestaw ustawień" -#: src/slic3r/GUI/MainFrame.cpp:843 +#: src/slic3r/GUI/MainFrame.cpp:980 msgid "Save presets bundle as:" msgstr "Zapisz paczkę ustawień jako:" -#: src/slic3r/GUI/MainFrame.cpp:343 +#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452 msgid "Save Project &as" msgstr "Zapisz Projekt j&ako" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:109 -msgid "Save project (3MF)" -msgstr "Zapisz projekt (3MF)" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +msgid "Save project (3mf)" +msgstr "Zapisz Projekt (3mf)" -#: src/slic3r/GUI/Plater.cpp:3433 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 +msgid "Save project as (3mf)" +msgstr "Zapisz Projekt jako (3mf)" + +#: src/slic3r/GUI/Plater.cpp:4839 msgid "Save SL1 file as:" msgstr "Zapisz plik SL1 jako:" -#: src/slic3r/GUI/MainFrame.cpp:692 +#: src/slic3r/GUI/MainFrame.cpp:838 msgid "Save zip file as:" msgstr "Zapisz plik .zip jako:" @@ -5282,58 +6347,63 @@ msgstr "Zapisz plik .zip jako:" msgid "Saving mesh into the 3MF container failed." msgstr "Niepowodzenie zapisywania siatki jako 3MF." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:152 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:234 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:254 -#: src/libslic3r/PrintConfig.cpp:3077 +#: 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 msgid "Scale" msgstr "Skaluj" -#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:276 -msgid "Scale (%)" -msgstr "Skala (%)" - -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:195 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459 msgid "Scale factors" msgstr "Współczynnik skalowania" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: 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 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:3086 +#: src/libslic3r/PrintConfig.cpp:3475 msgid "Scale to Fit" msgstr "Skaluj, aby dopasować" -#: src/slic3r/GUI/Selection.cpp:947 +#: src/slic3r/GUI/Selection.cpp:939 msgid "Scale To Fit" msgstr "Skaluj aby zmieścić" -#: src/libslic3r/PrintConfig.cpp:3087 +#: src/libslic3r/PrintConfig.cpp:3476 msgid "Scale to fit the given volume." msgstr "Skaluj, aby wypełnić zadaną objętość." -#: src/slic3r/GUI/GUI_ObjectList.cpp:1440 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1724 msgid "Scale to print volume" msgstr "Skaluj do obszaru roboczego" -#: src/libslic3r/PrintConfig.cpp:3078 +#: src/libslic3r/PrintConfig.cpp:3467 msgid "Scaling factor or percentage." msgstr "Współczynnik lub procent skalowania." -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:409 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505 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:1551 +#: src/libslic3r/PrintConfig.cpp:1621 msgid "Seam position" msgstr "Pozycja szwu" -#: src/libslic3r/PrintConfig.cpp:1572 +#: src/libslic3r/PrintConfig.cpp:1642 msgid "Seam preferred direction" msgstr "Preferowany kierunek szwu" -#: src/libslic3r/PrintConfig.cpp:1581 +#: src/libslic3r/PrintConfig.cpp:1651 msgid "Seam preferred direction jitter" msgstr "Kierunek jitter wyznaczany przez szew" @@ -5341,67 +6411,63 @@ msgstr "Kierunek jitter wyznaczany przez szew" msgid "Searching for devices" msgstr "Wyszukiwanie urządzeń" -#: src/slic3r/GUI/Plater.cpp:2190 +#: src/slic3r/GUI/Plater.cpp:2858 msgid "Searching for optimal orientation" msgstr "Wyszukiwanie optymalnej orientacji" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 -msgid "Select All objects" -msgstr "Zaznacz Wszystkie modele" +#: src/slic3r/GUI/GUI_App.cpp:1103 +msgid "Select a gcode file:" +msgstr "Wybierz plik gcode:" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1236 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +msgid "Select all objects" +msgstr "Zaznacz wszystkie modele" + +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1370 msgid "Select all points" msgstr "Zaznacz wszystkie punkty" -#: src/slic3r/GUI/ConfigWizard.cpp:1089 +#: src/slic3r/GUI/ConfigWizard.cpp:1976 msgid "Select all standard printers" msgstr "Zaznacz wszystkie podstawowe drukarki" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1234 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368 msgid "Select by rectangle" msgstr "Zaznaczenie prostokątem" -#: src/slic3r/GUI/MainFrame.cpp:806 src/slic3r/GUI/MainFrame.cpp:870 +#: src/slic3r/GUI/MainFrame.cpp:944 src/slic3r/GUI/MainFrame.cpp:1006 msgid "Select configuration to load:" msgstr "Wybierz konfigurację do wczytania:" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:60 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82 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:2834 -msgid "Select extruder number for selected objects and/or parts" -msgstr "Wybierz numer ekstrudera dla wybranych modeli i/lub części" - -#: src/slic3r/GUI/GUI_ObjectList.cpp:2847 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3971 msgid "Select extruder number:" msgstr "Wybierz numer ekstrudera:" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:117 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:138 msgid "Select Filament Settings Tab" msgstr "Wybierz Zakładkę Ustawień Filamentu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1251 -msgid "Select new extruder for the object/part" -msgstr "Wybierz nowy ekstruder dla modelu/części" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:114 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:136 msgid "Select Plater Tab" msgstr "Wybierz Zakładkę Podglądu Stołu" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:137 msgid "Select Print Settings Tab" msgstr "Wybierz Zakładkę Ustawień Druku" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:139 msgid "Select Printer Settings Tab" msgstr "Wybierz Zakładkę Ustawień Drukarki" -#: src/slic3r/GUI/GUI_ObjectList.cpp:917 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1265 msgid "Select showing settings" msgstr "Wybierz widok ustawień" -#: src/slic3r/GUI/GUI_App.cpp:524 +#: src/slic3r/GUI/GUI_App.cpp:629 msgid "Select the language" msgstr "Wybierz język" @@ -5413,45 +6479,55 @@ msgstr "Wybierz profile druku, z którymi kompatybilny jest ten profil." msgid "Select the printers this profile is compatible with." msgstr "Wybierz drukarki kompatybilne z tym profilem." -#: src/slic3r/GUI/MainFrame.cpp:744 +#: src/slic3r/GUI/MainFrame.cpp:889 msgid "Select the STL file to repair:" msgstr "Wybierz plik STL do naprawy:" -#: src/slic3r/GUI/Preferences.cpp:207 +#: src/slic3r/GUI/Preferences.cpp:237 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:2545 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3553 msgid "Select type of part" msgstr "Wybierz rodzaj części" -#: src/slic3r/GUI/Plater.cpp:606 +#: src/slic3r/GUI/Plater.cpp:638 msgid "Select what kind of pad do you need" msgstr "Wybierz rodzaj wymaganej podkładki" -#: src/slic3r/GUI/Plater.cpp:421 +#: src/slic3r/GUI/Plater.cpp:498 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/Selection.cpp:146 msgid "Selection-Add" msgstr "Zaznaczenie-Dodaj" -#: src/slic3r/GUI/Selection.cpp:384 +#: src/slic3r/GUI/Selection.cpp:376 msgid "Selection-Add All" msgstr "Zaznaczenie-Dodaj wszystko" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2875 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3299 msgid "Selection-Add from list" msgstr "Zaznaczenie-Dodaj z listy" -#: src/slic3r/GUI/GLCanvas3D.cpp:5623 +#: src/slic3r/GUI/GLCanvas3D.cpp:6598 msgid "Selection-Add from rectangle" msgstr "Zaznaczenie-Dodaj z prostokąta" #: src/slic3r/GUI/Selection.cpp:256 msgid "Selection-Add Instance" -msgstr "Zaznaczenie-Dodaj kopię" +msgstr "Zaznaczenie-Dodaj instancję" #: src/slic3r/GUI/Selection.cpp:219 msgid "Selection-Add Object" @@ -5461,15 +6537,15 @@ msgstr "Zaznaczenie-Dodaj Model" msgid "Selection-Remove" msgstr "Zaznaczenie-Usuń" -#: src/slic3r/GUI/Selection.cpp:410 +#: src/slic3r/GUI/Selection.cpp:402 msgid "Selection-Remove All" msgstr "Zaznaczenie-Usuń Wszystko" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2867 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3291 msgid "Selection-Remove from list" msgstr "Zaznaczenie-Usunięcie z listy" -#: src/slic3r/GUI/GLCanvas3D.cpp:5642 +#: src/slic3r/GUI/GLCanvas3D.cpp:6617 msgid "Selection-Remove from rectangle" msgstr "Zaznaczenie-Usuń z prostokąta" @@ -5481,11 +6557,11 @@ msgstr "Zaznaczenie-Usuń kopię" msgid "Selection-Remove Object" msgstr "Zaznaczenie-Usuń model" -#: src/slic3r/GUI/MainFrame.cpp:444 +#: src/slic3r/GUI/MainFrame.cpp:566 msgid "Selects all objects" msgstr "Zaznacza wszystkie modele" -#: src/slic3r/GUI/Plater.cpp:3822 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5522 msgid "Send G-code" msgstr "Wyślij G-code" @@ -5493,27 +6569,31 @@ 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:466 +#: src/slic3r/GUI/MainFrame.cpp:481 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:731 src/slic3r/GUI/Plater.cpp:3822 +#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5522 msgid "Send to printer" msgstr "Wyślij do drukarki" -#: src/slic3r/GUI/Tab.cpp:1169 +#: src/slic3r/GUI/GLCanvas3D.cpp:1305 +msgid "Seq." +msgstr "Sekw." + +#: src/slic3r/GUI/Tab.cpp:1231 msgid "Sequential printing" msgstr "Drukowanie sekwencyjne (model po modelu)" -#: src/slic3r/GUI/Tab.cpp:1874 src/libslic3r/PrintConfig.cpp:1591 +#: src/slic3r/GUI/Tab.cpp:1901 src/libslic3r/PrintConfig.cpp:1661 msgid "Serial port" msgstr "Port szeregowy" -#: src/libslic3r/PrintConfig.cpp:1599 +#: src/libslic3r/PrintConfig.cpp:1669 msgid "Serial port speed" msgstr "Szybkość portu szeregowego" -#: src/slic3r/GUI/FirmwareDialog.cpp:769 +#: src/slic3r/GUI/FirmwareDialog.cpp:807 msgid "Serial port:" msgstr "Port szeregowy:" @@ -5521,642 +6601,756 @@ msgstr "Port szeregowy:" msgid "Service name" msgstr "Nazwa usługi" -#: src/slic3r/GUI/Tab.cpp:1824 src/slic3r/GUI/Tab.cpp:2025 -#: src/slic3r/GUI/Tab.cpp:3008 +#: src/slic3r/GUI/Tab.cpp:1802 src/slic3r/GUI/Tab.cpp:2046 +#: src/slic3r/GUI/Tab.cpp:3176 msgid "Set" msgstr "Ustaw" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1192 -#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1599 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 msgid "Set as a Separated Object" msgstr "Ustaw jako osobny model" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1331 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1611 msgid "Set as a Separated Objects" msgstr "Ustaw jako Osobne Modele" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2833 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39 +msgid "Set extruder change for every" +msgstr "Ustaw zmianę ekstrudera dla każdej" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1671 msgid "Set extruder for selected items" msgstr "Ustaw ekstruder dla wybranych elementów" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23 +msgid "Set extruder sequence" +msgstr "Ustaw sekwencję ekstruderów" + +#: src/slic3r/GUI/DoubleSlider.cpp:1532 +msgid "Set extruder sequence for the entire print" +msgstr "Ustaw sekwencję ekstruderów dla całego wydruku" + +#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136 +msgid "Set extruder(tool) sequence" +msgstr "Ustaw sekwencję ekstruderów (narzędzi)" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:217 msgid "Set lower thumb to current slider thumb" msgstr "Ustaw punkt zmiany koloru na poziomie dolnego suwaka" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:245 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297 msgid "Set Mirror" msgstr "Ustaw Odbicie" -#: src/slic3r/GUI/Plater.cpp:3520 +#: src/slic3r/GUI/Plater.cpp:3944 msgid "Set number of instances" msgstr "Ustaw liczbę kopii" -#: src/slic3r/GUI/Plater.cpp:4163 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:4756 +#, c-format msgid "Set numbers of copies to %d" -msgstr "Ustaw ilość kopii na %d" +msgstr "Ustaw ilość instancji na %d" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:746 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781 msgid "Set Orientation" msgstr "Ustaw Orientację" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:715 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750 msgid "Set Position" msgstr "Ustaw Pozycję" -#: src/slic3r/GUI/GUI_ObjectList.cpp:3759 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Printable" -msgstr "Ustaw możliwe do wydrukowania" +msgstr "Zaznacz do drukowania" -#: src/slic3r/GUI/Selection.cpp:1482 +#: src/slic3r/GUI/Selection.cpp:1475 msgid "Set Printable Instance" -msgstr "Ustaw możliwą do wydrukowania kopię" +msgstr "Włącz drukowanie kopii" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:811 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846 msgid "Set Scale" msgstr "Ustaw Skalę" -#: src/libslic3r/PrintConfig.cpp:2228 +#: src/libslic3r/PrintConfig.cpp:2393 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:527 +#: src/slic3r/GUI/ConfigWizard.cpp:932 msgid "Set the shape of your printer's bed." msgstr "Ustaw kształt stołu roboczego drukarki." -#: src/libslic3r/PrintConfig.cpp:524 +#: src/libslic3r/PrintConfig.cpp:556 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." -#: src/libslic3r/PrintConfig.cpp:417 +#: src/libslic3r/PrintConfig.cpp:448 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." -#: src/libslic3r/PrintConfig.cpp:831 +#: src/libslic3r/PrintConfig.cpp:878 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." -#: src/libslic3r/PrintConfig.cpp:1689 +#: src/libslic3r/PrintConfig.cpp:1758 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." -#: src/libslic3r/PrintConfig.cpp:2019 +#: src/libslic3r/PrintConfig.cpp:2107 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." -#: src/libslic3r/PrintConfig.cpp:963 +#: src/libslic3r/PrintConfig.cpp:1011 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." -#: src/libslic3r/PrintConfig.cpp:1350 +#: src/libslic3r/PrintConfig.cpp:1419 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." -#: src/libslic3r/PrintConfig.cpp:1862 +#: src/libslic3r/PrintConfig.cpp:1948 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." -#: src/libslic3r/PrintConfig.cpp:480 +#: src/libslic3r/PrintConfig.cpp:512 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." -#: src/libslic3r/PrintConfig.cpp:65 +#: src/libslic3r/PrintConfig.cpp:81 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:469 +#: src/libslic3r/PrintConfig.cpp:501 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." -#: src/slic3r/GUI/GUI_ObjectList.cpp:3759 +#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474 msgid "Set Unprintable" -msgstr "Ustaw niemożliwe do wydrukowania" +msgstr "Zaznacz do ignorowania przy drukowaniu" -#: src/slic3r/GUI/Selection.cpp:1482 +#: src/slic3r/GUI/Selection.cpp:1475 msgid "Set Unprintable Instance" -msgstr "Ustaw niemożliwą do wydrukowania kopię" +msgstr "Ignoruj drukowanie kopii" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:216 msgid "Set upper thumb to current slider thumb" msgstr "Ustaw punkt zmiany koloru na poziomie górnego suwaka" -#: src/slic3r/GUI/BedShapeDialog.cpp:143 +#: 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/slic3r/GUI/BedShapeDialog.cpp:155 msgid "Settings" msgstr "Ustawienia" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2206 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2507 msgid "Settings for height range" msgstr "Ustawienie zakresu wysokości" -#: src/slic3r/GUI/BedShapeDialog.cpp:60 +#: src/slic3r/GUI/ConfigManipulation.cpp:162 +msgid "Shall I adjust those settings for supports?" +msgstr "Czy chcesz zmienić te ustawienia dla podpór?" + +#: src/slic3r/GUI/ConfigManipulation.cpp:89 +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 +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 +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 +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 msgid "Shape" msgstr "Kształt" -#: src/slic3r/GUI/GUI_Preview.cpp:246 +#: src/slic3r/GUI/GUI_Preview.cpp:256 msgid "Shells" msgstr "Powłoki" -#: src/slic3r/GUI/GUI_Preview.cpp:221 +#: src/slic3r/GUI/GLCanvas3D.cpp:249 +msgid "Shift + Left mouse button:" +msgstr "Shift + lewy przycisk myszki:" + +#: src/slic3r/GUI/GLCanvas3D.cpp:255 +msgid "Shift + Right mouse button:" +msgstr "Shift + Prawy przycisk myszki:" + +#: src/slic3r/GUI/GUI_Preview.cpp:231 msgid "Show" msgstr "Pokaż" -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show &Configuration Folder" -msgstr "Pokaż folder &Konfiguracyjny" +msgstr "Pokaż folder Konfigura&cyjny" -#: src/slic3r/GUI/MainFrame.cpp:563 +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Show &labels" +msgstr "Pokaż &etykiety" + +#: src/slic3r/GUI/MainFrame.cpp:705 msgid "Show about dialog" msgstr "Pokaż okienko" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show advanced settings" msgstr "Pokaż ustawienia zaawansowane" -#: src/slic3r/GUI/PrintHostDialogs.cpp:158 +#: src/slic3r/GUI/PrintHostDialogs.cpp:159 msgid "Show error message" msgstr "Pokaż komunikat błędu" -#: src/slic3r/GUI/Preferences.cpp:84 +#: src/slic3r/GUI/Preferences.cpp:95 msgid "Show incompatible print and filament presets" msgstr "Pokaż niekompatybilne ustawienia druku i filamentów" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:126 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 msgid "Show keyboard shortcuts list" msgstr "Pokaż listę skrótów klawiszowych" -#: src/slic3r/GUI/WipeTowerDialog.cpp:339 +#: src/slic3r/GUI/MainFrame.cpp:676 +msgid "Show object/instance labels in 3D scene" +msgstr "Pokaż etykiety modelu/kopii w widoku edycji 3D" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:377 msgid "Show simplified settings" msgstr "Pokaż ustawienia uproszczone" -#: src/slic3r/GUI/MainFrame.cpp:557 +#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52 +msgid "Show supports" +msgstr "Pokaż podpory" + +#: src/slic3r/GUI/MainFrame.cpp:699 msgid "Show system information" msgstr "Pokaż informacje o systemie" -#: src/slic3r/GUI/MainFrame.cpp:487 +#: src/slic3r/GUI/MainFrame.cpp:626 msgid "Show the 3D editing view" msgstr "Pokaż widok edycji 3D" -#: src/slic3r/GUI/MainFrame.cpp:489 +#: src/slic3r/GUI/MainFrame.cpp:629 msgid "Show the 3D slices preview" msgstr "Pokaż podgląd cięcia 3D" -#: src/slic3r/GUI/MainFrame.cpp:480 +#: src/slic3r/GUI/MainFrame.cpp:617 msgid "Show the filament settings" msgstr "Pokaż ustawienia filamentu" -#: src/libslic3r/PrintConfig.cpp:2983 +#: src/libslic3r/PrintConfig.cpp:3372 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:2988 +#: src/libslic3r/PrintConfig.cpp:3377 msgid "Show the full list of SLA print configuration options." msgstr "Pokaż pełną listę opcji konfiguracji druku SLA." -#: src/slic3r/GUI/MainFrame.cpp:566 +#: src/slic3r/GUI/MainFrame.cpp:708 msgid "Show the list of the keyboard shortcuts" msgstr "Pokaż listę skrótów klawiszowych" -#: src/slic3r/GUI/MainFrame.cpp:471 +#: src/slic3r/GUI/MainFrame.cpp:606 msgid "Show the plater" msgstr "Pokaż zawartość stołu" -#: src/slic3r/GUI/MainFrame.cpp:478 +#: src/slic3r/GUI/MainFrame.cpp:614 msgid "Show the print settings" msgstr "Pokaż ustawienia druku" -#: src/slic3r/GUI/MainFrame.cpp:483 +#: src/slic3r/GUI/MainFrame.cpp:621 msgid "Show the printer settings" msgstr "Pokaż ustawienia drukarki" -#: src/libslic3r/PrintConfig.cpp:2977 +#: src/libslic3r/PrintConfig.cpp:3366 msgid "Show this help." msgstr "Pokaż tą wskazówkę pomocy." -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/MainFrame.cpp:701 msgid "Show user configuration folder (datadir)" msgstr "Pokaż folder z konfiguracjami użytkownika (datadir)" #: src/slic3r/GUI/KBShortcutsDialog.cpp:185 -msgid "Show/Hide (L)egend" -msgstr "Pokaż/Ukryj (L)egendę" +msgid "Show/Hide 3Dconnexion devices settings dialog" +msgstr "Pokaż/ukryj ustawienia urządzeń 3Dconnexion" -#: src/slic3r/GUI/GUI_App.cpp:674 src/slic3r/GUI/wxExtensions.cpp:2459 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:208 +msgid "Show/Hide Legend" +msgstr "Pokaż/ukryj legendę" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:146 +msgid "Show/Hide object/instance labels" +msgstr "Ukryj/pokaż etykiety modelu/kopii" + +#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:753 msgid "Simple" msgstr "Prosty" -#: src/slic3r/GUI/GUI_App.cpp:674 +#: src/slic3r/GUI/ConfigWizard.cpp:820 +msgid "Simple mode" +msgstr "Tryb Prosty" + +#: src/slic3r/GUI/GUI_App.cpp:813 msgid "Simple View Mode" msgstr "Tryb Widoku Prostego" -#: src/slic3r/GUI/Tab.cpp:2231 src/slic3r/GUI/Tab.cpp:2239 +#: src/slic3r/GUI/Tab.cpp:2298 src/slic3r/GUI/Tab.cpp:2306 msgid "Single extruder MM setup" msgstr "Ustawienia MM dla jednego ekstrudera" -#: src/libslic3r/PrintConfig.cpp:1767 +#: src/libslic3r/PrintConfig.cpp:1845 msgid "Single Extruder Multi Material" msgstr "Multi Material z jednym ekstruderem" -#: src/slic3r/GUI/Tab.cpp:2023 -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: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:2240 +#: src/slic3r/GUI/Tab.cpp:2307 msgid "Single extruder multimaterial parameters" msgstr "Parametry multimaterial przy jednym ekstruderze" -#: src/slic3r/GUI/BedShapeDialog.cpp:72 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153 src/slic3r/GUI/Plater.cpp:137 -#: src/slic3r/GUI/Tab.cpp:2257 +#: 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 msgid "Size" msgstr "Rozmiar" -#: src/slic3r/GUI/Tab.cpp:1813 src/slic3r/GUI/Tab.cpp:2014 +#: src/slic3r/GUI/Tab.cpp:1797 src/slic3r/GUI/Tab.cpp:2041 msgid "Size and coordinates" msgstr "Rozmiar i koordynaty" -#: src/slic3r/GUI/BedShapeDialog.cpp:73 +#: src/slic3r/GUI/BedShapeDialog.cpp:78 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:235 src/slic3r/GUI/Tab.cpp:1050 -#: src/libslic3r/GCode/PreviewData.cpp:171 +#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1111 +#: src/libslic3r/ExtrusionEntity.cpp:318 msgid "Skirt" msgstr "Skirt" -#: src/slic3r/GUI/Tab.cpp:1049 +#: src/slic3r/GUI/Tab.cpp:1110 msgid "Skirt and brim" msgstr "Skirt i brim" -#: src/libslic3r/PrintConfig.cpp:1617 +#: src/libslic3r/PrintConfig.cpp:1687 msgid "Skirt height" msgstr "Wysokość skirt" -#: src/libslic3r/PrintConfig.cpp:1626 +#: src/libslic3r/PrintConfig.cpp:1696 msgid "Skirt Loops" msgstr "Liczba obrysów skirt" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1200 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1334 msgid "SLA gizmo keyboard shortcuts" msgstr "Skróty klawiszowe \"uchwytów\" SLA" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1150 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1058 msgid "SLA gizmo turned off" msgstr "Uchwyt SLA wyłączony" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1115 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1017 msgid "SLA gizmo turned on" msgstr "Uchwyt SLA włączony" -#: src/slic3r/GUI/Plater.cpp:684 src/slic3r/GUI/Preset.cpp:1277 +#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1524 msgid "SLA material" msgstr "Materiał SLA" -#: src/slic3r/GUI/Plater.cpp:683 src/slic3r/GUI/Preset.cpp:1276 +#: src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "SLA Material Profiles Selection" +msgstr "Wybór profili materiałów SLA" + +#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471 +msgid "SLA material type" +msgstr "Rodzaj materiału SLA" + +#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2015 +msgid "SLA Materials" +msgstr "Materiały SLA" + +#: src/slic3r/GUI/Preset.cpp:1523 msgid "SLA print" msgstr "Druk SLA" -#: src/libslic3r/PrintConfig.cpp:2331 +#: src/libslic3r/PrintConfig.cpp:2578 msgid "SLA print material notes" msgstr "Notatki dla materiału SLA" -#: src/slic3r/GUI/Plater.cpp:690 +#: src/slic3r/GUI/Plater.cpp:817 msgid "SLA print settings" msgstr "Ustawienia Druku SLA" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:997 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:996 msgid "SLA Support Points" msgstr "Punkty podpór SLA" -#: src/slic3r/GUI/GLCanvas3D.cpp:722 +#: 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/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/ConfigWizard.cpp:1530 +msgid "SLA Technology Printers" +msgstr "Drukarki SLA" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Slab" msgstr "Tafla" -#: src/libslic3r/PrintConfig.cpp:1268 +#: src/libslic3r/PrintConfig.cpp:1333 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." -#: src/libslic3r/PrintConfig.cpp:89 +#: src/libslic3r/PrintConfig.cpp:105 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:82 +#: 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/slic3r/GUI/ConfigSnapshotDialog.cpp:45 -msgid "slic3r version" -msgstr "wersja Slic3r" - -#: src/libslic3r/PrintConfig.cpp:1234 +#: src/libslic3r/PrintConfig.cpp:1299 msgid "Slic3r will not scale speed down below this speed." msgstr "Slic3r nie będzie skalował prędkości poniżej tej wartości." -#: src/libslic3r/PrintConfig.cpp:2970 +#: src/libslic3r/PrintConfig.cpp:3359 msgid "Slice" msgstr "Cięcie" -#: src/slic3r/GUI/MainFrame.cpp:383 +#: src/slic3r/GUI/MainFrame.cpp:512 msgid "Slice a file into a G-code" msgstr "Cięcie jako G-code" -#: src/slic3r/GUI/MainFrame.cpp:389 +#: src/slic3r/GUI/MainFrame.cpp:518 msgid "Slice a file into a G-code, save as" msgstr "Cięcie jako G-code, zapisz jako" -#: src/libslic3r/PrintConfig.cpp:71 +#: src/libslic3r/PrintConfig.cpp:87 msgid "Slice gap closing radius" msgstr "Promień zamykania szpar" -#: src/slic3r/GUI/Plater.cpp:734 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3618 +#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3121 +#: src/slic3r/GUI/Plater.cpp:5110 msgid "Slice now" msgstr "Cięcie" -#: src/libslic3r/PrintConfig.cpp:2944 +#: src/libslic3r/PrintConfig.cpp:3333 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:2965 +#: src/libslic3r/PrintConfig.cpp:3354 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:2971 +#: src/libslic3r/PrintConfig.cpp:3360 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:193 +#: src/slic3r/GUI/Plater.cpp:216 msgid "Sliced Info" msgstr "Informacje o cięciu" -#: src/slic3r/GUI/MainFrame.cpp:704 src/slic3r/GUI/Plater.cpp:2412 -#: src/slic3r/GUI/Plater.cpp:3615 src/slic3r/GUI/Tab.cpp:1159 -#: src/slic3r/GUI/Tab.cpp:3436 +#: 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 msgid "Slicing" msgstr "Cięcie" -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:91 -#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134 +#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184 msgid "Slicing complete" msgstr "Cięcie zakończone" -#: src/libslic3r/SLAPrint.cpp:1459 +#: src/libslic3r/SLAPrint.cpp:760 msgid "Slicing done" msgstr "Cięcie zakończone" -#: src/slic3r/GUI/MainFrame.cpp:729 +#: src/slic3r/GUI/MainFrame.cpp:874 msgid "Slicing Done!" msgstr "Cięcie zakończone!" -#: src/libslic3r/SLAPrint.cpp:759 +#: src/libslic3r/SLAPrintSteps.cpp:245 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/SLAPrint.cpp:55 +#: src/libslic3r/SLAPrintSteps.cpp:45 msgid "Slicing model" msgstr "Cięcie modelu" -#: src/libslic3r/SLAPrint.cpp:59 +#: src/libslic3r/SLAPrintSteps.cpp:49 msgid "Slicing supports" msgstr "Cięcie podpór" -#: src/libslic3r/PrintConfig.cpp:2249 +#: src/libslic3r/PrintConfig.cpp:2414 msgid "Slow" msgstr "Wolne" -#: src/libslic3r/PrintConfig.cpp:1635 +#: src/libslic3r/PrintConfig.cpp:1705 msgid "Slow down if layer print time is below" msgstr "Zwolnij jeśli czas warstwy wynosi mniej niż" -#: src/libslic3r/PrintConfig.cpp:2250 +#: src/libslic3r/PrintConfig.cpp:2415 msgid "Slow tilt" msgstr "Wolne przechylanie" -#: src/libslic3r/PrintConfig.cpp:1646 +#: src/libslic3r/PrintConfig.cpp:1715 msgid "Small perimeters" msgstr "Małe obrysy" -#: src/slic3r/GUI/GUI_App.cpp:697 +#: src/slic3r/GUI/GLCanvas3D.cpp:288 +msgid "Smooth" +msgstr "Gładki" + +#: src/slic3r/GUI/GLCanvas3D.cpp:258 +msgid "Smoothing" +msgstr "Wygładzanie" + +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Snapshot name" msgstr "Nazwa zrzutu" -#: src/slic3r/GUI/MainFrame.cpp:549 +#: src/slic3r/GUI/MainFrame.cpp:686 msgid "Software &Releases" -msgstr "Wersje oprogramowania" +msgstr "Wersje oprog&ramowania" -#: src/slic3r/GUI/PresetHints.cpp:181 +#: src/slic3r/GUI/PresetHints.cpp:184 msgid "solid infill" msgstr "zwarte wypełnienie" -#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/PrintConfig.cpp:1687 -#: src/libslic3r/PrintConfig.cpp:1697 src/libslic3r/GCode/PreviewData.cpp:167 +#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314 +#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767 msgid "Solid infill" msgstr "Zwarte wypełnienie" -#: src/libslic3r/PrintConfig.cpp:1675 +#: src/libslic3r/PrintConfig.cpp:1744 msgid "Solid infill every" msgstr "Zwarte wypełnienie co" -#: src/libslic3r/PrintConfig.cpp:1667 +#: src/libslic3r/PrintConfig.cpp:1736 msgid "Solid infill extruder" msgstr "Ekstruder do zwartego wypełnienia" -#: src/libslic3r/PrintConfig.cpp:1658 +#: src/libslic3r/PrintConfig.cpp:1727 msgid "Solid infill threshold area" -msgstr "Próg powierzchni zwartego wypełnienia" +msgstr "Min. powierzchnia zwartego wypełnienia" -#: src/slic3r/GUI/Tab.cpp:1014 src/libslic3r/PrintConfig.cpp:1710 +#: src/slic3r/GUI/Tab.cpp:1065 src/libslic3r/PrintConfig.cpp:1780 msgid "Solid layers" msgstr "Zwarte warstwy" -#: src/libslic3r/PrintConfig.cpp:711 +#: src/libslic3r/PrintConfig.cpp:754 msgid "Soluble material" msgstr "Materiał rozpuszczalny" -#: src/libslic3r/PrintConfig.cpp:712 +#: src/libslic3r/PrintConfig.cpp:755 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:914 +#: src/libslic3r/PrintConfig.cpp:937 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:721 -msgid "Some objects are not visible when editing supports" -msgstr "Niektóre elementy nie będą widoczne podczas edytowania podpór" +#: src/slic3r/GUI/GLCanvas3D.cpp:688 +msgid "Some objects are not visible" +msgstr "Niektóre obiekty są niewidoczne" -#: src/libslic3r/Print.cpp:1162 +#: src/libslic3r/Print.cpp:1226 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:1177 +#: src/libslic3r/Print.cpp:1228 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." -#: src/libslic3r/PrintConfig.cpp:2548 +#: src/libslic3r/PrintConfig.cpp:2824 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:2086 +#: src/libslic3r/PrintConfig.cpp:2187 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:1897 +#: src/libslic3r/PrintConfig.cpp:1984 msgid "Spacing between interface lines. Set zero to get a solid interface." -msgstr "Rozmieszczenie linii warstwy łączącej. Ustaw zero dla zwartej warstwy łączącej." +msgstr "Rozstaw linii warstwy łączącej. Ustaw zero dla zwartej warstwy łączącej." -#: src/libslic3r/PrintConfig.cpp:1931 +#: src/libslic3r/PrintConfig.cpp:2018 msgid "Spacing between support material lines." -msgstr "Rozmieszczenie linii materiału podporowego." +msgstr "Rozstaw linii materiału podporowego." -#: src/slic3r/GUI/GUI_ObjectList.cpp:71 src/slic3r/GUI/GUI_ObjectList.cpp:512 -#: src/slic3r/GUI/GUI_Preview.cpp:215 src/slic3r/GUI/Tab.cpp:1084 -#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:426 -#: src/libslic3r/PrintConfig.cpp:871 src/libslic3r/PrintConfig.cpp:999 -#: src/libslic3r/PrintConfig.cpp:1361 src/libslic3r/PrintConfig.cpp:1598 -#: src/libslic3r/PrintConfig.cpp:1647 src/libslic3r/PrintConfig.cpp:1698 -#: src/libslic3r/PrintConfig.cpp:2029 +#: 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 msgid "Speed" msgstr "Prędkość" -#: src/libslic3r/PrintConfig.cpp:1600 +#: 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:400 +#: src/libslic3r/GCode/PreviewData.cpp:351 msgid "Speed (mm/s)" msgstr "Prędkość (mm/s)" -#: src/libslic3r/PrintConfig.cpp:872 +#: src/libslic3r/PrintConfig.cpp:920 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." -#: src/slic3r/GUI/Tab.cpp:1097 +#: src/slic3r/GUI/Tab.cpp:1158 msgid "Speed for non-print moves" msgstr "Prędkość ruchów jałowych" -#: src/libslic3r/PrintConfig.cpp:1362 +#: src/libslic3r/PrintConfig.cpp:1432 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:1085 +#: src/slic3r/GUI/Tab.cpp:1146 msgid "Speed for print moves" msgstr "Prędkość ruchów drukujących" -#: src/libslic3r/PrintConfig.cpp:200 +#: src/libslic3r/PrintConfig.cpp:236 msgid "Speed for printing bridges." msgstr "Prędkość drukowania mostów." -#: src/libslic3r/PrintConfig.cpp:1699 +#: src/libslic3r/PrintConfig.cpp:1769 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:1906 +#: src/libslic3r/PrintConfig.cpp:1993 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:1940 +#: src/libslic3r/PrintConfig.cpp:2027 msgid "Speed for printing support material." msgstr "Prędkość druku materiału podporowego." -#: src/libslic3r/PrintConfig.cpp:1000 +#: src/libslic3r/PrintConfig.cpp:1049 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:2030 +#: src/libslic3r/PrintConfig.cpp:2119 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:2052 +#: src/libslic3r/PrintConfig.cpp:2153 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:627 +#: src/libslic3r/PrintConfig.cpp:659 msgid "Speed of the first cooling move" msgstr "Prędkość pierwszego ruchu chłodzącego" -#: src/libslic3r/PrintConfig.cpp:646 +#: src/libslic3r/PrintConfig.cpp:678 msgid "Speed of the last cooling move" msgstr "Prędkość ostatniego ruchu chłodzącego" -#: src/libslic3r/PrintConfig.cpp:585 +#: src/libslic3r/PrintConfig.cpp:616 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:577 +#: src/libslic3r/PrintConfig.cpp:608 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:593 +#: src/libslic3r/PrintConfig.cpp:624 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:602 +#: src/libslic3r/PrintConfig.cpp:633 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/GUI_ObjectList.cpp:1055 +#: src/slic3r/GUI/Mouse3DController.cpp:296 +msgid "Speed:" +msgstr "Prędkość:" + +#: src/slic3r/GUI/GUI_ObjectList.cpp:1432 msgid "Sphere" msgstr "Kula" -#: src/libslic3r/PrintConfig.cpp:1717 +#: src/libslic3r/PrintConfig.cpp:1794 msgid "Spiral vase" msgstr "Tryb wazy" -#: src/slic3r/GUI/Plater.cpp:2971 src/slic3r/GUI/Plater.cpp:2988 -#: src/slic3r/GUI/Plater.cpp:3008 src/libslic3r/PrintConfig.cpp:3082 +#: src/slic3r/GUI/ConfigManipulation.cpp:90 +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 msgid "Split" msgstr "Podziel" -#: src/slic3r/GUI/Plater.cpp:2971 +#: src/slic3r/GUI/Plater.cpp:4019 msgid "Split the selected object" msgstr "Podziel zaznaczony model" -#: src/slic3r/GUI/Plater.cpp:2966 src/slic3r/GUI/Plater.cpp:2988 +#: src/slic3r/GUI/Plater.cpp:4014 src/slic3r/GUI/Plater.cpp:4034 msgid "Split the selected object into individual objects" -msgstr "Podziel wybrany model na osobne części" +msgstr "Podziel wybrany model na osobne modele" -#: src/slic3r/GUI/Plater.cpp:2968 src/slic3r/GUI/Plater.cpp:3008 +#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4048 msgid "Split the selected object into individual sub-parts" -msgstr "Podziel wybrany model na osobne elementy" +msgstr "Podziel wybrany model na części" -#: src/slic3r/GUI/GLCanvas3D.cpp:3490 +#: src/slic3r/GUI/GLCanvas3D.cpp:4550 msgid "Split to objects" msgstr "Podziel na osobne modele" -#: src/slic3r/GUI/Plater.cpp:2796 +#: src/slic3r/GUI/Plater.cpp:2981 msgid "Split to Objects" msgstr "Podziel na modele" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1110 +#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1487 msgid "Split to parts" msgstr "Podziel na części" -#: src/slic3r/GUI/GUI_ObjectList.cpp:1904 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2274 msgid "Split to Parts" msgstr "Podziel na części" -#: src/libslic3r/PrintConfig.cpp:799 +#: src/slic3r/GUI/ConfigWizard.cpp:289 +msgid "Standard" +msgstr "Standard" + +#: src/libslic3r/PrintConfig.cpp:846 msgid "Stars" msgstr "Gwiazdki" -#: src/slic3r/GUI/MainFrame.cpp:376 +#: src/slic3r/GUI/MainFrame.cpp:405 msgid "Start a new project" msgstr "Rozpocznij nowy projekt" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 msgid "Start at height" -msgstr "Rozpocznij na zadanej wysokości" +msgstr "Zakres od" -#: src/slic3r/GUI/Tab.cpp:1564 src/slic3r/GUI/Tab.cpp:1949 -#: src/libslic3r/PrintConfig.cpp:1736 src/libslic3r/PrintConfig.cpp:1751 +#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1976 +#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828 msgid "Start G-code" msgstr "G-code startowy" -#: src/slic3r/GUI/MainFrame.cpp:403 +#: src/slic3r/GUI/MainFrame.cpp:532 msgid "Start new slicing process" msgstr "Uruchom nowy proces cięcia" @@ -6164,724 +7358,936 @@ msgstr "Uruchom nowy proces cięcia" msgid "Start printing after upload" msgstr "Zacznij druk po przesłaniu" -#: src/slic3r/GUI/PrintHostDialogs.cpp:150 +#: src/slic3r/GUI/PrintHostDialogs.cpp:151 msgid "Status" msgstr "Stan" -#: src/slic3r/GUI/FirmwareDialog.cpp:782 +#: src/slic3r/GUI/FirmwareDialog.cpp:820 msgid "Status:" msgstr "Stan:" -#: src/slic3r/GUI/Tab.cpp:2158 +#: src/slic3r/GUI/Tab.cpp:2209 msgid "Stealth" msgstr "Stealth" -#: src/slic3r/GUI/Plater.cpp:1084 +#: src/slic3r/GUI/Plater.cpp:1291 msgid "stealth mode" msgstr "tryb stealth" -#: src/slic3r/GUI/Plater.cpp:3545 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:4985 +#, c-format msgid "STL file exported to %s" msgstr "Plik STL wyeksportowany do %s" #: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 msgid "Stop at height" -msgstr "Zatrzymaj na danej wysokości" +msgstr "Zakres do" -#: src/slic3r/GUI/Tab.cpp:1716 src/slic3r/GUI/Tab.cpp:1901 +#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:1928 msgid "Success!" msgstr "Powodzenie!" -#: src/slic3r/GUI/PresetHints.cpp:200 +#: src/slic3r/GUI/PresetHints.cpp:203 msgid "support" msgstr "podpora" -#: src/libslic3r/PrintConfig.cpp:2441 +#: src/libslic3r/PrintConfig.cpp:2692 msgid "Support base diameter" msgstr "Średnica stopy podpory" -#: src/libslic3r/PrintConfig.cpp:2451 +#: src/libslic3r/PrintConfig.cpp:2702 msgid "Support base height" msgstr "Wysokość stopy podpory" -#: src/libslic3r/PrintConfig.cpp:2566 +#: src/libslic3r/PrintConfig.cpp:2711 msgid "Support base safety distance" msgstr "Bezpieczna odległość stopy podpory" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Support Blocker" msgstr "Blokada podpór" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2547 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3551 msgid "Support Enforcer" msgstr "Wymuszenie podpór" -#: src/slic3r/GUI/Tab.cpp:3401 +#: src/slic3r/GUI/ConfigManipulation.cpp:163 +msgid "Support Generator" +msgstr "Generator podpór" + +#: src/slic3r/GUI/Tab.cpp:3608 msgid "Support head" msgstr "Łącznik podpory" -#: src/libslic3r/PrintConfig.cpp:2369 +#: src/libslic3r/PrintConfig.cpp:2620 msgid "Support head front diameter" msgstr "Średnica początku łącznika" -#: src/libslic3r/PrintConfig.cpp:2378 +#: src/libslic3r/PrintConfig.cpp:2629 msgid "Support head penetration" msgstr "Przenikanie łączników podpór" -#: src/libslic3r/PrintConfig.cpp:2387 +#: src/libslic3r/PrintConfig.cpp:2638 msgid "Support head width" msgstr "Szerokość łączników podpór" -#: src/slic3r/GUI/PresetHints.cpp:210 +#: src/slic3r/GUI/PresetHints.cpp:213 msgid "support interface" msgstr "warstwa łącząca podpory z modelem" -#: src/slic3r/GUI/GUI_ObjectList.cpp:30 src/slic3r/GUI/GUI_ObjectList.cpp:70 -#: src/slic3r/GUI/GUI_ObjectList.cpp:511 src/slic3r/GUI/GUI_Preview.cpp:236 -#: src/slic3r/GUI/Tab.cpp:1059 src/slic3r/GUI/Tab.cpp:1060 -#: src/libslic3r/PrintConfig.cpp:334 src/libslic3r/PrintConfig.cpp:1432 -#: src/libslic3r/PrintConfig.cpp:1780 src/libslic3r/PrintConfig.cpp:1786 -#: src/libslic3r/PrintConfig.cpp:1794 src/libslic3r/PrintConfig.cpp:1806 -#: src/libslic3r/PrintConfig.cpp:1816 src/libslic3r/PrintConfig.cpp:1824 -#: src/libslic3r/PrintConfig.cpp:1839 src/libslic3r/PrintConfig.cpp:1860 -#: src/libslic3r/PrintConfig.cpp:1871 src/libslic3r/PrintConfig.cpp:1887 -#: src/libslic3r/PrintConfig.cpp:1896 src/libslic3r/PrintConfig.cpp:1905 -#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1930 -#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1939 -#: src/libslic3r/PrintConfig.cpp:1948 src/libslic3r/PrintConfig.cpp:1956 -#: src/libslic3r/PrintConfig.cpp:1970 src/libslic3r/GCode/PreviewData.cpp:172 +#: 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 msgid "Support material" msgstr "Materiał podporowy" -#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/PrintConfig.cpp:1904 -#: src/libslic3r/GCode/PreviewData.cpp:173 +#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320 +#: src/libslic3r/PrintConfig.cpp:1991 msgid "Support material interface" msgstr "Warstwa łącząca podpory z modelem" -#: src/libslic3r/PrintConfig.cpp:1957 +#: src/libslic3r/PrintConfig.cpp:2044 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:1877 +#: src/libslic3r/PrintConfig.cpp:1964 msgid "Support material/raft interface extruder" msgstr "Ekstruder dla podpór/warstw łączących raft z modelem" -#: src/libslic3r/PrintConfig.cpp:1851 +#: src/libslic3r/PrintConfig.cpp:1937 msgid "Support material/raft/skirt extruder" msgstr "Ekstruder dla podpór/tratwy (raft)/skirtu" -#: src/slic3r/GUI/Plater.cpp:423 src/libslic3r/PrintConfig.cpp:1815 -#: src/libslic3r/PrintConfig.cpp:2423 +#: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901 +#: src/libslic3r/PrintConfig.cpp:2674 msgid "Support on build plate only" -msgstr "Podpory jedynie na powierzchni stołu" +msgstr "Podpory tylko na stole" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:991 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888 msgid "Support parameter change" msgstr "Zmiana parametrów podpór" -#: src/slic3r/GUI/Tab.cpp:3406 +#: src/slic3r/GUI/Tab.cpp:3613 msgid "Support pillar" msgstr "Słupek podpory" -#: src/libslic3r/PrintConfig.cpp:2407 +#: src/libslic3r/PrintConfig.cpp:2658 msgid "Support pillar connection mode" msgstr "Tryb łączenia słupków podpór" -#: src/libslic3r/PrintConfig.cpp:2397 +#: src/libslic3r/PrintConfig.cpp:2648 msgid "Support pillar diameter" msgstr "Średnica słupków podpór" -#: src/libslic3r/PrintConfig.cpp:2499 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55 +#: src/libslic3r/PrintConfig.cpp:2764 msgid "Support points density" msgstr "Gęstość punktów podpór" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1282 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1196 msgid "Support points edit" msgstr "Edycja punktów podpór" -#: src/slic3r/GUI/GUI_ObjectList.cpp:78 src/slic3r/GUI/GUI_ObjectList.cpp:519 -#: src/slic3r/GUI/Plater.cpp:418 src/slic3r/GUI/Tab.cpp:3397 -#: src/slic3r/GUI/Tab.cpp:3398 src/libslic3r/PrintConfig.cpp:2363 -#: src/libslic3r/PrintConfig.cpp:2370 src/libslic3r/PrintConfig.cpp:2379 -#: src/libslic3r/PrintConfig.cpp:2388 src/libslic3r/PrintConfig.cpp:2398 -#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2431 -#: src/libslic3r/PrintConfig.cpp:2442 src/libslic3r/PrintConfig.cpp:2452 -#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2471 -#: src/libslic3r/PrintConfig.cpp:2480 src/libslic3r/PrintConfig.cpp:2490 -#: src/libslic3r/PrintConfig.cpp:2500 src/libslic3r/PrintConfig.cpp:2508 +#: 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 msgid "Supports" msgstr "Podpory" -#: src/slic3r/GUI/Plater.cpp:1018 +#: src/slic3r/GUI/Plater.cpp:1194 msgid "supports and pad" msgstr "podpory i podkładka" -#: src/libslic3r/PrintConfig.cpp:1043 +#: src/libslic3r/PrintConfig.cpp:1092 msgid "Supports remaining times" msgstr "Obsługa pozostałego czasu druku" -#: src/libslic3r/PrintConfig.cpp:1053 +#: src/libslic3r/PrintConfig.cpp:1101 msgid "Supports stealth mode" msgstr "Wspiera tryb Stealth" -#: src/slic3r/GUI/Preferences.cpp:76 +#: 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/Preferences.cpp:87 msgid "Suppress \" - default - \" presets" msgstr "Ukryj \" - domyślne - \" zestawy ustawień" -#: src/slic3r/GUI/Preferences.cpp:78 +#: src/slic3r/GUI/Preferences.cpp:89 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:677 +#: src/slic3r/GUI/MainFrame.cpp:826 msgid "SVG" msgstr "SVG" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:119 +#: src/slic3r/GUI/DoubleSlider.cpp:1144 +msgid "Switch code to Change extruder" +msgstr "Przełącz kod na zmianę ekstrudera" + +#: src/slic3r/GUI/DoubleSlider.cpp:1179 +msgid "Switch code to Color change (%1%) for:" +msgstr "Zmień kod na zmianę koloru (%1%) dla:" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:140 msgid "Switch to 3D" msgstr "Przełącz na 3D" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1242 +#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1376 msgid "Switch to editing mode" msgstr "Tryb edycji" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:141 msgid "Switch to Preview" -msgstr "Przełącz na Podgląd" +msgstr "Przełącz na Podgląd cięcia" -#: src/slic3r/GUI/wxExtensions.cpp:2412 -#, possible-c-format +#: src/slic3r/GUI/wxExtensions.cpp:703 +#, c-format msgid "Switch to the %s mode" msgstr "Przełącz na tryb %s" -#: src/slic3r/GUI/GUI_App.cpp:752 -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/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/WipeTowerDialog.cpp:327 -msgid "Switching to simple settings will discard changes done in the advanced mode!\n\nDo you want to proceed?" +#: 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 "Włączenie trybu prostego spowoduje odrzucenie zmian wprowadzonych w trybie zaawansowanym! Czy chcesz kontynować?" -#: src/libslic3r/PrintConfig.cpp:1949 +#: src/slic3r/GUI/Tab.cpp:1014 +msgid "symbolic profile name" +msgstr "skrócona nazwa profilu" + +#: src/libslic3r/PrintConfig.cpp:2036 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:1947 +#: src/libslic3r/PrintConfig.cpp:2034 msgid "Synchronize with object layers" msgstr "Synchronizuj z warstwami modelu" -#: src/slic3r/GUI/MainFrame.cpp:557 +#: src/slic3r/GUI/MainFrame.cpp:699 msgid "System &Info" msgstr "&Informacje o Systemie" -#: src/slic3r/GUI/SysInfoDialog.cpp:44 +#: src/slic3r/GUI/SysInfoDialog.cpp:78 msgid "System Information" msgstr "Informacje o systemie" -#: src/slic3r/GUI/Preset.cpp:930 src/slic3r/GUI/Preset.cpp:970 -#: src/slic3r/GUI/Preset.cpp:1035 src/slic3r/GUI/Preset.cpp:1067 -#: src/slic3r/GUI/PresetBundle.cpp:1488 src/slic3r/GUI/PresetBundle.cpp:1553 +#: 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 msgid "System presets" msgstr "Ustawienia systemowe" -#: src/slic3r/GUI/GUI_App.cpp:662 +#: src/slic3r/GUI/GUI_App.cpp:801 msgid "Take Configuration &Snapshot" -msgstr "Wykonaj Zr&zut Konfiguracji" +msgstr "Wykonaj Zrzu&t Konfiguracji" -#: src/slic3r/GUI/GUI_App.cpp:697 +#: src/slic3r/GUI/GUI_App.cpp:839 msgid "Taking configuration snapshot" msgstr "Zrzucanie konfiguracji" -#: src/libslic3r/PrintConfig.cpp:1980 +#: src/slic3r/GUI/Tab.cpp:1433 src/libslic3r/PrintConfig.cpp:2067 msgid "Temperature" msgstr "Temperatura" -#: src/libslic3r/PrintConfig.cpp:1727 +#: src/libslic3r/PrintConfig.cpp:1804 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:1726 +#: src/libslic3r/PrintConfig.cpp:1803 msgid "Temperature variation" msgstr "Zmiana temperatury" -#: src/slic3r/GUI/ConfigWizard.cpp:592 +#: src/slic3r/GUI/ConfigWizard.cpp:1017 msgid "Temperatures" msgstr "Temperatury" -#: src/slic3r/GUI/Tab.cpp:1700 src/slic3r/GUI/Tab.cpp:1888 +#: src/slic3r/GUI/Tab.cpp:1677 src/slic3r/GUI/Tab.cpp:1915 msgid "Test" msgstr "Test" -#: src/slic3r/GUI/BedShapeDialog.cpp:171 +#: src/slic3r/GUI/BedShapeDialog.cpp:172 msgid "Texture" msgstr "Tekstura" -#: src/slic3r/GUI/FirmwareDialog.cpp:530 -#, possible-c-format +#: src/slic3r/GUI/ConfigManipulation.cpp:208 +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 msgid "The %s device could not have been found" msgstr "Nie znaleziono urządzenia %s" -#: src/slic3r/GUI/FirmwareDialog.cpp:417 -#, 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/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 ..." -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:640 -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/slic3r/GUI/Tab.cpp:976 +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/libslic3r/PrintConfig.cpp:2462 +#: 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/libslic3r/PrintConfig.cpp:2726 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:670 +#: src/libslic3r/SLAPrint.cpp:631 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\"." -#: src/libslic3r/PrintConfig.cpp:457 +#: src/libslic3r/PrintConfig.cpp:489 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:955 +#: src/libslic3r/PrintConfig.cpp:1003 msgid "The extruder to use when printing infill." msgstr "Ekstruder używany do druku wypełnienia." -#: src/libslic3r/PrintConfig.cpp:1341 +#: src/libslic3r/PrintConfig.cpp:1410 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:1669 +#: src/libslic3r/PrintConfig.cpp:1738 msgid "The extruder to use when printing solid infill." msgstr "Ekstruder używany do druku zwartego wypełnienia." -#: src/libslic3r/PrintConfig.cpp:1879 +#: src/libslic3r/PrintConfig.cpp:1966 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)." -#: src/libslic3r/PrintConfig.cpp:1853 +#: src/libslic3r/PrintConfig.cpp:1939 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:695 +#: src/libslic3r/PrintConfig.cpp:727 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:3105 +#: src/libslic3r/PrintConfig.cpp:3494 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:1054 +#: src/libslic3r/PrintConfig.cpp:1102 msgid "The firmware supports stealth mode" msgstr "Firmware wspiera tryb Stealth" -#: src/libslic3r/PrintConfig.cpp:351 +#: src/libslic3r/PrintConfig.cpp:120 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)." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2726 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2813 src/slic3r/GUI/Tab.cpp:3279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3820 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3457 msgid "the following characters are not allowed:" msgstr "następujące znaki nie są dozwolone:" -#: src/slic3r/GUI/Tab.cpp:3311 +#: src/slic3r/GUI/ConfigWizard.cpp:1830 +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 +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 msgid "the following suffix is not allowed:" msgstr "następujący sufiks nie jest dozwolony:" -#: src/libslic3r/PrintConfig.cpp:2702 +#: src/libslic3r/PrintConfig.cpp:2871 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:2453 +#: src/libslic3r/PrintConfig.cpp:2704 msgid "The height of the pillar base cone" msgstr "Wysokość stożka bazowego podpory" -#: src/libslic3r/PrintConfig.cpp:2481 +#: src/slic3r/GUI/DoubleSlider.cpp:1922 +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 +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 +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 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:2472 +#: src/libslic3r/PrintConfig.cpp:2736 msgid "The max length of a bridge" msgstr "Maksymalna długość mostu" -#: src/libslic3r/PrintConfig.cpp:2569 +#: src/libslic3r/PrintConfig.cpp:2714 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:2176 +#: src/libslic3r/PrintConfig.cpp:185 +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 +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 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:1433 +#: src/libslic3r/PrintConfig.cpp:1503 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:2259 -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/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/slic3r/GUI/GUI_App.cpp:831 +#: 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/libslic3r/PrintConfig.cpp:1768 +#: src/libslic3r/PrintConfig.cpp:1846 msgid "The printer multiplexes filaments into a single hot end." msgstr "Drukarka przechodzi pomiędzy filamentami używając jednego hotendu." -#: src/slic3r/GUI/BedShapeDialog.cpp:342 +#: 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 "Wybrany plik 3mf został zapisany przy pomocy nowszej wersji %1% i nie jest kompatybilny." + +#: 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 "Wybrany plik amf został zapisany przy pomocy nowszej wersji %1% i nie jest kompatybilny." + +#: src/slic3r/GUI/BedShapeDialog.cpp:513 msgid "The selected file contains no geometry." msgstr "Wybrany plik nie zawiera żadnego kształtu." -#: src/slic3r/GUI/BedShapeDialog.cpp:346 +#: src/slic3r/GUI/BedShapeDialog.cpp:517 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:2271 +#: src/slic3r/GUI/Plater.cpp:2970 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:1737 src/slic3r/GUI/Plater.cpp:2279 +#: src/slic3r/GUI/GUI_ObjectList.cpp:2270 src/slic3r/GUI/Plater.cpp:2978 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:410 -msgid "The selected project is no more available" -msgstr "Wybrany projekt nie jest dostępny" +#: 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/libslic3r/PrintConfig.cpp:2570 +#: 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/libslic3r/PrintConfig.cpp:2846 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:1544 +#: src/libslic3r/PrintConfig.cpp:1614 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." -#: src/libslic3r/PrintConfig.cpp:1536 +#: src/libslic3r/PrintConfig.cpp:1606 msgid "The speed for retractions (it only applies to the extruder motor)." msgstr "Prędkość retrakcji (stosowana tylko dla silnika ekstrudera)." -#: src/libslic3r/Print.cpp:1187 +#: 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:1189 +#: src/libslic3r/Print.cpp:1244 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:2900 +#: src/slic3r/GUI/Tab.cpp:3068 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:3287 +#: src/slic3r/GUI/Tab.cpp:3465 msgid "The supplied name is not available." msgstr "Podana nazwa jest niedostępna." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2725 -#: src/slic3r/GUI/GUI_ObjectList.cpp:2812 src/slic3r/GUI/Tab.cpp:3278 -#: src/slic3r/GUI/Tab.cpp:3282 +#: 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 msgid "The supplied name is not valid;" msgstr "Podana nazwa nie jest prawidłowa;" -#: src/libslic3r/Print.cpp:1268 +#: src/libslic3r/Print.cpp:1222 msgid "The supplied settings will cause an empty print." msgstr "Wprowadzone ustawienia spowodują pusty wydruk." -#: src/libslic3r/PrintConfig.cpp:2524 +#: src/libslic3r/PrintConfig.cpp:2789 msgid "The thickness of the pad and its optional cavity walls." msgstr "Grubość podkładki i opcjonalnie wydrążenie ścianek." -#: src/libslic3r/PrintConfig.cpp:1825 +#: src/libslic3r/PrintConfig.cpp:1911 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:2429 -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/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/libslic3r/Print.cpp:1306 +#: src/libslic3r/Print.cpp:1268 +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)." +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 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 wspiera 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)." +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:1200 +#: src/libslic3r/Print.cpp:1270 +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:1202 +#: src/libslic3r/Print.cpp:1264 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:1225 +#: src/libslic3r/Print.cpp:1293 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:1227 +#: src/libslic3r/Print.cpp:1295 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:1229 +#: src/libslic3r/Print.cpp:1297 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:1223 +#: src/libslic3r/Print.cpp:1291 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:1155 +#: src/libslic3r/Print.cpp:1257 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:1258 -msgid "The Wipe tower is only supported if all objects have the same layer height profile" -msgstr "Wieża Czyszcząca jest dostępna tylko dla modeli o takiej samej wysokości warstwy" +#: src/libslic3r/Print.cpp:1339 +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/slic3r/GUI/UpdateDialogs.cpp:127 -#, possible-c-format +#: src/libslic3r/SLAPrintSteps.cpp:621 +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: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: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/UpdateDialogs.cpp:225 +#, c-format msgid "This %s version: %s" msgstr "%s wersja: %s" -#: src/libslic3r/PrintConfig.cpp:140 +#: 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/libslic3r/PrintConfig.cpp:165 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:2057 -msgid "This custom code is inserted at every extruder change. If you don't leave this empty, you are expected to take care of the toolchange yourself - PrusaSlicer will not output any other G-code to change the filament. You can use placeholder variables for all Slic3r settings as well as [previous_extruder] and [next_extruder], so e.g. the standard toolchange command can be scripted as T[next_extruder]." -msgstr "Ten kod jest dodawany do każdej zmiany ekstrudera. Jeśli ta sekcja nie pozostanie pusta, to zmiany narzędzi będą musiały zostać wykonane ręcznie - PrusaSlicer nie wygeneruje żadnego G-kodu dla zmiany filamentu. Możesz użyć zmiennych dla wszystkich ustawień Slic3r, jak i również [previous_extruder] oraz [next_extruder], tak aby np. standardowa komenda zmiany narzędzia była skryptem jako T[next_extruder]." - -#: src/libslic3r/PrintConfig.cpp:1032 +#: src/libslic3r/PrintConfig.cpp:1081 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:129 +#: src/libslic3r/PrintConfig.cpp:154 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:2057 +#: src/libslic3r/PrintConfig.cpp:2094 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:380 +#: src/libslic3r/PrintConfig.cpp:396 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:370 +#: src/libslic3r/PrintConfig.cpp:386 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:1193 src/libslic3r/PrintConfig.cpp:1204 +#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269 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:1183 +#: src/libslic3r/PrintConfig.cpp:1248 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." -#: src/libslic3r/PrintConfig.cpp:2061 +#: src/libslic3r/PrintConfig.cpp:2162 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." -#: src/libslic3r/PrintConfig.cpp:2075 +#: src/libslic3r/PrintConfig.cpp:2176 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." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2848 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3972 msgid "This extruder will be set for selected items" msgstr "Ten ekstruder zostanie ustawiony dla wybranych elementów" -#: src/libslic3r/PrintConfig.cpp:188 +#: src/libslic3r/PrintConfig.cpp:224 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." -#: src/libslic3r/PrintConfig.cpp:514 +#: src/libslic3r/PrintConfig.cpp:546 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)." -#: src/libslic3r/PrintConfig.cpp:178 +#: src/libslic3r/PrintConfig.cpp:214 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:944 +#: src/libslic3r/PrintConfig.cpp:992 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:1677 +#: src/libslic3r/PrintConfig.cpp:1746 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." -#: src/libslic3r/PrintConfig.cpp:1718 +#: 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/slic3r/GUI/Plater.cpp:1712 -msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?\n" -msgstr "Ten plik nie może zostać wczytany w Trybie Prostym. Czy chcesz przełączyć na Tryb Zaawansowany?\n" +#: src/slic3r/GUI/Plater.cpp:2367 +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:1658 -msgid "This file contains several objects positioned at multiple heights. Instead of considering them as multiple objects, should I consider\nthis file as a single object having multiple parts?\n" -msgstr "Ten plik zawiera kilka modeli umieszczonych na różnych wysokościach. Potraktować go jako\njeden model składający się z kilku części?\n" +#: 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/FirmwareDialog.cpp:313 -#, 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/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:278 +#: src/libslic3r/PrintConfig.cpp:314 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:448 +#: src/slic3r/GUI/Plater.cpp:536 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:1468 +#: src/libslic3r/PrintConfig.cpp:1538 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:2093 +#: src/libslic3r/PrintConfig.cpp:2194 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." -#: src/slic3r/GUI/Tab.cpp:921 +#: src/slic3r/GUI/Tab.cpp:953 msgid "This is a default preset." msgstr "To jest domyślny zestaw ustawień." -#: src/libslic3r/PrintConfig.cpp:2501 +#: src/libslic3r/PrintConfig.cpp:2766 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:2528 +#: src/slic3r/GUI/Tab.cpp:2338 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:923 +#: src/slic3r/GUI/Tab.cpp:955 msgid "This is a system preset." msgstr "To jest systemowy zestaw ustawień." -#: src/libslic3r/PrintConfig.cpp:491 src/libslic3r/PrintConfig.cpp:551 +#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583 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." -#: src/libslic3r/PrintConfig.cpp:300 +#: src/libslic3r/PrintConfig.cpp:336 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ń." -#: src/libslic3r/PrintConfig.cpp:158 +#: src/libslic3r/PrintConfig.cpp:194 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." -#: src/libslic3r/PrintConfig.cpp:813 +#: src/libslic3r/PrintConfig.cpp:860 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." -#: src/libslic3r/PrintConfig.cpp:934 +#: src/libslic3r/PrintConfig.cpp:982 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." -#: src/libslic3r/PrintConfig.cpp:1331 +#: 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:1262 +#: src/libslic3r/PrintConfig.cpp:1327 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:1162 +#: src/libslic3r/PrintConfig.cpp:1227 #, no-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." -#: src/libslic3r/PrintConfig.cpp:1225 +#: src/libslic3r/PrintConfig.cpp:1290 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/PrintConfig.cpp:2139 +#: 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 "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 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:643 -msgid "This operation is irreversible.\nDo you want to proceed?" -msgstr "Tej czynności nie można cofnąć.\nCzy chcesz kontynuować?" +#: 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/libslic3r/PrintConfig.cpp:1372 +#: src/libslic3r/PrintConfig.cpp:1442 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:1287 +#: src/libslic3r/PrintConfig.cpp:1356 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:980 +#: src/libslic3r/PrintConfig.cpp:1029 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:973 +#: src/libslic3r/PrintConfig.cpp:1022 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:427 +#: src/libslic3r/PrintConfig.cpp:459 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." -#: src/libslic3r/PrintConfig.cpp:1648 +#: src/libslic3r/PrintConfig.cpp:1717 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." -#: src/libslic3r/PrintConfig.cpp:989 +#: src/libslic3r/PrintConfig.cpp:1038 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." -#: src/libslic3r/PrintConfig.cpp:57 +#: 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 "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:1153 +#: src/libslic3r/PrintConfig.cpp:1218 msgid "This setting represents the maximum speed of your fan." msgstr "To ustawienie odpowiada za maksymalną prędkość wentylatora." -#: src/libslic3r/PrintConfig.cpp:1216 +#: src/libslic3r/PrintConfig.cpp:1281 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:1801 +#: src/libslic3r/PrintConfig.cpp:1829 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:1786 +#: src/libslic3r/PrintConfig.cpp:1814 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:664 +#: src/libslic3r/PrintConfig.cpp:695 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:2185 +#: src/libslic3r/PrintConfig.cpp:2286 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:2132 +#: src/libslic3r/PrintConfig.cpp:2208 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:118 -#, 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.\n" -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 .\n" +#: 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 ." -#: src/libslic3r/PrintConfig.cpp:2284 +#: src/libslic3r/PrintConfig.cpp:2458 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:1994 +#: src/libslic3r/PrintConfig.cpp:2081 msgid "Threads" msgstr "Wątki" -#: src/libslic3r/PrintConfig.cpp:1995 +#: src/libslic3r/PrintConfig.cpp:2082 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:2052 +#: src/slic3r/GUI/Tab.cpp:2093 msgid "Tilt" msgstr "Przechylanie" -#: src/slic3r/GUI/Tab.cpp:2053 +#: src/slic3r/GUI/Tab.cpp:2094 msgid "Tilt time" msgstr "Czas przechylania" @@ -6889,138 +8295,169 @@ msgstr "Czas przechylania" msgid "Time" msgstr "Czas" -#: src/libslic3r/PrintConfig.cpp:655 +#: src/libslic3r/PrintConfig.cpp:687 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:670 +#: src/libslic3r/PrintConfig.cpp:702 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:2242 +#: src/libslic3r/PrintConfig.cpp:2407 msgid "Time of the fast tilt" msgstr "Czas szybkiego przechylania" -#: src/libslic3r/PrintConfig.cpp:2251 +#: src/libslic3r/PrintConfig.cpp:2416 msgid "Time of the slow tilt" msgstr "Czas wolnego przechylania" -#: src/libslic3r/PrintConfig.cpp:610 +#: src/libslic3r/PrintConfig.cpp:641 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:916 +#: src/slic3r/GUI/Tab.cpp:966 msgid "To do that please specify a new name for the preset." msgstr "Aby to zrobić ustaw nową nazwę zestawu ustawień." -#: src/slic3r/GUI/Plater.cpp:2966 +#: src/slic3r/GUI/Plater.cpp:4014 msgid "To objects" msgstr "Do modeli" -#: src/slic3r/GUI/Plater.cpp:2968 +#: src/slic3r/GUI/Plater.cpp:4016 msgid "To parts" msgstr "Na części" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:212 -#, possible-c-format +#: src/slic3r/GUI/Tab.cpp:1756 +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." + +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263 +#, c-format msgid "Toggle %c axis mirroring" msgstr "Włącz odbicie w osi %c" -#: src/libslic3r/Zipper.cpp:37 +#: src/libslic3r/Zipper.cpp:34 msgid "too many files" msgstr "zbyt wiele plików" -#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/GUI_Preview.cpp:315 -#: src/slic3r/GUI/GUI_Preview.cpp:481 src/slic3r/GUI/GUI_Preview.cpp:537 -#: src/slic3r/GUI/GUI_Preview.cpp:713 src/libslic3r/GCode/PreviewData.cpp:404 +#: src/libslic3r/SLAPrintSteps.cpp:190 +msgid "Too much 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 msgid "Tool" msgstr "Narzędzie" -#: src/slic3r/GUI/WipeTowerDialog.cpp:240 +#: src/slic3r/GUI/WipeTowerDialog.cpp:276 msgid "Tool #" msgstr "Narzędzie #" -#: src/slic3r/GUI/Tab.cpp:1973 src/libslic3r/PrintConfig.cpp:2006 +#: src/slic3r/GUI/Tab.cpp:2000 src/libslic3r/PrintConfig.cpp:2093 msgid "Tool change G-code" msgstr "G-code wykonywany przy zmianie narzędzia" -#: src/slic3r/GUI/Tab.cpp:1530 +#: src/slic3r/GUI/Tab.cpp:1491 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 -#: src/slic3r/GUI/MainFrame.cpp:522 +#. 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 msgid "Top" msgstr "Górne" -#: src/libslic3r/PrintConfig.cpp:388 +#: src/slic3r/GUI/PresetHints.cpp:304 +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 msgid "Top fill pattern" msgstr "Wzór wypełnienia górnej warstwy" -#: src/slic3r/GUI/PresetHints.cpp:189 +#: src/slic3r/GUI/PresetHints.cpp:323 +msgid "Top is open." +msgstr "Góra jest otwarta." + +#: src/slic3r/GUI/PresetHints.cpp:317 +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 msgid "top solid infill" msgstr "zwarte wypełnienie na szczycie" -#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/PrintConfig.cpp:2017 -#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/GCode/PreviewData.cpp:168 +#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315 +#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117 msgid "Top solid infill" msgstr "Zwarte wypełnienie górne" -#: src/libslic3r/PrintConfig.cpp:2046 +#: src/libslic3r/PrintConfig.cpp:2135 msgid "Top solid layers" msgstr "Zwarte warstwy górne" -#: src/slic3r/GUI/MainFrame.cpp:522 +#: src/slic3r/GUI/MainFrame.cpp:662 msgid "Top View" msgstr "Widok z góry" -#: src/slic3r/GUI/WipeTowerDialog.cpp:247 +#: src/slic3r/GUI/WipeTowerDialog.cpp:285 msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded." msgstr "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." -#: src/slic3r/GUI/WipeTowerDialog.cpp:84 +#: src/slic3r/GUI/WipeTowerDialog.cpp:85 msgid "Total rammed volume" msgstr "Całkowita objętość wyciskania" -#: src/slic3r/GUI/WipeTowerDialog.cpp:82 +#: src/slic3r/GUI/WipeTowerDialog.cpp:83 msgid "Total ramming time" msgstr "Całkowity czas wyciskania" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:252 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516 msgid "Translate" msgstr "Konwersja" -#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/PrintConfig.cpp:2051 +#: src/slic3r/GUI/Mouse3DController.cpp:300 +#: src/slic3r/GUI/Mouse3DController.cpp:317 +msgid "Translation" +msgstr "Tłumaczenie" + +#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152 msgid "Travel" msgstr "Jałowy" -#: src/libslic3r/PrintConfig.cpp:798 +#: src/libslic3r/PrintConfig.cpp:845 msgid "Triangles" msgstr "Trójkąty" -#: src/libslic3r/PrintConfig.cpp:3059 +#: src/libslic3r/PrintConfig.cpp:3448 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:1397 +#: src/libslic3r/PrintConfig.cpp:1467 msgid "Type of the printer." msgstr "Rodzaj drukarki." -#: src/slic3r/GUI/GUI_ObjectList.cpp:2549 +#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3553 msgid "Type:" msgstr "Typ:" -#: src/libslic3r/Zipper.cpp:35 +#: src/slic3r/GUI/Plater.cpp:3428 +msgid "Unable to reload:" +msgstr "Nie można wczytać:" + +#: src/libslic3r/Zipper.cpp:32 msgid "undefined error" msgstr "nieznany błąd" -#: src/slic3r/GUI/GLCanvas3D.cpp:3389 src/slic3r/GUI/GLCanvas3D.cpp:3609 -#: src/slic3r/GUI/MainFrame.cpp:559 +#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130 +#: src/slic3r/GUI/MainFrame.cpp:581 msgid "Undo" msgstr "Cofnij" -#: src/slic3r/GUI/GLCanvas3D.cpp:3497 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:4065 +#, c-format msgid "Undo %1$d Action" msgid_plural "Undo %1$d Actions" msgstr[0] "Cofnij %1$d akcję" @@ -7028,11 +8465,11 @@ msgstr[1] "Cofnij %1$d akcji" msgstr[2] "Cofnij %1$d akcji" msgstr[3] "Cofnij %1$d akcji" -#: src/slic3r/GUI/GLCanvas3D.cpp:3479 +#: src/slic3r/GUI/GLCanvas3D.cpp:4047 msgid "Undo History" msgstr "Historia Cofnięć" -#: src/libslic3r/Zipper.cpp:59 +#: src/libslic3r/Zipper.cpp:56 msgid "unexpected decompressed size" msgstr "nieoczekiwany rozmiar po rozpakowaniu" @@ -7040,96 +8477,111 @@ msgstr "nieoczekiwany rozmiar po rozpakowaniu" msgid "Unknown" msgstr "Nieznane" -#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:154 +#: 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 msgid "Unknown error occured" msgstr "Wystąpił nieznany błąd" -#: src/slic3r/GUI/WipeTowerDialog.cpp:234 +#: src/slic3r/GUI/WipeTowerDialog.cpp:263 msgid "unloaded" msgstr "rozładowano" -#: src/libslic3r/PrintConfig.cpp:591 +#: src/libslic3r/PrintConfig.cpp:623 msgid "Unloading speed" msgstr "Prędkość rozładowania" -#: src/libslic3r/PrintConfig.cpp:600 +#: src/libslic3r/PrintConfig.cpp:632 msgid "Unloading speed at the start" msgstr "Początkowa prędkość rozładowania" -#: src/slic3r/GUI/Tab.cpp:3069 +#: src/slic3r/GUI/Tab.cpp:3256 msgid "UNLOCKED LOCK" msgstr "OTWARTA KŁÓDKA" -#: src/slic3r/GUI/Tab.cpp:3362 -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/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:3377 -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/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/GUI_Preview.cpp:245 +#: 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/GUI_Preview.cpp:255 msgid "Unretractions" msgstr "Powrót retrakcji" -#: src/slic3r/GUI/Tab.cpp:2785 +#: src/slic3r/GUI/Tab.cpp:2947 msgid "Unsaved Changes" msgstr "Niezapisane zmiany" -#: src/slic3r/GUI/GUI_App.cpp:790 +#: src/slic3r/GUI/GUI_App.cpp:935 msgid "Unsaved Presets" msgstr "Niezapisane zestawy ustawień" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:154 -msgid "Unselect gizmo / Clear selection" -msgstr "Uchwyt do odznaczania / usuń zaznaczenie" +#: src/slic3r/GUI/KBShortcutsDialog.cpp:179 +msgid "Unselect gizmo or clear selection" +msgstr "Odznacz uchwyt lub wyczyść zaznaczenie" -#: src/libslic3r/Zipper.cpp:63 +#: src/libslic3r/Zipper.cpp:60 msgid "unsupported central directory size" msgstr "nieobsługiwany rozmiar katalogu centralnego" -#: src/libslic3r/Zipper.cpp:43 +#: src/libslic3r/Zipper.cpp:40 msgid "unsupported encryption" msgstr "nieobsługiwane szyfrowanie" -#: src/libslic3r/Zipper.cpp:45 +#: src/libslic3r/Zipper.cpp:42 msgid "unsupported feature" msgstr "nieobsługiwana funkcja" -#: src/libslic3r/Zipper.cpp:41 +#: src/libslic3r/Zipper.cpp:38 msgid "unsupported method" msgstr "nieobsługiwana metoda" -#: src/libslic3r/Zipper.cpp:53 +#: src/libslic3r/Zipper.cpp:50 msgid "unsupported multidisk archive" msgstr "nieobsługiwane archiwum wielodyskowe" -#: src/slic3r/GUI/GUI_App.cpp:305 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:292 msgid "Unsupported OpenGL version" msgstr "Nieobsługiwana wersja OpenGL" -#: src/slic3r/GUI/GUI_ObjectList.cpp:2414 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3420 msgid "Unsupported selection" msgstr "Niewłaściwy wybór" -#: src/libslic3r/GCode/PreviewData.cpp:495 -#, possible-c-format +#: src/slic3r/GUI/GLCanvas3D.cpp:955 +#, c-format msgid "up to %.2f mm" msgstr "do %.2f mm" -#: src/slic3r/GUI/UpdateDialogs.cpp:30 +#: src/slic3r/GUI/UpdateDialogs.cpp:38 msgid "Update available" msgstr "Dostępna jest aktualizacja" -#: src/slic3r/GUI/ConfigWizard.cpp:419 src/slic3r/GUI/Preferences.cpp:69 +#: src/slic3r/GUI/ConfigWizard.cpp:779 src/slic3r/GUI/Preferences.cpp:80 msgid "Update built-in Presets automatically" msgstr "Automatyczna aktualizacja wbudowanych zestawów ustawień" -#: src/slic3r/GUI/ConfigWizard.cpp:401 +#: src/slic3r/GUI/ConfigWizard.cpp:761 msgid "Updates" msgstr "Aktualizacje" -#: src/slic3r/GUI/ConfigWizard.cpp:426 +#: src/slic3r/GUI/ConfigWizard.cpp:786 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." @@ -7137,36 +8589,44 @@ msgstr "Aktualizacje nie są stosowane bez wiedzy użytkownika i nigdy nie nadpi msgid "Upgrade" msgstr "Aktualizacja" -#: src/slic3r/GUI/GUI_App.cpp:685 +#: src/slic3r/GUI/GUI_App.cpp:824 msgid "Upload a firmware image into an Arduino based printer" msgstr "Wgraj obraz firmware do drukarki opartej na Adruino" +#: src/slic3r/Utils/FlashAir.cpp:58 +msgid "Upload not enabled on FlashAir card." +msgstr "Przesyłanie wyłączone w karcie FlashAir." + #: src/slic3r/GUI/PrintHostDialogs.cpp:33 msgid "Upload to Printer Host with the following filename:" -msgstr "Prześlij do Serwera Druku z następującą nazwą pliku:" +msgstr "Prześlij do serwera druku z następującą nazwą pliku:" -#: src/slic3r/GUI/PrintHostDialogs.cpp:229 +#: src/slic3r/GUI/PrintHostDialogs.cpp:230 msgid "Uploading" msgstr "Przesyłanie" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:171 -#: src/slic3r/GUI/KBShortcutsDialog.cpp:173 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:204 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:206 msgid "Upper Layer" msgstr "Górna Warstwa" -#: src/slic3r/GUI/Tab.cpp:1873 +#: src/slic3r/GUI/Tab.cpp:1900 msgid "USB/Serial connection" msgstr "Połączenie USB/szeregowe" -#: src/libslic3r/PrintConfig.cpp:1592 +#: src/libslic3r/PrintConfig.cpp:1662 msgid "USB/serial port for printer connection." msgstr "Port USB/szeregowy do połączenia z drukarką." -#: src/slic3r/GUI/Preferences.cpp:117 +#: src/slic3r/GUI/DoubleSlider.cpp:1147 +msgid "Use another extruder" +msgstr "Użyj innego ekstrudera" + +#: src/slic3r/GUI/Preferences.cpp:143 msgid "Use custom size for toolbar icons" msgstr "Użyj własnego rozmiaru ikon pasków narzędzi" -#: src/libslic3r/PrintConfig.cpp:2060 +#: src/libslic3r/PrintConfig.cpp:2161 msgid "Use firmware retraction" msgstr "Użyj retrakcji z firmware" @@ -7174,51 +8634,59 @@ msgstr "Użyj retrakcji z firmware" msgid "Use forward slashes ( / ) as a directory separator if needed." msgstr "Użyj prawego ukośnika ( / ) jako separatora katalogu w razie potrzeby." -#: src/libslic3r/PrintConfig.cpp:2515 +#: src/slic3r/GUI/Preferences.cpp:126 +msgid "Use free camera" +msgstr "Użyj wolnego widoku" + +#: src/libslic3r/PrintConfig.cpp:2780 msgid "Use pad" msgstr "Użyj podkładki" -#: src/slic3r/GUI/Preferences.cpp:110 +#: src/slic3r/GUI/Preferences.cpp:119 msgid "Use perspective camera" msgstr "Użyj widoku perspektywicznego" -#: src/libslic3r/PrintConfig.cpp:2067 +#: src/libslic3r/PrintConfig.cpp:2168 msgid "Use relative E distances" msgstr "Użyj względnych wartości E (ekstruzji)" -#: src/slic3r/GUI/Preferences.cpp:103 +#: src/slic3r/GUI/Preferences.cpp:104 msgid "Use Retina resolution for the 3D scene" msgstr "Użyj rozdzielczości Retina dla generowania podglądu 3D" -#: src/libslic3r/PrintConfig.cpp:508 +#: src/libslic3r/PrintConfig.cpp:540 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:1807 +#: src/libslic3r/PrintConfig.cpp:1893 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:2074 +#: src/libslic3r/PrintConfig.cpp:2175 msgid "Use volumetric E" msgstr "Użyj wolumetrycznej wartości E" -#: src/slic3r/GUI/Plater.cpp:214 +#: src/slic3r/GUI/DoubleSlider.cpp:1171 +msgid "used" +msgstr "używany" + +#: src/slic3r/GUI/Plater.cpp:237 msgid "Used Filament (g)" msgstr "Użyty filament (g)" -#: src/slic3r/GUI/Plater.cpp:212 src/slic3r/GUI/Plater.cpp:1041 +#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1229 msgid "Used Filament (m)" msgstr "Użyty filament (m)" -#: src/slic3r/GUI/Plater.cpp:213 +#: src/slic3r/GUI/Plater.cpp:236 msgid "Used Filament (mm³)" msgstr "Użyty filament (mm³)" -#: src/slic3r/GUI/Plater.cpp:1015 +#: src/slic3r/GUI/Plater.cpp:1191 msgid "Used Material (ml)" msgstr "Używany materiał (ml)" -#: src/slic3r/GUI/Plater.cpp:215 +#: src/slic3r/GUI/Plater.cpp:238 msgid "Used Material (unit)" msgstr "Używany materiał (jednostka)" @@ -7226,409 +8694,495 @@ msgstr "Używany materiał (jednostka)" msgid "User" msgstr "Użytkownik" -#: src/slic3r/GUI/Preset.cpp:974 src/slic3r/GUI/Preset.cpp:1071 -#: src/slic3r/GUI/PresetBundle.cpp:1558 +#: src/slic3r/GUI/Preset.cpp:1168 src/slic3r/GUI/Preset.cpp:1288 +#: src/slic3r/GUI/PresetBundle.cpp:1677 msgid "User presets" msgstr "Zestawy użytkownika" -#: src/libslic3r/Zipper.cpp:93 +#: src/libslic3r/Zipper.cpp:90 msgid "validation failed" msgstr "niepowodzenie weryfikacji" -#: src/slic3r/GUI/ButtonsDescription.cpp:41 +#: src/slic3r/GUI/ButtonsDescription.cpp:36 msgid "Value is the same as the system value" msgstr "Wartość jest taka sama jak systemowa" -#: src/slic3r/GUI/ButtonsDescription.cpp:58 +#: src/slic3r/GUI/ButtonsDescription.cpp:53 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:2151 +#: src/slic3r/GUI/Tab.cpp:2202 msgid "Values in this column are for Normal mode" msgstr "Wartości w tej kolumnie dotyczą trybu Normal" -#: src/slic3r/GUI/Tab.cpp:2157 +#: src/slic3r/GUI/Tab.cpp:2208 msgid "Values in this column are for Stealth mode" msgstr "Wartości w tej kolumnie dotyczą trybu Stealth" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58 +#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4573 +msgid "Variable layer height" +msgstr "Zmienna wysokość warstwy" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1709 +msgid "Variable layer height - Adaptive" +msgstr "Zmienna wysokość warstwy - Adaptacyjna" + +#: src/slic3r/GUI/GLCanvas3D.cpp:599 +msgid "Variable layer height - Manual edit" +msgstr "Zmienna wysokość warstwy - ręczna edycja" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1701 +msgid "Variable layer height - Reset" +msgstr "Zmienna wysokość warstwy - Reset" + +#: src/slic3r/GUI/GLCanvas3D.cpp:1717 +msgid "Variable layer height - Smooth all" +msgstr "Zmienna wysokość warstwy - Wygładź wszystko" + +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63 msgid "variants" msgstr "warianty" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 src/slic3r/GUI/Tab.cpp:921 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:971 msgid "vendor" msgstr "dostawca" -#: src/libslic3r/PrintConfig.cpp:880 +#: src/slic3r/GUI/ConfigWizard.cpp:565 +msgid "Vendor:" +msgstr "Producent:" + +#: src/libslic3r/PrintConfig.cpp:928 msgid "Verbose G-code" msgstr "G-code rozszerzony" -#: src/slic3r/GUI/AboutDialog.cpp:67 src/slic3r/GUI/MainFrame.cpp:53 +#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64 msgid "Version" msgstr "Wersja" -#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52 +#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 msgid "version" msgstr "wersja" -#: src/slic3r/GUI/Tab.cpp:1002 +#: src/slic3r/GUI/Tab.cpp:1053 msgid "Vertical shells" msgstr "Powłoka pionowa" -#: src/slic3r/GUI/GUI_Preview.cpp:209 +#: src/slic3r/GUI/GUI_Preview.cpp:218 msgid "View" msgstr "Widok" -#: src/libslic3r/SLAPrint.cpp:857 src/libslic3r/SLAPrint.cpp:867 -#: src/libslic3r/SLAPrint.cpp:915 +#: src/slic3r/GUI/ConfigWizard.cpp:813 +msgid "View mode" +msgstr "Widok" + +#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422 +#: src/libslic3r/SLAPrintSteps.cpp:461 msgid "Visualizing supports" msgstr "Wizualizacja podpór" -#: src/slic3r/GUI/Plater.cpp:138 +#: src/slic3r/GUI/Plater.cpp:161 msgid "Volume" msgstr "Objętość" -#: src/slic3r/GUI/WipeTowerDialog.cpp:248 +#: src/slic3r/GUI/WipeTowerDialog.cpp:286 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:1010 +#: src/slic3r/GUI/GUI_ObjectList.cpp:1106 msgid "Volumes in Object reordered" msgstr "Części modelu przeorganizowane" -#: src/slic3r/GUI/PresetHints.cpp:216 +#: src/slic3r/GUI/PresetHints.cpp:219 msgid "Volumetric" msgstr "Objętościowy" -#: src/slic3r/GUI/Tab.cpp:1800 +#: src/slic3r/GUI/Tab.cpp:1591 msgid "Volumetric flow hints not available" msgstr "Podpowiedzi dot. objętości przepływu są niedostępne" -#: src/slic3r/GUI/GUI_Preview.cpp:216 +#: src/slic3r/GUI/GUI_Preview.cpp:226 msgid "Volumetric flow rate" msgstr "Objętościowa wartość przepływu" -#: src/libslic3r/GCode/PreviewData.cpp:402 -msgid "Volumetric flow rate (mm3/s)" -msgstr "Objętościowy współczynnik przepływu (mm3/s)" +#: src/libslic3r/GCode/PreviewData.cpp:355 +msgid "Volumetric flow rate (mm³/s)" +msgstr "Objętościowy współczynnik przepływu (mm³/s)" #: src/slic3r/GUI/RammingChart.cpp:81 msgid "Volumetric speed" msgstr "Prędkość objętościowa" -#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1168 src/slic3r/GUI/GUI.cpp:283 -#: src/slic3r/GUI/WipeTowerDialog.cpp:44 src/slic3r/GUI/WipeTowerDialog.cpp:328 +#: src/libslic3r/PrintConfig.cpp:2915 +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 msgid "Warning" msgstr "Ostrzeżenie" -#: src/slic3r/GUI/ConfigWizard.cpp:294 +#: src/slic3r/GUI/ConfigWizard.cpp:431 msgid "Welcome" msgstr "Witaj" -#: src/slic3r/GUI/ConfigWizard.cpp:296 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:427 +#, c-format msgid "Welcome to the %s Configuration Assistant" msgstr "Witamy w Asystencie Konfiguracji %s" -#: src/slic3r/GUI/ConfigWizard.cpp:298 -#, possible-c-format +#: src/slic3r/GUI/ConfigWizard.cpp:429 +#, c-format msgid "Welcome to the %s Configuration Wizard" msgstr "Witamy w Asystencie Konfiguracji %s" -#: src/slic3r/GUI/Preferences.cpp:86 +#: src/slic3r/GUI/Preferences.cpp:97 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:223 +#: src/slic3r/GUI/PresetHints.cpp:224 msgid "when printing" msgstr "podczas druku" -#: src/libslic3r/PrintConfig.cpp:217 +#: src/libslic3r/PrintConfig.cpp:253 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:269 +#: src/libslic3r/PrintConfig.cpp:305 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ść." -#: src/libslic3r/PrintConfig.cpp:843 +#: src/libslic3r/PrintConfig.cpp:891 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." -#: src/libslic3r/PrintConfig.cpp:1483 +#: src/libslic3r/PrintConfig.cpp:1553 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:1475 +#: src/libslic3r/PrintConfig.cpp:1545 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:1347 +#: src/libslic3r/PrintConfig.cpp:1391 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:1173 +#: src/libslic3r/PrintConfig.cpp:1238 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:1527 +#: src/libslic3r/PrintConfig.cpp:1597 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:1519 +#: src/libslic3r/PrintConfig.cpp:1589 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:3076 +#: src/slic3r/GUI/Tab.cpp:3263 msgid "WHITE BULLET" msgstr "BIAŁA KROPKA" -#: src/slic3r/GUI/Tab.cpp:3365 +#: src/slic3r/GUI/Tab.cpp:3285 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:3111 +#: src/slic3r/GUI/Tab.cpp:3288 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:3126 +#: src/slic3r/GUI/Tab.cpp:3303 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:214 src/libslic3r/PrintConfig.cpp:2137 +#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238 msgid "Width" msgstr "Szerokość" -#: src/libslic3r/GCode/PreviewData.cpp:398 +#: src/libslic3r/GCode/PreviewData.cpp:349 msgid "Width (mm)" msgstr "Szerokość (mm)" -#: src/libslic3r/PrintConfig.cpp:2389 +#: src/libslic3r/PrintConfig.cpp:2640 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:2138 +#: src/libslic3r/PrintConfig.cpp:2239 msgid "Width of a wipe tower" msgstr "Szerokość wieży czyszczącej" -#: src/libslic3r/PrintConfig.cpp:2761 +#: src/libslic3r/PrintConfig.cpp:2891 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:2203 +#: src/libslic3r/PrintConfig.cpp:2354 msgid "Width of the display" msgstr "Szerokość wyświetlacza" -#: src/slic3r/GUI/PresetHints.cpp:47 +#: src/slic3r/GUI/PresetHints.cpp:48 msgid "will always run at %1%%%" msgstr "będzie zawsze pracować w %1%%%" -#: src/slic3r/GUI/PresetHints.cpp:52 +#: src/slic3r/GUI/PresetHints.cpp:55 msgid "will be turned off." msgstr "będzie wyłączony." -#: src/libslic3r/PrintConfig.cpp:2276 +#: src/libslic3r/PrintConfig.cpp:2441 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:2160 +#: src/libslic3r/PrintConfig.cpp:2261 msgid "Wipe into this object" msgstr "Czyszczenie na tym modelu" -#: src/libslic3r/PrintConfig.cpp:2152 +#: src/libslic3r/PrintConfig.cpp:2253 msgid "Wipe into this object's infill" msgstr "Czyszczenie na wypełnieniu modelu" -#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:90 -#: src/slic3r/GUI/GUI_ObjectList.cpp:564 src/libslic3r/PrintConfig.cpp:2202 -#: src/libslic3r/PrintConfig.cpp:2210 +#: 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 msgid "Wipe options" msgstr "Opcje czyszczenia" -#: src/slic3r/GUI/GUI_Preview.cpp:238 src/slic3r/GUI/Tab.cpp:1130 -#: src/libslic3r/GCode/PreviewData.cpp:174 +#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1191 +#: src/libslic3r/ExtrusionEntity.cpp:321 msgid "Wipe tower" msgstr "Wieża czyszcząca" -#: src/slic3r/GUI/Plater.cpp:1043 src/slic3r/GUI/Plater.cpp:1058 +#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245 msgid "wipe tower" msgstr "wieża czyszcząca" -#: src/slic3r/GUI/WipeTowerDialog.cpp:141 +#: src/slic3r/GUI/ConfigManipulation.cpp:120 +#: src/slic3r/GUI/ConfigManipulation.cpp:140 +msgid "Wipe Tower" +msgstr "Wieża czyszcząca" + +#: src/slic3r/GUI/WipeTowerDialog.cpp:142 msgid "Wipe tower - Purging volume adjustment" msgstr "Wieża czyszcząca - dostosowanie objętości czyszczenia" -#: src/slic3r/GUI/Tab.cpp:1664 +#: src/slic3r/GUI/Tab.cpp:1488 msgid "Wipe tower parameters" msgstr "Parametry wieży czyszczącej" -#: src/libslic3r/PrintConfig.cpp:2144 +#: src/libslic3r/PrintConfig.cpp:2245 msgid "Wipe tower rotation angle" msgstr "Kąt obrotu wieży czyszczącej" -#: src/libslic3r/PrintConfig.cpp:2170 +#: src/libslic3r/PrintConfig.cpp:2246 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:2092 +#: src/libslic3r/PrintConfig.cpp:2193 msgid "Wipe while retracting" msgstr "Czyszczenie przy retrakcji" -#: src/slic3r/GUI/PresetHints.cpp:224 +#: src/slic3r/GUI/PresetHints.cpp:225 msgid "with a volumetric rate" msgstr "ze współczynnikiem objętościowym" -#: src/libslic3r/PrintConfig.cpp:1460 +#: src/libslic3r/PrintConfig.cpp:1530 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:1969 +#: src/libslic3r/PrintConfig.cpp:2056 msgid "With sheath around the support" -msgstr "Z osłoną wokół podpór" +msgstr "Osłona wokół podpór" -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:40 -#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:83 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62 +#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105 msgid "World coordinates" msgstr "Globalny układ współrzędnych" -#: src/slic3r/GUI/UpdateDialogs.cpp:76 -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/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:" -#: src/libslic3r/Zipper.cpp:95 +#: src/libslic3r/Zipper.cpp:92 msgid "write calledback failed" msgstr "błąd write calledback" -#: src/libslic3r/PrintConfig.cpp:2993 +#: src/libslic3r/PrintConfig.cpp:3382 msgid "Write information about the model to the console." msgstr "Zapis informacji o modelu do konsoli." -#: src/slic3r/Utils/Duet.cpp:148 +#: src/slic3r/Utils/Duet.cpp:131 msgid "Wrong password" msgstr "Nieprawidłowe hasło" -#: src/libslic3r/PrintConfig.cpp:2124 +#: src/libslic3r/PrintConfig.cpp:2225 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:1793 +#: src/libslic3r/PrintConfig.cpp:1879 msgid "XY separation between an object and its support" msgstr "Odstęp materiału podporowego od modelu w osiach XY" -#: src/libslic3r/PrintConfig.cpp:1795 +#: src/libslic3r/PrintConfig.cpp:1881 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:2174 +#: src/libslic3r/PrintConfig.cpp:2275 msgid "XY Size Compensation" msgstr "Korekta wymiarów XY" -#: src/libslic3r/PrintConfig.cpp:2131 +#: src/libslic3r/PrintConfig.cpp:2232 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:992 +#: src/slic3r/GUI/Plater.cpp:1170 msgid "Yes" msgstr "Tak" -#: src/libslic3r/PrintConfig.cpp:1252 +#: src/libslic3r/PrintConfig.cpp:1317 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:557 +#: src/libslic3r/PrintConfig.cpp:589 msgid "You can put your notes regarding the filament here." msgstr "Tutaj możesz umieścić notatki dotyczące filamentu." -#: src/libslic3r/PrintConfig.cpp:1403 +#: src/libslic3r/PrintConfig.cpp:1473 msgid "You can put your notes regarding the printer here." msgstr "Tutaj możesz umieścić notatki dotyczące drukarki." -#: src/libslic3r/PrintConfig.cpp:2332 +#: src/libslic3r/PrintConfig.cpp:2579 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:324 +#: src/libslic3r/PrintConfig.cpp:360 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:1295 +#: src/libslic3r/PrintConfig.cpp:1364 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:2538 +#: src/slic3r/GUI/GUI_ObjectList.cpp:3546 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:2243 -msgid "You can't load SLA project if there is at least one multi-part object on the bed" -msgstr "Nie można wczytać projektu SLA, jeśli na stole jest co najmniej jeden model wieloczęściowy" - -#: src/slic3r/GUI/Plater.cpp:1746 -#, possible-c-format +#: src/slic3r/GUI/Plater.cpp:2390 +#, 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/GUI_ObjectManipulation.cpp:565 +#: src/slic3r/GUI/Plater.cpp:2311 +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 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/GUI_App.cpp:300 +#: src/slic3r/GUI/GLCanvas3DManager.cpp:287 msgid "You may need to update your graphics card driver." msgstr "Może być wymagana aktualizacja sterowników karty graficznej." -#: src/slic3r/GUI/Preferences.cpp:130 -#, possible-c-format +#: src/slic3r/GUI/UpdateDialogs.cpp:148 +msgid "You must install a configuration update." +msgstr "Do instalacji jest wymagana aktualizacja konfiguracji." + +#: src/slic3r/GUI/Preferences.cpp:172 +#, 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:2415 -#, possible-c-format +#: src/slic3r/GUI/GUI_ObjectList.cpp:3421 +#, c-format msgid "You started your selection with %s Item." msgstr "Wybór rozpoczęty przez %s." -#: src/slic3r/GUI/MainFrame.cpp:772 +#: src/slic3r/GUI/DoubleSlider.cpp:1902 +msgid "Your current changes will delete all saved color changes." +msgstr "Wprowadzane zmiany usuną wszystkie zmiany kolorów." + +#: src/slic3r/GUI/DoubleSlider.cpp:1923 +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 msgid "Your file was repaired." msgstr "Twój plik został naprawiony." -#: src/slic3r/GUI/Plater.cpp:1874 +#: src/slic3r/GUI/Plater.cpp:2528 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:2184 +#: src/libslic3r/PrintConfig.cpp:2285 msgid "Z offset" -msgstr "Margines Z" +msgstr "Z offset" -#: src/libslic3r/PrintConfig.cpp:2416 +#: 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: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/libslic3r/PrintConfig.cpp:2667 msgid "Zig-Zag" msgstr "Zig-Zag" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:152 +#: src/slic3r/GUI/Mouse3DController.cpp:308 +#: src/slic3r/GUI/Mouse3DController.cpp:317 +msgid "Zoom" +msgstr "Zoom" + +#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 msgid "Zoom in" msgstr "Przybliżenie" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:153 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:184 msgid "Zoom out" msgstr "Oddalenie" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:150 -msgid "Zoom to all objects in scene, if none selected" -msgstr "Ustaw zbliżenie na wszystkie modele, jeśli żaden nie został wybrany" - -#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 +#: src/slic3r/GUI/KBShortcutsDialog.cpp:181 msgid "Zoom to Bed" msgstr "Zbliżenie na Stół" -#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 -msgid "Zoom to selected object" -msgstr "Przybliż na wybrany model" +#: 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:171 src/libslic3r/PrintConfig.cpp:733 -#: src/libslic3r/PrintConfig.cpp:1570 src/libslic3r/PrintConfig.cpp:1580 -#: src/libslic3r/PrintConfig.cpp:1808 src/libslic3r/PrintConfig.cpp:1962 -#: src/libslic3r/PrintConfig.cpp:2146 src/libslic3r/PrintConfig.cpp:2463 +#: 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 msgid "°" msgstr "°" -#: src/slic3r/GUI/ConfigWizard.cpp:613 src/slic3r/GUI/ConfigWizard.cpp:627 +#: src/slic3r/GUI/ConfigWizard.cpp:1038 src/slic3r/GUI/ConfigWizard.cpp:1052 msgid "°C" msgstr "°C" diff --git a/resources/localization/pt_br/PrusaSlicer.mo b/resources/localization/pt_br/PrusaSlicer.mo index 94853e146f..152f1e2a16 100644 Binary files a/resources/localization/pt_br/PrusaSlicer.mo and b/resources/localization/pt_br/PrusaSlicer.mo differ diff --git a/resources/localization/tr/PrusaSlicer.mo b/resources/localization/tr/PrusaSlicer.mo index ad28072e06..8b8b27069b 100644 Binary files a/resources/localization/tr/PrusaSlicer.mo and b/resources/localization/tr/PrusaSlicer.mo differ diff --git a/resources/localization/tr/PrusaSlicer_tr.po b/resources/localization/tr/PrusaSlicer_tr.po index be59157426..16af1a8367 100644 --- a/resources/localization/tr/PrusaSlicer_tr.po +++ b/resources/localization/tr/PrusaSlicer_tr.po @@ -3679,13 +3679,15 @@ msgstr "CA sertifika dosyasını aç" #: src/slic3r/GUI/Tab.cpp:1810 #, c-format msgid "" -"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." +"On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain." msgstr "" -"HTTPS CA Dosyası:\n" -" \tBu sistemde, %s , sistem Sertifika Deposu veya Anahtarlıktan HTTPS sertifikaları kullanır.\n" -" \tÖzel bir CA dosyası kullanmak için, lütfen CA dosyanızı Sertifika Deposu/Anahtarlık içine aktarın." +"Bu sistemde, %s , sistem Sertifika Deposu veya Anahtarlıktan HTTPS sertifikaları kullanır." + +#: src/slic3r/GUI/Tab.cpp:1810 +msgid "" +"To use a custom CA file, please import your CA file into Certificate Store / Keychain." +msgstr "" +"Özel bir CA dosyası kullanmak için, lütfen CA dosyanızı Sertifika Deposu/Anahtarlık içine aktarın." #: src/slic3r/GUI/Tab.cpp:1850 src/slic3r/GUI/Tab.cpp:2051 msgid "Size and coordinates" @@ -3948,11 +3950,11 @@ msgstr "BEYAZ NOKTA" #. TRN Description for "WHITE BULLET" #: src/slic3r/GUI/Tab.cpp:3129 msgid "" -"for the left button: \tindicates a non-system preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." +"for the left button: indicates a non-system preset,\n" +"for the right button: indicates that the settings hasn't been modified." msgstr "" -"sol tuş için: \tsistem dışı bir ön ayarı gösterir,\n" -"sağ tuş için: \tayarların değiştirilmediğini gösterir." +"sol tuş için: sistem dışı bir ön ayarı gösterir,\n" +"sağ tuş için: ayarların değiştirilmediğini gösterir." #: src/slic3r/GUI/Tab.cpp:3103 msgid "BACK ARROW" diff --git a/resources/localization/uk/PrusaSlicer.mo b/resources/localization/uk/PrusaSlicer.mo index 9063835fef..aae82889f3 100644 Binary files a/resources/localization/uk/PrusaSlicer.mo and b/resources/localization/uk/PrusaSlicer.mo differ diff --git a/resources/localization/uk/PrusaSlicer_uk.po b/resources/localization/uk/PrusaSlicer_uk.po index 86e6da1dc7..42b067361e 100644 --- a/resources/localization/uk/PrusaSlicer_uk.po +++ b/resources/localization/uk/PrusaSlicer_uk.po @@ -3275,7 +3275,7 @@ msgstr "Шаблон наповнення " #: src/slic3r/GUI/Tab.cpp:1309 #, no-c-format msgid "" -" infill pattern is not supposed to work at 100% density.\n" +" infill pattern is not supposed to work at 100%% density.\n" "\n" "Shall I switch to rectilinear fill pattern?" msgstr "" diff --git a/resources/localization/zh_cn/PrusaSlicer.mo b/resources/localization/zh_cn/PrusaSlicer.mo index 2d8b31823e..74bbb3d69d 100644 Binary files a/resources/localization/zh_cn/PrusaSlicer.mo and b/resources/localization/zh_cn/PrusaSlicer.mo differ diff --git a/resources/localization/zh_cn/PrusaSlicer_zh_CN.po b/resources/localization/zh_cn/PrusaSlicer_zh_CN.po index 3a13519bb5..a46b217415 100644 --- a/resources/localization/zh_cn/PrusaSlicer_zh_CN.po +++ b/resources/localization/zh_cn/PrusaSlicer_zh_CN.po @@ -4106,11 +4106,9 @@ msgstr "当前预设从默认预设继承。" #: src/slic3r/GUI/Tab.cpp:947 #, c-format msgid "" -"Current preset is inherited from:\n" -"\t%s" +"Current preset is inherited from" msgstr "" -"当前预设继承自:\n" -"\t%s" +"当前预设继承自" #: src/slic3r/GUI/Tab.cpp:951 msgid "It can't be deleted or modified." @@ -4375,15 +4373,17 @@ msgstr "打开 CA 证书文件" #: src/slic3r/GUI/Tab.cpp:1959 #, c-format msgid "" -"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 " +"On this system, %s uses HTTPS certificates from the system Certificate " +"Store or Keychain." +msgstr "" +"在此系统上,%s 使用来自系统证书存储或钥匙串的 HTTPS 证书。" + +#: src/slic3r/GUI/Tab.cpp:1959 +msgid "" +"To use a custom CA file, please import your CA file into Certificate " "Store / Keychain." msgstr "" -"HTTPS CA 文件:\n" -" \t在此系统上,%s 使用来自系统证书存储或钥匙串的 HTTPS 证书。\n" -" \t要使用自定义 CA 文件,请将 CA 文件导入证书存储/钥匙串。" +"要使用自定义 CA 文件,请将 CA 文件导入证书存储/钥匙串。" #: src/slic3r/GUI/Tab.cpp:1999 src/slic3r/GUI/Tab.cpp:2240 msgid "Size and coordinates" @@ -4671,8 +4671,8 @@ msgstr "白色子弹" #. TRN Description for "WHITE BULLET" #: src/slic3r/GUI/Tab.cpp:3424 msgid "" -"for the left button: \tindicates a non-system (or non-default) preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." +"for the left button: indicates a non-system (or non-default) preset,\n" +"for the right button: indicates that the settings hasn't been modified." msgstr "" "对于左侧按钮:指示非系统(或非默认)预设,\n" "对于右侧按钮:指示设置尚未修改。" diff --git a/resources/localization/zh_tw/PrusaSlicer.mo b/resources/localization/zh_tw/PrusaSlicer.mo index 8f51236f78..61b0de0191 100644 Binary files a/resources/localization/zh_tw/PrusaSlicer.mo and b/resources/localization/zh_tw/PrusaSlicer.mo differ diff --git a/resources/localization/zh_tw/PrusaSlicer_zh_TW.po b/resources/localization/zh_tw/PrusaSlicer_zh_TW.po index 1e7bc4488f..9e37785dc6 100644 --- a/resources/localization/zh_tw/PrusaSlicer_zh_TW.po +++ b/resources/localization/zh_tw/PrusaSlicer_zh_TW.po @@ -3049,8 +3049,8 @@ msgid "It's a system preset." msgstr "這是一個系統預設。" #: src/slic3r/GUI/Tab.cpp:860 -msgid "Current preset is inherited from " -msgstr "當前預設繼承自 " +msgid "Current preset is inherited from" +msgstr "當前預設繼承自" #: src/slic3r/GUI/Tab.cpp:865 msgid "It can't be deleted or modified. " @@ -3292,7 +3292,7 @@ msgstr "這個 " #: src/slic3r/GUI/Tab.cpp:1309 #, no-c-format msgid "" -" infill pattern is not supposed to work at 100% density.\n" +" infill pattern is not supposed to work at 100%% density.\n" "\n" "Shall I switch to rectilinear fill pattern?" msgstr "" @@ -3391,16 +3391,19 @@ msgid "Open CA certificate file" msgstr "打開 CA 證書文件" #: src/slic3r/GUI/Tab.cpp:1725 +#, c-format msgid "" -"HTTPS CA File:\n" -"\tOn this system, Slic3r uses HTTPS certificates from the system Certificate " -"Store or Keychain.\n" -"\tTo use a custom CA file, please import your CA file into Certificate " +"On this system, %s uses HTTPS certificates from the system Certificate " +"Store or Keychain." +msgstr "" +"在此係統上, %s 使用來自系統證書存儲或鑰匙串的 https 證書。" + +#: src/slic3r/GUI/Tab.cpp:1725 +msgid "" +"To use a custom CA file, please import your CA file into Certificate " "Store / Keychain." msgstr "" -"HTTPS CA 文件:\n" -"\t在此係統上, Slic3r 使用來自系統證書存儲或鑰匙串的 https 證書。\n" -"\t要使用自定義 CA 文件, 請將 CA 文件導入到證書存儲/鑰匙串。" +"要使用自定義 CA 文件, 請將 CA 文件導入到證書存儲/鑰匙串。" #: src/slic3r/GUI/Tab.cpp:1763 src/slic3r/GUI/Tab.cpp:1964 msgid "Size and coordinates" @@ -3664,11 +3667,11 @@ msgstr "" #: src/slic3r/GUI/Tab.cpp:2998 msgid "" -"WHITE BULLET;for the left button: \tindicates a non-system preset,\n" -"for the right button: \tindicates that the settings hasn't been modified." +"WHITE BULLET;for the left button: indicates a non-system preset,\n" +"for the right button: indicates that the settings hasn't been modified." msgstr "" -"白色彈頭; 對於左側按鈕: \t表示非系統預設,\n" -"對於右側按鈕: \t表示設置尚未被修改。" +"白色彈頭; 對於左側按鈕: 表示非系統預設,\n" +"對於右側按鈕: 表示設置尚未被修改。" #: src/slic3r/GUI/Tab.cpp:3002 msgid "" diff --git a/resources/profiles/Anycubic.idx b/resources/profiles/Anycubic.idx new file mode 100644 index 0000000000..a376daba5b --- /dev/null +++ b/resources/profiles/Anycubic.idx @@ -0,0 +1,6 @@ +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 0000000000..904926463c --- /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.4 +# 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}_{print_preset}_{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\n;[layer_z]\n\n +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\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)} F600{endif} ; Move print head up\nG1 X0 Y100 F3000 ; present print\nM84 ; disable motors +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 layer_z < max_print_height} Z{z_offset+min(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 = 450 +z_offset = 0 +single_extruder_multi_material = 0 +gcode_flavor = reprap +silent_mode = 0 +remaining_times = 0 +use_relative_e_distances = 0 +use_firmware_retraction = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +start_gcode = ; start_gcode | start\n\n; v11 2020-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 0000000000..a3837ba7ab Binary files /dev/null and b/resources/profiles/Anycubic/AK.png differ diff --git a/resources/profiles/Anycubic/AKLP_Bed.stl b/resources/profiles/Anycubic/AKLP_Bed.stl new file mode 100644 index 0000000000..07abce367f --- /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 0000000000..e2ae5c03aa Binary files /dev/null and b/resources/profiles/Anycubic/AKLP_thumbnail.png differ diff --git a/resources/profiles/Anycubic/AK_Bed.stl b/resources/profiles/Anycubic/AK_Bed.stl new file mode 100644 index 0000000000..31daa1150e Binary files /dev/null and b/resources/profiles/Anycubic/AK_Bed.stl differ diff --git a/resources/profiles/Anycubic/AK_thumbnail.png b/resources/profiles/Anycubic/AK_thumbnail.png new file mode 100644 index 0000000000..9d09428bc9 Binary files /dev/null and b/resources/profiles/Anycubic/AK_thumbnail.png differ diff --git a/resources/profiles/Anycubic/I3MEGAS_thumbnail.png b/resources/profiles/Anycubic/I3MEGAS_thumbnail.png new file mode 100644 index 0000000000..c51de42ed7 Binary files /dev/null and b/resources/profiles/Anycubic/I3MEGAS_thumbnail.png differ diff --git a/resources/profiles/Anycubic/I3MEGA_thumbnail.png b/resources/profiles/Anycubic/I3MEGA_thumbnail.png new file mode 100644 index 0000000000..464354c84c Binary files /dev/null and b/resources/profiles/Anycubic/I3MEGA_thumbnail.png differ diff --git a/resources/profiles/Anycubic/MEGA0_thumbnail.png b/resources/profiles/Anycubic/MEGA0_thumbnail.png new file mode 100644 index 0000000000..ca206123c7 Binary files /dev/null and b/resources/profiles/Anycubic/MEGA0_thumbnail.png differ diff --git a/resources/profiles/Anycubic/PREDATOR_thumbnail.png b/resources/profiles/Anycubic/PREDATOR_thumbnail.png new file mode 100644 index 0000000000..cd651a202e Binary files /dev/null and b/resources/profiles/Anycubic/PREDATOR_thumbnail.png differ diff --git a/resources/profiles/Anycubic/mega0.svg b/resources/profiles/Anycubic/mega0.svg new file mode 100644 index 0000000000..09d018a443 --- /dev/null +++ b/resources/profiles/Anycubic/mega0.svg @@ -0,0 +1,32 @@ + + + + + + ender3_bed_texture + + + + + + + + + + + + + + + + + + + + + + + + + MEGA ZERO + \ No newline at end of file diff --git a/resources/models/ender3_bed.stl b/resources/profiles/Anycubic/mega0_bed.stl similarity index 100% rename from resources/models/ender3_bed.stl rename to resources/profiles/Anycubic/mega0_bed.stl diff --git a/resources/profiles/BIBO.idx b/resources/profiles/BIBO.idx new file mode 100644 index 0000000000..8b2c163909 --- /dev/null +++ b/resources/profiles/BIBO.idx @@ -0,0 +1,14 @@ +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. +0.0.1-alpha13 Adjusted Jerk, Acceleration, and maximum feedrates to better match the stock firmware. For Dual extrusion, tool change retractions were increased. +0.0.1-alpha12 github repo created for version history +0.0.1-alpha11 Revised version available to community for testing. Removed PVA and HIPS disolvable support materials from single extruder versions. Improved single extruder second nozzle standby temperature +0.0.1-alpha8 Available to community Early adopters for testing. Corrected filament settings to prevent duplicates, and reworked start and end gcode. +# The following line (max_slic3r_version) forces the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 0.0.1-alpha12 and newer, +# so they will see the print bed. +max_slic3r_version = 2.2.0-alpha2 +min_slic3r_version = 2.2.0-alpha0 +0.0.1-alpha Initial version diff --git a/resources/profiles/BIBO.ini b/resources/profiles/BIBO.ini new file mode 100644 index 0000000000..59a8bbc74e --- /dev/null +++ b/resources/profiles/BIBO.ini @@ -0,0 +1,859 @@ +# 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.2 +# 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 +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 +end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM420 S0 ; Turn off Ditto Printing function\nM117 BIBO Print complete ; Put print complete message on screen diff --git a/resources/profiles/BIBO/BIBO2.svg b/resources/profiles/BIBO/BIBO2.svg new file mode 100644 index 0000000000..184bc35ab3 --- /dev/null +++ b/resources/profiles/BIBO/BIBO2.svg @@ -0,0 +1,108 @@ + + BIBO2_new + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/BIBO/BIBO2_bed.stl b/resources/profiles/BIBO/BIBO2_bed.stl new file mode 100644 index 0000000000..aeb2a20ff7 Binary files /dev/null and b/resources/profiles/BIBO/BIBO2_bed.stl differ diff --git a/resources/profiles/BIBO/BIBO2_thumbnail.png b/resources/profiles/BIBO/BIBO2_thumbnail.png new file mode 100644 index 0000000000..2bfa0bc7be Binary files /dev/null and b/resources/profiles/BIBO/BIBO2_thumbnail.png differ diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx new file mode 100644 index 0000000000..e3091eccc8 --- /dev/null +++ b/resources/profiles/Creality.idx @@ -0,0 +1,16 @@ +min_slic3r_version = 2.3.0-alpha2 +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 +0.0.2-alpha1 Extended list of default filaments to be installed +0.0.2-alpha0 Print bed textures are now configurable from the Preset Bundle. Requires PrusaSlicer 2.2.0-alpha3 and newer. +# The following line (max_slic3r_version) forces the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 1.1.1-alpha3 and newer, +# so they will see the print bed. +max_slic3r_version = 2.2.0-alpha2 +min_slic3r_version = 2.2.0-alpha0 +0.0.1 Initial version diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini index aa95ed6df0..1270b6f081 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.1 +config_version = 0.0.6 # 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,6 +18,145 @@ config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/Prusa name = Creality Ender-3 variants = 0.4 technology = FFF +family = ENDER +bed_model = ender3_bed.stl +bed_texture = ender3.svg +default_materials = 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. @@ -38,6 +177,7 @@ ensure_vertical_shell_thickness = 1 external_fill_pattern = rectilinear external_perimeters_first = 0 external_perimeter_extrusion_width = 0.45 +external_perimeter_speed = 25 extra_perimeters = 0 extruder_clearance_height = 25 extruder_clearance_radius = 45 @@ -56,6 +196,7 @@ infill_extrusion_width = 0.45 infill_first = 0 infill_only_where_needed = 0 infill_overlap = 25% +infill_speed = 50 interface_shells = 0 max_print_speed = 100 max_volumetric_extrusion_rate_slope_negative = 0 @@ -70,6 +211,7 @@ output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0 perimeters = 2 perimeter_extruder = 1 perimeter_extrusion_width = 0.45 +perimeter_speed = 40 post_process = print_settings_id = raft_layers = 0 @@ -84,11 +226,12 @@ solid_infill_below_area = 0 solid_infill_every_layers = 0 solid_infill_extruder = 1 solid_infill_extrusion_width = 0.45 +solid_infill_speed = 40 spiral_vase = 0 standby_temperature_delta = -5 support_material = 0 support_material_extruder = 0 -support_material_extrusion_width = 0.4 +support_material_extrusion_width = 0.38 support_material_interface_extruder = 0 support_material_angle = 0 support_material_buildplate_only = 0 @@ -106,9 +249,9 @@ support_material_threshold = 45 support_material_with_sheath = 0 support_material_xy_spacing = 60% thin_walls = 0 -top_infill_extrusion_width = 0.45 -top_solid_infill_speed = 40 -travel_speed = 100 +top_infill_extrusion_width = 0.4 +top_solid_infill_speed = 30 +travel_speed = 150 wipe_tower = 0 wipe_tower_bridging = 10 wipe_tower_rotation_angle = 0 @@ -117,75 +260,90 @@ 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*] cooling = 0 compatible_printers = -compatible_printers_condition = extrusion_multiplier = 1 filament_cost = 0 filament_density = 0 @@ -195,25 +353,26 @@ filament_settings_id = "" filament_soluble = 0 min_print_speed = 15 slowdown_below_layer_time = 20 +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* @@ -221,12 +380,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 @@ -240,9 +399,9 @@ 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 = PLA +filament_type = ABS filament_density = 1.04 filament_cost = 20 first_layer_bed_temperature = 100 @@ -254,72 +413,173 @@ 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 PET ENDER3] +[filament:Generic PETG @CREALITY] inherits = *PET* -alias=Generic 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 -temperature = 205 -bed_temperature = 40 -first_layer_temperature = 210 -first_layer_bed_temperature =40 +renamed_from = "Creality PLA @ENDER3" +filament_vendor = Creality +temperature = 200 +bed_temperature = 60 +first_layer_temperature = 205 +first_layer_bed_temperature = 60 +filament_colour = #42BDD8 -[filament:Creality PET ENDER3] +[filament:Creality PETG @CREALITY] inherits = *PET* -alias=Creality PET +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 -temperature = 215 -bed_temperature = 40 +renamed_from = "Prusament PLA @ENDER3" +filament_vendor = Prusa Polymers +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: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: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 # 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 @@ -347,8 +607,6 @@ max_layer_height = 0.3 min_layer_height = 0.07 max_print_height = 200 nozzle_diameter = 0.4 -octoprint_apikey = -octoprint_host = printer_notes = printer_settings_id = retract_before_travel = 1 @@ -362,11 +620,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 @@ -378,13 +632,15 @@ printer_model = default_print_profile = default_filament_profile = -[printer:Creality ENDER-3] +[printer:Creality Ender-3] inherits = *common* +renamed_from = "Creality ENDER-3" printer_model = ENDER3 printer_variant = 0.4 -max_layer_height = 0.25 -min_layer_height = 0.1 -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 @@ -402,14 +658,136 @@ machine_max_jerk_y = 8 machine_max_jerk_z = 0.4 machine_min_extruding_rate = 0 machine_min_travel_rate = 0 -printer_notes = 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 \ No newline at end of file +default_print_profile = 0.16mm OPTIMAL @CREALITY +default_filament_profile = Creality PLA @CREALITY +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0.0\nG1 Y190 E15.0 F1500.0 ; intro line\nG1 X2.3 F5000\nG1 Y10 E15.0 F1200.0 ; intro line\nG92 E0.0 +end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+5, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y170 F3000 ; present print\n{if layer_z < max_print_height-10}G1 Z{z_offset+min(layer_z+70, max_print_height-10)} F600{endif} ; Move print head up\nM84 X Y E ; disable motors + +[printer:*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.0\nG1 Y190 E15.0 F1500.0 ; intro line\nG1 X2.3 F5000\nG1 Y10 E15.0 F1200.0 ; intro line\nG92 E0.0 + +[printer:*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.0\nG1 Y190 E15.0 F1500.0 ; intro line\nG1 X2.3 F5000\nG1 Y10 E15.0 F1200.0 ; intro line\nG92 E0.0 + +[printer:*invertedz*] +end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+5, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F3000 ; present print\n{if layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed down\nM84 X Y E ; disable motors + +[printer:Creality Ender-3 BLTouch] +inherits = Creality Ender-3; *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 + +[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 + +[printer:Creality Ender-2] +inherits = Creality Ender-3 +renamed_from = "Creality ENDER-2" +bed_shape = 0x0,150x0,150x150,0x150 +printer_model = ENDER2 +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER2\nPRINTER_HAS_BOWDEN +max_print_height = 200 +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0.0\nG1 X15 Y135 E15.0 F1500.0 ; intro line\nG1 X2.3 F5000\nG1 Y10 E15.0 F1200.0 ; intro line\nG92 E0.0 +end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+5, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y140 F3000 ; present print\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)} F600{endif} ; Move print head up\nM84 X Y E ; disable motors + +[printer:Creality CR-10 Mini] +inherits = Creality Ender-3 +retract_length = 6 +bed_shape = 2.5x5,2.5x225,302.5x225,302.5x5 +printer_model = CR10MINI +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10MINI\nPRINTER_HAS_BOWDEN +max_print_height = 300 + +[printer:Creality CR-10] +inherits = Creality Ender-3 +retract_length = 6 +bed_shape = 5x5,305x5,305x305,5x305 +printer_model = CR10 +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10\nPRINTER_HAS_BOWDEN +max_print_height = 400 + +[printer:Creality CR-10 V2] +inherits = Creality Ender-3 +retract_length = 6 +bed_shape = 5x5,305x5,305x305,5x305 +printer_model = CR10V2 +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10V2\nPRINTER_HAS_BOWDEN +max_print_height = 400 + +[printer:Creality CR-10 V3] +inherits = Creality Ender-3 +retract_length = 1 +bed_shape = 5x5,305x5,305x305,5x305 +printer_model = CR10V3 +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10V3 +max_print_height = 400 + +[printer:Creality CR-10 S] +inherits = Creality Ender-3 +retract_length = 6 +bed_shape = 5x5,305x5,305x305,5x305 +printer_model = CR10S +printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10S\nPRINTER_HAS_BOWDEN +max_print_height = 400 + +[printer:Creality CR-10 S Pro] +inherits = Creality Ender-3; *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 0000000000..ecb9c97abc Binary files /dev/null and b/resources/profiles/Creality/CR10MINI_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10S4_thumbnail.png b/resources/profiles/Creality/CR10S4_thumbnail.png new file mode 100644 index 0000000000..ff01823c3b Binary files /dev/null and b/resources/profiles/Creality/CR10S4_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10S5_thumbnail.png b/resources/profiles/Creality/CR10S5_thumbnail.png new file mode 100644 index 0000000000..ff01823c3b Binary files /dev/null and b/resources/profiles/Creality/CR10S5_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10SPROV2_thumbnail.png b/resources/profiles/Creality/CR10SPROV2_thumbnail.png new file mode 100644 index 0000000000..e7d2977254 Binary files /dev/null and b/resources/profiles/Creality/CR10SPROV2_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10SPRO_thumbnail.png b/resources/profiles/Creality/CR10SPRO_thumbnail.png new file mode 100644 index 0000000000..84e9b6c823 Binary files /dev/null and b/resources/profiles/Creality/CR10SPRO_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10S_thumbnail.png b/resources/profiles/Creality/CR10S_thumbnail.png new file mode 100644 index 0000000000..1a8f0eb023 Binary files /dev/null and b/resources/profiles/Creality/CR10S_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10V2_thumbnail.png b/resources/profiles/Creality/CR10V2_thumbnail.png new file mode 100644 index 0000000000..325e58a622 Binary files /dev/null and b/resources/profiles/Creality/CR10V2_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10V3_thumbnail.png b/resources/profiles/Creality/CR10V3_thumbnail.png new file mode 100644 index 0000000000..2019ec28ca Binary files /dev/null and b/resources/profiles/Creality/CR10V3_thumbnail.png differ diff --git a/resources/profiles/Creality/CR10_thumbnail.png b/resources/profiles/Creality/CR10_thumbnail.png new file mode 100644 index 0000000000..53cdac9d58 Binary files /dev/null and b/resources/profiles/Creality/CR10_thumbnail.png differ diff --git a/resources/profiles/Creality/CR20PRO_thumbnail.png b/resources/profiles/Creality/CR20PRO_thumbnail.png new file mode 100644 index 0000000000..d420c6c658 Binary files /dev/null and b/resources/profiles/Creality/CR20PRO_thumbnail.png differ diff --git a/resources/profiles/Creality/CR20_thumbnail.png b/resources/profiles/Creality/CR20_thumbnail.png new file mode 100644 index 0000000000..d8dfdf5dc7 Binary files /dev/null and b/resources/profiles/Creality/CR20_thumbnail.png differ diff --git a/resources/profiles/Creality/ENDER2_thumbnail.png b/resources/profiles/Creality/ENDER2_thumbnail.png new file mode 100644 index 0000000000..f4bcd8dc52 Binary files /dev/null and b/resources/profiles/Creality/ENDER2_thumbnail.png differ diff --git a/resources/profiles/Creality/ENDER3BLTOUCH_thumbnail.png b/resources/profiles/Creality/ENDER3BLTOUCH_thumbnail.png new file mode 100644 index 0000000000..4234b2dde3 Binary files /dev/null and b/resources/profiles/Creality/ENDER3BLTOUCH_thumbnail.png differ diff --git a/resources/profiles/Creality/ENDER3_thumbnail.png b/resources/profiles/Creality/ENDER3_thumbnail.png new file mode 100644 index 0000000000..4234b2dde3 Binary files /dev/null and b/resources/profiles/Creality/ENDER3_thumbnail.png differ diff --git a/resources/profiles/Creality/ENDER5PLUS_thumbnail.png b/resources/profiles/Creality/ENDER5PLUS_thumbnail.png new file mode 100644 index 0000000000..c76667e012 Binary files /dev/null and b/resources/profiles/Creality/ENDER5PLUS_thumbnail.png differ diff --git a/resources/profiles/Creality/ENDER5_thumbnail.png b/resources/profiles/Creality/ENDER5_thumbnail.png new file mode 100644 index 0000000000..51a7b3149b Binary files /dev/null and b/resources/profiles/Creality/ENDER5_thumbnail.png differ diff --git a/resources/profiles/Creality/cr10.svg b/resources/profiles/Creality/cr10.svg new file mode 100644 index 0000000000..67cb4bd374 --- /dev/null +++ b/resources/profiles/Creality/cr10.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr10_bed.stl b/resources/profiles/Creality/cr10_bed.stl new file mode 100644 index 0000000000..8329461848 --- /dev/null +++ b/resources/profiles/Creality/cr10_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 152.105 -154.998 -3 + vertex 152.002 -154.998 -3 + vertex 152.314 -154.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.314 -154.984 -3 + vertex 152.002 -154.998 -3 + vertex 152.521 -154.954 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 155 -152 -3 + vertex 152.002 -154.998 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.521 -154.954 -3 + vertex 152.002 -154.998 -3 + vertex 152.726 -154.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.726 -154.911 -3 + vertex 152.002 -154.998 -3 + vertex 152.927 -154.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.927 -154.853 -3 + vertex 152.002 -154.998 -3 + vertex 153.124 -154.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.124 -154.782 -3 + vertex 152.002 -154.998 -3 + vertex 153.315 -154.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.315 -154.696 -3 + vertex 152.002 -154.998 -3 + vertex 153.5 -154.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.5 -154.598 -3 + vertex 152.002 -154.998 -3 + vertex 153.678 -154.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.678 -154.487 -3 + vertex 152.002 -154.998 -3 + vertex 153.847 -154.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.847 -154.364 -3 + vertex 152.002 -154.998 -3 + vertex 154.007 -154.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.007 -154.229 -3 + vertex 152.002 -154.998 -3 + vertex 154.158 -154.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.158 -154.084 -3 + vertex 152.002 -154.998 -3 + vertex 154.298 -153.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.298 -153.928 -3 + vertex 152.002 -154.998 -3 + vertex 154.427 -153.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.427 -153.763 -3 + vertex 152.002 -154.998 -3 + vertex 154.544 -153.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.544 -153.59 -3 + vertex 152.002 -154.998 -3 + vertex 154.649 -153.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.649 -153.408 -3 + vertex 152.002 -154.998 -3 + vertex 154.741 -153.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.741 -153.22 -3 + vertex 152.002 -154.998 -3 + vertex 154.819 -153.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.819 -153.026 -3 + vertex 152.002 -154.998 -3 + vertex 154.884 -152.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.884 -152.827 -3 + vertex 152.002 -154.998 -3 + vertex 154.934 -152.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.934 -152.624 -3 + vertex 152.002 -154.998 -3 + vertex 154.971 -152.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.971 -152.418 -3 + vertex 152.002 -154.998 -3 + vertex 154.993 -152.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.993 -152.209 -3 + vertex 152.002 -154.998 -3 + vertex 155 -152 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 155 -152 -3 + vertex 152.002 154.998 -3 + vertex 155 152 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 154.971 152.418 -3 + vertex 154.993 152.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.884 152.827 -3 + vertex 154.934 152.624 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.741 153.22 -3 + vertex 152.002 154.998 -3 + vertex 154.649 153.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.741 153.22 -3 + vertex 154.819 153.026 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 154.007 154.229 -3 + vertex 154.158 154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.427 153.763 -3 + vertex 152.002 154.998 -3 + vertex 154.298 153.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.427 153.763 -3 + vertex 154.544 153.59 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.298 153.928 -3 + vertex 152.002 154.998 -3 + vertex 154.158 154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 152.927 154.853 -3 + vertex 153.124 154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.847 154.364 -3 + vertex 152.002 154.998 -3 + vertex 153.678 154.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 153.847 154.364 -3 + vertex 154.007 154.229 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.678 154.487 -3 + vertex 152.002 154.998 -3 + vertex 153.5 154.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.5 154.598 -3 + vertex 152.002 154.998 -3 + vertex 153.315 154.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.315 154.696 -3 + vertex 152.002 154.998 -3 + vertex 153.124 154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.649 153.408 -3 + vertex 152.002 154.998 -3 + vertex 154.544 153.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.726 154.911 -3 + vertex 152.002 154.998 -3 + vertex 152.521 154.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.726 154.911 -3 + vertex 152.927 154.853 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.819 153.026 -3 + vertex 154.884 152.827 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.314 154.984 -3 + vertex 152.521 154.954 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 154.934 152.624 -3 + vertex 154.971 152.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 154.998 -3 + vertex 152.105 154.998 -3 + vertex 152.314 154.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 155 152 -3 + vertex 152.002 154.998 -3 + vertex 154.993 152.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -152 155 -3 + vertex 152 155 -3 + vertex -152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex 152 155 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 -154.998 -3 + vertex -152.002 154.998 -3 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 -152 -3 + vertex -155 152 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -152.314 154.984 -3 + vertex -152.105 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -152.521 154.954 -3 + vertex -152.314 154.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -152.726 154.911 -3 + vertex -152.521 154.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -152.927 154.853 -3 + vertex -152.726 154.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.124 154.782 -3 + vertex -152.927 154.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.315 154.696 -3 + vertex -153.124 154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.5 154.598 -3 + vertex -153.315 154.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.678 154.487 -3 + vertex -153.5 154.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -153.847 154.364 -3 + vertex -153.678 154.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.007 154.229 -3 + vertex -153.847 154.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.158 154.084 -3 + vertex -154.007 154.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.298 153.928 -3 + vertex -154.158 154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.427 153.763 -3 + vertex -154.298 153.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.544 153.59 -3 + vertex -154.427 153.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.649 153.408 -3 + vertex -154.544 153.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.741 153.22 -3 + vertex -154.649 153.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.819 153.026 -3 + vertex -154.741 153.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.884 152.827 -3 + vertex -154.819 153.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.934 152.624 -3 + vertex -154.884 152.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.971 152.418 -3 + vertex -154.934 152.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -154.993 152.209 -3 + vertex -154.971 152.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 154.998 -3 + vertex -155 152 -3 + vertex -154.993 152.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -155 152 -3 + vertex -152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 -154.998 -3 + vertex -152.002 -154.998 -3 + vertex -152.002 154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -154.971 -152.418 -3 + vertex -154.993 -152.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.884 -152.827 -3 + vertex -154.934 -152.624 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.741 -153.22 -3 + vertex -152.002 -154.998 -3 + vertex -154.649 -153.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.741 -153.22 -3 + vertex -154.819 -153.026 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -154.007 -154.229 -3 + vertex -154.158 -154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.427 -153.763 -3 + vertex -152.002 -154.998 -3 + vertex -154.298 -153.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.427 -153.763 -3 + vertex -154.544 -153.59 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.298 -153.928 -3 + vertex -152.002 -154.998 -3 + vertex -154.158 -154.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -152.927 -154.853 -3 + vertex -153.124 -154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.847 -154.364 -3 + vertex -152.002 -154.998 -3 + vertex -153.678 -154.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.847 -154.364 -3 + vertex -154.007 -154.229 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.678 -154.487 -3 + vertex -152.002 -154.998 -3 + vertex -153.5 -154.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.5 -154.598 -3 + vertex -152.002 -154.998 -3 + vertex -153.315 -154.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.315 -154.696 -3 + vertex -152.002 -154.998 -3 + vertex -153.124 -154.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.649 -153.408 -3 + vertex -152.002 -154.998 -3 + vertex -154.544 -153.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.726 -154.911 -3 + vertex -152.002 -154.998 -3 + vertex -152.521 -154.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.726 -154.911 -3 + vertex -152.927 -154.853 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.819 -153.026 -3 + vertex -154.884 -152.827 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.314 -154.984 -3 + vertex -152.521 -154.954 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -154.934 -152.624 -3 + vertex -154.971 -152.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex -152.105 -154.998 -3 + vertex -152.314 -154.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.002 -154.998 -3 + vertex 152 -155 -3 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -154.998 -3 + vertex 152 -155 -3 + vertex -152 -155 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 -152 -3 + vertex -152.002 -154.998 -3 + vertex -154.993 -152.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.314 -154.984 0 + vertex 152.002 -154.998 0 + vertex 152.105 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.521 -154.954 0 + vertex 152.002 -154.998 0 + vertex 152.314 -154.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 152.002 -154.998 0 + vertex 155 -152 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.726 -154.911 0 + vertex 152.002 -154.998 0 + vertex 152.521 -154.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.927 -154.853 0 + vertex 152.002 -154.998 0 + vertex 152.726 -154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 -154.782 0 + vertex 152.002 -154.998 0 + vertex 152.927 -154.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.315 -154.696 0 + vertex 152.002 -154.998 0 + vertex 153.124 -154.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.5 -154.598 0 + vertex 152.002 -154.998 0 + vertex 153.315 -154.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.678 -154.487 0 + vertex 152.002 -154.998 0 + vertex 153.5 -154.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.847 -154.364 0 + vertex 152.002 -154.998 0 + vertex 153.678 -154.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.007 -154.229 0 + vertex 152.002 -154.998 0 + vertex 153.847 -154.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 -154.084 0 + vertex 152.002 -154.998 0 + vertex 154.007 -154.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.298 -153.928 0 + vertex 152.002 -154.998 0 + vertex 154.158 -154.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.427 -153.763 0 + vertex 152.002 -154.998 0 + vertex 154.298 -153.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.544 -153.59 0 + vertex 152.002 -154.998 0 + vertex 154.427 -153.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.649 -153.408 0 + vertex 152.002 -154.998 0 + vertex 154.544 -153.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.741 -153.22 0 + vertex 152.002 -154.998 0 + vertex 154.649 -153.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.819 -153.026 0 + vertex 152.002 -154.998 0 + vertex 154.741 -153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.884 -152.827 0 + vertex 152.002 -154.998 0 + vertex 154.819 -153.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.934 -152.624 0 + vertex 152.002 -154.998 0 + vertex 154.884 -152.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.971 -152.418 0 + vertex 152.002 -154.998 0 + vertex 154.934 -152.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 -152.209 0 + vertex 152.002 -154.998 0 + vertex 154.971 -152.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 -152 0 + vertex 152.002 -154.998 0 + vertex 154.993 -152.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 152 0 + vertex 152.002 154.998 0 + vertex 155 -152 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 152.209 0 + vertex 154.971 152.418 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.934 152.624 0 + vertex 154.884 152.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.649 153.408 0 + vertex 152.002 154.998 0 + vertex 154.741 153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.819 153.026 0 + vertex 154.741 153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 154.084 0 + vertex 154.007 154.229 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.298 153.928 0 + vertex 152.002 154.998 0 + vertex 154.427 153.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.544 153.59 0 + vertex 154.427 153.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 154.084 0 + vertex 152.002 154.998 0 + vertex 154.298 153.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 154.782 0 + vertex 152.927 154.853 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.678 154.487 0 + vertex 152.002 154.998 0 + vertex 153.847 154.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.007 154.229 0 + vertex 153.847 154.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.5 154.598 0 + vertex 152.002 154.998 0 + vertex 153.678 154.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.315 154.696 0 + vertex 152.002 154.998 0 + vertex 153.5 154.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 154.782 0 + vertex 152.002 154.998 0 + vertex 153.315 154.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.544 153.59 0 + vertex 152.002 154.998 0 + vertex 154.649 153.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.521 154.954 0 + vertex 152.002 154.998 0 + vertex 152.726 154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 152.927 154.853 0 + vertex 152.726 154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 154.884 152.827 0 + vertex 154.819 153.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 152.521 154.954 0 + vertex 152.314 154.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.971 152.418 0 + vertex 154.934 152.624 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.314 154.984 0 + vertex 152.105 154.998 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 152.209 0 + vertex 152.002 154.998 0 + vertex 155 152 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 154.998 0 + vertex 152 155 0 + vertex -152 155 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex 152 155 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 154.998 0 + vertex -152.002 154.998 0 + vertex 152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -155 152 0 + vertex -155 -152 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.105 154.998 0 + vertex -152.314 154.984 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.314 154.984 0 + vertex -152.521 154.954 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.521 154.954 0 + vertex -152.726 154.911 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.726 154.911 0 + vertex -152.927 154.853 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.927 154.853 0 + vertex -153.124 154.782 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.124 154.782 0 + vertex -153.315 154.696 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.315 154.696 0 + vertex -153.5 154.598 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.5 154.598 0 + vertex -153.678 154.487 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.678 154.487 0 + vertex -153.847 154.364 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.847 154.364 0 + vertex -154.007 154.229 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.007 154.229 0 + vertex -154.158 154.084 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.158 154.084 0 + vertex -154.298 153.928 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.298 153.928 0 + vertex -154.427 153.763 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.427 153.763 0 + vertex -154.544 153.59 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.544 153.59 0 + vertex -154.649 153.408 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.649 153.408 0 + vertex -154.741 153.22 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.741 153.22 0 + vertex -154.819 153.026 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.819 153.026 0 + vertex -154.884 152.827 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.884 152.827 0 + vertex -154.934 152.624 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.934 152.624 0 + vertex -154.971 152.418 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.971 152.418 0 + vertex -154.993 152.209 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.993 152.209 0 + vertex -155 152 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 154.998 0 + vertex -155 152 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 154.998 0 + vertex -152.002 -154.998 0 + vertex 152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.993 -152.209 0 + vertex -154.971 -152.418 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.934 -152.624 0 + vertex -154.884 -152.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.649 -153.408 0 + vertex -152.002 -154.998 0 + vertex -154.741 -153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.819 -153.026 0 + vertex -154.741 -153.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.158 -154.084 0 + vertex -154.007 -154.229 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.298 -153.928 0 + vertex -152.002 -154.998 0 + vertex -154.427 -153.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.544 -153.59 0 + vertex -154.427 -153.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.158 -154.084 0 + vertex -152.002 -154.998 0 + vertex -154.298 -153.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -153.124 -154.782 0 + vertex -152.927 -154.853 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.678 -154.487 0 + vertex -152.002 -154.998 0 + vertex -153.847 -154.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.007 -154.229 0 + vertex -153.847 -154.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.5 -154.598 0 + vertex -152.002 -154.998 0 + vertex -153.678 -154.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.315 -154.696 0 + vertex -152.002 -154.998 0 + vertex -153.5 -154.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.124 -154.782 0 + vertex -152.002 -154.998 0 + vertex -153.315 -154.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.544 -153.59 0 + vertex -152.002 -154.998 0 + vertex -154.649 -153.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -152.521 -154.954 0 + vertex -152.002 -154.998 0 + vertex -152.726 -154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -152.927 -154.853 0 + vertex -152.726 -154.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -154.884 -152.827 0 + vertex -154.819 -153.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex -152.521 -154.954 0 + vertex -152.314 -154.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.971 -152.418 0 + vertex -154.934 -152.624 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.314 -154.984 0 + vertex -152.105 -154.998 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.002 -154.998 0 + vertex 152 -155 0 + vertex 152.002 -154.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -152 -155 0 + vertex 152 -155 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.993 -152.209 0 + vertex -152.002 -154.998 0 + vertex -155 -152 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152.105 -154.998 -3 + vertex 152.002 -154.998 0 + vertex 152.002 -154.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152.105 -154.998 -3 + vertex 152.105 -154.998 0 + vertex 152.002 -154.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 152.314 -154.984 -3 + vertex 152.105 -154.998 0 + vertex 152.105 -154.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 152.314 -154.984 -3 + vertex 152.314 -154.984 0 + vertex 152.105 -154.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 152.521 -154.954 -3 + vertex 152.314 -154.984 0 + vertex 152.314 -154.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 152.521 -154.954 -3 + vertex 152.521 -154.954 0 + vertex 152.314 -154.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 152.726 -154.911 -3 + vertex 152.521 -154.954 0 + vertex 152.521 -154.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 152.726 -154.911 -3 + vertex 152.726 -154.911 0 + vertex 152.521 -154.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 152.927 -154.853 -3 + vertex 152.726 -154.911 0 + vertex 152.726 -154.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 152.927 -154.853 -3 + vertex 152.927 -154.853 0 + vertex 152.726 -154.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 153.124 -154.782 -3 + vertex 152.927 -154.853 0 + vertex 152.927 -154.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 153.124 -154.782 -3 + vertex 153.124 -154.782 0 + vertex 152.927 -154.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 153.315 -154.696 -3 + vertex 153.124 -154.782 0 + vertex 153.124 -154.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 153.315 -154.696 -3 + vertex 153.315 -154.696 0 + vertex 153.124 -154.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 153.5 -154.598 -3 + vertex 153.315 -154.696 0 + vertex 153.315 -154.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 153.5 -154.598 -3 + vertex 153.5 -154.598 0 + vertex 153.315 -154.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 153.678 -154.487 -3 + vertex 153.5 -154.598 0 + vertex 153.5 -154.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 153.678 -154.487 -3 + vertex 153.678 -154.487 0 + vertex 153.5 -154.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 153.847 -154.364 -3 + vertex 153.678 -154.487 0 + vertex 153.678 -154.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 153.847 -154.364 -3 + vertex 153.847 -154.364 0 + vertex 153.678 -154.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 154.007 -154.229 -3 + vertex 153.847 -154.364 0 + vertex 153.847 -154.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 154.007 -154.229 -3 + vertex 154.007 -154.229 0 + vertex 153.847 -154.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 154.158 -154.084 -3 + vertex 154.007 -154.229 0 + vertex 154.007 -154.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 154.158 -154.084 -3 + vertex 154.158 -154.084 0 + vertex 154.007 -154.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 154.298 -153.928 -3 + vertex 154.158 -154.084 0 + vertex 154.158 -154.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 154.298 -153.928 -3 + vertex 154.298 -153.928 0 + vertex 154.158 -154.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 154.427 -153.763 -3 + vertex 154.298 -153.928 0 + vertex 154.298 -153.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 154.427 -153.763 -3 + vertex 154.427 -153.763 0 + vertex 154.298 -153.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 154.544 -153.59 -3 + vertex 154.427 -153.763 0 + vertex 154.427 -153.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 154.544 -153.59 -3 + vertex 154.544 -153.59 0 + vertex 154.427 -153.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 154.649 -153.408 -3 + vertex 154.544 -153.59 0 + vertex 154.544 -153.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 154.649 -153.408 -3 + vertex 154.649 -153.408 0 + vertex 154.544 -153.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 154.741 -153.22 -3 + vertex 154.649 -153.408 0 + vertex 154.649 -153.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 154.741 -153.22 -3 + vertex 154.741 -153.22 0 + vertex 154.649 -153.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 154.819 -153.026 -3 + vertex 154.741 -153.22 0 + vertex 154.741 -153.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 154.819 -153.026 -3 + vertex 154.819 -153.026 0 + vertex 154.741 -153.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 154.884 -152.827 -3 + vertex 154.819 -153.026 0 + vertex 154.819 -153.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 154.884 -152.827 -3 + vertex 154.884 -152.827 0 + vertex 154.819 -153.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 154.934 -152.624 -3 + vertex 154.884 -152.827 0 + vertex 154.884 -152.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 154.934 -152.624 -3 + vertex 154.934 -152.624 0 + vertex 154.884 -152.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 154.971 -152.418 -3 + vertex 154.934 -152.624 0 + vertex 154.934 -152.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 154.971 -152.418 -3 + vertex 154.971 -152.418 0 + vertex 154.934 -152.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 154.993 -152.209 -3 + vertex 154.971 -152.418 0 + vertex 154.971 -152.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 154.993 -152.209 -3 + vertex 154.993 -152.209 0 + vertex 154.971 -152.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 155 -152 -3 + vertex 154.993 -152.209 0 + vertex 154.993 -152.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 155 -152 -3 + vertex 155 -152 0 + vertex 154.993 -152.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 155 152 -3 + vertex 155 -152 0 + vertex 155 -152 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 155 152 -3 + vertex 155 152 0 + vertex 155 -152 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 154.993 152.209 -3 + vertex 155 152 0 + vertex 155 152 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 154.993 152.209 -3 + vertex 154.993 152.209 0 + vertex 155 152 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 154.971 152.418 -3 + vertex 154.993 152.209 0 + vertex 154.993 152.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 154.971 152.418 -3 + vertex 154.971 152.418 0 + vertex 154.993 152.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 154.934 152.624 -3 + vertex 154.971 152.418 0 + vertex 154.971 152.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 154.934 152.624 -3 + vertex 154.934 152.624 0 + vertex 154.971 152.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 154.884 152.827 -3 + vertex 154.934 152.624 0 + vertex 154.934 152.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 154.884 152.827 -3 + vertex 154.884 152.827 0 + vertex 154.934 152.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 154.819 153.026 -3 + vertex 154.884 152.827 0 + vertex 154.884 152.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 154.819 153.026 -3 + vertex 154.819 153.026 0 + vertex 154.884 152.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 154.741 153.22 -3 + vertex 154.819 153.026 0 + vertex 154.819 153.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 154.741 153.22 -3 + vertex 154.741 153.22 0 + vertex 154.819 153.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 154.649 153.408 -3 + vertex 154.741 153.22 0 + vertex 154.741 153.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 154.649 153.408 -3 + vertex 154.649 153.408 0 + vertex 154.741 153.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 154.544 153.59 -3 + vertex 154.649 153.408 0 + vertex 154.649 153.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 154.544 153.59 -3 + vertex 154.544 153.59 0 + vertex 154.649 153.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 154.427 153.763 -3 + vertex 154.544 153.59 0 + vertex 154.544 153.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 154.427 153.763 -3 + vertex 154.427 153.763 0 + vertex 154.544 153.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 154.298 153.928 -3 + vertex 154.427 153.763 0 + vertex 154.427 153.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 154.298 153.928 -3 + vertex 154.298 153.928 0 + vertex 154.427 153.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 154.158 154.084 -3 + vertex 154.298 153.928 0 + vertex 154.298 153.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 154.158 154.084 -3 + vertex 154.158 154.084 0 + vertex 154.298 153.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 154.007 154.229 -3 + vertex 154.158 154.084 0 + vertex 154.158 154.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 154.007 154.229 -3 + vertex 154.007 154.229 0 + vertex 154.158 154.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 153.847 154.364 -3 + vertex 154.007 154.229 0 + vertex 154.007 154.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 153.847 154.364 -3 + vertex 153.847 154.364 0 + vertex 154.007 154.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 153.678 154.487 -3 + vertex 153.847 154.364 0 + vertex 153.847 154.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 153.678 154.487 -3 + vertex 153.678 154.487 0 + vertex 153.847 154.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 153.5 154.598 -3 + vertex 153.678 154.487 0 + vertex 153.678 154.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 153.5 154.598 -3 + vertex 153.5 154.598 0 + vertex 153.678 154.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 153.315 154.696 -3 + vertex 153.5 154.598 0 + vertex 153.5 154.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 153.315 154.696 -3 + vertex 153.315 154.696 0 + vertex 153.5 154.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 153.124 154.782 -3 + vertex 153.315 154.696 0 + vertex 153.315 154.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 153.124 154.782 -3 + vertex 153.124 154.782 0 + vertex 153.315 154.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 152.927 154.853 -3 + vertex 153.124 154.782 0 + vertex 153.124 154.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 152.927 154.853 -3 + vertex 152.927 154.853 0 + vertex 153.124 154.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 152.726 154.911 -3 + vertex 152.927 154.853 0 + vertex 152.927 154.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 152.726 154.911 -3 + vertex 152.726 154.911 0 + vertex 152.927 154.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 152.521 154.954 -3 + vertex 152.726 154.911 0 + vertex 152.726 154.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 152.521 154.954 -3 + vertex 152.521 154.954 0 + vertex 152.726 154.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 152.314 154.984 -3 + vertex 152.521 154.954 0 + vertex 152.521 154.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 152.314 154.984 -3 + vertex 152.314 154.984 0 + vertex 152.521 154.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 152.105 154.998 -3 + vertex 152.314 154.984 0 + vertex 152.314 154.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 152.105 154.998 -3 + vertex 152.105 154.998 0 + vertex 152.314 154.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 152.002 154.998 -3 + vertex 152.105 154.998 0 + vertex 152.105 154.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 152.002 154.998 -3 + vertex 152.002 154.998 0 + vertex 152.105 154.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 152 155 -3 + vertex 152.002 154.998 0 + vertex 152.002 154.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 152 155 -3 + vertex 152 155 0 + vertex 152.002 154.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152 155 -3 + vertex 152 155 0 + vertex 152 155 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152 155 -3 + vertex -152 155 0 + vertex 152 155 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -152.002 154.998 -3 + vertex -152 155 0 + vertex -152 155 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -152.002 154.998 -3 + vertex -152.002 154.998 0 + vertex -152 155 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152.105 154.998 -3 + vertex -152.002 154.998 0 + vertex -152.002 154.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152.105 154.998 -3 + vertex -152.105 154.998 0 + vertex -152.002 154.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -152.314 154.984 -3 + vertex -152.105 154.998 0 + vertex -152.105 154.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -152.314 154.984 -3 + vertex -152.314 154.984 0 + vertex -152.105 154.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -152.521 154.954 -3 + vertex -152.314 154.984 0 + vertex -152.314 154.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -152.521 154.954 -3 + vertex -152.521 154.954 0 + vertex -152.314 154.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -152.726 154.911 -3 + vertex -152.521 154.954 0 + vertex -152.521 154.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -152.726 154.911 -3 + vertex -152.726 154.911 0 + vertex -152.521 154.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -152.927 154.853 -3 + vertex -152.726 154.911 0 + vertex -152.726 154.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -152.927 154.853 -3 + vertex -152.927 154.853 0 + vertex -152.726 154.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -153.124 154.782 -3 + vertex -152.927 154.853 0 + vertex -152.927 154.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -153.124 154.782 -3 + vertex -153.124 154.782 0 + vertex -152.927 154.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -153.315 154.696 -3 + vertex -153.124 154.782 0 + vertex -153.124 154.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -153.315 154.696 -3 + vertex -153.315 154.696 0 + vertex -153.124 154.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -153.5 154.598 -3 + vertex -153.315 154.696 0 + vertex -153.315 154.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -153.5 154.598 -3 + vertex -153.5 154.598 0 + vertex -153.315 154.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -153.678 154.487 -3 + vertex -153.5 154.598 0 + vertex -153.5 154.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -153.678 154.487 -3 + vertex -153.678 154.487 0 + vertex -153.5 154.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -153.847 154.364 -3 + vertex -153.678 154.487 0 + vertex -153.678 154.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -153.847 154.364 -3 + vertex -153.847 154.364 0 + vertex -153.678 154.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -154.007 154.229 -3 + vertex -153.847 154.364 0 + vertex -153.847 154.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -154.007 154.229 -3 + vertex -154.007 154.229 0 + vertex -153.847 154.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -154.158 154.084 -3 + vertex -154.007 154.229 0 + vertex -154.007 154.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -154.158 154.084 -3 + vertex -154.158 154.084 0 + vertex -154.007 154.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -154.298 153.928 -3 + vertex -154.158 154.084 0 + vertex -154.158 154.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -154.298 153.928 -3 + vertex -154.298 153.928 0 + vertex -154.158 154.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -154.427 153.763 -3 + vertex -154.298 153.928 0 + vertex -154.298 153.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -154.427 153.763 -3 + vertex -154.427 153.763 0 + vertex -154.298 153.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -154.544 153.59 -3 + vertex -154.427 153.763 0 + vertex -154.427 153.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -154.544 153.59 -3 + vertex -154.544 153.59 0 + vertex -154.427 153.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -154.649 153.408 -3 + vertex -154.544 153.59 0 + vertex -154.544 153.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -154.649 153.408 -3 + vertex -154.649 153.408 0 + vertex -154.544 153.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -154.741 153.22 -3 + vertex -154.649 153.408 0 + vertex -154.649 153.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -154.741 153.22 -3 + vertex -154.741 153.22 0 + vertex -154.649 153.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -154.819 153.026 -3 + vertex -154.741 153.22 0 + vertex -154.741 153.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -154.819 153.026 -3 + vertex -154.819 153.026 0 + vertex -154.741 153.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -154.884 152.827 -3 + vertex -154.819 153.026 0 + vertex -154.819 153.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -154.884 152.827 -3 + vertex -154.884 152.827 0 + vertex -154.819 153.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -154.934 152.624 -3 + vertex -154.884 152.827 0 + vertex -154.884 152.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -154.934 152.624 -3 + vertex -154.934 152.624 0 + vertex -154.884 152.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -154.971 152.418 -3 + vertex -154.934 152.624 0 + vertex -154.934 152.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -154.971 152.418 -3 + vertex -154.971 152.418 0 + vertex -154.934 152.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -154.993 152.209 -3 + vertex -154.971 152.418 0 + vertex -154.971 152.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -154.993 152.209 -3 + vertex -154.993 152.209 0 + vertex -154.971 152.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -155 152 -3 + vertex -154.993 152.209 0 + vertex -154.993 152.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -155 152 -3 + vertex -155 152 0 + vertex -154.993 152.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -155 -152 -3 + vertex -155 152 0 + vertex -155 152 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -155 -152 -3 + vertex -155 -152 0 + vertex -155 152 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -154.993 -152.209 -3 + vertex -155 -152 0 + vertex -155 -152 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -154.993 -152.209 -3 + vertex -154.993 -152.209 0 + vertex -155 -152 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -154.971 -152.418 -3 + vertex -154.993 -152.209 0 + vertex -154.993 -152.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -154.971 -152.418 -3 + vertex -154.971 -152.418 0 + vertex -154.993 -152.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -154.934 -152.624 -3 + vertex -154.971 -152.418 0 + vertex -154.971 -152.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -154.934 -152.624 -3 + vertex -154.934 -152.624 0 + vertex -154.971 -152.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -154.884 -152.827 -3 + vertex -154.934 -152.624 0 + vertex -154.934 -152.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -154.884 -152.827 -3 + vertex -154.884 -152.827 0 + vertex -154.934 -152.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -154.819 -153.026 -3 + vertex -154.884 -152.827 0 + vertex -154.884 -152.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -154.819 -153.026 -3 + vertex -154.819 -153.026 0 + vertex -154.884 -152.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -154.741 -153.22 -3 + vertex -154.819 -153.026 0 + vertex -154.819 -153.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -154.741 -153.22 -3 + vertex -154.741 -153.22 0 + vertex -154.819 -153.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -154.649 -153.408 -3 + vertex -154.741 -153.22 0 + vertex -154.741 -153.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -154.649 -153.408 -3 + vertex -154.649 -153.408 0 + vertex -154.741 -153.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -154.544 -153.59 -3 + vertex -154.649 -153.408 0 + vertex -154.649 -153.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -154.544 -153.59 -3 + vertex -154.544 -153.59 0 + vertex -154.649 -153.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -154.427 -153.763 -3 + vertex -154.544 -153.59 0 + vertex -154.544 -153.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -154.427 -153.763 -3 + vertex -154.427 -153.763 0 + vertex -154.544 -153.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -154.298 -153.928 -3 + vertex -154.427 -153.763 0 + vertex -154.427 -153.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -154.298 -153.928 -3 + vertex -154.298 -153.928 0 + vertex -154.427 -153.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -154.158 -154.084 -3 + vertex -154.298 -153.928 0 + vertex -154.298 -153.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -154.158 -154.084 -3 + vertex -154.158 -154.084 0 + vertex -154.298 -153.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -154.007 -154.229 -3 + vertex -154.158 -154.084 0 + vertex -154.158 -154.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -154.007 -154.229 -3 + vertex -154.007 -154.229 0 + vertex -154.158 -154.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -153.847 -154.364 -3 + vertex -154.007 -154.229 0 + vertex -154.007 -154.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -153.847 -154.364 -3 + vertex -153.847 -154.364 0 + vertex -154.007 -154.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -153.678 -154.487 -3 + vertex -153.847 -154.364 0 + vertex -153.847 -154.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -153.678 -154.487 -3 + vertex -153.678 -154.487 0 + vertex -153.847 -154.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -153.5 -154.598 -3 + vertex -153.678 -154.487 0 + vertex -153.678 -154.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -153.5 -154.598 -3 + vertex -153.5 -154.598 0 + vertex -153.678 -154.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -153.315 -154.696 -3 + vertex -153.5 -154.598 0 + vertex -153.5 -154.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -153.315 -154.696 -3 + vertex -153.315 -154.696 0 + vertex -153.5 -154.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -153.124 -154.782 -3 + vertex -153.315 -154.696 0 + vertex -153.315 -154.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -153.124 -154.782 -3 + vertex -153.124 -154.782 0 + vertex -153.315 -154.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -152.927 -154.853 -3 + vertex -153.124 -154.782 0 + vertex -153.124 -154.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -152.927 -154.853 -3 + vertex -152.927 -154.853 0 + vertex -153.124 -154.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -152.726 -154.911 -3 + vertex -152.927 -154.853 0 + vertex -152.927 -154.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -152.726 -154.911 -3 + vertex -152.726 -154.911 0 + vertex -152.927 -154.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -152.521 -154.954 -3 + vertex -152.726 -154.911 0 + vertex -152.726 -154.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -152.521 -154.954 -3 + vertex -152.521 -154.954 0 + vertex -152.726 -154.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -152.314 -154.984 -3 + vertex -152.521 -154.954 0 + vertex -152.521 -154.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -152.314 -154.984 -3 + vertex -152.314 -154.984 0 + vertex -152.521 -154.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -152.105 -154.998 -3 + vertex -152.314 -154.984 0 + vertex -152.314 -154.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -152.105 -154.998 -3 + vertex -152.105 -154.998 0 + vertex -152.314 -154.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -152.002 -154.998 -3 + vertex -152.105 -154.998 0 + vertex -152.105 -154.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -152.002 -154.998 -3 + vertex -152.002 -154.998 0 + vertex -152.105 -154.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -152 -155 -3 + vertex -152.002 -154.998 0 + vertex -152.002 -154.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -152 -155 -3 + vertex -152 -155 0 + vertex -152.002 -154.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152 -155 -3 + vertex -152 -155 0 + vertex -152 -155 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152 -155 -3 + vertex 152 -155 0 + vertex -152 -155 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 152.002 -154.998 -3 + vertex 152 -155 0 + vertex 152 -155 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 152.002 -154.998 -3 + vertex 152.002 -154.998 0 + vertex 152 -155 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr10mini.svg b/resources/profiles/Creality/cr10mini.svg new file mode 100644 index 0000000000..177c6df49f --- /dev/null +++ b/resources/profiles/Creality/cr10mini.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr10mini_bed.stl b/resources/profiles/Creality/cr10mini_bed.stl new file mode 100644 index 0000000000..5dc5d65fcd --- /dev/null +++ b/resources/profiles/Creality/cr10mini_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 149.605 -117.498 -3 + vertex 149.502 -117.498 -3 + vertex 149.814 -117.484 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 149.814 -117.484 -3 + vertex 149.502 -117.498 -3 + vertex 150.021 -117.454 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.5 -114.5 -3 + vertex 149.502 -117.498 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.021 -117.454 -3 + vertex 149.502 -117.498 -3 + vertex 150.226 -117.411 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.226 -117.411 -3 + vertex 149.502 -117.498 -3 + vertex 150.427 -117.353 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.427 -117.353 -3 + vertex 149.502 -117.498 -3 + vertex 150.624 -117.282 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.624 -117.282 -3 + vertex 149.502 -117.498 -3 + vertex 150.815 -117.196 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 150.815 -117.196 -3 + vertex 149.502 -117.498 -3 + vertex 151 -117.098 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151 -117.098 -3 + vertex 149.502 -117.498 -3 + vertex 151.178 -116.987 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.178 -116.987 -3 + vertex 149.502 -117.498 -3 + vertex 151.347 -116.864 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.347 -116.864 -3 + vertex 149.502 -117.498 -3 + vertex 151.507 -116.729 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.507 -116.729 -3 + vertex 149.502 -117.498 -3 + vertex 151.658 -116.584 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.658 -116.584 -3 + vertex 149.502 -117.498 -3 + vertex 151.798 -116.428 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.798 -116.428 -3 + vertex 149.502 -117.498 -3 + vertex 151.927 -116.263 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 151.927 -116.263 -3 + vertex 149.502 -117.498 -3 + vertex 152.044 -116.09 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.044 -116.09 -3 + vertex 149.502 -117.498 -3 + vertex 152.149 -115.908 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.149 -115.908 -3 + vertex 149.502 -117.498 -3 + vertex 152.241 -115.72 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.241 -115.72 -3 + vertex 149.502 -117.498 -3 + vertex 152.319 -115.526 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.319 -115.526 -3 + vertex 149.502 -117.498 -3 + vertex 152.384 -115.327 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.384 -115.327 -3 + vertex 149.502 -117.498 -3 + vertex 152.434 -115.124 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.434 -115.124 -3 + vertex 149.502 -117.498 -3 + vertex 152.471 -114.918 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.471 -114.918 -3 + vertex 149.502 -117.498 -3 + vertex 152.493 -114.709 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.493 -114.709 -3 + vertex 149.502 -117.498 -3 + vertex 152.5 -114.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.5 -114.5 -3 + vertex 149.502 117.498 -3 + vertex 152.5 114.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 152.471 114.918 -3 + vertex 152.493 114.709 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.384 115.327 -3 + vertex 152.434 115.124 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.241 115.72 -3 + vertex 149.502 117.498 -3 + vertex 152.149 115.908 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.241 115.72 -3 + vertex 152.319 115.526 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 151.507 116.729 -3 + vertex 151.658 116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151.927 116.263 -3 + vertex 149.502 117.498 -3 + vertex 151.798 116.428 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 151.927 116.263 -3 + vertex 152.044 116.09 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151.798 116.428 -3 + vertex 149.502 117.498 -3 + vertex 151.658 116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 150.427 117.353 -3 + vertex 150.624 117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151.347 116.864 -3 + vertex 149.502 117.498 -3 + vertex 151.178 116.987 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 151.347 116.864 -3 + vertex 151.507 116.729 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151.178 116.987 -3 + vertex 149.502 117.498 -3 + vertex 151 117.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 151 117.098 -3 + vertex 149.502 117.498 -3 + vertex 150.815 117.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 150.815 117.196 -3 + vertex 149.502 117.498 -3 + vertex 150.624 117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.149 115.908 -3 + vertex 149.502 117.498 -3 + vertex 152.044 116.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 150.226 117.411 -3 + vertex 149.502 117.498 -3 + vertex 150.021 117.454 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 150.226 117.411 -3 + vertex 150.427 117.353 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.319 115.526 -3 + vertex 152.384 115.327 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 149.814 117.484 -3 + vertex 150.021 117.454 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 152.434 115.124 -3 + vertex 152.471 114.918 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 117.498 -3 + vertex 149.605 117.498 -3 + vertex 149.814 117.484 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.5 114.5 -3 + vertex 149.502 117.498 -3 + vertex 152.493 114.709 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 149.502 -117.498 -3 + vertex 149.5 117.5 -3 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 149.502 -117.498 -3 + vertex 149.5 -117.5 -3 + vertex 149.5 117.5 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 149.5 117.5 -3 + vertex 149.5 -117.5 -3 + vertex -149.5 117.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -152.5 114.5 -3 + vertex -149.502 117.498 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -149.814 117.484 -3 + vertex -149.605 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.021 117.454 -3 + vertex -149.814 117.484 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.226 117.411 -3 + vertex -150.021 117.454 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.427 117.353 -3 + vertex -150.226 117.411 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.624 117.282 -3 + vertex -150.427 117.353 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -150.815 117.196 -3 + vertex -150.624 117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151 117.098 -3 + vertex -150.815 117.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.178 116.987 -3 + vertex -151 117.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.347 116.864 -3 + vertex -151.178 116.987 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.507 116.729 -3 + vertex -151.347 116.864 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.658 116.584 -3 + vertex -151.507 116.729 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.798 116.428 -3 + vertex -151.658 116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -151.927 116.263 -3 + vertex -151.798 116.428 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.044 116.09 -3 + vertex -151.927 116.263 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.149 115.908 -3 + vertex -152.044 116.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.241 115.72 -3 + vertex -152.149 115.908 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.319 115.526 -3 + vertex -152.241 115.72 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.384 115.327 -3 + vertex -152.319 115.526 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.434 115.124 -3 + vertex -152.384 115.327 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.471 114.918 -3 + vertex -152.434 115.124 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.493 114.709 -3 + vertex -152.471 114.918 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 117.498 -3 + vertex -152.5 114.5 -3 + vertex -152.493 114.709 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -152.5 -114.5 -3 + vertex -152.5 114.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -150.021 -117.454 -3 + vertex -149.502 -117.498 -3 + vertex -149.814 -117.484 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -152.471 -114.918 -3 + vertex -152.493 -114.709 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.384 -115.327 -3 + vertex -152.434 -115.124 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.241 -115.72 -3 + vertex -149.502 -117.498 -3 + vertex -152.149 -115.908 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.241 -115.72 -3 + vertex -152.319 -115.526 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -151.507 -116.729 -3 + vertex -151.658 -116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.927 -116.263 -3 + vertex -149.502 -117.498 -3 + vertex -151.798 -116.428 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.927 -116.263 -3 + vertex -152.044 -116.09 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.798 -116.428 -3 + vertex -149.502 -117.498 -3 + vertex -151.658 -116.584 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -150.427 -117.353 -3 + vertex -150.624 -117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.347 -116.864 -3 + vertex -149.502 -117.498 -3 + vertex -151.178 -116.987 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.347 -116.864 -3 + vertex -151.507 -116.729 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151.178 -116.987 -3 + vertex -149.502 -117.498 -3 + vertex -151 -117.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -151 -117.098 -3 + vertex -149.502 -117.498 -3 + vertex -150.815 -117.196 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -150.815 -117.196 -3 + vertex -149.502 -117.498 -3 + vertex -150.624 -117.282 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.149 -115.908 -3 + vertex -149.502 -117.498 -3 + vertex -152.044 -116.09 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -150.226 -117.411 -3 + vertex -149.502 -117.498 -3 + vertex -150.021 -117.454 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -150.226 -117.411 -3 + vertex -150.427 -117.353 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.319 -115.526 -3 + vertex -152.384 -115.327 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.434 -115.124 -3 + vertex -152.471 -114.918 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.605 -117.498 -3 + vertex -149.814 -117.484 -3 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.502 -117.498 -3 + vertex -152.493 -114.709 -3 + vertex -152.5 -114.5 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -149.5 117.5 -3 + vertex -149.5 -117.5 -3 + vertex -149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.5 117.5 -3 + vertex 149.5 -117.5 -3 + vertex -149.5 -117.5 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -149.5 -117.5 -3 + vertex -149.502 -117.498 -3 + vertex -149.502 117.498 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.814 -117.484 0 + vertex 149.502 -117.498 0 + vertex 149.605 -117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.021 -117.454 0 + vertex 149.502 -117.498 0 + vertex 149.814 -117.484 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 149.502 -117.498 0 + vertex 152.5 -114.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.226 -117.411 0 + vertex 149.502 -117.498 0 + vertex 150.021 -117.454 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.427 -117.353 0 + vertex 149.502 -117.498 0 + vertex 150.226 -117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.624 -117.282 0 + vertex 149.502 -117.498 0 + vertex 150.427 -117.353 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.815 -117.196 0 + vertex 149.502 -117.498 0 + vertex 150.624 -117.282 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151 -117.098 0 + vertex 149.502 -117.498 0 + vertex 150.815 -117.196 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.178 -116.987 0 + vertex 149.502 -117.498 0 + vertex 151 -117.098 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.347 -116.864 0 + vertex 149.502 -117.498 0 + vertex 151.178 -116.987 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.507 -116.729 0 + vertex 149.502 -117.498 0 + vertex 151.347 -116.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.658 -116.584 0 + vertex 149.502 -117.498 0 + vertex 151.507 -116.729 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.798 -116.428 0 + vertex 149.502 -117.498 0 + vertex 151.658 -116.584 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.927 -116.263 0 + vertex 149.502 -117.498 0 + vertex 151.798 -116.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.044 -116.09 0 + vertex 149.502 -117.498 0 + vertex 151.927 -116.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.149 -115.908 0 + vertex 149.502 -117.498 0 + vertex 152.044 -116.09 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.241 -115.72 0 + vertex 149.502 -117.498 0 + vertex 152.149 -115.908 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.319 -115.526 0 + vertex 149.502 -117.498 0 + vertex 152.241 -115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.384 -115.327 0 + vertex 149.502 -117.498 0 + vertex 152.319 -115.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.434 -115.124 0 + vertex 149.502 -117.498 0 + vertex 152.384 -115.327 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.471 -114.918 0 + vertex 149.502 -117.498 0 + vertex 152.434 -115.124 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.493 -114.709 0 + vertex 149.502 -117.498 0 + vertex 152.471 -114.918 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.5 -114.5 0 + vertex 149.502 -117.498 0 + vertex 152.493 -114.709 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.5 114.5 0 + vertex 149.502 117.498 0 + vertex 152.5 -114.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.493 114.709 0 + vertex 152.471 114.918 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 152.434 115.124 0 + vertex 152.384 115.327 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.149 115.908 0 + vertex 149.502 117.498 0 + vertex 152.241 115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 152.319 115.526 0 + vertex 152.241 115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.658 116.584 0 + vertex 151.507 116.729 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.798 116.428 0 + vertex 149.502 117.498 0 + vertex 151.927 116.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 152.044 116.09 0 + vertex 151.927 116.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.658 116.584 0 + vertex 149.502 117.498 0 + vertex 151.798 116.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.624 117.282 0 + vertex 150.427 117.353 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151.178 116.987 0 + vertex 149.502 117.498 0 + vertex 151.347 116.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 151.507 116.729 0 + vertex 151.347 116.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 151 117.098 0 + vertex 149.502 117.498 0 + vertex 151.178 116.987 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.815 117.196 0 + vertex 149.502 117.498 0 + vertex 151 117.098 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.624 117.282 0 + vertex 149.502 117.498 0 + vertex 150.815 117.196 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.044 116.09 0 + vertex 149.502 117.498 0 + vertex 152.149 115.908 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 150.021 117.454 0 + vertex 149.502 117.498 0 + vertex 150.226 117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 150.427 117.353 0 + vertex 150.226 117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 152.384 115.327 0 + vertex 152.319 115.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 150.021 117.454 0 + vertex 149.814 117.484 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.471 114.918 0 + vertex 152.434 115.124 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.814 117.484 0 + vertex 149.605 117.498 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.493 114.709 0 + vertex 149.502 117.498 0 + vertex 152.5 114.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.502 117.498 0 + vertex 149.5 117.5 0 + vertex 149.502 -117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 149.5 117.5 0 + vertex 149.5 -117.5 0 + vertex 149.502 -117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -149.5 117.5 0 + vertex 149.5 -117.5 0 + vertex 149.5 117.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 117.498 0 + vertex -152.5 114.5 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -149.605 117.498 0 + vertex -149.814 117.484 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -149.814 117.484 0 + vertex -150.021 117.454 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.021 117.454 0 + vertex -150.226 117.411 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.226 117.411 0 + vertex -150.427 117.353 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.427 117.353 0 + vertex -150.624 117.282 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.624 117.282 0 + vertex -150.815 117.196 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -150.815 117.196 0 + vertex -151 117.098 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151 117.098 0 + vertex -151.178 116.987 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.178 116.987 0 + vertex -151.347 116.864 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.347 116.864 0 + vertex -151.507 116.729 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.507 116.729 0 + vertex -151.658 116.584 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.658 116.584 0 + vertex -151.798 116.428 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.798 116.428 0 + vertex -151.927 116.263 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -151.927 116.263 0 + vertex -152.044 116.09 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.044 116.09 0 + vertex -152.149 115.908 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.149 115.908 0 + vertex -152.241 115.72 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.241 115.72 0 + vertex -152.319 115.526 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.319 115.526 0 + vertex -152.384 115.327 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.384 115.327 0 + vertex -152.434 115.124 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.434 115.124 0 + vertex -152.471 114.918 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.471 114.918 0 + vertex -152.493 114.709 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.493 114.709 0 + vertex -152.5 114.5 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.5 114.5 0 + vertex -152.5 -114.5 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -149.814 -117.484 0 + vertex -149.502 -117.498 0 + vertex -150.021 -117.454 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.493 -114.709 0 + vertex -152.471 -114.918 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.434 -115.124 0 + vertex -152.384 -115.327 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -152.149 -115.908 0 + vertex -149.502 -117.498 0 + vertex -152.241 -115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.319 -115.526 0 + vertex -152.241 -115.72 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -151.658 -116.584 0 + vertex -151.507 -116.729 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -151.798 -116.428 0 + vertex -149.502 -117.498 0 + vertex -151.927 -116.263 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.044 -116.09 0 + vertex -151.927 -116.263 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -151.658 -116.584 0 + vertex -149.502 -117.498 0 + vertex -151.798 -116.428 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -150.624 -117.282 0 + vertex -150.427 -117.353 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -151.178 -116.987 0 + vertex -149.502 -117.498 0 + vertex -151.347 -116.864 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -151.507 -116.729 0 + vertex -151.347 -116.864 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -151 -117.098 0 + vertex -149.502 -117.498 0 + vertex -151.178 -116.987 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -150.815 -117.196 0 + vertex -149.502 -117.498 0 + vertex -151 -117.098 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -150.624 -117.282 0 + vertex -149.502 -117.498 0 + vertex -150.815 -117.196 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -152.044 -116.09 0 + vertex -149.502 -117.498 0 + vertex -152.149 -115.908 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -150.021 -117.454 0 + vertex -149.502 -117.498 0 + vertex -150.226 -117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -150.427 -117.353 0 + vertex -150.226 -117.411 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.384 -115.327 0 + vertex -152.319 -115.526 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -152.471 -114.918 0 + vertex -152.434 -115.124 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 -117.498 0 + vertex -149.814 -117.484 0 + vertex -149.605 -117.498 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.5 -114.5 0 + vertex -152.493 -114.709 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -149.502 117.498 0 + vertex -149.5 -117.5 0 + vertex -149.5 117.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.5 -117.5 0 + vertex 149.5 -117.5 0 + vertex -149.5 117.5 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -149.502 117.498 0 + vertex -149.502 -117.498 0 + vertex -149.5 -117.5 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 149.605 -117.498 -3 + vertex 149.502 -117.498 0 + vertex 149.502 -117.498 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 149.605 -117.498 -3 + vertex 149.605 -117.498 0 + vertex 149.502 -117.498 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 149.814 -117.484 -3 + vertex 149.605 -117.498 0 + vertex 149.605 -117.498 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 149.814 -117.484 -3 + vertex 149.814 -117.484 0 + vertex 149.605 -117.498 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 150.021 -117.454 -3 + vertex 149.814 -117.484 0 + vertex 149.814 -117.484 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 150.021 -117.454 -3 + vertex 150.021 -117.454 0 + vertex 149.814 -117.484 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 150.226 -117.411 -3 + vertex 150.021 -117.454 0 + vertex 150.021 -117.454 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 150.226 -117.411 -3 + vertex 150.226 -117.411 0 + vertex 150.021 -117.454 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 150.427 -117.353 -3 + vertex 150.226 -117.411 0 + vertex 150.226 -117.411 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 150.427 -117.353 -3 + vertex 150.427 -117.353 0 + vertex 150.226 -117.411 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 150.624 -117.282 -3 + vertex 150.427 -117.353 0 + vertex 150.427 -117.353 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 150.624 -117.282 -3 + vertex 150.624 -117.282 0 + vertex 150.427 -117.353 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 150.815 -117.196 -3 + vertex 150.624 -117.282 0 + vertex 150.624 -117.282 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 150.815 -117.196 -3 + vertex 150.815 -117.196 0 + vertex 150.624 -117.282 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 151 -117.098 -3 + vertex 150.815 -117.196 0 + vertex 150.815 -117.196 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 151 -117.098 -3 + vertex 151 -117.098 0 + vertex 150.815 -117.196 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 151.178 -116.987 -3 + vertex 151 -117.098 0 + vertex 151 -117.098 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 151.178 -116.987 -3 + vertex 151.178 -116.987 0 + vertex 151 -117.098 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 151.347 -116.864 -3 + vertex 151.178 -116.987 0 + vertex 151.178 -116.987 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 151.347 -116.864 -3 + vertex 151.347 -116.864 0 + vertex 151.178 -116.987 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 151.507 -116.729 -3 + vertex 151.347 -116.864 0 + vertex 151.347 -116.864 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 151.507 -116.729 -3 + vertex 151.507 -116.729 0 + vertex 151.347 -116.864 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 151.658 -116.584 -3 + vertex 151.507 -116.729 0 + vertex 151.507 -116.729 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 151.658 -116.584 -3 + vertex 151.658 -116.584 0 + vertex 151.507 -116.729 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 151.798 -116.428 -3 + vertex 151.658 -116.584 0 + vertex 151.658 -116.584 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 151.798 -116.428 -3 + vertex 151.798 -116.428 0 + vertex 151.658 -116.584 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 151.927 -116.263 -3 + vertex 151.798 -116.428 0 + vertex 151.798 -116.428 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 151.927 -116.263 -3 + vertex 151.927 -116.263 0 + vertex 151.798 -116.428 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 152.044 -116.09 -3 + vertex 151.927 -116.263 0 + vertex 151.927 -116.263 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 152.044 -116.09 -3 + vertex 152.044 -116.09 0 + vertex 151.927 -116.263 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 152.149 -115.908 -3 + vertex 152.044 -116.09 0 + vertex 152.044 -116.09 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 152.149 -115.908 -3 + vertex 152.149 -115.908 0 + vertex 152.044 -116.09 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 152.241 -115.72 -3 + vertex 152.149 -115.908 0 + vertex 152.149 -115.908 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 152.241 -115.72 -3 + vertex 152.241 -115.72 0 + vertex 152.149 -115.908 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 152.319 -115.526 -3 + vertex 152.241 -115.72 0 + vertex 152.241 -115.72 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 152.319 -115.526 -3 + vertex 152.319 -115.526 0 + vertex 152.241 -115.72 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 152.384 -115.327 -3 + vertex 152.319 -115.526 0 + vertex 152.319 -115.526 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 152.384 -115.327 -3 + vertex 152.384 -115.327 0 + vertex 152.319 -115.526 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 152.434 -115.124 -3 + vertex 152.384 -115.327 0 + vertex 152.384 -115.327 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 152.434 -115.124 -3 + vertex 152.434 -115.124 0 + vertex 152.384 -115.327 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 152.471 -114.918 -3 + vertex 152.434 -115.124 0 + vertex 152.434 -115.124 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 152.471 -114.918 -3 + vertex 152.471 -114.918 0 + vertex 152.434 -115.124 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 152.493 -114.709 -3 + vertex 152.471 -114.918 0 + vertex 152.471 -114.918 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 152.493 -114.709 -3 + vertex 152.493 -114.709 0 + vertex 152.471 -114.918 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 152.5 -114.5 -3 + vertex 152.493 -114.709 0 + vertex 152.493 -114.709 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 152.5 -114.5 -3 + vertex 152.5 -114.5 0 + vertex 152.493 -114.709 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 152.5 114.5 -3 + vertex 152.5 -114.5 0 + vertex 152.5 -114.5 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 152.5 114.5 -3 + vertex 152.5 114.5 0 + vertex 152.5 -114.5 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 152.493 114.709 -3 + vertex 152.5 114.5 0 + vertex 152.5 114.5 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 152.493 114.709 -3 + vertex 152.493 114.709 0 + vertex 152.5 114.5 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 152.471 114.918 -3 + vertex 152.493 114.709 0 + vertex 152.493 114.709 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 152.471 114.918 -3 + vertex 152.471 114.918 0 + vertex 152.493 114.709 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 152.434 115.124 -3 + vertex 152.471 114.918 0 + vertex 152.471 114.918 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 152.434 115.124 -3 + vertex 152.434 115.124 0 + vertex 152.471 114.918 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 152.384 115.327 -3 + vertex 152.434 115.124 0 + vertex 152.434 115.124 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 152.384 115.327 -3 + vertex 152.384 115.327 0 + vertex 152.434 115.124 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 152.319 115.526 -3 + vertex 152.384 115.327 0 + vertex 152.384 115.327 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 152.319 115.526 -3 + vertex 152.319 115.526 0 + vertex 152.384 115.327 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 152.241 115.72 -3 + vertex 152.319 115.526 0 + vertex 152.319 115.526 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 152.241 115.72 -3 + vertex 152.241 115.72 0 + vertex 152.319 115.526 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 152.149 115.908 -3 + vertex 152.241 115.72 0 + vertex 152.241 115.72 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 152.149 115.908 -3 + vertex 152.149 115.908 0 + vertex 152.241 115.72 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 152.044 116.09 -3 + vertex 152.149 115.908 0 + vertex 152.149 115.908 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 152.044 116.09 -3 + vertex 152.044 116.09 0 + vertex 152.149 115.908 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 151.927 116.263 -3 + vertex 152.044 116.09 0 + vertex 152.044 116.09 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 151.927 116.263 -3 + vertex 151.927 116.263 0 + vertex 152.044 116.09 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 151.798 116.428 -3 + vertex 151.927 116.263 0 + vertex 151.927 116.263 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 151.798 116.428 -3 + vertex 151.798 116.428 0 + vertex 151.927 116.263 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 151.658 116.584 -3 + vertex 151.798 116.428 0 + vertex 151.798 116.428 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 151.658 116.584 -3 + vertex 151.658 116.584 0 + vertex 151.798 116.428 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 151.507 116.729 -3 + vertex 151.658 116.584 0 + vertex 151.658 116.584 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 151.507 116.729 -3 + vertex 151.507 116.729 0 + vertex 151.658 116.584 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 151.347 116.864 -3 + vertex 151.507 116.729 0 + vertex 151.507 116.729 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 151.347 116.864 -3 + vertex 151.347 116.864 0 + vertex 151.507 116.729 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 151.178 116.987 -3 + vertex 151.347 116.864 0 + vertex 151.347 116.864 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 151.178 116.987 -3 + vertex 151.178 116.987 0 + vertex 151.347 116.864 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 151 117.098 -3 + vertex 151.178 116.987 0 + vertex 151.178 116.987 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 151 117.098 -3 + vertex 151 117.098 0 + vertex 151.178 116.987 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 150.815 117.196 -3 + vertex 151 117.098 0 + vertex 151 117.098 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 150.815 117.196 -3 + vertex 150.815 117.196 0 + vertex 151 117.098 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 150.624 117.282 -3 + vertex 150.815 117.196 0 + vertex 150.815 117.196 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 150.624 117.282 -3 + vertex 150.624 117.282 0 + vertex 150.815 117.196 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 150.427 117.353 -3 + vertex 150.624 117.282 0 + vertex 150.624 117.282 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 150.427 117.353 -3 + vertex 150.427 117.353 0 + vertex 150.624 117.282 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 150.226 117.411 -3 + vertex 150.427 117.353 0 + vertex 150.427 117.353 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 150.226 117.411 -3 + vertex 150.226 117.411 0 + vertex 150.427 117.353 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 150.021 117.454 -3 + vertex 150.226 117.411 0 + vertex 150.226 117.411 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 150.021 117.454 -3 + vertex 150.021 117.454 0 + vertex 150.226 117.411 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 149.814 117.484 -3 + vertex 150.021 117.454 0 + vertex 150.021 117.454 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 149.814 117.484 -3 + vertex 149.814 117.484 0 + vertex 150.021 117.454 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 149.605 117.498 -3 + vertex 149.814 117.484 0 + vertex 149.814 117.484 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 149.605 117.498 -3 + vertex 149.605 117.498 0 + vertex 149.814 117.484 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 149.502 117.498 -3 + vertex 149.605 117.498 0 + vertex 149.605 117.498 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 149.502 117.498 -3 + vertex 149.502 117.498 0 + vertex 149.605 117.498 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 149.5 117.5 -3 + vertex 149.502 117.498 0 + vertex 149.502 117.498 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 149.5 117.5 -3 + vertex 149.5 117.5 0 + vertex 149.502 117.498 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -149.5 117.5 -3 + vertex 149.5 117.5 0 + vertex 149.5 117.5 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -149.5 117.5 -3 + vertex -149.5 117.5 0 + vertex 149.5 117.5 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -149.502 117.498 -3 + vertex -149.5 117.5 0 + vertex -149.5 117.5 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -149.502 117.498 -3 + vertex -149.502 117.498 0 + vertex -149.5 117.5 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -149.605 117.498 -3 + vertex -149.502 117.498 0 + vertex -149.502 117.498 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -149.605 117.498 -3 + vertex -149.605 117.498 0 + vertex -149.502 117.498 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -149.814 117.484 -3 + vertex -149.605 117.498 0 + vertex -149.605 117.498 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -149.814 117.484 -3 + vertex -149.814 117.484 0 + vertex -149.605 117.498 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -150.021 117.454 -3 + vertex -149.814 117.484 0 + vertex -149.814 117.484 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -150.021 117.454 -3 + vertex -150.021 117.454 0 + vertex -149.814 117.484 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -150.226 117.411 -3 + vertex -150.021 117.454 0 + vertex -150.021 117.454 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -150.226 117.411 -3 + vertex -150.226 117.411 0 + vertex -150.021 117.454 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -150.427 117.353 -3 + vertex -150.226 117.411 0 + vertex -150.226 117.411 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -150.427 117.353 -3 + vertex -150.427 117.353 0 + vertex -150.226 117.411 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -150.624 117.282 -3 + vertex -150.427 117.353 0 + vertex -150.427 117.353 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -150.624 117.282 -3 + vertex -150.624 117.282 0 + vertex -150.427 117.353 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -150.815 117.196 -3 + vertex -150.624 117.282 0 + vertex -150.624 117.282 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -150.815 117.196 -3 + vertex -150.815 117.196 0 + vertex -150.624 117.282 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -151 117.098 -3 + vertex -150.815 117.196 0 + vertex -150.815 117.196 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -151 117.098 -3 + vertex -151 117.098 0 + vertex -150.815 117.196 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -151.178 116.987 -3 + vertex -151 117.098 0 + vertex -151 117.098 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -151.178 116.987 -3 + vertex -151.178 116.987 0 + vertex -151 117.098 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -151.347 116.864 -3 + vertex -151.178 116.987 0 + vertex -151.178 116.987 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -151.347 116.864 -3 + vertex -151.347 116.864 0 + vertex -151.178 116.987 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -151.507 116.729 -3 + vertex -151.347 116.864 0 + vertex -151.347 116.864 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -151.507 116.729 -3 + vertex -151.507 116.729 0 + vertex -151.347 116.864 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -151.658 116.584 -3 + vertex -151.507 116.729 0 + vertex -151.507 116.729 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -151.658 116.584 -3 + vertex -151.658 116.584 0 + vertex -151.507 116.729 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -151.798 116.428 -3 + vertex -151.658 116.584 0 + vertex -151.658 116.584 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -151.798 116.428 -3 + vertex -151.798 116.428 0 + vertex -151.658 116.584 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -151.927 116.263 -3 + vertex -151.798 116.428 0 + vertex -151.798 116.428 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -151.927 116.263 -3 + vertex -151.927 116.263 0 + vertex -151.798 116.428 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -152.044 116.09 -3 + vertex -151.927 116.263 0 + vertex -151.927 116.263 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -152.044 116.09 -3 + vertex -152.044 116.09 0 + vertex -151.927 116.263 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -152.149 115.908 -3 + vertex -152.044 116.09 0 + vertex -152.044 116.09 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -152.149 115.908 -3 + vertex -152.149 115.908 0 + vertex -152.044 116.09 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -152.241 115.72 -3 + vertex -152.149 115.908 0 + vertex -152.149 115.908 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -152.241 115.72 -3 + vertex -152.241 115.72 0 + vertex -152.149 115.908 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -152.319 115.526 -3 + vertex -152.241 115.72 0 + vertex -152.241 115.72 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -152.319 115.526 -3 + vertex -152.319 115.526 0 + vertex -152.241 115.72 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -152.384 115.327 -3 + vertex -152.319 115.526 0 + vertex -152.319 115.526 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -152.384 115.327 -3 + vertex -152.384 115.327 0 + vertex -152.319 115.526 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -152.434 115.124 -3 + vertex -152.384 115.327 0 + vertex -152.384 115.327 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -152.434 115.124 -3 + vertex -152.434 115.124 0 + vertex -152.384 115.327 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -152.471 114.918 -3 + vertex -152.434 115.124 0 + vertex -152.434 115.124 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -152.471 114.918 -3 + vertex -152.471 114.918 0 + vertex -152.434 115.124 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -152.493 114.709 -3 + vertex -152.471 114.918 0 + vertex -152.471 114.918 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -152.493 114.709 -3 + vertex -152.493 114.709 0 + vertex -152.471 114.918 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -152.5 114.5 -3 + vertex -152.493 114.709 0 + vertex -152.493 114.709 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -152.5 114.5 -3 + vertex -152.5 114.5 0 + vertex -152.493 114.709 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -152.5 -114.5 -3 + vertex -152.5 114.5 0 + vertex -152.5 114.5 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -152.5 -114.5 -3 + vertex -152.5 -114.5 0 + vertex -152.5 114.5 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -152.493 -114.709 -3 + vertex -152.5 -114.5 0 + vertex -152.5 -114.5 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -152.493 -114.709 -3 + vertex -152.493 -114.709 0 + vertex -152.5 -114.5 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -152.471 -114.918 -3 + vertex -152.493 -114.709 0 + vertex -152.493 -114.709 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -152.471 -114.918 -3 + vertex -152.471 -114.918 0 + vertex -152.493 -114.709 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -152.434 -115.124 -3 + vertex -152.471 -114.918 0 + vertex -152.471 -114.918 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -152.434 -115.124 -3 + vertex -152.434 -115.124 0 + vertex -152.471 -114.918 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -152.384 -115.327 -3 + vertex -152.434 -115.124 0 + vertex -152.434 -115.124 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -152.384 -115.327 -3 + vertex -152.384 -115.327 0 + vertex -152.434 -115.124 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -152.319 -115.526 -3 + vertex -152.384 -115.327 0 + vertex -152.384 -115.327 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -152.319 -115.526 -3 + vertex -152.319 -115.526 0 + vertex -152.384 -115.327 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -152.241 -115.72 -3 + vertex -152.319 -115.526 0 + vertex -152.319 -115.526 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -152.241 -115.72 -3 + vertex -152.241 -115.72 0 + vertex -152.319 -115.526 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -152.149 -115.908 -3 + vertex -152.241 -115.72 0 + vertex -152.241 -115.72 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -152.149 -115.908 -3 + vertex -152.149 -115.908 0 + vertex -152.241 -115.72 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -152.044 -116.09 -3 + vertex -152.149 -115.908 0 + vertex -152.149 -115.908 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -152.044 -116.09 -3 + vertex -152.044 -116.09 0 + vertex -152.149 -115.908 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -151.927 -116.263 -3 + vertex -152.044 -116.09 0 + vertex -152.044 -116.09 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -151.927 -116.263 -3 + vertex -151.927 -116.263 0 + vertex -152.044 -116.09 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -151.798 -116.428 -3 + vertex -151.927 -116.263 0 + vertex -151.927 -116.263 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -151.798 -116.428 -3 + vertex -151.798 -116.428 0 + vertex -151.927 -116.263 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -151.658 -116.584 -3 + vertex -151.798 -116.428 0 + vertex -151.798 -116.428 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -151.658 -116.584 -3 + vertex -151.658 -116.584 0 + vertex -151.798 -116.428 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -151.507 -116.729 -3 + vertex -151.658 -116.584 0 + vertex -151.658 -116.584 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -151.507 -116.729 -3 + vertex -151.507 -116.729 0 + vertex -151.658 -116.584 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -151.347 -116.864 -3 + vertex -151.507 -116.729 0 + vertex -151.507 -116.729 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -151.347 -116.864 -3 + vertex -151.347 -116.864 0 + vertex -151.507 -116.729 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -151.178 -116.987 -3 + vertex -151.347 -116.864 0 + vertex -151.347 -116.864 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -151.178 -116.987 -3 + vertex -151.178 -116.987 0 + vertex -151.347 -116.864 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -151 -117.098 -3 + vertex -151.178 -116.987 0 + vertex -151.178 -116.987 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -151 -117.098 -3 + vertex -151 -117.098 0 + vertex -151.178 -116.987 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -150.815 -117.196 -3 + vertex -151 -117.098 0 + vertex -151 -117.098 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -150.815 -117.196 -3 + vertex -150.815 -117.196 0 + vertex -151 -117.098 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -150.624 -117.282 -3 + vertex -150.815 -117.196 0 + vertex -150.815 -117.196 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -150.624 -117.282 -3 + vertex -150.624 -117.282 0 + vertex -150.815 -117.196 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -150.427 -117.353 -3 + vertex -150.624 -117.282 0 + vertex -150.624 -117.282 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -150.427 -117.353 -3 + vertex -150.427 -117.353 0 + vertex -150.624 -117.282 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -150.226 -117.411 -3 + vertex -150.427 -117.353 0 + vertex -150.427 -117.353 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -150.226 -117.411 -3 + vertex -150.226 -117.411 0 + vertex -150.427 -117.353 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -150.021 -117.454 -3 + vertex -150.226 -117.411 0 + vertex -150.226 -117.411 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -150.021 -117.454 -3 + vertex -150.021 -117.454 0 + vertex -150.226 -117.411 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -149.814 -117.484 -3 + vertex -150.021 -117.454 0 + vertex -150.021 -117.454 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -149.814 -117.484 -3 + vertex -149.814 -117.484 0 + vertex -150.021 -117.454 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -149.605 -117.498 -3 + vertex -149.814 -117.484 0 + vertex -149.814 -117.484 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -149.605 -117.498 -3 + vertex -149.605 -117.498 0 + vertex -149.814 -117.484 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -149.502 -117.498 -3 + vertex -149.605 -117.498 0 + vertex -149.605 -117.498 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -149.502 -117.498 -3 + vertex -149.502 -117.498 0 + vertex -149.605 -117.498 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -149.5 -117.5 -3 + vertex -149.502 -117.498 0 + vertex -149.502 -117.498 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -149.5 -117.5 -3 + vertex -149.5 -117.5 0 + vertex -149.502 -117.498 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 149.5 -117.5 -3 + vertex -149.5 -117.5 0 + vertex -149.5 -117.5 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 149.5 -117.5 -3 + vertex 149.5 -117.5 0 + vertex -149.5 -117.5 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 149.502 -117.498 -3 + vertex 149.5 -117.5 0 + vertex 149.5 -117.5 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 149.502 -117.498 -3 + vertex 149.502 -117.498 0 + vertex 149.5 -117.5 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr10s4.svg b/resources/profiles/Creality/cr10s4.svg new file mode 100644 index 0000000000..c3719456d1 --- /dev/null +++ b/resources/profiles/Creality/cr10s4.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr10s4_bed.stl b/resources/profiles/Creality/cr10s4_bed.stl new file mode 100644 index 0000000000..c34ac4e5e4 --- /dev/null +++ b/resources/profiles/Creality/cr10s4_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 202.105 -204.998 -3 + vertex 202.002 -204.998 -3 + vertex 202.314 -204.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.314 -204.984 -3 + vertex 202.002 -204.998 -3 + vertex 202.521 -204.954 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 205 -202 -3 + vertex 202.002 -204.998 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.521 -204.954 -3 + vertex 202.002 -204.998 -3 + vertex 202.726 -204.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.726 -204.911 -3 + vertex 202.002 -204.998 -3 + vertex 202.927 -204.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.927 -204.853 -3 + vertex 202.002 -204.998 -3 + vertex 203.124 -204.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.124 -204.782 -3 + vertex 202.002 -204.998 -3 + vertex 203.315 -204.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.315 -204.696 -3 + vertex 202.002 -204.998 -3 + vertex 203.5 -204.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.5 -204.598 -3 + vertex 202.002 -204.998 -3 + vertex 203.678 -204.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.678 -204.487 -3 + vertex 202.002 -204.998 -3 + vertex 203.847 -204.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 203.847 -204.364 -3 + vertex 202.002 -204.998 -3 + vertex 204.007 -204.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.007 -204.229 -3 + vertex 202.002 -204.998 -3 + vertex 204.158 -204.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.158 -204.084 -3 + vertex 202.002 -204.998 -3 + vertex 204.298 -203.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.298 -203.928 -3 + vertex 202.002 -204.998 -3 + vertex 204.427 -203.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.427 -203.763 -3 + vertex 202.002 -204.998 -3 + vertex 204.544 -203.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.544 -203.59 -3 + vertex 202.002 -204.998 -3 + vertex 204.649 -203.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.649 -203.408 -3 + vertex 202.002 -204.998 -3 + vertex 204.741 -203.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.741 -203.22 -3 + vertex 202.002 -204.998 -3 + vertex 204.819 -203.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.819 -203.026 -3 + vertex 202.002 -204.998 -3 + vertex 204.884 -202.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.884 -202.827 -3 + vertex 202.002 -204.998 -3 + vertex 204.934 -202.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.934 -202.624 -3 + vertex 202.002 -204.998 -3 + vertex 204.971 -202.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.971 -202.418 -3 + vertex 202.002 -204.998 -3 + vertex 204.993 -202.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 204.993 -202.209 -3 + vertex 202.002 -204.998 -3 + vertex 205 -202 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 205 -202 -3 + vertex 202.002 204.998 -3 + vertex 205 202 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 204.971 202.418 -3 + vertex 204.993 202.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 204.884 202.827 -3 + vertex 204.934 202.624 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 204.741 203.22 -3 + vertex 202.002 204.998 -3 + vertex 204.649 203.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 204.741 203.22 -3 + vertex 204.819 203.026 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 204.007 204.229 -3 + vertex 204.158 204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 204.427 203.763 -3 + vertex 202.002 204.998 -3 + vertex 204.298 203.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 204.427 203.763 -3 + vertex 204.544 203.59 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 204.298 203.928 -3 + vertex 202.002 204.998 -3 + vertex 204.158 204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 202.927 204.853 -3 + vertex 203.124 204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 203.847 204.364 -3 + vertex 202.002 204.998 -3 + vertex 203.678 204.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 203.847 204.364 -3 + vertex 204.007 204.229 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 203.678 204.487 -3 + vertex 202.002 204.998 -3 + vertex 203.5 204.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 203.5 204.598 -3 + vertex 202.002 204.998 -3 + vertex 203.315 204.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 203.315 204.696 -3 + vertex 202.002 204.998 -3 + vertex 203.124 204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 204.649 203.408 -3 + vertex 202.002 204.998 -3 + vertex 204.544 203.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.726 204.911 -3 + vertex 202.002 204.998 -3 + vertex 202.521 204.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 202.726 204.911 -3 + vertex 202.927 204.853 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 204.819 203.026 -3 + vertex 204.884 202.827 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 202.314 204.984 -3 + vertex 202.521 204.954 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 204.934 202.624 -3 + vertex 204.971 202.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 204.998 -3 + vertex 202.105 204.998 -3 + vertex 202.314 204.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 205 202 -3 + vertex 202.002 204.998 -3 + vertex 204.993 202.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -202 205 -3 + vertex 202 205 -3 + vertex -202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex 202 205 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 -204.998 -3 + vertex -202.002 204.998 -3 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -205 -202 -3 + vertex -205 202 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -202.314 204.984 -3 + vertex -202.105 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -202.521 204.954 -3 + vertex -202.314 204.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -202.726 204.911 -3 + vertex -202.521 204.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -202.927 204.853 -3 + vertex -202.726 204.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.124 204.782 -3 + vertex -202.927 204.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.315 204.696 -3 + vertex -203.124 204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.5 204.598 -3 + vertex -203.315 204.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.678 204.487 -3 + vertex -203.5 204.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -203.847 204.364 -3 + vertex -203.678 204.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.007 204.229 -3 + vertex -203.847 204.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.158 204.084 -3 + vertex -204.007 204.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.298 203.928 -3 + vertex -204.158 204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.427 203.763 -3 + vertex -204.298 203.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.544 203.59 -3 + vertex -204.427 203.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.649 203.408 -3 + vertex -204.544 203.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.741 203.22 -3 + vertex -204.649 203.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.819 203.026 -3 + vertex -204.741 203.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.884 202.827 -3 + vertex -204.819 203.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.934 202.624 -3 + vertex -204.884 202.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.971 202.418 -3 + vertex -204.934 202.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -204.993 202.209 -3 + vertex -204.971 202.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 204.998 -3 + vertex -205 202 -3 + vertex -204.993 202.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -205 202 -3 + vertex -202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 202.002 -204.998 -3 + vertex -202.002 -204.998 -3 + vertex -202.002 204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -204.971 -202.418 -3 + vertex -204.993 -202.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.884 -202.827 -3 + vertex -204.934 -202.624 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.741 -203.22 -3 + vertex -202.002 -204.998 -3 + vertex -204.649 -203.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.741 -203.22 -3 + vertex -204.819 -203.026 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -204.007 -204.229 -3 + vertex -204.158 -204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.427 -203.763 -3 + vertex -202.002 -204.998 -3 + vertex -204.298 -203.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.427 -203.763 -3 + vertex -204.544 -203.59 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.298 -203.928 -3 + vertex -202.002 -204.998 -3 + vertex -204.158 -204.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -202.927 -204.853 -3 + vertex -203.124 -204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.847 -204.364 -3 + vertex -202.002 -204.998 -3 + vertex -203.678 -204.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.847 -204.364 -3 + vertex -204.007 -204.229 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.678 -204.487 -3 + vertex -202.002 -204.998 -3 + vertex -203.5 -204.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.5 -204.598 -3 + vertex -202.002 -204.998 -3 + vertex -203.315 -204.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -203.315 -204.696 -3 + vertex -202.002 -204.998 -3 + vertex -203.124 -204.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.649 -203.408 -3 + vertex -202.002 -204.998 -3 + vertex -204.544 -203.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.726 -204.911 -3 + vertex -202.002 -204.998 -3 + vertex -202.521 -204.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.726 -204.911 -3 + vertex -202.927 -204.853 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -204.819 -203.026 -3 + vertex -204.884 -202.827 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.314 -204.984 -3 + vertex -202.521 -204.954 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -204.934 -202.624 -3 + vertex -204.971 -202.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex -202.105 -204.998 -3 + vertex -202.314 -204.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 202.002 -204.998 -3 + vertex 202 -205 -3 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -202.002 -204.998 -3 + vertex 202 -205 -3 + vertex -202 -205 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -205 -202 -3 + vertex -202.002 -204.998 -3 + vertex -204.993 -202.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.314 -204.984 0 + vertex 202.002 -204.998 0 + vertex 202.105 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.521 -204.954 0 + vertex 202.002 -204.998 0 + vertex 202.314 -204.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 202.002 -204.998 0 + vertex 205 -202 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.726 -204.911 0 + vertex 202.002 -204.998 0 + vertex 202.521 -204.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.927 -204.853 0 + vertex 202.002 -204.998 0 + vertex 202.726 -204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.124 -204.782 0 + vertex 202.002 -204.998 0 + vertex 202.927 -204.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.315 -204.696 0 + vertex 202.002 -204.998 0 + vertex 203.124 -204.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.5 -204.598 0 + vertex 202.002 -204.998 0 + vertex 203.315 -204.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.678 -204.487 0 + vertex 202.002 -204.998 0 + vertex 203.5 -204.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.847 -204.364 0 + vertex 202.002 -204.998 0 + vertex 203.678 -204.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.007 -204.229 0 + vertex 202.002 -204.998 0 + vertex 203.847 -204.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.158 -204.084 0 + vertex 202.002 -204.998 0 + vertex 204.007 -204.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.298 -203.928 0 + vertex 202.002 -204.998 0 + vertex 204.158 -204.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.427 -203.763 0 + vertex 202.002 -204.998 0 + vertex 204.298 -203.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.544 -203.59 0 + vertex 202.002 -204.998 0 + vertex 204.427 -203.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.649 -203.408 0 + vertex 202.002 -204.998 0 + vertex 204.544 -203.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.741 -203.22 0 + vertex 202.002 -204.998 0 + vertex 204.649 -203.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.819 -203.026 0 + vertex 202.002 -204.998 0 + vertex 204.741 -203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.884 -202.827 0 + vertex 202.002 -204.998 0 + vertex 204.819 -203.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.934 -202.624 0 + vertex 202.002 -204.998 0 + vertex 204.884 -202.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.971 -202.418 0 + vertex 202.002 -204.998 0 + vertex 204.934 -202.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.993 -202.209 0 + vertex 202.002 -204.998 0 + vertex 204.971 -202.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 205 -202 0 + vertex 202.002 -204.998 0 + vertex 204.993 -202.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 205 202 0 + vertex 202.002 204.998 0 + vertex 205 -202 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.993 202.209 0 + vertex 204.971 202.418 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.934 202.624 0 + vertex 204.884 202.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.649 203.408 0 + vertex 202.002 204.998 0 + vertex 204.741 203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.819 203.026 0 + vertex 204.741 203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.158 204.084 0 + vertex 204.007 204.229 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.298 203.928 0 + vertex 202.002 204.998 0 + vertex 204.427 203.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.544 203.59 0 + vertex 204.427 203.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.158 204.084 0 + vertex 202.002 204.998 0 + vertex 204.298 203.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.124 204.782 0 + vertex 202.927 204.853 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.678 204.487 0 + vertex 202.002 204.998 0 + vertex 203.847 204.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.007 204.229 0 + vertex 203.847 204.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.5 204.598 0 + vertex 202.002 204.998 0 + vertex 203.678 204.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.315 204.696 0 + vertex 202.002 204.998 0 + vertex 203.5 204.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 203.124 204.782 0 + vertex 202.002 204.998 0 + vertex 203.315 204.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.544 203.59 0 + vertex 202.002 204.998 0 + vertex 204.649 203.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.521 204.954 0 + vertex 202.002 204.998 0 + vertex 202.726 204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 202.927 204.853 0 + vertex 202.726 204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 204.884 202.827 0 + vertex 204.819 203.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 202.521 204.954 0 + vertex 202.314 204.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.971 202.418 0 + vertex 204.934 202.624 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.314 204.984 0 + vertex 202.105 204.998 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 204.993 202.209 0 + vertex 202.002 204.998 0 + vertex 205 202 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 204.998 0 + vertex 202 205 0 + vertex -202 205 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex 202 205 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 202.002 204.998 0 + vertex -202.002 204.998 0 + vertex 202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -205 202 0 + vertex -205 -202 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.105 204.998 0 + vertex -202.314 204.984 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.314 204.984 0 + vertex -202.521 204.954 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.521 204.954 0 + vertex -202.726 204.911 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.726 204.911 0 + vertex -202.927 204.853 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.927 204.853 0 + vertex -203.124 204.782 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.124 204.782 0 + vertex -203.315 204.696 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.315 204.696 0 + vertex -203.5 204.598 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.5 204.598 0 + vertex -203.678 204.487 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.678 204.487 0 + vertex -203.847 204.364 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -203.847 204.364 0 + vertex -204.007 204.229 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.007 204.229 0 + vertex -204.158 204.084 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.158 204.084 0 + vertex -204.298 203.928 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.298 203.928 0 + vertex -204.427 203.763 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.427 203.763 0 + vertex -204.544 203.59 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.544 203.59 0 + vertex -204.649 203.408 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.649 203.408 0 + vertex -204.741 203.22 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.741 203.22 0 + vertex -204.819 203.026 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.819 203.026 0 + vertex -204.884 202.827 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.884 202.827 0 + vertex -204.934 202.624 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.934 202.624 0 + vertex -204.971 202.418 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.971 202.418 0 + vertex -204.993 202.209 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -204.993 202.209 0 + vertex -205 202 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 204.998 0 + vertex -205 202 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 204.998 0 + vertex -202.002 -204.998 0 + vertex 202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -204.993 -202.209 0 + vertex -204.971 -202.418 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.934 -202.624 0 + vertex -204.884 -202.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.649 -203.408 0 + vertex -202.002 -204.998 0 + vertex -204.741 -203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.819 -203.026 0 + vertex -204.741 -203.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -204.158 -204.084 0 + vertex -204.007 -204.229 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.298 -203.928 0 + vertex -202.002 -204.998 0 + vertex -204.427 -203.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.544 -203.59 0 + vertex -204.427 -203.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.158 -204.084 0 + vertex -202.002 -204.998 0 + vertex -204.298 -203.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -203.124 -204.782 0 + vertex -202.927 -204.853 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -203.678 -204.487 0 + vertex -202.002 -204.998 0 + vertex -203.847 -204.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.007 -204.229 0 + vertex -203.847 -204.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -203.5 -204.598 0 + vertex -202.002 -204.998 0 + vertex -203.678 -204.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -203.315 -204.696 0 + vertex -202.002 -204.998 0 + vertex -203.5 -204.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -203.124 -204.782 0 + vertex -202.002 -204.998 0 + vertex -203.315 -204.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.544 -203.59 0 + vertex -202.002 -204.998 0 + vertex -204.649 -203.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -202.521 -204.954 0 + vertex -202.002 -204.998 0 + vertex -202.726 -204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -202.927 -204.853 0 + vertex -202.726 -204.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -204.884 -202.827 0 + vertex -204.819 -203.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex -202.521 -204.954 0 + vertex -202.314 -204.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -204.971 -202.418 0 + vertex -204.934 -202.624 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -202.314 -204.984 0 + vertex -202.105 -204.998 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -202.002 -204.998 0 + vertex 202 -205 0 + vertex 202.002 -204.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -202 -205 0 + vertex 202 -205 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -204.993 -202.209 0 + vertex -202.002 -204.998 0 + vertex -205 -202 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 202.105 -204.998 -3 + vertex 202.002 -204.998 0 + vertex 202.002 -204.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 202.105 -204.998 -3 + vertex 202.105 -204.998 0 + vertex 202.002 -204.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 202.314 -204.984 -3 + vertex 202.105 -204.998 0 + vertex 202.105 -204.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 202.314 -204.984 -3 + vertex 202.314 -204.984 0 + vertex 202.105 -204.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 202.521 -204.954 -3 + vertex 202.314 -204.984 0 + vertex 202.314 -204.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 202.521 -204.954 -3 + vertex 202.521 -204.954 0 + vertex 202.314 -204.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 202.726 -204.911 -3 + vertex 202.521 -204.954 0 + vertex 202.521 -204.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 202.726 -204.911 -3 + vertex 202.726 -204.911 0 + vertex 202.521 -204.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 202.927 -204.853 -3 + vertex 202.726 -204.911 0 + vertex 202.726 -204.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 202.927 -204.853 -3 + vertex 202.927 -204.853 0 + vertex 202.726 -204.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 203.124 -204.782 -3 + vertex 202.927 -204.853 0 + vertex 202.927 -204.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 203.124 -204.782 -3 + vertex 203.124 -204.782 0 + vertex 202.927 -204.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 203.315 -204.696 -3 + vertex 203.124 -204.782 0 + vertex 203.124 -204.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 203.315 -204.696 -3 + vertex 203.315 -204.696 0 + vertex 203.124 -204.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 203.5 -204.598 -3 + vertex 203.315 -204.696 0 + vertex 203.315 -204.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 203.5 -204.598 -3 + vertex 203.5 -204.598 0 + vertex 203.315 -204.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 203.678 -204.487 -3 + vertex 203.5 -204.598 0 + vertex 203.5 -204.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 203.678 -204.487 -3 + vertex 203.678 -204.487 0 + vertex 203.5 -204.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 203.847 -204.364 -3 + vertex 203.678 -204.487 0 + vertex 203.678 -204.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 203.847 -204.364 -3 + vertex 203.847 -204.364 0 + vertex 203.678 -204.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 204.007 -204.229 -3 + vertex 203.847 -204.364 0 + vertex 203.847 -204.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 204.007 -204.229 -3 + vertex 204.007 -204.229 0 + vertex 203.847 -204.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 204.158 -204.084 -3 + vertex 204.007 -204.229 0 + vertex 204.007 -204.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 204.158 -204.084 -3 + vertex 204.158 -204.084 0 + vertex 204.007 -204.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 204.298 -203.928 -3 + vertex 204.158 -204.084 0 + vertex 204.158 -204.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 204.298 -203.928 -3 + vertex 204.298 -203.928 0 + vertex 204.158 -204.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 204.427 -203.763 -3 + vertex 204.298 -203.928 0 + vertex 204.298 -203.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 204.427 -203.763 -3 + vertex 204.427 -203.763 0 + vertex 204.298 -203.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 204.544 -203.59 -3 + vertex 204.427 -203.763 0 + vertex 204.427 -203.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 204.544 -203.59 -3 + vertex 204.544 -203.59 0 + vertex 204.427 -203.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 204.649 -203.408 -3 + vertex 204.544 -203.59 0 + vertex 204.544 -203.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 204.649 -203.408 -3 + vertex 204.649 -203.408 0 + vertex 204.544 -203.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 204.741 -203.22 -3 + vertex 204.649 -203.408 0 + vertex 204.649 -203.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 204.741 -203.22 -3 + vertex 204.741 -203.22 0 + vertex 204.649 -203.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 204.819 -203.026 -3 + vertex 204.741 -203.22 0 + vertex 204.741 -203.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 204.819 -203.026 -3 + vertex 204.819 -203.026 0 + vertex 204.741 -203.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 204.884 -202.827 -3 + vertex 204.819 -203.026 0 + vertex 204.819 -203.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 204.884 -202.827 -3 + vertex 204.884 -202.827 0 + vertex 204.819 -203.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 204.934 -202.624 -3 + vertex 204.884 -202.827 0 + vertex 204.884 -202.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 204.934 -202.624 -3 + vertex 204.934 -202.624 0 + vertex 204.884 -202.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 204.971 -202.418 -3 + vertex 204.934 -202.624 0 + vertex 204.934 -202.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 204.971 -202.418 -3 + vertex 204.971 -202.418 0 + vertex 204.934 -202.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 204.993 -202.209 -3 + vertex 204.971 -202.418 0 + vertex 204.971 -202.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 204.993 -202.209 -3 + vertex 204.993 -202.209 0 + vertex 204.971 -202.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 205 -202 -3 + vertex 204.993 -202.209 0 + vertex 204.993 -202.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 205 -202 -3 + vertex 205 -202 0 + vertex 204.993 -202.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 205 202 -3 + vertex 205 -202 0 + vertex 205 -202 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 205 202 -3 + vertex 205 202 0 + vertex 205 -202 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 204.993 202.209 -3 + vertex 205 202 0 + vertex 205 202 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 204.993 202.209 -3 + vertex 204.993 202.209 0 + vertex 205 202 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 204.971 202.418 -3 + vertex 204.993 202.209 0 + vertex 204.993 202.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 204.971 202.418 -3 + vertex 204.971 202.418 0 + vertex 204.993 202.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 204.934 202.624 -3 + vertex 204.971 202.418 0 + vertex 204.971 202.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 204.934 202.624 -3 + vertex 204.934 202.624 0 + vertex 204.971 202.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 204.884 202.827 -3 + vertex 204.934 202.624 0 + vertex 204.934 202.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 204.884 202.827 -3 + vertex 204.884 202.827 0 + vertex 204.934 202.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 204.819 203.026 -3 + vertex 204.884 202.827 0 + vertex 204.884 202.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 204.819 203.026 -3 + vertex 204.819 203.026 0 + vertex 204.884 202.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 204.741 203.22 -3 + vertex 204.819 203.026 0 + vertex 204.819 203.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 204.741 203.22 -3 + vertex 204.741 203.22 0 + vertex 204.819 203.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 204.649 203.408 -3 + vertex 204.741 203.22 0 + vertex 204.741 203.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 204.649 203.408 -3 + vertex 204.649 203.408 0 + vertex 204.741 203.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 204.544 203.59 -3 + vertex 204.649 203.408 0 + vertex 204.649 203.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 204.544 203.59 -3 + vertex 204.544 203.59 0 + vertex 204.649 203.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 204.427 203.763 -3 + vertex 204.544 203.59 0 + vertex 204.544 203.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 204.427 203.763 -3 + vertex 204.427 203.763 0 + vertex 204.544 203.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 204.298 203.928 -3 + vertex 204.427 203.763 0 + vertex 204.427 203.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 204.298 203.928 -3 + vertex 204.298 203.928 0 + vertex 204.427 203.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 204.158 204.084 -3 + vertex 204.298 203.928 0 + vertex 204.298 203.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 204.158 204.084 -3 + vertex 204.158 204.084 0 + vertex 204.298 203.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 204.007 204.229 -3 + vertex 204.158 204.084 0 + vertex 204.158 204.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 204.007 204.229 -3 + vertex 204.007 204.229 0 + vertex 204.158 204.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 203.847 204.364 -3 + vertex 204.007 204.229 0 + vertex 204.007 204.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 203.847 204.364 -3 + vertex 203.847 204.364 0 + vertex 204.007 204.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 203.678 204.487 -3 + vertex 203.847 204.364 0 + vertex 203.847 204.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 203.678 204.487 -3 + vertex 203.678 204.487 0 + vertex 203.847 204.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 203.5 204.598 -3 + vertex 203.678 204.487 0 + vertex 203.678 204.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 203.5 204.598 -3 + vertex 203.5 204.598 0 + vertex 203.678 204.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 203.315 204.696 -3 + vertex 203.5 204.598 0 + vertex 203.5 204.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 203.315 204.696 -3 + vertex 203.315 204.696 0 + vertex 203.5 204.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 203.124 204.782 -3 + vertex 203.315 204.696 0 + vertex 203.315 204.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 203.124 204.782 -3 + vertex 203.124 204.782 0 + vertex 203.315 204.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 202.927 204.853 -3 + vertex 203.124 204.782 0 + vertex 203.124 204.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 202.927 204.853 -3 + vertex 202.927 204.853 0 + vertex 203.124 204.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 202.726 204.911 -3 + vertex 202.927 204.853 0 + vertex 202.927 204.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 202.726 204.911 -3 + vertex 202.726 204.911 0 + vertex 202.927 204.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 202.521 204.954 -3 + vertex 202.726 204.911 0 + vertex 202.726 204.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 202.521 204.954 -3 + vertex 202.521 204.954 0 + vertex 202.726 204.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 202.314 204.984 -3 + vertex 202.521 204.954 0 + vertex 202.521 204.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 202.314 204.984 -3 + vertex 202.314 204.984 0 + vertex 202.521 204.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 202.105 204.998 -3 + vertex 202.314 204.984 0 + vertex 202.314 204.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 202.105 204.998 -3 + vertex 202.105 204.998 0 + vertex 202.314 204.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 202.002 204.998 -3 + vertex 202.105 204.998 0 + vertex 202.105 204.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 202.002 204.998 -3 + vertex 202.002 204.998 0 + vertex 202.105 204.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 202 205 -3 + vertex 202.002 204.998 0 + vertex 202.002 204.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 202 205 -3 + vertex 202 205 0 + vertex 202.002 204.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -202 205 -3 + vertex 202 205 0 + vertex 202 205 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -202 205 -3 + vertex -202 205 0 + vertex 202 205 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -202.002 204.998 -3 + vertex -202 205 0 + vertex -202 205 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -202.002 204.998 -3 + vertex -202.002 204.998 0 + vertex -202 205 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -202.105 204.998 -3 + vertex -202.002 204.998 0 + vertex -202.002 204.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -202.105 204.998 -3 + vertex -202.105 204.998 0 + vertex -202.002 204.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -202.314 204.984 -3 + vertex -202.105 204.998 0 + vertex -202.105 204.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -202.314 204.984 -3 + vertex -202.314 204.984 0 + vertex -202.105 204.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -202.521 204.954 -3 + vertex -202.314 204.984 0 + vertex -202.314 204.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -202.521 204.954 -3 + vertex -202.521 204.954 0 + vertex -202.314 204.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -202.726 204.911 -3 + vertex -202.521 204.954 0 + vertex -202.521 204.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -202.726 204.911 -3 + vertex -202.726 204.911 0 + vertex -202.521 204.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -202.927 204.853 -3 + vertex -202.726 204.911 0 + vertex -202.726 204.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -202.927 204.853 -3 + vertex -202.927 204.853 0 + vertex -202.726 204.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -203.124 204.782 -3 + vertex -202.927 204.853 0 + vertex -202.927 204.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -203.124 204.782 -3 + vertex -203.124 204.782 0 + vertex -202.927 204.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -203.315 204.696 -3 + vertex -203.124 204.782 0 + vertex -203.124 204.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -203.315 204.696 -3 + vertex -203.315 204.696 0 + vertex -203.124 204.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -203.5 204.598 -3 + vertex -203.315 204.696 0 + vertex -203.315 204.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -203.5 204.598 -3 + vertex -203.5 204.598 0 + vertex -203.315 204.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -203.678 204.487 -3 + vertex -203.5 204.598 0 + vertex -203.5 204.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -203.678 204.487 -3 + vertex -203.678 204.487 0 + vertex -203.5 204.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -203.847 204.364 -3 + vertex -203.678 204.487 0 + vertex -203.678 204.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -203.847 204.364 -3 + vertex -203.847 204.364 0 + vertex -203.678 204.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -204.007 204.229 -3 + vertex -203.847 204.364 0 + vertex -203.847 204.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -204.007 204.229 -3 + vertex -204.007 204.229 0 + vertex -203.847 204.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -204.158 204.084 -3 + vertex -204.007 204.229 0 + vertex -204.007 204.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -204.158 204.084 -3 + vertex -204.158 204.084 0 + vertex -204.007 204.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -204.298 203.928 -3 + vertex -204.158 204.084 0 + vertex -204.158 204.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -204.298 203.928 -3 + vertex -204.298 203.928 0 + vertex -204.158 204.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -204.427 203.763 -3 + vertex -204.298 203.928 0 + vertex -204.298 203.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -204.427 203.763 -3 + vertex -204.427 203.763 0 + vertex -204.298 203.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -204.544 203.59 -3 + vertex -204.427 203.763 0 + vertex -204.427 203.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -204.544 203.59 -3 + vertex -204.544 203.59 0 + vertex -204.427 203.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -204.649 203.408 -3 + vertex -204.544 203.59 0 + vertex -204.544 203.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -204.649 203.408 -3 + vertex -204.649 203.408 0 + vertex -204.544 203.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -204.741 203.22 -3 + vertex -204.649 203.408 0 + vertex -204.649 203.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -204.741 203.22 -3 + vertex -204.741 203.22 0 + vertex -204.649 203.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -204.819 203.026 -3 + vertex -204.741 203.22 0 + vertex -204.741 203.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -204.819 203.026 -3 + vertex -204.819 203.026 0 + vertex -204.741 203.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -204.884 202.827 -3 + vertex -204.819 203.026 0 + vertex -204.819 203.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -204.884 202.827 -3 + vertex -204.884 202.827 0 + vertex -204.819 203.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -204.934 202.624 -3 + vertex -204.884 202.827 0 + vertex -204.884 202.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -204.934 202.624 -3 + vertex -204.934 202.624 0 + vertex -204.884 202.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -204.971 202.418 -3 + vertex -204.934 202.624 0 + vertex -204.934 202.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -204.971 202.418 -3 + vertex -204.971 202.418 0 + vertex -204.934 202.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -204.993 202.209 -3 + vertex -204.971 202.418 0 + vertex -204.971 202.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -204.993 202.209 -3 + vertex -204.993 202.209 0 + vertex -204.971 202.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -205 202 -3 + vertex -204.993 202.209 0 + vertex -204.993 202.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -205 202 -3 + vertex -205 202 0 + vertex -204.993 202.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -205 -202 -3 + vertex -205 202 0 + vertex -205 202 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -205 -202 -3 + vertex -205 -202 0 + vertex -205 202 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -204.993 -202.209 -3 + vertex -205 -202 0 + vertex -205 -202 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -204.993 -202.209 -3 + vertex -204.993 -202.209 0 + vertex -205 -202 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -204.971 -202.418 -3 + vertex -204.993 -202.209 0 + vertex -204.993 -202.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -204.971 -202.418 -3 + vertex -204.971 -202.418 0 + vertex -204.993 -202.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -204.934 -202.624 -3 + vertex -204.971 -202.418 0 + vertex -204.971 -202.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -204.934 -202.624 -3 + vertex -204.934 -202.624 0 + vertex -204.971 -202.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -204.884 -202.827 -3 + vertex -204.934 -202.624 0 + vertex -204.934 -202.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -204.884 -202.827 -3 + vertex -204.884 -202.827 0 + vertex -204.934 -202.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -204.819 -203.026 -3 + vertex -204.884 -202.827 0 + vertex -204.884 -202.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -204.819 -203.026 -3 + vertex -204.819 -203.026 0 + vertex -204.884 -202.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -204.741 -203.22 -3 + vertex -204.819 -203.026 0 + vertex -204.819 -203.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -204.741 -203.22 -3 + vertex -204.741 -203.22 0 + vertex -204.819 -203.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -204.649 -203.408 -3 + vertex -204.741 -203.22 0 + vertex -204.741 -203.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -204.649 -203.408 -3 + vertex -204.649 -203.408 0 + vertex -204.741 -203.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -204.544 -203.59 -3 + vertex -204.649 -203.408 0 + vertex -204.649 -203.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -204.544 -203.59 -3 + vertex -204.544 -203.59 0 + vertex -204.649 -203.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -204.427 -203.763 -3 + vertex -204.544 -203.59 0 + vertex -204.544 -203.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -204.427 -203.763 -3 + vertex -204.427 -203.763 0 + vertex -204.544 -203.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -204.298 -203.928 -3 + vertex -204.427 -203.763 0 + vertex -204.427 -203.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -204.298 -203.928 -3 + vertex -204.298 -203.928 0 + vertex -204.427 -203.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -204.158 -204.084 -3 + vertex -204.298 -203.928 0 + vertex -204.298 -203.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -204.158 -204.084 -3 + vertex -204.158 -204.084 0 + vertex -204.298 -203.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -204.007 -204.229 -3 + vertex -204.158 -204.084 0 + vertex -204.158 -204.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -204.007 -204.229 -3 + vertex -204.007 -204.229 0 + vertex -204.158 -204.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -203.847 -204.364 -3 + vertex -204.007 -204.229 0 + vertex -204.007 -204.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -203.847 -204.364 -3 + vertex -203.847 -204.364 0 + vertex -204.007 -204.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -203.678 -204.487 -3 + vertex -203.847 -204.364 0 + vertex -203.847 -204.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -203.678 -204.487 -3 + vertex -203.678 -204.487 0 + vertex -203.847 -204.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -203.5 -204.598 -3 + vertex -203.678 -204.487 0 + vertex -203.678 -204.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -203.5 -204.598 -3 + vertex -203.5 -204.598 0 + vertex -203.678 -204.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -203.315 -204.696 -3 + vertex -203.5 -204.598 0 + vertex -203.5 -204.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -203.315 -204.696 -3 + vertex -203.315 -204.696 0 + vertex -203.5 -204.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -203.124 -204.782 -3 + vertex -203.315 -204.696 0 + vertex -203.315 -204.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -203.124 -204.782 -3 + vertex -203.124 -204.782 0 + vertex -203.315 -204.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -202.927 -204.853 -3 + vertex -203.124 -204.782 0 + vertex -203.124 -204.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -202.927 -204.853 -3 + vertex -202.927 -204.853 0 + vertex -203.124 -204.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -202.726 -204.911 -3 + vertex -202.927 -204.853 0 + vertex -202.927 -204.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -202.726 -204.911 -3 + vertex -202.726 -204.911 0 + vertex -202.927 -204.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -202.521 -204.954 -3 + vertex -202.726 -204.911 0 + vertex -202.726 -204.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -202.521 -204.954 -3 + vertex -202.521 -204.954 0 + vertex -202.726 -204.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -202.314 -204.984 -3 + vertex -202.521 -204.954 0 + vertex -202.521 -204.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -202.314 -204.984 -3 + vertex -202.314 -204.984 0 + vertex -202.521 -204.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -202.105 -204.998 -3 + vertex -202.314 -204.984 0 + vertex -202.314 -204.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -202.105 -204.998 -3 + vertex -202.105 -204.998 0 + vertex -202.314 -204.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -202.002 -204.998 -3 + vertex -202.105 -204.998 0 + vertex -202.105 -204.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -202.002 -204.998 -3 + vertex -202.002 -204.998 0 + vertex -202.105 -204.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -202 -205 -3 + vertex -202.002 -204.998 0 + vertex -202.002 -204.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -202 -205 -3 + vertex -202 -205 0 + vertex -202.002 -204.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 202 -205 -3 + vertex -202 -205 0 + vertex -202 -205 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 202 -205 -3 + vertex 202 -205 0 + vertex -202 -205 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 202.002 -204.998 -3 + vertex 202 -205 0 + vertex 202 -205 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 202.002 -204.998 -3 + vertex 202.002 -204.998 0 + vertex 202 -205 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr10s5.svg b/resources/profiles/Creality/cr10s5.svg new file mode 100644 index 0000000000..1dfca17dc2 --- /dev/null +++ b/resources/profiles/Creality/cr10s5.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/cr10s5_bed.stl b/resources/profiles/Creality/cr10s5_bed.stl new file mode 100644 index 0000000000..5b9acaf104 --- /dev/null +++ b/resources/profiles/Creality/cr10s5_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 252.105 -254.998 -3 + vertex 252.002 -254.998 -3 + vertex 252.314 -254.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.314 -254.984 -3 + vertex 252.002 -254.998 -3 + vertex 252.521 -254.954 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 255 -252 -3 + vertex 252.002 -254.998 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.521 -254.954 -3 + vertex 252.002 -254.998 -3 + vertex 252.726 -254.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.726 -254.911 -3 + vertex 252.002 -254.998 -3 + vertex 252.927 -254.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.927 -254.853 -3 + vertex 252.002 -254.998 -3 + vertex 253.124 -254.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.124 -254.782 -3 + vertex 252.002 -254.998 -3 + vertex 253.315 -254.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.315 -254.696 -3 + vertex 252.002 -254.998 -3 + vertex 253.5 -254.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.5 -254.598 -3 + vertex 252.002 -254.998 -3 + vertex 253.678 -254.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.678 -254.487 -3 + vertex 252.002 -254.998 -3 + vertex 253.847 -254.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 253.847 -254.364 -3 + vertex 252.002 -254.998 -3 + vertex 254.007 -254.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.007 -254.229 -3 + vertex 252.002 -254.998 -3 + vertex 254.158 -254.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.158 -254.084 -3 + vertex 252.002 -254.998 -3 + vertex 254.298 -253.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.298 -253.928 -3 + vertex 252.002 -254.998 -3 + vertex 254.427 -253.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.427 -253.763 -3 + vertex 252.002 -254.998 -3 + vertex 254.544 -253.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.544 -253.59 -3 + vertex 252.002 -254.998 -3 + vertex 254.649 -253.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.649 -253.408 -3 + vertex 252.002 -254.998 -3 + vertex 254.741 -253.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.741 -253.22 -3 + vertex 252.002 -254.998 -3 + vertex 254.819 -253.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.819 -253.026 -3 + vertex 252.002 -254.998 -3 + vertex 254.884 -252.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.884 -252.827 -3 + vertex 252.002 -254.998 -3 + vertex 254.934 -252.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.934 -252.624 -3 + vertex 252.002 -254.998 -3 + vertex 254.971 -252.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.971 -252.418 -3 + vertex 252.002 -254.998 -3 + vertex 254.993 -252.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 254.993 -252.209 -3 + vertex 252.002 -254.998 -3 + vertex 255 -252 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 255 -252 -3 + vertex 252.002 254.998 -3 + vertex 255 252 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 254.971 252.418 -3 + vertex 254.993 252.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 254.884 252.827 -3 + vertex 254.934 252.624 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 254.741 253.22 -3 + vertex 252.002 254.998 -3 + vertex 254.649 253.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 254.741 253.22 -3 + vertex 254.819 253.026 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 254.007 254.229 -3 + vertex 254.158 254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 254.427 253.763 -3 + vertex 252.002 254.998 -3 + vertex 254.298 253.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 254.427 253.763 -3 + vertex 254.544 253.59 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 254.298 253.928 -3 + vertex 252.002 254.998 -3 + vertex 254.158 254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 252.927 254.853 -3 + vertex 253.124 254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 253.847 254.364 -3 + vertex 252.002 254.998 -3 + vertex 253.678 254.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 253.847 254.364 -3 + vertex 254.007 254.229 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 253.678 254.487 -3 + vertex 252.002 254.998 -3 + vertex 253.5 254.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 253.5 254.598 -3 + vertex 252.002 254.998 -3 + vertex 253.315 254.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 253.315 254.696 -3 + vertex 252.002 254.998 -3 + vertex 253.124 254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 254.649 253.408 -3 + vertex 252.002 254.998 -3 + vertex 254.544 253.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.726 254.911 -3 + vertex 252.002 254.998 -3 + vertex 252.521 254.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 252.726 254.911 -3 + vertex 252.927 254.853 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 254.819 253.026 -3 + vertex 254.884 252.827 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 252.314 254.984 -3 + vertex 252.521 254.954 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 254.934 252.624 -3 + vertex 254.971 252.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 254.998 -3 + vertex 252.105 254.998 -3 + vertex 252.314 254.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 255 252 -3 + vertex 252.002 254.998 -3 + vertex 254.993 252.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -252 255 -3 + vertex 252 255 -3 + vertex -252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex 252 255 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 -254.998 -3 + vertex -252.002 254.998 -3 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -255 -252 -3 + vertex -255 252 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -252.314 254.984 -3 + vertex -252.105 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -252.521 254.954 -3 + vertex -252.314 254.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -252.726 254.911 -3 + vertex -252.521 254.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -252.927 254.853 -3 + vertex -252.726 254.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.124 254.782 -3 + vertex -252.927 254.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.315 254.696 -3 + vertex -253.124 254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.5 254.598 -3 + vertex -253.315 254.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.678 254.487 -3 + vertex -253.5 254.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -253.847 254.364 -3 + vertex -253.678 254.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.007 254.229 -3 + vertex -253.847 254.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.158 254.084 -3 + vertex -254.007 254.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.298 253.928 -3 + vertex -254.158 254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.427 253.763 -3 + vertex -254.298 253.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.544 253.59 -3 + vertex -254.427 253.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.649 253.408 -3 + vertex -254.544 253.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.741 253.22 -3 + vertex -254.649 253.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.819 253.026 -3 + vertex -254.741 253.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.884 252.827 -3 + vertex -254.819 253.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.934 252.624 -3 + vertex -254.884 252.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.971 252.418 -3 + vertex -254.934 252.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -254.993 252.209 -3 + vertex -254.971 252.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 254.998 -3 + vertex -255 252 -3 + vertex -254.993 252.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -255 252 -3 + vertex -252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 252.002 -254.998 -3 + vertex -252.002 -254.998 -3 + vertex -252.002 254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -254.971 -252.418 -3 + vertex -254.993 -252.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.884 -252.827 -3 + vertex -254.934 -252.624 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.741 -253.22 -3 + vertex -252.002 -254.998 -3 + vertex -254.649 -253.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.741 -253.22 -3 + vertex -254.819 -253.026 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -254.007 -254.229 -3 + vertex -254.158 -254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.427 -253.763 -3 + vertex -252.002 -254.998 -3 + vertex -254.298 -253.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.427 -253.763 -3 + vertex -254.544 -253.59 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.298 -253.928 -3 + vertex -252.002 -254.998 -3 + vertex -254.158 -254.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -252.927 -254.853 -3 + vertex -253.124 -254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.847 -254.364 -3 + vertex -252.002 -254.998 -3 + vertex -253.678 -254.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.847 -254.364 -3 + vertex -254.007 -254.229 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.678 -254.487 -3 + vertex -252.002 -254.998 -3 + vertex -253.5 -254.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.5 -254.598 -3 + vertex -252.002 -254.998 -3 + vertex -253.315 -254.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -253.315 -254.696 -3 + vertex -252.002 -254.998 -3 + vertex -253.124 -254.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.649 -253.408 -3 + vertex -252.002 -254.998 -3 + vertex -254.544 -253.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.726 -254.911 -3 + vertex -252.002 -254.998 -3 + vertex -252.521 -254.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.726 -254.911 -3 + vertex -252.927 -254.853 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -254.819 -253.026 -3 + vertex -254.884 -252.827 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.314 -254.984 -3 + vertex -252.521 -254.954 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -254.934 -252.624 -3 + vertex -254.971 -252.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex -252.105 -254.998 -3 + vertex -252.314 -254.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 252.002 -254.998 -3 + vertex 252 -255 -3 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -252.002 -254.998 -3 + vertex 252 -255 -3 + vertex -252 -255 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -255 -252 -3 + vertex -252.002 -254.998 -3 + vertex -254.993 -252.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.314 -254.984 0 + vertex 252.002 -254.998 0 + vertex 252.105 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.521 -254.954 0 + vertex 252.002 -254.998 0 + vertex 252.314 -254.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 252.002 -254.998 0 + vertex 255 -252 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.726 -254.911 0 + vertex 252.002 -254.998 0 + vertex 252.521 -254.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.927 -254.853 0 + vertex 252.002 -254.998 0 + vertex 252.726 -254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.124 -254.782 0 + vertex 252.002 -254.998 0 + vertex 252.927 -254.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.315 -254.696 0 + vertex 252.002 -254.998 0 + vertex 253.124 -254.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.5 -254.598 0 + vertex 252.002 -254.998 0 + vertex 253.315 -254.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.678 -254.487 0 + vertex 252.002 -254.998 0 + vertex 253.5 -254.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.847 -254.364 0 + vertex 252.002 -254.998 0 + vertex 253.678 -254.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.007 -254.229 0 + vertex 252.002 -254.998 0 + vertex 253.847 -254.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.158 -254.084 0 + vertex 252.002 -254.998 0 + vertex 254.007 -254.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.298 -253.928 0 + vertex 252.002 -254.998 0 + vertex 254.158 -254.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.427 -253.763 0 + vertex 252.002 -254.998 0 + vertex 254.298 -253.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.544 -253.59 0 + vertex 252.002 -254.998 0 + vertex 254.427 -253.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.649 -253.408 0 + vertex 252.002 -254.998 0 + vertex 254.544 -253.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.741 -253.22 0 + vertex 252.002 -254.998 0 + vertex 254.649 -253.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.819 -253.026 0 + vertex 252.002 -254.998 0 + vertex 254.741 -253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.884 -252.827 0 + vertex 252.002 -254.998 0 + vertex 254.819 -253.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.934 -252.624 0 + vertex 252.002 -254.998 0 + vertex 254.884 -252.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.971 -252.418 0 + vertex 252.002 -254.998 0 + vertex 254.934 -252.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.993 -252.209 0 + vertex 252.002 -254.998 0 + vertex 254.971 -252.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 255 -252 0 + vertex 252.002 -254.998 0 + vertex 254.993 -252.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 255 252 0 + vertex 252.002 254.998 0 + vertex 255 -252 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.993 252.209 0 + vertex 254.971 252.418 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.934 252.624 0 + vertex 254.884 252.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.649 253.408 0 + vertex 252.002 254.998 0 + vertex 254.741 253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.819 253.026 0 + vertex 254.741 253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.158 254.084 0 + vertex 254.007 254.229 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.298 253.928 0 + vertex 252.002 254.998 0 + vertex 254.427 253.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.544 253.59 0 + vertex 254.427 253.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.158 254.084 0 + vertex 252.002 254.998 0 + vertex 254.298 253.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.124 254.782 0 + vertex 252.927 254.853 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.678 254.487 0 + vertex 252.002 254.998 0 + vertex 253.847 254.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.007 254.229 0 + vertex 253.847 254.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.5 254.598 0 + vertex 252.002 254.998 0 + vertex 253.678 254.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.315 254.696 0 + vertex 252.002 254.998 0 + vertex 253.5 254.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 253.124 254.782 0 + vertex 252.002 254.998 0 + vertex 253.315 254.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.544 253.59 0 + vertex 252.002 254.998 0 + vertex 254.649 253.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.521 254.954 0 + vertex 252.002 254.998 0 + vertex 252.726 254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 252.927 254.853 0 + vertex 252.726 254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 254.884 252.827 0 + vertex 254.819 253.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 252.521 254.954 0 + vertex 252.314 254.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.971 252.418 0 + vertex 254.934 252.624 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.314 254.984 0 + vertex 252.105 254.998 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 254.993 252.209 0 + vertex 252.002 254.998 0 + vertex 255 252 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 254.998 0 + vertex 252 255 0 + vertex -252 255 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex 252 255 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 252.002 254.998 0 + vertex -252.002 254.998 0 + vertex 252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -255 252 0 + vertex -255 -252 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.105 254.998 0 + vertex -252.314 254.984 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.314 254.984 0 + vertex -252.521 254.954 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.521 254.954 0 + vertex -252.726 254.911 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.726 254.911 0 + vertex -252.927 254.853 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.927 254.853 0 + vertex -253.124 254.782 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.124 254.782 0 + vertex -253.315 254.696 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.315 254.696 0 + vertex -253.5 254.598 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.5 254.598 0 + vertex -253.678 254.487 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.678 254.487 0 + vertex -253.847 254.364 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -253.847 254.364 0 + vertex -254.007 254.229 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.007 254.229 0 + vertex -254.158 254.084 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.158 254.084 0 + vertex -254.298 253.928 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.298 253.928 0 + vertex -254.427 253.763 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.427 253.763 0 + vertex -254.544 253.59 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.544 253.59 0 + vertex -254.649 253.408 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.649 253.408 0 + vertex -254.741 253.22 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.741 253.22 0 + vertex -254.819 253.026 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.819 253.026 0 + vertex -254.884 252.827 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.884 252.827 0 + vertex -254.934 252.624 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.934 252.624 0 + vertex -254.971 252.418 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.971 252.418 0 + vertex -254.993 252.209 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -254.993 252.209 0 + vertex -255 252 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 254.998 0 + vertex -255 252 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 254.998 0 + vertex -252.002 -254.998 0 + vertex 252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -254.993 -252.209 0 + vertex -254.971 -252.418 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.934 -252.624 0 + vertex -254.884 -252.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.649 -253.408 0 + vertex -252.002 -254.998 0 + vertex -254.741 -253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.819 -253.026 0 + vertex -254.741 -253.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -254.158 -254.084 0 + vertex -254.007 -254.229 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.298 -253.928 0 + vertex -252.002 -254.998 0 + vertex -254.427 -253.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.544 -253.59 0 + vertex -254.427 -253.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.158 -254.084 0 + vertex -252.002 -254.998 0 + vertex -254.298 -253.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -253.124 -254.782 0 + vertex -252.927 -254.853 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -253.678 -254.487 0 + vertex -252.002 -254.998 0 + vertex -253.847 -254.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.007 -254.229 0 + vertex -253.847 -254.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -253.5 -254.598 0 + vertex -252.002 -254.998 0 + vertex -253.678 -254.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -253.315 -254.696 0 + vertex -252.002 -254.998 0 + vertex -253.5 -254.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -253.124 -254.782 0 + vertex -252.002 -254.998 0 + vertex -253.315 -254.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.544 -253.59 0 + vertex -252.002 -254.998 0 + vertex -254.649 -253.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -252.521 -254.954 0 + vertex -252.002 -254.998 0 + vertex -252.726 -254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -252.927 -254.853 0 + vertex -252.726 -254.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -254.884 -252.827 0 + vertex -254.819 -253.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex -252.521 -254.954 0 + vertex -252.314 -254.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -254.971 -252.418 0 + vertex -254.934 -252.624 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -252.314 -254.984 0 + vertex -252.105 -254.998 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -252.002 -254.998 0 + vertex 252 -255 0 + vertex 252.002 -254.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -252 -255 0 + vertex 252 -255 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -254.993 -252.209 0 + vertex -252.002 -254.998 0 + vertex -255 -252 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 252.105 -254.998 -3 + vertex 252.002 -254.998 0 + vertex 252.002 -254.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 252.105 -254.998 -3 + vertex 252.105 -254.998 0 + vertex 252.002 -254.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 252.314 -254.984 -3 + vertex 252.105 -254.998 0 + vertex 252.105 -254.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 252.314 -254.984 -3 + vertex 252.314 -254.984 0 + vertex 252.105 -254.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 252.521 -254.954 -3 + vertex 252.314 -254.984 0 + vertex 252.314 -254.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 252.521 -254.954 -3 + vertex 252.521 -254.954 0 + vertex 252.314 -254.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 252.726 -254.911 -3 + vertex 252.521 -254.954 0 + vertex 252.521 -254.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 252.726 -254.911 -3 + vertex 252.726 -254.911 0 + vertex 252.521 -254.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 252.927 -254.853 -3 + vertex 252.726 -254.911 0 + vertex 252.726 -254.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 252.927 -254.853 -3 + vertex 252.927 -254.853 0 + vertex 252.726 -254.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 253.124 -254.782 -3 + vertex 252.927 -254.853 0 + vertex 252.927 -254.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 253.124 -254.782 -3 + vertex 253.124 -254.782 0 + vertex 252.927 -254.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 253.315 -254.696 -3 + vertex 253.124 -254.782 0 + vertex 253.124 -254.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 253.315 -254.696 -3 + vertex 253.315 -254.696 0 + vertex 253.124 -254.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 253.5 -254.598 -3 + vertex 253.315 -254.696 0 + vertex 253.315 -254.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 253.5 -254.598 -3 + vertex 253.5 -254.598 0 + vertex 253.315 -254.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 253.678 -254.487 -3 + vertex 253.5 -254.598 0 + vertex 253.5 -254.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 253.678 -254.487 -3 + vertex 253.678 -254.487 0 + vertex 253.5 -254.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 253.847 -254.364 -3 + vertex 253.678 -254.487 0 + vertex 253.678 -254.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 253.847 -254.364 -3 + vertex 253.847 -254.364 0 + vertex 253.678 -254.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 254.007 -254.229 -3 + vertex 253.847 -254.364 0 + vertex 253.847 -254.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 254.007 -254.229 -3 + vertex 254.007 -254.229 0 + vertex 253.847 -254.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 254.158 -254.084 -3 + vertex 254.007 -254.229 0 + vertex 254.007 -254.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 254.158 -254.084 -3 + vertex 254.158 -254.084 0 + vertex 254.007 -254.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 254.298 -253.928 -3 + vertex 254.158 -254.084 0 + vertex 254.158 -254.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 254.298 -253.928 -3 + vertex 254.298 -253.928 0 + vertex 254.158 -254.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 254.427 -253.763 -3 + vertex 254.298 -253.928 0 + vertex 254.298 -253.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 254.427 -253.763 -3 + vertex 254.427 -253.763 0 + vertex 254.298 -253.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 254.544 -253.59 -3 + vertex 254.427 -253.763 0 + vertex 254.427 -253.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 254.544 -253.59 -3 + vertex 254.544 -253.59 0 + vertex 254.427 -253.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 254.649 -253.408 -3 + vertex 254.544 -253.59 0 + vertex 254.544 -253.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 254.649 -253.408 -3 + vertex 254.649 -253.408 0 + vertex 254.544 -253.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 254.741 -253.22 -3 + vertex 254.649 -253.408 0 + vertex 254.649 -253.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 254.741 -253.22 -3 + vertex 254.741 -253.22 0 + vertex 254.649 -253.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 254.819 -253.026 -3 + vertex 254.741 -253.22 0 + vertex 254.741 -253.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 254.819 -253.026 -3 + vertex 254.819 -253.026 0 + vertex 254.741 -253.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 254.884 -252.827 -3 + vertex 254.819 -253.026 0 + vertex 254.819 -253.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 254.884 -252.827 -3 + vertex 254.884 -252.827 0 + vertex 254.819 -253.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 254.934 -252.624 -3 + vertex 254.884 -252.827 0 + vertex 254.884 -252.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 254.934 -252.624 -3 + vertex 254.934 -252.624 0 + vertex 254.884 -252.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 254.971 -252.418 -3 + vertex 254.934 -252.624 0 + vertex 254.934 -252.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 254.971 -252.418 -3 + vertex 254.971 -252.418 0 + vertex 254.934 -252.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 254.993 -252.209 -3 + vertex 254.971 -252.418 0 + vertex 254.971 -252.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 254.993 -252.209 -3 + vertex 254.993 -252.209 0 + vertex 254.971 -252.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 255 -252 -3 + vertex 254.993 -252.209 0 + vertex 254.993 -252.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 255 -252 -3 + vertex 255 -252 0 + vertex 254.993 -252.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 255 252 -3 + vertex 255 -252 0 + vertex 255 -252 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 255 252 -3 + vertex 255 252 0 + vertex 255 -252 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 254.993 252.209 -3 + vertex 255 252 0 + vertex 255 252 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 254.993 252.209 -3 + vertex 254.993 252.209 0 + vertex 255 252 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 254.971 252.418 -3 + vertex 254.993 252.209 0 + vertex 254.993 252.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 254.971 252.418 -3 + vertex 254.971 252.418 0 + vertex 254.993 252.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 254.934 252.624 -3 + vertex 254.971 252.418 0 + vertex 254.971 252.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 254.934 252.624 -3 + vertex 254.934 252.624 0 + vertex 254.971 252.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 254.884 252.827 -3 + vertex 254.934 252.624 0 + vertex 254.934 252.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 254.884 252.827 -3 + vertex 254.884 252.827 0 + vertex 254.934 252.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 254.819 253.026 -3 + vertex 254.884 252.827 0 + vertex 254.884 252.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 254.819 253.026 -3 + vertex 254.819 253.026 0 + vertex 254.884 252.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 254.741 253.22 -3 + vertex 254.819 253.026 0 + vertex 254.819 253.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 254.741 253.22 -3 + vertex 254.741 253.22 0 + vertex 254.819 253.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 254.649 253.408 -3 + vertex 254.741 253.22 0 + vertex 254.741 253.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 254.649 253.408 -3 + vertex 254.649 253.408 0 + vertex 254.741 253.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 254.544 253.59 -3 + vertex 254.649 253.408 0 + vertex 254.649 253.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 254.544 253.59 -3 + vertex 254.544 253.59 0 + vertex 254.649 253.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 254.427 253.763 -3 + vertex 254.544 253.59 0 + vertex 254.544 253.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 254.427 253.763 -3 + vertex 254.427 253.763 0 + vertex 254.544 253.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 254.298 253.928 -3 + vertex 254.427 253.763 0 + vertex 254.427 253.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 254.298 253.928 -3 + vertex 254.298 253.928 0 + vertex 254.427 253.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 254.158 254.084 -3 + vertex 254.298 253.928 0 + vertex 254.298 253.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 254.158 254.084 -3 + vertex 254.158 254.084 0 + vertex 254.298 253.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 254.007 254.229 -3 + vertex 254.158 254.084 0 + vertex 254.158 254.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 254.007 254.229 -3 + vertex 254.007 254.229 0 + vertex 254.158 254.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 253.847 254.364 -3 + vertex 254.007 254.229 0 + vertex 254.007 254.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 253.847 254.364 -3 + vertex 253.847 254.364 0 + vertex 254.007 254.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 253.678 254.487 -3 + vertex 253.847 254.364 0 + vertex 253.847 254.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 253.678 254.487 -3 + vertex 253.678 254.487 0 + vertex 253.847 254.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 253.5 254.598 -3 + vertex 253.678 254.487 0 + vertex 253.678 254.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 253.5 254.598 -3 + vertex 253.5 254.598 0 + vertex 253.678 254.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 253.315 254.696 -3 + vertex 253.5 254.598 0 + vertex 253.5 254.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 253.315 254.696 -3 + vertex 253.315 254.696 0 + vertex 253.5 254.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 253.124 254.782 -3 + vertex 253.315 254.696 0 + vertex 253.315 254.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 253.124 254.782 -3 + vertex 253.124 254.782 0 + vertex 253.315 254.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 252.927 254.853 -3 + vertex 253.124 254.782 0 + vertex 253.124 254.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 252.927 254.853 -3 + vertex 252.927 254.853 0 + vertex 253.124 254.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 252.726 254.911 -3 + vertex 252.927 254.853 0 + vertex 252.927 254.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 252.726 254.911 -3 + vertex 252.726 254.911 0 + vertex 252.927 254.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 252.521 254.954 -3 + vertex 252.726 254.911 0 + vertex 252.726 254.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 252.521 254.954 -3 + vertex 252.521 254.954 0 + vertex 252.726 254.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 252.314 254.984 -3 + vertex 252.521 254.954 0 + vertex 252.521 254.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 252.314 254.984 -3 + vertex 252.314 254.984 0 + vertex 252.521 254.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 252.105 254.998 -3 + vertex 252.314 254.984 0 + vertex 252.314 254.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 252.105 254.998 -3 + vertex 252.105 254.998 0 + vertex 252.314 254.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 252.002 254.998 -3 + vertex 252.105 254.998 0 + vertex 252.105 254.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 252.002 254.998 -3 + vertex 252.002 254.998 0 + vertex 252.105 254.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 252 255 -3 + vertex 252.002 254.998 0 + vertex 252.002 254.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 252 255 -3 + vertex 252 255 0 + vertex 252.002 254.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -252 255 -3 + vertex 252 255 0 + vertex 252 255 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -252 255 -3 + vertex -252 255 0 + vertex 252 255 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -252.002 254.998 -3 + vertex -252 255 0 + vertex -252 255 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -252.002 254.998 -3 + vertex -252.002 254.998 0 + vertex -252 255 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -252.105 254.998 -3 + vertex -252.002 254.998 0 + vertex -252.002 254.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -252.105 254.998 -3 + vertex -252.105 254.998 0 + vertex -252.002 254.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -252.314 254.984 -3 + vertex -252.105 254.998 0 + vertex -252.105 254.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -252.314 254.984 -3 + vertex -252.314 254.984 0 + vertex -252.105 254.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -252.521 254.954 -3 + vertex -252.314 254.984 0 + vertex -252.314 254.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -252.521 254.954 -3 + vertex -252.521 254.954 0 + vertex -252.314 254.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -252.726 254.911 -3 + vertex -252.521 254.954 0 + vertex -252.521 254.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -252.726 254.911 -3 + vertex -252.726 254.911 0 + vertex -252.521 254.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -252.927 254.853 -3 + vertex -252.726 254.911 0 + vertex -252.726 254.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -252.927 254.853 -3 + vertex -252.927 254.853 0 + vertex -252.726 254.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -253.124 254.782 -3 + vertex -252.927 254.853 0 + vertex -252.927 254.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -253.124 254.782 -3 + vertex -253.124 254.782 0 + vertex -252.927 254.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -253.315 254.696 -3 + vertex -253.124 254.782 0 + vertex -253.124 254.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -253.315 254.696 -3 + vertex -253.315 254.696 0 + vertex -253.124 254.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -253.5 254.598 -3 + vertex -253.315 254.696 0 + vertex -253.315 254.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -253.5 254.598 -3 + vertex -253.5 254.598 0 + vertex -253.315 254.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -253.678 254.487 -3 + vertex -253.5 254.598 0 + vertex -253.5 254.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -253.678 254.487 -3 + vertex -253.678 254.487 0 + vertex -253.5 254.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -253.847 254.364 -3 + vertex -253.678 254.487 0 + vertex -253.678 254.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -253.847 254.364 -3 + vertex -253.847 254.364 0 + vertex -253.678 254.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -254.007 254.229 -3 + vertex -253.847 254.364 0 + vertex -253.847 254.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -254.007 254.229 -3 + vertex -254.007 254.229 0 + vertex -253.847 254.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -254.158 254.084 -3 + vertex -254.007 254.229 0 + vertex -254.007 254.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -254.158 254.084 -3 + vertex -254.158 254.084 0 + vertex -254.007 254.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -254.298 253.928 -3 + vertex -254.158 254.084 0 + vertex -254.158 254.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -254.298 253.928 -3 + vertex -254.298 253.928 0 + vertex -254.158 254.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -254.427 253.763 -3 + vertex -254.298 253.928 0 + vertex -254.298 253.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -254.427 253.763 -3 + vertex -254.427 253.763 0 + vertex -254.298 253.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -254.544 253.59 -3 + vertex -254.427 253.763 0 + vertex -254.427 253.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -254.544 253.59 -3 + vertex -254.544 253.59 0 + vertex -254.427 253.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -254.649 253.408 -3 + vertex -254.544 253.59 0 + vertex -254.544 253.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -254.649 253.408 -3 + vertex -254.649 253.408 0 + vertex -254.544 253.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -254.741 253.22 -3 + vertex -254.649 253.408 0 + vertex -254.649 253.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -254.741 253.22 -3 + vertex -254.741 253.22 0 + vertex -254.649 253.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -254.819 253.026 -3 + vertex -254.741 253.22 0 + vertex -254.741 253.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -254.819 253.026 -3 + vertex -254.819 253.026 0 + vertex -254.741 253.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -254.884 252.827 -3 + vertex -254.819 253.026 0 + vertex -254.819 253.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -254.884 252.827 -3 + vertex -254.884 252.827 0 + vertex -254.819 253.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -254.934 252.624 -3 + vertex -254.884 252.827 0 + vertex -254.884 252.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -254.934 252.624 -3 + vertex -254.934 252.624 0 + vertex -254.884 252.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -254.971 252.418 -3 + vertex -254.934 252.624 0 + vertex -254.934 252.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -254.971 252.418 -3 + vertex -254.971 252.418 0 + vertex -254.934 252.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -254.993 252.209 -3 + vertex -254.971 252.418 0 + vertex -254.971 252.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -254.993 252.209 -3 + vertex -254.993 252.209 0 + vertex -254.971 252.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -255 252 -3 + vertex -254.993 252.209 0 + vertex -254.993 252.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -255 252 -3 + vertex -255 252 0 + vertex -254.993 252.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -255 -252 -3 + vertex -255 252 0 + vertex -255 252 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -255 -252 -3 + vertex -255 -252 0 + vertex -255 252 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -254.993 -252.209 -3 + vertex -255 -252 0 + vertex -255 -252 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -254.993 -252.209 -3 + vertex -254.993 -252.209 0 + vertex -255 -252 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -254.971 -252.418 -3 + vertex -254.993 -252.209 0 + vertex -254.993 -252.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -254.971 -252.418 -3 + vertex -254.971 -252.418 0 + vertex -254.993 -252.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -254.934 -252.624 -3 + vertex -254.971 -252.418 0 + vertex -254.971 -252.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -254.934 -252.624 -3 + vertex -254.934 -252.624 0 + vertex -254.971 -252.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -254.884 -252.827 -3 + vertex -254.934 -252.624 0 + vertex -254.934 -252.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -254.884 -252.827 -3 + vertex -254.884 -252.827 0 + vertex -254.934 -252.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -254.819 -253.026 -3 + vertex -254.884 -252.827 0 + vertex -254.884 -252.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -254.819 -253.026 -3 + vertex -254.819 -253.026 0 + vertex -254.884 -252.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -254.741 -253.22 -3 + vertex -254.819 -253.026 0 + vertex -254.819 -253.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -254.741 -253.22 -3 + vertex -254.741 -253.22 0 + vertex -254.819 -253.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -254.649 -253.408 -3 + vertex -254.741 -253.22 0 + vertex -254.741 -253.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -254.649 -253.408 -3 + vertex -254.649 -253.408 0 + vertex -254.741 -253.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -254.544 -253.59 -3 + vertex -254.649 -253.408 0 + vertex -254.649 -253.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -254.544 -253.59 -3 + vertex -254.544 -253.59 0 + vertex -254.649 -253.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -254.427 -253.763 -3 + vertex -254.544 -253.59 0 + vertex -254.544 -253.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -254.427 -253.763 -3 + vertex -254.427 -253.763 0 + vertex -254.544 -253.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -254.298 -253.928 -3 + vertex -254.427 -253.763 0 + vertex -254.427 -253.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -254.298 -253.928 -3 + vertex -254.298 -253.928 0 + vertex -254.427 -253.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -254.158 -254.084 -3 + vertex -254.298 -253.928 0 + vertex -254.298 -253.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -254.158 -254.084 -3 + vertex -254.158 -254.084 0 + vertex -254.298 -253.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -254.007 -254.229 -3 + vertex -254.158 -254.084 0 + vertex -254.158 -254.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -254.007 -254.229 -3 + vertex -254.007 -254.229 0 + vertex -254.158 -254.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -253.847 -254.364 -3 + vertex -254.007 -254.229 0 + vertex -254.007 -254.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -253.847 -254.364 -3 + vertex -253.847 -254.364 0 + vertex -254.007 -254.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -253.678 -254.487 -3 + vertex -253.847 -254.364 0 + vertex -253.847 -254.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -253.678 -254.487 -3 + vertex -253.678 -254.487 0 + vertex -253.847 -254.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -253.5 -254.598 -3 + vertex -253.678 -254.487 0 + vertex -253.678 -254.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -253.5 -254.598 -3 + vertex -253.5 -254.598 0 + vertex -253.678 -254.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -253.315 -254.696 -3 + vertex -253.5 -254.598 0 + vertex -253.5 -254.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -253.315 -254.696 -3 + vertex -253.315 -254.696 0 + vertex -253.5 -254.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -253.124 -254.782 -3 + vertex -253.315 -254.696 0 + vertex -253.315 -254.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -253.124 -254.782 -3 + vertex -253.124 -254.782 0 + vertex -253.315 -254.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -252.927 -254.853 -3 + vertex -253.124 -254.782 0 + vertex -253.124 -254.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -252.927 -254.853 -3 + vertex -252.927 -254.853 0 + vertex -253.124 -254.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -252.726 -254.911 -3 + vertex -252.927 -254.853 0 + vertex -252.927 -254.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -252.726 -254.911 -3 + vertex -252.726 -254.911 0 + vertex -252.927 -254.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -252.521 -254.954 -3 + vertex -252.726 -254.911 0 + vertex -252.726 -254.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -252.521 -254.954 -3 + vertex -252.521 -254.954 0 + vertex -252.726 -254.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -252.314 -254.984 -3 + vertex -252.521 -254.954 0 + vertex -252.521 -254.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -252.314 -254.984 -3 + vertex -252.314 -254.984 0 + vertex -252.521 -254.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -252.105 -254.998 -3 + vertex -252.314 -254.984 0 + vertex -252.314 -254.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -252.105 -254.998 -3 + vertex -252.105 -254.998 0 + vertex -252.314 -254.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -252.002 -254.998 -3 + vertex -252.105 -254.998 0 + vertex -252.105 -254.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -252.002 -254.998 -3 + vertex -252.002 -254.998 0 + vertex -252.105 -254.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -252 -255 -3 + vertex -252.002 -254.998 0 + vertex -252.002 -254.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -252 -255 -3 + vertex -252 -255 0 + vertex -252.002 -254.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 252 -255 -3 + vertex -252 -255 0 + vertex -252 -255 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 252 -255 -3 + vertex 252 -255 0 + vertex -252 -255 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 252.002 -254.998 -3 + vertex 252 -255 0 + vertex 252 -255 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 252.002 -254.998 -3 + vertex 252.002 -254.998 0 + vertex 252 -255 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr10v2_bed.stl b/resources/profiles/Creality/cr10v2_bed.stl new file mode 100644 index 0000000000..004e0b114c --- /dev/null +++ b/resources/profiles/Creality/cr10v2_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 152.105 -159.998 -3 + vertex 152.002 -159.998 -3 + vertex 152.314 -159.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.314 -159.984 -3 + vertex 152.002 -159.998 -3 + vertex 152.521 -159.954 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex 152.002 159.998 -3 + vertex -155 157 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.521 -159.954 -3 + vertex 152.002 -159.998 -3 + vertex 152.726 -159.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.726 -159.911 -3 + vertex 152.002 -159.998 -3 + vertex 152.927 -159.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.927 -159.853 -3 + vertex 152.002 -159.998 -3 + vertex 153.124 -159.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.124 -159.782 -3 + vertex 152.002 -159.998 -3 + vertex 153.315 -159.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.315 -159.696 -3 + vertex 152.002 -159.998 -3 + vertex 153.5 -159.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.5 -159.598 -3 + vertex 152.002 -159.998 -3 + vertex 153.678 -159.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.678 -159.487 -3 + vertex 152.002 -159.998 -3 + vertex 153.847 -159.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 153.847 -159.364 -3 + vertex 152.002 -159.998 -3 + vertex 154.007 -159.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.007 -159.229 -3 + vertex 152.002 -159.998 -3 + vertex 154.158 -159.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.158 -159.084 -3 + vertex 152.002 -159.998 -3 + vertex 154.298 -158.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.298 -158.928 -3 + vertex 152.002 -159.998 -3 + vertex 154.427 -158.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.427 -158.763 -3 + vertex 152.002 -159.998 -3 + vertex 154.544 -158.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.544 -158.59 -3 + vertex 152.002 -159.998 -3 + vertex 154.649 -158.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.649 -158.408 -3 + vertex 152.002 -159.998 -3 + vertex 154.741 -158.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.741 -158.22 -3 + vertex 152.002 -159.998 -3 + vertex 154.819 -158.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.819 -158.026 -3 + vertex 152.002 -159.998 -3 + vertex 154.884 -157.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.884 -157.827 -3 + vertex 152.002 -159.998 -3 + vertex 154.934 -157.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.934 -157.624 -3 + vertex 152.002 -159.998 -3 + vertex 154.971 -157.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.971 -157.418 -3 + vertex 152.002 -159.998 -3 + vertex 154.993 -157.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 154.993 -157.209 -3 + vertex 152.002 -159.998 -3 + vertex 155 -157 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex 152 160 -3 + vertex 152.002 159.998 -3 + vertex -152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 154.971 157.418 -3 + vertex 154.993 157.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.884 157.827 -3 + vertex 154.934 157.624 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.741 158.22 -3 + vertex 152.002 159.998 -3 + vertex 154.649 158.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.741 158.22 -3 + vertex 154.819 158.026 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 154.007 159.229 -3 + vertex 154.158 159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.427 158.763 -3 + vertex 152.002 159.998 -3 + vertex 154.298 158.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.427 158.763 -3 + vertex 154.544 158.59 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.298 158.928 -3 + vertex 152.002 159.998 -3 + vertex 154.158 159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 152.927 159.853 -3 + vertex 153.124 159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.847 159.364 -3 + vertex 152.002 159.998 -3 + vertex 153.678 159.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 153.847 159.364 -3 + vertex 154.007 159.229 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.678 159.487 -3 + vertex 152.002 159.998 -3 + vertex 153.5 159.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.5 159.598 -3 + vertex 152.002 159.998 -3 + vertex 153.315 159.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 153.315 159.696 -3 + vertex 152.002 159.998 -3 + vertex 153.124 159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 154.649 158.408 -3 + vertex 152.002 159.998 -3 + vertex 154.544 158.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.726 159.911 -3 + vertex 152.002 159.998 -3 + vertex 152.521 159.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.726 159.911 -3 + vertex 152.927 159.853 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 154.819 158.026 -3 + vertex 154.884 157.827 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 152.314 159.984 -3 + vertex 152.521 159.954 -3 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 154.934 157.624 -3 + vertex 154.971 157.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 152.105 159.998 -3 + vertex 152.314 159.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 155 157 -3 + vertex 152.002 159.998 -3 + vertex 154.993 157.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -152 160 -3 + vertex 152 160 -3 + vertex -152.002 159.998 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex 152.002 159.998 -3 + vertex 155 157 -3 + vertex -155 157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 157 -3 + vertex 155 157 -3 + vertex 155 -157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 157 -3 + vertex -154.993 157.209 -3 + vertex -152.002 159.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -152.314 159.984 -3 + vertex -152.105 159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -152.521 159.954 -3 + vertex -152.314 159.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -152.726 159.911 -3 + vertex -152.521 159.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -152.927 159.853 -3 + vertex -152.726 159.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.124 159.782 -3 + vertex -152.927 159.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.315 159.696 -3 + vertex -153.124 159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.5 159.598 -3 + vertex -153.315 159.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.678 159.487 -3 + vertex -153.5 159.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -153.847 159.364 -3 + vertex -153.678 159.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.007 159.229 -3 + vertex -153.847 159.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.158 159.084 -3 + vertex -154.007 159.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.298 158.928 -3 + vertex -154.158 159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.427 158.763 -3 + vertex -154.298 158.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.544 158.59 -3 + vertex -154.427 158.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.649 158.408 -3 + vertex -154.544 158.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.741 158.22 -3 + vertex -154.649 158.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.819 158.026 -3 + vertex -154.741 158.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.884 157.827 -3 + vertex -154.819 158.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.934 157.624 -3 + vertex -154.884 157.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.971 157.418 -3 + vertex -154.934 157.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 159.998 -3 + vertex -154.993 157.209 -3 + vertex -154.971 157.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 -157 -3 + vertex -155 157 -3 + vertex 155 -157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 -159.998 -3 + vertex -155 -157 -3 + vertex 155 -157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 152.002 -159.998 -3 + vertex -152.002 -159.998 -3 + vertex -155 -157 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -154.971 -157.418 -3 + vertex -154.993 -157.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.884 -157.827 -3 + vertex -154.934 -157.624 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.741 -158.22 -3 + vertex -152.002 -159.998 -3 + vertex -154.649 -158.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.741 -158.22 -3 + vertex -154.819 -158.026 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -154.007 -159.229 -3 + vertex -154.158 -159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.427 -158.763 -3 + vertex -152.002 -159.998 -3 + vertex -154.298 -158.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.427 -158.763 -3 + vertex -154.544 -158.59 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.298 -158.928 -3 + vertex -152.002 -159.998 -3 + vertex -154.158 -159.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -152.927 -159.853 -3 + vertex -153.124 -159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.847 -159.364 -3 + vertex -152.002 -159.998 -3 + vertex -153.678 -159.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.847 -159.364 -3 + vertex -154.007 -159.229 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.678 -159.487 -3 + vertex -152.002 -159.998 -3 + vertex -153.5 -159.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.5 -159.598 -3 + vertex -152.002 -159.998 -3 + vertex -153.315 -159.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -153.315 -159.696 -3 + vertex -152.002 -159.998 -3 + vertex -153.124 -159.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.649 -158.408 -3 + vertex -152.002 -159.998 -3 + vertex -154.544 -158.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.726 -159.911 -3 + vertex -152.002 -159.998 -3 + vertex -152.521 -159.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.726 -159.911 -3 + vertex -152.927 -159.853 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -154.819 -158.026 -3 + vertex -154.884 -157.827 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.314 -159.984 -3 + vertex -152.521 -159.954 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -154.934 -157.624 -3 + vertex -154.971 -157.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex -152.105 -159.998 -3 + vertex -152.314 -159.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 152.002 -159.998 -3 + vertex 152 -160 -3 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -152.002 -159.998 -3 + vertex 152 -160 -3 + vertex -152 -160 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -155 -157 -3 + vertex -152.002 -159.998 -3 + vertex -154.993 -157.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.314 -159.984 0 + vertex 152.002 -159.998 0 + vertex 152.105 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.521 -159.954 0 + vertex 152.002 -159.998 0 + vertex 152.314 -159.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -155 157 0 + vertex 152.002 159.998 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.726 -159.911 0 + vertex 152.002 -159.998 0 + vertex 152.521 -159.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.927 -159.853 0 + vertex 152.002 -159.998 0 + vertex 152.726 -159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 -159.782 0 + vertex 152.002 -159.998 0 + vertex 152.927 -159.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.315 -159.696 0 + vertex 152.002 -159.998 0 + vertex 153.124 -159.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.5 -159.598 0 + vertex 152.002 -159.998 0 + vertex 153.315 -159.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.678 -159.487 0 + vertex 152.002 -159.998 0 + vertex 153.5 -159.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.847 -159.364 0 + vertex 152.002 -159.998 0 + vertex 153.678 -159.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.007 -159.229 0 + vertex 152.002 -159.998 0 + vertex 153.847 -159.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 -159.084 0 + vertex 152.002 -159.998 0 + vertex 154.007 -159.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.298 -158.928 0 + vertex 152.002 -159.998 0 + vertex 154.158 -159.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.427 -158.763 0 + vertex 152.002 -159.998 0 + vertex 154.298 -158.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.544 -158.59 0 + vertex 152.002 -159.998 0 + vertex 154.427 -158.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.649 -158.408 0 + vertex 152.002 -159.998 0 + vertex 154.544 -158.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.741 -158.22 0 + vertex 152.002 -159.998 0 + vertex 154.649 -158.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.819 -158.026 0 + vertex 152.002 -159.998 0 + vertex 154.741 -158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.884 -157.827 0 + vertex 152.002 -159.998 0 + vertex 154.819 -158.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.934 -157.624 0 + vertex 152.002 -159.998 0 + vertex 154.884 -157.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.971 -157.418 0 + vertex 152.002 -159.998 0 + vertex 154.934 -157.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 -157.209 0 + vertex 152.002 -159.998 0 + vertex 154.971 -157.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 -157 0 + vertex 152.002 -159.998 0 + vertex 154.993 -157.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 159.998 0 + vertex 152.002 159.998 0 + vertex 152 160 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 157.209 0 + vertex 154.971 157.418 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.934 157.624 0 + vertex 154.884 157.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.649 158.408 0 + vertex 152.002 159.998 0 + vertex 154.741 158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.819 158.026 0 + vertex 154.741 158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 159.084 0 + vertex 154.007 159.229 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.298 158.928 0 + vertex 152.002 159.998 0 + vertex 154.427 158.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.544 158.59 0 + vertex 154.427 158.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.158 159.084 0 + vertex 152.002 159.998 0 + vertex 154.298 158.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 159.782 0 + vertex 152.927 159.853 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.678 159.487 0 + vertex 152.002 159.998 0 + vertex 153.847 159.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.007 159.229 0 + vertex 153.847 159.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.5 159.598 0 + vertex 152.002 159.998 0 + vertex 153.678 159.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.315 159.696 0 + vertex 152.002 159.998 0 + vertex 153.5 159.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 153.124 159.782 0 + vertex 152.002 159.998 0 + vertex 153.315 159.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.544 158.59 0 + vertex 152.002 159.998 0 + vertex 154.649 158.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.521 159.954 0 + vertex 152.002 159.998 0 + vertex 152.726 159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 152.927 159.853 0 + vertex 152.726 159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 154.884 157.827 0 + vertex 154.819 158.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.002 159.998 0 + vertex 152.521 159.954 0 + vertex 152.314 159.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.971 157.418 0 + vertex 154.934 157.624 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 152.314 159.984 0 + vertex 152.105 159.998 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 154.993 157.209 0 + vertex 152.002 159.998 0 + vertex 155 157 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 159.998 0 + vertex 152 160 0 + vertex -152 160 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -155 157 0 + vertex 155 157 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 155 -157 0 + vertex 155 157 0 + vertex -155 157 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 159.998 0 + vertex -154.993 157.209 0 + vertex -155 157 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.105 159.998 0 + vertex -152.314 159.984 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.314 159.984 0 + vertex -152.521 159.954 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.521 159.954 0 + vertex -152.726 159.911 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.726 159.911 0 + vertex -152.927 159.853 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.927 159.853 0 + vertex -153.124 159.782 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.124 159.782 0 + vertex -153.315 159.696 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.315 159.696 0 + vertex -153.5 159.598 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.5 159.598 0 + vertex -153.678 159.487 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.678 159.487 0 + vertex -153.847 159.364 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -153.847 159.364 0 + vertex -154.007 159.229 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.007 159.229 0 + vertex -154.158 159.084 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.158 159.084 0 + vertex -154.298 158.928 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.298 158.928 0 + vertex -154.427 158.763 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.427 158.763 0 + vertex -154.544 158.59 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.544 158.59 0 + vertex -154.649 158.408 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.649 158.408 0 + vertex -154.741 158.22 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.741 158.22 0 + vertex -154.819 158.026 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.819 158.026 0 + vertex -154.884 157.827 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.884 157.827 0 + vertex -154.934 157.624 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.934 157.624 0 + vertex -154.971 157.418 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -154.971 157.418 0 + vertex -154.993 157.209 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 -157 0 + vertex -155 157 0 + vertex -155 -157 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 155 -157 0 + vertex -155 -157 0 + vertex 152.002 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -155 -157 0 + vertex -152.002 -159.998 0 + vertex 152.002 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.993 -157.209 0 + vertex -154.971 -157.418 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.934 -157.624 0 + vertex -154.884 -157.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.649 -158.408 0 + vertex -152.002 -159.998 0 + vertex -154.741 -158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.819 -158.026 0 + vertex -154.741 -158.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.158 -159.084 0 + vertex -154.007 -159.229 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.298 -158.928 0 + vertex -152.002 -159.998 0 + vertex -154.427 -158.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.544 -158.59 0 + vertex -154.427 -158.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.158 -159.084 0 + vertex -152.002 -159.998 0 + vertex -154.298 -158.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -153.124 -159.782 0 + vertex -152.927 -159.853 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.678 -159.487 0 + vertex -152.002 -159.998 0 + vertex -153.847 -159.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.007 -159.229 0 + vertex -153.847 -159.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.5 -159.598 0 + vertex -152.002 -159.998 0 + vertex -153.678 -159.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.315 -159.696 0 + vertex -152.002 -159.998 0 + vertex -153.5 -159.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -153.124 -159.782 0 + vertex -152.002 -159.998 0 + vertex -153.315 -159.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.544 -158.59 0 + vertex -152.002 -159.998 0 + vertex -154.649 -158.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -152.521 -159.954 0 + vertex -152.002 -159.998 0 + vertex -152.726 -159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -152.927 -159.853 0 + vertex -152.726 -159.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -154.884 -157.827 0 + vertex -154.819 -158.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex -152.521 -159.954 0 + vertex -152.314 -159.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -154.971 -157.418 0 + vertex -154.934 -157.624 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -152.314 -159.984 0 + vertex -152.105 -159.998 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -152.002 -159.998 0 + vertex 152 -160 0 + vertex 152.002 -159.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -152 -160 0 + vertex 152 -160 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -154.993 -157.209 0 + vertex -152.002 -159.998 0 + vertex -155 -157 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152.105 -159.998 -3 + vertex 152.002 -159.998 0 + vertex 152.002 -159.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152.105 -159.998 -3 + vertex 152.105 -159.998 0 + vertex 152.002 -159.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 152.314 -159.984 -3 + vertex 152.105 -159.998 0 + vertex 152.105 -159.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 152.314 -159.984 -3 + vertex 152.314 -159.984 0 + vertex 152.105 -159.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 152.521 -159.954 -3 + vertex 152.314 -159.984 0 + vertex 152.314 -159.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 152.521 -159.954 -3 + vertex 152.521 -159.954 0 + vertex 152.314 -159.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 152.726 -159.911 -3 + vertex 152.521 -159.954 0 + vertex 152.521 -159.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 152.726 -159.911 -3 + vertex 152.726 -159.911 0 + vertex 152.521 -159.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 152.927 -159.853 -3 + vertex 152.726 -159.911 0 + vertex 152.726 -159.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 152.927 -159.853 -3 + vertex 152.927 -159.853 0 + vertex 152.726 -159.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 153.124 -159.782 -3 + vertex 152.927 -159.853 0 + vertex 152.927 -159.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 153.124 -159.782 -3 + vertex 153.124 -159.782 0 + vertex 152.927 -159.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 153.315 -159.696 -3 + vertex 153.124 -159.782 0 + vertex 153.124 -159.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 153.315 -159.696 -3 + vertex 153.315 -159.696 0 + vertex 153.124 -159.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 153.5 -159.598 -3 + vertex 153.315 -159.696 0 + vertex 153.315 -159.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 153.5 -159.598 -3 + vertex 153.5 -159.598 0 + vertex 153.315 -159.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 153.678 -159.487 -3 + vertex 153.5 -159.598 0 + vertex 153.5 -159.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 153.678 -159.487 -3 + vertex 153.678 -159.487 0 + vertex 153.5 -159.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 153.847 -159.364 -3 + vertex 153.678 -159.487 0 + vertex 153.678 -159.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 153.847 -159.364 -3 + vertex 153.847 -159.364 0 + vertex 153.678 -159.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 154.007 -159.229 -3 + vertex 153.847 -159.364 0 + vertex 153.847 -159.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 154.007 -159.229 -3 + vertex 154.007 -159.229 0 + vertex 153.847 -159.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 154.158 -159.084 -3 + vertex 154.007 -159.229 0 + vertex 154.007 -159.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 154.158 -159.084 -3 + vertex 154.158 -159.084 0 + vertex 154.007 -159.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 154.298 -158.928 -3 + vertex 154.158 -159.084 0 + vertex 154.158 -159.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 154.298 -158.928 -3 + vertex 154.298 -158.928 0 + vertex 154.158 -159.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 154.427 -158.763 -3 + vertex 154.298 -158.928 0 + vertex 154.298 -158.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 154.427 -158.763 -3 + vertex 154.427 -158.763 0 + vertex 154.298 -158.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 154.544 -158.59 -3 + vertex 154.427 -158.763 0 + vertex 154.427 -158.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 154.544 -158.59 -3 + vertex 154.544 -158.59 0 + vertex 154.427 -158.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 154.649 -158.408 -3 + vertex 154.544 -158.59 0 + vertex 154.544 -158.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 154.649 -158.408 -3 + vertex 154.649 -158.408 0 + vertex 154.544 -158.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 154.741 -158.22 -3 + vertex 154.649 -158.408 0 + vertex 154.649 -158.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 154.741 -158.22 -3 + vertex 154.741 -158.22 0 + vertex 154.649 -158.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 154.819 -158.026 -3 + vertex 154.741 -158.22 0 + vertex 154.741 -158.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 154.819 -158.026 -3 + vertex 154.819 -158.026 0 + vertex 154.741 -158.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 154.884 -157.827 -3 + vertex 154.819 -158.026 0 + vertex 154.819 -158.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 154.884 -157.827 -3 + vertex 154.884 -157.827 0 + vertex 154.819 -158.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 154.934 -157.624 -3 + vertex 154.884 -157.827 0 + vertex 154.884 -157.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 154.934 -157.624 -3 + vertex 154.934 -157.624 0 + vertex 154.884 -157.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 154.971 -157.418 -3 + vertex 154.934 -157.624 0 + vertex 154.934 -157.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 154.971 -157.418 -3 + vertex 154.971 -157.418 0 + vertex 154.934 -157.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 154.993 -157.209 -3 + vertex 154.971 -157.418 0 + vertex 154.971 -157.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 154.993 -157.209 -3 + vertex 154.993 -157.209 0 + vertex 154.971 -157.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 155 -157 -3 + vertex 154.993 -157.209 0 + vertex 154.993 -157.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 155 -157 -3 + vertex 155 -157 0 + vertex 154.993 -157.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 155 157 -3 + vertex 155 -157 0 + vertex 155 -157 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 155 157 -3 + vertex 155 157 0 + vertex 155 -157 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 154.993 157.209 -3 + vertex 155 157 0 + vertex 155 157 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 154.993 157.209 -3 + vertex 154.993 157.209 0 + vertex 155 157 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 154.971 157.418 -3 + vertex 154.993 157.209 0 + vertex 154.993 157.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 154.971 157.418 -3 + vertex 154.971 157.418 0 + vertex 154.993 157.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 154.934 157.624 -3 + vertex 154.971 157.418 0 + vertex 154.971 157.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 154.934 157.624 -3 + vertex 154.934 157.624 0 + vertex 154.971 157.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 154.884 157.827 -3 + vertex 154.934 157.624 0 + vertex 154.934 157.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 154.884 157.827 -3 + vertex 154.884 157.827 0 + vertex 154.934 157.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 154.819 158.026 -3 + vertex 154.884 157.827 0 + vertex 154.884 157.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 154.819 158.026 -3 + vertex 154.819 158.026 0 + vertex 154.884 157.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 154.741 158.22 -3 + vertex 154.819 158.026 0 + vertex 154.819 158.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 154.741 158.22 -3 + vertex 154.741 158.22 0 + vertex 154.819 158.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 154.649 158.408 -3 + vertex 154.741 158.22 0 + vertex 154.741 158.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 154.649 158.408 -3 + vertex 154.649 158.408 0 + vertex 154.741 158.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 154.544 158.59 -3 + vertex 154.649 158.408 0 + vertex 154.649 158.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 154.544 158.59 -3 + vertex 154.544 158.59 0 + vertex 154.649 158.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 154.427 158.763 -3 + vertex 154.544 158.59 0 + vertex 154.544 158.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 154.427 158.763 -3 + vertex 154.427 158.763 0 + vertex 154.544 158.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 154.298 158.928 -3 + vertex 154.427 158.763 0 + vertex 154.427 158.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 154.298 158.928 -3 + vertex 154.298 158.928 0 + vertex 154.427 158.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 154.158 159.084 -3 + vertex 154.298 158.928 0 + vertex 154.298 158.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 154.158 159.084 -3 + vertex 154.158 159.084 0 + vertex 154.298 158.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 154.007 159.229 -3 + vertex 154.158 159.084 0 + vertex 154.158 159.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 154.007 159.229 -3 + vertex 154.007 159.229 0 + vertex 154.158 159.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 153.847 159.364 -3 + vertex 154.007 159.229 0 + vertex 154.007 159.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 153.847 159.364 -3 + vertex 153.847 159.364 0 + vertex 154.007 159.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 153.678 159.487 -3 + vertex 153.847 159.364 0 + vertex 153.847 159.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 153.678 159.487 -3 + vertex 153.678 159.487 0 + vertex 153.847 159.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 153.5 159.598 -3 + vertex 153.678 159.487 0 + vertex 153.678 159.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 153.5 159.598 -3 + vertex 153.5 159.598 0 + vertex 153.678 159.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 153.315 159.696 -3 + vertex 153.5 159.598 0 + vertex 153.5 159.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 153.315 159.696 -3 + vertex 153.315 159.696 0 + vertex 153.5 159.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 153.124 159.782 -3 + vertex 153.315 159.696 0 + vertex 153.315 159.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 153.124 159.782 -3 + vertex 153.124 159.782 0 + vertex 153.315 159.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 152.927 159.853 -3 + vertex 153.124 159.782 0 + vertex 153.124 159.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 152.927 159.853 -3 + vertex 152.927 159.853 0 + vertex 153.124 159.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 152.726 159.911 -3 + vertex 152.927 159.853 0 + vertex 152.927 159.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 152.726 159.911 -3 + vertex 152.726 159.911 0 + vertex 152.927 159.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 152.521 159.954 -3 + vertex 152.726 159.911 0 + vertex 152.726 159.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 152.521 159.954 -3 + vertex 152.521 159.954 0 + vertex 152.726 159.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 152.314 159.984 -3 + vertex 152.521 159.954 0 + vertex 152.521 159.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 152.314 159.984 -3 + vertex 152.314 159.984 0 + vertex 152.521 159.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 152.105 159.998 -3 + vertex 152.314 159.984 0 + vertex 152.314 159.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 152.105 159.998 -3 + vertex 152.105 159.998 0 + vertex 152.314 159.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 152.002 159.998 -3 + vertex 152.105 159.998 0 + vertex 152.105 159.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 152.002 159.998 -3 + vertex 152.002 159.998 0 + vertex 152.105 159.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 152 160 -3 + vertex 152.002 159.998 0 + vertex 152.002 159.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 152 160 -3 + vertex 152 160 0 + vertex 152.002 159.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152 160 -3 + vertex 152 160 0 + vertex 152 160 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152 160 -3 + vertex -152 160 0 + vertex 152 160 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -152.002 159.998 -3 + vertex -152 160 0 + vertex -152 160 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -152.002 159.998 -3 + vertex -152.002 159.998 0 + vertex -152 160 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152.105 159.998 -3 + vertex -152.002 159.998 0 + vertex -152.002 159.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -152.105 159.998 -3 + vertex -152.105 159.998 0 + vertex -152.002 159.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -152.314 159.984 -3 + vertex -152.105 159.998 0 + vertex -152.105 159.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -152.314 159.984 -3 + vertex -152.314 159.984 0 + vertex -152.105 159.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -152.521 159.954 -3 + vertex -152.314 159.984 0 + vertex -152.314 159.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -152.521 159.954 -3 + vertex -152.521 159.954 0 + vertex -152.314 159.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -152.726 159.911 -3 + vertex -152.521 159.954 0 + vertex -152.521 159.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -152.726 159.911 -3 + vertex -152.726 159.911 0 + vertex -152.521 159.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -152.927 159.853 -3 + vertex -152.726 159.911 0 + vertex -152.726 159.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -152.927 159.853 -3 + vertex -152.927 159.853 0 + vertex -152.726 159.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -153.124 159.782 -3 + vertex -152.927 159.853 0 + vertex -152.927 159.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -153.124 159.782 -3 + vertex -153.124 159.782 0 + vertex -152.927 159.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -153.315 159.696 -3 + vertex -153.124 159.782 0 + vertex -153.124 159.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -153.315 159.696 -3 + vertex -153.315 159.696 0 + vertex -153.124 159.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -153.5 159.598 -3 + vertex -153.315 159.696 0 + vertex -153.315 159.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -153.5 159.598 -3 + vertex -153.5 159.598 0 + vertex -153.315 159.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -153.678 159.487 -3 + vertex -153.5 159.598 0 + vertex -153.5 159.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -153.678 159.487 -3 + vertex -153.678 159.487 0 + vertex -153.5 159.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -153.847 159.364 -3 + vertex -153.678 159.487 0 + vertex -153.678 159.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -153.847 159.364 -3 + vertex -153.847 159.364 0 + vertex -153.678 159.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -154.007 159.229 -3 + vertex -153.847 159.364 0 + vertex -153.847 159.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -154.007 159.229 -3 + vertex -154.007 159.229 0 + vertex -153.847 159.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -154.158 159.084 -3 + vertex -154.007 159.229 0 + vertex -154.007 159.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -154.158 159.084 -3 + vertex -154.158 159.084 0 + vertex -154.007 159.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -154.298 158.928 -3 + vertex -154.158 159.084 0 + vertex -154.158 159.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -154.298 158.928 -3 + vertex -154.298 158.928 0 + vertex -154.158 159.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -154.427 158.763 -3 + vertex -154.298 158.928 0 + vertex -154.298 158.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -154.427 158.763 -3 + vertex -154.427 158.763 0 + vertex -154.298 158.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -154.544 158.59 -3 + vertex -154.427 158.763 0 + vertex -154.427 158.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -154.544 158.59 -3 + vertex -154.544 158.59 0 + vertex -154.427 158.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -154.649 158.408 -3 + vertex -154.544 158.59 0 + vertex -154.544 158.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -154.649 158.408 -3 + vertex -154.649 158.408 0 + vertex -154.544 158.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -154.741 158.22 -3 + vertex -154.649 158.408 0 + vertex -154.649 158.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -154.741 158.22 -3 + vertex -154.741 158.22 0 + vertex -154.649 158.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -154.819 158.026 -3 + vertex -154.741 158.22 0 + vertex -154.741 158.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -154.819 158.026 -3 + vertex -154.819 158.026 0 + vertex -154.741 158.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -154.884 157.827 -3 + vertex -154.819 158.026 0 + vertex -154.819 158.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -154.884 157.827 -3 + vertex -154.884 157.827 0 + vertex -154.819 158.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -154.934 157.624 -3 + vertex -154.884 157.827 0 + vertex -154.884 157.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -154.934 157.624 -3 + vertex -154.934 157.624 0 + vertex -154.884 157.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -154.971 157.418 -3 + vertex -154.934 157.624 0 + vertex -154.934 157.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -154.971 157.418 -3 + vertex -154.971 157.418 0 + vertex -154.934 157.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -154.993 157.209 -3 + vertex -154.971 157.418 0 + vertex -154.971 157.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -154.993 157.209 -3 + vertex -154.993 157.209 0 + vertex -154.971 157.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -155 157 -3 + vertex -154.993 157.209 0 + vertex -154.993 157.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -155 157 -3 + vertex -155 157 0 + vertex -154.993 157.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -155 -157 -3 + vertex -155 157 0 + vertex -155 157 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -155 -157 -3 + vertex -155 -157 0 + vertex -155 157 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -154.993 -157.209 -3 + vertex -155 -157 0 + vertex -155 -157 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -154.993 -157.209 -3 + vertex -154.993 -157.209 0 + vertex -155 -157 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -154.971 -157.418 -3 + vertex -154.993 -157.209 0 + vertex -154.993 -157.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -154.971 -157.418 -3 + vertex -154.971 -157.418 0 + vertex -154.993 -157.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -154.934 -157.624 -3 + vertex -154.971 -157.418 0 + vertex -154.971 -157.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -154.934 -157.624 -3 + vertex -154.934 -157.624 0 + vertex -154.971 -157.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -154.884 -157.827 -3 + vertex -154.934 -157.624 0 + vertex -154.934 -157.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -154.884 -157.827 -3 + vertex -154.884 -157.827 0 + vertex -154.934 -157.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -154.819 -158.026 -3 + vertex -154.884 -157.827 0 + vertex -154.884 -157.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -154.819 -158.026 -3 + vertex -154.819 -158.026 0 + vertex -154.884 -157.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -154.741 -158.22 -3 + vertex -154.819 -158.026 0 + vertex -154.819 -158.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -154.741 -158.22 -3 + vertex -154.741 -158.22 0 + vertex -154.819 -158.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -154.649 -158.408 -3 + vertex -154.741 -158.22 0 + vertex -154.741 -158.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -154.649 -158.408 -3 + vertex -154.649 -158.408 0 + vertex -154.741 -158.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -154.544 -158.59 -3 + vertex -154.649 -158.408 0 + vertex -154.649 -158.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -154.544 -158.59 -3 + vertex -154.544 -158.59 0 + vertex -154.649 -158.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -154.427 -158.763 -3 + vertex -154.544 -158.59 0 + vertex -154.544 -158.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -154.427 -158.763 -3 + vertex -154.427 -158.763 0 + vertex -154.544 -158.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -154.298 -158.928 -3 + vertex -154.427 -158.763 0 + vertex -154.427 -158.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -154.298 -158.928 -3 + vertex -154.298 -158.928 0 + vertex -154.427 -158.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -154.158 -159.084 -3 + vertex -154.298 -158.928 0 + vertex -154.298 -158.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -154.158 -159.084 -3 + vertex -154.158 -159.084 0 + vertex -154.298 -158.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -154.007 -159.229 -3 + vertex -154.158 -159.084 0 + vertex -154.158 -159.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -154.007 -159.229 -3 + vertex -154.007 -159.229 0 + vertex -154.158 -159.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -153.847 -159.364 -3 + vertex -154.007 -159.229 0 + vertex -154.007 -159.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -153.847 -159.364 -3 + vertex -153.847 -159.364 0 + vertex -154.007 -159.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -153.678 -159.487 -3 + vertex -153.847 -159.364 0 + vertex -153.847 -159.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -153.678 -159.487 -3 + vertex -153.678 -159.487 0 + vertex -153.847 -159.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -153.5 -159.598 -3 + vertex -153.678 -159.487 0 + vertex -153.678 -159.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -153.5 -159.598 -3 + vertex -153.5 -159.598 0 + vertex -153.678 -159.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -153.315 -159.696 -3 + vertex -153.5 -159.598 0 + vertex -153.5 -159.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -153.315 -159.696 -3 + vertex -153.315 -159.696 0 + vertex -153.5 -159.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -153.124 -159.782 -3 + vertex -153.315 -159.696 0 + vertex -153.315 -159.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -153.124 -159.782 -3 + vertex -153.124 -159.782 0 + vertex -153.315 -159.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -152.927 -159.853 -3 + vertex -153.124 -159.782 0 + vertex -153.124 -159.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -152.927 -159.853 -3 + vertex -152.927 -159.853 0 + vertex -153.124 -159.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -152.726 -159.911 -3 + vertex -152.927 -159.853 0 + vertex -152.927 -159.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -152.726 -159.911 -3 + vertex -152.726 -159.911 0 + vertex -152.927 -159.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -152.521 -159.954 -3 + vertex -152.726 -159.911 0 + vertex -152.726 -159.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -152.521 -159.954 -3 + vertex -152.521 -159.954 0 + vertex -152.726 -159.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -152.314 -159.984 -3 + vertex -152.521 -159.954 0 + vertex -152.521 -159.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -152.314 -159.984 -3 + vertex -152.314 -159.984 0 + vertex -152.521 -159.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -152.105 -159.998 -3 + vertex -152.314 -159.984 0 + vertex -152.314 -159.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -152.105 -159.998 -3 + vertex -152.105 -159.998 0 + vertex -152.314 -159.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -152.002 -159.998 -3 + vertex -152.105 -159.998 0 + vertex -152.105 -159.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -152.002 -159.998 -3 + vertex -152.002 -159.998 0 + vertex -152.105 -159.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -152 -160 -3 + vertex -152.002 -159.998 0 + vertex -152.002 -159.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -152 -160 -3 + vertex -152 -160 0 + vertex -152.002 -159.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152 -160 -3 + vertex -152 -160 0 + vertex -152 -160 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 152 -160 -3 + vertex 152 -160 0 + vertex -152 -160 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 152.002 -159.998 -3 + vertex 152 -160 0 + vertex 152 -160 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 152.002 -159.998 -3 + vertex 152.002 -159.998 0 + vertex 152 -160 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/cr20.svg b/resources/profiles/Creality/cr20.svg new file mode 100644 index 0000000000..338a59975d --- /dev/null +++ b/resources/profiles/Creality/cr20.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/ender2.svg b/resources/profiles/Creality/ender2.svg new file mode 100644 index 0000000000..7a5e63cb26 --- /dev/null +++ b/resources/profiles/Creality/ender2.svg @@ -0,0 +1,560 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/profiles/Creality/ender2_bed.stl b/resources/profiles/Creality/ender2_bed.stl new file mode 100644 index 0000000000..b2a419fabb --- /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/icons/bed/ender3.svg b/resources/profiles/Creality/ender3.svg similarity index 90% rename from resources/icons/bed/ender3.svg rename to resources/profiles/Creality/ender3.svg index 06910afdf8..9dac7a62e6 100644 --- a/resources/icons/bed/ender3.svg +++ b/resources/profiles/Creality/ender3.svg @@ -1,13 +1,5 @@ ender3_bed_texture - - - - - - - - diff --git a/resources/profiles/Creality/ender3_bed.stl b/resources/profiles/Creality/ender3_bed.stl new file mode 100644 index 0000000000..724d8905e0 --- /dev/null +++ b/resources/profiles/Creality/ender3_bed.stl @@ -0,0 +1,5014 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 50.0698 -134.999 -3 + vertex 50.002 -134.999 -3 + vertex 50.209 -134.989 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 50.209 -134.989 -3 + vertex 50.002 -134.999 -3 + vertex 50.3473 -134.97 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 51.7856 -133.899 -3 + vertex 50.002 -134.999 -3 + vertex 58.2127 -121.102 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 50.3473 -134.97 -3 + vertex 50.002 -134.999 -3 + vertex 50.4838 -134.941 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 50.4838 -134.941 -3 + vertex 50.002 -134.999 -3 + vertex 50.618 -134.902 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 50.618 -134.902 -3 + vertex 50.002 -134.999 -3 + vertex 50.7492 -134.854 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 50.7492 -134.854 -3 + vertex 50.002 -134.999 -3 + vertex 50.8767 -134.798 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 50.8767 -134.798 -3 + vertex 50.002 -134.999 -3 + vertex 51 -134.732 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 51 -134.732 -3 + vertex 50.002 -134.999 -3 + vertex 51.1184 -134.658 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 51.1184 -134.658 -3 + vertex 51.7856 -133.899 -3 + vertex 51.2313 -134.576 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 51.2313 -134.576 -3 + vertex 51.7856 -133.899 -3 + vertex 51.3383 -134.486 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 51.3383 -134.486 -3 + vertex 51.7856 -133.899 -3 + vertex 51.4387 -134.389 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 51.4387 -134.389 -3 + vertex 51.7856 -133.899 -3 + vertex 51.5321 -134.286 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 51.5321 -134.286 -3 + vertex 51.7856 -133.899 -3 + vertex 51.618 -134.176 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 51.618 -134.176 -3 + vertex 51.7856 -133.899 -3 + vertex 51.6961 -134.06 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 51.6961 -134.06 -3 + vertex 51.7856 -133.899 -3 + vertex 51.7659 -133.939 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 51.1184 -134.658 -3 + vertex 50.002 -134.999 -3 + vertex 51.7856 -133.899 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 50.002 -134.999 -3 + vertex 50 -135 -3 + vertex 58.2127 -121.102 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 51.7873 -133.898 -3 + vertex 51.7856 -133.899 -3 + vertex 58.2127 -121.102 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -118.315 -119.696 -3 + vertex -118.5 -119.598 -3 + vertex -117.002 -119.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 58.2144 -121.101 -3 + vertex 58.2127 -121.102 -3 + vertex 58.2341 -121.061 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.993 117.209 -3 + vertex 117.002 119.998 -3 + vertex 119.971 117.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 119.998 -3 + vertex 119.884 117.827 -3 + vertex 119.934 117.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 119.998 -3 + vertex 119.649 118.408 -3 + vertex 119.741 118.22 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 119.007 119.229 -3 + vertex 119.158 119.084 -3 + vertex 117.002 119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.544 118.59 -3 + vertex 117.002 119.998 -3 + vertex 119.427 118.763 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 117.927 119.853 -3 + vertex 118.124 119.782 -3 + vertex 117.002 119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.007 119.229 -3 + vertex 117.002 119.998 -3 + vertex 118.847 119.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 119.998 -3 + vertex 118.315 119.696 -3 + vertex 118.5 119.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 119.998 -3 + vertex 119.544 118.59 -3 + vertex 119.649 118.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.927 119.853 -3 + vertex 117.002 119.998 -3 + vertex 117.726 119.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.521 119.954 -3 + vertex 117.002 119.998 -3 + vertex 117.314 119.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 119.998 -3 + vertex 119.993 117.209 -3 + vertex 120 117 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 59.5161 -120.059 -3 + vertex 59.382 -120.098 -3 + vertex 120 117 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 59.6527 -120.03 -3 + vertex 59.5161 -120.059 -3 + vertex 120 117 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 59.7909 -120.011 -3 + vertex 59.6527 -120.03 -3 + vertex 120 117 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 59.9302 -120.001 -3 + vertex 59.7909 -120.011 -3 + vertex 120 117 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 59.998 -120.001 -3 + vertex 59.9302 -120.001 -3 + vertex 60 -120 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.544 -118.59 -3 + vertex 119.427 -118.763 -3 + vertex 117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117 -120 -3 + vertex 60 -120 -3 + vertex 117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 -119.998 -3 + vertex 117.521 -119.954 -3 + vertex 117.314 -119.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.105 -119.998 -3 + vertex 117.002 -119.998 -3 + vertex 117.314 -119.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 -119.998 -3 + vertex 117.726 -119.911 -3 + vertex 117.521 -119.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 -119.998 -3 + vertex 117.927 -119.853 -3 + vertex 117.726 -119.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 -119.998 -3 + vertex 118.124 -119.782 -3 + vertex 117.927 -119.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 -119.998 -3 + vertex 118.315 -119.696 -3 + vertex 118.124 -119.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 -119.998 -3 + vertex 118.5 -119.598 -3 + vertex 118.315 -119.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 -119.998 -3 + vertex 118.678 -119.487 -3 + vertex 118.5 -119.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 -119.998 -3 + vertex 118.847 -119.364 -3 + vertex 118.678 -119.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 -119.998 -3 + vertex 119.007 -119.229 -3 + vertex 118.847 -119.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 -119.998 -3 + vertex 119.158 -119.084 -3 + vertex 119.007 -119.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 -119.998 -3 + vertex 119.298 -118.928 -3 + vertex 119.158 -119.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 -119.998 -3 + vertex 119.427 -118.763 -3 + vertex 119.298 -118.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.649 -118.408 -3 + vertex 119.544 -118.59 -3 + vertex 117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.741 -118.22 -3 + vertex 119.649 -118.408 -3 + vertex 117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.819 -118.026 -3 + vertex 119.741 -118.22 -3 + vertex 117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.884 -117.827 -3 + vertex 119.819 -118.026 -3 + vertex 117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.934 -117.624 -3 + vertex 119.884 -117.827 -3 + vertex 117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.971 -117.418 -3 + vertex 119.934 -117.624 -3 + vertex 117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.993 -117.209 -3 + vertex 119.971 -117.418 -3 + vertex 117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 120 -117 -3 + vertex 119.993 -117.209 -3 + vertex 117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 60 -120 -3 + vertex 120 -117 -3 + vertex 117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 60 -120 -3 + vertex 120 117 -3 + vertex 120 -117 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 60 -120 -3 + vertex 59.9302 -120.001 -3 + vertex 120 117 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 119.741 118.22 -3 + vertex 119.819 118.026 -3 + vertex 117.002 119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 119.998 -3 + vertex 119.298 118.928 -3 + vertex 119.427 118.763 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 119.158 119.084 -3 + vertex 119.298 118.928 -3 + vertex 117.002 119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 118.847 119.364 -3 + vertex 117.002 119.998 -3 + vertex 118.678 119.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.002 119.998 -3 + vertex 118.5 119.598 -3 + vertex 118.678 119.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 118.124 119.782 -3 + vertex 118.315 119.696 -3 + vertex 117.002 119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.726 119.911 -3 + vertex 117.002 119.998 -3 + vertex 117.521 119.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.884 117.827 -3 + vertex 117.002 119.998 -3 + vertex 119.819 118.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 119.971 117.418 -3 + vertex 117.002 119.998 -3 + vertex 119.934 117.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117.314 119.984 -3 + vertex 117.002 119.998 -3 + vertex 117.105 119.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 120 117 -3 + vertex 59.382 -120.098 -3 + vertex 117.002 119.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 117.002 119.998 -3 + vertex 59.382 -120.098 -3 + vertex 117 120 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 117 120 -3 + vertex 59.382 -120.098 -3 + vertex 59.2508 -120.146 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117 120 -3 + vertex 117 120 -3 + vertex 59.2508 -120.146 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -59.6527 -120.03 -3 + vertex -59.7909 -120.011 -3 + vertex -120 117 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -120 117 -3 + vertex -59.7909 -120.011 -3 + vertex -59.9302 -120.001 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -59.5161 -120.059 -3 + vertex -59.6527 -120.03 -3 + vertex -120 117 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 119.998 -3 + vertex -120 117 -3 + vertex -119.993 117.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -119.934 117.624 -3 + vertex -117.002 119.998 -3 + vertex -119.971 117.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.819 118.026 -3 + vertex -119.741 118.22 -3 + vertex -117.002 119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 119.998 -3 + vertex -119.649 118.408 -3 + vertex -119.544 118.59 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -119.298 118.928 -3 + vertex -117.002 119.998 -3 + vertex -119.427 118.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.158 119.084 -3 + vertex -119.007 119.229 -3 + vertex -117.002 119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 119.998 -3 + vertex -118.847 119.364 -3 + vertex -118.678 119.487 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -118.315 119.696 -3 + vertex -117.002 119.998 -3 + vertex -118.5 119.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -118.315 119.696 -3 + vertex -118.124 119.782 -3 + vertex -117.002 119.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -117.002 119.998 -3 + vertex -117.314 119.984 -3 + vertex -117.105 119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 119.998 -3 + vertex -117.521 119.954 -3 + vertex -117.314 119.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 119.998 -3 + vertex -117.726 119.911 -3 + vertex -117.521 119.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 119.998 -3 + vertex -117.927 119.853 -3 + vertex -117.726 119.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 119.998 -3 + vertex -118.124 119.782 -3 + vertex -117.927 119.853 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -118.5 119.598 -3 + vertex -117.002 119.998 -3 + vertex -118.678 119.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 119.998 -3 + vertex -119.007 119.229 -3 + vertex -118.847 119.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.298 118.928 -3 + vertex -119.158 119.084 -3 + vertex -117.002 119.998 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -119.427 118.763 -3 + vertex -117.002 119.998 -3 + vertex -119.544 118.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 119.998 -3 + vertex -119.741 118.22 -3 + vertex -119.649 118.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.884 117.827 -3 + vertex -119.819 118.026 -3 + vertex -117.002 119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.934 117.624 -3 + vertex -119.884 117.827 -3 + vertex -117.002 119.998 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -119.971 117.418 -3 + vertex -117.002 119.998 -3 + vertex -119.993 117.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -59.9302 -120.001 -3 + vertex -60 -120 -3 + vertex -120 117 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -59.382 -120.098 -3 + vertex -59.5161 -120.059 -3 + vertex -120 117 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -120 -117 -3 + vertex -120 117 -3 + vertex -60 -120 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -117.002 119.998 -3 + vertex -59.382 -120.098 -3 + vertex -120 117 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 119.998 -3 + vertex -117 120 -3 + vertex -59.382 -120.098 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -59.382 -120.098 -3 + vertex -117 120 -3 + vertex -59.2508 -120.146 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.314 -119.984 -3 + vertex -117.002 -119.998 -3 + vertex -117.105 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.521 -119.954 -3 + vertex -117.002 -119.998 -3 + vertex -117.314 -119.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.726 -119.911 -3 + vertex -117.927 -119.853 -3 + vertex -117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.544 -118.59 -3 + vertex -119.649 -118.408 -3 + vertex -117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 -119.998 -3 + vertex -118.5 -119.598 -3 + vertex -118.678 -119.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 -119.998 -3 + vertex -119.971 -117.418 -3 + vertex -119.993 -117.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.884 -117.827 -3 + vertex -119.934 -117.624 -3 + vertex -117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.741 -118.22 -3 + vertex -117.002 -119.998 -3 + vertex -119.649 -118.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.741 -118.22 -3 + vertex -119.819 -118.026 -3 + vertex -117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 -119.998 -3 + vertex -119.007 -119.229 -3 + vertex -119.158 -119.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.427 -118.763 -3 + vertex -117.002 -119.998 -3 + vertex -119.298 -118.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.427 -118.763 -3 + vertex -119.544 -118.59 -3 + vertex -117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.298 -118.928 -3 + vertex -117.002 -119.998 -3 + vertex -119.158 -119.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.002 -119.998 -3 + vertex -117.927 -119.853 -3 + vertex -118.124 -119.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -118.847 -119.364 -3 + vertex -117.002 -119.998 -3 + vertex -118.678 -119.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -118.847 -119.364 -3 + vertex -119.007 -119.229 -3 + vertex -117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -118.124 -119.782 -3 + vertex -118.315 -119.696 -3 + vertex -117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117.726 -119.911 -3 + vertex -117.002 -119.998 -3 + vertex -117.521 -119.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.884 -117.827 -3 + vertex -117.002 -119.998 -3 + vertex -119.819 -118.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -119.971 -117.418 -3 + vertex -117.002 -119.998 -3 + vertex -119.934 -117.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -117 120 -3 + vertex 59.2508 -120.146 -3 + vertex -59.2508 -120.146 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -58.7687 -120.424 -3 + vertex -58.8816 -120.342 -3 + vertex 58.7687 -120.424 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -59.2508 -120.146 -3 + vertex 59.2508 -120.146 -3 + vertex 59.1232 -120.202 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -59.1232 -120.202 -3 + vertex -59.2508 -120.146 -3 + vertex 59.1232 -120.202 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 59 -120.268 -3 + vertex -59.1232 -120.202 -3 + vertex 59.1232 -120.202 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 59 -120.268 -3 + vertex 58.8816 -120.342 -3 + vertex -59 -120.268 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -58.2127 -121.102 -3 + vertex -51.7856 -133.899 -3 + vertex -51.7873 -133.898 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 59 -120.268 -3 + vertex -59 -120.268 -3 + vertex -59.1232 -120.202 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -120 -117 -3 + vertex -117.002 -119.998 -3 + vertex -119.993 -117.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -59 -120.268 -3 + vertex 58.8816 -120.342 -3 + vertex -58.8816 -120.342 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -120 -117 -3 + vertex -60 -120 -3 + vertex -117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -60 -120 -3 + vertex -117 -120 -3 + vertex -117.002 -119.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 58.6617 -120.514 -3 + vertex -58.7687 -120.424 -3 + vertex 58.7687 -120.424 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -60 -120 -3 + vertex -59.9302 -120.001 -3 + vertex -59.998 -120.001 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -58.8816 -120.342 -3 + vertex 58.8816 -120.342 -3 + vertex 58.7687 -120.424 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 58.6617 -120.514 -3 + vertex -58.6617 -120.514 -3 + vertex -58.7687 -120.424 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 58.6617 -120.514 -3 + vertex 58.5613 -120.611 -3 + vertex -58.6617 -120.514 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -58.6617 -120.514 -3 + vertex 58.5613 -120.611 -3 + vertex -58.5613 -120.611 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -58.5613 -120.611 -3 + vertex 58.5613 -120.611 -3 + vertex 58.4679 -120.714 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -58.4679 -120.714 -3 + vertex -58.5613 -120.611 -3 + vertex 58.4679 -120.714 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 58.382 -120.824 -3 + vertex -58.4679 -120.714 -3 + vertex 58.4679 -120.714 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 58.382 -120.824 -3 + vertex -58.382 -120.824 -3 + vertex -58.4679 -120.714 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 58.382 -120.824 -3 + vertex 58.3039 -120.94 -3 + vertex -58.382 -120.824 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -58.382 -120.824 -3 + vertex 58.3039 -120.94 -3 + vertex -58.3039 -120.94 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -58.3039 -120.94 -3 + vertex 58.3039 -120.94 -3 + vertex 58.2341 -121.061 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -58.2341 -121.061 -3 + vertex -58.3039 -120.94 -3 + vertex 58.2341 -121.061 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 58.2127 -121.102 -3 + vertex -58.2341 -121.061 -3 + vertex 58.2341 -121.061 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -58.2127 -121.102 -3 + vertex -58.2144 -121.101 -3 + vertex -58.2341 -121.061 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 58.2127 -121.102 -3 + vertex -58.2127 -121.102 -3 + vertex -58.2341 -121.061 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 58.2127 -121.102 -3 + vertex 50 -135 -3 + vertex -58.2127 -121.102 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -51.3383 -134.486 -3 + vertex -51.4387 -134.389 -3 + vertex -51.7856 -133.899 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -51.7856 -133.899 -3 + vertex -51.6961 -134.06 -3 + vertex -51.7659 -133.939 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -51.7856 -133.899 -3 + vertex -51.618 -134.176 -3 + vertex -51.6961 -134.06 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -51.7856 -133.899 -3 + vertex -51.5321 -134.286 -3 + vertex -51.618 -134.176 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -51.7856 -133.899 -3 + vertex -51.4387 -134.389 -3 + vertex -51.5321 -134.286 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -51.2313 -134.576 -3 + vertex -51.3383 -134.486 -3 + vertex -51.7856 -133.899 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -51.1184 -134.658 -3 + vertex -51.2313 -134.576 -3 + vertex -51.7856 -133.899 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -51 -134.732 -3 + vertex -51.1184 -134.658 -3 + vertex -50.002 -134.999 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -50.8767 -134.798 -3 + vertex -51 -134.732 -3 + vertex -50.002 -134.999 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -50.7492 -134.854 -3 + vertex -50.8767 -134.798 -3 + vertex -50.002 -134.999 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -50.618 -134.902 -3 + vertex -50.7492 -134.854 -3 + vertex -50.002 -134.999 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -50.4838 -134.941 -3 + vertex -50.618 -134.902 -3 + vertex -50.002 -134.999 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -50.3473 -134.97 -3 + vertex -50.4838 -134.941 -3 + vertex -50.002 -134.999 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -50.209 -134.989 -3 + vertex -50.3473 -134.97 -3 + vertex -50.002 -134.999 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -50.0698 -134.999 -3 + vertex -50.209 -134.989 -3 + vertex -50.002 -134.999 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -50.002 -134.999 -3 + vertex -51.1184 -134.658 -3 + vertex -51.7856 -133.899 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -58.2127 -121.102 -3 + vertex -50 -135 -3 + vertex -50.002 -134.999 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -58.2127 -121.102 -3 + vertex 50 -135 -3 + vertex -50 -135 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -58.2127 -121.102 -3 + vertex -50.002 -134.999 -3 + vertex -51.7856 -133.899 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 50.209 -134.989 0 + vertex 50.002 -134.999 0 + vertex 50.0698 -134.999 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 50.3473 -134.97 0 + vertex 50.002 -134.999 0 + vertex 50.209 -134.989 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 58.2127 -121.102 0 + vertex 50.002 -134.999 0 + vertex 51.7856 -133.899 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 50.4838 -134.941 0 + vertex 50.002 -134.999 0 + vertex 50.3473 -134.97 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 50.618 -134.902 0 + vertex 50.002 -134.999 0 + vertex 50.4838 -134.941 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 50.7492 -134.854 0 + vertex 50.002 -134.999 0 + vertex 50.618 -134.902 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 50.8767 -134.798 0 + vertex 50.002 -134.999 0 + vertex 50.7492 -134.854 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 51 -134.732 0 + vertex 50.002 -134.999 0 + vertex 50.8767 -134.798 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 51.1184 -134.658 0 + vertex 50.002 -134.999 0 + vertex 51 -134.732 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 51.2313 -134.576 0 + vertex 51.7856 -133.899 0 + vertex 51.1184 -134.658 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 51.3383 -134.486 0 + vertex 51.7856 -133.899 0 + vertex 51.2313 -134.576 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 51.4387 -134.389 0 + vertex 51.7856 -133.899 0 + vertex 51.3383 -134.486 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 51.5321 -134.286 0 + vertex 51.7856 -133.899 0 + vertex 51.4387 -134.389 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 51.618 -134.176 0 + vertex 51.7856 -133.899 0 + vertex 51.5321 -134.286 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 51.6961 -134.06 0 + vertex 51.7856 -133.899 0 + vertex 51.618 -134.176 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 51.7659 -133.939 0 + vertex 51.7856 -133.899 0 + vertex 51.6961 -134.06 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 51.7856 -133.899 0 + vertex 50.002 -134.999 0 + vertex 51.1184 -134.658 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 58.2127 -121.102 0 + vertex 50 -135 0 + vertex 50.002 -134.999 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 58.2127 -121.102 0 + vertex 51.7856 -133.899 0 + vertex 51.7873 -133.898 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 -119.998 0 + vertex -118.5 -119.598 0 + vertex -118.315 -119.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 58.2341 -121.061 0 + vertex 58.2127 -121.102 0 + vertex 58.2144 -121.101 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.971 117.418 0 + vertex 117.002 119.998 0 + vertex 119.993 117.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.934 117.624 0 + vertex 119.884 117.827 0 + vertex 117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.741 118.22 0 + vertex 119.649 118.408 0 + vertex 117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 119.998 0 + vertex 119.158 119.084 0 + vertex 119.007 119.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.427 118.763 0 + vertex 117.002 119.998 0 + vertex 119.544 118.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 119.998 0 + vertex 118.124 119.782 0 + vertex 117.927 119.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 118.847 119.364 0 + vertex 117.002 119.998 0 + vertex 119.007 119.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 118.5 119.598 0 + vertex 118.315 119.696 0 + vertex 117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.649 118.408 0 + vertex 119.544 118.59 0 + vertex 117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.726 119.911 0 + vertex 117.002 119.998 0 + vertex 117.927 119.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.314 119.984 0 + vertex 117.002 119.998 0 + vertex 117.521 119.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120 117 0 + vertex 119.993 117.209 0 + vertex 117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120 117 0 + vertex 59.382 -120.098 0 + vertex 59.5161 -120.059 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120 117 0 + vertex 59.5161 -120.059 0 + vertex 59.6527 -120.03 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120 117 0 + vertex 59.6527 -120.03 0 + vertex 59.7909 -120.011 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120 117 0 + vertex 59.7909 -120.011 0 + vertex 59.9302 -120.001 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 60 -120 0 + vertex 59.9302 -120.001 0 + vertex 59.998 -120.001 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 -119.998 0 + vertex 119.427 -118.763 0 + vertex 119.544 -118.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 -119.998 0 + vertex 60 -120 0 + vertex 117 -120 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 117.314 -119.984 0 + vertex 117.521 -119.954 0 + vertex 117.002 -119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.314 -119.984 0 + vertex 117.002 -119.998 0 + vertex 117.105 -119.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 117.521 -119.954 0 + vertex 117.726 -119.911 0 + vertex 117.002 -119.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 117.726 -119.911 0 + vertex 117.927 -119.853 0 + vertex 117.002 -119.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 117.927 -119.853 0 + vertex 118.124 -119.782 0 + vertex 117.002 -119.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 118.124 -119.782 0 + vertex 118.315 -119.696 0 + vertex 117.002 -119.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 118.315 -119.696 0 + vertex 118.5 -119.598 0 + vertex 117.002 -119.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 118.5 -119.598 0 + vertex 118.678 -119.487 0 + vertex 117.002 -119.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 118.678 -119.487 0 + vertex 118.847 -119.364 0 + vertex 117.002 -119.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 118.847 -119.364 0 + vertex 119.007 -119.229 0 + vertex 117.002 -119.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 119.007 -119.229 0 + vertex 119.158 -119.084 0 + vertex 117.002 -119.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 119.158 -119.084 0 + vertex 119.298 -118.928 0 + vertex 117.002 -119.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 119.298 -118.928 0 + vertex 119.427 -118.763 0 + vertex 117.002 -119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 -119.998 0 + vertex 119.544 -118.59 0 + vertex 119.649 -118.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 -119.998 0 + vertex 119.649 -118.408 0 + vertex 119.741 -118.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 -119.998 0 + vertex 119.741 -118.22 0 + vertex 119.819 -118.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 -119.998 0 + vertex 119.819 -118.026 0 + vertex 119.884 -117.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 -119.998 0 + vertex 119.884 -117.827 0 + vertex 119.934 -117.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 -119.998 0 + vertex 119.934 -117.624 0 + vertex 119.971 -117.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 -119.998 0 + vertex 119.971 -117.418 0 + vertex 119.993 -117.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 -119.998 0 + vertex 119.993 -117.209 0 + vertex 120 -117 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 117.002 -119.998 0 + vertex 120 -117 0 + vertex 60 -120 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 120 -117 0 + vertex 120 117 0 + vertex 60 -120 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 120 117 0 + vertex 59.9302 -120.001 0 + vertex 60 -120 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 119.998 0 + vertex 119.819 118.026 0 + vertex 119.741 118.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.427 118.763 0 + vertex 119.298 118.928 0 + vertex 117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 119.998 0 + vertex 119.298 118.928 0 + vertex 119.158 119.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 118.678 119.487 0 + vertex 117.002 119.998 0 + vertex 118.847 119.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 118.678 119.487 0 + vertex 118.5 119.598 0 + vertex 117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 119.998 0 + vertex 118.315 119.696 0 + vertex 118.124 119.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.521 119.954 0 + vertex 117.002 119.998 0 + vertex 117.726 119.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.819 118.026 0 + vertex 117.002 119.998 0 + vertex 119.884 117.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 119.934 117.624 0 + vertex 117.002 119.998 0 + vertex 119.971 117.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.105 119.998 0 + vertex 117.002 119.998 0 + vertex 117.314 119.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117.002 119.998 0 + vertex 59.382 -120.098 0 + vertex 120 117 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 117 120 0 + vertex 59.382 -120.098 0 + vertex 117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 59.2508 -120.146 0 + vertex 59.382 -120.098 0 + vertex 117 120 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 59.2508 -120.146 0 + vertex 117 120 0 + vertex -117 120 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -120 117 0 + vertex -59.7909 -120.011 0 + vertex -59.6527 -120.03 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -59.9302 -120.001 0 + vertex -59.7909 -120.011 0 + vertex -120 117 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -120 117 0 + vertex -59.6527 -120.03 0 + vertex -59.5161 -120.059 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -119.993 117.209 0 + vertex -120 117 0 + vertex -117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.971 117.418 0 + vertex -117.002 119.998 0 + vertex -119.934 117.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 119.998 0 + vertex -119.741 118.22 0 + vertex -119.819 118.026 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -119.544 118.59 0 + vertex -119.649 118.408 0 + vertex -117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.427 118.763 0 + vertex -117.002 119.998 0 + vertex -119.298 118.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 119.998 0 + vertex -119.007 119.229 0 + vertex -119.158 119.084 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -118.678 119.487 0 + vertex -118.847 119.364 0 + vertex -117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -118.5 119.598 0 + vertex -117.002 119.998 0 + vertex -118.315 119.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 119.998 0 + vertex -118.124 119.782 0 + vertex -118.315 119.696 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -117.105 119.998 0 + vertex -117.314 119.984 0 + vertex -117.002 119.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -117.314 119.984 0 + vertex -117.521 119.954 0 + vertex -117.002 119.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -117.521 119.954 0 + vertex -117.726 119.911 0 + vertex -117.002 119.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -117.726 119.911 0 + vertex -117.927 119.853 0 + vertex -117.002 119.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -117.927 119.853 0 + vertex -118.124 119.782 0 + vertex -117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -118.678 119.487 0 + vertex -117.002 119.998 0 + vertex -118.5 119.598 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -118.847 119.364 0 + vertex -119.007 119.229 0 + vertex -117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 119.998 0 + vertex -119.158 119.084 0 + vertex -119.298 118.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.544 118.59 0 + vertex -117.002 119.998 0 + vertex -119.427 118.763 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -119.649 118.408 0 + vertex -119.741 118.22 0 + vertex -117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 119.998 0 + vertex -119.819 118.026 0 + vertex -119.884 117.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 119.998 0 + vertex -119.884 117.827 0 + vertex -119.934 117.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.993 117.209 0 + vertex -117.002 119.998 0 + vertex -119.971 117.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -120 117 0 + vertex -60 -120 0 + vertex -59.9302 -120.001 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -120 117 0 + vertex -59.5161 -120.059 0 + vertex -59.382 -120.098 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -60 -120 0 + vertex -120 117 0 + vertex -120 -117 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -120 117 0 + vertex -59.382 -120.098 0 + vertex -117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -59.382 -120.098 0 + vertex -117 120 0 + vertex -117.002 119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -59.2508 -120.146 0 + vertex -117 120 0 + vertex -59.382 -120.098 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -117.105 -119.998 0 + vertex -117.002 -119.998 0 + vertex -117.314 -119.984 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -117.314 -119.984 0 + vertex -117.002 -119.998 0 + vertex -117.521 -119.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 -119.998 0 + vertex -117.927 -119.853 0 + vertex -117.726 -119.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 -119.998 0 + vertex -119.649 -118.408 0 + vertex -119.544 -118.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -118.678 -119.487 0 + vertex -118.5 -119.598 0 + vertex -117.002 -119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.993 -117.209 0 + vertex -119.971 -117.418 0 + vertex -117.002 -119.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 -119.998 0 + vertex -119.934 -117.624 0 + vertex -119.884 -117.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -119.649 -118.408 0 + vertex -117.002 -119.998 0 + vertex -119.741 -118.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 -119.998 0 + vertex -119.819 -118.026 0 + vertex -119.741 -118.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -119.158 -119.084 0 + vertex -119.007 -119.229 0 + vertex -117.002 -119.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -119.298 -118.928 0 + vertex -117.002 -119.998 0 + vertex -119.427 -118.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 -119.998 0 + vertex -119.544 -118.59 0 + vertex -119.427 -118.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -119.158 -119.084 0 + vertex -117.002 -119.998 0 + vertex -119.298 -118.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -118.124 -119.782 0 + vertex -117.927 -119.853 0 + vertex -117.002 -119.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -118.678 -119.487 0 + vertex -117.002 -119.998 0 + vertex -118.847 -119.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 -119.998 0 + vertex -119.007 -119.229 0 + vertex -118.847 -119.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 -119.998 0 + vertex -118.315 -119.696 0 + vertex -118.124 -119.782 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -117.521 -119.954 0 + vertex -117.002 -119.998 0 + vertex -117.726 -119.911 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -119.819 -118.026 0 + vertex -117.002 -119.998 0 + vertex -119.884 -117.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -119.934 -117.624 0 + vertex -117.002 -119.998 0 + vertex -119.971 -117.418 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -59.2508 -120.146 0 + vertex 59.2508 -120.146 0 + vertex -117 120 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 58.7687 -120.424 0 + vertex -58.8816 -120.342 0 + vertex -58.7687 -120.424 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 59.1232 -120.202 0 + vertex 59.2508 -120.146 0 + vertex -59.2508 -120.146 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 59.1232 -120.202 0 + vertex -59.2508 -120.146 0 + vertex -59.1232 -120.202 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 59.1232 -120.202 0 + vertex -59.1232 -120.202 0 + vertex 59 -120.268 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -59 -120.268 0 + vertex 58.8816 -120.342 0 + vertex 59 -120.268 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -51.7873 -133.898 0 + vertex -51.7856 -133.899 0 + vertex -58.2127 -121.102 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -59.1232 -120.202 0 + vertex -59 -120.268 0 + vertex 59 -120.268 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -119.993 -117.209 0 + vertex -117.002 -119.998 0 + vertex -120 -117 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -58.8816 -120.342 0 + vertex 58.8816 -120.342 0 + vertex -59 -120.268 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -117.002 -119.998 0 + vertex -60 -120 0 + vertex -120 -117 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -117.002 -119.998 0 + vertex -117 -120 0 + vertex -60 -120 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 58.7687 -120.424 0 + vertex -58.7687 -120.424 0 + vertex 58.6617 -120.514 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -59.998 -120.001 0 + vertex -59.9302 -120.001 0 + vertex -60 -120 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 58.7687 -120.424 0 + vertex 58.8816 -120.342 0 + vertex -58.8816 -120.342 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -58.7687 -120.424 0 + vertex -58.6617 -120.514 0 + vertex 58.6617 -120.514 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -58.6617 -120.514 0 + vertex 58.5613 -120.611 0 + vertex 58.6617 -120.514 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -58.5613 -120.611 0 + vertex 58.5613 -120.611 0 + vertex -58.6617 -120.514 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 58.4679 -120.714 0 + vertex 58.5613 -120.611 0 + vertex -58.5613 -120.611 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 58.4679 -120.714 0 + vertex -58.5613 -120.611 0 + vertex -58.4679 -120.714 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 58.4679 -120.714 0 + vertex -58.4679 -120.714 0 + vertex 58.382 -120.824 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -58.4679 -120.714 0 + vertex -58.382 -120.824 0 + vertex 58.382 -120.824 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -58.382 -120.824 0 + vertex 58.3039 -120.94 0 + vertex 58.382 -120.824 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -58.3039 -120.94 0 + vertex 58.3039 -120.94 0 + vertex -58.382 -120.824 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 58.2341 -121.061 0 + vertex 58.3039 -120.94 0 + vertex -58.3039 -120.94 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 58.2341 -121.061 0 + vertex -58.3039 -120.94 0 + vertex -58.2341 -121.061 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 58.2341 -121.061 0 + vertex -58.2341 -121.061 0 + vertex 58.2127 -121.102 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -58.2341 -121.061 0 + vertex -58.2144 -121.101 0 + vertex -58.2127 -121.102 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -58.2341 -121.061 0 + vertex -58.2127 -121.102 0 + vertex 58.2127 -121.102 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -58.2127 -121.102 0 + vertex 50 -135 0 + vertex 58.2127 -121.102 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -51.7856 -133.899 0 + vertex -51.4387 -134.389 0 + vertex -51.3383 -134.486 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -51.7659 -133.939 0 + vertex -51.6961 -134.06 0 + vertex -51.7856 -133.899 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -51.6961 -134.06 0 + vertex -51.618 -134.176 0 + vertex -51.7856 -133.899 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -51.618 -134.176 0 + vertex -51.5321 -134.286 0 + vertex -51.7856 -133.899 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -51.5321 -134.286 0 + vertex -51.4387 -134.389 0 + vertex -51.7856 -133.899 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -51.7856 -133.899 0 + vertex -51.3383 -134.486 0 + vertex -51.2313 -134.576 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -51.7856 -133.899 0 + vertex -51.2313 -134.576 0 + vertex -51.1184 -134.658 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -50.002 -134.999 0 + vertex -51.1184 -134.658 0 + vertex -51 -134.732 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -50.002 -134.999 0 + vertex -51 -134.732 0 + vertex -50.8767 -134.798 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -50.002 -134.999 0 + vertex -50.8767 -134.798 0 + vertex -50.7492 -134.854 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -50.002 -134.999 0 + vertex -50.7492 -134.854 0 + vertex -50.618 -134.902 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -50.002 -134.999 0 + vertex -50.618 -134.902 0 + vertex -50.4838 -134.941 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -50.002 -134.999 0 + vertex -50.4838 -134.941 0 + vertex -50.3473 -134.97 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -50.002 -134.999 0 + vertex -50.3473 -134.97 0 + vertex -50.209 -134.989 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -50.002 -134.999 0 + vertex -50.209 -134.989 0 + vertex -50.0698 -134.999 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -51.7856 -133.899 0 + vertex -51.1184 -134.658 0 + vertex -50.002 -134.999 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -50.002 -134.999 0 + vertex -50 -135 0 + vertex -58.2127 -121.102 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -50 -135 0 + vertex 50 -135 0 + vertex -58.2127 -121.102 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -51.7856 -133.899 0 + vertex -50.002 -134.999 0 + vertex -58.2127 -121.102 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 50.0698 -134.999 -3 + vertex 50.002 -134.999 0 + vertex 50.002 -134.999 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 50.0698 -134.999 -3 + vertex 50.0698 -134.999 0 + vertex 50.002 -134.999 0 + endloop + endfacet + facet normal 0.0716544 -0.99743 0 + outer loop + vertex 50.209 -134.989 -3 + vertex 50.0698 -134.999 0 + vertex 50.0698 -134.999 -3 + endloop + endfacet + facet normal 0.0716544 -0.99743 0 + outer loop + vertex 50.209 -134.989 -3 + vertex 50.209 -134.989 0 + vertex 50.0698 -134.999 0 + endloop + endfacet + facet normal 0.136104 -0.990695 0 + outer loop + vertex 50.3473 -134.97 -3 + vertex 50.209 -134.989 0 + vertex 50.209 -134.989 -3 + endloop + endfacet + facet normal 0.136104 -0.990695 0 + outer loop + vertex 50.3473 -134.97 -3 + vertex 50.3473 -134.97 0 + vertex 50.209 -134.989 0 + endloop + endfacet + facet normal 0.207816 -0.978168 0 + outer loop + vertex 50.4838 -134.941 -3 + vertex 50.3473 -134.97 0 + vertex 50.3473 -134.97 -3 + endloop + endfacet + facet normal 0.207816 -0.978168 0 + outer loop + vertex 50.4838 -134.941 -3 + vertex 50.4838 -134.941 0 + vertex 50.3473 -134.97 0 + endloop + endfacet + facet normal 0.279066 -0.960272 0 + outer loop + vertex 50.618 -134.902 -3 + vertex 50.4838 -134.941 0 + vertex 50.4838 -134.941 -3 + endloop + endfacet + facet normal 0.279066 -0.960272 0 + outer loop + vertex 50.618 -134.902 -3 + vertex 50.618 -134.902 0 + vertex 50.4838 -134.941 0 + endloop + endfacet + facet normal 0.343582 -0.939123 0 + outer loop + vertex 50.7492 -134.854 -3 + vertex 50.618 -134.902 0 + vertex 50.618 -134.902 -3 + endloop + endfacet + facet normal 0.343582 -0.939123 0 + outer loop + vertex 50.7492 -134.854 -3 + vertex 50.7492 -134.854 0 + vertex 50.618 -134.902 0 + endloop + endfacet + facet normal 0.402137 -0.91558 0 + outer loop + vertex 50.8767 -134.798 -3 + vertex 50.7492 -134.854 0 + vertex 50.7492 -134.854 -3 + endloop + endfacet + facet normal 0.402137 -0.91558 0 + outer loop + vertex 50.8767 -134.798 -3 + vertex 50.8767 -134.798 0 + vertex 50.7492 -134.854 0 + endloop + endfacet + facet normal 0.471924 -0.881639 0 + outer loop + vertex 51 -134.732 -3 + vertex 50.8767 -134.798 0 + vertex 50.8767 -134.798 -3 + endloop + endfacet + facet normal 0.471924 -0.881639 0 + outer loop + vertex 51 -134.732 -3 + vertex 51 -134.732 0 + vertex 50.8767 -134.798 0 + endloop + endfacet + facet normal 0.529999 -0.847998 0 + outer loop + vertex 51.1184 -134.658 -3 + vertex 51 -134.732 0 + vertex 51 -134.732 -3 + endloop + endfacet + facet normal 0.529999 -0.847998 0 + outer loop + vertex 51.1184 -134.658 -3 + vertex 51.1184 -134.658 0 + vertex 51 -134.732 0 + endloop + endfacet + facet normal 0.58766 -0.809108 0 + outer loop + vertex 51.2313 -134.576 -3 + vertex 51.1184 -134.658 0 + vertex 51.1184 -134.658 -3 + endloop + endfacet + facet normal 0.58766 -0.809108 0 + outer loop + vertex 51.2313 -134.576 -3 + vertex 51.2313 -134.576 0 + vertex 51.1184 -134.658 0 + endloop + endfacet + facet normal 0.643695 -0.765282 0 + outer loop + vertex 51.3383 -134.486 -3 + vertex 51.2313 -134.576 0 + vertex 51.2313 -134.576 -3 + endloop + endfacet + facet normal 0.643695 -0.765282 0 + outer loop + vertex 51.3383 -134.486 -3 + vertex 51.3383 -134.486 0 + vertex 51.2313 -134.576 0 + endloop + endfacet + facet normal 0.694825 -0.719179 0 + outer loop + vertex 51.4387 -134.389 -3 + vertex 51.3383 -134.486 0 + vertex 51.3383 -134.486 -3 + endloop + endfacet + facet normal 0.694825 -0.719179 0 + outer loop + vertex 51.4387 -134.389 -3 + vertex 51.4387 -134.389 0 + vertex 51.3383 -134.486 0 + endloop + endfacet + facet normal 0.740786 -0.671742 0 + outer loop + vertex 51.5321 -134.286 -3 + vertex 51.4387 -134.389 0 + vertex 51.4387 -134.389 -3 + endloop + endfacet + facet normal 0.740786 -0.671742 0 + outer loop + vertex 51.5321 -134.286 -3 + vertex 51.5321 -134.286 0 + vertex 51.4387 -134.389 0 + endloop + endfacet + facet normal 0.788155 -0.615477 0 + outer loop + vertex 51.618 -134.176 -3 + vertex 51.5321 -134.286 0 + vertex 51.5321 -134.286 -3 + endloop + endfacet + facet normal 0.788155 -0.615477 0 + outer loop + vertex 51.618 -134.176 -3 + vertex 51.618 -134.176 0 + vertex 51.5321 -134.286 0 + endloop + endfacet + facet normal 0.829511 -0.55849 0 + outer loop + vertex 51.6961 -134.06 -3 + vertex 51.618 -134.176 0 + vertex 51.618 -134.176 -3 + endloop + endfacet + facet normal 0.829511 -0.55849 0 + outer loop + vertex 51.6961 -134.06 -3 + vertex 51.6961 -134.06 0 + vertex 51.618 -134.176 0 + endloop + endfacet + facet normal 0.866209 -0.499681 0 + outer loop + vertex 51.7659 -133.939 -3 + vertex 51.6961 -134.06 0 + vertex 51.6961 -134.06 -3 + endloop + endfacet + facet normal 0.866209 -0.499681 0 + outer loop + vertex 51.7659 -133.939 -3 + vertex 51.7659 -133.939 0 + vertex 51.6961 -134.06 0 + endloop + endfacet + facet normal 0.897102 -0.441823 0 + outer loop + vertex 51.7856 -133.899 -3 + vertex 51.7659 -133.939 0 + vertex 51.7659 -133.939 -3 + endloop + endfacet + facet normal 0.897102 -0.441823 0 + outer loop + vertex 51.7856 -133.899 -3 + vertex 51.7856 -133.899 0 + vertex 51.7659 -133.939 0 + endloop + endfacet + facet normal 0.50702 -0.861934 0 + outer loop + vertex 51.7873 -133.898 -3 + vertex 51.7856 -133.899 0 + vertex 51.7856 -133.899 -3 + endloop + endfacet + facet normal 0.50702 -0.861934 0 + outer loop + vertex 51.7873 -133.898 -3 + vertex 51.7873 -133.898 0 + vertex 51.7856 -133.899 0 + endloop + endfacet + facet normal 0.89366 -0.448744 0 + outer loop + vertex 58.2127 -121.102 -3 + vertex 51.7873 -133.898 0 + vertex 51.7873 -133.898 -3 + endloop + endfacet + facet normal 0.89366 -0.448744 0 + outer loop + vertex 58.2127 -121.102 -3 + vertex 58.2127 -121.102 0 + vertex 51.7873 -133.898 0 + endloop + endfacet + facet normal 0.50702 -0.861934 0 + outer loop + vertex 58.2144 -121.101 -3 + vertex 58.2127 -121.102 0 + vertex 58.2127 -121.102 -3 + endloop + endfacet + facet normal 0.50702 -0.861934 0 + outer loop + vertex 58.2144 -121.101 -3 + vertex 58.2144 -121.101 0 + vertex 58.2127 -121.102 0 + endloop + endfacet + facet normal 0.897102 -0.441823 0 + outer loop + vertex 58.2341 -121.061 -3 + vertex 58.2144 -121.101 0 + vertex 58.2144 -121.101 -3 + endloop + endfacet + facet normal 0.897102 -0.441823 0 + outer loop + vertex 58.2341 -121.061 -3 + vertex 58.2341 -121.061 0 + vertex 58.2144 -121.101 0 + endloop + endfacet + facet normal 0.866209 -0.499681 0 + outer loop + vertex 58.3039 -120.94 -3 + vertex 58.2341 -121.061 0 + vertex 58.2341 -121.061 -3 + endloop + endfacet + facet normal 0.866209 -0.499681 0 + outer loop + vertex 58.3039 -120.94 -3 + vertex 58.3039 -120.94 0 + vertex 58.2341 -121.061 0 + endloop + endfacet + facet normal 0.829511 -0.55849 0 + outer loop + vertex 58.382 -120.824 -3 + vertex 58.3039 -120.94 0 + vertex 58.3039 -120.94 -3 + endloop + endfacet + facet normal 0.829511 -0.55849 0 + outer loop + vertex 58.382 -120.824 -3 + vertex 58.382 -120.824 0 + vertex 58.3039 -120.94 0 + endloop + endfacet + facet normal 0.788155 -0.615477 0 + outer loop + vertex 58.4679 -120.714 -3 + vertex 58.382 -120.824 0 + vertex 58.382 -120.824 -3 + endloop + endfacet + facet normal 0.788155 -0.615477 0 + outer loop + vertex 58.4679 -120.714 -3 + vertex 58.4679 -120.714 0 + vertex 58.382 -120.824 0 + endloop + endfacet + facet normal 0.740786 -0.671742 0 + outer loop + vertex 58.5613 -120.611 -3 + vertex 58.4679 -120.714 0 + vertex 58.4679 -120.714 -3 + endloop + endfacet + facet normal 0.740786 -0.671742 0 + outer loop + vertex 58.5613 -120.611 -3 + vertex 58.5613 -120.611 0 + vertex 58.4679 -120.714 0 + endloop + endfacet + facet normal 0.694825 -0.719179 0 + outer loop + vertex 58.6617 -120.514 -3 + vertex 58.5613 -120.611 0 + vertex 58.5613 -120.611 -3 + endloop + endfacet + facet normal 0.694825 -0.719179 0 + outer loop + vertex 58.6617 -120.514 -3 + vertex 58.6617 -120.514 0 + vertex 58.5613 -120.611 0 + endloop + endfacet + facet normal 0.643695 -0.765282 0 + outer loop + vertex 58.7687 -120.424 -3 + vertex 58.6617 -120.514 0 + vertex 58.6617 -120.514 -3 + endloop + endfacet + facet normal 0.643695 -0.765282 0 + outer loop + vertex 58.7687 -120.424 -3 + vertex 58.7687 -120.424 0 + vertex 58.6617 -120.514 0 + endloop + endfacet + facet normal 0.58766 -0.809108 0 + outer loop + vertex 58.8816 -120.342 -3 + vertex 58.7687 -120.424 0 + vertex 58.7687 -120.424 -3 + endloop + endfacet + facet normal 0.58766 -0.809108 0 + outer loop + vertex 58.8816 -120.342 -3 + vertex 58.8816 -120.342 0 + vertex 58.7687 -120.424 0 + endloop + endfacet + facet normal 0.529999 -0.847998 0 + outer loop + vertex 59 -120.268 -3 + vertex 58.8816 -120.342 0 + vertex 58.8816 -120.342 -3 + endloop + endfacet + facet normal 0.529999 -0.847998 0 + outer loop + vertex 59 -120.268 -3 + vertex 59 -120.268 0 + vertex 58.8816 -120.342 0 + endloop + endfacet + facet normal 0.472221 -0.88148 0 + outer loop + vertex 59.1232 -120.202 -3 + vertex 59 -120.268 0 + vertex 59 -120.268 -3 + endloop + endfacet + facet normal 0.472221 -0.88148 0 + outer loop + vertex 59.1232 -120.202 -3 + vertex 59.1232 -120.202 0 + vertex 59 -120.268 0 + endloop + endfacet + facet normal 0.401873 -0.915696 0 + outer loop + vertex 59.2508 -120.146 -3 + vertex 59.1232 -120.202 0 + vertex 59.1232 -120.202 -3 + endloop + endfacet + facet normal 0.401873 -0.915696 0 + outer loop + vertex 59.2508 -120.146 -3 + vertex 59.2508 -120.146 0 + vertex 59.1232 -120.202 0 + endloop + endfacet + facet normal 0.343582 -0.939123 0 + outer loop + vertex 59.382 -120.098 -3 + vertex 59.2508 -120.146 0 + vertex 59.2508 -120.146 -3 + endloop + endfacet + facet normal 0.343582 -0.939123 0 + outer loop + vertex 59.382 -120.098 -3 + vertex 59.382 -120.098 0 + vertex 59.2508 -120.146 0 + endloop + endfacet + facet normal 0.279258 -0.960216 0 + outer loop + vertex 59.5161 -120.059 -3 + vertex 59.382 -120.098 0 + vertex 59.382 -120.098 -3 + endloop + endfacet + facet normal 0.279258 -0.960216 0 + outer loop + vertex 59.5161 -120.059 -3 + vertex 59.5161 -120.059 0 + vertex 59.382 -120.098 0 + endloop + endfacet + facet normal 0.20767 -0.978199 0 + outer loop + vertex 59.6527 -120.03 -3 + vertex 59.5161 -120.059 0 + vertex 59.5161 -120.059 -3 + endloop + endfacet + facet normal 0.20767 -0.978199 0 + outer loop + vertex 59.6527 -120.03 -3 + vertex 59.6527 -120.03 0 + vertex 59.5161 -120.059 0 + endloop + endfacet + facet normal 0.136201 -0.990681 0 + outer loop + vertex 59.7909 -120.011 -3 + vertex 59.6527 -120.03 0 + vertex 59.6527 -120.03 -3 + endloop + endfacet + facet normal 0.136201 -0.990681 0 + outer loop + vertex 59.7909 -120.011 -3 + vertex 59.7909 -120.011 0 + vertex 59.6527 -120.03 0 + endloop + endfacet + facet normal 0.0716032 -0.997433 0 + outer loop + vertex 59.9302 -120.001 -3 + vertex 59.7909 -120.011 0 + vertex 59.7909 -120.011 -3 + endloop + endfacet + facet normal 0.0716032 -0.997433 0 + outer loop + vertex 59.9302 -120.001 -3 + vertex 59.9302 -120.001 0 + vertex 59.7909 -120.011 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 59.998 -120.001 -3 + vertex 59.9302 -120.001 0 + vertex 59.9302 -120.001 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 59.998 -120.001 -3 + vertex 59.998 -120.001 0 + vertex 59.9302 -120.001 0 + endloop + endfacet + facet normal 0.447214 -0.894427 0 + outer loop + vertex 60 -120 -3 + vertex 59.998 -120.001 0 + vertex 59.998 -120.001 -3 + endloop + endfacet + facet normal 0.447214 -0.894427 0 + outer loop + vertex 60 -120 -3 + vertex 60 -120 0 + vertex 59.998 -120.001 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 117 -120 -3 + vertex 60 -120 0 + vertex 60 -120 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 117 -120 -3 + vertex 117 -120 0 + vertex 60 -120 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 117.002 -119.998 -3 + vertex 117 -120 0 + vertex 117 -120 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 117.002 -119.998 -3 + vertex 117.002 -119.998 0 + vertex 117 -120 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 117.105 -119.998 -3 + vertex 117.002 -119.998 0 + vertex 117.002 -119.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 117.105 -119.998 -3 + vertex 117.105 -119.998 0 + vertex 117.002 -119.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 117.314 -119.984 -3 + vertex 117.105 -119.998 0 + vertex 117.105 -119.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 117.314 -119.984 -3 + vertex 117.314 -119.984 0 + vertex 117.105 -119.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 117.521 -119.954 -3 + vertex 117.314 -119.984 0 + vertex 117.314 -119.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 117.521 -119.954 -3 + vertex 117.521 -119.954 0 + vertex 117.314 -119.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 117.726 -119.911 -3 + vertex 117.521 -119.954 0 + vertex 117.521 -119.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 117.726 -119.911 -3 + vertex 117.726 -119.911 0 + vertex 117.521 -119.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 117.927 -119.853 -3 + vertex 117.726 -119.911 0 + vertex 117.726 -119.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 117.927 -119.853 -3 + vertex 117.927 -119.853 0 + vertex 117.726 -119.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 118.124 -119.782 -3 + vertex 117.927 -119.853 0 + vertex 117.927 -119.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 118.124 -119.782 -3 + vertex 118.124 -119.782 0 + vertex 117.927 -119.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 118.315 -119.696 -3 + vertex 118.124 -119.782 0 + vertex 118.124 -119.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 118.315 -119.696 -3 + vertex 118.315 -119.696 0 + vertex 118.124 -119.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 118.5 -119.598 -3 + vertex 118.315 -119.696 0 + vertex 118.315 -119.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 118.5 -119.598 -3 + vertex 118.5 -119.598 0 + vertex 118.315 -119.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 118.678 -119.487 -3 + vertex 118.5 -119.598 0 + vertex 118.5 -119.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 118.678 -119.487 -3 + vertex 118.678 -119.487 0 + vertex 118.5 -119.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 118.847 -119.364 -3 + vertex 118.678 -119.487 0 + vertex 118.678 -119.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 118.847 -119.364 -3 + vertex 118.847 -119.364 0 + vertex 118.678 -119.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 119.007 -119.229 -3 + vertex 118.847 -119.364 0 + vertex 118.847 -119.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 119.007 -119.229 -3 + vertex 119.007 -119.229 0 + vertex 118.847 -119.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 119.158 -119.084 -3 + vertex 119.007 -119.229 0 + vertex 119.007 -119.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 119.158 -119.084 -3 + vertex 119.158 -119.084 0 + vertex 119.007 -119.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 119.298 -118.928 -3 + vertex 119.158 -119.084 0 + vertex 119.158 -119.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 119.298 -118.928 -3 + vertex 119.298 -118.928 0 + vertex 119.158 -119.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 119.427 -118.763 -3 + vertex 119.298 -118.928 0 + vertex 119.298 -118.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 119.427 -118.763 -3 + vertex 119.427 -118.763 0 + vertex 119.298 -118.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 119.544 -118.59 -3 + vertex 119.427 -118.763 0 + vertex 119.427 -118.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 119.544 -118.59 -3 + vertex 119.544 -118.59 0 + vertex 119.427 -118.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 119.649 -118.408 -3 + vertex 119.544 -118.59 0 + vertex 119.544 -118.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 119.649 -118.408 -3 + vertex 119.649 -118.408 0 + vertex 119.544 -118.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 119.741 -118.22 -3 + vertex 119.649 -118.408 0 + vertex 119.649 -118.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 119.741 -118.22 -3 + vertex 119.741 -118.22 0 + vertex 119.649 -118.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 119.819 -118.026 -3 + vertex 119.741 -118.22 0 + vertex 119.741 -118.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 119.819 -118.026 -3 + vertex 119.819 -118.026 0 + vertex 119.741 -118.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 119.884 -117.827 -3 + vertex 119.819 -118.026 0 + vertex 119.819 -118.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 119.884 -117.827 -3 + vertex 119.884 -117.827 0 + vertex 119.819 -118.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 119.934 -117.624 -3 + vertex 119.884 -117.827 0 + vertex 119.884 -117.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 119.934 -117.624 -3 + vertex 119.934 -117.624 0 + vertex 119.884 -117.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 119.971 -117.418 -3 + vertex 119.934 -117.624 0 + vertex 119.934 -117.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 119.971 -117.418 -3 + vertex 119.971 -117.418 0 + vertex 119.934 -117.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 119.993 -117.209 -3 + vertex 119.971 -117.418 0 + vertex 119.971 -117.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 119.993 -117.209 -3 + vertex 119.993 -117.209 0 + vertex 119.971 -117.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 120 -117 -3 + vertex 119.993 -117.209 0 + vertex 119.993 -117.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 120 -117 -3 + vertex 120 -117 0 + vertex 119.993 -117.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 120 117 -3 + vertex 120 -117 0 + vertex 120 -117 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 120 117 -3 + vertex 120 117 0 + vertex 120 -117 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 119.993 117.209 -3 + vertex 120 117 0 + vertex 120 117 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 119.993 117.209 -3 + vertex 119.993 117.209 0 + vertex 120 117 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 119.971 117.418 -3 + vertex 119.993 117.209 0 + vertex 119.993 117.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 119.971 117.418 -3 + vertex 119.971 117.418 0 + vertex 119.993 117.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 119.934 117.624 -3 + vertex 119.971 117.418 0 + vertex 119.971 117.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 119.934 117.624 -3 + vertex 119.934 117.624 0 + vertex 119.971 117.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 119.884 117.827 -3 + vertex 119.934 117.624 0 + vertex 119.934 117.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 119.884 117.827 -3 + vertex 119.884 117.827 0 + vertex 119.934 117.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 119.819 118.026 -3 + vertex 119.884 117.827 0 + vertex 119.884 117.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 119.819 118.026 -3 + vertex 119.819 118.026 0 + vertex 119.884 117.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 119.741 118.22 -3 + vertex 119.819 118.026 0 + vertex 119.819 118.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 119.741 118.22 -3 + vertex 119.741 118.22 0 + vertex 119.819 118.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 119.649 118.408 -3 + vertex 119.741 118.22 0 + vertex 119.741 118.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 119.649 118.408 -3 + vertex 119.649 118.408 0 + vertex 119.741 118.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 119.544 118.59 -3 + vertex 119.649 118.408 0 + vertex 119.649 118.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 119.544 118.59 -3 + vertex 119.544 118.59 0 + vertex 119.649 118.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 119.427 118.763 -3 + vertex 119.544 118.59 0 + vertex 119.544 118.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 119.427 118.763 -3 + vertex 119.427 118.763 0 + vertex 119.544 118.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 119.298 118.928 -3 + vertex 119.427 118.763 0 + vertex 119.427 118.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 119.298 118.928 -3 + vertex 119.298 118.928 0 + vertex 119.427 118.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 119.158 119.084 -3 + vertex 119.298 118.928 0 + vertex 119.298 118.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 119.158 119.084 -3 + vertex 119.158 119.084 0 + vertex 119.298 118.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 119.007 119.229 -3 + vertex 119.158 119.084 0 + vertex 119.158 119.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 119.007 119.229 -3 + vertex 119.007 119.229 0 + vertex 119.158 119.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 118.847 119.364 -3 + vertex 119.007 119.229 0 + vertex 119.007 119.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 118.847 119.364 -3 + vertex 118.847 119.364 0 + vertex 119.007 119.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 118.678 119.487 -3 + vertex 118.847 119.364 0 + vertex 118.847 119.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 118.678 119.487 -3 + vertex 118.678 119.487 0 + vertex 118.847 119.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 118.5 119.598 -3 + vertex 118.678 119.487 0 + vertex 118.678 119.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 118.5 119.598 -3 + vertex 118.5 119.598 0 + vertex 118.678 119.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 118.315 119.696 -3 + vertex 118.5 119.598 0 + vertex 118.5 119.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 118.315 119.696 -3 + vertex 118.315 119.696 0 + vertex 118.5 119.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 118.124 119.782 -3 + vertex 118.315 119.696 0 + vertex 118.315 119.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 118.124 119.782 -3 + vertex 118.124 119.782 0 + vertex 118.315 119.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 117.927 119.853 -3 + vertex 118.124 119.782 0 + vertex 118.124 119.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 117.927 119.853 -3 + vertex 117.927 119.853 0 + vertex 118.124 119.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 117.726 119.911 -3 + vertex 117.927 119.853 0 + vertex 117.927 119.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 117.726 119.911 -3 + vertex 117.726 119.911 0 + vertex 117.927 119.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 117.521 119.954 -3 + vertex 117.726 119.911 0 + vertex 117.726 119.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 117.521 119.954 -3 + vertex 117.521 119.954 0 + vertex 117.726 119.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 117.314 119.984 -3 + vertex 117.521 119.954 0 + vertex 117.521 119.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 117.314 119.984 -3 + vertex 117.314 119.984 0 + vertex 117.521 119.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 117.105 119.998 -3 + vertex 117.314 119.984 0 + vertex 117.314 119.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 117.105 119.998 -3 + vertex 117.105 119.998 0 + vertex 117.314 119.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 117.002 119.998 -3 + vertex 117.105 119.998 0 + vertex 117.105 119.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 117.002 119.998 -3 + vertex 117.002 119.998 0 + vertex 117.105 119.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 117 120 -3 + vertex 117.002 119.998 0 + vertex 117.002 119.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 117 120 -3 + vertex 117 120 0 + vertex 117.002 119.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -117 120 -3 + vertex 117 120 0 + vertex 117 120 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -117 120 -3 + vertex -117 120 0 + vertex 117 120 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -117.002 119.998 -3 + vertex -117 120 0 + vertex -117 120 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -117.002 119.998 -3 + vertex -117.002 119.998 0 + vertex -117 120 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -117.105 119.998 -3 + vertex -117.002 119.998 0 + vertex -117.002 119.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -117.105 119.998 -3 + vertex -117.105 119.998 0 + vertex -117.002 119.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -117.314 119.984 -3 + vertex -117.105 119.998 0 + vertex -117.105 119.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -117.314 119.984 -3 + vertex -117.314 119.984 0 + vertex -117.105 119.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -117.521 119.954 -3 + vertex -117.314 119.984 0 + vertex -117.314 119.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -117.521 119.954 -3 + vertex -117.521 119.954 0 + vertex -117.314 119.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -117.726 119.911 -3 + vertex -117.521 119.954 0 + vertex -117.521 119.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -117.726 119.911 -3 + vertex -117.726 119.911 0 + vertex -117.521 119.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -117.927 119.853 -3 + vertex -117.726 119.911 0 + vertex -117.726 119.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -117.927 119.853 -3 + vertex -117.927 119.853 0 + vertex -117.726 119.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -118.124 119.782 -3 + vertex -117.927 119.853 0 + vertex -117.927 119.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -118.124 119.782 -3 + vertex -118.124 119.782 0 + vertex -117.927 119.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -118.315 119.696 -3 + vertex -118.124 119.782 0 + vertex -118.124 119.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -118.315 119.696 -3 + vertex -118.315 119.696 0 + vertex -118.124 119.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -118.5 119.598 -3 + vertex -118.315 119.696 0 + vertex -118.315 119.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -118.5 119.598 -3 + vertex -118.5 119.598 0 + vertex -118.315 119.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -118.678 119.487 -3 + vertex -118.5 119.598 0 + vertex -118.5 119.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -118.678 119.487 -3 + vertex -118.678 119.487 0 + vertex -118.5 119.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -118.847 119.364 -3 + vertex -118.678 119.487 0 + vertex -118.678 119.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -118.847 119.364 -3 + vertex -118.847 119.364 0 + vertex -118.678 119.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -119.007 119.229 -3 + vertex -118.847 119.364 0 + vertex -118.847 119.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -119.007 119.229 -3 + vertex -119.007 119.229 0 + vertex -118.847 119.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -119.158 119.084 -3 + vertex -119.007 119.229 0 + vertex -119.007 119.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -119.158 119.084 -3 + vertex -119.158 119.084 0 + vertex -119.007 119.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -119.298 118.928 -3 + vertex -119.158 119.084 0 + vertex -119.158 119.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -119.298 118.928 -3 + vertex -119.298 118.928 0 + vertex -119.158 119.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -119.427 118.763 -3 + vertex -119.298 118.928 0 + vertex -119.298 118.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -119.427 118.763 -3 + vertex -119.427 118.763 0 + vertex -119.298 118.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -119.544 118.59 -3 + vertex -119.427 118.763 0 + vertex -119.427 118.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -119.544 118.59 -3 + vertex -119.544 118.59 0 + vertex -119.427 118.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -119.649 118.408 -3 + vertex -119.544 118.59 0 + vertex -119.544 118.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -119.649 118.408 -3 + vertex -119.649 118.408 0 + vertex -119.544 118.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -119.741 118.22 -3 + vertex -119.649 118.408 0 + vertex -119.649 118.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -119.741 118.22 -3 + vertex -119.741 118.22 0 + vertex -119.649 118.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -119.819 118.026 -3 + vertex -119.741 118.22 0 + vertex -119.741 118.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -119.819 118.026 -3 + vertex -119.819 118.026 0 + vertex -119.741 118.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -119.884 117.827 -3 + vertex -119.819 118.026 0 + vertex -119.819 118.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -119.884 117.827 -3 + vertex -119.884 117.827 0 + vertex -119.819 118.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -119.934 117.624 -3 + vertex -119.884 117.827 0 + vertex -119.884 117.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -119.934 117.624 -3 + vertex -119.934 117.624 0 + vertex -119.884 117.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -119.971 117.418 -3 + vertex -119.934 117.624 0 + vertex -119.934 117.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -119.971 117.418 -3 + vertex -119.971 117.418 0 + vertex -119.934 117.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -119.993 117.209 -3 + vertex -119.971 117.418 0 + vertex -119.971 117.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -119.993 117.209 -3 + vertex -119.993 117.209 0 + vertex -119.971 117.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -120 117 -3 + vertex -119.993 117.209 0 + vertex -119.993 117.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -120 117 -3 + vertex -120 117 0 + vertex -119.993 117.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -120 -117 -3 + vertex -120 117 0 + vertex -120 117 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -120 -117 -3 + vertex -120 -117 0 + vertex -120 117 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -119.993 -117.209 -3 + vertex -120 -117 0 + vertex -120 -117 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -119.993 -117.209 -3 + vertex -119.993 -117.209 0 + vertex -120 -117 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -119.971 -117.418 -3 + vertex -119.993 -117.209 0 + vertex -119.993 -117.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -119.971 -117.418 -3 + vertex -119.971 -117.418 0 + vertex -119.993 -117.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -119.934 -117.624 -3 + vertex -119.971 -117.418 0 + vertex -119.971 -117.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -119.934 -117.624 -3 + vertex -119.934 -117.624 0 + vertex -119.971 -117.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -119.884 -117.827 -3 + vertex -119.934 -117.624 0 + vertex -119.934 -117.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -119.884 -117.827 -3 + vertex -119.884 -117.827 0 + vertex -119.934 -117.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -119.819 -118.026 -3 + vertex -119.884 -117.827 0 + vertex -119.884 -117.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -119.819 -118.026 -3 + vertex -119.819 -118.026 0 + vertex -119.884 -117.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -119.741 -118.22 -3 + vertex -119.819 -118.026 0 + vertex -119.819 -118.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -119.741 -118.22 -3 + vertex -119.741 -118.22 0 + vertex -119.819 -118.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -119.649 -118.408 -3 + vertex -119.741 -118.22 0 + vertex -119.741 -118.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -119.649 -118.408 -3 + vertex -119.649 -118.408 0 + vertex -119.741 -118.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -119.544 -118.59 -3 + vertex -119.649 -118.408 0 + vertex -119.649 -118.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -119.544 -118.59 -3 + vertex -119.544 -118.59 0 + vertex -119.649 -118.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -119.427 -118.763 -3 + vertex -119.544 -118.59 0 + vertex -119.544 -118.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -119.427 -118.763 -3 + vertex -119.427 -118.763 0 + vertex -119.544 -118.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -119.298 -118.928 -3 + vertex -119.427 -118.763 0 + vertex -119.427 -118.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -119.298 -118.928 -3 + vertex -119.298 -118.928 0 + vertex -119.427 -118.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -119.158 -119.084 -3 + vertex -119.298 -118.928 0 + vertex -119.298 -118.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -119.158 -119.084 -3 + vertex -119.158 -119.084 0 + vertex -119.298 -118.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -119.007 -119.229 -3 + vertex -119.158 -119.084 0 + vertex -119.158 -119.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -119.007 -119.229 -3 + vertex -119.007 -119.229 0 + vertex -119.158 -119.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -118.847 -119.364 -3 + vertex -119.007 -119.229 0 + vertex -119.007 -119.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -118.847 -119.364 -3 + vertex -118.847 -119.364 0 + vertex -119.007 -119.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -118.678 -119.487 -3 + vertex -118.847 -119.364 0 + vertex -118.847 -119.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -118.678 -119.487 -3 + vertex -118.678 -119.487 0 + vertex -118.847 -119.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -118.5 -119.598 -3 + vertex -118.678 -119.487 0 + vertex -118.678 -119.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -118.5 -119.598 -3 + vertex -118.5 -119.598 0 + vertex -118.678 -119.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -118.315 -119.696 -3 + vertex -118.5 -119.598 0 + vertex -118.5 -119.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -118.315 -119.696 -3 + vertex -118.315 -119.696 0 + vertex -118.5 -119.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -118.124 -119.782 -3 + vertex -118.315 -119.696 0 + vertex -118.315 -119.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -118.124 -119.782 -3 + vertex -118.124 -119.782 0 + vertex -118.315 -119.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -117.927 -119.853 -3 + vertex -118.124 -119.782 0 + vertex -118.124 -119.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -117.927 -119.853 -3 + vertex -117.927 -119.853 0 + vertex -118.124 -119.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -117.726 -119.911 -3 + vertex -117.927 -119.853 0 + vertex -117.927 -119.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -117.726 -119.911 -3 + vertex -117.726 -119.911 0 + vertex -117.927 -119.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -117.521 -119.954 -3 + vertex -117.726 -119.911 0 + vertex -117.726 -119.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -117.521 -119.954 -3 + vertex -117.521 -119.954 0 + vertex -117.726 -119.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -117.314 -119.984 -3 + vertex -117.521 -119.954 0 + vertex -117.521 -119.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -117.314 -119.984 -3 + vertex -117.314 -119.984 0 + vertex -117.521 -119.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -117.105 -119.998 -3 + vertex -117.314 -119.984 0 + vertex -117.314 -119.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -117.105 -119.998 -3 + vertex -117.105 -119.998 0 + vertex -117.314 -119.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -117.002 -119.998 -3 + vertex -117.105 -119.998 0 + vertex -117.105 -119.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -117.002 -119.998 -3 + vertex -117.002 -119.998 0 + vertex -117.105 -119.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -117 -120 -3 + vertex -117.002 -119.998 0 + vertex -117.002 -119.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -117 -120 -3 + vertex -117 -120 0 + vertex -117.002 -119.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -60 -120 -3 + vertex -117 -120 0 + vertex -117 -120 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -60 -120 -3 + vertex -60 -120 0 + vertex -117 -120 0 + endloop + endfacet + facet normal -0.447214 -0.894427 0 + outer loop + vertex -59.998 -120.001 -3 + vertex -60 -120 0 + vertex -60 -120 -3 + endloop + endfacet + facet normal -0.447214 -0.894427 0 + outer loop + vertex -59.998 -120.001 -3 + vertex -59.998 -120.001 0 + vertex -60 -120 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -59.9302 -120.001 -3 + vertex -59.998 -120.001 0 + vertex -59.998 -120.001 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -59.9302 -120.001 -3 + vertex -59.9302 -120.001 0 + vertex -59.998 -120.001 0 + endloop + endfacet + facet normal -0.0716032 -0.997433 0 + outer loop + vertex -59.7909 -120.011 -3 + vertex -59.9302 -120.001 0 + vertex -59.9302 -120.001 -3 + endloop + endfacet + facet normal -0.0716032 -0.997433 0 + outer loop + vertex -59.7909 -120.011 -3 + vertex -59.7909 -120.011 0 + vertex -59.9302 -120.001 0 + endloop + endfacet + facet normal -0.136201 -0.990681 0 + outer loop + vertex -59.6527 -120.03 -3 + vertex -59.7909 -120.011 0 + vertex -59.7909 -120.011 -3 + endloop + endfacet + facet normal -0.136201 -0.990681 0 + outer loop + vertex -59.6527 -120.03 -3 + vertex -59.6527 -120.03 0 + vertex -59.7909 -120.011 0 + endloop + endfacet + facet normal -0.20767 -0.978199 0 + outer loop + vertex -59.5161 -120.059 -3 + vertex -59.6527 -120.03 0 + vertex -59.6527 -120.03 -3 + endloop + endfacet + facet normal -0.20767 -0.978199 0 + outer loop + vertex -59.5161 -120.059 -3 + vertex -59.5161 -120.059 0 + vertex -59.6527 -120.03 0 + endloop + endfacet + facet normal -0.279258 -0.960216 0 + outer loop + vertex -59.382 -120.098 -3 + vertex -59.5161 -120.059 0 + vertex -59.5161 -120.059 -3 + endloop + endfacet + facet normal -0.279258 -0.960216 0 + outer loop + vertex -59.382 -120.098 -3 + vertex -59.382 -120.098 0 + vertex -59.5161 -120.059 0 + endloop + endfacet + facet normal -0.343582 -0.939123 0 + outer loop + vertex -59.2508 -120.146 -3 + vertex -59.382 -120.098 0 + vertex -59.382 -120.098 -3 + endloop + endfacet + facet normal -0.343582 -0.939123 0 + outer loop + vertex -59.2508 -120.146 -3 + vertex -59.2508 -120.146 0 + vertex -59.382 -120.098 0 + endloop + endfacet + facet normal -0.401873 -0.915696 0 + outer loop + vertex -59.1232 -120.202 -3 + vertex -59.2508 -120.146 0 + vertex -59.2508 -120.146 -3 + endloop + endfacet + facet normal -0.401873 -0.915696 0 + outer loop + vertex -59.1232 -120.202 -3 + vertex -59.1232 -120.202 0 + vertex -59.2508 -120.146 0 + endloop + endfacet + facet normal -0.472221 -0.88148 0 + outer loop + vertex -59 -120.268 -3 + vertex -59.1232 -120.202 0 + vertex -59.1232 -120.202 -3 + endloop + endfacet + facet normal -0.472221 -0.88148 0 + outer loop + vertex -59 -120.268 -3 + vertex -59 -120.268 0 + vertex -59.1232 -120.202 0 + endloop + endfacet + facet normal -0.529999 -0.847998 0 + outer loop + vertex -58.8816 -120.342 -3 + vertex -59 -120.268 0 + vertex -59 -120.268 -3 + endloop + endfacet + facet normal -0.529999 -0.847998 0 + outer loop + vertex -58.8816 -120.342 -3 + vertex -58.8816 -120.342 0 + vertex -59 -120.268 0 + endloop + endfacet + facet normal -0.58766 -0.809108 0 + outer loop + vertex -58.7687 -120.424 -3 + vertex -58.8816 -120.342 0 + vertex -58.8816 -120.342 -3 + endloop + endfacet + facet normal -0.58766 -0.809108 0 + outer loop + vertex -58.7687 -120.424 -3 + vertex -58.7687 -120.424 0 + vertex -58.8816 -120.342 0 + endloop + endfacet + facet normal -0.643695 -0.765282 0 + outer loop + vertex -58.6617 -120.514 -3 + vertex -58.7687 -120.424 0 + vertex -58.7687 -120.424 -3 + endloop + endfacet + facet normal -0.643695 -0.765282 0 + outer loop + vertex -58.6617 -120.514 -3 + vertex -58.6617 -120.514 0 + vertex -58.7687 -120.424 0 + endloop + endfacet + facet normal -0.694825 -0.719179 0 + outer loop + vertex -58.5613 -120.611 -3 + vertex -58.6617 -120.514 0 + vertex -58.6617 -120.514 -3 + endloop + endfacet + facet normal -0.694825 -0.719179 0 + outer loop + vertex -58.5613 -120.611 -3 + vertex -58.5613 -120.611 0 + vertex -58.6617 -120.514 0 + endloop + endfacet + facet normal -0.740786 -0.671742 0 + outer loop + vertex -58.4679 -120.714 -3 + vertex -58.5613 -120.611 0 + vertex -58.5613 -120.611 -3 + endloop + endfacet + facet normal -0.740786 -0.671742 0 + outer loop + vertex -58.4679 -120.714 -3 + vertex -58.4679 -120.714 0 + vertex -58.5613 -120.611 0 + endloop + endfacet + facet normal -0.788155 -0.615477 0 + outer loop + vertex -58.382 -120.824 -3 + vertex -58.4679 -120.714 0 + vertex -58.4679 -120.714 -3 + endloop + endfacet + facet normal -0.788155 -0.615477 0 + outer loop + vertex -58.382 -120.824 -3 + vertex -58.382 -120.824 0 + vertex -58.4679 -120.714 0 + endloop + endfacet + facet normal -0.829511 -0.55849 0 + outer loop + vertex -58.3039 -120.94 -3 + vertex -58.382 -120.824 0 + vertex -58.382 -120.824 -3 + endloop + endfacet + facet normal -0.829511 -0.55849 0 + outer loop + vertex -58.3039 -120.94 -3 + vertex -58.3039 -120.94 0 + vertex -58.382 -120.824 0 + endloop + endfacet + facet normal -0.866209 -0.499681 0 + outer loop + vertex -58.2341 -121.061 -3 + vertex -58.3039 -120.94 0 + vertex -58.3039 -120.94 -3 + endloop + endfacet + facet normal -0.866209 -0.499681 0 + outer loop + vertex -58.2341 -121.061 -3 + vertex -58.2341 -121.061 0 + vertex -58.3039 -120.94 0 + endloop + endfacet + facet normal -0.897102 -0.441823 0 + outer loop + vertex -58.2144 -121.101 -3 + vertex -58.2341 -121.061 0 + vertex -58.2341 -121.061 -3 + endloop + endfacet + facet normal -0.897102 -0.441823 0 + outer loop + vertex -58.2144 -121.101 -3 + vertex -58.2144 -121.101 0 + vertex -58.2341 -121.061 0 + endloop + endfacet + facet normal -0.50702 -0.861934 0 + outer loop + vertex -58.2127 -121.102 -3 + vertex -58.2144 -121.101 0 + vertex -58.2144 -121.101 -3 + endloop + endfacet + facet normal -0.50702 -0.861934 0 + outer loop + vertex -58.2127 -121.102 -3 + vertex -58.2127 -121.102 0 + vertex -58.2144 -121.101 0 + endloop + endfacet + facet normal -0.89366 -0.448744 0 + outer loop + vertex -51.7873 -133.898 -3 + vertex -58.2127 -121.102 0 + vertex -58.2127 -121.102 -3 + endloop + endfacet + facet normal -0.89366 -0.448744 0 + outer loop + vertex -51.7873 -133.898 -3 + vertex -51.7873 -133.898 0 + vertex -58.2127 -121.102 0 + endloop + endfacet + facet normal -0.50702 -0.861934 0 + outer loop + vertex -51.7856 -133.899 -3 + vertex -51.7873 -133.898 0 + vertex -51.7873 -133.898 -3 + endloop + endfacet + facet normal -0.50702 -0.861934 0 + outer loop + vertex -51.7856 -133.899 -3 + vertex -51.7856 -133.899 0 + vertex -51.7873 -133.898 0 + endloop + endfacet + facet normal -0.897102 -0.441823 0 + outer loop + vertex -51.7659 -133.939 -3 + vertex -51.7856 -133.899 0 + vertex -51.7856 -133.899 -3 + endloop + endfacet + facet normal -0.897102 -0.441823 0 + outer loop + vertex -51.7659 -133.939 -3 + vertex -51.7659 -133.939 0 + vertex -51.7856 -133.899 0 + endloop + endfacet + facet normal -0.866209 -0.499681 0 + outer loop + vertex -51.6961 -134.06 -3 + vertex -51.7659 -133.939 0 + vertex -51.7659 -133.939 -3 + endloop + endfacet + facet normal -0.866209 -0.499681 0 + outer loop + vertex -51.6961 -134.06 -3 + vertex -51.6961 -134.06 0 + vertex -51.7659 -133.939 0 + endloop + endfacet + facet normal -0.829511 -0.55849 0 + outer loop + vertex -51.618 -134.176 -3 + vertex -51.6961 -134.06 0 + vertex -51.6961 -134.06 -3 + endloop + endfacet + facet normal -0.829511 -0.55849 0 + outer loop + vertex -51.618 -134.176 -3 + vertex -51.618 -134.176 0 + vertex -51.6961 -134.06 0 + endloop + endfacet + facet normal -0.788155 -0.615477 0 + outer loop + vertex -51.5321 -134.286 -3 + vertex -51.618 -134.176 0 + vertex -51.618 -134.176 -3 + endloop + endfacet + facet normal -0.788155 -0.615477 0 + outer loop + vertex -51.5321 -134.286 -3 + vertex -51.5321 -134.286 0 + vertex -51.618 -134.176 0 + endloop + endfacet + facet normal -0.740786 -0.671742 0 + outer loop + vertex -51.4387 -134.389 -3 + vertex -51.5321 -134.286 0 + vertex -51.5321 -134.286 -3 + endloop + endfacet + facet normal -0.740786 -0.671742 0 + outer loop + vertex -51.4387 -134.389 -3 + vertex -51.4387 -134.389 0 + vertex -51.5321 -134.286 0 + endloop + endfacet + facet normal -0.694825 -0.719179 0 + outer loop + vertex -51.3383 -134.486 -3 + vertex -51.4387 -134.389 0 + vertex -51.4387 -134.389 -3 + endloop + endfacet + facet normal -0.694825 -0.719179 0 + outer loop + vertex -51.3383 -134.486 -3 + vertex -51.3383 -134.486 0 + vertex -51.4387 -134.389 0 + endloop + endfacet + facet normal -0.643695 -0.765282 0 + outer loop + vertex -51.2313 -134.576 -3 + vertex -51.3383 -134.486 0 + vertex -51.3383 -134.486 -3 + endloop + endfacet + facet normal -0.643695 -0.765282 0 + outer loop + vertex -51.2313 -134.576 -3 + vertex -51.2313 -134.576 0 + vertex -51.3383 -134.486 0 + endloop + endfacet + facet normal -0.58766 -0.809108 0 + outer loop + vertex -51.1184 -134.658 -3 + vertex -51.2313 -134.576 0 + vertex -51.2313 -134.576 -3 + endloop + endfacet + facet normal -0.58766 -0.809108 0 + outer loop + vertex -51.1184 -134.658 -3 + vertex -51.1184 -134.658 0 + vertex -51.2313 -134.576 0 + endloop + endfacet + facet normal -0.529999 -0.847998 0 + outer loop + vertex -51 -134.732 -3 + vertex -51.1184 -134.658 0 + vertex -51.1184 -134.658 -3 + endloop + endfacet + facet normal -0.529999 -0.847998 0 + outer loop + vertex -51 -134.732 -3 + vertex -51 -134.732 0 + vertex -51.1184 -134.658 0 + endloop + endfacet + facet normal -0.471924 -0.881639 0 + outer loop + vertex -50.8767 -134.798 -3 + vertex -51 -134.732 0 + vertex -51 -134.732 -3 + endloop + endfacet + facet normal -0.471924 -0.881639 0 + outer loop + vertex -50.8767 -134.798 -3 + vertex -50.8767 -134.798 0 + vertex -51 -134.732 0 + endloop + endfacet + facet normal -0.402137 -0.91558 0 + outer loop + vertex -50.7492 -134.854 -3 + vertex -50.8767 -134.798 0 + vertex -50.8767 -134.798 -3 + endloop + endfacet + facet normal -0.402137 -0.91558 0 + outer loop + vertex -50.7492 -134.854 -3 + vertex -50.7492 -134.854 0 + vertex -50.8767 -134.798 0 + endloop + endfacet + facet normal -0.343582 -0.939123 0 + outer loop + vertex -50.618 -134.902 -3 + vertex -50.7492 -134.854 0 + vertex -50.7492 -134.854 -3 + endloop + endfacet + facet normal -0.343582 -0.939123 0 + outer loop + vertex -50.618 -134.902 -3 + vertex -50.618 -134.902 0 + vertex -50.7492 -134.854 0 + endloop + endfacet + facet normal -0.279066 -0.960272 0 + outer loop + vertex -50.4838 -134.941 -3 + vertex -50.618 -134.902 0 + vertex -50.618 -134.902 -3 + endloop + endfacet + facet normal -0.279066 -0.960272 0 + outer loop + vertex -50.4838 -134.941 -3 + vertex -50.4838 -134.941 0 + vertex -50.618 -134.902 0 + endloop + endfacet + facet normal -0.207816 -0.978168 0 + outer loop + vertex -50.3473 -134.97 -3 + vertex -50.4838 -134.941 0 + vertex -50.4838 -134.941 -3 + endloop + endfacet + facet normal -0.207816 -0.978168 0 + outer loop + vertex -50.3473 -134.97 -3 + vertex -50.3473 -134.97 0 + vertex -50.4838 -134.941 0 + endloop + endfacet + facet normal -0.136104 -0.990695 0 + outer loop + vertex -50.209 -134.989 -3 + vertex -50.3473 -134.97 0 + vertex -50.3473 -134.97 -3 + endloop + endfacet + facet normal -0.136104 -0.990695 0 + outer loop + vertex -50.209 -134.989 -3 + vertex -50.209 -134.989 0 + vertex -50.3473 -134.97 0 + endloop + endfacet + facet normal -0.0716544 -0.99743 0 + outer loop + vertex -50.0698 -134.999 -3 + vertex -50.209 -134.989 0 + vertex -50.209 -134.989 -3 + endloop + endfacet + facet normal -0.0716544 -0.99743 0 + outer loop + vertex -50.0698 -134.999 -3 + vertex -50.0698 -134.999 0 + vertex -50.209 -134.989 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -50.002 -134.999 -3 + vertex -50.0698 -134.999 0 + vertex -50.0698 -134.999 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -50.002 -134.999 -3 + vertex -50.002 -134.999 0 + vertex -50.0698 -134.999 0 + endloop + endfacet + facet normal -0.447214 -0.894427 0 + outer loop + vertex -50 -135 -3 + vertex -50.002 -134.999 0 + vertex -50.002 -134.999 -3 + endloop + endfacet + facet normal -0.447214 -0.894427 0 + outer loop + vertex -50 -135 -3 + vertex -50 -135 0 + vertex -50.002 -134.999 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 50 -135 -3 + vertex -50 -135 0 + vertex -50 -135 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 50 -135 -3 + vertex 50 -135 0 + vertex -50 -135 0 + endloop + endfacet + facet normal 0.447214 -0.894427 0 + outer loop + vertex 50.002 -134.999 -3 + vertex 50 -135 0 + vertex 50 -135 -3 + endloop + endfacet + facet normal 0.447214 -0.894427 0 + outer loop + vertex 50.002 -134.999 -3 + vertex 50.002 -134.999 0 + vertex 50 -135 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/Creality/ender5plus.svg b/resources/profiles/Creality/ender5plus.svg new file mode 100644 index 0000000000..b5ac0b0161 --- /dev/null +++ b/resources/profiles/Creality/ender5plus.svg @@ -0,0 +1,4 @@ + + + + diff --git a/resources/profiles/Creality/ender5plus_bed.stl b/resources/profiles/Creality/ender5plus_bed.stl new file mode 100644 index 0000000000..f2d17bd40c --- /dev/null +++ b/resources/profiles/Creality/ender5plus_bed.stl @@ -0,0 +1,2774 @@ +solid OpenSCAD_Model + facet normal 0 0 -1 + outer loop + vertex 182.105 -184.998 -3 + vertex 182.002 -184.998 -3 + vertex 182.314 -184.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.314 -184.984 -3 + vertex 182.002 -184.998 -3 + vertex 182.521 -184.954 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 185 -182 -3 + vertex 182.002 -184.998 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.521 -184.954 -3 + vertex 182.002 -184.998 -3 + vertex 182.726 -184.911 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.726 -184.911 -3 + vertex 182.002 -184.998 -3 + vertex 182.927 -184.853 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.927 -184.853 -3 + vertex 182.002 -184.998 -3 + vertex 183.124 -184.782 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.124 -184.782 -3 + vertex 182.002 -184.998 -3 + vertex 183.315 -184.696 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.315 -184.696 -3 + vertex 182.002 -184.998 -3 + vertex 183.5 -184.598 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.5 -184.598 -3 + vertex 182.002 -184.998 -3 + vertex 183.678 -184.487 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.678 -184.487 -3 + vertex 182.002 -184.998 -3 + vertex 183.847 -184.364 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 183.847 -184.364 -3 + vertex 182.002 -184.998 -3 + vertex 184.007 -184.229 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.007 -184.229 -3 + vertex 182.002 -184.998 -3 + vertex 184.158 -184.084 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.158 -184.084 -3 + vertex 182.002 -184.998 -3 + vertex 184.298 -183.928 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.298 -183.928 -3 + vertex 182.002 -184.998 -3 + vertex 184.427 -183.763 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.427 -183.763 -3 + vertex 182.002 -184.998 -3 + vertex 184.544 -183.59 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.544 -183.59 -3 + vertex 182.002 -184.998 -3 + vertex 184.649 -183.408 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.649 -183.408 -3 + vertex 182.002 -184.998 -3 + vertex 184.741 -183.22 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.741 -183.22 -3 + vertex 182.002 -184.998 -3 + vertex 184.819 -183.026 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.819 -183.026 -3 + vertex 182.002 -184.998 -3 + vertex 184.884 -182.827 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.884 -182.827 -3 + vertex 182.002 -184.998 -3 + vertex 184.934 -182.624 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.934 -182.624 -3 + vertex 182.002 -184.998 -3 + vertex 184.971 -182.418 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.971 -182.418 -3 + vertex 182.002 -184.998 -3 + vertex 184.993 -182.209 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 184.993 -182.209 -3 + vertex 182.002 -184.998 -3 + vertex 185 -182 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 185 -182 -3 + vertex 182.002 184.998 -3 + vertex 185 182 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 184.971 182.418 -3 + vertex 184.993 182.209 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 184.884 182.827 -3 + vertex 184.934 182.624 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 184.741 183.22 -3 + vertex 182.002 184.998 -3 + vertex 184.649 183.408 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 184.741 183.22 -3 + vertex 184.819 183.026 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 184.007 184.229 -3 + vertex 184.158 184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 184.427 183.763 -3 + vertex 182.002 184.998 -3 + vertex 184.298 183.928 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 184.427 183.763 -3 + vertex 184.544 183.59 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 184.298 183.928 -3 + vertex 182.002 184.998 -3 + vertex 184.158 184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 182.927 184.853 -3 + vertex 183.124 184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 183.847 184.364 -3 + vertex 182.002 184.998 -3 + vertex 183.678 184.487 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 183.847 184.364 -3 + vertex 184.007 184.229 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 183.678 184.487 -3 + vertex 182.002 184.998 -3 + vertex 183.5 184.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 183.5 184.598 -3 + vertex 182.002 184.998 -3 + vertex 183.315 184.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 183.315 184.696 -3 + vertex 182.002 184.998 -3 + vertex 183.124 184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 184.649 183.408 -3 + vertex 182.002 184.998 -3 + vertex 184.544 183.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.726 184.911 -3 + vertex 182.002 184.998 -3 + vertex 182.521 184.954 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 182.726 184.911 -3 + vertex 182.927 184.853 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 184.819 183.026 -3 + vertex 184.884 182.827 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal -0 -0 -1 + outer loop + vertex 182.314 184.984 -3 + vertex 182.521 184.954 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 184.934 182.624 -3 + vertex 184.971 182.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 184.998 -3 + vertex 182.105 184.998 -3 + vertex 182.314 184.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 185 182 -3 + vertex 182.002 184.998 -3 + vertex 184.993 182.209 -3 + endloop + endfacet + facet normal 0 -0 -1 + outer loop + vertex -182 185 -3 + vertex 182 185 -3 + vertex -182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex 182 185 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 -184.998 -3 + vertex -182.002 184.998 -3 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -185 -182 -3 + vertex -185 182 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -182.314 184.984 -3 + vertex -182.105 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -182.521 184.954 -3 + vertex -182.314 184.984 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -182.726 184.911 -3 + vertex -182.521 184.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -182.927 184.853 -3 + vertex -182.726 184.911 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.124 184.782 -3 + vertex -182.927 184.853 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.315 184.696 -3 + vertex -183.124 184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.5 184.598 -3 + vertex -183.315 184.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.678 184.487 -3 + vertex -183.5 184.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -183.847 184.364 -3 + vertex -183.678 184.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.007 184.229 -3 + vertex -183.847 184.364 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.158 184.084 -3 + vertex -184.007 184.229 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.298 183.928 -3 + vertex -184.158 184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.427 183.763 -3 + vertex -184.298 183.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.544 183.59 -3 + vertex -184.427 183.763 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.649 183.408 -3 + vertex -184.544 183.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.741 183.22 -3 + vertex -184.649 183.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.819 183.026 -3 + vertex -184.741 183.22 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.884 182.827 -3 + vertex -184.819 183.026 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.934 182.624 -3 + vertex -184.884 182.827 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.971 182.418 -3 + vertex -184.934 182.624 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -184.993 182.209 -3 + vertex -184.971 182.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 184.998 -3 + vertex -185 182 -3 + vertex -184.993 182.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -185 182 -3 + vertex -182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 182.002 -184.998 -3 + vertex -182.002 -184.998 -3 + vertex -182.002 184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -184.971 -182.418 -3 + vertex -184.993 -182.209 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.884 -182.827 -3 + vertex -184.934 -182.624 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.741 -183.22 -3 + vertex -182.002 -184.998 -3 + vertex -184.649 -183.408 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.741 -183.22 -3 + vertex -184.819 -183.026 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -184.007 -184.229 -3 + vertex -184.158 -184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.427 -183.763 -3 + vertex -182.002 -184.998 -3 + vertex -184.298 -183.928 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.427 -183.763 -3 + vertex -184.544 -183.59 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.298 -183.928 -3 + vertex -182.002 -184.998 -3 + vertex -184.158 -184.084 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -182.927 -184.853 -3 + vertex -183.124 -184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.847 -184.364 -3 + vertex -182.002 -184.998 -3 + vertex -183.678 -184.487 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.847 -184.364 -3 + vertex -184.007 -184.229 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.678 -184.487 -3 + vertex -182.002 -184.998 -3 + vertex -183.5 -184.598 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.5 -184.598 -3 + vertex -182.002 -184.998 -3 + vertex -183.315 -184.696 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -183.315 -184.696 -3 + vertex -182.002 -184.998 -3 + vertex -183.124 -184.782 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.649 -183.408 -3 + vertex -182.002 -184.998 -3 + vertex -184.544 -183.59 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.726 -184.911 -3 + vertex -182.002 -184.998 -3 + vertex -182.521 -184.954 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.726 -184.911 -3 + vertex -182.927 -184.853 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -184.819 -183.026 -3 + vertex -184.884 -182.827 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.314 -184.984 -3 + vertex -182.521 -184.954 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -184.934 -182.624 -3 + vertex -184.971 -182.418 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex -182.105 -184.998 -3 + vertex -182.314 -184.984 -3 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 182.002 -184.998 -3 + vertex 182 -185 -3 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -182.002 -184.998 -3 + vertex 182 -185 -3 + vertex -182 -185 -3 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -185 -182 -3 + vertex -182.002 -184.998 -3 + vertex -184.993 -182.209 -3 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.314 -184.984 0 + vertex 182.002 -184.998 0 + vertex 182.105 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.521 -184.954 0 + vertex 182.002 -184.998 0 + vertex 182.314 -184.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 182.002 -184.998 0 + vertex 185 -182 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.726 -184.911 0 + vertex 182.002 -184.998 0 + vertex 182.521 -184.954 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.927 -184.853 0 + vertex 182.002 -184.998 0 + vertex 182.726 -184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.124 -184.782 0 + vertex 182.002 -184.998 0 + vertex 182.927 -184.853 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.315 -184.696 0 + vertex 182.002 -184.998 0 + vertex 183.124 -184.782 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.5 -184.598 0 + vertex 182.002 -184.998 0 + vertex 183.315 -184.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.678 -184.487 0 + vertex 182.002 -184.998 0 + vertex 183.5 -184.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.847 -184.364 0 + vertex 182.002 -184.998 0 + vertex 183.678 -184.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.007 -184.229 0 + vertex 182.002 -184.998 0 + vertex 183.847 -184.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.158 -184.084 0 + vertex 182.002 -184.998 0 + vertex 184.007 -184.229 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.298 -183.928 0 + vertex 182.002 -184.998 0 + vertex 184.158 -184.084 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.427 -183.763 0 + vertex 182.002 -184.998 0 + vertex 184.298 -183.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.544 -183.59 0 + vertex 182.002 -184.998 0 + vertex 184.427 -183.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.649 -183.408 0 + vertex 182.002 -184.998 0 + vertex 184.544 -183.59 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.741 -183.22 0 + vertex 182.002 -184.998 0 + vertex 184.649 -183.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.819 -183.026 0 + vertex 182.002 -184.998 0 + vertex 184.741 -183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.884 -182.827 0 + vertex 182.002 -184.998 0 + vertex 184.819 -183.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.934 -182.624 0 + vertex 182.002 -184.998 0 + vertex 184.884 -182.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.971 -182.418 0 + vertex 182.002 -184.998 0 + vertex 184.934 -182.624 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.993 -182.209 0 + vertex 182.002 -184.998 0 + vertex 184.971 -182.418 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 185 -182 0 + vertex 182.002 -184.998 0 + vertex 184.993 -182.209 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 185 182 0 + vertex 182.002 184.998 0 + vertex 185 -182 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.993 182.209 0 + vertex 184.971 182.418 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.934 182.624 0 + vertex 184.884 182.827 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.649 183.408 0 + vertex 182.002 184.998 0 + vertex 184.741 183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.819 183.026 0 + vertex 184.741 183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.158 184.084 0 + vertex 184.007 184.229 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.298 183.928 0 + vertex 182.002 184.998 0 + vertex 184.427 183.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.544 183.59 0 + vertex 184.427 183.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.158 184.084 0 + vertex 182.002 184.998 0 + vertex 184.298 183.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.124 184.782 0 + vertex 182.927 184.853 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.678 184.487 0 + vertex 182.002 184.998 0 + vertex 183.847 184.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.007 184.229 0 + vertex 183.847 184.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.5 184.598 0 + vertex 182.002 184.998 0 + vertex 183.678 184.487 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.315 184.696 0 + vertex 182.002 184.998 0 + vertex 183.5 184.598 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 183.124 184.782 0 + vertex 182.002 184.998 0 + vertex 183.315 184.696 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.544 183.59 0 + vertex 182.002 184.998 0 + vertex 184.649 183.408 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.521 184.954 0 + vertex 182.002 184.998 0 + vertex 182.726 184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 182.927 184.853 0 + vertex 182.726 184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 184.884 182.827 0 + vertex 184.819 183.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 182.521 184.954 0 + vertex 182.314 184.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.971 182.418 0 + vertex 184.934 182.624 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.314 184.984 0 + vertex 182.105 184.998 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 184.993 182.209 0 + vertex 182.002 184.998 0 + vertex 185 182 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 184.998 0 + vertex 182 185 0 + vertex -182 185 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex 182 185 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 182.002 184.998 0 + vertex -182.002 184.998 0 + vertex 182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -185 182 0 + vertex -185 -182 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.105 184.998 0 + vertex -182.314 184.984 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.314 184.984 0 + vertex -182.521 184.954 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.521 184.954 0 + vertex -182.726 184.911 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.726 184.911 0 + vertex -182.927 184.853 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.927 184.853 0 + vertex -183.124 184.782 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.124 184.782 0 + vertex -183.315 184.696 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.315 184.696 0 + vertex -183.5 184.598 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.5 184.598 0 + vertex -183.678 184.487 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.678 184.487 0 + vertex -183.847 184.364 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -183.847 184.364 0 + vertex -184.007 184.229 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.007 184.229 0 + vertex -184.158 184.084 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.158 184.084 0 + vertex -184.298 183.928 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.298 183.928 0 + vertex -184.427 183.763 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.427 183.763 0 + vertex -184.544 183.59 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.544 183.59 0 + vertex -184.649 183.408 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.649 183.408 0 + vertex -184.741 183.22 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.741 183.22 0 + vertex -184.819 183.026 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.819 183.026 0 + vertex -184.884 182.827 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.884 182.827 0 + vertex -184.934 182.624 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.934 182.624 0 + vertex -184.971 182.418 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.971 182.418 0 + vertex -184.993 182.209 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -184.993 182.209 0 + vertex -185 182 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 184.998 0 + vertex -185 182 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 184.998 0 + vertex -182.002 -184.998 0 + vertex 182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -184.993 -182.209 0 + vertex -184.971 -182.418 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.934 -182.624 0 + vertex -184.884 -182.827 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.649 -183.408 0 + vertex -182.002 -184.998 0 + vertex -184.741 -183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.819 -183.026 0 + vertex -184.741 -183.22 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -184.158 -184.084 0 + vertex -184.007 -184.229 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.298 -183.928 0 + vertex -182.002 -184.998 0 + vertex -184.427 -183.763 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.544 -183.59 0 + vertex -184.427 -183.763 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.158 -184.084 0 + vertex -182.002 -184.998 0 + vertex -184.298 -183.928 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -183.124 -184.782 0 + vertex -182.927 -184.853 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -183.678 -184.487 0 + vertex -182.002 -184.998 0 + vertex -183.847 -184.364 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.007 -184.229 0 + vertex -183.847 -184.364 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -183.5 -184.598 0 + vertex -182.002 -184.998 0 + vertex -183.678 -184.487 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -183.315 -184.696 0 + vertex -182.002 -184.998 0 + vertex -183.5 -184.598 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -183.124 -184.782 0 + vertex -182.002 -184.998 0 + vertex -183.315 -184.696 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.544 -183.59 0 + vertex -182.002 -184.998 0 + vertex -184.649 -183.408 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -182.521 -184.954 0 + vertex -182.002 -184.998 0 + vertex -182.726 -184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -182.927 -184.853 0 + vertex -182.726 -184.911 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -184.884 -182.827 0 + vertex -184.819 -183.026 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex -182.521 -184.954 0 + vertex -182.314 -184.984 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -184.971 -182.418 0 + vertex -184.934 -182.624 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -182.314 -184.984 0 + vertex -182.105 -184.998 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -182.002 -184.998 0 + vertex 182 -185 0 + vertex 182.002 -184.998 0 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -182 -185 0 + vertex 182 -185 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal -0 -0 1 + outer loop + vertex -184.993 -182.209 0 + vertex -182.002 -184.998 0 + vertex -185 -182 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 182.105 -184.998 -3 + vertex 182.002 -184.998 0 + vertex 182.002 -184.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 182.105 -184.998 -3 + vertex 182.105 -184.998 0 + vertex 182.002 -184.998 0 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 182.314 -184.984 -3 + vertex 182.105 -184.998 0 + vertex 182.105 -184.998 -3 + endloop + endfacet + facet normal 0.0668359 -0.997764 0 + outer loop + vertex 182.314 -184.984 -3 + vertex 182.314 -184.984 0 + vertex 182.105 -184.998 0 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 182.521 -184.954 -3 + vertex 182.314 -184.984 0 + vertex 182.314 -184.984 -3 + endloop + endfacet + facet normal 0.143429 -0.989661 0 + outer loop + vertex 182.521 -184.954 -3 + vertex 182.521 -184.954 0 + vertex 182.314 -184.984 0 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 182.726 -184.911 -3 + vertex 182.521 -184.954 0 + vertex 182.521 -184.954 -3 + endloop + endfacet + facet normal 0.205289 -0.978701 0 + outer loop + vertex 182.726 -184.911 -3 + vertex 182.726 -184.911 0 + vertex 182.521 -184.954 0 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 182.927 -184.853 -3 + vertex 182.726 -184.911 0 + vertex 182.726 -184.911 -3 + endloop + endfacet + facet normal 0.277246 -0.960799 0 + outer loop + vertex 182.927 -184.853 -3 + vertex 182.927 -184.853 0 + vertex 182.726 -184.911 0 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 183.124 -184.782 -3 + vertex 182.927 -184.853 0 + vertex 182.927 -184.853 -3 + endloop + endfacet + facet normal 0.339058 -0.940766 0 + outer loop + vertex 183.124 -184.782 -3 + vertex 183.124 -184.782 0 + vertex 182.927 -184.853 0 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 183.315 -184.696 -3 + vertex 183.124 -184.782 0 + vertex 183.124 -184.782 -3 + endloop + endfacet + facet normal 0.410563 -0.911832 0 + outer loop + vertex 183.315 -184.696 -3 + vertex 183.315 -184.696 0 + vertex 183.124 -184.782 0 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 183.5 -184.598 -3 + vertex 183.315 -184.696 0 + vertex 183.315 -184.696 -3 + endloop + endfacet + facet normal 0.468107 -0.883672 0 + outer loop + vertex 183.5 -184.598 -3 + vertex 183.5 -184.598 0 + vertex 183.315 -184.696 0 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 183.678 -184.487 -3 + vertex 183.5 -184.598 0 + vertex 183.5 -184.598 -3 + endloop + endfacet + facet normal 0.529142 -0.848533 0 + outer loop + vertex 183.678 -184.487 -3 + vertex 183.678 -184.487 0 + vertex 183.5 -184.598 0 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 183.847 -184.364 -3 + vertex 183.678 -184.487 0 + vertex 183.678 -184.487 -3 + endloop + endfacet + facet normal 0.588456 -0.808529 0 + outer loop + vertex 183.847 -184.364 -3 + vertex 183.847 -184.364 0 + vertex 183.678 -184.487 0 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 184.007 -184.229 -3 + vertex 183.847 -184.364 0 + vertex 183.847 -184.364 -3 + endloop + endfacet + facet normal 0.644871 -0.764291 0 + outer loop + vertex 184.007 -184.229 -3 + vertex 184.007 -184.229 0 + vertex 183.847 -184.364 0 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 184.158 -184.084 -3 + vertex 184.007 -184.229 0 + vertex 184.007 -184.229 -3 + endloop + endfacet + facet normal 0.692631 -0.721292 0 + outer loop + vertex 184.158 -184.084 -3 + vertex 184.158 -184.084 0 + vertex 184.007 -184.229 0 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 184.298 -183.928 -3 + vertex 184.158 -184.084 0 + vertex 184.158 -184.084 -3 + endloop + endfacet + facet normal 0.744242 -0.66791 0 + outer loop + vertex 184.298 -183.928 -3 + vertex 184.298 -183.928 0 + vertex 184.158 -184.084 0 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 184.427 -183.763 -3 + vertex 184.298 -183.928 0 + vertex 184.298 -183.928 -3 + endloop + endfacet + facet normal 0.787807 -0.615922 0 + outer loop + vertex 184.427 -183.763 -3 + vertex 184.427 -183.763 0 + vertex 184.298 -183.928 0 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 184.544 -183.59 -3 + vertex 184.427 -183.763 0 + vertex 184.427 -183.763 -3 + endloop + endfacet + facet normal 0.828349 -0.560213 0 + outer loop + vertex 184.544 -183.59 -3 + vertex 184.544 -183.59 0 + vertex 184.427 -183.763 0 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 184.649 -183.408 -3 + vertex 184.544 -183.59 0 + vertex 184.544 -183.59 -3 + endloop + endfacet + facet normal 0.866186 -0.499722 0 + outer loop + vertex 184.649 -183.408 -3 + vertex 184.649 -183.408 0 + vertex 184.544 -183.59 0 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 184.741 -183.22 -3 + vertex 184.649 -183.408 0 + vertex 184.649 -183.408 -3 + endloop + endfacet + facet normal 0.898217 -0.439553 0 + outer loop + vertex 184.741 -183.22 -3 + vertex 184.741 -183.22 0 + vertex 184.649 -183.408 0 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 184.819 -183.026 -3 + vertex 184.741 -183.22 0 + vertex 184.741 -183.22 -3 + endloop + endfacet + facet normal 0.927816 -0.373039 0 + outer loop + vertex 184.819 -183.026 -3 + vertex 184.819 -183.026 0 + vertex 184.741 -183.22 0 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 184.884 -182.827 -3 + vertex 184.819 -183.026 0 + vertex 184.819 -183.026 -3 + endloop + endfacet + facet normal 0.950577 -0.31049 0 + outer loop + vertex 184.884 -182.827 -3 + vertex 184.884 -182.827 0 + vertex 184.819 -183.026 0 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 184.934 -182.624 -3 + vertex 184.884 -182.827 0 + vertex 184.884 -182.827 -3 + endloop + endfacet + facet normal 0.970981 -0.239158 0 + outer loop + vertex 184.934 -182.624 -3 + vertex 184.934 -182.624 0 + vertex 184.884 -182.827 0 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 184.971 -182.418 -3 + vertex 184.934 -182.624 0 + vertex 184.934 -182.624 -3 + endloop + endfacet + facet normal 0.98425 -0.176783 0 + outer loop + vertex 184.971 -182.418 -3 + vertex 184.971 -182.418 0 + vertex 184.934 -182.624 0 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 184.993 -182.209 -3 + vertex 184.971 -182.418 0 + vertex 184.971 -182.418 -3 + endloop + endfacet + facet normal 0.994505 -0.104685 0 + outer loop + vertex 184.993 -182.209 -3 + vertex 184.993 -182.209 0 + vertex 184.971 -182.418 0 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 185 -182 -3 + vertex 184.993 -182.209 0 + vertex 184.993 -182.209 -3 + endloop + endfacet + facet normal 0.99944 -0.0334741 0 + outer loop + vertex 185 -182 -3 + vertex 185 -182 0 + vertex 184.993 -182.209 0 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 185 182 -3 + vertex 185 -182 0 + vertex 185 -182 -3 + endloop + endfacet + facet normal 1 0 -0 + outer loop + vertex 185 182 -3 + vertex 185 182 0 + vertex 185 -182 0 + endloop + endfacet + facet normal 0.99944 0.0334741 0 + outer loop + vertex 184.993 182.209 -3 + vertex 185 182 0 + vertex 185 182 -3 + endloop + endfacet + facet normal 0.99944 0.0334741 -0 + outer loop + vertex 184.993 182.209 -3 + vertex 184.993 182.209 0 + vertex 185 182 0 + endloop + endfacet + facet normal 0.994505 0.104685 0 + outer loop + vertex 184.971 182.418 -3 + vertex 184.993 182.209 0 + vertex 184.993 182.209 -3 + endloop + endfacet + facet normal 0.994505 0.104685 -0 + outer loop + vertex 184.971 182.418 -3 + vertex 184.971 182.418 0 + vertex 184.993 182.209 0 + endloop + endfacet + facet normal 0.98425 0.176783 0 + outer loop + vertex 184.934 182.624 -3 + vertex 184.971 182.418 0 + vertex 184.971 182.418 -3 + endloop + endfacet + facet normal 0.98425 0.176783 -0 + outer loop + vertex 184.934 182.624 -3 + vertex 184.934 182.624 0 + vertex 184.971 182.418 0 + endloop + endfacet + facet normal 0.970981 0.239158 0 + outer loop + vertex 184.884 182.827 -3 + vertex 184.934 182.624 0 + vertex 184.934 182.624 -3 + endloop + endfacet + facet normal 0.970981 0.239158 -0 + outer loop + vertex 184.884 182.827 -3 + vertex 184.884 182.827 0 + vertex 184.934 182.624 0 + endloop + endfacet + facet normal 0.950577 0.31049 0 + outer loop + vertex 184.819 183.026 -3 + vertex 184.884 182.827 0 + vertex 184.884 182.827 -3 + endloop + endfacet + facet normal 0.950577 0.31049 -0 + outer loop + vertex 184.819 183.026 -3 + vertex 184.819 183.026 0 + vertex 184.884 182.827 0 + endloop + endfacet + facet normal 0.927816 0.373039 0 + outer loop + vertex 184.741 183.22 -3 + vertex 184.819 183.026 0 + vertex 184.819 183.026 -3 + endloop + endfacet + facet normal 0.927816 0.373039 -0 + outer loop + vertex 184.741 183.22 -3 + vertex 184.741 183.22 0 + vertex 184.819 183.026 0 + endloop + endfacet + facet normal 0.898217 0.439553 0 + outer loop + vertex 184.649 183.408 -3 + vertex 184.741 183.22 0 + vertex 184.741 183.22 -3 + endloop + endfacet + facet normal 0.898217 0.439553 -0 + outer loop + vertex 184.649 183.408 -3 + vertex 184.649 183.408 0 + vertex 184.741 183.22 0 + endloop + endfacet + facet normal 0.866186 0.499722 0 + outer loop + vertex 184.544 183.59 -3 + vertex 184.649 183.408 0 + vertex 184.649 183.408 -3 + endloop + endfacet + facet normal 0.866186 0.499722 -0 + outer loop + vertex 184.544 183.59 -3 + vertex 184.544 183.59 0 + vertex 184.649 183.408 0 + endloop + endfacet + facet normal 0.828349 0.560213 0 + outer loop + vertex 184.427 183.763 -3 + vertex 184.544 183.59 0 + vertex 184.544 183.59 -3 + endloop + endfacet + facet normal 0.828349 0.560213 -0 + outer loop + vertex 184.427 183.763 -3 + vertex 184.427 183.763 0 + vertex 184.544 183.59 0 + endloop + endfacet + facet normal 0.787807 0.615922 0 + outer loop + vertex 184.298 183.928 -3 + vertex 184.427 183.763 0 + vertex 184.427 183.763 -3 + endloop + endfacet + facet normal 0.787807 0.615922 -0 + outer loop + vertex 184.298 183.928 -3 + vertex 184.298 183.928 0 + vertex 184.427 183.763 0 + endloop + endfacet + facet normal 0.744242 0.66791 0 + outer loop + vertex 184.158 184.084 -3 + vertex 184.298 183.928 0 + vertex 184.298 183.928 -3 + endloop + endfacet + facet normal 0.744242 0.66791 -0 + outer loop + vertex 184.158 184.084 -3 + vertex 184.158 184.084 0 + vertex 184.298 183.928 0 + endloop + endfacet + facet normal 0.692631 0.721292 0 + outer loop + vertex 184.007 184.229 -3 + vertex 184.158 184.084 0 + vertex 184.158 184.084 -3 + endloop + endfacet + facet normal 0.692631 0.721292 -0 + outer loop + vertex 184.007 184.229 -3 + vertex 184.007 184.229 0 + vertex 184.158 184.084 0 + endloop + endfacet + facet normal 0.644871 0.764291 0 + outer loop + vertex 183.847 184.364 -3 + vertex 184.007 184.229 0 + vertex 184.007 184.229 -3 + endloop + endfacet + facet normal 0.644871 0.764291 -0 + outer loop + vertex 183.847 184.364 -3 + vertex 183.847 184.364 0 + vertex 184.007 184.229 0 + endloop + endfacet + facet normal 0.588456 0.808529 0 + outer loop + vertex 183.678 184.487 -3 + vertex 183.847 184.364 0 + vertex 183.847 184.364 -3 + endloop + endfacet + facet normal 0.588456 0.808529 -0 + outer loop + vertex 183.678 184.487 -3 + vertex 183.678 184.487 0 + vertex 183.847 184.364 0 + endloop + endfacet + facet normal 0.529142 0.848533 0 + outer loop + vertex 183.5 184.598 -3 + vertex 183.678 184.487 0 + vertex 183.678 184.487 -3 + endloop + endfacet + facet normal 0.529142 0.848533 -0 + outer loop + vertex 183.5 184.598 -3 + vertex 183.5 184.598 0 + vertex 183.678 184.487 0 + endloop + endfacet + facet normal 0.468107 0.883672 0 + outer loop + vertex 183.315 184.696 -3 + vertex 183.5 184.598 0 + vertex 183.5 184.598 -3 + endloop + endfacet + facet normal 0.468107 0.883672 -0 + outer loop + vertex 183.315 184.696 -3 + vertex 183.315 184.696 0 + vertex 183.5 184.598 0 + endloop + endfacet + facet normal 0.410563 0.911832 0 + outer loop + vertex 183.124 184.782 -3 + vertex 183.315 184.696 0 + vertex 183.315 184.696 -3 + endloop + endfacet + facet normal 0.410563 0.911832 -0 + outer loop + vertex 183.124 184.782 -3 + vertex 183.124 184.782 0 + vertex 183.315 184.696 0 + endloop + endfacet + facet normal 0.339058 0.940766 0 + outer loop + vertex 182.927 184.853 -3 + vertex 183.124 184.782 0 + vertex 183.124 184.782 -3 + endloop + endfacet + facet normal 0.339058 0.940766 -0 + outer loop + vertex 182.927 184.853 -3 + vertex 182.927 184.853 0 + vertex 183.124 184.782 0 + endloop + endfacet + facet normal 0.277246 0.960799 0 + outer loop + vertex 182.726 184.911 -3 + vertex 182.927 184.853 0 + vertex 182.927 184.853 -3 + endloop + endfacet + facet normal 0.277246 0.960799 -0 + outer loop + vertex 182.726 184.911 -3 + vertex 182.726 184.911 0 + vertex 182.927 184.853 0 + endloop + endfacet + facet normal 0.205289 0.978701 0 + outer loop + vertex 182.521 184.954 -3 + vertex 182.726 184.911 0 + vertex 182.726 184.911 -3 + endloop + endfacet + facet normal 0.205289 0.978701 -0 + outer loop + vertex 182.521 184.954 -3 + vertex 182.521 184.954 0 + vertex 182.726 184.911 0 + endloop + endfacet + facet normal 0.143429 0.989661 0 + outer loop + vertex 182.314 184.984 -3 + vertex 182.521 184.954 0 + vertex 182.521 184.954 -3 + endloop + endfacet + facet normal 0.143429 0.989661 -0 + outer loop + vertex 182.314 184.984 -3 + vertex 182.314 184.984 0 + vertex 182.521 184.954 0 + endloop + endfacet + facet normal 0.0668359 0.997764 0 + outer loop + vertex 182.105 184.998 -3 + vertex 182.314 184.984 0 + vertex 182.314 184.984 -3 + endloop + endfacet + facet normal 0.0668359 0.997764 -0 + outer loop + vertex 182.105 184.998 -3 + vertex 182.105 184.998 0 + vertex 182.314 184.984 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 182.002 184.998 -3 + vertex 182.105 184.998 0 + vertex 182.105 184.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 182.002 184.998 -3 + vertex 182.002 184.998 0 + vertex 182.105 184.998 0 + endloop + endfacet + facet normal 0.707107 0.707107 0 + outer loop + vertex 182 185 -3 + vertex 182.002 184.998 0 + vertex 182.002 184.998 -3 + endloop + endfacet + facet normal 0.707107 0.707107 -0 + outer loop + vertex 182 185 -3 + vertex 182 185 0 + vertex 182.002 184.998 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -182 185 -3 + vertex 182 185 0 + vertex 182 185 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -182 185 -3 + vertex -182 185 0 + vertex 182 185 0 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -182.002 184.998 -3 + vertex -182 185 0 + vertex -182 185 -3 + endloop + endfacet + facet normal -0.707107 0.707107 0 + outer loop + vertex -182.002 184.998 -3 + vertex -182.002 184.998 0 + vertex -182 185 0 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -182.105 184.998 -3 + vertex -182.002 184.998 0 + vertex -182.002 184.998 -3 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -182.105 184.998 -3 + vertex -182.105 184.998 0 + vertex -182.002 184.998 0 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -182.314 184.984 -3 + vertex -182.105 184.998 0 + vertex -182.105 184.998 -3 + endloop + endfacet + facet normal -0.0668359 0.997764 0 + outer loop + vertex -182.314 184.984 -3 + vertex -182.314 184.984 0 + vertex -182.105 184.998 0 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -182.521 184.954 -3 + vertex -182.314 184.984 0 + vertex -182.314 184.984 -3 + endloop + endfacet + facet normal -0.143429 0.989661 0 + outer loop + vertex -182.521 184.954 -3 + vertex -182.521 184.954 0 + vertex -182.314 184.984 0 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -182.726 184.911 -3 + vertex -182.521 184.954 0 + vertex -182.521 184.954 -3 + endloop + endfacet + facet normal -0.205289 0.978701 0 + outer loop + vertex -182.726 184.911 -3 + vertex -182.726 184.911 0 + vertex -182.521 184.954 0 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -182.927 184.853 -3 + vertex -182.726 184.911 0 + vertex -182.726 184.911 -3 + endloop + endfacet + facet normal -0.277246 0.960799 0 + outer loop + vertex -182.927 184.853 -3 + vertex -182.927 184.853 0 + vertex -182.726 184.911 0 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -183.124 184.782 -3 + vertex -182.927 184.853 0 + vertex -182.927 184.853 -3 + endloop + endfacet + facet normal -0.339058 0.940766 0 + outer loop + vertex -183.124 184.782 -3 + vertex -183.124 184.782 0 + vertex -182.927 184.853 0 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -183.315 184.696 -3 + vertex -183.124 184.782 0 + vertex -183.124 184.782 -3 + endloop + endfacet + facet normal -0.410563 0.911832 0 + outer loop + vertex -183.315 184.696 -3 + vertex -183.315 184.696 0 + vertex -183.124 184.782 0 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -183.5 184.598 -3 + vertex -183.315 184.696 0 + vertex -183.315 184.696 -3 + endloop + endfacet + facet normal -0.468107 0.883672 0 + outer loop + vertex -183.5 184.598 -3 + vertex -183.5 184.598 0 + vertex -183.315 184.696 0 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -183.678 184.487 -3 + vertex -183.5 184.598 0 + vertex -183.5 184.598 -3 + endloop + endfacet + facet normal -0.529142 0.848533 0 + outer loop + vertex -183.678 184.487 -3 + vertex -183.678 184.487 0 + vertex -183.5 184.598 0 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -183.847 184.364 -3 + vertex -183.678 184.487 0 + vertex -183.678 184.487 -3 + endloop + endfacet + facet normal -0.588456 0.808529 0 + outer loop + vertex -183.847 184.364 -3 + vertex -183.847 184.364 0 + vertex -183.678 184.487 0 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -184.007 184.229 -3 + vertex -183.847 184.364 0 + vertex -183.847 184.364 -3 + endloop + endfacet + facet normal -0.644871 0.764291 0 + outer loop + vertex -184.007 184.229 -3 + vertex -184.007 184.229 0 + vertex -183.847 184.364 0 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -184.158 184.084 -3 + vertex -184.007 184.229 0 + vertex -184.007 184.229 -3 + endloop + endfacet + facet normal -0.692631 0.721292 0 + outer loop + vertex -184.158 184.084 -3 + vertex -184.158 184.084 0 + vertex -184.007 184.229 0 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -184.298 183.928 -3 + vertex -184.158 184.084 0 + vertex -184.158 184.084 -3 + endloop + endfacet + facet normal -0.744242 0.66791 0 + outer loop + vertex -184.298 183.928 -3 + vertex -184.298 183.928 0 + vertex -184.158 184.084 0 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -184.427 183.763 -3 + vertex -184.298 183.928 0 + vertex -184.298 183.928 -3 + endloop + endfacet + facet normal -0.787807 0.615922 0 + outer loop + vertex -184.427 183.763 -3 + vertex -184.427 183.763 0 + vertex -184.298 183.928 0 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -184.544 183.59 -3 + vertex -184.427 183.763 0 + vertex -184.427 183.763 -3 + endloop + endfacet + facet normal -0.828349 0.560213 0 + outer loop + vertex -184.544 183.59 -3 + vertex -184.544 183.59 0 + vertex -184.427 183.763 0 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -184.649 183.408 -3 + vertex -184.544 183.59 0 + vertex -184.544 183.59 -3 + endloop + endfacet + facet normal -0.866186 0.499722 0 + outer loop + vertex -184.649 183.408 -3 + vertex -184.649 183.408 0 + vertex -184.544 183.59 0 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -184.741 183.22 -3 + vertex -184.649 183.408 0 + vertex -184.649 183.408 -3 + endloop + endfacet + facet normal -0.898217 0.439553 0 + outer loop + vertex -184.741 183.22 -3 + vertex -184.741 183.22 0 + vertex -184.649 183.408 0 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -184.819 183.026 -3 + vertex -184.741 183.22 0 + vertex -184.741 183.22 -3 + endloop + endfacet + facet normal -0.927816 0.373039 0 + outer loop + vertex -184.819 183.026 -3 + vertex -184.819 183.026 0 + vertex -184.741 183.22 0 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -184.884 182.827 -3 + vertex -184.819 183.026 0 + vertex -184.819 183.026 -3 + endloop + endfacet + facet normal -0.950577 0.31049 0 + outer loop + vertex -184.884 182.827 -3 + vertex -184.884 182.827 0 + vertex -184.819 183.026 0 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -184.934 182.624 -3 + vertex -184.884 182.827 0 + vertex -184.884 182.827 -3 + endloop + endfacet + facet normal -0.970981 0.239158 0 + outer loop + vertex -184.934 182.624 -3 + vertex -184.934 182.624 0 + vertex -184.884 182.827 0 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -184.971 182.418 -3 + vertex -184.934 182.624 0 + vertex -184.934 182.624 -3 + endloop + endfacet + facet normal -0.98425 0.176783 0 + outer loop + vertex -184.971 182.418 -3 + vertex -184.971 182.418 0 + vertex -184.934 182.624 0 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -184.993 182.209 -3 + vertex -184.971 182.418 0 + vertex -184.971 182.418 -3 + endloop + endfacet + facet normal -0.994505 0.104685 0 + outer loop + vertex -184.993 182.209 -3 + vertex -184.993 182.209 0 + vertex -184.971 182.418 0 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -185 182 -3 + vertex -184.993 182.209 0 + vertex -184.993 182.209 -3 + endloop + endfacet + facet normal -0.99944 0.0334741 0 + outer loop + vertex -185 182 -3 + vertex -185 182 0 + vertex -184.993 182.209 0 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -185 -182 -3 + vertex -185 182 0 + vertex -185 182 -3 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -185 -182 -3 + vertex -185 -182 0 + vertex -185 182 0 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -184.993 -182.209 -3 + vertex -185 -182 0 + vertex -185 -182 -3 + endloop + endfacet + facet normal -0.99944 -0.0334741 0 + outer loop + vertex -184.993 -182.209 -3 + vertex -184.993 -182.209 0 + vertex -185 -182 0 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -184.971 -182.418 -3 + vertex -184.993 -182.209 0 + vertex -184.993 -182.209 -3 + endloop + endfacet + facet normal -0.994505 -0.104685 0 + outer loop + vertex -184.971 -182.418 -3 + vertex -184.971 -182.418 0 + vertex -184.993 -182.209 0 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -184.934 -182.624 -3 + vertex -184.971 -182.418 0 + vertex -184.971 -182.418 -3 + endloop + endfacet + facet normal -0.98425 -0.176783 0 + outer loop + vertex -184.934 -182.624 -3 + vertex -184.934 -182.624 0 + vertex -184.971 -182.418 0 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -184.884 -182.827 -3 + vertex -184.934 -182.624 0 + vertex -184.934 -182.624 -3 + endloop + endfacet + facet normal -0.970981 -0.239158 0 + outer loop + vertex -184.884 -182.827 -3 + vertex -184.884 -182.827 0 + vertex -184.934 -182.624 0 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -184.819 -183.026 -3 + vertex -184.884 -182.827 0 + vertex -184.884 -182.827 -3 + endloop + endfacet + facet normal -0.950577 -0.31049 0 + outer loop + vertex -184.819 -183.026 -3 + vertex -184.819 -183.026 0 + vertex -184.884 -182.827 0 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -184.741 -183.22 -3 + vertex -184.819 -183.026 0 + vertex -184.819 -183.026 -3 + endloop + endfacet + facet normal -0.927816 -0.373039 0 + outer loop + vertex -184.741 -183.22 -3 + vertex -184.741 -183.22 0 + vertex -184.819 -183.026 0 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -184.649 -183.408 -3 + vertex -184.741 -183.22 0 + vertex -184.741 -183.22 -3 + endloop + endfacet + facet normal -0.898217 -0.439553 0 + outer loop + vertex -184.649 -183.408 -3 + vertex -184.649 -183.408 0 + vertex -184.741 -183.22 0 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -184.544 -183.59 -3 + vertex -184.649 -183.408 0 + vertex -184.649 -183.408 -3 + endloop + endfacet + facet normal -0.866186 -0.499722 0 + outer loop + vertex -184.544 -183.59 -3 + vertex -184.544 -183.59 0 + vertex -184.649 -183.408 0 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -184.427 -183.763 -3 + vertex -184.544 -183.59 0 + vertex -184.544 -183.59 -3 + endloop + endfacet + facet normal -0.828349 -0.560213 0 + outer loop + vertex -184.427 -183.763 -3 + vertex -184.427 -183.763 0 + vertex -184.544 -183.59 0 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -184.298 -183.928 -3 + vertex -184.427 -183.763 0 + vertex -184.427 -183.763 -3 + endloop + endfacet + facet normal -0.787807 -0.615922 0 + outer loop + vertex -184.298 -183.928 -3 + vertex -184.298 -183.928 0 + vertex -184.427 -183.763 0 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -184.158 -184.084 -3 + vertex -184.298 -183.928 0 + vertex -184.298 -183.928 -3 + endloop + endfacet + facet normal -0.744242 -0.66791 0 + outer loop + vertex -184.158 -184.084 -3 + vertex -184.158 -184.084 0 + vertex -184.298 -183.928 0 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -184.007 -184.229 -3 + vertex -184.158 -184.084 0 + vertex -184.158 -184.084 -3 + endloop + endfacet + facet normal -0.692631 -0.721292 0 + outer loop + vertex -184.007 -184.229 -3 + vertex -184.007 -184.229 0 + vertex -184.158 -184.084 0 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -183.847 -184.364 -3 + vertex -184.007 -184.229 0 + vertex -184.007 -184.229 -3 + endloop + endfacet + facet normal -0.644871 -0.764291 0 + outer loop + vertex -183.847 -184.364 -3 + vertex -183.847 -184.364 0 + vertex -184.007 -184.229 0 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -183.678 -184.487 -3 + vertex -183.847 -184.364 0 + vertex -183.847 -184.364 -3 + endloop + endfacet + facet normal -0.588456 -0.808529 0 + outer loop + vertex -183.678 -184.487 -3 + vertex -183.678 -184.487 0 + vertex -183.847 -184.364 0 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -183.5 -184.598 -3 + vertex -183.678 -184.487 0 + vertex -183.678 -184.487 -3 + endloop + endfacet + facet normal -0.529142 -0.848533 0 + outer loop + vertex -183.5 -184.598 -3 + vertex -183.5 -184.598 0 + vertex -183.678 -184.487 0 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -183.315 -184.696 -3 + vertex -183.5 -184.598 0 + vertex -183.5 -184.598 -3 + endloop + endfacet + facet normal -0.468107 -0.883672 0 + outer loop + vertex -183.315 -184.696 -3 + vertex -183.315 -184.696 0 + vertex -183.5 -184.598 0 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -183.124 -184.782 -3 + vertex -183.315 -184.696 0 + vertex -183.315 -184.696 -3 + endloop + endfacet + facet normal -0.410563 -0.911832 0 + outer loop + vertex -183.124 -184.782 -3 + vertex -183.124 -184.782 0 + vertex -183.315 -184.696 0 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -182.927 -184.853 -3 + vertex -183.124 -184.782 0 + vertex -183.124 -184.782 -3 + endloop + endfacet + facet normal -0.339058 -0.940766 0 + outer loop + vertex -182.927 -184.853 -3 + vertex -182.927 -184.853 0 + vertex -183.124 -184.782 0 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -182.726 -184.911 -3 + vertex -182.927 -184.853 0 + vertex -182.927 -184.853 -3 + endloop + endfacet + facet normal -0.277246 -0.960799 0 + outer loop + vertex -182.726 -184.911 -3 + vertex -182.726 -184.911 0 + vertex -182.927 -184.853 0 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -182.521 -184.954 -3 + vertex -182.726 -184.911 0 + vertex -182.726 -184.911 -3 + endloop + endfacet + facet normal -0.205289 -0.978701 0 + outer loop + vertex -182.521 -184.954 -3 + vertex -182.521 -184.954 0 + vertex -182.726 -184.911 0 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -182.314 -184.984 -3 + vertex -182.521 -184.954 0 + vertex -182.521 -184.954 -3 + endloop + endfacet + facet normal -0.143429 -0.989661 0 + outer loop + vertex -182.314 -184.984 -3 + vertex -182.314 -184.984 0 + vertex -182.521 -184.954 0 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -182.105 -184.998 -3 + vertex -182.314 -184.984 0 + vertex -182.314 -184.984 -3 + endloop + endfacet + facet normal -0.0668359 -0.997764 0 + outer loop + vertex -182.105 -184.998 -3 + vertex -182.105 -184.998 0 + vertex -182.314 -184.984 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -182.002 -184.998 -3 + vertex -182.105 -184.998 0 + vertex -182.105 -184.998 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -182.002 -184.998 -3 + vertex -182.002 -184.998 0 + vertex -182.105 -184.998 0 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -182 -185 -3 + vertex -182.002 -184.998 0 + vertex -182.002 -184.998 -3 + endloop + endfacet + facet normal -0.707107 -0.707107 0 + outer loop + vertex -182 -185 -3 + vertex -182 -185 0 + vertex -182.002 -184.998 0 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 182 -185 -3 + vertex -182 -185 0 + vertex -182 -185 -3 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 182 -185 -3 + vertex 182 -185 0 + vertex -182 -185 0 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 182.002 -184.998 -3 + vertex 182 -185 0 + vertex 182 -185 -3 + endloop + endfacet + facet normal 0.707107 -0.707107 0 + outer loop + vertex 182.002 -184.998 -3 + vertex 182.002 -184.998 0 + vertex 182 -185 0 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/LulzBot.idx b/resources/profiles/LulzBot.idx new file mode 100644 index 0000000000..4d6436f82e --- /dev/null +++ b/resources/profiles/LulzBot.idx @@ -0,0 +1,2 @@ +min_slic3r_version = 2.2.0-alpha3 +0.0.1 Initial version diff --git a/resources/profiles/LulzBot.ini b/resources/profiles/LulzBot.ini new file mode 100644 index 0000000000..fdd673d256 --- /dev/null +++ b/resources/profiles/LulzBot.ini @@ -0,0 +1,384 @@ +# generated by PrusaSlicer 2.1.1+win64 on 2020-02-25 at 01:51:21 UTC + +[vendor] +# Vendor name will be shown by the Config Wizard. +name = LulzBot +config_version = 0.0.1 +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/LulzBot/ + +[printer_model:MINI_AERO] +name = Mini Aero +variants = 0.5 +technology = FFF +#bed_model = mini_bed.stl +#bed_texture = mini.svg +default_materials = ColorFabb PLA-PHA @lulzbot;PrintedSolid Jesse PLA @lulzbot + +[printer_model:TAZ6_AERO] +name = Taz6 Aero +variants = 0.5 +technology = FFF +default_materials = ColorFabb PLA-PHA @lulzbot;PrintedSolid Jesse PLA @lulzbot + +[print:0.3mm @lulzbot] +avoid_crossing_perimeters = 0 +bottom_fill_pattern = rectilinear +bottom_solid_layers = 3 +bridge_acceleration = 500 +bridge_angle = 0 +bridge_flow_ratio = 1 +bridge_speed = 30 +brim_width = 0 +clip_multipart_objects = 0 +compatible_printers = +compatible_printers_condition = +complete_objects = 0 +default_acceleration = 500 +dont_support_bridges = 1 +elefant_foot_compensation = 0 +ensure_vertical_shell_thickness = 0 +external_perimeter_extrusion_width = 0.56 +external_perimeter_speed = 50% +external_perimeters_first = 0 +extra_perimeters = 1 +extruder_clearance_height = 20 +extruder_clearance_radius = 20 +extrusion_width = 0.56 +fill_angle = 45 +fill_density = 20% +fill_pattern = gyroid +first_layer_acceleration = 500 +first_layer_extrusion_width = 0.6 +first_layer_height = 100% +first_layer_speed = 40% +gap_fill_speed = 20 +gcode_comments = 0 +gcode_label_objects = 0 +infill_acceleration = 500 +infill_every_layers = 1 +infill_extruder = 1 +infill_extrusion_width = 0.56 +infill_first = 0 +infill_only_where_needed = 0 +infill_overlap = 25% +infill_speed = 60 +inherits = +interface_shells = 0 +layer_height = 0.3 +max_print_speed = 80 +max_volumetric_speed = 0 +min_skirt_length = 0 +notes = +only_retract_when_crossing_perimeters = 1 +ooze_prevention = 0 +output_filename_format = [printer_settings_id]_[input_filename_base]_[layer_height]_[filament_type]_[print_time].gcode +overhangs = 1 +perimeter_acceleration = 500 +perimeter_extruder = 1 +perimeter_extrusion_width = 0.56 +perimeter_speed = 60 +perimeters = 3 +post_process = +raft_layers = 0 +resolution = 0 +seam_position = nearest +single_extruder_multi_material_priming = 1 +skirt_distance = 3 +skirt_height = 1 +skirts = 3 +slice_closing_radius = 0.049 +small_perimeter_speed = 15 +solid_infill_below_area = 70 +solid_infill_every_layers = 0 +solid_infill_extruder = 1 +solid_infill_extrusion_width = 0.56 +solid_infill_speed = 60 +spiral_vase = 0 +standby_temperature_delta = -5 +support_material = 0 +support_material_angle = 0 +support_material_auto = 1 +support_material_buildplate_only = 0 +support_material_contact_distance = 0.2 +support_material_enforce_layers = 0 +support_material_extruder = 1 +support_material_extrusion_width = 0.44 +support_material_interface_contact_loops = 0 +support_material_interface_extruder = 1 +support_material_interface_layers = 3 +support_material_interface_spacing = 0 +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 = 0 +support_material_with_sheath = 1 +support_material_xy_spacing = 50% +thin_walls = 1 +threads = 12 +top_fill_pattern = rectilinear +top_infill_extrusion_width = 0.52 +top_solid_infill_speed = 40 +top_solid_layers = 3 +travel_speed = 175 +wipe_tower = 0 +wipe_tower_bridging = 10 +wipe_tower_rotation_angle = 0 +wipe_tower_width = 60 +wipe_tower_x = 180 +wipe_tower_y = 140 +xy_size_compensation = 0 + +[filament:ColorFabb PLA-PHA @lulzbot] +filament_vendor = ColorFabb +bed_temperature = 60 +bridge_fan_speed = 100 +compatible_printers = +compatible_printers_condition = +compatible_prints = +compatible_prints_condition = +cooling = 1 +disable_fan_first_layers = 3 +end_filament_gcode = "; Filament-specific end gcode \n;END gcode for filament\n" +extrusion_multiplier = 1 +fan_always_on = 0 +fan_below_layer_time = 60 +filament_colour = #29B2B2 +filament_cooling_final_speed = 3.4 +filament_cooling_initial_speed = 2.2 +filament_cooling_moves = 4 +filament_cost = 0 +filament_density = 1.25 +filament_deretract_speed = nil +filament_diameter = 2.85 +filament_load_time = 0 +filament_loading_speed = 28 +filament_loading_speed_start = 3 +filament_max_volumetric_speed = 0 +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_retract_before_travel = nil +filament_retract_before_wipe = nil +filament_retract_layer_change = nil +filament_retract_length = nil +filament_retract_lift = nil +filament_retract_lift_above = nil +filament_retract_lift_below = nil +filament_retract_restart_extra = nil +filament_retract_speed = nil +filament_soluble = 0 +filament_toolchange_delay = 0 +filament_type = PLA +filament_unload_time = 0 +filament_unloading_speed = 90 +filament_unloading_speed_start = 100 +filament_wipe = nil +first_layer_bed_temperature = 60 +first_layer_temperature = 200 +inherits = +max_fan_speed = 100 +min_fan_speed = 35 +min_print_speed = 10 +slowdown_below_layer_time = 5 +start_filament_gcode = "; Filament gcode\n" +temperature = 200 + +[filament:PrintedSolid Jesse PLA @lulzbot] +filament_vendor = PrintedSolid +bed_temperature = 60 +bridge_fan_speed = 100 +compatible_printers = +compatible_printers_condition = +compatible_prints = +compatible_prints_condition = +cooling = 1 +disable_fan_first_layers = 3 +end_filament_gcode = "; Filament-specific end gcode \n;END gcode for filament\n" +extrusion_multiplier = 1 +fan_always_on = 0 +fan_below_layer_time = 60 +filament_colour = #29B2B2 +filament_cooling_final_speed = 3.4 +filament_cooling_initial_speed = 2.2 +filament_cooling_moves = 4 +filament_cost = 27 +filament_density = 1.25 +filament_deretract_speed = nil +filament_diameter = 2.85 +filament_load_time = 0 +filament_loading_speed = 28 +filament_loading_speed_start = 3 +filament_max_volumetric_speed = 0 +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_retract_before_travel = nil +filament_retract_before_wipe = nil +filament_retract_layer_change = nil +filament_retract_length = nil +filament_retract_lift = nil +filament_retract_lift_above = nil +filament_retract_lift_below = nil +filament_retract_restart_extra = nil +filament_retract_speed = nil +filament_soluble = 0 +filament_toolchange_delay = 0 +filament_type = PLA +filament_unload_time = 0 +filament_unloading_speed = 90 +filament_unloading_speed_start = 100 +filament_wipe = nil +first_layer_bed_temperature = 60 +first_layer_temperature = 220 +inherits = +max_fan_speed = 100 +min_fan_speed = 35 +min_print_speed = 10 +slowdown_below_layer_time = 5 +start_filament_gcode = "; Filament gcode\n" +temperature = 220 + +[printer:Mini Aero 0.5mm] +printer_model = MINI_AERO +printer_variant = 0.5 +default_print_profile = 0.3mm @lulzbot +default_filament_profile = PrintedSolid Jesse PLA @lulzbot +bed_shape = 0x0,154x0,154x154,0x154 +before_layer_gcode = +between_objects_gcode = +cooling_tube_length = 5 +cooling_tube_retraction = 91.5 +deretract_speed = 20 +end_gcode = M400 ; wait for moves to finish\nM140 S40 ; start bed cooling\nM104 S0 ; disable hotend\nM107 ; disable fans\nG92 E1 ; set extruder to 1mm for retract on print end (LulzBot Cura had 5mm, might be a contributing factor to between print Aerostruder jamming)\nM117 Cooling please wait ; progress indicator message on LCD\nG1 X5 Y5 Z158 E0 F10000 ; move to cooling position\nG1 E1 ; re-prime extruder\nM190 R40 ; wait for bed to cool down to removal temp\nM77 ; Stop GLCD Timer\nG1 X145 F1000 ; move extruder out of the way\nG1 Y175 F1000 ; present finished print\nM140 S0; cool downs\nM84 ; disable steppers\nG90 ; absolute positioning\nM117 Print Complete. ; print complete message\n +extra_loading_move = -2 +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 +machine_max_acceleration_extruding = 1500,1250 +machine_max_acceleration_retracting = 1500,1250 +machine_max_acceleration_x = 9000,1000 +machine_max_acceleration_y = 9000,1000 +machine_max_acceleration_z = 100,200 +machine_max_feedrate_e = 40,120 +machine_max_feedrate_x = 800,200 +machine_max_feedrate_y = 800,200 +machine_max_feedrate_z = 8,12 +machine_max_jerk_e = 2.5,2.5 +machine_max_jerk_x = 20,10 +machine_max_jerk_y = 20,10 +machine_max_jerk_z = 0.2,0.4 +machine_min_extruding_rate = 0,0 +machine_min_travel_rate = 0,0 +max_layer_height = 0 +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% +retract_layer_change = 1 +retract_length = 1 +retract_length_toolchange = 10 +retract_lift = 0 +retract_lift_above = 0 +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. +thumbnails = +toolchange_gcode = +use_firmware_retraction = 0 +use_relative_e_distances = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 1 +z_offset = 0 + +[printer:Taz6 Aero 0.5mm] +printer_model = TAZ6_AERO +printer_variant = 0.5 +default_print_profile = 0.3mm @lulzbot +default_filament_profile = PrintedSolid Jesse PLA @lulzbot +bed_shape = 0x0,280x0,280x280,0x280 +before_layer_gcode = +between_objects_gcode = +cooling_tube_length = 5 +cooling_tube_retraction = 91.5 +deretract_speed = 20 +end_gcode = M400 ; wait for moves to finish\nM140 S40 ; start bed cooling\nM104 S0 ; disable hotend\nM107 ; disable fans\nG91 ; relative positioning\nG1 E-1 F300 ; filament retraction to release pressure\nG1 Z20 E-5 X-20 Y-20 F3000 ; lift up and retract even more filament\nG1 E6 ; re-prime extruder\nM117 Cooling please wait ; progress indicator message on LCD\nG90 ; absolute positioning\nG1 Y0 F3000 ; move to cooling position\nM190 R40 ; wait for bed to cool down to removal temp\nG1 Y280 F3000 ; present finished print\nM140 S0; cool downs\nM77 ; stop GLCD timer\nM84 ; disable steppers\nG90 ; absolute positioning\nM117 Print Complete. ; print complete message\n +extra_loading_move = -2 +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 +machine_max_acceleration_extruding = 1000,1250 +machine_max_acceleration_retracting = 1000,1250 +machine_max_acceleration_x = 9000,1000 +machine_max_acceleration_y = 9000,1000 +machine_max_acceleration_z = 100,200 +machine_max_feedrate_e = 40,120 +machine_max_feedrate_x = 800,200 +machine_max_feedrate_y = 800,200 +machine_max_feedrate_z = 3,12 +machine_max_jerk_e = 2.5,2.5 +machine_max_jerk_x = 12,10 +machine_max_jerk_y = 12,10 +machine_max_jerk_z = 0.2,0.4 +machine_min_extruding_rate = 0,0 +machine_min_travel_rate = 0,0 +max_layer_height = 0 +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% +retract_layer_change = 0 +retract_length = 2 +retract_length_toolchange = 10 +retract_lift = 0 +retract_lift_above = 0 +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 +thumbnails = +toolchange_gcode = +use_firmware_retraction = 0 +use_relative_e_distances = 0 +use_volumetric_e = 0 +variable_layer_height = 1 +wipe = 1 +z_offset = 0 diff --git a/resources/profiles/LulzBot/MINI_AERO_thumbnail.png b/resources/profiles/LulzBot/MINI_AERO_thumbnail.png new file mode 100644 index 0000000000..a25947a1de Binary files /dev/null and b/resources/profiles/LulzBot/MINI_AERO_thumbnail.png differ diff --git a/resources/profiles/LulzBot/TAZ6_AERO_thumbnail.png b/resources/profiles/LulzBot/TAZ6_AERO_thumbnail.png new file mode 100644 index 0000000000..79ffb907f5 Binary files /dev/null and b/resources/profiles/LulzBot/TAZ6_AERO_thumbnail.png differ diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx index b2bd7f8c87..c01a9ddea8 100644 --- a/resources/profiles/PrusaResearch.idx +++ b/resources/profiles/PrusaResearch.idx @@ -1,4 +1,34 @@ +min_slic3r_version = 2.2.0-alpha3 +1.1.10 Updated firmware version. +1.1.9 Updated K values in filament profiles (linear advance). Added new filament profiles and SLA materials. +1.1.8 Updated start/end g-code scripts for MK3 family printer profiles (reduced extruder motor current for some print profiles). Added new filament and SLA material profiles. +1.1.7 Updated end g-code for MMU2 Single printer profiles. Added/updated filament and SLA material profiles. +1.1.6 Updated firmware version for MK2.5/S and MK3/S. +1.1.5 Updated MMU1 specific retraction settings for Prusament PC Blend +1.1.4 Added Prusament PC Blend filament profile. +1.1.3 Added SLA material and filament profile +1.1.2 Added renamed_from fields for PETG filaments to indicate that they were renamed from PET. +1.1.1 Added Verbatim and Fiberlogy PETG filament profiles. Updated auto cooling settings for ABS. +1.1.1-beta Updated for PrusaSlicer 2.2.0-beta +1.1.1-alpha4 Extended list of default filaments to be installed, top/bottom_solid_min_thickness defined, infill_acceleration changed etc +1.1.1-alpha3 Print bed textures are now configurable from the Preset Bundle. Requires PrusaSlicer 2.2.0-alpha3 and newer. +# The following line (max_slic3r_version) forces the users of PrusaSlicer 2.2.0-alpha3 and newer to update the profiles to 1.1.1-alpha3 and newer, +# so they will see the print bed. +max_slic3r_version = 2.2.0-alpha2 +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 min_slic3r_version = 2.1.0-alpha0 +1.0.5 Added SLA materials +1.0.4 Updated firmware version and 0.25mm nozzle profiles +1.0.3 Added filament profiles +1.0.2 Added SLA materials 1.0.1 Updated MK3 firmware version check to 3.8.0, new soluble support profiles for 0.6mm nozzle diameter MMU2S printers. 1.0.0 Updated end G-code for the MMU2 profiles to lift the extruder at the end of print. Wipe tower bridging distance was made smaller for soluble supports. 1.0.0-beta1 Updated color for the ASA filaments to differ from the other filaments. Single extruder printers now have no extruder color assigned, obects and toolpaths will be colored with the color of the active filament. @@ -7,6 +37,10 @@ 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 0.8.4 Added Prusament ASA profile 0.8.3 FW version and SL1 materials update @@ -31,6 +65,10 @@ 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 0.4.7 MK2/S/MMU FW update 0.4.6 Updated firmware versions for MK2.5/S and MK3/S @@ -41,6 +79,9 @@ 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 0.3.7 MK2/S/MMU FW update 0.3.6 Updated firmware versions for MK2.5 and MK3 @@ -77,6 +118,8 @@ min_slic3r_version = 1.41.0-alpha 0.2.0-alpha1 added initial profiles for the i3 MK3 Multi Material Upgrade 2.0 0.2.0-alpha moved machine limits from the start G-code to the new print profile parameters min_slic3r_version = 1.40.0 +0.1.18 Updated firmware version +0.1.17 Updated firmware version for MK2.5/S and MK3/S 0.1.16 MK2.5/3/S FW update 0.1.15 MK2/S/MMU FW update 0.1.14 Updated firmware versions for MK2.5 and MK3 diff --git a/resources/profiles/PrusaResearch.ini b/resources/profiles/PrusaResearch.ini index a741f4656e..9e353e0fbc 100644 --- a/resources/profiles/PrusaResearch.ini +++ b/resources/profiles/PrusaResearch.ini @@ -5,10 +5,10 @@ name = Prusa Research # Configuration version of this file. Config file will only be installed, if the config_version differs. # This means, the server may force the PrusaSlicer configuration to be downgraded. -config_version = 1.0.4 +config_version = 1.1.10 # Where to get the updates from? -config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/ -changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1% +config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/ +changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1% # The printer models will be shown by the Configuration Wizard in this order, # also the first model installed & the first nozzle installed will be activated after install. @@ -19,75 +19,111 @@ changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1% [printer_model:MINI] name = Original Prusa MINI -variants = 0.4; 0.25 +variants = 0.4; 0.25; 0.6 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; Prusament PC Blend @MINI [printer_model:MK3S] name = Original Prusa i3 MK3S variants = 0.4; 0.25; 0.6 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; Prusament PC Blend [printer_model:MK3] name = Original Prusa i3 MK3 variants = 0.4; 0.25; 0.6 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; Prusament PC Blend [printer_model:MK3SMMU2S] name = Original Prusa i3 MK3S MMU2S variants = 0.4; 0.25; 0.6 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; Prusament PC Blend @MMU2 [printer_model:MK3MMU2] name = Original Prusa i3 MK3 MMU2 variants = 0.4; 0.25; 0.6 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; Prusament PC Blend @MMU2 [printer_model:MK2.5S] name = Original Prusa i3 MK2.5S variants = 0.4; 0.25; 0.6 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; Prusament PC Blend [printer_model:MK2.5] name = Original Prusa i3 MK2.5 variants = 0.4; 0.25; 0.6 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; Prusament PC Blend [printer_model:MK2.5SMMU2S] name = Original Prusa i3 MK2.5S MMU2S variants = 0.4; 0.25; 0.6 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; Prusament PC Blend @MMU2 [printer_model:MK2.5MMU2] name = Original Prusa i3 MK2.5 MMU2 variants = 0.4; 0.25; 0.6 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; Prusament PC Blend @MMU2 [printer_model:MK2S] name = Original Prusa i3 MK2S variants = 0.4; 0.25; 0.6 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; Prusament PC Blend [printer_model:MK2SMM] name = Original Prusa i3 MK2S MMU1 variants = 0.4; 0.6 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; Prusament PC Blend [printer_model:SL1] name = Original Prusa SL1 variants = default technology = SLA family = SL1 +bed_model = sl1_bed.stl +bed_texture = sl1.svg +default_materials = Prusa Orange Tough @0.05 # All presets starting with asterisk, for example *common*, are intermediate and they will # not make it into the user interface. @@ -106,13 +142,13 @@ compatible_printers = complete_objects = 0 default_acceleration = 1000 dont_support_bridges = 1 -elefant_foot_compensation = 0 +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 = 25 +extruder_clearance_height = 20 extruder_clearance_radius = 45 extrusion_width = 0.45 fill_angle = 45 @@ -190,6 +226,8 @@ wipe_tower_width = 60 wipe_tower_x = 170 wipe_tower_y = 140 xy_size_compensation = 0 +top_solid_min_thickness = 0.6 +bottom_solid_min_thickness = 0.5 [print:*MK3*] fill_pattern = grid @@ -218,9 +256,12 @@ infill_acceleration = 1000 bridge_acceleration = 1000 support_material_speed = 40 max_print_speed = 150 +extruder_clearance_height = 20 +extruder_clearance_radius = 35 # Print parameters common to a 0.25mm diameter nozzle. [print:*0.25nozzle*] +elefant_foot_compensation = 0 external_perimeter_extrusion_width = 0.25 extrusion_width = 0.25 first_layer_extrusion_width = 0.3 @@ -236,6 +277,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 @@ -269,6 +311,7 @@ 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 @@ -318,9 +361,9 @@ output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_heig external_perimeter_extrusion_width = 0.65 extrusion_width = 0.65 first_layer_extrusion_width = 0.65 -infill_extrusion_width = 0.7 +infill_extrusion_width = 0.65 perimeter_extrusion_width = 0.65 -solid_infill_extrusion_width = 0.7 +solid_infill_extrusion_width = 0.65 top_infill_extrusion_width = 0.6 support_material_extrusion_width = 0.55 bridge_flow_ratio = 0.95 @@ -329,6 +372,30 @@ 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 +extrusion_width = 0.65 +first_layer_extrusion_width = 0.65 +infill_extrusion_width = 0.68 +perimeter_extrusion_width = 0.65 +solid_infill_extrusion_width = 0.68 +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% +fill_pattern = gyroid +fill_density = 15% +travel_speed = 150 +perimeter_acceleration = 800 +infill_acceleration = 1000 +bridge_acceleration = 1000 +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 + [print:*soluble_support*] overhangs = 1 skirts = 0 @@ -375,23 +442,23 @@ top_solid_layers = 15 [print:0.05mm ULTRADETAIL] inherits = *0.05mm* -alias = 0.05mm ULTRADETAIL +# alias = 0.05mm ULTRADETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 infill_extrusion_width = 0.5 # MK3 # -[print:0.05mm ULTRADETAIL MK3] +[print:0.05mm ULTRADETAIL @MK3] inherits = *0.05mm*; *MK3* -alias = 0.05mm ULTRADETAIL +# alias = 0.05mm ULTRADETAIL fill_pattern = gyroid fill_density = 15% 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 top_infill_extrusion_width = 0.4 # MK2 # -[print:0.05mm ULTRADETAIL 0.25 nozzle] +[print:0.05mm ULTRADETAIL @0.25 nozzle] inherits = *0.05mm*; *0.25nozzle* -alias = 0.05mm ULTRADETAIL +# alias = 0.05mm ULTRADETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 fill_density = 20% infill_speed = 20 @@ -402,9 +469,9 @@ solid_infill_speed = 20 support_material_speed = 20 # MK3 # -[print:0.05mm ULTRADETAIL 0.25 nozzle MK3] +[print:0.05mm ULTRADETAIL @0.25 nozzle MK3] inherits = *0.05mm*; *0.25nozzle*; *MK3* -alias = 0.05mm ULTRADETAIL +# alias = 0.05mm ULTRADETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 fill_pattern = grid fill_density = 20% @@ -440,16 +507,16 @@ top_solid_infill_speed = 30 top_solid_layers = 11 # MK3 # -[print:0.07mm ULTRADETAIL MK3] +[print:0.07mm ULTRADETAIL @MK3] inherits = *0.07mm*; *MK3* -alias = 0.07mm ULTRADETAIL +# alias = 0.07mm ULTRADETAIL fill_pattern = gyroid 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 top_infill_extrusion_width = 0.4 -[print:0.07mm ULTRADETAIL 0.25 nozzle MK3] +[print:0.07mm ULTRADETAIL @0.25 nozzle MK3] inherits = *0.07mm*; *0.25nozzle*; *MK3* -alias = 0.07mm ULTRADETAIL +# alias = 0.07mm ULTRADETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 and num_extruders==1 infill_speed = 30 solid_infill_speed = 30 @@ -475,7 +542,7 @@ top_solid_layers = 9 # MK2 # [print:0.10mm DETAIL] inherits = *0.10mm* -alias = 0.10mm DETAIL +# alias = 0.10mm DETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.4 and num_extruders==1 external_perimeter_speed = 40 infill_acceleration = 2000 @@ -484,13 +551,13 @@ perimeter_speed = 50 solid_infill_speed = 50 # MK3 # -[print:0.10mm DETAIL MK3] +[print:0.10mm DETAIL @MK3] inherits = *0.10mm*; *MK3* -alias = 0.10mm DETAIL +# 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 = 1250 +infill_acceleration = 1000 infill_speed = 80 max_print_speed = 200 perimeter_speed = 45 @@ -501,9 +568,9 @@ fill_pattern = gyroid fill_density = 15% # MK2 # -[print:0.10mm DETAIL 0.25 nozzle] +[print:0.10mm DETAIL @0.25 nozzle] inherits = *0.10mm*; *0.25nozzle* -alias = 0.10mm DETAIL +# alias = 0.10mm DETAIL bridge_acceleration = 600 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 external_perimeter_speed = 20 @@ -516,9 +583,9 @@ solid_infill_speed = 40 top_solid_infill_speed = 30 # MK3 # -[print:0.10mm DETAIL 0.25 nozzle MK3] +[print:0.10mm DETAIL @0.25 nozzle MK3] inherits = *0.10mm*; *0.25nozzleMK3*; *MK3* -alias = 0.10mm DETAIL +# alias = 0.10mm DETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 fill_pattern = grid fill_density = 20% @@ -557,14 +624,14 @@ top_solid_infill_speed = 70 # MK2 # [print:0.15mm OPTIMAL] inherits = *0.15mm* -alias = 0.15mm OPTIMAL +# alias = 0.15mm OPTIMAL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 top_infill_extrusion_width = 0.45 # MK2 # -[print:0.15mm OPTIMAL 0.25 nozzle] +[print:0.15mm OPTIMAL @0.25 nozzle] inherits = *0.15mm*; *0.25nozzle* -alias = 0.15mm OPTIMAL +# alias = 0.15mm OPTIMAL bridge_acceleration = 600 bridge_flow_ratio = 0.7 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.25 @@ -578,19 +645,19 @@ solid_infill_speed = 40 top_solid_infill_speed = 30 # MK2 # -[print:0.15mm OPTIMAL 0.6 nozzle] +[print:0.15mm OPTIMAL @0.6 nozzle] inherits = *0.15mm*; *0.6nozzle* -alias = 0.15mm OPTIMAL +# alias = 0.15mm OPTIMAL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 # MK3 # -[print:0.15mm QUALITY MK3] +[print:0.15mm QUALITY @MK3] inherits = *0.15mm*; *MK3* -alias = 0.15mm QUALITY +# alias = 0.15mm QUALITY bridge_speed = 30 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 = 1250 +infill_acceleration = 1000 infill_speed = 80 max_print_speed = 200 perimeter_speed = 45 @@ -599,13 +666,13 @@ top_solid_infill_speed = 40 fill_pattern = gyroid fill_density = 15% -[print:0.15mm SPEED MK3] +[print:0.15mm SPEED @MK3] inherits = *0.15mm*; *MK3* -alias = 0.15mm SPEED +# alias = 0.15mm SPEED bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 200 max_print_speed = 200 perimeter_speed = 60 @@ -613,22 +680,23 @@ solid_infill_speed = 200 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 +[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 # MK3 MMU # -[print:0.15mm SOLUBLE INTERFACE MK3] -inherits = 0.15mm SOLUBLE FULL MK3 -alias = 0.15mm SOLUBLE INTERFACE +[print:0.15mm SOLUBLE INTERFACE @MK3] +inherits = 0.15mm SOLUBLE FULL @MK3 +# alias = 0.15mm SOLUBLE INTERFACE notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder support_material_extruder = 0 support_material_interface_layers = 3 @@ -637,7 +705,7 @@ support_material_with_sheath = 0 # MK2 MMU # [print:0.15mm OPTIMAL SOLUBLE FULL] inherits = *0.15mm*; *soluble_support* -alias = 0.15mm OPTIMAL SOLUBLE FULL +# alias = 0.15mm OPTIMAL SOLUBLE FULL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 and num_extruders>1 external_perimeter_speed = 25 notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder @@ -649,7 +717,7 @@ top_solid_infill_speed = 30 # MK2 MMU # [print:0.15mm OPTIMAL SOLUBLE INTERFACE] inherits = 0.15mm OPTIMAL SOLUBLE FULL -alias = 0.15mm OPTIMAL SOLUBLE INTERFACE +# alias = 0.15mm OPTIMAL SOLUBLE INTERFACE notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder support_material_extruder = 0 support_material_interface_layers = 3 @@ -657,20 +725,20 @@ support_material_with_sheath = 0 support_material_xy_spacing = 80% # MK3 # -[print:0.15mm QUALITY 0.25 nozzle MK3] +[print:0.15mm QUALITY @0.25 nozzle MK3] inherits = *0.15mm*; *0.25nozzleMK3*; *MK3* -alias = 0.15mm QUALITY +# alias = 0.15mm QUALITY compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.25 fill_pattern = grid fill_density = 20% # MK3 # -[print:0.15mm DETAIL 0.6 nozzle MK3] +[print:0.15mm DETAIL @0.6 nozzle MK3] inherits = *0.15mm*; *0.6nozzleMK3*; *MK306* -alias = 0.15mm DETAIL +# alias = 0.15mm DETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 70 max_print_speed = 100 perimeter_speed = 45 @@ -709,13 +777,13 @@ support_material_speed = 60 top_solid_infill_speed = 70 # MK3 # -[print:0.20mm QUALITY MK3] +[print:0.20mm QUALITY @MK3] inherits = *0.20mm*; *MK3* -alias = 0.20mm QUALITY +# alias = 0.20mm QUALITY bridge_speed = 30 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 = 1250 +infill_acceleration = 1000 infill_speed = 80 max_print_speed = 200 perimeter_speed = 45 @@ -724,13 +792,13 @@ top_solid_infill_speed = 40 fill_pattern = gyroid fill_density = 15% -[print:0.20mm SPEED MK3] +[print:0.20mm SPEED @MK3] inherits = *0.20mm*; *MK3* -alias = 0.20mm SPEED +# alias = 0.20mm SPEED bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 200 max_print_speed = 200 perimeter_speed = 60 @@ -738,22 +806,23 @@ solid_infill_speed = 200 top_solid_infill_speed = 50 # MK3 MMU # -[print:0.20mm SOLUBLE FULL MK3] -inherits = 0.20mm SPEED MK3; *soluble_support* -alias = 0.20mm SOLUBLE FULL +[print:0.20mm SOLUBLE FULL @MK3] +inherits = 0.20mm SPEED @MK3; *soluble_support* +# alias = 0.20mm 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 # MK3 MMU # -[print:0.20mm SOLUBLE INTERFACE MK3] -inherits = 0.20mm SOLUBLE FULL MK3 -alias = 0.20mm SOLUBLE INTERFACE +[print:0.20mm SOLUBLE INTERFACE @MK3] +inherits = 0.20mm SOLUBLE FULL @MK3 +# alias = 0.20mm SOLUBLE INTERFACE notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder support_material_extruder = 0 support_material_interface_layers = 3 @@ -765,9 +834,9 @@ inherits = *0.20mm* compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2[^\.].*/ and nozzle_diameter[0]==0.4 # MK2 # -[print:0.20mm NORMAL 0.6 nozzle] +[print:0.20mm NORMAL @0.6 nozzle] inherits = *0.20mm*; *0.6nozzle* -alias = 0.20mm NORMAL +# alias = 0.20mm NORMAL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 # MK2 MMU # @@ -790,12 +859,12 @@ support_material_with_sheath = 0 support_material_xy_spacing = 80% # MK3 # -[print:0.20mm DETAIL 0.6 nozzle MK3] +[print:0.20mm DETAIL @0.6 nozzle MK3] inherits = *0.20mm*; *0.6nozzleMK3*; *MK306* -alias = 0.20mm DETAIL +# alias = 0.20mm DETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 70 max_print_speed = 100 perimeter_speed = 45 @@ -835,21 +904,21 @@ solid_infill_speed = 50 top_infill_extrusion_width = 0.4 top_solid_layers = 4 -[print:0.30mm QUALITY 0.6 nozzle MK3] +[print:0.30mm QUALITY @0.6 nozzle MK3] inherits = *0.30mm*; *0.6nozzleMK3*; *MK306* -alias = 0.30mm QUALITY +# alias = 0.30mm QUALITY compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 70 max_print_speed = 100 perimeter_speed = 45 solid_infill_speed = 70 top_solid_infill_speed = 45 -[print:0.30mm SOLUBLE FULL 0.6 nozzle MK3] -inherits = 0.30mm QUALITY 0.6 nozzle MK3; *soluble_support* -alias = 0.30mm SOLUBLE FULL +[print:0.30mm SOLUBLE FULL @0.6 nozzle MK3] +inherits = 0.30mm QUALITY @0.6 nozzle MK3; *soluble_support* +# alias = 0.30mm SOLUBLE FULL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 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 @@ -862,22 +931,22 @@ support_material_extrusion_width = 0.6 top_solid_infill_speed = 30 support_material_xy_spacing = 80% -[print:0.30mm SOLUBLE INTERFACE 0.6 nozzle MK3] -inherits = 0.30mm SOLUBLE FULL 0.6 nozzle MK3 -alias = 0.30mm SOLUBLE INTERFACE +[print:0.30mm SOLUBLE INTERFACE @0.6 nozzle MK3] +inherits = 0.30mm SOLUBLE FULL @0.6 nozzle MK3 +# alias = 0.30mm SOLUBLE INTERFACE notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder support_material_extruder = 0 support_material_interface_layers = 3 support_material_with_sheath = 0 -[print:0.30mm DRAFT MK3] +[print:0.30mm DRAFT @MK3] inherits = *0.30mm*; *MK3* -alias = 0.30mm DRAFT +# alias = 0.30mm DRAFT bottom_solid_layers = 3 bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 85 max_print_speed = 200 perimeter_speed = 50 @@ -927,15 +996,15 @@ top_infill_extrusion_width = 0.43 support_material_extrusion_width = 0.37 # MK2 # -[print:0.35mm FAST 0.6 nozzle] +[print:0.35mm FAST @0.6 nozzle] inherits = *0.35mm*; *0.6nozzle* -alias = 0.35mm FAST +# alias = 0.35mm FAST compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and nozzle_diameter[0]==0.6 # MK2 MMU # -[print:0.35mm FAST sol full 0.6 nozzle] +[print:0.35mm FAST sol full @0.6 nozzle] inherits = *0.35mm*; *0.6nozzle*; *soluble_support* -alias = 0.35mm FAST SOLUBLE FULL +# alias = 0.35mm FAST SOLUBLE FULL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_model=="MK2SMM" and nozzle_diameter[0]==0.6 and num_extruders>1 external_perimeter_extrusion_width = 0.6 external_perimeter_speed = 30 @@ -948,21 +1017,21 @@ top_infill_extrusion_width = 0.6 support_material_extrusion_width = 0.6 # MK2 MMU # -[print:0.35mm FAST sol int 0.6 nozzle] -inherits = 0.35mm FAST sol full 0.6 nozzle -alias = 0.35mm FAST SOLUBLE INTERFACE +[print:0.35mm FAST sol int @0.6 nozzle] +inherits = 0.35mm FAST sol full @0.6 nozzle +# alias = 0.35mm FAST SOLUBLE INTERFACE support_material_extruder = 0 support_material_interface_layers = 3 support_material_with_sheath = 0 support_material_xy_spacing = 150% # MK3 # -[print:0.35mm SPEED 0.6 nozzle MK3] +[print:0.35mm SPEED @0.6 nozzle MK3] inherits = *0.35mm*; *0.6nozzleMK3*; *MK306* -alias = 0.35mm SPEED +# alias = 0.35mm SPEED compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 70 max_print_speed = 100 perimeter_speed = 45 @@ -970,6 +1039,8 @@ solid_infill_speed = 70 top_solid_infill_speed = 45 external_perimeter_extrusion_width = 0.68 perimeter_extrusion_width = 0.68 +infill_extrusion_width = 0.68 +solid_infill_extrusion_width = 0.68 # XXXXXXXXXXXXXXXXXXXX # XXX--- 0.40mm ---XXX @@ -993,98 +1064,104 @@ top_solid_infill_speed = 40 top_solid_layers = 4 # MK3 # -[print:0.40mm DRAFT 0.6 nozzle MK3] +[print:0.40mm DRAFT @0.6 nozzle MK3] inherits = *0.40mm*; *0.6nozzleMK3*; *MK306* -alias = 0.40mm DRAFT +# alias = 0.40mm DRAFT compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.6 external_perimeter_speed = 35 -infill_acceleration = 1250 +infill_acceleration = 1000 infill_speed = 70 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 # XXXXXXXXXXXXXXXXXXXXXX # MK2.5 # -[print:0.15mm 100mms Linear Advance MK2.5] +[print:0.15mm 100mms Linear Advance @MK2.5] inherits = 0.15mm 100mms Linear Advance compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 single_extruder_multi_material_priming = 0 # MK2.5 # -[print:0.15mm OPTIMAL MK2.5] +[print:0.15mm OPTIMAL @MK2.5] inherits = 0.15mm OPTIMAL -alias = 0.15mm OPTIMAL +# alias = 0.15mm OPTIMAL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 single_extruder_multi_material_priming = 0 # MK2.5 MMU2 # -[print:0.15mm OPTIMAL SOLUBLE FULL MK2.5] +[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 +# alias = 0.15mm OPTIMAL SOLUBLE FULL support_material_extruder = 5 support_material_interface_extruder = 5 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 # MK2.5 MMU2 # -[print:0.15mm OPTIMAL SOLUBLE INTERFACE MK2.5] +[print:0.15mm OPTIMAL SOLUBLE INTERFACE @MK2.5] inherits = 0.15mm OPTIMAL SOLUBLE INTERFACE -alias = 0.15mm OPTIMAL SOLUBLE INTERFACE +# alias = 0.15mm OPTIMAL SOLUBLE INTERFACE support_material_extruder = 0 support_material_interface_extruder = 5 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 # MK2.5 # -[print:0.20mm 100mms Linear Advance MK2.5] +[print:0.20mm 100mms Linear Advance @MK2.5] inherits = 0.20mm 100mms Linear Advance -alias = 0.20mm 100mms Linear Advance +# alias = 0.20mm 100mms Linear Advance compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 single_extruder_multi_material_priming = 0 # MK2.5 # -[print:0.20mm NORMAL MK2.5] +[print:0.20mm NORMAL @MK2.5] inherits = 0.20mm NORMAL -alias = 0.20mm NORMAL +# alias = 0.20mm NORMAL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 single_extruder_multi_material_priming = 0 # MK2.5 MMU2 # -[print:0.20mm NORMAL SOLUBLE FULL MK2.5] +[print:0.20mm NORMAL SOLUBLE FULL @MK2.5] inherits = 0.20mm NORMAL SOLUBLE FULL -alias = 0.20mm NORMAL SOLUBLE FULL +# alias = 0.20mm NORMAL SOLUBLE FULL support_material_extruder = 5 support_material_interface_extruder = 5 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.20mm NORMAL SOLUBLE INTERFACE MK2.5] +[print:0.20mm NORMAL SOLUBLE INTERFACE @MK2.5] inherits = 0.20mm NORMAL SOLUBLE INTERFACE -alias = 0.20mm NORMAL SOLUBLE INTERFACE +# alias = 0.20mm NORMAL SOLUBLE INTERFACE support_material_extruder = 0 support_material_interface_extruder = 5 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 # -[print:0.35mm FAST MK2.5] +[print:0.35mm FAST @MK2.5] inherits = 0.35mm FAST -alias = 0.35mm FAST +# alias = 0.35mm FAST compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and nozzle_diameter[0]==0.4 single_extruder_multi_material_priming = 0 -# MK2.5 MMU2 0.6 nozzle# -[print:0.35mm SOLUBLE FULL 0.6 nozzle MK2.5] +# MK2.5 MMU2 0.6 nozzle # +[print:0.35mm SOLUBLE FULL @0.6 nozzle MK2.5] inherits = *0.35mm*; *0.6nozzle*; *soluble_support* -alias = 0.35mm SOLUBLE FULL +# alias = 0.35mm SOLUBLE FULL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK2.*/ and printer_model!="MK2SMM" and nozzle_diameter[0]==0.6 and num_extruders>1 external_perimeter_extrusion_width = 0.6 external_perimeter_speed = 30 @@ -1098,9 +1175,9 @@ support_material_interface_extruder = 5 top_infill_extrusion_width = 0.6 support_material_extrusion_width = 0.6 -[print:0.35mm SOLUBLE INTERFACE 0.6 nozzle MK2.5] -inherits = 0.35mm SOLUBLE FULL 0.6 nozzle MK2.5 -alias = 0.35mm SOLUBLE INTERFACE +[print:0.35mm SOLUBLE INTERFACE @0.6 nozzle MK2.5] +inherits = 0.35mm SOLUBLE FULL @0.6 nozzle MK2.5 +# alias = 0.35mm SOLUBLE INTERFACE support_material_extruder = 0 support_material_interface_layers = 3 support_material_with_sheath = 0 @@ -1110,9 +1187,9 @@ support_material_xy_spacing = 80% # 0.4mm nozzle -[print:0.05mm ULTRADETAIL MINI] +[print:0.05mm ULTRADETAIL @MINI] inherits = *0.05mm*; *MINI* -alias = 0.05mm ULTRADETAIL +# alias = 0.05mm ULTRADETAIL fill_pattern = gyroid fill_density = 15% compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 @@ -1120,10 +1197,11 @@ top_infill_extrusion_width = 0.4 small_perimeter_speed = 15 perimeter_extrusion_width = 0.4 external_perimeter_extrusion_width = 0.4 +support_material_xy_spacing = 60% -[print:0.07mm ULTRADETAIL MINI] +[print:0.07mm ULTRADETAIL @MINI] inherits = *0.07mm*; *MINI* -alias = 0.07mm ULTRADETAIL +# alias = 0.07mm ULTRADETAIL fill_pattern = gyroid fill_density = 15% compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 @@ -1131,10 +1209,11 @@ top_infill_extrusion_width = 0.4 small_perimeter_speed = 15 perimeter_extrusion_width = 0.4 external_perimeter_extrusion_width = 0.4 +support_material_xy_spacing = 60% -[print:0.10mm DETAIL MINI] +[print:0.10mm DETAIL @MINI] inherits = *0.10mm*; *MINI* -alias = 0.10mm DETAIL +# alias = 0.10mm DETAIL bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 perimeter_speed = 40 @@ -1146,11 +1225,12 @@ top_solid_infill_speed = 40 fill_pattern = gyroid fill_density = 15% perimeters = 3 -bridge_acceleration = 800 +bridge_acceleration = 1000 +support_material_xy_spacing = 60% -[print:0.15mm QUALITY MINI] +[print:0.15mm QUALITY @MINI] inherits = *0.15mm*; *MINI* -alias = 0.15mm QUALITY +# alias = 0.15mm QUALITY bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 perimeter_speed = 40 @@ -1161,10 +1241,11 @@ top_solid_infill_speed = 40 fill_pattern = gyroid fill_density = 15% bridge_flow_ratio = 0.85 +support_material_xy_spacing = 60% -[print:0.15mm SPEED MINI] +[print:0.15mm SPEED @MINI] inherits = *0.15mm*; *MINI* -alias = 0.15mm SPEED +# alias = 0.15mm SPEED bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 perimeter_speed = 50 @@ -1173,10 +1254,11 @@ infill_speed = 140 solid_infill_speed = 140 top_solid_infill_speed = 40 bridge_flow_ratio = 0.85 +support_material_xy_spacing = 60% -[print:0.20mm QUALITY MINI] +[print:0.20mm QUALITY @MINI] inherits = *0.20mm*; *MINI* -alias = 0.20mm QUALITY +# alias = 0.20mm QUALITY bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 perimeter_speed = 40 @@ -1186,10 +1268,11 @@ solid_infill_speed = 80 top_solid_infill_speed = 40 fill_pattern = gyroid fill_density = 15% +support_material_xy_spacing = 60% -[print:0.20mm SPEED MINI] +[print:0.20mm SPEED @MINI] inherits = *0.20mm*; *MINI* -alias = 0.20mm SPEED +# alias = 0.20mm SPEED bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 perimeter_speed = 50 @@ -1198,34 +1281,37 @@ infill_speed = 140 max_print_speed = 150 solid_infill_speed = 140 top_solid_infill_speed = 40 +support_material_xy_spacing = 60% -[print:0.25mm DRAFT MINI] +[print:0.25mm DRAFT @MINI] inherits = *0.25mm*; *MINI* -alias = 0.25mm DRAFT +# alias = 0.25mm DRAFT bridge_speed = 30 compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.4 external_perimeter_speed = 40 -infill_speed = 90 -perimeter_speed = 50 +infill_speed = 110 +perimeter_speed = 55 small_perimeter_speed = 25 -solid_infill_speed = 85 +solid_infill_speed = 100 top_solid_infill_speed = 45 first_layer_extrusion_width = 0.42 -infill_extrusion_width = 0.48 -solid_infill_extrusion_width = 0.48 +infill_extrusion_width = 0.45 +solid_infill_extrusion_width = 0.45 top_infill_extrusion_width = 0.4 +support_material_xy_spacing = 60% # 0.25mm nozzle -[print:0.05mm ULTRADETAIL 0.25 nozzle MINI] + +[print:0.05mm ULTRADETAIL @0.25 nozzle MINI] inherits = *0.05mm*; *0.25nozzle*; *MINI* -alias = 0.05mm ULTRADETAIL +# alias = 0.05mm ULTRADETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.25 fill_pattern = grid fill_density = 20% -[print:0.07mm ULTRADETAIL 0.25 nozzle MINI] +[print:0.07mm ULTRADETAIL @0.25 nozzle MINI] inherits = *0.07mm*; *0.25nozzle*; *MINI* -alias = 0.07mm ULTRADETAIL +# alias = 0.07mm ULTRADETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.25 infill_speed = 30 solid_infill_speed = 30 @@ -1234,20 +1320,89 @@ top_solid_infill_speed = 20 fill_pattern = grid fill_density = 20% -[print:0.10mm DETAIL 0.25 nozzle MINI] +[print:0.10mm DETAIL @0.25 nozzle MINI] inherits = *0.10mm*; *0.25nozzleMINI*; *MINI* -alias = 0.10mm DETAIL +# alias = 0.10mm DETAIL compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.25 fill_pattern = grid fill_density = 20% -[print:0.15mm QUALITY 0.25 nozzle MINI] +[print:0.15mm QUALITY @0.25 nozzle MINI] inherits = *0.15mm*; *0.25nozzleMINI*; *MINI* -alias = 0.15mm QUALITY +# alias = 0.15mm QUALITY compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.25 fill_pattern = grid fill_density = 20% +# 0.6mm nozzle + +[print:0.15mm DETAIL @0.6 nozzle MINI] +inherits = *0.15mm*; *0.6nozzleMINI* +# alias = 0.15mm DETAIL +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 = 70 +max_print_speed = 100 +perimeter_speed = 45 +solid_infill_speed = 70 +top_solid_infill_speed = 45 +infill_extrusion_width = 0.65 +solid_infill_extrusion_width = 0.65 + +[print:0.20mm DETAIL @0.6 nozzle MINI] +inherits = *0.20mm*; *0.6nozzleMINI* +# alias = 0.20mm DETAIL +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 = 70 +max_print_speed = 100 +perimeter_speed = 45 +solid_infill_speed = 70 +top_solid_infill_speed = 45 +infill_extrusion_width = 0.65 +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 +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.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 +max_print_speed = 100 +perimeter_speed = 45 +solid_infill_speed = 60 +top_solid_infill_speed = 45 +external_perimeter_extrusion_width = 0.68 +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 +max_print_speed = 100 +perimeter_speed = 45 +solid_infill_speed = 50 +top_solid_infill_speed = 45 +external_perimeter_extrusion_width = 0.68 +perimeter_extrusion_width = 0.68 +infill_extrusion_width = 0.68 +solid_infill_extrusion_width = 0.68 + # XXXXXXxxXXXXXXXXXXXXXX # XXX--- filament ---XXX # XXXXXXXXxxXXXXXXXXXXXX @@ -1296,7 +1451,7 @@ first_layer_temperature = 215 max_fan_speed = 100 min_fan_speed = 100 temperature = 210 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}18{else}30{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.05{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{else}M900 K30{endif} ; Filament gcode LA 1.0" [filament:*PET*] inherits = *common* @@ -1312,7 +1467,7 @@ first_layer_bed_temperature = 85 first_layer_temperature = 230 max_fan_speed = 50 min_fan_speed = 30 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}24{else}45{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.08{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{else}M900 K45{endif} ; Filament gcode LA 1.0" temperature = 240 filament_retract_length = 1.4 filament_retract_lift = 0.2 @@ -1320,7 +1475,7 @@ compatible_printers_condition = printer_model!="MK2SMM" and printer_model!="MINI [filament:*PET06*] inherits = *PET* -compatible_printers_condition = nozzle_diameter[0]==0.6 and printer_model!="MK2SMM" 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.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_max_volumetric_speed = 15 [filament:*PETMMU1*] @@ -1339,7 +1494,18 @@ filament_retract_lift = nil filament_retract_before_travel = 1 filament_max_volumetric_speed = 7 compatible_printers_condition = printer_model=="MINI" -start_filament_gcode = "M900 K0.2 ; Filament gcode" +start_filament_gcode = "M900 K{if nozzle_diameter[0]==0.6}0.12{else}0.2{endif} ; Filament gcode" + +[filament:*PETMINI06*] +inherits = *PET* +filament_retract_length = nil +filament_retract_speed = 40 +filament_deretract_speed = 25 +filament_retract_lift = nil +filament_retract_before_travel = 1 +compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]==0.6 +start_filament_gcode = "M900 K0.12 ; Filament gcode" +filament_max_volumetric_speed = 13 [filament:*ABSMINI*] inherits = *ABS* @@ -1352,36 +1518,40 @@ filament_retract_before_travel = 3 filament_wipe = 0 filament_max_volumetric_speed = 10 compatible_printers_condition = printer_model=="MINI" -start_filament_gcode = "M900 K0.2 ; Filament gcode" +start_filament_gcode = "M900 K{if nozzle_diameter[0]==0.6}0.12{else}0.2{endif} ; Filament gcode" [filament:*FLEXMINI*] inherits = *FLEX* -filament_retract_length = 6 +first_layer_temperature = 245 +temperature = 245 +filament_retract_length = 4 filament_retract_speed = 40 filament_deretract_speed = 15 filament_retract_lift = 0 filament_retract_before_travel = 7 filament_wipe = 0 -bridge_fan_speed = 70 +bridge_fan_speed = 80 fan_always_on = 1 cooling = 0 -max_fan_speed = 40 -min_fan_speed = 40 -filament_max_volumetric_speed = 1.6 +max_fan_speed = 50 +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 = 3 -extrusion_multiplier = 1.2 +disable_fan_first_layers = 4 +extrusion_multiplier = 1.15 +filament_density = 1.22 +filament_colour = #F2F200 start_filament_gcode = "M900 K0 ; Filament gcode" [filament:*ABS*] inherits = *common* bed_temperature = 110 -bridge_fan_speed = 30 +bridge_fan_speed = 25 cooling = 0 disable_fan_first_layers = 3 fan_always_on = 0 fan_below_layer_time = 20 -filament_colour = #3A80CA +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 @@ -1390,7 +1560,29 @@ first_layer_temperature = 255 max_fan_speed = 30 min_fan_speed = 20 temperature = 255 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}18{else}30{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" +compatible_printers_condition = printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) + +[filament:*ABSC*] +inherits = *common* +bed_temperature = 110 +bridge_fan_speed = 25 +cooling = 1 +disable_fan_first_layers = 4 +fan_always_on = 0 +fan_below_layer_time = 30 +slowdown_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 +first_layer_bed_temperature = 100 +first_layer_temperature = 255 +max_fan_speed = 15 +min_fan_speed = 15 +min_print_speed = 15 +temperature = 255 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" compatible_printers_condition = printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) [filament:*FLEX*] @@ -1400,8 +1592,8 @@ bridge_fan_speed = 80 # For now, all but selected filaments are disabled for the MMU 2.0 compatible_printers_condition = nozzle_diameter[0]>0.35 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) cooling = 0 -disable_fan_first_layers = 1 -extrusion_multiplier = 1.2 +disable_fan_first_layers = 3 +extrusion_multiplier = 1.15 fan_always_on = 0 fan_below_layer_time = 100 filament_colour = #008000 @@ -1413,15 +1605,17 @@ max_fan_speed = 90 min_fan_speed = 70 start_filament_gcode = "M900 K0"; Filament gcode" temperature = 240 -filament_retract_length = 0.4 +filament_retract_length = 0.8 +filament_deretract_speed = 25 filament_retract_lift = 0 +filament_wipe = 0 [filament:ColorFabb bronzeFill] inherits = *PLA* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) extrusion_multiplier = 1.2 -filament_cost = 72.89 +filament_cost = 49.99 filament_density = 3.9 filament_colour = #804040 filament_max_volumetric_speed = 9 @@ -1431,7 +1625,7 @@ inherits = *PLA* filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) extrusion_multiplier = 1.2 -filament_cost = 72.89 +filament_cost = 49.99 filament_density = 3.13 filament_colour = #808080 filament_max_volumetric_speed = 8 @@ -1461,7 +1655,7 @@ first_layer_bed_temperature = 105 first_layer_temperature = 270 max_fan_speed = 20 min_fan_speed = 10 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}45{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.05{else}0.08{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{else}M900 K45{endif} ; Filament gcode LA 1.0" temperature = 270 [filament:ColorFabb PLA-PHA] @@ -1474,32 +1668,34 @@ filament_density = 1.24 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 = 58.30 +extrusion_multiplier = 1.1 +filament_cost = 38.99 filament_density = 1.15 filament_colour = #dfc287 filament_max_volumetric_speed = 9 first_layer_temperature = 200 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 200 +filament_retract_lift = 0.2 [filament:ColorFabb corkFill] 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 = 58.30 +extrusion_multiplier = 1.1 +filament_cost = 38.99 filament_density = 1.18 filament_colour = #634d33 filament_max_volumetric_speed = 6 first_layer_temperature = 220 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 220 +filament_retract_lift = 0.2 [filament:ColorFabb XT] inherits = *PET* filament_vendor = ColorFabb -filament_cost = 58.30 +filament_cost = 38.99 filament_density = 1.27 first_layer_bed_temperature = 90 first_layer_temperature = 260 @@ -1508,17 +1704,17 @@ temperature = 270 [filament:ColorFabb XT-CF20] inherits = *PET* filament_vendor = ColorFabb -extrusion_multiplier = 1.2 -filament_cost = 72.89 +extrusion_multiplier = 1.05 +filament_cost = 49.99 filament_density = 1.35 filament_colour = #804040 -filament_max_volumetric_speed = 1 +filament_max_volumetric_speed = 2 first_layer_bed_temperature = 90 first_layer_temperature = 260 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.06{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{else}M900 K30{endif} ; Filament gcode LA 1.0" temperature = 260 filament_retract_length = nil -filament_retract_lift = 0.2 +filament_retract_lift = 0.4 [filament:ColorFabb nGen] inherits = *PET* @@ -1554,6 +1750,41 @@ filament_retract_length = nil filament_retract_lift = 0 compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_model!="MINI" and num_extruders==1 && ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and single_extruder_multi_material) +[filament:Kimya PETG Carbon] +inherits = *PET* +filament_vendor = Kimya +extrusion_multiplier = 1.05 +filament_cost = 150 +filament_density = 1.317 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_bed_temperature = 85 +first_layer_temperature = 240 +temperature = 240 +filament_retract_length = nil +filament_retract_lift = 0.3 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.06{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K15{else}M900 K30{endif} ; Filament gcode LA 1.0" + +[filament:Kimya ABS Carbon] +inherits = *ABSC* +filament_vendor = Kimya +filament_cost = 140.4 +filament_density = 1.032 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_temperature = 260 +temperature = 260 + +[filament:Kimya ABS Kevlar] +inherits = *ABSC* +filament_vendor = Kimya +filament_cost = 140.4 +filament_density = 1.037 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_temperature = 260 +temperature = 260 + [filament:E3D Edge] inherits = *PET* filament_vendor = E3D @@ -1574,11 +1805,11 @@ temperature = 270 [filament:Fillamentum PLA] inherits = *PLA* filament_vendor = Fillamentum -filament_cost = 25.4 +filament_cost = 21.99 filament_density = 1.24 [filament:Fillamentum ABS] -inherits = *ABS* +inherits = *ABSC* filament_vendor = Fillamentum filament_cost = 32.4 filament_density = 1.04 @@ -1613,17 +1844,77 @@ bed_temperature = 110 cooling = 1 min_fan_speed = 20 max_fan_speed = 20 +bridge_fan_speed = 30 min_print_speed = 15 slowdown_below_layer_time = 15 disable_fan_first_layers = 4 filament_type = ASA filament_colour = #FFF2EC -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}12{else}20{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" + +[filament:Prusament PC Blend] +inherits = *ABS* +filament_vendor = Prusa Polymers +filament_cost = 49.99 +filament_density = 1.22 +fan_always_on = 0 +first_layer_temperature = 275 +first_layer_bed_temperature = 110 +temperature = 275 +bed_temperature = 115 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +min_print_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +filament_type = PC +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 8 +filament_retract_length = 1 +filament_retract_lift = 0.2 +compatible_printers_condition = printer_notes!~/.*PRINTER_MODEL_MK(2|2.5).*/ and printer_model!="MINI" and ! single_extruder_multi_material +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K17{else}M900 K40{endif} ; Filament gcode LA 1.0" + +[filament:Prusament PC Blend @MK2] +inherits = *ABS* +filament_vendor = Prusa Polymers +filament_cost = 49.99 +filament_density = 1.22 +fan_always_on = 0 +first_layer_temperature = 275 +first_layer_bed_temperature = 105 +temperature = 275 +bed_temperature = 110 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +min_print_speed = 15 +bridge_fan_speed = 30 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 6 +fan_below_layer_time = 30 +filament_type = PC +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 8 +filament_retract_length = 1 +filament_retract_lift = 0.2 +compatible_printers_condition = printer_model!="MK2SMM" and printer_notes=~/.*PRINTER_MODEL_MK(2|2.5).*/ and ! (printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and single_extruder_multi_material) +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K17{else}M900 K40{endif} ; Filament gcode LA 1.0" + +[filament:Prusament PC Blend @MK2MMU1] +inherits = Prusament PC Blend @MK2 +filament_retract_length = nil +filament_retract_lift = 0.2 +compatible_printers_condition = printer_model=="MK2SMM" +start_filament_gcode = "M900 K200 ; Filament gcode LA 1.0" [filament:Fillamentum CPE] inherits = *PET* filament_vendor = Fillamentum -filament_cost = 54.1 +filament_cost = 34.99 filament_density = 1.25 filament_type = CPE first_layer_bed_temperature = 90 @@ -1631,40 +1922,107 @@ first_layer_temperature = 275 max_fan_speed = 50 min_fan_speed = 50 temperature = 275 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{else}M900 K45{endif} ; Filament gcode LA 1.0" [filament:Fillamentum Timberfill] inherits = *PLA* filament_vendor = Fillamentum 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 +extrusion_multiplier = 1.1 filament_cost = 68 filament_density = 1.15 filament_colour = #804040 filament_max_volumetric_speed = 10 first_layer_temperature = 190 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 190 +filament_retract_lift = 0.2 + +[filament:Smartfil Wood] +inherits = *PLA* +filament_vendor = Smart Materials 3D +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 = 68 +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.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" +temperature = 220 +filament_retract_lift = 0.2 [filament:Generic ABS] -inherits = *ABS* +inherits = *ABSC* filament_vendor = Generic filament_cost = 27.82 filament_density = 1.04 -filament_notes = "List of materials tested with standard ABS print settings:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladec ABS" -[filament:Generic PET] +[filament:Esun ABS] +inherits = *ABSC* +filament_vendor = Esun +filament_cost = 27.82 +filament_density = 1.04 + +[filament:Hatchbox ABS] +inherits = *ABSC* +filament_vendor = Hatchbox +filament_cost = 27.82 +filament_density = 1.04 + +[filament:Plasty Mladec ABS] +inherits = *ABSC* +filament_vendor = Plasty Mladec +filament_cost = 27.82 +filament_density = 1.08 + +[filament:Verbatim ABS] +inherits = *ABSC* +filament_vendor = Verbatim +filament_cost = 25.87 +filament_density = 1.05 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.03{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" + +[filament:Generic PETG] inherits = *PET* +renamed_from = "Generic PET" filament_vendor = Generic filament_cost = 27.82 filament_density = 1.27 -filament_notes = "List of manufacturers tested with standard PET print settings:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladec PETG" + +[filament:Plasty Mladec PETG] +inherits = *PET* +filament_vendor = Plasty Mladec +filament_cost = 27.82 +filament_density = 1.27 [filament:Generic PLA] inherits = *PLA* filament_vendor = Generic filament_cost = 25.4 filament_density = 1.24 -filament_notes = "List of materials tested with 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:Devil Design PLA] +inherits = *PLA* +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.24 + +[filament:Devil Design PETG] +inherits = *PET* +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.23 +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 + +[filament:Spectrum PLA] +inherits = *PLA* +filament_vendor = Spectrum +filament_cost = 21.50 +filament_density = 1.24 [filament:Generic FLEX] inherits = *FLEX* @@ -1676,6 +2034,73 @@ filament_retract_length = 0 filament_retract_speed = nil filament_retract_lift = nil +[filament:Fillamentum Flexfill 92A] +inherits = *FLEX* +filament_vendor = Fillamentum +filament_cost = 33.99 +filament_density = 1.20 +filament_max_volumetric_speed = 1.2 +filament_retract_length = 0 +filament_retract_speed = nil +filament_retract_lift = nil +fan_always_on = 1 +cooling = 0 +max_fan_speed = 50 +min_fan_speed = 50 +disable_fan_first_layers = 5 + +[filament:SainSmart TPU] +inherits = *FLEX* +filament_vendor = SainSmart +fan_always_on = 1 +filament_max_volumetric_speed = 2.5 +extrusion_multiplier = 1.1 +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 = 1 +filament_retract_speed = nil +filament_deretract_speed = 25 +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] +inherits = *FLEX* +filament_vendor = Filatech +fan_always_on = 1 +filament_max_volumetric_speed = 2.5 +extrusion_multiplier = 1.1 +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 = 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 +min_print_speed = 15 +slowdown_below_layer_time = 10 +cooling = 1 + [filament:Polymaker PC-Max] inherits = *ABS* filament_vendor = Polymaker @@ -1683,35 +2108,34 @@ filament_cost = 77.3 filament_density = 1.20 filament_type = PC bed_temperature = 115 -filament_colour = #3A80CA +filament_colour = #FFF2EC first_layer_bed_temperature = 100 first_layer_temperature = 270 temperature = 270 bridge_fan_speed = 0 +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 filament_colour = #FFFFD7 filament_max_volumetric_speed = 3.8 -filament_notes = "List of materials tested with standard PVA print settings:\n\nPrimaSelect PVA+\nICE FILAMENTS PVA 'NAUGHTY NATURAL'" 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 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 195 [filament:Prusa ABS] -inherits = *ABS* -filament_vendor = Prusa -filament_cost = 27.82 +inherits = *ABSC* +filament_vendor = Made for Prusa +filament_cost = 22.99 filament_density = 1.08 -filament_notes = "List of materials tested with standard ABS print settings:\n\nEsun ABS\nFil-A-Gehr ABS\nHatchboxABS\nPlasty Mladec ABS" [filament:*ABS MMU2*] inherits = Prusa ABS @@ -1726,14 +2150,38 @@ filament_unload_time = 12 filament_loading_speed = 14 filament_unloading_speed = 20 -[filament:Generic ABS MMU2] +[filament:Generic ABS @MMU2] inherits = *ABS MMU2* -alias = Generic ABS filament_vendor = Generic -[filament:Prusament ASA MMU2] +[filament:Generic HIPS @MMU2] +inherits = *ABS MMU2* +filament_vendor = Generic +filament_cost = 27.3 +filament_density = 1.04 +fan_always_on = 1 +first_layer_temperature = 230 +first_layer_bed_temperature = 100 +temperature = 230 +bed_temperature = 110 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 50 +min_print_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 3 +filament_cooling_final_speed = 2 +filament_cooling_initial_speed = 3 +filament_cooling_moves = 1 +filament_type = HIPS +filament_soluble = 1 +filament_colour = #FFFFD7 +filament_ramming_parameters = "130 120 2.74194 2.96774 3.25806 3.77419 4.83871 6.3871 8.09677 9.64516 10.7419 11.2903| 0.05 2.66451 0.45 3.05805 0.95 4.05807 1.45 7.13871 1.95 10.2806 2.45 11.4194 2.95 11.342 3.45 11.4065 3.95 7.6 4.45 7.6 4.95 7.6" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.03{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" + +[filament:Prusament ASA @MMU2] inherits = *ABS MMU2* -alias = Prusament ASA filament_vendor = Prusa Polymers filament_cost = 35.28 filament_density = 1.07 @@ -1745,6 +2193,7 @@ bed_temperature = 110 cooling = 1 min_fan_speed = 20 max_fan_speed = 20 +bridge_fan_speed = 30 min_print_speed = 15 slowdown_below_layer_time = 15 disable_fan_first_layers = 4 @@ -1753,21 +2202,55 @@ filament_cooling_initial_speed = 3 filament_cooling_moves = 1 filament_type = ASA filament_colour = #FFF2EC -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{elsif nozzle_diameter[0]==0.6}12{else}20{endif} ; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" -[filament:Prusa ABS MMU2] +[filament:Prusament PC Blend @MMU2] inherits = *ABS MMU2* -alias = Prusa ABS -filament_vendor = Prusa +filament_vendor = Prusa Polymers +filament_cost = 49.99 +filament_density = 1.22 +fan_always_on = 0 +fan_below_layer_time = 30 +first_layer_temperature = 265 +first_layer_bed_temperature = 105 +temperature = 265 +bed_temperature = 110 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +min_print_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +filament_cooling_final_speed = 2 +filament_cooling_initial_speed = 3 +filament_cooling_moves = 1 +filament_max_volumetric_speed = 8 +filament_retract_length = 1 +filament_retract_lift = 0.2 +filament_ramming_parameters = "130 120 2.70968 2.93548 3.32258 3.83871 4.58065 5.54839 6.51613 7.35484 7.93548 8.16129| 0.05 2.66451 0.45 3.05805 0.95 4.05807 1.45 5.97742 1.95 7.69999 2.45 8.1936 2.95 11.342 3.45 11.4065 3.95 7.6 4.45 7.6 4.95 7.6" +filament_type = PC +filament_colour = #DEE0E6 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.07{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K17{else}M900 K40{endif} ; Filament gcode LA 1.0" + +[filament:Prusa ABS @MMU2] +inherits = *ABS MMU2* +filament_vendor = Made for Prusa +filament_cost = 22.99 + +[filament:Plasty Mladec ABS @MMU2] +inherits = *ABS MMU2* +filament_vendor = Plasty Mladec +filament_density = 1.08 [filament:Prusa HIPS] inherits = *ABS* -filament_vendor = Prusa +filament_vendor = Made for Prusa filament_cost = 27.3 filament_density = 1.04 bridge_fan_speed = 50 cooling = 1 -extrusion_multiplier = 0.9 +extrusion_multiplier = 1 fan_always_on = 1 fan_below_layer_time = 10 filament_colour = #FFFFD7 @@ -1776,15 +2259,48 @@ filament_type = HIPS first_layer_temperature = 220 max_fan_speed = 20 min_fan_speed = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.03{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 220 -[filament:Prusa PET] +[filament:Generic HIPS] +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 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.03{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" +temperature = 230 + +[filament:Prusa PETG] inherits = *PET* -filament_vendor = Prusa -filament_cost = 27.82 +renamed_from = "Prusa PET" +filament_vendor = Made for Prusa +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:Verbatim PETG] +inherits = *PET* +filament_vendor = Verbatim +filament_cost = 27.90 +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:Fiberlogy PETG] +inherits = *PET* +filament_vendor = Fiberlogy +filament_cost = 21.50 filament_density = 1.27 -filament_notes = "List of manufacturers tested with standard PET print settings:\n\nE3D Edge\nPlasty Mladec 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) [filament:Prusament PETG] @@ -1792,31 +2308,67 @@ inherits = *PET* filament_vendor = Prusa Polymers first_layer_temperature = 240 temperature = 250 -filament_cost = 24.99 +filament_cost = 29.99 filament_density = 1.27 filament_type = PETG compatible_printers_condition = nozzle_diameter[0]!=0.6 and printer_model!="MK2SMM" and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material) -[filament:Prusa PET 0.6 nozzle] +[filament:Prusa PETG @0.6 nozzle] inherits = *PET06* -alias = Prusa PET -filament_vendor = Prusa -filament_cost = 27.82 +renamed_from = "Prusa PET 0.6 nozzle"; "Prusa PETG 0.6 nozzle" +filament_vendor = Made for Prusa +filament_cost = 22.99 filament_density = 1.27 -filament_notes = "List of manufacturers tested with standard PET print settings:\n\nE3D Edge\nPlasty Mladec PETG" -[filament:Prusament PETG 0.6 nozzle] +[filament:Prusament PETG @0.6 nozzle] inherits = *PET06* -alias = Prusament PETG filament_vendor = Prusa Polymers first_layer_temperature = 240 temperature = 250 -filament_cost = 24.99 +filament_cost = 29.99 +filament_density = 1.27 +filament_type = PETG + +[filament:Plasty Mladec PETG @0.6 nozzle] +inherits = *PET06* +filament_vendor = Plasty Mladec +first_layer_temperature = 230 +temperature = 240 +filament_cost = 27.92 +filament_density = 1.27 +filament_type = PETG + +[filament:Devil Design PETG @0.6 nozzle] +inherits = *PET06* +filament_vendor = Devil Design +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 +filament_cost = 20.99 +filament_density = 1.23 +filament_type = PETG + +[filament:Verbatim PETG @0.6 nozzle] +inherits = *PET06* +filament_vendor = Verbatim +first_layer_temperature = 230 +temperature = 240 +filament_cost = 27.90 +filament_density = 1.27 +filament_type = PETG + +[filament:Fiberlogy PETG @0.6 nozzle] +inherits = *PET06* +filament_vendor = Fiberlogy +first_layer_temperature = 230 +temperature = 240 +filament_cost = 21.50 filament_density = 1.27 filament_type = PETG [filament:*PET MMU2*] -inherits = Prusa PET +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 temperature = 230 first_layer_temperature = 230 @@ -1825,7 +2377,6 @@ filament_cooling_initial_speed = 2 filament_cooling_moves = 1 filament_load_time = 15 filament_loading_speed = 14 -filament_notes = PET filament_ramming_parameters = "120 140 4.70968 4.74194 4.77419 4.80645 4.83871 4.87097 4.90323 5 5.25806 5.67742 6.29032 7.06452 7.83871 8.3871| 0.05 4.72901 0.45 4.73545 0.95 4.83226 1.45 4.88067 1.95 5.05483 2.45 5.93553 2.95 7.53556 3.45 8.6323 3.95 7.6 4.45 7.6 4.95 7.6" filament_unload_time = 12 filament_unloading_speed = 20 @@ -1839,44 +2390,103 @@ inherits = *PET MMU2* 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 filament_max_volumetric_speed = 13 -[filament:Generic PET MMU2] +[filament:Generic PETG @MMU2] inherits = *PET MMU2* -alias = Generic PET +renamed_from = "Generic PET MMU2"; "Generic PETG MMU2" filament_vendor = Generic -[filament:Prusa PET MMU2] +[filament:Plasty Mladec PETG @MMU2] inherits = *PET MMU2* -alias = Prusa PET -filament_vendor = Prusa +filament_vendor = Plasty Mladec -[filament:Prusament PETG MMU2] +[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:Prusament PETG @MMU2] inherits = *PET MMU2* filament_type = PETG -alias = Prusament PETG filament_vendor = Prusa Polymers +filament_cost = 29.99 +filament_density = 1.27 -[filament:Generic PET MMU2 0.6 nozzle] +[filament:Generic PETG @MMU2 0.6 nozzle] inherits = *PET MMU2 06* -alias = Generic PET +renamed_from = "Generic PET MMU2 0.6 nozzle"; "Generic PETG MMU2 0.6 nozzle" filament_vendor = Generic -[filament:Prusa PET MMU2 0.6 nozzle] +[filament:Prusa PETG @MMU2 0.6 nozzle] inherits = *PET MMU2 06* -alias = Prusa PET -filament_vendor = Prusa +renamed_from = "Prusa PET MMU2 0.6 nozzle"; "Prusa PETG MMU2 0.6 nozzle" +filament_vendor = Made for Prusa -[filament:Prusament PETG MMU2 0.6 nozzle] +[filament:Prusament PETG @MMU2 0.6 nozzle] inherits = *PET MMU2 06* filament_type = PETG -alias = Prusament PETG filament_vendor = Prusa Polymers +filament_cost = 29.99 +filament_density = 1.27 + +[filament:Plasty Mladec PETG @MMU2 0.6 nozzle] +inherits = *PET MMU2 06* +filament_type = PETG +filament_vendor = Plasty Mladec [filament:Prusa PLA] inherits = *PLA* -filament_vendor = Prusa +filament_vendor = Made for Prusa +filament_cost = 20.99 +filament_density = 1.24 + +[filament:Fiberlogy PLA] +inherits = *PLA* +filament_vendor = Fiberlogy +filament_cost = 25.4 +filament_density = 1.24 + +[filament:Plasty Mladec PLA] +inherits = *PLA* +filament_vendor = Plasty Mladec +filament_cost = 25.4 +filament_density = 1.24 + +[filament:AmazonBasics PLA] +inherits = *PLA* +filament_vendor = AmazonBasics +filament_cost = 25.4 +filament_density = 1.24 + +[filament:Hatchbox PLA] +inherits = *PLA* +filament_vendor = Hatchbox +filament_cost = 25.4 +filament_density = 1.24 + +[filament:Esun PLA] +inherits = *PLA* +filament_vendor = Esun +filament_cost = 25.4 +filament_density = 1.24 + +[filament:Das Filament PLA] +inherits = *PLA* +filament_vendor = Das Filament +filament_cost = 25.4 +filament_density = 1.24 + +[filament:EUMAKERS PLA] +inherits = *PLA* +filament_vendor = EUMAKERS +filament_cost = 25.4 +filament_density = 1.24 + +[filament:Floreon3D PLA] +inherits = *PLA* +filament_vendor = Floreon3D filament_cost = 25.4 filament_density = 1.24 -filament_notes = "List of materials tested with standard PLA print settings:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFiberlogy PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladec PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nAmazonBasics PLA" [filament:Prusament PLA] inherits = *PLA* @@ -1902,28 +2512,46 @@ filament_loading_speed_start = 19 filament_minimal_purge_on_wipe_tower = 15 filament_unloading_speed_start = 100 -[filament:Generic PLA MMU2] +[filament:Generic PLA @MMU2] inherits = *PLA MMU2* -alias = Generic PLA filament_vendor = Generic -[filament:Prusa PLA MMU2] +[filament:Prusa PLA @MMU2] inherits = *PLA MMU2* -alias = Prusa PLA -filament_vendor = Prusa +filament_vendor = Made for Prusa +filament_cost = 20.99 -[filament:Prusament PLA MMU2] +[filament:Prusament PLA @MMU2] inherits = *PLA MMU2* -alias = Prusament PLA filament_vendor = Prusa Polymers +filament_cost = 24.99 +filament_density = 1.24 + +[filament:Fillamentum PLA @MMU2] +inherits = *PLA MMU2* +filament_vendor = Fillamentum +filament_cost = 21.99 +filament_density = 1.24 [filament:SemiFlex or Flexfill 98A] inherits = *FLEX* filament_vendor = Generic -filament_cost = 82 +filament_cost = 33.99 filament_density = 1.22 filament_max_volumetric_speed = 1.35 +[filament:Fillamentum Flexfill 98A] +inherits = *FLEX* +filament_vendor = Fillamentum +filament_cost = 33.99 +filament_density = 1.23 +filament_max_volumetric_speed = 1.35 +fan_always_on = 1 +cooling = 0 +max_fan_speed = 50 +min_fan_speed = 50 +disable_fan_first_layers = 5 + [filament:Taulman Bridge] inherits = *common* filament_vendor = Taulman @@ -1936,14 +2564,38 @@ disable_fan_first_layers = 3 fan_always_on = 0 fan_below_layer_time = 20 filament_colour = #DEE0E6 -filament_max_volumetric_speed = 10 +filament_max_volumetric_speed = 7 filament_soluble = 0 filament_type = NYLON first_layer_bed_temperature = 60 first_layer_temperature = 240 -max_fan_speed = 5 +max_fan_speed = 0 min_fan_speed = 0 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.08{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K24{else}M900 K45{endif} ; Filament gcode LA 1.0" +temperature = 250 + +[filament:Fillamentum Nylon FX256] +inherits = *common* +filament_vendor = Fillamentum +filament_cost = 56.99 +filament_density = 1.01 +bed_temperature = 90 +bridge_fan_speed = 30 +cooling = 1 +disable_fan_first_layers = 6 +fan_always_on = 0 +fan_below_layer_time = 20 +min_print_speed = 15 +slowdown_below_layer_time = 20 +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 6 +filament_soluble = 0 +filament_type = NYLON +first_layer_bed_temperature = 90 +first_layer_temperature = 250 +max_fan_speed = 0 +min_fan_speed = 0 +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.05{else}0.1{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K28{else}M900 K48{endif} ; Filament gcode LA 1.0" temperature = 250 [filament:Taulman T-Glase] @@ -1958,7 +2610,7 @@ first_layer_bed_temperature = 90 first_layer_temperature = 240 max_fan_speed = 5 min_fan_speed = 0 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.04{else}0.06{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K18{else}M900 K30{endif} ; Filament gcode LA 1.0" [filament:Verbatim PLA] inherits = *PLA* @@ -1969,7 +2621,7 @@ filament_density = 1.24 [filament:Verbatim BVOH] inherits = *common* filament_vendor = Verbatim -filament_cost = 218 +filament_cost = 79.99 filament_density = 1.23 bed_temperature = 60 bridge_fan_speed = 100 @@ -1980,19 +2632,17 @@ fan_always_on = 0 fan_below_layer_time = 100 filament_colour = #FFFFD7 filament_max_volumetric_speed = 4 -filament_notes = "List of materials tested with standard PVA print settings:\n\nVerbatim BVOH" filament_soluble = 1 filament_type = PVA first_layer_bed_temperature = 60 first_layer_temperature = 215 max_fan_speed = 100 min_fan_speed = 100 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}0{else}10{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 210 -[filament:Verbatim BVOH MMU2] +[filament:Verbatim BVOH @MMU2] inherits = Verbatim BVOH -alias = 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 temperature = 195 @@ -2011,9 +2661,8 @@ filament_unloading_speed = 20 filament_unloading_speed_start = 100 filament_loading_speed_start = 19 -[filament:PrimaSelect PVA+ MMU2] +[filament:PrimaSelect PVA+ @MMU2] inherits = *common* -alias = PrimaSelect PVA+ filament_vendor = PrimaSelect compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material bed_temperature = 60 @@ -2026,7 +2675,7 @@ filament_colour = #FFFFD7 filament_cooling_final_speed = 2 filament_cooling_initial_speed = 4 filament_cooling_moves = 2 -filament_cost = 25.4 +filament_cost = 45.01 filament_density = 1.24 filament_diameter = 1.75 filament_load_time = 15 @@ -2034,7 +2683,6 @@ filament_loading_speed = 14 filament_loading_speed_start = 19 filament_max_volumetric_speed = 3.8 filament_minimal_purge_on_wipe_tower = 15 -filament_notes = "List of materials tested with standard PVA print settings:\n\nPrimaSelect PVA+" filament_ramming_parameters = "120 110 3.83871 3.90323 3.96774 4.03226 4.09677 4.19355 4.3871 4.83871 5.67742 6.93548 8.54839 10.3226 11.9677 13.2581 14.129 14.5806| 0.05 3.8258 0.45 3.89676 0.95 4.05807 1.45 4.23548 1.95 5.18386 2.45 7.80651 2.95 11.5356 3.45 13.9872 3.95 14.7613 4.45 7.6 4.95 7.6" filament_soluble = 1 filament_toolchange_delay = 0 @@ -2048,7 +2696,7 @@ max_fan_speed = 100 min_fan_speed = 100 min_print_speed = 15 slowdown_below_layer_time = 20 -start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" +start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6}0.12{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.6}0.02{else}0.04{endif} ; Filament gcode LA 1.5\n{if printer_notes=~/.*PRINTER_MODEL_MINI.*/};{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}M900 K200{elsif nozzle_diameter[0]==0.6}M900 K12{else}M900 K20{endif} ; Filament gcode LA 1.0" temperature = 195 [filament:Verbatim PP] @@ -2065,20 +2713,18 @@ fan_always_on = 1 fan_below_layer_time = 100 filament_colour = #DEE0E6 filament_max_volumetric_speed = 5 -filament_notes = "List of materials tested with standard PLA print settings:\n\nEsun PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladec PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nEUMAKERS PLA" filament_type = PP 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 -[filament:ColorFabb HT MMU1] +[filament:ColorFabb HT @MMU1] inherits = *PETMMU1* -alias = ColorFabb HT filament_vendor = ColorFabb bed_temperature = 110 bridge_fan_speed = 30 @@ -2095,35 +2741,32 @@ 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 XT MMU1] +[filament:ColorFabb XT @MMU1] inherits = *PETMMU1* -alias = ColorFabb XT filament_vendor = ColorFabb filament_type = PETG -filament_cost = 62.9 +filament_cost = 38.99 filament_density = 1.27 first_layer_bed_temperature = 90 first_layer_temperature = 260 temperature = 270 -[filament:ColorFabb XT-CF20 MMU1] +[filament:ColorFabb XT-CF20 @MMU1] inherits = *PETMMU1* -alias = ColorFabb XT-CF20 filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_model=="MK2SMM" -extrusion_multiplier = 1.2 -filament_cost = 80.65 +extrusion_multiplier = 1.05 +filament_cost = 49.99 filament_density = 1.35 filament_colour = #804040 -filament_max_volumetric_speed = 1 +filament_max_volumetric_speed = 2 first_layer_bed_temperature = 90 first_layer_temperature = 260 start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif}; Filament gcode" temperature = 260 -[filament:ColorFabb nGen MMU1] +[filament:ColorFabb nGen @MMU1] inherits = *PETMMU1* -alias = ColorFabb nGen filament_vendor = ColorFabb filament_cost = 21.2 filament_density = 1.2 @@ -2135,20 +2778,17 @@ first_layer_temperature = 240 max_fan_speed = 35 min_fan_speed = 20 -[filament:E3D Edge MMU1] +[filament:E3D Edge @MMU1] inherits = *PETMMU1* -alias = E3D Edge filament_vendor = E3D filament_cost = 56.9 filament_density = 1.26 filament_type = EDGE -filament_notes = "List of manufacturers tested with standard PET print settings:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladec PETG" -[filament:Fillamentum CPE MMU1] +[filament:Fillamentum CPE @MMU1] inherits = *PETMMU1* -alias = Fillamentum CPE filament_vendor = Fillamentum -filament_cost = 54.1 +filament_cost = 34.99 filament_density = 1.25 filament_type = CPE first_layer_bed_temperature = 90 @@ -2157,35 +2797,59 @@ max_fan_speed = 50 min_fan_speed = 50 temperature = 275 -[filament:Generic PET MMU1] +[filament:Generic PETG @MMU1] inherits = *PETMMU1* -alias = Generic PET +renamed_from = "Generic PET MMU1"; "Generic PETG MMU1" filament_vendor = Generic filament_cost = 27.82 filament_density = 1.27 -filament_notes = "List of manufacturers tested with standard PET print settings:\n\nE3D Edge\nFillamentum CPE GH100\nPlasty Mladec PETG" -[filament:Prusa PET MMU1] +[filament:Devil Design PETG @MMU1] inherits = *PETMMU1* -alias = Prusa PET -filament_vendor = Prusa +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.23 +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 + +[filament:Plasty Mladec PETG @MMU1] +inherits = *PETMMU1* +filament_vendor = Plasty Mladec filament_cost = 27.82 filament_density = 1.27 -filament_notes = "List of manufacturers tested with standard PET print settings:\n\nE3D Edge\nPlasty Mladec PETG" -[filament:Prusament PETG MMU1] +[filament:Verbatim PETG @MMU1] +inherits = *PETMMU1* +filament_vendor = Verbatim +filament_cost = 27.90 +filament_density = 1.27 + +[filament:Fiberlogy PETG @MMU1] +inherits = *PETMMU1* +filament_vendor = Fiberlogy +filament_cost = 21.50 +filament_density = 1.27 + +[filament:Prusa PETG @MMU1] +inherits = *PETMMU1* +renamed_from = "Prusa PET MMU1"; "Prusa PETG MMU1" +filament_vendor = Made for Prusa +filament_cost = 22.99 +filament_density = 1.27 + +[filament:Prusament PETG @MMU1] inherits = *PETMMU1* -alias = Prusament PETG filament_vendor = Prusa Polymers first_layer_temperature = 240 temperature = 250 -filament_cost = 24.99 +filament_cost = 29.99 filament_density = 1.27 filament_type = PETG -[filament:Taulman T-Glase MMU1] +[filament:Taulman T-Glase @MMU1] inherits = *PETMMU1* -alias = Taulman T-Glase filament_vendor = Taulman filament_cost = 40 filament_density = 1.27 @@ -2198,9 +2862,8 @@ 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:SemiFlex or Flexfill 98A MMU1] +[filament:SemiFlex or Flexfill 98A @MMU1] inherits = *FLEX* -alias = SemiFlex or Flexfill 98A filament_vendor = Generic filament_cost = 82 filament_density = 1.22 @@ -2210,9 +2873,8 @@ filament_retract_speed = nil filament_retract_lift = nil compatible_printers_condition = printer_model=="MK2SMM" -[filament:Generic FLEX MMU1] +[filament:Generic FLEX @MMU1] inherits = *FLEX* -alias = Generic FLEX filament_vendor = Generic filament_cost = 82 filament_density = 1.22 @@ -2224,21 +2886,194 @@ compatible_printers_condition = printer_model=="MK2SMM" ## Filaments MINI -[filament:Generic PET MINI] -inherits = Generic PET; *PETMINI* -alias = Generic PET +[filament:Generic PETG @MINI] +inherits = Generic PETG; *PETMINI* +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.6 -[filament:Generic ABS MINI] +[filament:Devil Design PETG @MINI] +inherits = Generic PETG; *PETMINI* +filament_vendor = Devil Design +filament_cost = 20.99 +filament_density = 1.23 +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 +compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 + +[filament:Plasty Mladec PETG @MINI] +inherits = Generic PETG; *PETMINI* +filament_vendor = Plasty Mladec +filament_cost = 27.82 +filament_density = 1.27 +compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 + +[filament:Verbatim PETG @MINI] +inherits = Generic PETG; *PETMINI* +filament_vendor = Verbatim +filament_cost = 27.90 +filament_density = 1.27 +compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 + +[filament:Fiberlogy PETG @MINI] +inherits = Generic PETG; *PETMINI* +filament_vendor = Fiberlogy +filament_cost = 21.50 +filament_density = 1.27 +compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 + +[filament:Generic ABS @MINI] inherits = Generic ABS; *ABSMINI* -alias = Generic ABS +filament_vendor = Generic +filament_cost = 27.82 +filament_density = 1.08 +fan_always_on = 0 +cooling = 1 +min_fan_speed = 15 +max_fan_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +bridge_fan_speed = 25 -[filament:Prusament PETG MINI] +[filament:Kimya ABS Carbon @MINI] +inherits = *ABSMINI* +filament_vendor = Kimya +filament_cost = 140.4 +filament_density = 1.032 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_temperature = 260 +temperature = 260 + +[filament:Kimya ABS Kevlar @MINI] +inherits = *ABSMINI* +filament_vendor = Kimya +filament_cost = 140.4 +filament_density = 1.037 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_temperature = 260 +temperature = 260 + +[filament:Esun ABS @MINI] +inherits = Generic ABS; *ABSMINI* +filament_vendor = Esun +filament_cost = 27.82 +filament_density = 1.08 +fan_always_on = 0 +cooling = 1 +min_fan_speed = 15 +max_fan_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +bridge_fan_speed = 25 + +[filament:Hatchbox ABS @MINI] +inherits = Generic ABS; *ABSMINI* +filament_vendor = Hatchbox +filament_cost = 27.82 +filament_density = 1.08 +fan_always_on = 0 +cooling = 1 +min_fan_speed = 15 +max_fan_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +bridge_fan_speed = 25 + +[filament:Plasty Mladec ABS @MINI] +inherits = Generic ABS; *ABSMINI* +filament_vendor = Plasty Mladec +filament_cost = 27.82 +filament_density = 1.08 +fan_always_on = 0 +cooling = 1 +min_fan_speed = 15 +max_fan_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +bridge_fan_speed = 25 + +[filament:Verbatim ABS @MINI] +inherits = Generic ABS; *ABSMINI* +filament_vendor = Verbatim +filament_cost = 25.87 +filament_density = 1.05 +fan_always_on = 0 +cooling = 1 +min_fan_speed = 15 +max_fan_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +bridge_fan_speed = 25 + +[filament:Prusament PETG @MINI] inherits = Prusament PETG; *PETMINI* -alias = Prusament PETG +filament_vendor = Prusa Polymers +first_layer_temperature = 240 +temperature = 250 +filament_density = 1.27 +filament_cost = 29.99 +compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6 -[filament:Prusament ASA MINI] +[filament:Kimya PETG Carbon @MINI] +inherits = *PETMINI* +filament_vendor = Kimya +extrusion_multiplier = 1.05 +filament_cost = 150 +filament_density = 1.317 +filament_colour = #804040 +filament_max_volumetric_speed = 6 +first_layer_bed_temperature = 85 +first_layer_temperature = 240 +temperature = 240 +filament_retract_length = nil +filament_retract_lift = 0.3 + +[filament:Prusament PETG @0.6 nozzle MINI] +inherits = Prusament PETG; *PETMINI06* +first_layer_temperature = 240 +temperature = 250 +filament_density = 1.27 +filament_cost = 29.99 + +[filament:Generic PETG @0.6 nozzle MINI] +inherits = Generic PETG; *PETMINI06* +renamed_from = "Generic PET 0.6 nozzle MINI"; "Generic PETG 0.6 nozzle MINI" + +[filament:Devil Design PETG @0.6 nozzle MINI] +inherits = Generic PETG; *PETMINI06* +filament_vendor = Devil Design +first_layer_temperature = 230 +first_layer_bed_temperature = 85 +temperature = 230 +bed_temperature = 90 +filament_cost = 20.99 +filament_density = 1.23 + +[filament:Plasty Mladec PETG @0.6 nozzle MINI] +inherits = Generic PETG; *PETMINI06* +filament_vendor = Plasty Mladec + +[filament:Verbatim PETG @0.6 nozzle MINI] +inherits = Generic PETG; *PETMINI06* +filament_vendor = Verbatim + +[filament:Fiberlogy PETG @0.6 nozzle MINI] +inherits = Generic PETG; *PETMINI06* +filament_vendor = Fiberlogy + +[filament:Prusament ASA @MINI] inherits = Prusament ASA; *ABSMINI* -alias = Prusament ASA first_layer_temperature = 260 first_layer_bed_temperature = 100 temperature = 260 @@ -2247,45 +3082,143 @@ 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 filament_type = ASA filament_colour = #FFF2EC +filament_cost = 35.28 +filament_density = 1.07 -[filament:Fillamentum Flexfill 98A MINI] +[filament:Fillamentum Flexfill 98A @MINI] inherits = SemiFlex or Flexfill 98A; *FLEXMINI* -alias = Fillamentum Flexfill 98A filament_vendor = Fillamentum -filament_max_volumetric_speed = 1.6 +first_layer_temperature = 240 +temperature = 240 +filament_max_volumetric_speed = 1.35 +filament_cost = 33.99 -[filament:Fillamentum CPE MINI] +[filament:Generic FLEX @MINI] +inherits = SemiFlex or Flexfill 98A; *FLEXMINI* +filament_vendor = Generic +fan_always_on = 0 +bridge_fan_speed = 80 +first_layer_temperature = 240 +temperature = 240 +filament_retract_length = 3 +filament_max_volumetric_speed = 1.35 + +[filament:AmazonBasics TPU @MINI] +inherits = *FLEXMINI* +filament_vendor = AmazonBasics +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 = 5 +filament_cost = 19.99 +filament_density = 1.21 + +[filament:SainSmart TPU @MINI] +inherits = *FLEXMINI* +filament_vendor = SainSmart +filament_max_volumetric_speed = 1.8 +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 = 5 +min_print_speed = 15 +slowdown_below_layer_time = 10 +cooling = 1 +filament_cost = 32.99 +filament_density = 1.21 + +[filament:Filatech FilaFlex40 @MINI] +inherits = *FLEXMINI* +filament_vendor = Filatech +filament_max_volumetric_speed = 1.8 +fan_always_on = 1 +first_layer_temperature = 240 +first_layer_bed_temperature = 55 +temperature = 240 +bed_temperature = 55 +filament_retract_length = 4 +filament_retract_before_travel = 5 +bridge_fan_speed = 80 +max_fan_speed = 50 +min_fan_speed = 50 +min_print_speed = 15 +slowdown_below_layer_time = 10 +cooling = 1 +filament_cost = 34.99 + +[filament:Fillamentum Flexfill 92A @MINI] +inherits = *FLEXMINI* +filament_vendor = Fillamentum +first_layer_temperature = 245 +temperature = 245 +filament_retract_length = 3 +filament_retract_speed = 40 +filament_deretract_speed = 15 +filament_retract_lift = 0 +filament_retract_before_travel = 7 +filament_wipe = 0 +filament_density = 1.20 +filament_cost = 33.95 +bridge_fan_speed = 70 +fan_always_on = 1 +cooling = 0 +max_fan_speed = 50 +min_fan_speed = 50 +filament_max_volumetric_speed = 1.2 +compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_model=="MINI" +disable_fan_first_layers = 4 +extrusion_multiplier = 1.2 +start_filament_gcode = "M900 K0 ; Filament gcode" + +[filament:Fillamentum CPE @MINI] inherits = Fillamentum CPE; *PETMINI* -alias = Fillamentum CPE first_layer_temperature = 265 first_layer_bed_temperature = 90 temperature = 265 +filament_type = CPE +filament_cost = 34.99 +filament_density = 1.25 -[filament:ColorFabb nGen MINI] +[filament:ColorFabb nGen @MINI] inherits = ColorFabb nGen; *PETMINI* -alias = ColorFabb nGen +filament_cost = 52.46 +filament_density = 1.2 -[filament:ColorFabb nGen flex MINI] -inherits = ColorFabb nGen flex; *FLEXMINI* -alias = ColorFabb nGen flex -filament_max_volumetric_speed = 4 - -[filament:E3D PC-ABS MINI] +[filament:E3D PC-ABS @MINI] inherits = E3D PC-ABS; *ABSMINI* -alias = E3D PC-ABS +filament_density = 1.05 +filament_cost = 28.80 -[filament:Fillamentum ABS MINI] +[filament:Fillamentum ABS @MINI] inherits = Fillamentum ABS; *ABSMINI* -alias = Fillamentum ABS +filament_cost = 32.4 +filament_density = 1.04 +fan_always_on = 0 +cooling = 1 +min_fan_speed = 15 +max_fan_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +bridge_fan_speed = 25 -[filament:Fillamentum ASA MINI] +[filament:Fillamentum ASA @MINI] inherits = Fillamentum ASA; *ABSMINI* -alias = Fillamentum ASA first_layer_temperature = 255 first_layer_bed_temperature = 100 temperature = 255 @@ -2299,32 +3232,72 @@ slowdown_below_layer_time = 15 disable_fan_first_layers = 4 filament_type = ASA filament_colour = #FFF2EC +filament_cost = 38.7 +filament_density = 1.07 -[filament:Polymaker PC-Max MINI] +[filament:Polymaker PC-Max @MINI] inherits = Polymaker PC-Max; *ABSMINI* -alias = Polymaker PC-Max filament_type = PC +filament_max_volumetric_speed = 7 bed_temperature = 100 -filament_colour = #3A80CA +filament_colour = #FFF2EC first_layer_bed_temperature = 100 first_layer_temperature = 270 temperature = 270 bridge_fan_speed = 0 +filament_cost = 77.3 +filament_density = 1.20 -[filament:Prusa ABS MINI] +[filament:Prusament PC Blend @MINI] inherits = *ABSMINI* -alias = Prusa ABS -filament_vendor = Prusa +filament_vendor = Prusa Polymers +filament_cost = 49.99 +filament_density = 1.22 +fan_always_on = 0 +first_layer_temperature = 275 +first_layer_bed_temperature = 100 +temperature = 275 +bed_temperature = 100 +cooling = 1 +min_fan_speed = 20 +max_fan_speed = 20 +bridge_fan_speed = 30 +min_print_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +filament_type = PC +filament_colour = #DEE0E6 +filament_max_volumetric_speed = 7 +filament_retract_length = nil +filament_retract_speed = nil +filament_deretract_speed = nil +filament_retract_lift = nil +filament_retract_before_travel = nil +filament_wipe = nil -[filament:Generic HIPS MINI] +[filament:Prusa ABS @MINI] +inherits = *ABSMINI* +filament_vendor = Made for Prusa +filament_cost = 22.99 +filament_density = 1.08 +fan_always_on = 0 +cooling = 1 +min_fan_speed = 15 +max_fan_speed = 15 +slowdown_below_layer_time = 20 +disable_fan_first_layers = 4 +fan_below_layer_time = 30 +bridge_fan_speed = 25 + +[filament:Generic HIPS @MINI] inherits = *ABSMINI* -alias = Generic HIPS filament_vendor = Generic filament_cost = 27.3 filament_density = 1.04 bridge_fan_speed = 50 cooling = 1 -extrusion_multiplier = 0.9 +extrusion_multiplier = 1 fan_always_on = 1 fan_below_layer_time = 10 filament_colour = #FFFFD7 @@ -2333,12 +3306,10 @@ filament_type = HIPS first_layer_temperature = 230 max_fan_speed = 20 min_fan_speed = 20 -start_filament_gcode = "M900 K0.2 ; Filament gcode" temperature = 230 -[filament:ColorFabb HT MINI] +[filament:ColorFabb HT @MINI] inherits = *PETMINI* -alias = ColorFabb HT filament_vendor = ColorFabb bed_temperature = 100 bridge_fan_speed = 30 @@ -2352,38 +3323,33 @@ first_layer_bed_temperature = 100 first_layer_temperature = 270 max_fan_speed = 20 min_fan_speed = 10 -start_filament_gcode = "M900 K0.2 ; Filament gcode" temperature = 270 -[filament:ColorFabb XT MINI] +[filament:ColorFabb XT @MINI] inherits = *PETMINI* -alias = ColorFabb XT filament_vendor = ColorFabb filament_type = PETG -filament_cost = 62.9 +filament_cost = 38.99 filament_density = 1.27 first_layer_bed_temperature = 90 first_layer_temperature = 260 temperature = 270 -[filament:ColorFabb XT-CF20 MINI] +[filament:ColorFabb XT-CF20 @MINI] inherits = *PETMINI* -alias = ColorFabb XT-CF20 filament_vendor = ColorFabb compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_model=="MINI" -extrusion_multiplier = 1.2 -filament_cost = 80.65 +extrusion_multiplier = 1.05 +filament_cost = 49.99 filament_density = 1.35 filament_colour = #804040 -filament_max_volumetric_speed = 1 +filament_max_volumetric_speed = 2 first_layer_bed_temperature = 90 first_layer_temperature = 260 -start_filament_gcode = "M900 K0.2 ; Filament gcode" temperature = 260 -[filament:Taulman T-Glase MINI] +[filament:Taulman T-Glase @MINI] inherits = *PETMINI* -alias = Taulman T-Glase filament_vendor = Taulman filament_cost = 40 filament_density = 1.27 @@ -2394,21 +3360,27 @@ first_layer_bed_temperature = 90 first_layer_temperature = 240 max_fan_speed = 5 min_fan_speed = 0 -start_filament_gcode = "M900 K0.2 ; Filament gcode" -[filament:E3D Edge MINI] +[filament:E3D Edge @MINI] inherits = *PETMINI* -alias = E3D Edge filament_vendor = E3D filament_cost = 56.9 filament_density = 1.26 filament_type = EDGE -[filament:Prusa PET MINI] +[filament:Prusa PETG @MINI] inherits = *PETMINI* -alias = Prusa PET -filament_vendor = Prusa -filament_cost = 27.82 +renamed_from = "Prusa PET MINI"; "Prusa PETG MINI" +filament_vendor = Made for Prusa +filament_cost = 22.99 +filament_density = 1.27 +compatible_printers_condition = printer_model=="MINI" 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 = 22.99 filament_density = 1.27 [sla_print:*common*] @@ -2492,648 +3464,1084 @@ initial_layer_height = 0.1 ########### Materials 0.025 -[sla_material:3DM-ABS 0.025] +[sla_material:3DM-ABS @0.025] inherits = *common 0.025* exposure_time = 12 initial_exposure_time = 35 material_type = Tough material_vendor = 3DM -[sla_material:3DM-Vulcan Gold 0.025] +[sla_material:3DM-Vulcan Gold @0.025] inherits = *common 0.025* exposure_time = 12 initial_exposure_time = 30 material_type = Tough material_vendor = 3DM -[sla_material:BlueCast Phrozen Wax 0.025] +[sla_material:3DM-TOUGH Clear 0.025] +inherits = *common 0.025* +exposure_time = 9 +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 initial_exposure_time = 50 material_type = Tough material_vendor = BlueCast -[sla_material:BlueCast EcoGray 0.025] +[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 initial_exposure_time = 40 material_type = Tough material_vendor = BlueCast -[sla_material:BlueCast Kera Master Dental 0.025] +[sla_material:BlueCast Kera Master Dental @0.025] inherits = *common 0.025* exposure_time = 6 initial_exposure_time = 45 material_type = Dental material_vendor = BlueCast -[sla_material:BlueCast X10 0.025] +[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 initial_exposure_time = 100 material_type = Tough material_vendor = BlueCast -[sla_material:Esun Bio-Photopolymer Resin White 0.025] +[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 initial_exposure_time = 30 material_type = Tough material_vendor = Esun -[sla_material:Esun Standard Resin Black 0.025] +[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 initial_exposure_time = 30 material_type = Tough material_vendor = Esun -[sla_material:Photocentric Ash Grey 0.025] +[sla_material:Photocentric Ash Grey @0.025] inherits = *common 0.025* exposure_time = 9 initial_exposure_time = 30 material_type = Tough material_vendor = Photocentric -[sla_material:Resinworks 3D Violet 0.025] +[sla_material:Resinworks 3D Violet @0.025] inherits = *common 0.025* exposure_time = 15 initial_exposure_time = 30 material_type = Tough material_vendor = Resinworks 3D -[sla_material:Resinworks 3D Green 0.025] +[sla_material:Resinworks 3D Green @0.025] inherits = *common 0.025* 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] +[sla_material:Prusa Orange Tough @0.025] inherits = *common 0.025* exposure_time = 6 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Grey Tough 0.025] +[sla_material:Prusa Grey Tough @0.025] inherits = *common 0.025* exposure_time = 7 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Azure Blue Tough 0.025] +[sla_material:Prusa Azure Blue Tough @0.025] inherits = *common 0.025* exposure_time = 7 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +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] +[sla_material:Prusa Maroon Tough @0.025] inherits = *common 0.025* exposure_time = 6 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Beige Tough 0.025] +[sla_material:Prusa Beige Tough @0.025] inherits = *common 0.025* exposure_time = 6 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Pink Tough 0.025] +[sla_material:Prusa Pink Tough @0.025] inherits = *common 0.025* exposure_time = 7 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa White Tough 0.025] +[sla_material:Prusa White Tough @0.025] inherits = *common 0.025* exposure_time = 6.5 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Transparent Tough 0.025] +[sla_material:Prusa Transparent Tough @0.025] inherits = *common 0.025* exposure_time = 6 initial_exposure_time = 15 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Green Dental Casting 0.025] +[sla_material:Prusa Green Dental Casting @0.025] inherits = *common 0.025* exposure_time = 12 initial_exposure_time = 40 material_type = Casting -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Transparent Green Tough 0.025] +[sla_material:Prusa Transparent Green Tough @0.025] inherits = *common 0.025* exposure_time = 5 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Clear ABS like 0.025] +[sla_material:Prusa Clear ABS like @0.025] inherits = *common 0.025* exposure_time = 6 initial_exposure_time = 30 material_type = Tough -material_vendor = Prusa +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 Grey High Tenacity 0.025] +[sla_material:Prusa White ABS like @0.025] inherits = *common 0.025* exposure_time = 5 initial_exposure_time = 30 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Cyan Super Low Odor 0.025] -inherits = *common 0.025* -exposure_time = 5 -initial_exposure_time = 35 -material_type = Tough -material_vendor = Prusa - -[sla_material:Prusa Magenta Super Low Odor 0.025] -inherits = *common 0.025* -exposure_time = 5 -initial_exposure_time = 35 -material_type = Tough -material_vendor = Prusa - -[sla_material:Prusa Yellow Super Low Odor 0.025] -inherits = *common 0.025* -exposure_time = 5 -initial_exposure_time = 35 -material_type = Tough -material_vendor = Prusa - -[sla_material:Prusa Orange-Yellow Teeth Model 0.025] +[sla_material:Prusa Grey High Tenacity @0.025] inherits = *common 0.025* exposure_time = 5 initial_exposure_time = 30 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa +[sla_material:Prusa Super Low Odor Cyan 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 Super Low Odor Magenta 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 Super Low Odor Yellow 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 Orange-Yellow Teeth Model @0.025] +inherits = *common 0.025* +exposure_time = 5 +initial_exposure_time = 30 +material_type = Tough +material_vendor = Made for Prusa + +[sla_material:Prusa Vibrant Orange Tough @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Made for Prusa + +[sla_material:Siraya Tech Simple Clear @0.025] +inherits = *common 0.025* +exposure_time = 8 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Blu Clear V2 @0.025] +inherits = *common 0.025* +exposure_time = 9 +initial_exposure_time = 30 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Blu Blue @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Fast Grey @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Tenacious @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Easy @0.025] +inherits = *common 0.025* +exposure_time = 11 +initial_exposure_time = 15 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Sculpt @0.025] +inherits = *common 0.025* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:Siraya Tech Fast Black @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Siraya Tech + +[sla_material:NextDent Model 2.0 Grey @0.025] +inherits = *common 0.025* +exposure_time = 14 +initial_exposure_time = 35 +material_type = Dental +material_vendor = NextDent + +[sla_material:NextDent Surgical Guide @0.025] +inherits = *common 0.025* +exposure_time = 6 +initial_exposure_time = 35 +material_type = Dental +material_vendor = NextDent + +[sla_material:NextDent Cast Purple @0.025] +inherits = *common 0.025* +exposure_time = 7 +initial_exposure_time = 20 +material_type = Casting +material_vendor = NextDent + +[sla_material:MakerJuice Labs Standard Red @0.025] +inherits = *common 0.025* +exposure_time = 9 +initial_exposure_time = 35 +material_type = Tough +material_vendor = MakerJuice Labs + +[sla_material:3DJake High Precision Grey @0.025] +inherits = *common 0.025* +exposure_time = 8.5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = 3DJake + +[sla_material:3DJake High Precision Blue @0.025] +inherits = *common 0.025* +exposure_time = 6.5 +initial_exposure_time = 35 +material_type = Tough +material_vendor = 3DJake + +[sla_material:Zortrax Black @0.025] +inherits = *common 0.025* +exposure_time = 4 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Zortrax ########### Materials 0.05 -[sla_material:Asiga Denta Model 0.05] +[sla_material:Asiga Denta Model @0.05] inherits = *common 0.05* exposure_time = 15 initial_exposure_time = 30 material_type = Dental material_vendor = Asiga -[sla_material:Ameralabs AMD 3 LED 0.05] +[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 initial_exposure_time = 30 material_type = Tough material_vendor = Ameralabs -[sla_material:BlueCast EcoGray 0.05] +[sla_material:BlueCast EcoGray @0.05] inherits = *common 0.05* exposure_time = 7 initial_exposure_time = 35 material_type = Tough material_vendor = BlueCast -[sla_material:BlueCast Kera Master Dental 0.05] +[sla_material:BlueCast Kera Master Dental @0.05] inherits = *common 0.05* exposure_time = 7 initial_exposure_time = 50 material_type = Dental material_vendor = BlueCast -[sla_material:BlueCast LCD-DLP Original 0.05] +[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 initial_exposure_time = 60 material_type = Tough material_vendor = BlueCast -[sla_material:BlueCast Phrozen Wax 0.05] +[sla_material:BlueCast Phrozen Wax @0.05] inherits = *common 0.05* exposure_time = 16 initial_exposure_time = 50 material_type = Tough material_vendor = BlueCast -[sla_material:BlueCast S+ 0.05] +[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 initial_exposure_time = 45 material_type = Tough material_vendor = BlueCast -[sla_material:BlueCast X5 0.05] +[sla_material:BlueCast X5 @0.05] inherits = *common 0.05* exposure_time = 9 initial_exposure_time = 100 material_type = Tough material_vendor = BlueCast -[sla_material:BlueCast X10 0.05] +[sla_material:BlueCast X10 @0.05] inherits = *common 0.05* exposure_time = 6 initial_exposure_time = 100 material_type = Tough material_vendor = BlueCast -[sla_material:BlueCast 23LS 0.05] +[sla_material:BlueCast 23LS @0.05] inherits = *common 0.05* exposure_time = 8 initial_exposure_time = 50 material_type = Tough material_vendor = BlueCast -[sla_material:Monocure 3D Black Rapid Resin 0.05] +[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] +[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 -[sla_material:Monocure 3D Clear Rapid Resin 0.05] +[sla_material:Monocure 3D Clear Rapid Resin @0.05] inherits = *common 0.05* exposure_time = 8 initial_exposure_time = 40 material_type = Tough material_vendor = Monocure -[sla_material:Monocure 3D Grey Rapid Resin 0.05] +[sla_material:Monocure 3D Grey Rapid Resin @0.05] inherits = *common 0.05* exposure_time = 10 initial_exposure_time = 30 material_type = Tough material_vendor = Monocure -[sla_material:Monocure 3D White Rapid Resin 0.05] +[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 -[sla_material:3DM-HTR140 (high temperature) 0.05] +[sla_material:3DM-HTR140 (high temperature) @0.05] inherits = *common 0.05* exposure_time = 12 initial_exposure_time = 45 material_type = Tough material_vendor = Monocure -[sla_material:Esun Bio-Photopolymer Resin White 0.05] +[sla_material:Esun Bio-Photopolymer Resin White @0.05] inherits = *common 0.05* exposure_time = 8 initial_exposure_time = 30 material_type = Tough material_vendor = Esun -[sla_material:Esun Standard Resin Black 0.05] +[sla_material:Esun Standard Resin Black @0.05] inherits = *common 0.05* exposure_time = 7 initial_exposure_time = 30 material_type = Tough material_vendor = Esun -[sla_material:3DM-ABS 0.05] +[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 initial_exposure_time = 25 material_type = Tough material_vendor = 3DM -[sla_material:3DM-BLACK 0.05] +[sla_material:3DM-BLACK @0.05] inherits = *common 0.05* exposure_time = 20 initial_exposure_time = 40 material_type = Tough material_vendor = 3DM -[sla_material:3DM-DENT 0.05] +[sla_material:3DM-DENT @0.05] inherits = *common 0.05* exposure_time = 7 initial_exposure_time = 45 material_type = Dental material_vendor = 3DM -[sla_material:3DM-HR Green 0.05] +[sla_material:3DM-HR Green @0.05] inherits = *common 0.05* exposure_time = 15 initial_exposure_time = 40 material_type = Tough material_vendor = 3DM -[sla_material:3DM-HR Red Wine 0.05] +[sla_material:3DM-HR Red Wine @0.05] +inherits = *common 0.05* +exposure_time = 18 +initial_exposure_time = 35 +material_type = Tough +material_vendor = 3DM + +[sla_material:3DM-XPRO White @0.05] inherits = *common 0.05* exposure_time = 9 initial_exposure_time = 35 material_type = Tough material_vendor = 3DM -[sla_material:3DM-XPRO White 0.05] -inherits = *common 0.05* -exposure_time = 9 -initial_exposure_time = 35 -material_type = Tough -material_vendor = 3DM - -[sla_material:3DM-Vulcan Gold 0.05] +[sla_material:3DM-Vulcan Gold @0.05] inherits = *common 0.05* exposure_time = 15 initial_exposure_time = 30 material_type = Tough material_vendor = 3DM -[sla_material:FTD Ash Grey 0.05] +[sla_material:3DM-TOUGH Clear 0.05] +inherits = *common 0.05* +exposure_time = 15 +initial_exposure_time = 30 +material_type = Tough +material_vendor = 3DM + +[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] +[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:Resinworks 3D Violet 0.05] +[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 initial_exposure_time = 30 material_type = Tough material_vendor = Resinworks 3D -[sla_material:Resinworks 3D Green 0.05] +[sla_material:Resinworks 3D Green @0.05] inherits = *common 0.05* exposure_time = 21 initial_exposure_time = 35 material_type = Tough material_vendor = Resinworks 3D -[sla_material:Photocentric Hard Grey 0.05] +[sla_material:Photocentric Hard Grey @0.05] inherits = *common 0.05* exposure_time = 15 initial_exposure_time = 30 material_type = Tough material_vendor = Photocentric -[sla_material:Photocentric Ash Grey 0.05] +[sla_material:Photocentric Ash Grey @0.05] inherits = *common 0.05* exposure_time = 10 initial_exposure_time = 30 material_type = Tough material_vendor = Photocentric -## Prusa +[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:Prusa Beige Tough 0.05] +[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 = Prusa +material_vendor = 3DJake -[sla_material:Prusa Orange Tough 0.05] +[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] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Made for Prusa + +[sla_material:Prusa Orange Tough @0.05] inherits = *common 0.05* exposure_time = 7.5 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Grey Tough 0.05] +[sla_material:Prusa Grey Tough @0.05] inherits = *common 0.05* exposure_time = 8.5 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Black Tough 0.05] +[sla_material:Prusa Black Tough @0.05] inherits = *common 0.05* exposure_time = 6 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -## [sla_material:Prusa Beige Super Low Odor 0.05] +## [sla_material:Prusa Super Low Odor Beige Tough @0.05] ## inherits = *common 0.05* ## exposure_time = 7.5 ## initial_exposure_time = 35 ## material_type = Tough -## material_vendor = Prusa +## material_vendor = Made for Prusa -## [sla_material:Prusa White Super Low Odor 0.05] +## [sla_material:Prusa Super Low Odor White Tough @0.05] ## inherits = *common 0.05* ## exposure_time = 6.5 ## initial_exposure_time = 35 ## material_type = Tough -## material_vendor = Prusa +## material_vendor = Made for Prusa -## [sla_material:Prusa Grey Super Low Odor 0.05] +## [sla_material:Prusa Super Low Odor Grey Tough @0.05] ## inherits = *common 0.05* ## exposure_time = 6.5 ## initial_exposure_time = 35 ## material_type = Tough -## material_vendor = Prusa +## material_vendor = Made for Prusa -[sla_material:Prusa Cyan Super Low Odor 0.05] +[sla_material:Prusa Super Low Odor Cyan Tough @0.05] inherits = *common 0.05* exposure_time = 6 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Magenta Super Low Odor 0.05] +[sla_material:Prusa Super Low Odor Magenta Tough @0.05] inherits = *common 0.05* exposure_time = 6 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Yellow Super Low Odor 0.05] +[sla_material:Prusa Super Low Odor Yellow Tough @0.05] inherits = *common 0.05* exposure_time = 6 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -## [sla_material:Prusa Black High Tenacity 0.05] +## [sla_material:Prusa Black High Tenacity @0.05] ## inherits = *common 0.05* ## exposure_time = 7 ## initial_exposure_time = 35 ## material_type = Tough -## material_vendor = Prusa +## material_vendor = Made for Prusa -[sla_material:Prusa Orange-Yellow Teeth Model 0.05] +[sla_material:Prusa Orange-Yellow Teeth Model @0.05] inherits = *common 0.05* exposure_time = 7 initial_exposure_time = 30 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Green Dental Casting 0.05] +[sla_material:Prusa Green Dental Casting @0.05] inherits = *common 0.05* exposure_time = 13 initial_exposure_time = 50 material_type = Casting -material_vendor = Prusa +material_vendor = Made for Prusa -## [sla_material:Prusa Yellow Solid 0.05] +## [sla_material:Prusa Yellow Solid @0.05] ## inherits = *common 0.05* ## exposure_time = 7 ## initial_exposure_time = 35 -[sla_material:Prusa White Tough 0.05] +[sla_material:Prusa White Tough @0.05] inherits = *common 0.05* exposure_time = 7.5 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Transparent Green Tough 0.05] +[sla_material:Prusa Transparent Green Tough @0.05] inherits = *common 0.05* exposure_time = 6 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Transparent Red Tough 0.05] +[sla_material:Prusa Transparent Red Tough @0.05] inherits = *common 0.05* exposure_time = 6 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Maroon Tough 0.05] +[sla_material:Prusa Maroon Tough @0.05] inherits = *common 0.05* exposure_time = 7.5 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Pink Tough 0.05] +[sla_material:Prusa Pink Tough @0.05] inherits = *common 0.05* exposure_time = 8 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Azure Blue Tough 0.05] +[sla_material:Prusa Azure Blue Tough @0.05] inherits = *common 0.05* exposure_time = 8 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Transparent Tough 0.05] +## [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 initial_exposure_time = 15 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -## [sla_material:Prusa Yellow Flexible 0.05] +## [sla_material:Prusa Yellow Flexible @0.05] ## inherits = *common 0.05* ## exposure_time = 9 ## initial_exposure_time = 35 -[sla_material:Prusa Clear Flexible 0.05] +[sla_material:Prusa Transparent Flexible @0.05] inherits = *common 0.05* exposure_time = 5 initial_exposure_time = 15 material_type = Flexible -material_vendor = Prusa +material_vendor = Made for Prusa -## [sla_material:Prusa White Flexible 0.05] +## [sla_material:Prusa White Flexible @0.05] ## inherits = *common 0.05* ## exposure_time = 9 ## initial_exposure_time = 35 -[sla_material:Prusa Blue Flexible 0.05] +[sla_material:Prusa Blue Flexible @0.05] inherits = *common 0.05* exposure_time = 5 initial_exposure_time = 15 material_type = Flexible -material_vendor = Prusa +material_vendor = Made for Prusa -## [sla_material:Prusa Black Flexible 0.05] +## [sla_material:Prusa Black Flexible @0.05] ## inherits = *common 0.05* ## exposure_time = 9 ## initial_exposure_time = 35 -## [sla_material:Prusa Red Flexible 0.05] +## [sla_material:Prusa Red Flexible @0.05] ## inherits = *common 0.05* ## exposure_time = 9 ## initial_exposure_time = 35 -[sla_material:Prusa Clear ABS like 0.05] +[sla_material:Prusa Clear ABS like @0.05] inherits = *common 0.05* exposure_time = 8 initial_exposure_time = 30 material_type = Tough -material_vendor = Prusa +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] +[sla_material:Prusa Yellow Jewelry Casting @0.05] inherits = *common 0.05* exposure_time = 13 initial_exposure_time = 45 material_type = Casting -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Grey High Tenacity 0.05] +[sla_material:Prusa Grey High Tenacity @0.05] inherits = *common 0.05* exposure_time = 7 initial_exposure_time = 30 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa + +[sla_material:Prusa Vibrant Orange Tough @0.05] +inherits = *common 0.05* +exposure_time = 7 +initial_exposure_time = 35 +material_type = Tough +material_vendor = Made for Prusa ########### Materials 0.035 -[sla_material:Prusa Orange Tough 0.035] +[sla_material:Prusa Orange Tough @0.035] inherits = *common 0.035* exposure_time = 6 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa ########### Materials 0.1 -[sla_material:BlueCast EcoGray 0.1] +[sla_material:BlueCast EcoGray @0.1] inherits = *common 0.1* exposure_time = 10 initial_exposure_time = 35 material_type = Tough material_vendor = BlueCast -[sla_material:BlueCast Kera Master Dental 0.1] +[sla_material:BlueCast Kera Master Dental @0.1] inherits = *common 0.1* exposure_time = 13 initial_exposure_time = 50 @@ -3142,75 +4550,82 @@ material_vendor = BlueCast ## Prusa -[sla_material:Prusa Orange Tough 0.1] +[sla_material:Prusa Orange Tough @0.1] inherits = *common 0.1* exposure_time = 13 initial_exposure_time = 45 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Beige Tough 0.1] +[sla_material:Prusa Beige Tough @0.1] inherits = *common 0.1* exposure_time = 13 initial_exposure_time = 45 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Pink Tough 0.1] +[sla_material:Prusa Pink Tough @0.1] inherits = *common 0.1* exposure_time = 13 initial_exposure_time = 45 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Azure Blue Tough 0.1] +[sla_material:Prusa Azure Blue Tough @0.1] inherits = *common 0.1* exposure_time = 13 initial_exposure_time = 45 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Maroon Tough 0.1] +[sla_material:Prusa Maroon Tough @0.1] inherits = *common 0.1* exposure_time = 13 initial_exposure_time = 45 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa White Tough 0.1] +[sla_material:Prusa White Tough @0.1] inherits = *common 0.1* exposure_time = 13 initial_exposure_time = 45 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Black Tough 0.1] +[sla_material:Prusa Black Tough @0.1] inherits = *common 0.1* exposure_time = 13 initial_exposure_time = 55 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Transparent Tough 0.1] +[sla_material:Prusa Transparent Tough @0.1] inherits = *common 0.1* exposure_time = 8 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Green Dental Casting 0.1] +[sla_material:Prusa Green Dental Casting @0.1] inherits = *common 0.1* exposure_time = 15 initial_exposure_time = 50 material_type = Casting -material_vendor = Prusa +material_vendor = Made for Prusa -[sla_material:Prusa Transparent Green Tough 0.1] +[sla_material:Prusa Transparent Green Tough @0.1] inherits = *common 0.1* exposure_time = 7 initial_exposure_time = 35 material_type = Tough -material_vendor = Prusa +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 @@ -3218,7 +4633,7 @@ bed_shape = 0x0,250x0,250x210,0x210 before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\n\n between_objects_gcode = deretract_speed = 0 -end_gcode = G4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +end_gcode = G4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors extruder_offset = 0x0 gcode_flavor = marlin silent_mode = 0 @@ -3297,19 +4712,19 @@ printer_model = MK2SMM [printer:*mm-single*] inherits = *multimaterial* -end_gcode = G1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors\n\n +end_gcode = G1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n\n printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT?\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\nG21 ; set units to millimeters\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100\nM92 E140\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT?\nM104 S[first_layer_temperature]\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 [printer:*mm-multi*] inherits = *multimaterial* high_current_on_filament_swap = 1 -end_gcode = {if not has_wipe_tower}\n; Pull the filament into the cooling tubes.\nG1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\n{endif}\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors +end_gcode = {if not has_wipe_tower}\n; Pull the filament into the cooling tubes.\nG1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\n{endif}\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors extruder_colour = #FFAA55;#E37BA0;#4ECDD3;#FB7259 nozzle_diameter = 0.4,0.4,0.4,0.4 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT[initial_tool]\nM104 S[first_layer_temperature] ; 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\nG21 ; set units to millimeters\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100 ; set max feedrate\nM92 E140 ; E-steps per filament milimeter\n{if not has_single_extruder_multi_material_priming}\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\n{endif}\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT[initial_tool]\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100 ; set max feedrate\nM92 E140 ; E-steps per filament milimeter\n{if not has_single_extruder_multi_material_priming}\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\n{endif}\nG92 E0.0 default_print_profile = 0.15mm OPTIMAL # XXXXXXXXXXXXXXXXX @@ -3337,7 +4752,7 @@ max_layer_height = 0.35 min_layer_height = 0.1 nozzle_diameter = 0.6 printer_variant = 0.6 -default_print_profile = 0.20mm NORMAL 0.6 nozzle +default_print_profile = 0.20mm NORMAL @0.6 nozzle # XXXXXXXXXXXXXXXXXXX # XXX--- MK2MM ---XXX @@ -3352,7 +4767,7 @@ min_layer_height = 0.07 inherits = *mm-single* nozzle_diameter = 0.6 printer_variant = 0.6 -default_print_profile = 0.20mm NORMAL 0.6 nozzle +default_print_profile = 0.20mm NORMAL @0.6 nozzle max_layer_height = 0.35 min_layer_height = 0.1 @@ -3366,7 +4781,7 @@ min_layer_height = 0.07 inherits = *mm-multi* nozzle_diameter = 0.6,0.6,0.6,0.6 printer_variant = 0.6 -default_print_profile = 0.20mm NORMAL 0.6 nozzle +default_print_profile = 0.20mm NORMAL @0.6 nozzle max_layer_height = 0.35 min_layer_height = 0.1 @@ -3378,19 +4793,22 @@ min_layer_height = 0.1 inherits = Original Prusa i3 MK2S printer_model = MK2.5 remaining_times = 1 -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 +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.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 -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 +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.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 -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 +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.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5 MMU2 Single] inherits = Original Prusa i3 MK2.5; *mm2* @@ -3410,17 +4828,17 @@ 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_e = 4.5 machine_max_jerk_x = 10 machine_max_jerk_y = 10 machine_max_jerk_z = 0.2 machine_min_extruding_rate = 0 machine_min_travel_rate = 0 -default_print_profile = 0.15mm OPTIMAL MK2.5 +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\nG21 ; set units to millimeters\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; load to nozzle\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n -end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\n; select extruder\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; load to nozzle\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n +end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM104 S0 ; turn off temperature\nM900 K0 ; reset LA\nM84 ; disable motors [printer:Original Prusa i3 MK2.5 MMU2 Single 0.6 nozzle] inherits = Original Prusa i3 MK2.5S MMU2S Single 0.6 nozzle @@ -3447,13 +4865,13 @@ 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_e = 4.5 machine_max_jerk_x = 10 machine_max_jerk_y = 10 machine_max_jerk_z = 0.2 machine_min_extruding_rate = 0 machine_min_travel_rate = 0 -default_print_profile = 0.15mm OPTIMAL MK2.5 +default_print_profile = 0.15mm OPTIMAL @MK2.5 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 single_extruder_multi_material = 1 # The 5x nozzle diameter defines the number of extruders. Other extruder parameters @@ -3461,23 +4879,23 @@ single_extruder_multi_material = 1 # to be defined explicitely. nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG21 ; set units to millimeters\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n -end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n +end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n [printer:Original Prusa i3 MK2.5S] inherits = Original Prusa i3 MK2.5 printer_model = MK2.5S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S 0.25 nozzle] inherits = Original Prusa i3 MK2.5 0.25 nozzle printer_model = MK2.5S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S 0.6 nozzle] inherits = Original Prusa i3 MK2.5 0.6 nozzle printer_model = MK2.5S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0 [printer:Original Prusa i3 MK2.5S MMU2S Single] inherits = Original Prusa i3 MK2.5; *mm2s* @@ -3497,17 +4915,17 @@ 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_e = 4.5 machine_max_jerk_x = 10 machine_max_jerk_y = 10 machine_max_jerk_z = 0.2 machine_min_extruding_rate = 0 machine_min_travel_rate = 0 -default_print_profile = 0.15mm OPTIMAL MK2.5 +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\nG21 ; set units to millimeters\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n -end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n +end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM104 S0 ; turn off temperature\nM900 K0 ; reset LA\nM84 ; disable motors [printer:Original Prusa i3 MK2.5S MMU2S Single 0.6 nozzle] inherits = Original Prusa i3 MK2.5S MMU2S Single @@ -3516,7 +4934,7 @@ max_layer_height = 0.35 min_layer_height = 0.1 nozzle_diameter = 0.6 printer_variant = 0.6 -default_print_profile = 0.20mm NORMAL 0.6 nozzle +default_print_profile = 0.20mm NORMAL @0.6 nozzle [printer:Original Prusa i3 MK2.5S MMU2S Single 0.25 nozzle] inherits = Original Prusa i3 MK2.5S MMU2S Single @@ -3527,7 +4945,7 @@ nozzle_diameter = 0.25 printer_variant = 0.25 retract_lift = 0.15 default_print_profile = 0.10mm DETAIL 0.25 nozzle -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\nG21 ; set units to millimeters\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* @@ -3546,13 +4964,13 @@ 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_e = 4.5 machine_max_jerk_x = 10 machine_max_jerk_y = 10 machine_max_jerk_z = 0.2 machine_min_extruding_rate = 0 machine_min_travel_rate = 0 -default_print_profile = 0.15mm OPTIMAL MK2.5 +default_print_profile = 0.15mm OPTIMAL @MK2.5 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 single_extruder_multi_material = 1 # The 5x nozzle diameter defines the number of extruders. Other extruder parameters @@ -3560,8 +4978,8 @@ single_extruder_multi_material = 1 # to be defined explicitely. nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG21 ; set units to millimeters\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n -end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n +end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n [printer:Original Prusa i3 MK2.5S MMU2S 0.6 nozzle] inherits = Original Prusa i3 MK2.5S MMU2S @@ -3569,7 +4987,7 @@ nozzle_diameter = 0.6,0.6,0.6,0.6,0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 -default_print_profile = 0.20mm NORMAL 0.6 nozzle +default_print_profile = 0.20mm NORMAL @0.6 nozzle [printer:Original Prusa i3 MK2.5 MMU2 0.6 nozzle] inherits = Original Prusa i3 MK2.5 MMU2 @@ -3577,7 +4995,7 @@ nozzle_diameter = 0.6,0.6,0.6,0.6,0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 -default_print_profile = 0.20mm NORMAL 0.6 nozzle +default_print_profile = 0.20mm NORMAL @0.6 nozzle # XXXXXXXXXXXXXXXXX # XXX--- MK3 ---XXX @@ -3585,18 +5003,18 @@ default_print_profile = 0.20mm NORMAL 0.6 nozzle [printer:Original Prusa i3 MK3] inherits = *common* -end_gcode = G4 ; wait\nM221 S100\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +end_gcode = G4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors machine_max_acceleration_e = 5000,5000 machine_max_acceleration_extruding = 1250,1250 machine_max_acceleration_retracting = 1250,1250 machine_max_acceleration_x = 1000,960 machine_max_acceleration_y = 1000,960 -machine_max_acceleration_z = 1000,1000 +machine_max_acceleration_z = 200,200 machine_max_feedrate_e = 120,120 machine_max_feedrate_x = 200,100 machine_max_feedrate_y = 200,100 machine_max_feedrate_z = 12,12 -machine_max_jerk_e = 1.5,1.5 +machine_max_jerk_e = 4.5,4.5 machine_max_jerk_x = 8,8 machine_max_jerk_y = 8,8 machine_max_jerk_z = 0.4,0.4 @@ -3607,9 +5025,9 @@ remaining_times = 1 printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK3\n retract_lift_below = 209 max_print_height = 210 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} printer_model = MK3 -default_print_profile = 0.15mm QUALITY MK3 +default_print_profile = 0.15mm QUALITY @MK3 [printer:Original Prusa i3 MK3 0.25 nozzle] inherits = Original Prusa i3 MK3 @@ -3618,8 +5036,8 @@ max_layer_height = 0.15 min_layer_height = 0.05 printer_variant = 0.25 retract_lift = 0.15 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; 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} -default_print_profile = 0.10mm DETAIL 0.25 nozzle MK3 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} +default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3 [printer:Original Prusa i3 MK3 0.6 nozzle] inherits = Original Prusa i3 MK3 @@ -3627,22 +5045,22 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 -default_print_profile = 0.30mm QUALITY 0.6 nozzle MK3 +default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3S] inherits = Original Prusa i3 MK3 printer_model = MK3S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} [printer:Original Prusa i3 MK3S 0.25 nozzle] inherits = Original Prusa i3 MK3 0.25 nozzle printer_model = MK3S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} [printer:Original Prusa i3 MK3S 0.6 nozzle] inherits = Original Prusa i3 MK3 0.6 nozzle printer_model = MK3S -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif} [printer:*mm2*] inherits = Original Prusa i3 MK3 @@ -3653,8 +5071,8 @@ parking_pos_retraction = 85 retract_length_toolchange = 3 extra_loading_move = -13 printer_model = MK3MMU2 -default_print_profile = 0.15mm QUALITY MK3 -default_filament_profile = Prusament PLA MMU2 +default_print_profile = 0.15mm QUALITY @MK3 +default_filament_profile = Prusament PLA @MMU2 [printer:*mm2s*] inherits = Original Prusa i3 MK3 @@ -3665,15 +5083,15 @@ parking_pos_retraction = 85 retract_length_toolchange = 3 extra_loading_move = -25 printer_model = MK3SMMU2S -default_print_profile = 0.15mm QUALITY MK3 -default_filament_profile = Prusament PLA MMU2 +default_print_profile = 0.15mm QUALITY @MK3 +default_filament_profile = Prusament PLA @MMU2 [printer:Original Prusa i3 MK3 MMU2 Single] 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\nG21 ; set units to millimeters\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n -end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM84 ; disable motors [printer:Original Prusa i3 MK3 MMU2 Single 0.6 nozzle] inherits = Original Prusa i3 MK3 MMU2 Single @@ -3682,7 +5100,8 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 -default_print_profile = 0.30mm QUALITY 0.6 nozzle MK3 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 +default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3 MMU2 Single 0.25 nozzle] inherits = Original Prusa i3 MK3 MMU2 Single @@ -3692,8 +5111,8 @@ max_layer_height = 0.15 min_layer_height = 0.05 printer_variant = 0.25 retract_lift = 0.15 -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; 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\nG21 ; set units to millimeters\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 -default_print_profile = 0.10mm DETAIL 0.25 nozzle MK3 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F1000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} +default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3 [printer:Original Prusa i3 MK3 MMU2] inherits = *mm2* @@ -3703,15 +5122,15 @@ inherits = *mm2* machine_max_acceleration_e = 8000,8000 nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG21 ; set units to millimeters\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n -end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n [printer:Original Prusa i3 MK3S MMU2S Single] inherits = *mm2s* single_extruder_multi_material = 0 default_filament_profile = Prusament PLA -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\nG21 ; set units to millimeters\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n -end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM84 ; disable motors [printer:Original Prusa i3 MK3S MMU2S Single 0.6 nozzle] inherits = Original Prusa i3 MK3S MMU2S Single @@ -3720,7 +5139,8 @@ nozzle_diameter = 0.6 max_layer_height = 0.40 min_layer_height = 0.15 printer_variant = 0.6 -default_print_profile = 0.30mm QUALITY 0.6 nozzle MK3 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 +default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3S MMU2S Single 0.25 nozzle] inherits = Original Prusa i3 MK3S MMU2S Single @@ -3730,16 +5150,16 @@ 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\nG21 ; set units to millimeters\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 -default_print_profile = 0.10mm DETAIL 0.25 nozzle MK3 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif} +default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3 [printer:Original Prusa i3 MK3S MMU2S] inherits = *mm2s* machine_max_acceleration_e = 8000,8000 nozzle_diameter = 0.4,0.4,0.4,0.4,0.4 extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F -start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG21 ; set units to millimeters\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n -end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif} +end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n ## 0.6mm nozzle MMU2/S printer profiles @@ -3749,7 +5169,8 @@ 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 -default_print_profile = 0.30mm QUALITY 0.6 nozzle MK3 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 +default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 [printer:Original Prusa i3 MK3 MMU2 0.6 nozzle] inherits = Original Prusa i3 MK3 MMU2 @@ -3757,7 +5178,8 @@ 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 -default_print_profile = 0.30mm QUALITY 0.6 nozzle MK3 +start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0 +default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3 ## MINI @@ -3767,10 +5189,10 @@ printer_model = MINI printer_technology = FFF printer_variant = 0.4 printer_vendor = -thumbnails = 240x320,220x165,16x16 +thumbnails = 16x16,220x124 bed_shape = 0x0,180x0,180x180,0x180 -default_filament_profile = "Prusament PLA MINI" -default_print_profile = 0.15mm QUALITY MINI +default_filament_profile = "Prusament PLA" +default_print_profile = 0.15mm QUALITY @MINI gcode_flavor = marlin machine_max_acceleration_e = 5000 machine_max_acceleration_extruding = 1250 @@ -3804,8 +5226,8 @@ retract_lift_below = 179 retract_layer_change = 0 silent_mode = 0 remaining_times = 1 -start_gcode = M569 S0 E \nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM92 E317 ; set steps/unit for extruder\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 X0 Y180 F4200 ; park print head\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM221 S100 ; reset flow\nM84 ; disable motors +start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S[first_layer_temperature] ; 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+2, max_print_height)}{endif} F720 ; Move print head up\nG1 X178 Y180 F4200 ; park print head\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} F720 ; Move print head further up\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM221 S100 ; reset flow\nM900 K0 ; reset LA\nM84 ; disable motors printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MINI\n extruder_colour = @@ -3813,6 +5235,9 @@ extruder_colour = inherits = Original Prusa MINI printer_variant = 0.25 nozzle_diameter = 0.25 +max_layer_height = 0.15 +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 @@ -3820,13 +5245,28 @@ deretract_speed = 40 wipe = 1 retract_before_wipe = 70% retract_before_travel = 1 -start_gcode = M569 S0 E \nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM92 E317 ; set steps/unit for extruder\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 +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_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 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/icons/printers/PrusaResearch_MINI.png b/resources/profiles/PrusaResearch/MINI_thumbnail.png similarity index 100% rename from resources/icons/printers/PrusaResearch_MINI.png rename to resources/profiles/PrusaResearch/MINI_thumbnail.png diff --git a/resources/icons/printers/PrusaResearch_MK2.5MMU2.png b/resources/profiles/PrusaResearch/MK2.5MMU2_thumbnail.png similarity index 100% rename from resources/icons/printers/PrusaResearch_MK2.5MMU2.png rename to resources/profiles/PrusaResearch/MK2.5MMU2_thumbnail.png diff --git a/resources/icons/printers/PrusaResearch_MK2.5SMMU2S.png b/resources/profiles/PrusaResearch/MK2.5SMMU2S_thumbnail.png similarity index 100% rename from resources/icons/printers/PrusaResearch_MK2.5SMMU2S.png rename to resources/profiles/PrusaResearch/MK2.5SMMU2S_thumbnail.png diff --git a/resources/icons/printers/PrusaResearch_MK2.5.png b/resources/profiles/PrusaResearch/MK2.5S_thumbnail.png similarity index 100% rename from resources/icons/printers/PrusaResearch_MK2.5.png rename to resources/profiles/PrusaResearch/MK2.5S_thumbnail.png diff --git a/resources/icons/printers/PrusaResearch_MK2.5S.png b/resources/profiles/PrusaResearch/MK2.5_thumbnail.png similarity index 100% rename from resources/icons/printers/PrusaResearch_MK2.5S.png rename to resources/profiles/PrusaResearch/MK2.5_thumbnail.png diff --git a/resources/icons/printers/PrusaResearch_MK2SMM.png b/resources/profiles/PrusaResearch/MK2SMM_thumbnail.png similarity index 100% rename from resources/icons/printers/PrusaResearch_MK2SMM.png rename to resources/profiles/PrusaResearch/MK2SMM_thumbnail.png diff --git a/resources/icons/printers/PrusaResearch_MK2S.png b/resources/profiles/PrusaResearch/MK2S_thumbnail.png similarity index 100% rename from resources/icons/printers/PrusaResearch_MK2S.png rename to resources/profiles/PrusaResearch/MK2S_thumbnail.png diff --git a/resources/icons/printers/PrusaResearch_MK3MMU2.png b/resources/profiles/PrusaResearch/MK3MMU2_thumbnail.png similarity index 100% rename from resources/icons/printers/PrusaResearch_MK3MMU2.png rename to resources/profiles/PrusaResearch/MK3MMU2_thumbnail.png diff --git a/resources/icons/printers/PrusaResearch_MK3SMMU2S.png b/resources/profiles/PrusaResearch/MK3SMMU2S_thumbnail.png similarity index 100% rename from resources/icons/printers/PrusaResearch_MK3SMMU2S.png rename to resources/profiles/PrusaResearch/MK3SMMU2S_thumbnail.png diff --git a/resources/icons/printers/PrusaResearch_MK3.png b/resources/profiles/PrusaResearch/MK3S_thumbnail.png similarity index 100% rename from resources/icons/printers/PrusaResearch_MK3.png rename to resources/profiles/PrusaResearch/MK3S_thumbnail.png diff --git a/resources/icons/printers/PrusaResearch_MK3S.png b/resources/profiles/PrusaResearch/MK3_thumbnail.png similarity index 100% rename from resources/icons/printers/PrusaResearch_MK3S.png rename to resources/profiles/PrusaResearch/MK3_thumbnail.png diff --git a/resources/icons/printers/PrusaResearch_SL1.png b/resources/profiles/PrusaResearch/SL1_thumbnail.png similarity index 100% rename from resources/icons/printers/PrusaResearch_SL1.png rename to resources/profiles/PrusaResearch/SL1_thumbnail.png diff --git a/resources/icons/bed/mini.svg b/resources/profiles/PrusaResearch/mini.svg similarity index 100% rename from resources/icons/bed/mini.svg rename to resources/profiles/PrusaResearch/mini.svg diff --git a/resources/models/mini_bed.stl b/resources/profiles/PrusaResearch/mini_bed.stl similarity index 100% rename from resources/models/mini_bed.stl rename to resources/profiles/PrusaResearch/mini_bed.stl diff --git a/resources/icons/bed/mk2.svg b/resources/profiles/PrusaResearch/mk2.svg similarity index 100% rename from resources/icons/bed/mk2.svg rename to resources/profiles/PrusaResearch/mk2.svg diff --git a/resources/models/mk2_bed.stl b/resources/profiles/PrusaResearch/mk2_bed.stl similarity index 100% rename from resources/models/mk2_bed.stl rename to resources/profiles/PrusaResearch/mk2_bed.stl diff --git a/resources/icons/bed/mk3.svg b/resources/profiles/PrusaResearch/mk3.svg similarity index 100% rename from resources/icons/bed/mk3.svg rename to resources/profiles/PrusaResearch/mk3.svg diff --git a/resources/models/mk3_bed.stl b/resources/profiles/PrusaResearch/mk3_bed.stl similarity index 100% rename from resources/models/mk3_bed.stl rename to resources/profiles/PrusaResearch/mk3_bed.stl diff --git a/resources/icons/bed/sl1.svg b/resources/profiles/PrusaResearch/sl1.svg similarity index 100% rename from resources/icons/bed/sl1.svg rename to resources/profiles/PrusaResearch/sl1.svg diff --git a/resources/models/sl1_bed.stl b/resources/profiles/PrusaResearch/sl1_bed.stl similarity index 100% rename from resources/models/sl1_bed.stl rename to resources/profiles/PrusaResearch/sl1_bed.stl diff --git a/resources/profiles/TriLAB.idx b/resources/profiles/TriLAB.idx new file mode 100644 index 0000000000..9281dab130 --- /dev/null +++ b/resources/profiles/TriLAB.idx @@ -0,0 +1,5 @@ +min_slic3r_version = 2.3.0-alpha3 +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 0000000000..735314ae28 --- /dev/null +++ b/resources/profiles/TriLAB.ini @@ -0,0 +1,692 @@ +# 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.3 +# 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 +technology = FFF +family = DeltiQ 2 +bed_model = dq2_bed.stl +bed_texture = dq2_bed_texture.svg +default_materials = DeltiQ PLA; DeltiQ ASA; DeltiQ PET; DeltiQ ABS; DeltiQ CPE + +[printer_model:DQ2P] +name = DeltiQ 2 Plus +variants = 0.4 +technology = FFF +family = DeltiQ 2 +bed_model = dq2_bed.stl +bed_texture = dq2_bed_texture.svg +default_materials = DeltiQ PLA; DeltiQ ASA; DeltiQ PET; DeltiQ ABS; DeltiQ CPE + +[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 FlexPrint 2 FLEX; DeltiQ FlexPrint 2 FLEX Smartfil; DeltiQ FlexPrint 2 PLA; DeltiQ FlexPrint 2 ASA; DeltiQ FlexPrint 2 PET; DeltiQ FlexPrint 2 ABS; DeltiQ FlexPrint 2 CPE + +[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 FlexPrint 2 FLEX; DeltiQ FlexPrint 2 FLEX Smartfil; DeltiQ FlexPrint 2 PLA; DeltiQ FlexPrint 2 ASA; DeltiQ FlexPrint 2 PET; DeltiQ FlexPrint 2 ABS; DeltiQ FlexPrint 2 CPE + +[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 FlexPrint FLEX; DeltiQ FlexPrint PLA; DeltiQ FlexPrint ASA; DeltiQ FlexPrint PET; DeltiQ FlexPrint ABS; DeltiQ FlexPrint CPE + +[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 FlexPrint FLEX; DeltiQ FlexPrint PLA; DeltiQ FlexPrint ASA; DeltiQ FlexPrint PET; DeltiQ FlexPrint ABS; DeltiQ FlexPrint CPE + +[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.*/ +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 = 40 +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 = 55 +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.90 +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*FLEXPRINT.*/ +only_retract_when_crossing_perimeters = 1 +overhangs = 0 +seam_position = nearest +thin_walls = 0 +bridge_speed = 20 +external_perimeter_speed = 20 +first_layer_speed = 20 +gap_fill_speed = 25 +infill_speed = 30 +perimeter_speed = 25 +small_perimeter_speed = 20 +solid_infill_speed = 30 +support_material_contact_distance = 0.3 +top_solid_infill_speed = 20 +top_fill_pattern = rectilinear +fill_pattern = grid +fill_density = 25% +travel_speed = 200 +max_print_speed = 30 +complete_objects = 1 + + +[filament:*DeltiQ common*] +compatible_printers = +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) +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" + +[filament:DeltiQ PET] +inherits = *DeltiQ common* +bed_temperature = 90 +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 = 90 +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 PLA] +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 ABS] +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 ASA] +inherits = DeltiQ ABS +filament_density = 1.07 +filament_type = ASA +first_layer_temperature = 265 +temperature = 265 + +[filament:DeltiQ CPE] +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 FlexPrint 2 PET] +inherits = DeltiQ PET +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ +filament_retract_length = 1.4 +filament_retract_speed = 35 +filament_retract_before_wipe = 0% + +[filament:DeltiQ FlexPrint 2 PLA] +inherits = DeltiQ PLA +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ +filament_retract_length = 1.2 +filament_retract_speed = 28 + +[filament:DeltiQ FlexPrint 2 ABS] +inherits = DeltiQ ABS +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ +filament_retract_length = 0.8 +filament_retract_speed = 25 + +[filament:DeltiQ FlexPrint 2 ASA] +inherits = DeltiQ ASA +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ + +[filament:DeltiQ FlexPrint 2 CPE] +inherits = DeltiQ CPE +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ +filament_retract_length = 0.8 +filament_retract_speed = 35 +filament_deretract_speed = 0 +filament_retract_before_wipe = 0% + +[filament:DeltiQ FlexPrint 2 FLEX] +inherits = *DeltiQ common* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ +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 = 0 +filament_max_volumetric_speed = 2.9 +filament_retract_before_travel = 1 +filament_retract_before_wipe = 70% +filament_retract_layer_change = 0 +filament_retract_length = 1.6 +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 FlexPrint 2 FLEX Smartfil] +inherits = *DeltiQ common* +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ +bed_temperature = 50 +bridge_fan_speed = 80 +cooling = 0 +disable_fan_first_layers = 3 +extrusion_multiplier = 1.07 +fan_always_on = 1 +fan_below_layer_time = 20 +filament_vendor = Smart Materials 3D +filament_cost = 1209 +filament_density = 1.21 +filament_deretract_speed = 0 +filament_max_volumetric_speed = 2.5 +filament_retract_before_travel = 1 +filament_retract_before_wipe = nil +filament_retract_layer_change = 0 +filament_retract_length = 1.2 +filament_retract_lift = 0.2 +filament_retract_restart_extra = nil +filament_retract_speed = 20 +filament_type = FLEX +filament_wipe = 0 +first_layer_bed_temperature = 50 +first_layer_temperature = 240 +max_fan_speed = 50 +min_fan_speed = 50 +min_print_speed = 10 +slowdown_below_layer_time = 4 +temperature = 240 + + +[filament:DeltiQ FlexPrint PET] +inherits = DeltiQ PET +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ +filament_retract_length = 0.7 +filament_retract_speed = 25 + +[filament:DeltiQ FlexPrint PLA] +inherits = DeltiQ PLA +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ +filament_retract_length = 0.7 +filament_retract_speed = 28 + +[filament:DeltiQ FlexPrint ABS] +inherits = DeltiQ ABS +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ +filament_retract_length = 0.7 +filament_retract_speed = 25 + +[filament:DeltiQ FlexPrint ASA] +inherits = DeltiQ ASA +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ +filament_retract_length = 0.7 +filament_retract_speed = 25 + +[filament:DeltiQ FlexPrint CPE] +inherits = DeltiQ CPE +compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ +filament_retract_length = 0.7 +filament_retract_speed = 25 +filament_deretract_speed = 0 +filament_retract_before_wipe = 0% + + +[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 +host_type = octoprint +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 +print_host = +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. +printhost_apikey = +printhost_cafile = +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 +serial_port = +serial_speed = 250000 +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 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 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 FlexPrint 2 FLEX" +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 2*] +inherits = *DeltiQ 2 FlexPrint* +default_filament_profile = "DeltiQ FlexPrint 2 FLEX" +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] +inherits = *DeltiQ 2* +printer_model = DQ2 +printer_variant = 0.4 +max_print_height = 320 + +[printer:DeltiQ 2 Plus] +inherits = *DeltiQ 2* +printer_model = DQ2P +printer_variant = 0.4 +max_print_height = 500 + +[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 + +[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 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 + +[presets] +print = DeltiQ 0.20mm Normal +printer = DeltiQ 2 +filament = DeltiQ PLA \ 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 0000000000..a33919fc75 Binary files /dev/null and b/resources/profiles/TriLAB/DQ2+FP2_thumbnail.png differ diff --git a/resources/profiles/TriLAB/DQ2+FP_thumbnail.png b/resources/profiles/TriLAB/DQ2+FP_thumbnail.png new file mode 100644 index 0000000000..a33919fc75 Binary files /dev/null and b/resources/profiles/TriLAB/DQ2+FP_thumbnail.png differ diff --git a/resources/profiles/TriLAB/DQ2P+FP2_thumbnail.png b/resources/profiles/TriLAB/DQ2P+FP2_thumbnail.png new file mode 100644 index 0000000000..27853b29ce Binary files /dev/null and b/resources/profiles/TriLAB/DQ2P+FP2_thumbnail.png differ diff --git a/resources/profiles/TriLAB/DQ2P+FP_thumbnail.png b/resources/profiles/TriLAB/DQ2P+FP_thumbnail.png new file mode 100644 index 0000000000..27853b29ce Binary files /dev/null and b/resources/profiles/TriLAB/DQ2P+FP_thumbnail.png differ diff --git a/resources/profiles/TriLAB/DQ2P_thumbnail.png b/resources/profiles/TriLAB/DQ2P_thumbnail.png new file mode 100644 index 0000000000..27853b29ce Binary files /dev/null and b/resources/profiles/TriLAB/DQ2P_thumbnail.png differ diff --git a/resources/profiles/TriLAB/DQ2_thumbnail.png b/resources/profiles/TriLAB/DQ2_thumbnail.png new file mode 100644 index 0000000000..a33919fc75 Binary files /dev/null and b/resources/profiles/TriLAB/DQ2_thumbnail.png differ diff --git a/resources/profiles/TriLAB/DQL_thumbnail.png b/resources/profiles/TriLAB/DQL_thumbnail.png new file mode 100644 index 0000000000..44386db05e Binary files /dev/null and b/resources/profiles/TriLAB/DQL_thumbnail.png differ diff --git a/resources/profiles/TriLAB/DQM_thumbnail.png b/resources/profiles/TriLAB/DQM_thumbnail.png new file mode 100644 index 0000000000..27210f9bb5 Binary files /dev/null and b/resources/profiles/TriLAB/DQM_thumbnail.png differ diff --git a/resources/profiles/TriLAB/DQXL_thumbnail.png b/resources/profiles/TriLAB/DQXL_thumbnail.png new file mode 100644 index 0000000000..4de802df74 Binary files /dev/null and b/resources/profiles/TriLAB/DQXL_thumbnail.png differ diff --git a/resources/profiles/TriLAB/dq2_bed.stl b/resources/profiles/TriLAB/dq2_bed.stl new file mode 100644 index 0000000000..6b8f20caa8 Binary files /dev/null and b/resources/profiles/TriLAB/dq2_bed.stl differ diff --git a/resources/shaders/gouraud.fs b/resources/shaders/gouraud.fs index 09003f4079..b1a8d6ac28 100644 --- a/resources/shaders/gouraud.fs +++ b/resources/shaders/gouraud.fs @@ -1,6 +1,23 @@ #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; + +uniform sampler2D environment_tex; +uniform bool use_environment_tex; varying vec3 clipping_planes_dots; @@ -10,14 +27,23 @@ 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; + 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 + 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 cc54c1c449..ed7e3f56ba 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 0000000000..1a58abc852 --- /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 0000000000..d4f71938a9 --- /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 0000000000..ab656998df --- /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 0000000000..5f2ab23504 --- /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 0000000000..e9b61304f2 --- /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 0000000000..edb503fb2b --- /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 0000000000..31151cdc17 --- /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 0000000000..85d5c641f3 --- /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 4f98dfa56e..0e966b0814 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/resources/udev/90-3dconnexion.rules b/resources/udev/90-3dconnexion.rules new file mode 100644 index 0000000000..04d581498a --- /dev/null +++ b/resources/udev/90-3dconnexion.rules @@ -0,0 +1,45 @@ +# See src/slic3r/GUI/Mouse3DController.cpp for the list of devices + +# Logitech vendor devices +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c603", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c605", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c606", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c621", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c623", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c625", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c626", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c627", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c628", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c629", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c62b", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c62e", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c62f", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c631", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c632", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c633", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c635", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c636", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c640", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c652", MODE="0666" + +# 3D Connexion vendor devices +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c603", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c605", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c606", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c621", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c623", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c625", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c626", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c627", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c628", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c629", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c62b", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c62e", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c62f", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c631", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c632", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c633", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c635", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c636", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c640", MODE="0666" +KERNEL=="hidraw*", ATTRS{idVendor}=="256f", ATTRS{idProduct}=="c652", MODE="0666" diff --git a/sandboxes/CMakeLists.txt b/sandboxes/CMakeLists.txt index 3372698c39..23c15f0899 100644 --- a/sandboxes/CMakeLists.txt +++ b/sandboxes/CMakeLists.txt @@ -1,2 +1,5 @@ -add_subdirectory(slasupporttree) -add_subdirectory(openvdb) +#add_subdirectory(slasupporttree) +#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 0000000000..20011e3450 --- /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 0000000000..9ec7451e50 --- /dev/null +++ b/sandboxes/aabb-evaluation/aabb-evaluation.cpp @@ -0,0 +1,224 @@ +#include +#include +#include + +#include +#include +#include + +#include + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4244) +#pragma warning(disable: 4267) +#endif +#include +#include +#include +#include +#include +#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(); + + 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(); + const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); + 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(); + const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); + 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()), + Eigen::Vector3f(d.template cast()), hit)) + ++ num_hits; + } + occlusion_output0(ivertex) = (double)num_hits/(double)num_samples; + } + } + } + + Eigen::MatrixXd occlusion_output1; + { + std::vector vertices; + std::vector 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(); + const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); + 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 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(); + const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); + 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> MapMatrixXfUnaligned; + typedef Eigen::Map> MapMatrixXiUnaligned; + igl::AABB 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(); + const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast(); + 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(), d.template cast(), 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/meshboolean/CMakeLists.txt b/sandboxes/meshboolean/CMakeLists.txt new file mode 100644 index 0000000000..55fb42fd14 --- /dev/null +++ b/sandboxes/meshboolean/CMakeLists.txt @@ -0,0 +1,7 @@ +add_executable(meshboolean MeshBoolean.cpp) + +target_link_libraries(meshboolean libslic3r) + +if (WIN32) + prusaslicer_copy_dlls(meshboolean) +endif() diff --git a/sandboxes/meshboolean/MeshBoolean.cpp b/sandboxes/meshboolean/MeshBoolean.cpp new file mode 100644 index 0000000000..392d907074 --- /dev/null +++ b/sandboxes/meshboolean/MeshBoolean.cpp @@ -0,0 +1,44 @@ +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include + +int main(const int argc, const char * argv[]) +{ + using namespace Slic3r; + + if (argc <= 1) { + std::cout << "Usage: meshboolean " << std::endl; + return EXIT_FAILURE; + } + + + TriangleMesh input; + + input.ReadSTLFile(argv[1]); + input.repair(); + + Benchmark bench; + + bench.start(); + bool fckd = MeshBoolean::cgal::does_self_intersect(input); + bench.stop(); + + std::cout << "Self intersect test: " << fckd << " duration: " << bench.getElapsedSec() << std::endl; + + bench.start(); + MeshBoolean::self_union(input); + bench.stop(); + + std::cout << "Self union duration: " << bench.getElapsedSec() << std::endl; + + return 0; +} diff --git a/sandboxes/opencsg/CMakeLists.txt b/sandboxes/opencsg/CMakeLists.txt new file mode 100644 index 0000000000..ace8f4d539 --- /dev/null +++ b/sandboxes/opencsg/CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 3.0) + +project(OpenCSG-example) + +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) + +find_package(wxWidgets 3.1 REQUIRED COMPONENTS core base gl html) +find_package(OpenGL REQUIRED) +find_package(GLEW REQUIRED) +find_package(OpenCSG REQUIRED) +include(${wxWidgets_USE_FILE}) + +target_link_libraries(opencsg_example libslic3r) +target_include_directories(opencsg_example PRIVATE ${wxWidgets_INCLUDE_DIRS}) +target_compile_definitions(opencsg_example PRIVATE ${wxWidgets_DEFINITIONS}) + +slic3r_remap_configs(OpenCSG::opencsg RelWithDebInfo Release) +target_link_libraries(opencsg_example ${wxWidgets_LIBRARIES} + OpenCSG::opencsg + GLEW::GLEW + OpenGL::GL + #-lXrandr -lXext -lX11 + ) diff --git a/sandboxes/opencsg/Engine.cpp b/sandboxes/opencsg/Engine.cpp new file mode 100644 index 0000000000..f110b23c5c --- /dev/null +++ b/sandboxes/opencsg/Engine.cpp @@ -0,0 +1,498 @@ +#include "Engine.hpp" +#include +#include + +#include + +#include + +#ifndef 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) + +void glAssertRecentCallImpl(const char *file_name, unsigned int line, const char *function_name) +{ + GLenum err = glGetError(); + if (err == GL_NO_ERROR) + return; + const char *sErr = 0; + switch (err) { + case GL_INVALID_ENUM: sErr = "Invalid Enum"; break; + case GL_INVALID_VALUE: sErr = "Invalid Value"; break; + // be aware that GL_INVALID_OPERATION is generated if glGetError is executed between the execution of glBegin and the corresponding execution of glEnd + case GL_INVALID_OPERATION: sErr = "Invalid Operation"; break; + case GL_STACK_OVERFLOW: sErr = "Stack Overflow"; break; + case GL_STACK_UNDERFLOW: sErr = "Stack Underflow"; break; + 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; + assert(false); +} + +#else +inline void glAssertRecentCall() { } +#define glsafe(cmd) cmd +#define glcheck() +#endif + +namespace Slic3r { namespace GL { + +Scene::Scene() = default; +Scene::~Scene() = default; + +void CSGDisplay::render_scene() +{ + GLfloat color[] = {1.f, 1.f, 0.f, 0.f}; + glsafe(::glColor4fv(color)); + + if (m_csgsettings.is_enabled()) { + OpenCSG::render(m_scene_cache.primitives_csg); + glDepthFunc(GL_EQUAL); + } + + for (auto& p : m_scene_cache.primitives_csg) p->render(); + if (m_csgsettings.is_enabled()) glDepthFunc(GL_LESS); + + for (auto& p : m_scene_cache.primitives_free) p->render(); + + glFlush(); +} + +void Scene::set_print(uqptr &&print) +{ + m_print = std::move(print); + + // Notify displays + call(&Listener::on_scene_updated, m_listeners, *this); +} + +BoundingBoxf3 Scene::get_bounding_box() const +{ + return m_print->model().bounding_box(); +} + +void CSGDisplay::SceneCache::clear() +{ + primitives_csg.clear(); + primitives_free.clear(); + primitives.clear(); +} + +shptr CSGDisplay::SceneCache::add_mesh(const TriangleMesh &mesh) +{ + auto p = std::make_shared(); + p->load_mesh(mesh); + primitives.emplace_back(p); + primitives_free.emplace_back(p.get()); + return p; +} + +shptr CSGDisplay::SceneCache::add_mesh(const TriangleMesh &mesh, + OpenCSG::Operation o, + unsigned c) +{ + auto p = std::make_shared(o, c); + p->load_mesh(mesh); + primitives.emplace_back(p); + primitives_csg.emplace_back(p.get()); + return p; +} + +void IndexedVertexArray::push_geometry(float x, float y, float z, float nx, float ny, float nz) +{ + assert(this->vertices_and_normals_interleaved_VBO_id == 0); + if (this->vertices_and_normals_interleaved_VBO_id != 0) + return; + + if (this->vertices_and_normals_interleaved.size() + 6 > this->vertices_and_normals_interleaved.capacity()) + this->vertices_and_normals_interleaved.reserve(next_highest_power_of_2(this->vertices_and_normals_interleaved.size() + 6)); + this->vertices_and_normals_interleaved.emplace_back(nx); + this->vertices_and_normals_interleaved.emplace_back(ny); + this->vertices_and_normals_interleaved.emplace_back(nz); + this->vertices_and_normals_interleaved.emplace_back(x); + this->vertices_and_normals_interleaved.emplace_back(y); + this->vertices_and_normals_interleaved.emplace_back(z); + + this->vertices_and_normals_interleaved_size = this->vertices_and_normals_interleaved.size(); +} + +void IndexedVertexArray::push_triangle(int idx1, int idx2, int idx3) { + assert(this->vertices_and_normals_interleaved_VBO_id == 0); + if (this->vertices_and_normals_interleaved_VBO_id != 0) + return; + + if (this->triangle_indices.size() + 3 > this->vertices_and_normals_interleaved.capacity()) + this->triangle_indices.reserve(next_highest_power_of_2(this->triangle_indices.size() + 3)); + this->triangle_indices.emplace_back(idx1); + this->triangle_indices.emplace_back(idx2); + this->triangle_indices.emplace_back(idx3); + this->triangle_indices_size = this->triangle_indices.size(); +} + +void IndexedVertexArray::load_mesh(const TriangleMesh &mesh) +{ + 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()); + + int vertices_count = 0; + for (size_t i = 0; i < 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; + } +} + +void IndexedVertexArray::finalize_geometry() +{ + assert(this->vertices_and_normals_interleaved_VBO_id == 0); + assert(this->triangle_indices_VBO_id == 0); + assert(this->quad_indices_VBO_id == 0); + + if (!this->vertices_and_normals_interleaved.empty()) { + glsafe( + ::glGenBuffers(1, &this->vertices_and_normals_interleaved_VBO_id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, + this->vertices_and_normals_interleaved_VBO_id)); + glsafe( + ::glBufferData(GL_ARRAY_BUFFER, + GLsizeiptr( + this->vertices_and_normals_interleaved.size() * + 4), + this->vertices_and_normals_interleaved.data(), + GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + this->vertices_and_normals_interleaved.clear(); + } + if (!this->triangle_indices.empty()) { + glsafe(::glGenBuffers(1, &this->triangle_indices_VBO_id)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, + this->triangle_indices_VBO_id)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, + GLsizeiptr(this->triangle_indices.size() * 4), + this->triangle_indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + this->triangle_indices.clear(); + } + if (!this->quad_indices.empty()) { + glsafe(::glGenBuffers(1, &this->quad_indices_VBO_id)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, + this->quad_indices_VBO_id)); + glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, + GLsizeiptr(this->quad_indices.size() * 4), + this->quad_indices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + this->quad_indices.clear(); + } +} + +void IndexedVertexArray::release_geometry() +{ + if (this->vertices_and_normals_interleaved_VBO_id) { + glsafe( + ::glDeleteBuffers(1, + &this->vertices_and_normals_interleaved_VBO_id)); + this->vertices_and_normals_interleaved_VBO_id = 0; + } + if (this->triangle_indices_VBO_id) { + glsafe(::glDeleteBuffers(1, &this->triangle_indices_VBO_id)); + this->triangle_indices_VBO_id = 0; + } + if (this->quad_indices_VBO_id) { + glsafe(::glDeleteBuffers(1, &this->quad_indices_VBO_id)); + this->quad_indices_VBO_id = 0; + } + this->clear(); +} + +void IndexedVertexArray::render() const +{ + assert(this->vertices_and_normals_interleaved_VBO_id != 0); + assert(this->triangle_indices_VBO_id != 0 || + this->quad_indices_VBO_id != 0); + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, + this->vertices_and_normals_interleaved_VBO_id)); + glsafe(::glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), + reinterpret_cast(3 * sizeof(float)))); + glsafe(::glNormalPointer(GL_FLOAT, 6 * sizeof(float), nullptr)); + + glsafe(::glEnableClientState(GL_VERTEX_ARRAY)); + glsafe(::glEnableClientState(GL_NORMAL_ARRAY)); + + // Render using the Vertex Buffer Objects. + if (this->triangle_indices_size > 0) { + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, + this->triangle_indices_VBO_id)); + glsafe(::glDrawElements(GL_TRIANGLES, + GLsizei(this->triangle_indices_size), + GL_UNSIGNED_INT, nullptr)); + glsafe(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + if (this->quad_indices_size > 0) { + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, + this->quad_indices_VBO_id)); + glsafe(::glDrawElements(GL_QUADS, GLsizei(this->quad_indices_size), + GL_UNSIGNED_INT, nullptr)); + glsafe(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); + + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); +} + +void IndexedVertexArray::clear() { + this->vertices_and_normals_interleaved.clear(); + this->triangle_indices.clear(); + this->quad_indices.clear(); + vertices_and_normals_interleaved_size = 0; + triangle_indices_size = 0; + quad_indices_size = 0; +} + +void IndexedVertexArray::shrink_to_fit() { + this->vertices_and_normals_interleaved.shrink_to_fit(); + this->triangle_indices.shrink_to_fit(); + this->quad_indices.shrink_to_fit(); +} + +void Volume::render() +{ + glsafe(::glPushMatrix()); + glsafe(::glMultMatrixd(m_trafo.get_matrix().data())); + m_geom.render(); + glsafe(::glPopMatrix()); +} + +void Display::clear_screen() +{ + glViewport(0, 0, GLsizei(m_size.x()), GLsizei(m_size.y())); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); +} + +Display::~Display() +{ + OpenCSG::freeResources(); +} + +void Display::set_active(long width, long height) +{ + if (!m_initialized) { + glewInit(); + m_initialized = true; + } + + // gray background + glClearColor(0.9f, 0.9f, 0.9f, 1.0f); + + // Enable two OpenGL lights + GLfloat light_diffuse[] = { 1.0f, 1.0f, 0.0f, 1.0f}; // White diffuse light + GLfloat light_position0[] = {-1.0f, -1.0f, -1.0f, 0.0f}; // Infinite light location + GLfloat light_position1[] = { 1.0f, 1.0f, 1.0f, 0.0f}; // Infinite light location + + glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT0, GL_POSITION, light_position0); + glEnable(GL_LIGHT0); + glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT1, GL_POSITION, light_position1); + glEnable(GL_LIGHT1); + glEnable(GL_LIGHTING); + glEnable(GL_NORMALIZE); + + // Use depth buffering for hidden surface elimination + glEnable(GL_DEPTH_TEST); + glEnable(GL_STENCIL_TEST); + + set_screen_size(width, height); +} + +void Display::set_screen_size(long width, long height) +{ + if (m_size.x() != width || m_size.y() != height) + m_camera->set_screen(width, height); + + m_size = {width, height}; +} + +void Display::repaint() +{ + clear_screen(); + + m_camera->view(); + render_scene(); + + m_fps_counter.update(); + + swap_buffers(); +} + +void Controller::on_scene_updated(const Scene &scene) +{ + const SLAPrint *print = scene.get_print(); + if (!print) return; + + auto bb = scene.get_bounding_box(); + double d = std::max(std::max(bb.size().x(), bb.size().y()), bb.size().z()); + m_wheel_pos = long(2 * d); + + call_cameras(&Camera::set_zoom, m_wheel_pos); + call(&Display::on_scene_updated, m_displays, scene); +} + +void Controller::on_scroll(long v, long d, MouseInput::WheelAxis /*wa*/) +{ + m_wheel_pos += v / d; + + call_cameras(&Camera::set_zoom, m_wheel_pos); + call(&Display::repaint, m_displays); +} + +void Controller::on_moved_to(long x, long y) +{ + if (m_left_btn) { + call_cameras(&Camera::rotate, (Vec2i{x, y} - m_mouse_pos).cast()); + call(&Display::repaint, m_displays); + } + + m_mouse_pos = {x, y}; +} + +void CSGDisplay::apply_csgsettings(const CSGSettings &settings) +{ + using namespace OpenCSG; + + bool needupdate = m_csgsettings.get_convexity() != settings.get_convexity(); + + m_csgsettings = settings; + setOption(AlgorithmSetting, m_csgsettings.get_algo()); + setOption(DepthComplexitySetting, m_csgsettings.get_depth_algo()); + setOption(DepthBoundsOptimization, m_csgsettings.get_optimization()); + + if (needupdate) { + for (OpenCSG::Primitive * p : m_scene_cache.primitives_csg) + if (p->getConvexity() > 1) + p->setConvexity(m_csgsettings.get_convexity()); + } +} + +void CSGDisplay::on_scene_updated(const Scene &scene) +{ + const SLAPrint *print = scene.get_print(); + if (!print) return; + + m_scene_cache.clear(); + + for (const SLAPrintObject *po : print->objects()) { + const ModelObject *mo = po->model_object(); + TriangleMesh msh = mo->raw_mesh(); + + sla::DrainHoles holedata = mo->sla_drain_holes; + + for (const ModelInstance *mi : mo->instances) { + + TriangleMesh mshinst = msh; + auto interior = po->hollowed_interior_mesh(); + interior.transform(po->trafo().inverse()); + + mshinst.merge(interior); + mshinst.require_shared_vertices(); + + mi->transform_mesh(&mshinst); + + auto bb = mshinst.bounding_box(); + auto center = bb.center().cast(); + mshinst.translate(-center); + + mshinst.require_shared_vertices(); + m_scene_cache.add_mesh(mshinst, OpenCSG::Intersection, + m_csgsettings.get_convexity()); + } + + for (const sla::DrainHole &holept : holedata) { + TriangleMesh holemesh = sla::to_triangle_mesh(holept.to_mesh()); + holemesh.require_shared_vertices(); + m_scene_cache.add_mesh(holemesh, OpenCSG::Subtraction, 1); + } + } + + repaint(); +} + +void Camera::view() +{ + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + gluLookAt(0.0, m_zoom, 0.0, /* eye is at (0,zoom,0) */ + m_referene.x(), m_referene.y(), m_referene.z(), + 0.0, 0.0, 1.0); /* up is in positive Y direction */ + + // TODO Could have been set in prevoius gluLookAt in first argument + glRotatef(m_rot.y(), 1.0, 0.0, 0.0); + glRotatef(m_rot.x(), 0.0, 0.0, 1.0); + + if (m_clip_z > 0.) { + GLdouble plane[] = {0., 0., 1., m_clip_z}; + glClipPlane(GL_CLIP_PLANE0, plane); + glEnable(GL_CLIP_PLANE0); + } else { + glDisable(GL_CLIP_PLANE0); + } +} + +void PerspectiveCamera::set_screen(long width, long height) +{ + // Setup the view of the CSG shape + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45.0, width / double(height), .1, 200.0); + glMatrixMode(GL_MODELVIEW); +} + +bool enable_multisampling(bool e) +{ + if (!e) { glDisable(GL_MULTISAMPLE); return false; } + + GLint is_ms_context; + glGetIntegerv(GL_SAMPLE_BUFFERS, &is_ms_context); + + if (is_ms_context) { glEnable(GL_MULTISAMPLE); return true; } + else return false; +} + +MouseInput::Listener::~Listener() = default; + +void FpsCounter::update() +{ + ++m_frames; + + TimePoint msec = Clock::now(); + + double seconds_window = to_sec(msec - m_window); + m_fps = 0.5 * m_fps + 0.5 * (m_frames / seconds_window); + + if (to_sec(msec - m_last) >= m_resolution) { + m_last = msec; + for (auto &l : m_listeners) l(m_fps); + } + + if (seconds_window >= m_window_size) { + m_frames = 0; + m_window = msec; + } +} + +}} // namespace Slic3r::GL diff --git a/sandboxes/opencsg/Engine.hpp b/sandboxes/opencsg/Engine.hpp new file mode 100644 index 0000000000..fc76c1b313 --- /dev/null +++ b/sandboxes/opencsg/Engine.hpp @@ -0,0 +1,493 @@ +#ifndef SLIC3R_OCSG_EXMP_ENGINE_HPP +#define SLIC3R_OCSG_EXMP_ENGINE_HPP + +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace Slic3r { + +class SLAPrint; + +namespace GL { + +// Simple shorthands for smart pointers +template using shptr = std::shared_ptr; +template using uqptr = std::unique_ptr; +template using wkptr = std::weak_ptr; + +template> using vector = std::vector; + +// remove empty weak pointers from a vector +template inline void cleanup(vector> &listeners) { + auto it = std::remove_if(listeners.begin(), listeners.end(), + [](auto &l) { return !l.lock(); }); + listeners.erase(it, listeners.end()); +} + +// Call a class method on each element of a vector of objects (weak pointers) +// of the same type. +template +inline void call(F &&f, vector> &listeners, Args&&... args) { + for (auto &l : listeners) + if (auto p = l.lock()) ((p.get())->*f)(std::forward(args)...); +} + +// A representation of a mouse input for the engine. +class MouseInput +{ +public: + enum WheelAxis { waVertical, waHorizontal }; + + // Interface to implement if an object wants to receive notifications + // about mouse events. + class Listener { + public: + virtual ~Listener(); + + virtual void on_left_click_down() {} + virtual void on_left_click_up() {} + virtual void on_right_click_down() {} + virtual void on_right_click_up() {} + virtual void on_double_click() {} + virtual void on_scroll(long /*v*/, long /*delta*/, WheelAxis ) {} + virtual void on_moved_to(long /*x*/, long /*y*/) {} + }; + +private: + vector> m_listeners; + +public: + virtual ~MouseInput() = default; + + virtual void left_click_down() + { + call(&Listener::on_left_click_down, m_listeners); + } + virtual void left_click_up() + { + call(&Listener::on_left_click_up, m_listeners); + } + virtual void right_click_down() + { + call(&Listener::on_right_click_down, m_listeners); + } + virtual void right_click_up() + { + call(&Listener::on_right_click_up, m_listeners); + } + virtual void double_click() + { + call(&Listener::on_double_click, m_listeners); + } + virtual void scroll(long v, long d, WheelAxis wa) + { + call(&Listener::on_scroll, m_listeners, v, d, wa); + } + virtual void move_to(long x, long y) + { + call(&Listener::on_moved_to, m_listeners, x, y); + } + + void add_listener(shptr listener) + { + m_listeners.emplace_back(listener); + cleanup(m_listeners); + } +}; + +// This is a stripped down version of Slic3r::IndexedVertexArray +class IndexedVertexArray { +public: + ~IndexedVertexArray() { release_geometry(); } + + // Vertices and their normals, interleaved to be used by void + // glInterleavedArrays(GL_N3F_V3F, 0, x) + vector vertices_and_normals_interleaved; + vector triangle_indices; + vector quad_indices; + + // When the geometry data is loaded into the graphics card as Vertex + // Buffer Objects, the above mentioned std::vectors are cleared and the + // following variables keep their original length. + size_t vertices_and_normals_interleaved_size{ 0 }; + size_t triangle_indices_size{ 0 }; + size_t quad_indices_size{ 0 }; + + // IDs of the Vertex Array Objects, into which the geometry has been loaded. + // Zero if the VBOs are not sent to GPU yet. + unsigned int vertices_and_normals_interleaved_VBO_id{ 0 }; + unsigned int triangle_indices_VBO_id{ 0 }; + unsigned int quad_indices_VBO_id{ 0 }; + + + void push_geometry(float x, float y, float z, float nx, float ny, float nz); + + inline void push_geometry( + double x, double y, double z, double nx, double ny, double nz) + { + push_geometry(float(x), float(y), float(z), float(nx), float(ny), float(nz)); + } + + inline void push_geometry(const Vec3d &p, const Vec3d &n) + { + push_geometry(p(0), p(1), p(2), n(0), n(1), n(2)); + } + + void push_triangle(int idx1, int idx2, int idx3); + + void load_mesh(const TriangleMesh &mesh); + + inline bool has_VBOs() const + { + return vertices_and_normals_interleaved_VBO_id != 0; + } + + // Finalize the initialization of the geometry & indices, + // upload the geometry and indices to OpenGL VBO objects + // and shrink the allocated data, possibly relasing it if it has been + // loaded into the VBOs. + void finalize_geometry(); + // Release the geometry data, release OpenGL VBOs. + void release_geometry(); + + void render() const; + + // Is there any geometry data stored? + bool empty() const { return vertices_and_normals_interleaved_size == 0; } + + void clear(); + + // Shrink the internal storage to tighly fit the data stored. + void shrink_to_fit(); +}; + +// Try to enable or disable multisampling. +bool enable_multisampling(bool e = true); + +class Volume { + IndexedVertexArray m_geom; + Geometry::Transformation m_trafo; + +public: + + void render(); + + void translation(const Vec3d &offset) { m_trafo.set_offset(offset); } + void rotation(const Vec3d &rot) { m_trafo.set_rotation(rot); } + void scale(const Vec3d &scaleing) { m_trafo.set_scaling_factor(scaleing); } + void scale(double s) { scale({s, s, s}); } + + inline void load_mesh(const TriangleMesh &mesh) + { + m_geom.load_mesh(mesh); + m_geom.finalize_geometry(); + } +}; + +// A primitive that can be used with OpenCSG rendering algorithms. +// Does a similar job to GLVolume. +class Primitive : public Volume, public OpenCSG::Primitive +{ +public: + using OpenCSG::Primitive::Primitive; + + Primitive() : OpenCSG::Primitive(OpenCSG::Intersection, 1) {} + + void render() override { Volume::render(); } +}; + +// A simple representation of a camera in a 3D scene +class Camera { +protected: + Vec2f m_rot = {0., 0.}; + Vec3d m_referene = {0., 0., 0.}; + double m_zoom = 0.; + double m_clip_z = 0.; +public: + + virtual ~Camera() = default; + + virtual void view(); + virtual void set_screen(long width, long height) = 0; + + void set_rotation(const Vec2f &rotation) { m_rot = rotation; } + void rotate(const Vec2f &rotation) { m_rot += rotation; } + void set_zoom(double z) { m_zoom = z; } + void set_reference_point(const Vec3d &p) { m_referene = p; } + void set_clip_z(double z) { m_clip_z = z; } +}; + +// Reset a camera object +inline void reset(Camera &cam) +{ + cam.set_rotation({0., 0.}); + cam.set_zoom(0.); + cam.set_reference_point({0., 0., 0.}); + cam.set_clip_z(0.); +} + +// Specialization of a camera which shows in perspective projection +class PerspectiveCamera: public Camera { +public: + + void set_screen(long width, long height) override; +}; + +// A simple counter of FPS. Subscribed objects will receive updates of the +// current fps. +class FpsCounter { + vector> m_listeners; + + using Clock = std::chrono::high_resolution_clock; + using Duration = Clock::duration; + using TimePoint = Clock::time_point; + + int m_frames = 0; + TimePoint m_last = Clock::now(), m_window = m_last; + + double m_resolution = 0.1, m_window_size = 1.0; + double m_fps = 0.; + + static double to_sec(Duration d) + { + return d.count() * double(Duration::period::num) / Duration::period::den; + } + +public: + + void update(); + + void add_listener(std::function lst) + { + m_listeners.emplace_back(lst); + } + + void clear_listeners() { m_listeners = {}; } + + void set_notification_interval(double seconds); + void set_measure_window_size(double seconds); + + double get_notification_interval() const { return m_resolution; } + double get_mesure_window_size() const { return m_window_size; } +}; + +// Collection of the used OpenCSG library settings. +class CSGSettings { +public: + static const constexpr unsigned DEFAULT_CONVEXITY = 10; + +private: + OpenCSG::Algorithm m_csgalg = OpenCSG::Algorithm::Automatic; + OpenCSG::DepthComplexityAlgorithm m_depth_algo = OpenCSG::NoDepthComplexitySampling; + OpenCSG::Optimization m_optim = OpenCSG::OptimizationDefault; + bool m_enable = true; + unsigned int m_convexity = DEFAULT_CONVEXITY; + +public: + int get_algo() const { return int(m_csgalg); } + void set_algo(int alg) + { + if (alg < OpenCSG::Algorithm::AlgorithmUnused) + m_csgalg = OpenCSG::Algorithm(alg); + } + + int get_depth_algo() const { return int(m_depth_algo); } + void set_depth_algo(int alg) + { + if (alg < OpenCSG::DepthComplexityAlgorithmUnused) + m_depth_algo = OpenCSG::DepthComplexityAlgorithm(alg); + } + + int get_optimization() const { return int(m_optim); } + void set_optimization(int o) + { + if (o < OpenCSG::Optimization::OptimizationUnused) + m_optim = OpenCSG::Optimization(o); + } + + void enable_csg(bool en = true) { m_enable = en; } + bool is_enabled() const { return m_enable; } + + unsigned get_convexity() const { return m_convexity; } + void set_convexity(unsigned c) { m_convexity = c; } +}; + +// The scene is a wrapper around SLAPrint which holds the data to be visualized. +class Scene +{ + uqptr m_print; +public: + + // Subscribers will be notified if the model is changed. This might be a + // display which will have to load the meshes and repaint itself when + // the scene data changes. + // eg. We load a new 3mf through the UI, this will notify the controller + // associated with the scene and all the displays that the controller is + // connected with. + class Listener { + public: + virtual ~Listener() = default; + virtual void on_scene_updated(const Scene &scene) = 0; + }; + + Scene(); + ~Scene(); + + void set_print(uqptr &&print); + const SLAPrint * get_print() const { return m_print.get(); } + + BoundingBoxf3 get_bounding_box() const; + + void add_listener(shptr listener) + { + m_listeners.emplace_back(listener); + cleanup(m_listeners); + } + +private: + vector> m_listeners; +}; + +// The basic Display. This is almost just an interface but will do all the +// initialization and show the fps values. Overriding the render_scene is +// needed to show the scene content. The specific method of displaying the +// scene is up the the particular implementation (OpenCSG or other screen space +// boolean algorithms) +class Display : public Scene::Listener +{ +protected: + Vec2i m_size; + bool m_initialized = false; + + shptr m_camera; + FpsCounter m_fps_counter; + +public: + + explicit Display(shptr camera = nullptr) + : m_camera(camera ? camera : std::make_shared()) + {} + + ~Display() override; + + shptr get_camera() const { return m_camera; } + shptr get_camera() { return m_camera; } + void set_camera(shptr cam) { m_camera = cam; } + + virtual void swap_buffers() = 0; + virtual void set_active(long width, long height); + virtual void set_screen_size(long width, long height); + Vec2i get_screen_size() const { return m_size; } + + virtual void repaint(); + + bool is_initialized() const { return m_initialized; } + + virtual void clear_screen(); + virtual void render_scene() {} + + template void set_fps_counter(_FpsCounter &&fpsc) + { + m_fps_counter = std::forward<_FpsCounter>(fpsc); + } + + const FpsCounter &get_fps_counter() const { return m_fps_counter; } + FpsCounter &get_fps_counter() { return m_fps_counter; } +}; + +// Special dispaly using OpenCSG for rendering the scene. +class CSGDisplay : public Display { +protected: + CSGSettings m_csgsettings; + + // Cache the renderable primitives. These will be fetched when the scene + // is modified. + struct SceneCache { + vector> primitives; + vector primitives_free; + vector primitives_csg; + + void clear(); + + shptr add_mesh(const TriangleMesh &mesh); + shptr add_mesh(const TriangleMesh &mesh, + OpenCSG::Operation op, + unsigned covexity); + } m_scene_cache; + +public: + + // Receive or apply the new settings. + const CSGSettings & get_csgsettings() const { return m_csgsettings; } + void apply_csgsettings(const CSGSettings &settings); + + void render_scene() override; + + void on_scene_updated(const Scene &scene) override; +}; + + +// The controller is a hub which dispatches mouse events to the connected +// displays. It keeps track of the mouse wheel position, the states whether +// the mouse is being held, dragged, etc... All the connected displays will +// mirror the camera movement (if there is more than one display). +class Controller : public std::enable_shared_from_this, + public MouseInput::Listener, + public Scene::Listener +{ + long m_wheel_pos = 0; + Vec2i m_mouse_pos, m_mouse_pos_rprev, m_mouse_pos_lprev; + bool m_left_btn = false, m_right_btn = false; + + shptr m_scene; + vector> m_displays; + + // Call a method of Camera on all the cameras of the attached displays + template + void call_cameras(F &&f, Args&&... args) { + for (wkptr &l : m_displays) + if (auto disp = l.lock()) if (auto cam = disp->get_camera()) + (cam.get()->*f)(std::forward(args)...); + } + +public: + + // Set the scene that will be controlled. + void set_scene(shptr scene) + { + m_scene = scene; + m_scene->add_listener(shared_from_this()); + } + + const Scene * get_scene() const { return m_scene.get(); } + + void add_display(shptr disp) + { + m_displays.emplace_back(disp); + cleanup(m_displays); + } + + void remove_displays() { m_displays = {}; } + + void on_scene_updated(const Scene &scene) override; + + void on_left_click_down() override { m_left_btn = true; } + void on_left_click_up() override { m_left_btn = false; } + void on_right_click_down() override { m_right_btn = true; } + void on_right_click_up() override { m_right_btn = false; } + + void on_scroll(long v, long d, MouseInput::WheelAxis wa) override; + void on_moved_to(long x, long y) override; + + void move_clip_plane(double z) { call_cameras(&Camera::set_clip_z, z); } +}; + +}} // namespace Slic3r::GL +#endif // SLIC3R_OCSG_EXMP_ENGINE_HPP diff --git a/sandboxes/opencsg/ShaderCSGDisplay.cpp b/sandboxes/opencsg/ShaderCSGDisplay.cpp new file mode 100644 index 0000000000..8ceb234be0 --- /dev/null +++ b/sandboxes/opencsg/ShaderCSGDisplay.cpp @@ -0,0 +1,68 @@ +#include "ShaderCSGDisplay.hpp" +#include "libslic3r/SLAPrint.hpp" +#include + +namespace Slic3r { namespace GL { + +void ShaderCSGDisplay::add_mesh(const TriangleMesh &mesh) +{ + auto v = std::make_shared(); + v->load_mesh(mesh); + m_volumes.emplace_back(v); +} + +void ShaderCSGDisplay::render_scene() +{ + GLfloat color[] = {1.f, 1.f, 0.f, 0.f}; + glColor4fv(color); + glDepthFunc(GL_LESS); + for (auto &v : m_volumes) v->render(); + glFlush(); +} + +void ShaderCSGDisplay::on_scene_updated(const Scene &scene) +{ + // TriangleMesh mesh = print->objects().front()->hollowed_interior_mesh(); + // Look at CSGDisplay::on_scene_updated to see how its done there. + + const SLAPrint *print = scene.get_print(); + if (!print) return; + + m_volumes.clear(); + + for (const SLAPrintObject *po : print->objects()) { + const ModelObject *mo = po->model_object(); + TriangleMesh msh = mo->raw_mesh(); + + sla::DrainHoles holedata = mo->sla_drain_holes; + + for (const ModelInstance *mi : mo->instances) { + + TriangleMesh mshinst = msh; + auto interior = po->hollowed_interior_mesh(); + interior.transform(po->trafo().inverse()); + + mshinst.merge(interior); + mshinst.require_shared_vertices(); + + mi->transform_mesh(&mshinst); + + auto bb = mshinst.bounding_box(); + auto center = bb.center().cast(); + mshinst.translate(-center); + + mshinst.require_shared_vertices(); + add_mesh(mshinst); + } + + for (const sla::DrainHole &holept : holedata) { + TriangleMesh holemesh = sla::to_triangle_mesh(holept.to_mesh()); + holemesh.require_shared_vertices(); + add_mesh(holemesh); + } + } + + repaint(); +} + +}} // namespace Slic3r::GL diff --git a/sandboxes/opencsg/ShaderCSGDisplay.hpp b/sandboxes/opencsg/ShaderCSGDisplay.hpp new file mode 100644 index 0000000000..bf0c3a4240 --- /dev/null +++ b/sandboxes/opencsg/ShaderCSGDisplay.hpp @@ -0,0 +1,27 @@ +#ifndef SHADERCSGDISPLAY_HPP +#define SHADERCSGDISPLAY_HPP + +#include "Engine.hpp" + +namespace Slic3r { namespace GL { + +class CSGVolume: public Volume +{ + // Extend... +}; + +class ShaderCSGDisplay: public Display { +protected: + vector> m_volumes; + + void add_mesh(const TriangleMesh &mesh); +public: + + void render_scene() override; + + void on_scene_updated(const Scene &scene) override; +}; + +}} + +#endif // SHADERCSGDISPLAY_HPP diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp new file mode 100644 index 0000000000..f5fb124935 --- /dev/null +++ b/sandboxes/opencsg/main.cpp @@ -0,0 +1,734 @@ +#include +#include +#include + +#include "Engine.hpp" +#include "ShaderCSGDisplay.hpp" + +#include + +#include +// For compilers that support precompilation, includes "wx/wx.h". +#include +#ifndef WX_PRECOMP +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include "libslic3r/Model.hpp" +#include "libslic3r/Format/3mf.hpp" +#include "libslic3r/SLAPrint.hpp" + +#include "slic3r/GUI/Jobs/Job.hpp" +#include "slic3r/GUI/ProgressStatusBar.hpp" + +using namespace Slic3r::GL; + +class Renderer { +protected: + wxGLCanvas *m_canvas; + shptr m_context; +public: + + Renderer(wxGLCanvas *c): m_canvas{c} { + auto ctx = new wxGLContext(m_canvas); + if (!ctx || !ctx->IsOK()) { + wxMessageBox("Could not create OpenGL context.", "Error", + wxOK | wxICON_ERROR); + return; + } + + m_context.reset(ctx); + } + + wxGLContext * context() { return m_context.get(); } + const wxGLContext * context() const { return m_context.get(); } +}; + +// Tell the CSGDisplay how to swap buffers and set the gl context. +class OCSGRenderer: public Renderer, public Slic3r::GL::CSGDisplay { +public: + + OCSGRenderer(wxGLCanvas *c): Renderer{c} {} + + void set_active(long w, long h) override + { + m_canvas->SetCurrent(*m_context); + Slic3r::GL::Display::set_active(w, h); + } + + void swap_buffers() override { m_canvas->SwapBuffers(); } +}; + +// Tell the CSGDisplay how to swap buffers and set the gl context. +class ShaderCSGRenderer : public Renderer, public Slic3r::GL::ShaderCSGDisplay { +public: + + ShaderCSGRenderer(wxGLCanvas *c): Renderer{c} {} + + void set_active(long w, long h) override + { + m_canvas->SetCurrent(*m_context); + Slic3r::GL::Display::set_active(w, h); + } + + void swap_buffers() override { m_canvas->SwapBuffers(); } +}; + +// The opengl rendering facility. Here we implement the rendering objects. +class Canvas: public wxGLCanvas +{ + // One display is active at a time, the OCSGRenderer by default. + shptr m_display; + +public: + + template + Canvas(Args &&...args): wxGLCanvas(std::forward(args)...) {} + + shptr get_display() const { return m_display; } + + void set_display(shptr d) { m_display = d; } +}; + +// Enumerate possible mouse events, we will record them. +enum EEvents { LCLK_U, RCLK_U, LCLK_D, RCLK_D, DDCLK, SCRL, MV }; +struct Event +{ + EEvents type; + long a, b; + Event(EEvents t, long x = 0, long y = 0) : type{t}, a{x}, b{y} {} +}; + +// Create a special mouse input adapter, which can store (record) the received +// mouse signals into a file and play back the stored events later. +class RecorderMouseInput: public MouseInput { + std::vector m_events; + bool m_recording = false, m_playing = false; + +public: + void left_click_down() override + { + if (m_recording) m_events.emplace_back(LCLK_D); + if (!m_playing) MouseInput::left_click_down(); + } + void left_click_up() override + { + if (m_recording) m_events.emplace_back(LCLK_U); + if (!m_playing) MouseInput::left_click_up(); + } + void right_click_down() override + { + if (m_recording) m_events.emplace_back(RCLK_D); + if (!m_playing) MouseInput::right_click_down(); + } + void right_click_up() override + { + if (m_recording) m_events.emplace_back(RCLK_U); + if (!m_playing) MouseInput::right_click_up(); + } + void double_click() override + { + if (m_recording) m_events.emplace_back(DDCLK); + if (!m_playing) MouseInput::double_click(); + } + void scroll(long v, long d, WheelAxis wa) override + { + if (m_recording) m_events.emplace_back(SCRL, v, d); + if (!m_playing) MouseInput::scroll(v, d, wa); + } + void move_to(long x, long y) override + { + if (m_recording) m_events.emplace_back(MV, x, y); + if (!m_playing) MouseInput::move_to(x, y); + } + + void save(std::ostream &stream) + { + for (const Event &evt : m_events) + stream << evt.type << " " << evt.a << " " << evt.b << std::endl; + } + + void load(std::istream &stream) + { + m_events.clear(); + while (stream.good()) { + int type; long a, b; + stream >> type >> a >> b; + m_events.emplace_back(EEvents(type), a, b); + } + } + + void record(bool r) { m_recording = r; if (r) m_events.clear(); } + + void play() + { + m_playing = true; + for (const Event &evt : m_events) { + switch (evt.type) { + case LCLK_U: MouseInput::left_click_up(); break; + case LCLK_D: MouseInput::left_click_down(); break; + case RCLK_U: MouseInput::right_click_up(); break; + case RCLK_D: MouseInput::right_click_down(); break; + case DDCLK: MouseInput::double_click(); break; + case SCRL: MouseInput::scroll(evt.a, evt.b, WheelAxis::waVertical); break; + case MV: MouseInput::move_to(evt.a, evt.b); break; + } + + wxTheApp->Yield(); + if (!m_playing) + break; + } + m_playing = false; + } + + void stop() { m_playing = false; } + bool is_playing() const { return m_playing; } +}; + +// The top level frame of the application. +class MyFrame: public wxFrame +{ + // Instantiate the 3D engine. + shptr m_scene; // Model + shptr m_canvas; // Views store + shptr m_ocsgdisplay; // View + shptr m_shadercsg_display; // Another view + shptr m_ctl; // Controller + + // Add a status bar with progress indication. + shptr m_stbar; + + RecorderMouseInput m_mouse; + + // When loading a Model from 3mf and preparing it, we use a separate thread. + class SLAJob: public Slic3r::GUI::Job { + MyFrame *m_parent; + std::unique_ptr m_print; + std::string m_fname; + + public: + SLAJob(MyFrame *frame, const std::string &fname) + : Slic3r::GUI::Job{frame->m_stbar} + , m_parent{frame} + , m_fname{fname} + {} + + // Runs in separate thread + void process() override; + + const std::string & get_project_fname() const { return m_fname; } + + protected: + + // Runs in the UI thread. + void finalize() override + { + m_parent->m_scene->set_print(std::move(m_print)); + m_parent->m_stbar->set_status_text( + wxString::Format("Model %s loaded.", m_fname)); + } + }; + + uqptr m_ui_job; + + // To keep track of the running average of measured fps values. + double m_fps_avg = 0.; + + // We need the record button across methods + wxToggleButton *m_record_btn; + wxComboBox * m_alg_select; + wxComboBox * m_depth_select; + wxComboBox * m_optimization_select; + wxSpinCtrl * m_convexity_spin; + wxToggleButton *m_csg_toggle; + wxToggleButton *m_ms_toggle; + wxStaticText *m_fpstext; + + CSGSettings m_csg_settings; + + void read_csg_settings(const wxCmdLineParser &parser); + + void set_renderer_algorithm(const wxString &alg); + + void activate_canvas_display(); + +public: + MyFrame(const wxString & title, + const wxPoint & pos, + const wxSize & size, + const wxCmdLineParser &parser); + + // Grab a 3mf and load (hollow it out) within the UI job. + void load_model(const std::string &fname) { + m_ui_job = std::make_unique(this, fname); + m_ui_job->start(); + } + + // Load a previously stored mouse event log and play it back. + void play_back_mouse(const std::string &events_fname) + { + std::fstream stream(events_fname, std::fstream::in); + + if (stream.good()) { + std::string model_name; + std::getline(stream, model_name); + load_model(model_name); + + while (!m_ui_job->is_finalized()) + wxTheApp->Yield();; + + int w, h; + stream >> w >> h; + SetSize(w, h); + + m_mouse.load(stream); + if (m_record_btn) m_record_btn->Disable(); + m_mouse.play(); + } + } + + Canvas * canvas() { return m_canvas.get(); } + const Canvas * canvas() const { return m_canvas.get(); } + + // Bind the canvas mouse events to a class implementing MouseInput interface + void bind_canvas_events(MouseInput &msinput); + + double get_fps_average() const { return m_fps_avg; } +}; + +// Possible OpenCSG configuration values. Will be used on the command line and +// on the UI widgets. +static const std::vector CSG_ALGS = {"Auto", "Goldfeather", "SCS", "EnricoShader"}; +static const std::vector CSG_DEPTH = {"Off", "OcclusionQuery", "On"}; +static const std::vector CSG_OPT = { "Default", "ForceOn", "On", "Off" }; + +inline long get_idx(const wxString &a, const std::vector &v) +{ + auto it = std::find(v.begin(), v.end(), a.ToStdString()); + return it - v.begin(); +}; + +class App : public wxApp { + MyFrame *m_frame = nullptr; + wxString m_fname; +public: + bool OnInit() override { + + wxCmdLineParser parser(argc, argv); + + parser.AddOption("p", "play", "play back file", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption("a", "algorithm", "OpenCSG algorithm [Auto|Goldfeather|SCS]", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption("d", "depth", "OpenCSG depth strategy [Off|OcclusionQuery|On]", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption("o", "optimization", "OpenCSG optimization strategy [Default|ForceOn|On|Off]", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddOption("c", "convexity", "OpenCSG convexity parameter for generic meshes", wxCMD_LINE_VAL_NUMBER, wxCMD_LINE_PARAM_OPTIONAL); + parser.AddSwitch("", "disable-csg", "Disable csg rendering", wxCMD_LINE_PARAM_OPTIONAL); + + parser.Parse(); + + bool is_play = parser.Found("play", &m_fname); + + m_frame = new MyFrame("PrusaSlicer OpenCSG Demo", wxDefaultPosition, wxSize(1024, 768), parser); + + if (is_play) { + Bind(wxEVT_IDLE, &App::Play, this); + m_frame->Show( true ); + } else m_frame->Show( true ); + + return true; + } + + void Play(wxIdleEvent &) { + Unbind(wxEVT_IDLE, &App::Play, this); + m_frame->play_back_mouse(m_fname.ToStdString()); + m_frame->Destroy(); + } +}; + +wxIMPLEMENT_APP(App); + +void MyFrame::read_csg_settings(const wxCmdLineParser &parser) +{ + wxString alg; + parser.Found("algorithm", &alg); + + wxString depth; + parser.Found("depth", &depth); + + wxString opt; + parser.Found("optimization", &opt); + + long convexity = 1; + parser.Found("convexity", &convexity); + + bool csg_off = parser.Found("disable-csg"); + + if (auto a = get_idx(alg, CSG_ALGS) < OpenCSG::AlgorithmUnused) + m_csg_settings.set_algo(OpenCSG::Algorithm(a)); + + if (auto a = get_idx(depth, CSG_DEPTH) < OpenCSG::DepthComplexityAlgorithmUnused) + m_csg_settings.set_depth_algo(OpenCSG::DepthComplexityAlgorithm(a)); + + if (auto a = get_idx(opt, CSG_OPT) < OpenCSG::OptimizationUnused) + m_csg_settings.set_optimization(OpenCSG::Optimization(a)); + + m_csg_settings.set_convexity(unsigned(convexity)); + m_csg_settings.enable_csg(!csg_off); + + if (m_ocsgdisplay) m_ocsgdisplay->apply_csgsettings(m_csg_settings); +} + +void MyFrame::set_renderer_algorithm(const wxString &alg) +{ + long alg_idx = get_idx(alg, CSG_ALGS); + if (alg_idx < 0 || alg_idx >= long(CSG_ALGS.size())) return; + + // If there is a valid display in place, save its camera. + auto cam = m_canvas->get_display() ? + m_canvas->get_display()->get_camera() : nullptr; + + if (alg == "EnricoShader") { + m_alg_select->SetSelection(int(alg_idx)); + m_depth_select->Disable(); + m_optimization_select->Disable(); + m_csg_toggle->Disable(); + + m_ocsgdisplay.reset(); + canvas()->set_display(nullptr); + m_shadercsg_display = std::make_shared(canvas()); + canvas()->set_display(m_shadercsg_display); + } else { + if (m_csg_settings.get_algo() > 0) m_depth_select->Enable(true); + m_alg_select->SetSelection(m_csg_settings.get_algo()); + m_depth_select->SetSelection(m_csg_settings.get_depth_algo()); + m_optimization_select->SetSelection(m_csg_settings.get_optimization()); + m_convexity_spin->SetValue(int(m_csg_settings.get_convexity())); + m_csg_toggle->SetValue(m_csg_settings.is_enabled()); + m_optimization_select->Enable(); + m_csg_toggle->Enable(); + + m_shadercsg_display.reset(); + canvas()->set_display(nullptr); + m_ocsgdisplay = std::make_shared(canvas()); + m_ocsgdisplay->apply_csgsettings(m_csg_settings); + canvas()->set_display(m_ocsgdisplay); + } + + if (cam) + m_canvas->get_display()->set_camera(cam); + + m_ctl->remove_displays(); + m_ctl->add_display(m_canvas->get_display()); + m_canvas->get_display()->get_fps_counter().add_listener([this](double fps) { + m_fpstext->SetLabel(wxString::Format("fps: %.2f", fps)); + m_fps_avg = 0.9 * m_fps_avg + 0.1 * fps; + }); + + if (IsShown()) { + activate_canvas_display(); + m_canvas->get_display()->on_scene_updated(*m_scene); + } +} + +void MyFrame::activate_canvas_display() +{ + const wxSize ClientSize = m_canvas->GetClientSize(); + m_canvas->get_display()->set_active(ClientSize.x, ClientSize.y); + enable_multisampling(m_ms_toggle->GetValue()); + + m_canvas->Bind(wxEVT_PAINT, [this](wxPaintEvent &) { + // This is required even though dc is not used otherwise. + wxPaintDC dc(m_canvas.get()); + const wxSize csize = m_canvas->GetClientSize(); + m_canvas->get_display()->set_screen_size(csize.x, csize.y); + m_canvas->get_display()->repaint(); + }); + + m_canvas->Bind(wxEVT_SIZE, [this](wxSizeEvent &) { + const wxSize csize = m_canvas->GetClientSize(); + m_canvas->get_display()->set_screen_size(csize.x, csize.y); + m_canvas->get_display()->repaint(); + }); + + // Do the repaint continuously + m_canvas->Bind(wxEVT_IDLE, [this](wxIdleEvent &evt) { + m_canvas->get_display()->repaint(); + evt.RequestMore(); + }); + + bind_canvas_events(m_mouse); +} + +MyFrame::MyFrame(const wxString &title, const wxPoint &pos, const wxSize &size, + const wxCmdLineParser &parser): + wxFrame(nullptr, wxID_ANY, title, pos, size) +{ + wxMenu *menuFile = new wxMenu; + menuFile->Append(wxID_OPEN); + menuFile->Append(wxID_EXIT); + wxMenuBar *menuBar = new wxMenuBar; + menuBar->Append( menuFile, "&File" ); + SetMenuBar( menuBar ); + + m_stbar = std::make_shared(this); + m_stbar->embed(this); + + SetStatusText( "Welcome to wxWidgets!" ); + + 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, 8, WX_GL_STENCIL_SIZE, 8, + WX_GL_SAMPLE_BUFFERS, GL_TRUE, WX_GL_SAMPLES, 4, 0}; + + m_scene = std::make_shared(); + m_ctl = std::make_shared(); + m_ctl->set_scene(m_scene); + + m_canvas = std::make_shared(this, wxID_ANY, attribList, + wxDefaultPosition, wxDefaultSize, + wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE); + + read_csg_settings(parser); + + wxPanel *control_panel = new wxPanel(this); + + auto controlsizer = new wxBoxSizer(wxHORIZONTAL); + auto slider_sizer = new wxBoxSizer(wxVERTICAL); + auto console_sizer = new wxBoxSizer(wxVERTICAL); + + auto slider = new wxSlider(control_panel, wxID_ANY, 0, 0, 100, + wxDefaultPosition, wxDefaultSize, + wxSL_VERTICAL); + slider_sizer->Add(slider, 1, wxEXPAND); + + m_ms_toggle = new wxToggleButton(control_panel, wxID_ANY, "Multisampling"); + console_sizer->Add(m_ms_toggle, 0, wxALL | wxEXPAND, 5); + + m_csg_toggle = new wxToggleButton(control_panel, wxID_ANY, "CSG"); + m_csg_toggle->SetValue(true); + console_sizer->Add(m_csg_toggle, 0, wxALL | wxEXPAND, 5); + + auto add_combobox = [control_panel, console_sizer] + (const wxString &label, const std::vector &list) + { + auto widget = new wxComboBox(control_panel, wxID_ANY, list[0], + wxDefaultPosition, wxDefaultSize, + int(list.size()), list.data()); + + auto sz = new wxBoxSizer(wxHORIZONTAL); + sz->Add(new wxStaticText(control_panel, wxID_ANY, label), 0, + wxALL | wxALIGN_CENTER, 5); + sz->Add(widget, 1, wxALL | wxEXPAND, 5); + console_sizer->Add(sz, 0, wxEXPAND); + return widget; + }; + + auto add_spinctl = [control_panel, console_sizer] + (const wxString &label, int initial, int min, int max) + { + auto widget = new wxSpinCtrl( + control_panel, wxID_ANY, + wxString::Format("%d", initial), + wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, min, max, + initial); + + auto sz = new wxBoxSizer(wxHORIZONTAL); + sz->Add(new wxStaticText(control_panel, wxID_ANY, label), 0, + wxALL | wxALIGN_CENTER, 5); + sz->Add(widget, 1, wxALL | wxEXPAND, 5); + console_sizer->Add(sz, 0, wxEXPAND); + return widget; + }; + + m_convexity_spin = add_spinctl("Convexity", CSGSettings::DEFAULT_CONVEXITY, 0, 100); + + m_alg_select = add_combobox("Algorithm", CSG_ALGS); + m_depth_select = add_combobox("Depth Complexity", CSG_DEPTH); + m_optimization_select = add_combobox("Optimization", CSG_OPT); + + m_fpstext = new wxStaticText(control_panel, wxID_ANY, ""); + console_sizer->Add(m_fpstext, 0, wxALL, 5); + + m_record_btn = new wxToggleButton(control_panel, wxID_ANY, "Record"); + console_sizer->Add(m_record_btn, 0, wxALL | wxEXPAND, 5); + + controlsizer->Add(slider_sizer, 0, wxEXPAND); + controlsizer->Add(console_sizer, 1, wxEXPAND); + + control_panel->SetSizer(controlsizer); + + auto sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(m_canvas.get(), 1, wxEXPAND); + sizer->Add(control_panel, 0, wxEXPAND); + SetSizer(sizer); + + wxString alg; + if (!parser.Found("algorithm", &alg)) alg = "Auto"; + + set_renderer_algorithm(alg); + + Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent &evt){ + if (m_canvas) RemoveChild(m_canvas.get()); + m_canvas.reset(); + if (!m_mouse.is_playing()) evt.Skip(); + else m_mouse.stop(); + }); + + Bind(wxEVT_MENU, [this](wxCommandEvent &) { + wxFileDialog dlg(this, "Select project file", wxEmptyString, + wxEmptyString, "*.3mf", wxFD_OPEN|wxFD_FILE_MUST_EXIST); + + if (dlg.ShowModal() == wxID_OK) load_model(dlg.GetPath().ToStdString()); + }, wxID_OPEN); + + Bind(wxEVT_MENU, [this](wxCommandEvent &) { Close(true); }, wxID_EXIT); + + Bind(wxEVT_SHOW, [this](wxShowEvent &) { + activate_canvas_display(); + }); + + Bind(wxEVT_SLIDER, [this, slider](wxCommandEvent &) { + m_ctl->move_clip_plane(double(slider->GetValue())); + }); + + m_ms_toggle->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent &){ + enable_multisampling(m_ms_toggle->GetValue()); + m_canvas->get_display()->repaint(); + }); + + m_csg_toggle->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent &){ + CSGSettings stt = m_ocsgdisplay->get_csgsettings(); + stt.enable_csg(m_csg_toggle->GetValue()); + m_ocsgdisplay->apply_csgsettings(stt); + }); + + m_alg_select->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &) { + wxString alg = m_alg_select->GetValue(); + int sel = m_alg_select->GetSelection(); + m_csg_settings.set_algo(sel); + set_renderer_algorithm(alg); + }); + + m_depth_select->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &) { + int sel = m_depth_select->GetSelection(); + m_csg_settings.set_depth_algo(sel); + if (m_ocsgdisplay) m_ocsgdisplay->apply_csgsettings(m_csg_settings); + }); + + m_optimization_select->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &) { + int sel = m_optimization_select->GetSelection(); + m_csg_settings.set_optimization(sel); + if (m_ocsgdisplay) m_ocsgdisplay->apply_csgsettings(m_csg_settings); + }); + + m_convexity_spin->Bind(wxEVT_SPINCTRL, [this](wxSpinEvent &) { + int c = m_convexity_spin->GetValue(); + if (c > 0) { + m_csg_settings.set_convexity(unsigned(c)); + if (m_ocsgdisplay) m_ocsgdisplay->apply_csgsettings(m_csg_settings); + } + }); + + m_record_btn->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent &) { + if (!m_ui_job) { + m_stbar->set_status_text("No project loaded!"); + return; + } + + if (m_record_btn->GetValue()) { + if (auto c = m_canvas->get_display()->get_camera()) reset(*c); + m_ctl->on_scene_updated(*m_scene); + m_mouse.record(true); + } else { + m_mouse.record(false); + wxFileDialog dlg(this, "Select output file", + wxEmptyString, wxEmptyString, "*.events", + wxFD_SAVE|wxFD_OVERWRITE_PROMPT); + + if (dlg.ShowModal() == wxID_OK) { + std::fstream stream(dlg.GetPath().ToStdString(), + std::fstream::out); + + if (stream.good()) { + stream << m_ui_job->get_project_fname() << "\n"; + wxSize winsize = GetSize(); + stream << winsize.x << " " << winsize.y << "\n"; + m_mouse.save(stream); + } + } + } + }); +} + +void MyFrame::bind_canvas_events(MouseInput &ms) +{ + m_canvas->Bind(wxEVT_MOUSEWHEEL, [&ms](wxMouseEvent &evt) { + ms.scroll(evt.GetWheelRotation(), evt.GetWheelDelta(), + evt.GetWheelAxis() == wxMOUSE_WHEEL_VERTICAL ? + Slic3r::GL::MouseInput::waVertical : + Slic3r::GL::MouseInput::waHorizontal); + }); + + m_canvas->Bind(wxEVT_MOTION, [&ms](wxMouseEvent &evt) { + ms.move_to(evt.GetPosition().x, evt.GetPosition().y); + }); + + m_canvas->Bind(wxEVT_RIGHT_DOWN, [&ms](wxMouseEvent & /*evt*/) { + ms.right_click_down(); + }); + + m_canvas->Bind(wxEVT_RIGHT_UP, [&ms](wxMouseEvent & /*evt*/) { + ms.right_click_up(); + }); + + m_canvas->Bind(wxEVT_LEFT_DOWN, [&ms](wxMouseEvent & /*evt*/) { + ms.left_click_down(); + }); + + m_canvas->Bind(wxEVT_LEFT_UP, [&ms](wxMouseEvent & /*evt*/) { + ms.left_click_up(); + }); + + ms.add_listener(m_ctl); +} + +void MyFrame::SLAJob::process() +{ + using SlStatus = Slic3r::PrintBase::SlicingStatus; + + Slic3r::DynamicPrintConfig cfg; + auto model = Slic3r::Model::read_from_file(m_fname, &cfg); + + m_print = std::make_unique(); + m_print->apply(model, cfg); + + Slic3r::PrintBase::TaskParams params; + params.to_object_step = Slic3r::slaposHollowing; + m_print->set_task(params); + + m_print->set_status_callback([this](const SlStatus &status) { + update_status(status.percent, status.text); + }); + + try { + m_print->process(); + } catch(std::exception &e) { + update_status(0, wxString("Exception during processing: ") + e.what()); + } +} + +//int main() {} diff --git a/sandboxes/openvdb/CMakeLists.txt b/sandboxes/openvdb/CMakeLists.txt index 184452e833..c32d6c8d63 100644 --- a/sandboxes/openvdb/CMakeLists.txt +++ b/sandboxes/openvdb/CMakeLists.txt @@ -1,2 +1,7 @@ -add_executable(openvdb_example openvdb_example.cpp) -target_link_libraries(openvdb_example libslic3r) +if(TARGET OpenVDB::openvdb) + add_executable(openvdb_example openvdb_example.cpp) + + target_link_libraries(openvdb_example libslic3r) + target_link_libraries(openvdb_example OpenVDB::openvdb) +endif() + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1bf2787220..c93d95946c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,3 +1,4 @@ +cmake_minimum_required(VERSION 3.13) project(PrusaSlicer-native) add_subdirectory(build-utils) @@ -22,6 +23,8 @@ add_subdirectory(libslic3r) if (SLIC3R_GUI) add_subdirectory(imgui) + add_subdirectory(hidapi) + include_directories(hidapi/include) if(WIN32) message(STATUS "WXWIN environment set to: $ENV{WXWIN}") @@ -56,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}") @@ -66,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) @@ -79,8 +106,8 @@ if (MINGW) set_target_properties(PrusaSlicer PROPERTIES PREFIX "") endif (MINGW) -if (NOT WIN32) - # Binary name on unix like systems (OSX, Linux) +if (NOT WIN32 AND NOT APPLE) + # Binary name on unix like systems (Linux, Unix) set_target_properties(PrusaSlicer PROPERTIES OUTPUT_NAME "prusa-slicer") endif () @@ -101,43 +128,17 @@ endif () # Add the Slic3r GUI library, libcurl, OpenGL and GLU libraries. if (SLIC3R_GUI) # target_link_libraries(PrusaSlicer ws2_32 uxtheme setupapi libslic3r_gui ${wxWidgets_LIBRARIES}) -target_link_libraries(PrusaSlicer libslic3r_gui ${wxWidgets_LIBRARIES}) - - # Configure libcurl and its dependencies OpenSSL & zlib - find_package(CURL REQUIRED) - if (NOT WIN32) - # Required by libcurl - find_package(ZLIB REQUIRED) - endif() - target_include_directories(PrusaSlicer PRIVATE ${CURL_INCLUDE_DIRS}) - target_link_libraries(PrusaSlicer ${CURL_LIBRARIES} ${ZLIB_LIBRARIES}) - if (SLIC3R_STATIC) - if (NOT APPLE) - # libcurl is always linked dynamically to the system libcurl on OSX. - # On other systems, libcurl is linked statically if SLIC3R_STATIC is set. - target_compile_definitions(PrusaSlicer PRIVATE CURL_STATICLIB) - endif() - if (CMAKE_SYSTEM_NAME STREQUAL "Linux") - # As of now, our build system produces a statically linked libcurl, - # which links the OpenSSL library dynamically. - find_package(OpenSSL REQUIRED) - message("OpenSSL include dir: ${OPENSSL_INCLUDE_DIR}") - message("OpenSSL libraries: ${OPENSSL_LIBRARIES}") - target_include_directories(PrusaSlicer PRIVATE ${OPENSSL_INCLUDE_DIR}) - target_link_libraries(PrusaSlicer ${OPENSSL_LIBRARIES}) - endif() - endif() - +target_link_libraries(PrusaSlicer libslic3r_gui) if (MSVC) # Generate debug symbols even in release mode. target_link_options(PrusaSlicer PUBLIC "$<$:/DEBUG>") - target_link_libraries(PrusaSlicer user32.lib Setupapi.lib OpenGL32.Lib GlU32.Lib) + target_link_libraries(PrusaSlicer user32.lib Setupapi.lib) elseif (MINGW) - target_link_libraries(PrusaSlicer opengl32 ws2_32 uxtheme setupapi) + target_link_libraries(PrusaSlicer ws2_32 uxtheme setupapi) elseif (APPLE) target_link_libraries(PrusaSlicer "-framework OpenGL") else () - target_link_libraries(PrusaSlicer -ldl -lGL -lGLU) + target_link_libraries(PrusaSlicer -ldl) endif () endif () @@ -161,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 "$<$:/DEBUG>") + target_link_options(PrusaSlicer_app_console PUBLIC "$<$:/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 "$<$:/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 @@ -193,20 +204,39 @@ if (WIN32) VERBATIM ) endif () -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 - ) + + # This has to be a separate target due to the windows command line lenght limits + add_custom_target(PrusaSlicerDllsCopy ALL DEPENDS PrusaSlicer) + prusaslicer_copy_dlls(PrusaSlicerDllsCopy) + else () + if (APPLE) + # On OSX, the name of the binary matches the name of the Application. + 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 "$" + 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 "$" + 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) @@ -217,4 +247,7 @@ if (WIN32) endif () else () install(TARGETS PrusaSlicer RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + + # Install the symlink for gcodeviewer + install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink prusa-slicer prusa-gcodeviewer WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR})") endif () diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp index f708679c18..c181525bdf 100644 --- a/src/PrusaSlicer.cpp +++ b/src/PrusaSlicer.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -34,6 +35,7 @@ #include "libslic3r/Config.hpp" #include "libslic3r/Geometry.hpp" #include "libslic3r/Model.hpp" +#include "libslic3r/ModelArrange.hpp" #include "libslic3r/Print.hpp" #include "libslic3r/SLAPrint.hpp" #include "libslic3r/TriangleMesh.hpp" @@ -41,26 +43,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 *opt = config.option>("printer_technology"); - return (opt == nullptr) ? ptUnknown : opt->value; -} - int CLI::run(int argc, char **argv) { + // Mark the main thread for the debugger and for runtime checks. + 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 +91,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 &load_configs = m_config.option("load", true)->values; // load config files supplied via --load @@ -112,8 +127,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,51 +138,102 @@ int CLI::run(int argc, char **argv) m_print_config.apply(config); } - // 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); + // 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; } - 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; + } + + // Read input file(s) if any. + for (const std::string& file : m_input_files) { + std::string ext = boost::filesystem::path(file).extension().string(); + if (ext == ".gcode" || ext == ".g") { + if (boost::filesystem::exists(file)) { + start_as_gcodeviewer = true; + break; + } + } + } + if (!start_as_gcodeviewer) { + 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; + } + m_models.push_back(model); } - if (model.objects.empty()) { - boost::nowide::cerr << "Error: file is empty: " << file << std::endl; - continue; - } - 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; -// SLAFullPrintConfig sla_print_config; - fff_print_config.apply(m_print_config, true); -// sla_print_config.apply(m_print_config, true); - + SLAFullPrintConfig sla_print_config; + + // Synchronize the default parameters and the ones received on the command line. + if (printer_technology == ptFFF) { + fff_print_config.apply(m_print_config, true); + m_print_config.apply(fff_print_config, true); + } else if (printer_technology == ptSLA) { + // The default value has to be different from the one in fff mode. + sla_print_config.printer_technology.value = ptSLA; + sla_print_config.output_filename_format.value = "[input_filename_base].sl1"; + + // The default bed shape should reflect the default display parameters + // and not the fff defaults. + double w = sla_print_config.display_width.getFloat(); + double h = sla_print_config.display_height.getFloat(); + sla_print_config.bed_shape.values = { Vec2d(0, 0), Vec2d(w, 0), Vec2d(w, h), Vec2d(0, h) }; + + sla_print_config.apply(m_print_config, true); + 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; @@ -177,29 +243,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") { @@ -393,7 +463,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) { @@ -403,11 +474,11 @@ int CLI::run(int argc, char **argv) PrintBase *print = (printer_technology == ptFFF) ? static_cast(&fff_print) : static_cast(&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("bed_shape")->values).center() : - m_config.option("center")->value); + if (user_center_specified) { + Vec2d c = m_config.option("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) @@ -427,17 +498,20 @@ 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; } boost::nowide::cout << "Slicing result exported to " << outfile << std::endl; } catch (const std::exception &ex) { @@ -483,43 +557,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; @@ -544,7 +595,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' @@ -558,7 +609,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()); @@ -587,13 +638,20 @@ 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 }) for (const std::pair &optdef : *options) - m_config.optptr(optdef.first, true); + 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; } @@ -624,6 +682,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) @@ -641,10 +707,10 @@ bool CLI::export_models(IO::ExportFormat format) const std::string path = this->output_filepath(model, format); bool success = false; switch (format) { - case IO::AMF: success = Slic3r::store_amf(path.c_str(), &model, nullptr); break; + case IO::AMF: success = Slic3r::store_amf(path.c_str(), &model, nullptr, false); break; case IO::OBJ: success = Slic3r::store_obj(path.c_str(), &model); break; case IO::STL: success = Slic3r::store_stl(path.c_str(), &model, true); break; - case IO::TMF: success = Slic3r::store_3mf(path.c_str(), &model, nullptr); break; + case IO::TMF: success = Slic3r::store_3mf(path.c_str(), &model, nullptr, false); break; default: assert(false); break; } if (success) @@ -691,7 +757,7 @@ extern "C" { for (size_t i = 0; i < argc; ++ i) argv_narrow.emplace_back(boost::nowide::narrow(argv[i])); for (size_t i = 0; i < argc; ++ i) - argv_ptrs[i] = const_cast(argv_narrow[i].data()); + argv_ptrs[i] = argv_narrow[i].data(); // Call the UTF8 main. return CLI().run(argc, argv_ptrs.data()); } diff --git a/src/PrusaSlicer_app_msvc.cpp b/src/PrusaSlicer_app_msvc.cpp index b3d1e8bb47..5f12c91479 100644 --- a/src/PrusaSlicer_app_msvc.cpp +++ b/src/PrusaSlicer_app_msvc.cpp @@ -7,6 +7,8 @@ #include #include + + #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 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 ad02ea003c..c2c624d589 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/connect.cpp b/src/admesh/connect.cpp index d6de6ce6a4..c266c724c4 100644 --- a/src/admesh/connect.cpp +++ b/src/admesh/connect.cpp @@ -601,11 +601,12 @@ void stl_remove_unconnected_facets(stl_file *stl) stl->neighbors_start[facet].which_vertex_not[edge[1]], stl->neighbors_start[facet].which_vertex_not[edge[2]] }; + // Update statistics on edge connectivity. - if (neighbor[0] == -1) - stl_update_connects_remove_1(neighbor[1]); - if (neighbor[1] == -1) - stl_update_connects_remove_1(neighbor[0]); + if ((neighbor[0] == -1) && (neighbor[1] != -1)) + stl_update_connects_remove_1(neighbor[1]); + if ((neighbor[1] == -1) && (neighbor[0] != -1)) + stl_update_connects_remove_1(neighbor[0]); if (neighbor[0] >= 0) { if (neighbor[1] >= 0) { diff --git a/src/admesh/stl.h b/src/admesh/stl.h index 9224b04594..e0f2865f0d 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 -inline void its_transform(indexed_triangle_set &its, const Eigen::Transform& t) +inline void its_transform(indexed_triangle_set &its, const Eigen::Transform& t, bool fix_left_handed = false) { //const Eigen::Matrix r = t.matrix().template block<3, 3>(0, 0); for (stl_vertex &v : its.vertices) v = (t * v.template cast()).template cast().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 -inline void its_transform(indexed_triangle_set &its, const Eigen::Matrix& m) +inline void its_transform(indexed_triangle_set &its, const Eigen::Matrix& m, bool fix_left_handed = false) { - for (stl_vertex &v : its.vertices) + for (stl_vertex &v : its.vertices) v = (m * v.template cast()).template cast().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 390fe56a40..6aa2c44177 100644 --- a/src/admesh/stlinit.cpp +++ b/src/admesh/stlinit.cpp @@ -28,7 +28,7 @@ #include #include -#include +#include #include "stl.h" @@ -36,9 +36,9 @@ #error "SEEK_SET not defined" #endif -#ifndef BOOST_LITTLE_ENDIAN +#if BOOST_ENDIAN_BIG_BYTE extern void stl_internal_reverse_quads(char *buf, size_t cnt); -#endif /* BOOST_LITTLE_ENDIAN */ +#endif /* BOOST_ENDIAN_BIG_BYTE */ static FILE* stl_open_count_facets(stl_file *stl, const char *file) { @@ -89,10 +89,10 @@ static FILE* stl_open_count_facets(stl_file *stl, const char *file) // Read the int following the header. This should contain # of facets. uint32_t header_num_facets; bool header_num_faces_read = fread(&header_num_facets, sizeof(uint32_t), 1, fp) != 0; -#ifndef BOOST_LITTLE_ENDIAN +#if BOOST_ENDIAN_BIG_BYTE // Convert from little endian to big endian. stl_internal_reverse_quads((char*)&header_num_facets, 4); -#endif /* BOOST_LITTLE_ENDIAN */ +#endif /* BOOST_ENDIAN_BIG_BYTE */ if (! header_num_faces_read || num_facets != header_num_facets) BOOST_LOG_TRIVIAL(info) << "stl_open_count_facets: Warning: File size doesn't match number of facets in the header: " << file; } @@ -158,10 +158,10 @@ static bool stl_read(stl_file *stl, FILE *fp, int first_facet, bool first) // Read a single facet from a binary .STL file. We assume little-endian architecture! if (fread(&facet, 1, SIZEOF_STL_FACET, fp) != SIZEOF_STL_FACET) return false; -#ifndef BOOST_LITTLE_ENDIAN +#if BOOST_ENDIAN_BIG_BYTE // Convert the loaded little endian data to big endian. stl_internal_reverse_quads((char*)&facet, 48); -#endif /* BOOST_LITTLE_ENDIAN */ +#endif /* BOOST_ENDIAN_BIG_BYTE */ } else { // Read a single facet from an ASCII .STL file // skip solid/endsolid diff --git a/src/avrdude/CMakeLists.txt b/src/avrdude/CMakeLists.txt index 8897200211..fc01b7d8dd 100644 --- a/src/avrdude/CMakeLists.txt +++ b/src/avrdude/CMakeLists.txt @@ -1,8 +1,5 @@ cmake_minimum_required(VERSION 3.0) -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - add_definitions(-D_BSD_SOURCE -D_DEFAULT_SOURCE) # To enable various useful macros and functions on Unices remove_definitions(-D_UNICODE -DUNICODE) set(CMAKE_POSITION_INDEPENDENT_CODE ON) diff --git a/src/avrdude/avrdude-slic3r.cpp b/src/avrdude/avrdude-slic3r.cpp index b561cd8433..6dbb842265 100644 --- a/src/avrdude/avrdude-slic3r.cpp +++ b/src/avrdude/avrdude-slic3r.cpp @@ -93,11 +93,11 @@ void AvrDude::priv::unset_handlers() int AvrDude::priv::run_one(const std::vector &args) { - std::vector c_args { const_cast(PACKAGE) }; + std::vector c_args { PACKAGE }; std::string command_line { PACKAGE }; for (const auto &arg : args) { - c_args.push_back(const_cast(arg.data())); + c_args.push_back(arg.c_str()); command_line.push_back(' '); command_line.append(arg); } @@ -107,7 +107,7 @@ int AvrDude::priv::run_one(const std::vector &args) { message_fn(command_line.c_str(), (unsigned)command_line.size()); - const auto res = ::avrdude_main(static_cast(c_args.size()), c_args.data()); + const auto res = ::avrdude_main(static_cast(c_args.size()), const_cast(c_args.data())); return res; } diff --git a/src/clipper/CMakeLists.txt b/src/clipper/CMakeLists.txt index 412ab53c7d..8a4e928526 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 b85cf9025e..be4cb4a6a8 100644 --- a/src/clipper/clipper.cpp +++ b/src/clipper/clipper.cpp @@ -48,9 +48,19 @@ #include #include #include -#include #include +// Profiling support using the Shiny intrusive profiler +//#define CLIPPERLIB_PROFILE +#if defined(SLIC3R_PROFILE) && defined(CLIPPERLIB_PROFILE) + #include + #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 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(); 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/CMakeLists.txt b/src/hidapi/CMakeLists.txt new file mode 100644 index 0000000000..f3045466e1 --- /dev/null +++ b/src/hidapi/CMakeLists.txt @@ -0,0 +1,19 @@ + +if (WIN32) + set(HIDAPI_IMPL win/hid.c) +elseif (APPLE) + set(HIDAPI_IMPL mac/hid.c) +else () + # Assume Linux or Unix other than Mac OS + set(HIDAPI_IMPL linux/hid.c) +endif() + +include_directories(include) + +add_library(hidapi STATIC ${HIDAPI_IMPL}) + +if (CMAKE_SYSTEM_NAME STREQUAL "Linux") + # Don't link the udev library, as there are two versions out there (libudev.so.0, libudev.so.1), so they are linked explicitely. +# target_link_libraries(hidapi udev) + target_link_libraries(hidapi dl) +endif() diff --git a/src/hidapi/README.md b/src/hidapi/README.md new file mode 100644 index 0000000000..4f66b3274a --- /dev/null +++ b/src/hidapi/README.md @@ -0,0 +1,5 @@ +** hidapi is a c++ library for communicating with USB and Bluetooth HID devices on Linux, Mac and Windows.** + +For more information go to https://github.com/libusb/hidapi + +THIS DIRECTORY CONTAINS THE hidapi-0.9.0 7da5cc9 SOURCE DISTRIBUTION. diff --git a/src/hidapi/include/hidapi.h b/src/hidapi/include/hidapi.h new file mode 100644 index 0000000000..1819f8de09 --- /dev/null +++ b/src/hidapi/include/hidapi.h @@ -0,0 +1,395 @@ +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 8/22/2009 + + Copyright 2009, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + +/** @file + * @defgroup API hidapi API + */ + +#ifndef HIDAPI_H__ +#define HIDAPI_H__ + +#include + +#ifdef _WIN32 + #define HID_API_EXPORT __declspec(dllexport) + #define HID_API_CALL +#else + #define HID_API_EXPORT /**< API export macro */ + #define HID_API_CALL /**< API call macro */ +#endif + +#define HID_API_EXPORT_CALL HID_API_EXPORT HID_API_CALL /**< API export and call macro*/ + +#ifdef __cplusplus +extern "C" { +#endif + struct hid_device_; + typedef struct hid_device_ hid_device; /**< opaque hidapi structure */ + + /** hidapi info structure */ + struct hid_device_info { + /** Platform-specific device path */ + char *path; + /** Device Vendor ID */ + unsigned short vendor_id; + /** Device Product ID */ + unsigned short product_id; + /** Serial Number */ + wchar_t *serial_number; + /** Device Release Number in binary-coded decimal, + also known as Device Version Number */ + unsigned short release_number; + /** Manufacturer String */ + wchar_t *manufacturer_string; + /** Product string */ + wchar_t *product_string; + /** Usage Page for this Device/Interface + (Windows/Mac only). */ + unsigned short usage_page; + /** Usage for this Device/Interface + (Windows/Mac only).*/ + unsigned short usage; + /** The USB interface which this logical device + represents. + + * Valid on both Linux implementations in all cases. + * Valid on the Windows implementation only if the device + contains more than one interface. + * Valid on the Mac implementation if and only if the device + is a USB HID device. */ + int interface_number; + + /** Pointer to the next device */ + struct hid_device_info *next; + }; + + + /** @brief Initialize the HIDAPI library. + + This function initializes the HIDAPI library. Calling it is not + strictly necessary, as it will be called automatically by + hid_enumerate() and any of the hid_open_*() functions if it is + needed. This function should be called at the beginning of + execution however, if there is a chance of HIDAPI handles + being opened by different threads simultaneously. + + @ingroup API + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_init(void); + + /** @brief Finalize the HIDAPI library. + + This function frees all of the static data associated with + HIDAPI. It should be called at the end of execution to avoid + memory leaks. + + @ingroup API + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_exit(void); + + /** @brief Enumerate the HID Devices. + + This function returns a linked list of all the HID devices + attached to the system which match vendor_id and product_id. + If @p vendor_id is set to 0 then any vendor matches. + If @p product_id is set to 0 then any product matches. + If @p vendor_id and @p product_id are both set to 0, then + all HID devices will be returned. + + @ingroup API + @param vendor_id The Vendor ID (VID) of the types of device + to open. + @param product_id The Product ID (PID) of the types of + device to open. + + @returns + This function returns a pointer to a linked list of type + struct #hid_device_info, containing information about the HID devices + attached to the system, or NULL in the case of failure. Free + this linked list by calling hid_free_enumeration(). + */ + struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id); + + /** @brief Free an enumeration Linked List + + This function frees a linked list created by hid_enumerate(). + + @ingroup API + @param devs Pointer to a list of struct_device returned from + hid_enumerate(). + */ + void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs); + + /** @brief Open a HID device using a Vendor ID (VID), Product ID + (PID) and optionally a serial number. + + If @p serial_number is NULL, the first device with the + specified VID and PID is opened. + + @ingroup API + @param vendor_id The Vendor ID (VID) of the device to open. + @param product_id The Product ID (PID) of the device to open. + @param serial_number The Serial Number of the device to open + (Optionally NULL). + + @returns + This function returns a pointer to a #hid_device object on + success or NULL on failure. + */ + HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); + + /** @brief Open a HID device by its path name. + + The path name be determined by calling hid_enumerate(), or a + platform-specific path name can be used (eg: /dev/hidraw0 on + Linux). + + @ingroup API + @param path The path name of the device to open + + @returns + This function returns a pointer to a #hid_device object on + success or NULL on failure. + */ + HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path); + + /** @brief Write an Output report to a HID device. + + The first byte of @p data[] must contain the Report ID. For + devices which only support a single report, this must be set + to 0x0. The remaining bytes contain the report data. Since + the Report ID is mandatory, calls to hid_write() will always + contain one more byte than the report contains. For example, + if a hid report is 16 bytes long, 17 bytes must be passed to + hid_write(), the Report ID (or 0x0, for devices with a + single report), followed by the report data (16 bytes). In + this example, the length passed in would be 17. + + hid_write() will send the data on the first OUT endpoint, if + one exists. If it does not, it will send the data through + the Control Endpoint (Endpoint 0). + + @ingroup API + @param dev A device handle returned from hid_open(). + @param data The data to send, including the report number as + the first byte. + @param length The length in bytes of the data to send. + + @returns + This function returns the actual number of bytes written and + -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char *data, size_t length); + + /** @brief Read an Input report from a HID device with timeout. + + Input reports are returned + to the host through the INTERRUPT IN endpoint. The first byte will + contain the Report number if the device uses numbered reports. + + @ingroup API + @param dev A device handle returned from hid_open(). + @param data A buffer to put the read data into. + @param length The number of bytes to read. For devices with + multiple reports, make sure to read an extra byte for + the report number. + @param milliseconds timeout in milliseconds or -1 for blocking wait. + + @returns + This function returns the actual number of bytes read and + -1 on error. If no packet was available to be read within + the timeout period, this function returns 0. + */ + int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds); + + /** @brief Read an Input report from a HID device. + + Input reports are returned + to the host through the INTERRUPT IN endpoint. The first byte will + contain the Report number if the device uses numbered reports. + + @ingroup API + @param dev A device handle returned from hid_open(). + @param data A buffer to put the read data into. + @param length The number of bytes to read. For devices with + multiple reports, make sure to read an extra byte for + the report number. + + @returns + This function returns the actual number of bytes read and + -1 on error. If no packet was available to be read and + the handle is in non-blocking mode, this function returns 0. + */ + int HID_API_EXPORT HID_API_CALL hid_read(hid_device *dev, unsigned char *data, size_t length); + + /** @brief Set the device handle to be non-blocking. + + In non-blocking mode calls to hid_read() will return + immediately with a value of 0 if there is no data to be + read. In blocking mode, hid_read() will wait (block) until + there is data to read before returning. + + Nonblocking can be turned on and off at any time. + + @ingroup API + @param dev A device handle returned from hid_open(). + @param nonblock enable or not the nonblocking reads + - 1 to enable nonblocking + - 0 to disable nonblocking. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *dev, int nonblock); + + /** @brief Send a Feature report to the device. + + Feature reports are sent over the Control endpoint as a + Set_Report transfer. The first byte of @p data[] must + contain the Report ID. For devices which only support a + single report, this must be set to 0x0. The remaining bytes + contain the report data. Since the Report ID is mandatory, + calls to hid_send_feature_report() will always contain one + more byte than the report contains. For example, if a hid + report is 16 bytes long, 17 bytes must be passed to + hid_send_feature_report(): the Report ID (or 0x0, for + devices which do not use numbered reports), followed by the + report data (16 bytes). In this example, the length passed + in would be 17. + + @ingroup API + @param dev A device handle returned from hid_open(). + @param data The data to send, including the report number as + the first byte. + @param length The length in bytes of the data to send, including + the report number. + + @returns + This function returns the actual number of bytes written and + -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length); + + /** @brief Get a feature report from a HID device. + + Set the first byte of @p data[] to the Report ID of the + report to be read. Make sure to allow space for this + extra byte in @p data[]. Upon return, the first byte will + still contain the Report ID, and the report data will + start in data[1]. + + @ingroup API + @param dev A device handle returned from hid_open(). + @param data A buffer to put the read data into, including + the Report ID. Set the first byte of @p data[] to the + Report ID of the report to be read, or set it to zero + if your device does not use numbered reports. + @param length The number of bytes to read, including an + extra byte for the report ID. The buffer can be longer + than the actual report. + + @returns + This function returns the number of bytes read plus + one for the report ID (which is still in the first + byte), or -1 on error. + */ + int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length); + + /** @brief Close a HID device. + + @ingroup API + @param dev A device handle returned from hid_open(). + */ + void HID_API_EXPORT HID_API_CALL hid_close(hid_device *dev); + + /** @brief Get The Manufacturer String from a HID device. + + @ingroup API + @param dev A device handle returned from hid_open(). + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen); + + /** @brief Get The Product String from a HID device. + + @ingroup API + @param dev A device handle returned from hid_open(). + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen); + + /** @brief Get The Serial Number String from a HID device. + + @ingroup API + @param dev A device handle returned from hid_open(). + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen); + + /** @brief Get a string from a HID device, based on its string index. + + @ingroup API + @param dev A device handle returned from hid_open(). + @param string_index The index of the string to get. + @param string A wide string buffer to put the data into. + @param maxlen The length of the buffer in multiples of wchar_t. + + @returns + This function returns 0 on success and -1 on error. + */ + int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen); + + /** @brief Get a string describing the last error which occurred. + + @ingroup API + @param dev A device handle returned from hid_open(). + + @returns + This function returns a string containing the last error + which occurred or NULL if none has occurred. + */ + HID_API_EXPORT const wchar_t* HID_API_CALL hid_error(hid_device *dev); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/src/hidapi/linux/hid.c b/src/hidapi/linux/hid.c new file mode 100644 index 0000000000..5f486c0a9d --- /dev/null +++ b/src/hidapi/linux/hid.c @@ -0,0 +1,924 @@ +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 8/22/2009 + Linux Version - 6/2/2009 + + Copyright 2009, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + +/* C */ +#include +#include +#include +#include +#include + +/* Unix */ +#include +#include +#include +#include +#include +#include +#include +#include + +/* Linux */ +#include +#include +#include + +#include "hidapi.h" + +// Declare udev structures needed in this module. They are passed by pointers +// to udev functions and not used directly. +struct udev_device; +struct udev_list_entry; +struct udev_enumerate; +struct udev; + +typedef const char* (*hid_wrapper_udev_device_get_devnode_type)(struct udev_device *udev_device); +typedef struct udev_device* (*hid_wrapper_udev_device_get_parent_with_subsystem_devtype_type)(struct udev_device *udev_device, const char *subsystem, const char *devtype); +typedef const char* (*hid_wrapper_udev_device_get_sysattr_value_type)(struct udev_device *udev_device, const char *sysattr); +typedef struct udev_device* (*hid_wrapper_udev_device_new_from_devnum_type)(struct udev *udev, char type, dev_t devnum); +typedef struct udev_device* (*hid_wrapper_udev_device_new_from_syspath_type)(struct udev *udev, const char *syspath); +typedef struct udev_device* (*hid_wrapper_udev_device_unref_type)(struct udev_device *udev_device); +typedef int (*hid_wrapper_udev_enumerate_add_match_subsystem_type)(struct udev_enumerate *udev_enumerate, const char *subsystem); +typedef struct udev_list_entry* (*hid_wrapper_udev_enumerate_get_list_entry_type)(struct udev_enumerate *udev_enumerate); +typedef struct udev_enumerate* (*hid_wrapper_udev_enumerate_new_type)(struct udev *udev); +typedef int (*hid_wrapper_udev_enumerate_scan_devices_type)(struct udev_enumerate *udev_enumerate); +typedef struct udev_enumerate* (*hid_wrapper_udev_enumerate_unref_type)(struct udev_enumerate *udev_enumerate); +typedef const char* (*hid_wrapper_udev_list_entry_get_name_type)(struct udev_list_entry *list_entry); +typedef struct udev_list_entry* (*hid_wrapper_udev_list_entry_get_next_type)(struct udev_list_entry *list_entry); +typedef struct udev* (*hid_wrapper_udev_new_type)(void); +typedef struct udev* (*hid_wrapper_udev_unref_type)(struct udev *udev); + +void *hid_wrapper_handle = NULL; +static hid_wrapper_udev_device_get_devnode_type hid_wrapper_udev_device_get_devnode = NULL; +static hid_wrapper_udev_device_get_parent_with_subsystem_devtype_type hid_wrapper_udev_device_get_parent_with_subsystem_devtype = NULL; +static hid_wrapper_udev_device_get_sysattr_value_type hid_wrapper_udev_device_get_sysattr_value = NULL; +static hid_wrapper_udev_device_new_from_devnum_type hid_wrapper_udev_device_new_from_devnum = NULL; +static hid_wrapper_udev_device_new_from_syspath_type hid_wrapper_udev_device_new_from_syspath = NULL; +static hid_wrapper_udev_device_unref_type hid_wrapper_udev_device_unref = NULL; +static hid_wrapper_udev_enumerate_add_match_subsystem_type hid_wrapper_udev_enumerate_add_match_subsystem = NULL; +static hid_wrapper_udev_enumerate_get_list_entry_type hid_wrapper_udev_enumerate_get_list_entry = NULL; +static hid_wrapper_udev_enumerate_new_type hid_wrapper_udev_enumerate_new = NULL; +static hid_wrapper_udev_enumerate_scan_devices_type hid_wrapper_udev_enumerate_scan_devices = NULL; +static hid_wrapper_udev_enumerate_unref_type hid_wrapper_udev_enumerate_unref = NULL; +static hid_wrapper_udev_list_entry_get_name_type hid_wrapper_udev_list_entry_get_name = NULL; +static hid_wrapper_udev_list_entry_get_next_type hid_wrapper_udev_list_entry_get_next = NULL; +static hid_wrapper_udev_new_type hid_wrapper_udev_new = NULL; +static hid_wrapper_udev_unref_type hid_wrapper_udev_unref = NULL; + +static void hid_wrapper_udev_close() +{ + if (hid_wrapper_handle) + dlclose(hid_wrapper_handle); + hid_wrapper_handle = NULL; + hid_wrapper_udev_device_get_devnode = NULL; + hid_wrapper_udev_device_get_parent_with_subsystem_devtype = NULL; + hid_wrapper_udev_device_get_sysattr_value = NULL; + hid_wrapper_udev_device_new_from_devnum = NULL; + hid_wrapper_udev_device_new_from_syspath = NULL; + hid_wrapper_udev_device_unref = NULL; + hid_wrapper_udev_enumerate_add_match_subsystem = NULL; + hid_wrapper_udev_enumerate_get_list_entry = NULL; + hid_wrapper_udev_enumerate_new = NULL; + hid_wrapper_udev_enumerate_scan_devices = NULL; + hid_wrapper_udev_enumerate_unref = NULL; + hid_wrapper_udev_list_entry_get_name = NULL; + hid_wrapper_udev_list_entry_get_next = NULL; + hid_wrapper_udev_new = NULL; + hid_wrapper_udev_unref = NULL; +} + +static const char *hid_wrapper_libudev_paths[] = { + "libudev.so.1", "libudev.so.0" +}; + +static int hid_wrapper_udev_init() +{ + int i; + + hid_wrapper_udev_close(); + + // Search for the libudev0 or libudev1 library. + for (i = 0; i < sizeof(hid_wrapper_libudev_paths) / sizeof(hid_wrapper_libudev_paths[0]); ++ i) + if ((hid_wrapper_handle = dlopen(hid_wrapper_libudev_paths[i], RTLD_NOW | RTLD_GLOBAL)) != NULL) + break; + + if (hid_wrapper_handle == NULL) { + // Error, close the shared library handle and finish. + hid_wrapper_udev_close(); + return -1; + } + + // Resolve the functions. + hid_wrapper_udev_device_get_devnode = (hid_wrapper_udev_device_get_devnode_type) dlsym(hid_wrapper_handle, "udev_device_get_devnode"); + hid_wrapper_udev_device_get_parent_with_subsystem_devtype = (hid_wrapper_udev_device_get_parent_with_subsystem_devtype_type) dlsym(hid_wrapper_handle, "udev_device_get_parent_with_subsystem_devtype"); + hid_wrapper_udev_device_get_sysattr_value = (hid_wrapper_udev_device_get_sysattr_value_type) dlsym(hid_wrapper_handle, "udev_device_get_sysattr_value"); + hid_wrapper_udev_device_new_from_devnum = (hid_wrapper_udev_device_new_from_devnum_type) dlsym(hid_wrapper_handle, "udev_device_new_from_devnum"); + hid_wrapper_udev_device_new_from_syspath = (hid_wrapper_udev_device_new_from_syspath_type) dlsym(hid_wrapper_handle, "udev_device_new_from_syspath"); + hid_wrapper_udev_device_unref = (hid_wrapper_udev_device_unref_type) dlsym(hid_wrapper_handle, "udev_device_unref"); + hid_wrapper_udev_enumerate_add_match_subsystem = (hid_wrapper_udev_enumerate_add_match_subsystem_type) dlsym(hid_wrapper_handle, "udev_enumerate_add_match_subsystem"); + hid_wrapper_udev_enumerate_get_list_entry = (hid_wrapper_udev_enumerate_get_list_entry_type) dlsym(hid_wrapper_handle, "udev_enumerate_get_list_entry"); + hid_wrapper_udev_enumerate_new = (hid_wrapper_udev_enumerate_new_type) dlsym(hid_wrapper_handle, "udev_enumerate_new"); + hid_wrapper_udev_enumerate_scan_devices = (hid_wrapper_udev_enumerate_scan_devices_type) dlsym(hid_wrapper_handle, "udev_enumerate_scan_devices"); + hid_wrapper_udev_enumerate_unref = (hid_wrapper_udev_enumerate_unref_type) dlsym(hid_wrapper_handle, "udev_enumerate_unref"); + hid_wrapper_udev_list_entry_get_name = (hid_wrapper_udev_list_entry_get_name_type) dlsym(hid_wrapper_handle, "udev_list_entry_get_name"); + hid_wrapper_udev_list_entry_get_next = (hid_wrapper_udev_list_entry_get_next_type) dlsym(hid_wrapper_handle, "udev_list_entry_get_next"); + hid_wrapper_udev_new = (hid_wrapper_udev_new_type) dlsym(hid_wrapper_handle, "udev_new"); + hid_wrapper_udev_unref = (hid_wrapper_udev_unref_type) dlsym(hid_wrapper_handle, "udev_unref"); + + // Were all the funcions resolved? + if (hid_wrapper_handle == NULL || + hid_wrapper_udev_device_get_devnode == NULL || + hid_wrapper_udev_device_get_parent_with_subsystem_devtype == NULL || + hid_wrapper_udev_device_get_sysattr_value == NULL || + hid_wrapper_udev_device_new_from_devnum == NULL || + hid_wrapper_udev_device_new_from_syspath == NULL || + hid_wrapper_udev_device_unref == NULL || + hid_wrapper_udev_enumerate_add_match_subsystem == NULL || + hid_wrapper_udev_enumerate_get_list_entry == NULL || + hid_wrapper_udev_enumerate_new == NULL || + hid_wrapper_udev_enumerate_scan_devices == NULL || + hid_wrapper_udev_enumerate_unref == NULL || + hid_wrapper_udev_list_entry_get_name == NULL || + hid_wrapper_udev_list_entry_get_next == NULL || + hid_wrapper_udev_new == NULL || + hid_wrapper_udev_unref == NULL) + { + // Error, close the shared library handle and finish. + hid_wrapper_udev_close(); + return -2; + } + + // Success. + return 0; +} + +/* Definitions from linux/hidraw.h. Since these are new, some distros + may not have header files which contain them. */ +#ifndef HIDIOCSFEATURE +#define HIDIOCSFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len) +#endif +#ifndef HIDIOCGFEATURE +#define HIDIOCGFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len) +#endif + + +/* USB HID device property names */ +const char *device_string_names[] = { + "manufacturer", + "product", + "serial", +}; + +/* Symbolic names for the properties above */ +enum device_string_id { + DEVICE_STRING_MANUFACTURER, + DEVICE_STRING_PRODUCT, + DEVICE_STRING_SERIAL, + + DEVICE_STRING_COUNT, +}; + +struct hid_device_ { + int device_handle; + int blocking; + int uses_numbered_reports; +}; + + +static __u32 kernel_version = 0; + +static __u32 detect_kernel_version(void) +{ + struct utsname name; + int major, minor, release; + int ret; + + uname(&name); + ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release); + if (ret == 3) { + return KERNEL_VERSION(major, minor, release); + } + + ret = sscanf(name.release, "%d.%d", &major, &minor); + if (ret == 2) { + return KERNEL_VERSION(major, minor, 0); + } + + printf("Couldn't determine kernel version from version string \"%s\"\n", name.release); + return 0; +} + +static hid_device *new_hid_device(void) +{ + hid_device *dev = calloc(1, sizeof(hid_device)); + dev->device_handle = -1; + dev->blocking = 1; + dev->uses_numbered_reports = 0; + + return dev; +} + + +/* The caller must free the returned string with free(). */ +static wchar_t *utf8_to_wchar_t(const char *utf8) +{ + wchar_t *ret = NULL; + + if (utf8) { + size_t wlen = mbstowcs(NULL, utf8, 0); + if ((size_t) -1 == wlen) { + return wcsdup(L""); + } + ret = calloc(wlen+1, sizeof(wchar_t)); + mbstowcs(ret, utf8, wlen+1); + ret[wlen] = 0x0000; + } + + return ret; +} + +/* Get an attribute value from a udev_device and return it as a whar_t + string. The returned string must be freed with free() when done.*/ +static wchar_t *copy_udev_string(struct udev_device *dev, const char *udev_name) +{ + return utf8_to_wchar_t(hid_wrapper_udev_device_get_sysattr_value(dev, udev_name)); +} + +/* uses_numbered_reports() returns 1 if report_descriptor describes a device + which contains numbered reports. */ +static int uses_numbered_reports(__u8 *report_descriptor, __u32 size) { + unsigned int i = 0; + int size_code; + int data_len, key_size; + + while (i < size) { + int key = report_descriptor[i]; + + /* Check for the Report ID key */ + if (key == 0x85/*Report ID*/) { + /* This device has a Report ID, which means it uses + numbered reports. */ + return 1; + } + + //printf("key: %02hhx\n", key); + + if ((key & 0xf0) == 0xf0) { + /* This is a Long Item. The next byte contains the + length of the data section (value) for this key. + See the HID specification, version 1.11, section + 6.2.2.3, titled "Long Items." */ + if (i+1 < size) + data_len = report_descriptor[i+1]; + else + data_len = 0; /* malformed report */ + key_size = 3; + } + else { + /* This is a Short Item. The bottom two bits of the + key contain the size code for the data section + (value) for this key. Refer to the HID + specification, version 1.11, section 6.2.2.2, + titled "Short Items." */ + size_code = key & 0x3; + switch (size_code) { + case 0: + case 1: + case 2: + data_len = size_code; + break; + case 3: + data_len = 4; + break; + default: + /* Can't ever happen since size_code is & 0x3 */ + data_len = 0; + break; + }; + key_size = 1; + } + + /* Skip over this key and it's associated data */ + i += data_len + key_size; + } + + /* Didn't find a Report ID key. Device doesn't use numbered reports. */ + return 0; +} + +/* + * The caller is responsible for free()ing the (newly-allocated) character + * strings pointed to by serial_number_utf8 and product_name_utf8 after use. + */ +static int +parse_uevent_info(const char *uevent, int *bus_type, + unsigned short *vendor_id, unsigned short *product_id, + char **serial_number_utf8, char **product_name_utf8) +{ + char *tmp = strdup(uevent); + char *saveptr = NULL; + char *line; + char *key; + char *value; + + int found_id = 0; + int found_serial = 0; + int found_name = 0; + + line = strtok_r(tmp, "\n", &saveptr); + while (line != NULL) { + /* line: "KEY=value" */ + key = line; + value = strchr(line, '='); + if (!value) { + goto next_line; + } + *value = '\0'; + value++; + + if (strcmp(key, "HID_ID") == 0) { + /** + * type vendor product + * HID_ID=0003:000005AC:00008242 + **/ + int ret = sscanf(value, "%x:%hx:%hx", bus_type, vendor_id, product_id); + if (ret == 3) { + found_id = 1; + } + } else if (strcmp(key, "HID_NAME") == 0) { + /* The caller has to free the product name */ + *product_name_utf8 = strdup(value); + found_name = 1; + } else if (strcmp(key, "HID_UNIQ") == 0) { + /* The caller has to free the serial number */ + *serial_number_utf8 = strdup(value); + found_serial = 1; + } + +next_line: + line = strtok_r(NULL, "\n", &saveptr); + } + + free(tmp); + return (found_id && found_name && found_serial); +} + + +static int get_device_string(hid_device *dev, enum device_string_id key, wchar_t *string, size_t maxlen) +{ + struct udev *udev; + struct udev_device *udev_dev, *parent, *hid_dev; + struct stat s; + int ret = -1; + char *serial_number_utf8 = NULL; + char *product_name_utf8 = NULL; + + /* Create the udev object */ + udev = hid_wrapper_udev_new(); + if (!udev) { + printf("Can't create udev\n"); + return -1; + } + + /* Get the dev_t (major/minor numbers) from the file handle. */ + ret = fstat(dev->device_handle, &s); + if (-1 == ret) + return ret; + /* Open a udev device from the dev_t. 'c' means character device. */ + udev_dev = hid_wrapper_udev_device_new_from_devnum(udev, 'c', s.st_rdev); + if (udev_dev) { + hid_dev = hid_wrapper_udev_device_get_parent_with_subsystem_devtype( + udev_dev, + "hid", + NULL); + if (hid_dev) { + unsigned short dev_vid; + unsigned short dev_pid; + int bus_type; + size_t retm; + + ret = parse_uevent_info( + hid_wrapper_udev_device_get_sysattr_value(hid_dev, "uevent"), + &bus_type, + &dev_vid, + &dev_pid, + &serial_number_utf8, + &product_name_utf8); + + if (bus_type == BUS_BLUETOOTH) { + switch (key) { + case DEVICE_STRING_MANUFACTURER: + wcsncpy(string, L"", maxlen); + ret = 0; + break; + case DEVICE_STRING_PRODUCT: + retm = mbstowcs(string, product_name_utf8, maxlen); + ret = (retm == (size_t)-1)? -1: 0; + break; + case DEVICE_STRING_SERIAL: + retm = mbstowcs(string, serial_number_utf8, maxlen); + ret = (retm == (size_t)-1)? -1: 0; + break; + case DEVICE_STRING_COUNT: + default: + ret = -1; + break; + } + } + else { + /* This is a USB device. Find its parent USB Device node. */ + parent = hid_wrapper_udev_device_get_parent_with_subsystem_devtype( + udev_dev, + "usb", + "usb_device"); + if (parent) { + const char *str; + const char *key_str = NULL; + + if (key >= 0 && key < DEVICE_STRING_COUNT) { + key_str = device_string_names[key]; + } else { + ret = -1; + goto end; + } + + str = hid_wrapper_udev_device_get_sysattr_value(parent, key_str); + if (str) { + /* Convert the string from UTF-8 to wchar_t */ + retm = mbstowcs(string, str, maxlen); + ret = (retm == (size_t)-1)? -1: 0; + goto end; + } + } + } + } + } + +end: + free(serial_number_utf8); + free(product_name_utf8); + + hid_wrapper_udev_device_unref(udev_dev); + /* parent and hid_dev don't need to be (and can't be) unref'd. + I'm not sure why, but they'll throw double-free() errors. */ + hid_wrapper_udev_unref(udev); + + return ret; +} + +int HID_API_EXPORT hid_init(void) +{ + const char *locale; + + /* Set the locale if it's not set. */ + locale = setlocale(LC_CTYPE, NULL); + if (!locale) + setlocale(LC_CTYPE, ""); + + kernel_version = detect_kernel_version(); + + return hid_wrapper_udev_init(); +} + +int HID_API_EXPORT hid_exit(void) +{ + /* Nothing to do for this in the Linux/hidraw implementation. */ + hid_wrapper_udev_close(); + return 0; +} + +struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) +{ + struct udev *udev; + struct udev_enumerate *enumerate; + struct udev_list_entry *devices, *dev_list_entry; + + struct hid_device_info *root = NULL; /* return object */ + struct hid_device_info *cur_dev = NULL; + struct hid_device_info *prev_dev = NULL; /* previous device */ + + hid_init(); + + /* Create the udev object */ + udev = hid_wrapper_udev_new(); + if (!udev) { + printf("Can't create udev\n"); + return NULL; + } + + /* Create a list of the devices in the 'hidraw' subsystem. */ + enumerate = hid_wrapper_udev_enumerate_new(udev); + hid_wrapper_udev_enumerate_add_match_subsystem(enumerate, "hidraw"); + hid_wrapper_udev_enumerate_scan_devices(enumerate); + devices = hid_wrapper_udev_enumerate_get_list_entry(enumerate); + /* For each item, see if it matches the vid/pid, and if so + create a udev_device record for it */ + for (dev_list_entry = devices; dev_list_entry; dev_list_entry = hid_wrapper_udev_list_entry_get_next(dev_list_entry)) { + const char *sysfs_path; + const char *dev_path; + const char *str; + struct udev_device *raw_dev; /* The device's hidraw udev node. */ + struct udev_device *hid_dev; /* The device's HID udev node. */ + struct udev_device *usb_dev; /* The device's USB udev node. */ + struct udev_device *intf_dev; /* The device's interface (in the USB sense). */ + unsigned short dev_vid; + unsigned short dev_pid; + char *serial_number_utf8 = NULL; + char *product_name_utf8 = NULL; + int bus_type; + int result; + + /* Get the filename of the /sys entry for the device + and create a udev_device object (dev) representing it */ + sysfs_path = hid_wrapper_udev_list_entry_get_name(dev_list_entry); + raw_dev = hid_wrapper_udev_device_new_from_syspath(udev, sysfs_path); + dev_path = hid_wrapper_udev_device_get_devnode(raw_dev); + + hid_dev = hid_wrapper_udev_device_get_parent_with_subsystem_devtype( + raw_dev, + "hid", + NULL); + + if (!hid_dev) { + /* Unable to find parent hid device. */ + goto next; + } + + result = parse_uevent_info( + hid_wrapper_udev_device_get_sysattr_value(hid_dev, "uevent"), + &bus_type, + &dev_vid, + &dev_pid, + &serial_number_utf8, + &product_name_utf8); + + if (!result) { + /* parse_uevent_info() failed for at least one field. */ + goto next; + } + + if (bus_type != BUS_USB && bus_type != BUS_BLUETOOTH) { + /* We only know how to handle USB and BT devices. */ + goto next; + } + + /* Check the VID/PID against the arguments */ + if ((vendor_id == 0x0 || vendor_id == dev_vid) && + (product_id == 0x0 || product_id == dev_pid)) { + struct hid_device_info *tmp; + + /* VID/PID match. Create the record. */ + tmp = malloc(sizeof(struct hid_device_info)); + if (cur_dev) { + cur_dev->next = tmp; + } + else { + root = tmp; + } + prev_dev = cur_dev; + cur_dev = tmp; + + /* Fill out the record */ + cur_dev->next = NULL; + cur_dev->path = dev_path? strdup(dev_path): NULL; + + /* VID/PID */ + cur_dev->vendor_id = dev_vid; + cur_dev->product_id = dev_pid; + + /* Serial Number */ + cur_dev->serial_number = utf8_to_wchar_t(serial_number_utf8); + + /* Release Number */ + cur_dev->release_number = 0x0; + + /* Interface Number */ + cur_dev->interface_number = -1; + + switch (bus_type) { + case BUS_USB: + /* The device pointed to by raw_dev contains information about + the hidraw device. In order to get information about the + USB device, get the parent device with the + subsystem/devtype pair of "usb"/"usb_device". This will + be several levels up the tree, but the function will find + it. */ + usb_dev = hid_wrapper_udev_device_get_parent_with_subsystem_devtype( + raw_dev, + "usb", + "usb_device"); + + if (!usb_dev) { + /* Free this device */ + free(cur_dev->serial_number); + free(cur_dev->path); + free(cur_dev); + + /* Take it off the device list. */ + if (prev_dev) { + prev_dev->next = NULL; + cur_dev = prev_dev; + } + else { + cur_dev = root = NULL; + } + + goto next; + } + + /* Manufacturer and Product strings */ + cur_dev->manufacturer_string = copy_udev_string(usb_dev, device_string_names[DEVICE_STRING_MANUFACTURER]); + cur_dev->product_string = copy_udev_string(usb_dev, device_string_names[DEVICE_STRING_PRODUCT]); + + /* Release Number */ + str = hid_wrapper_udev_device_get_sysattr_value(usb_dev, "bcdDevice"); + cur_dev->release_number = (str)? strtol(str, NULL, 16): 0x0; + + /* Get a handle to the interface's udev node. */ + intf_dev = hid_wrapper_udev_device_get_parent_with_subsystem_devtype( + raw_dev, + "usb", + "usb_interface"); + if (intf_dev) { + str = hid_wrapper_udev_device_get_sysattr_value(intf_dev, "bInterfaceNumber"); + cur_dev->interface_number = (str)? strtol(str, NULL, 16): -1; + } + + break; + + case BUS_BLUETOOTH: + /* Manufacturer and Product strings */ + cur_dev->manufacturer_string = wcsdup(L""); + cur_dev->product_string = utf8_to_wchar_t(product_name_utf8); + + break; + + default: + /* Unknown device type - this should never happen, as we + * check for USB and Bluetooth devices above */ + break; + } + } + + next: + free(serial_number_utf8); + free(product_name_utf8); + hid_wrapper_udev_device_unref(raw_dev); + /* hid_dev, usb_dev and intf_dev don't need to be (and can't be) + unref()d. It will cause a double-free() error. I'm not + sure why. */ + } + /* Free the enumerator and udev objects. */ + hid_wrapper_udev_enumerate_unref(enumerate); + hid_wrapper_udev_unref(udev); + + return root; +} + +void HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs) +{ + struct hid_device_info *d = devs; + while (d) { + struct hid_device_info *next = d->next; + free(d->path); + free(d->serial_number); + free(d->manufacturer_string); + free(d->product_string); + free(d); + d = next; + } +} + +hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) +{ + struct hid_device_info *devs, *cur_dev; + const char *path_to_open = NULL; + hid_device *handle = NULL; + + devs = hid_enumerate(vendor_id, product_id); + cur_dev = devs; + while (cur_dev) { + if (cur_dev->vendor_id == vendor_id && + cur_dev->product_id == product_id) { + if (serial_number) { + if (wcscmp(serial_number, cur_dev->serial_number) == 0) { + path_to_open = cur_dev->path; + break; + } + } + else { + path_to_open = cur_dev->path; + break; + } + } + cur_dev = cur_dev->next; + } + + if (path_to_open) { + /* Open the device */ + handle = hid_open_path(path_to_open); + } + + hid_free_enumeration(devs); + + return handle; +} + +hid_device * HID_API_EXPORT hid_open_path(const char *path) +{ + hid_device *dev = NULL; + + hid_init(); + + dev = new_hid_device(); + + /* OPEN HERE */ + dev->device_handle = open(path, O_RDWR); + + /* If we have a good handle, return it. */ + if (dev->device_handle > 0) { + + /* Get the report descriptor */ + int res, desc_size = 0; + struct hidraw_report_descriptor rpt_desc; + + memset(&rpt_desc, 0x0, sizeof(rpt_desc)); + + /* Get Report Descriptor Size */ + res = ioctl(dev->device_handle, HIDIOCGRDESCSIZE, &desc_size); + if (res < 0) + perror("HIDIOCGRDESCSIZE"); + + + /* Get Report Descriptor */ + rpt_desc.size = desc_size; + res = ioctl(dev->device_handle, HIDIOCGRDESC, &rpt_desc); + if (res < 0) { + perror("HIDIOCGRDESC"); + } else { + /* Determine if this device uses numbered reports. */ + dev->uses_numbered_reports = + uses_numbered_reports(rpt_desc.value, + rpt_desc.size); + } + + return dev; + } + else { + /* Unable to open any devices. */ + free(dev); + return NULL; + } +} + + +int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length) +{ + int bytes_written; + + bytes_written = write(dev->device_handle, data, length); + + return bytes_written; +} + + +int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) +{ + int bytes_read; + + if (milliseconds >= 0) { + /* Milliseconds is either 0 (non-blocking) or > 0 (contains + a valid timeout). In both cases we want to call poll() + and wait for data to arrive. Don't rely on non-blocking + operation (O_NONBLOCK) since some kernels don't seem to + properly report device disconnection through read() when + in non-blocking mode. */ + int ret; + struct pollfd fds; + + fds.fd = dev->device_handle; + fds.events = POLLIN; + fds.revents = 0; + ret = poll(&fds, 1, milliseconds); + if (ret == -1 || ret == 0) { + /* Error or timeout */ + return ret; + } + else { + /* Check for errors on the file descriptor. This will + indicate a device disconnection. */ + if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) + return -1; + } + } + + bytes_read = read(dev->device_handle, data, length); + if (bytes_read < 0 && (errno == EAGAIN || errno == EINPROGRESS)) + bytes_read = 0; + + if (bytes_read >= 0 && + kernel_version != 0 && + kernel_version < KERNEL_VERSION(2,6,34) && + dev->uses_numbered_reports) { + /* Work around a kernel bug. Chop off the first byte. */ + memmove(data, data+1, bytes_read); + bytes_read--; + } + + return bytes_read; +} + +int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); +} + +int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) +{ + /* Do all non-blocking in userspace using poll(), since it looks + like there's a bug in the kernel in some versions where + read() will not return -1 on disconnection of the USB device */ + + dev->blocking = !nonblock; + return 0; /* Success */ +} + + +int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) +{ + int res; + + res = ioctl(dev->device_handle, HIDIOCSFEATURE(length), data); + if (res < 0) + perror("ioctl (SFEATURE)"); + + return res; +} + +int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) +{ + int res; + + res = ioctl(dev->device_handle, HIDIOCGFEATURE(length), data); + if (res < 0) + perror("ioctl (GFEATURE)"); + + + return res; +} + + +void HID_API_EXPORT hid_close(hid_device *dev) +{ + if (!dev) + return; + close(dev->device_handle); + free(dev); +} + + +int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_device_string(dev, DEVICE_STRING_MANUFACTURER, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_device_string(dev, DEVICE_STRING_PRODUCT, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_device_string(dev, DEVICE_STRING_SERIAL, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) +{ + return -1; +} + + +HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) +{ + return NULL; +} diff --git a/src/hidapi/mac/hid.c b/src/hidapi/mac/hid.c new file mode 100644 index 0000000000..ca10a9ccaa --- /dev/null +++ b/src/hidapi/mac/hid.c @@ -0,0 +1,1121 @@ +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 2010-07-03 + + Copyright 2010, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + +/* See Apple Technical Note TN2187 for details on IOHidManager. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hidapi.h" + +/* Barrier implementation because Mac OSX doesn't have pthread_barrier. + It also doesn't have clock_gettime(). So much for POSIX and SUSv2. + This implementation came from Brent Priddy and was posted on + StackOverflow. It is used with his permission. */ +typedef int pthread_barrierattr_t; +typedef struct pthread_barrier { + pthread_mutex_t mutex; + pthread_cond_t cond; + int count; + int trip_count; +} pthread_barrier_t; + +static int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) +{ + if(count == 0) { + errno = EINVAL; + return -1; + } + + if(pthread_mutex_init(&barrier->mutex, 0) < 0) { + return -1; + } + if(pthread_cond_init(&barrier->cond, 0) < 0) { + pthread_mutex_destroy(&barrier->mutex); + return -1; + } + barrier->trip_count = count; + barrier->count = 0; + + return 0; +} + +static int pthread_barrier_destroy(pthread_barrier_t *barrier) +{ + pthread_cond_destroy(&barrier->cond); + pthread_mutex_destroy(&barrier->mutex); + return 0; +} + +static int pthread_barrier_wait(pthread_barrier_t *barrier) +{ + pthread_mutex_lock(&barrier->mutex); + ++(barrier->count); + if(barrier->count >= barrier->trip_count) + { + barrier->count = 0; + pthread_cond_broadcast(&barrier->cond); + pthread_mutex_unlock(&barrier->mutex); + return 1; + } + else + { + pthread_cond_wait(&barrier->cond, &(barrier->mutex)); + pthread_mutex_unlock(&barrier->mutex); + return 0; + } +} + +static int return_data(hid_device *dev, unsigned char *data, size_t length); + +/* Linked List of input reports received from the device. */ +struct input_report { + uint8_t *data; + size_t len; + struct input_report *next; +}; + +struct hid_device_ { + IOHIDDeviceRef device_handle; + int blocking; + int uses_numbered_reports; + int disconnected; + CFStringRef run_loop_mode; + CFRunLoopRef run_loop; + CFRunLoopSourceRef source; + uint8_t *input_report_buf; + CFIndex max_input_report_len; + struct input_report *input_reports; + + pthread_t thread; + pthread_mutex_t mutex; /* Protects input_reports */ + pthread_cond_t condition; + pthread_barrier_t barrier; /* Ensures correct startup sequence */ + pthread_barrier_t shutdown_barrier; /* Ensures correct shutdown sequence */ + int shutdown_thread; +}; + +static hid_device *new_hid_device(void) +{ + hid_device *dev = calloc(1, sizeof(hid_device)); + dev->device_handle = NULL; + dev->blocking = 1; + dev->uses_numbered_reports = 0; + dev->disconnected = 0; + dev->run_loop_mode = NULL; + dev->run_loop = NULL; + dev->source = NULL; + dev->input_report_buf = NULL; + dev->input_reports = NULL; + dev->shutdown_thread = 0; + + /* Thread objects */ + pthread_mutex_init(&dev->mutex, NULL); + pthread_cond_init(&dev->condition, NULL); + pthread_barrier_init(&dev->barrier, NULL, 2); + pthread_barrier_init(&dev->shutdown_barrier, NULL, 2); + + return dev; +} + +static void free_hid_device(hid_device *dev) +{ + if (!dev) + return; + + /* Delete any input reports still left over. */ + struct input_report *rpt = dev->input_reports; + while (rpt) { + struct input_report *next = rpt->next; + free(rpt->data); + free(rpt); + rpt = next; + } + + /* Free the string and the report buffer. The check for NULL + is necessary here as CFRelease() doesn't handle NULL like + free() and others do. */ + if (dev->run_loop_mode) + CFRelease(dev->run_loop_mode); + if (dev->source) + CFRelease(dev->source); + free(dev->input_report_buf); + + /* Clean up the thread objects */ + pthread_barrier_destroy(&dev->shutdown_barrier); + pthread_barrier_destroy(&dev->barrier); + pthread_cond_destroy(&dev->condition); + pthread_mutex_destroy(&dev->mutex); + + /* Free the structure itself. */ + free(dev); +} + +static IOHIDManagerRef hid_mgr = 0x0; + + +#if 0 +static void register_error(hid_device *dev, const char *op) +{ + +} +#endif + + +static int32_t get_int_property(IOHIDDeviceRef device, CFStringRef key) +{ + CFTypeRef ref; + int32_t value; + + ref = IOHIDDeviceGetProperty(device, key); + if (ref) { + if (CFGetTypeID(ref) == CFNumberGetTypeID()) { + CFNumberGetValue((CFNumberRef) ref, kCFNumberSInt32Type, &value); + return value; + } + } + return 0; +} + +static unsigned short get_vendor_id(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDVendorIDKey)); +} + +static unsigned short get_product_id(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDProductIDKey)); +} + +static int32_t get_max_report_length(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDMaxInputReportSizeKey)); +} + +static int get_string_property(IOHIDDeviceRef device, CFStringRef prop, wchar_t *buf, size_t len) +{ + CFStringRef str; + + if (!len) + return 0; + + str = IOHIDDeviceGetProperty(device, prop); + + buf[0] = 0; + + if (str) { + CFIndex str_len = CFStringGetLength(str); + CFRange range; + CFIndex used_buf_len; + CFIndex chars_copied; + + len --; + + range.location = 0; + range.length = ((size_t)str_len > len)? len: (size_t)str_len; + chars_copied = CFStringGetBytes(str, + range, + kCFStringEncodingUTF32LE, + (char)'?', + FALSE, + (UInt8*)buf, + len * sizeof(wchar_t), + &used_buf_len); + + if (chars_copied == len) + buf[len] = 0; /* len is decremented above */ + else + buf[chars_copied] = 0; + + return 0; + } + else + return -1; + +} + +static int get_serial_number(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDSerialNumberKey), buf, len); +} + +static int get_manufacturer_string(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDManufacturerKey), buf, len); +} + +static int get_product_string(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDProductKey), buf, len); +} + + +/* Implementation of wcsdup() for Mac. */ +static wchar_t *dup_wcs(const wchar_t *s) +{ + size_t len = wcslen(s); + wchar_t *ret = malloc((len+1)*sizeof(wchar_t)); + wcscpy(ret, s); + + return ret; +} + +/* hidapi_IOHIDDeviceGetService() + * + * Return the io_service_t corresponding to a given IOHIDDeviceRef, either by: + * - on OS X 10.6 and above, calling IOHIDDeviceGetService() + * - on OS X 10.5, extract it from the IOHIDDevice struct + */ +static io_service_t hidapi_IOHIDDeviceGetService(IOHIDDeviceRef device) +{ + static void *iokit_framework = NULL; + static io_service_t (*dynamic_IOHIDDeviceGetService)(IOHIDDeviceRef device) = NULL; + + /* Use dlopen()/dlsym() to get a pointer to IOHIDDeviceGetService() if it exists. + * If any of these steps fail, dynamic_IOHIDDeviceGetService will be left NULL + * and the fallback method will be used. + */ + if (iokit_framework == NULL) { + iokit_framework = dlopen("/System/Library/IOKit.framework/IOKit", RTLD_LAZY); + + if (iokit_framework != NULL) + dynamic_IOHIDDeviceGetService = dlsym(iokit_framework, "IOHIDDeviceGetService"); + } + + if (dynamic_IOHIDDeviceGetService != NULL) { + /* Running on OS X 10.6 and above: IOHIDDeviceGetService() exists */ + return dynamic_IOHIDDeviceGetService(device); + } + else + { + /* Running on OS X 10.5: IOHIDDeviceGetService() doesn't exist. + * + * Be naughty and pull the service out of the IOHIDDevice. + * IOHIDDevice is an opaque struct not exposed to applications, but its + * layout is stable through all available versions of OS X. + * Tested and working on OS X 10.5.8 i386, x86_64, and ppc. + */ + struct IOHIDDevice_internal { + /* The first field of the IOHIDDevice struct is a + * CFRuntimeBase (which is a private CF struct). + * + * a, b, and c are the 3 fields that make up a CFRuntimeBase. + * See http://opensource.apple.com/source/CF/CF-476.18/CFRuntime.h + * + * The second field of the IOHIDDevice is the io_service_t we're looking for. + */ + uintptr_t a; + uint8_t b[4]; +#if __LP64__ + uint32_t c; +#endif + io_service_t service; + }; + struct IOHIDDevice_internal *tmp = (struct IOHIDDevice_internal *)device; + + return tmp->service; + } +} + +/* Initialize the IOHIDManager. Return 0 for success and -1 for failure. */ +static int init_hid_manager(void) +{ + /* Initialize all the HID Manager Objects */ + hid_mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); + if (hid_mgr) { + IOHIDManagerSetDeviceMatching(hid_mgr, NULL); + IOHIDManagerScheduleWithRunLoop(hid_mgr, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + return 0; + } + + return -1; +} + +/* Initialize the IOHIDManager if necessary. This is the public function, and + it is safe to call this function repeatedly. Return 0 for success and -1 + for failure. */ +int HID_API_EXPORT hid_init(void) +{ + if (!hid_mgr) { + return init_hid_manager(); + } + + /* Already initialized. */ + return 0; +} + +int HID_API_EXPORT hid_exit(void) +{ + if (hid_mgr) { + /* Close the HID manager. */ + IOHIDManagerClose(hid_mgr, kIOHIDOptionsTypeNone); + CFRelease(hid_mgr); + hid_mgr = NULL; + } + + return 0; +} + +static void process_pending_events(void) { + SInt32 res; + do { + res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.001, FALSE); + } while(res != kCFRunLoopRunFinished && res != kCFRunLoopRunTimedOut); +} + +struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) +{ + struct hid_device_info *root = NULL; /* return object */ + struct hid_device_info *cur_dev = NULL; + CFIndex num_devices; + int i; + + /* Set up the HID Manager if it hasn't been done */ + if (hid_init() < 0) + return NULL; + + /* give the IOHIDManager a chance to update itself */ + process_pending_events(); + + /* Get a list of the Devices */ + IOHIDManagerSetDeviceMatching(hid_mgr, NULL); + CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr); + + /* Convert the list into a C array so we can iterate easily. */ + num_devices = CFSetGetCount(device_set); + IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef)); + CFSetGetValues(device_set, (const void **) device_array); + + /* Iterate over each device, making an entry for it. */ + for (i = 0; i < num_devices; i++) { + unsigned short dev_vid; + unsigned short dev_pid; + #define BUF_LEN 256 + wchar_t buf[BUF_LEN]; + + IOHIDDeviceRef dev = device_array[i]; + + if (!dev) { + continue; + } + dev_vid = get_vendor_id(dev); + dev_pid = get_product_id(dev); + + /* Check the VID/PID against the arguments */ + if ((vendor_id == 0x0 || vendor_id == dev_vid) && + (product_id == 0x0 || product_id == dev_pid)) { + struct hid_device_info *tmp; + bool is_usb_hid; /* Is this an actual HID usb device */ + io_object_t iokit_dev; + kern_return_t res; + io_string_t path; + + /* VID/PID match. Create the record. */ + tmp = malloc(sizeof(struct hid_device_info)); + if (cur_dev) { + cur_dev->next = tmp; + } + else { + root = tmp; + } + cur_dev = tmp; + + is_usb_hid = get_int_property(dev, CFSTR(kUSBInterfaceClass)) == kUSBHIDClass; + + /* Get the Usage Page and Usage for this device. */ + cur_dev->usage_page = get_int_property(dev, CFSTR(kIOHIDPrimaryUsagePageKey)); + cur_dev->usage = get_int_property(dev, CFSTR(kIOHIDPrimaryUsageKey)); + + /* Fill out the record */ + cur_dev->next = NULL; + + /* Fill in the path (IOService plane) */ + iokit_dev = hidapi_IOHIDDeviceGetService(dev); + res = IORegistryEntryGetPath(iokit_dev, kIOServicePlane, path); + if (res == KERN_SUCCESS) + cur_dev->path = strdup(path); + else + cur_dev->path = strdup(""); + + /* Serial Number */ + get_serial_number(dev, buf, BUF_LEN); + cur_dev->serial_number = dup_wcs(buf); + + /* Manufacturer and Product strings */ + get_manufacturer_string(dev, buf, BUF_LEN); + cur_dev->manufacturer_string = dup_wcs(buf); + get_product_string(dev, buf, BUF_LEN); + cur_dev->product_string = dup_wcs(buf); + + /* VID/PID */ + cur_dev->vendor_id = dev_vid; + cur_dev->product_id = dev_pid; + + /* Release Number */ + cur_dev->release_number = get_int_property(dev, CFSTR(kIOHIDVersionNumberKey)); + + /* We can only retrieve the interface number for USB HID devices. + * IOKit always seems to return 0 when querying a standard USB device + * for its interface. */ + if (is_usb_hid) { + /* Get the interface number */ + cur_dev->interface_number = get_int_property(dev, CFSTR(kUSBInterfaceNumber)); + } else { + cur_dev->interface_number = -1; + } + } + } + + free(device_array); + CFRelease(device_set); + + return root; +} + +void HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs) +{ + /* This function is identical to the Linux version. Platform independent. */ + struct hid_device_info *d = devs; + while (d) { + struct hid_device_info *next = d->next; + free(d->path); + free(d->serial_number); + free(d->manufacturer_string); + free(d->product_string); + free(d); + d = next; + } +} + +hid_device * HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) +{ + /* This function is identical to the Linux version. Platform independent. */ + struct hid_device_info *devs, *cur_dev; + const char *path_to_open = NULL; + hid_device * handle = NULL; + + devs = hid_enumerate(vendor_id, product_id); + cur_dev = devs; + while (cur_dev) { + if (cur_dev->vendor_id == vendor_id && + cur_dev->product_id == product_id) { + if (serial_number) { + if (wcscmp(serial_number, cur_dev->serial_number) == 0) { + path_to_open = cur_dev->path; + break; + } + } + else { + path_to_open = cur_dev->path; + break; + } + } + cur_dev = cur_dev->next; + } + + if (path_to_open) { + /* Open the device */ + handle = hid_open_path(path_to_open); + } + + hid_free_enumeration(devs); + + return handle; +} + +static void hid_device_removal_callback(void *context, IOReturn result, + void *sender) +{ + /* Stop the Run Loop for this device. */ + hid_device *d = context; + + d->disconnected = 1; + CFRunLoopStop(d->run_loop); +} + +/* The Run Loop calls this function for each input report received. + This function puts the data into a linked list to be picked up by + hid_read(). */ +static void hid_report_callback(void *context, IOReturn result, void *sender, + IOHIDReportType report_type, uint32_t report_id, + uint8_t *report, CFIndex report_length) +{ + struct input_report *rpt; + hid_device *dev = context; + + /* Make a new Input Report object */ + rpt = calloc(1, sizeof(struct input_report)); + rpt->data = calloc(1, report_length); + memcpy(rpt->data, report, report_length); + rpt->len = report_length; + rpt->next = NULL; + + /* Lock this section */ + pthread_mutex_lock(&dev->mutex); + + /* Attach the new report object to the end of the list. */ + if (dev->input_reports == NULL) { + /* The list is empty. Put it at the root. */ + dev->input_reports = rpt; + } + else { + /* Find the end of the list and attach. */ + struct input_report *cur = dev->input_reports; + int num_queued = 0; + while (cur->next != NULL) { + cur = cur->next; + num_queued++; + } + cur->next = rpt; + + /* Pop one off if we've reached 30 in the queue. This + way we don't grow forever if the user never reads + anything from the device. */ + if (num_queued > 30) { + return_data(dev, NULL, 0); + } + } + + /* Signal a waiting thread that there is data. */ + pthread_cond_signal(&dev->condition); + + /* Unlock */ + pthread_mutex_unlock(&dev->mutex); + +} + +/* This gets called when the read_thread's run loop gets signaled by + hid_close(), and serves to stop the read_thread's run loop. */ +static void perform_signal_callback(void *context) +{ + hid_device *dev = context; + CFRunLoopStop(dev->run_loop); /*TODO: CFRunLoopGetCurrent()*/ +} + +static void *read_thread(void *param) +{ + hid_device *dev = param; + SInt32 code; + + /* Move the device's run loop to this thread. */ + IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetCurrent(), dev->run_loop_mode); + + /* Create the RunLoopSource which is used to signal the + event loop to stop when hid_close() is called. */ + CFRunLoopSourceContext ctx; + memset(&ctx, 0, sizeof(ctx)); + ctx.version = 0; + ctx.info = dev; + ctx.perform = &perform_signal_callback; + dev->source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0/*order*/, &ctx); + CFRunLoopAddSource(CFRunLoopGetCurrent(), dev->source, dev->run_loop_mode); + + /* Store off the Run Loop so it can be stopped from hid_close() + and on device disconnection. */ + dev->run_loop = CFRunLoopGetCurrent(); + + /* Notify the main thread that the read thread is up and running. */ + pthread_barrier_wait(&dev->barrier); + + /* Run the Event Loop. CFRunLoopRunInMode() will dispatch HID input + reports into the hid_report_callback(). */ + while (!dev->shutdown_thread && !dev->disconnected) { + code = CFRunLoopRunInMode(dev->run_loop_mode, 1000/*sec*/, FALSE); + /* Return if the device has been disconnected */ + if (code == kCFRunLoopRunFinished) { + dev->disconnected = 1; + break; + } + + + /* Break if The Run Loop returns Finished or Stopped. */ + if (code != kCFRunLoopRunTimedOut && + code != kCFRunLoopRunHandledSource) { + /* There was some kind of error. Setting + shutdown seems to make sense, but + there may be something else more appropriate */ + dev->shutdown_thread = 1; + break; + } + } + + /* Now that the read thread is stopping, Wake any threads which are + waiting on data (in hid_read_timeout()). Do this under a mutex to + make sure that a thread which is about to go to sleep waiting on + the condition actually will go to sleep before the condition is + signaled. */ + pthread_mutex_lock(&dev->mutex); + pthread_cond_broadcast(&dev->condition); + pthread_mutex_unlock(&dev->mutex); + + /* Wait here until hid_close() is called and makes it past + the call to CFRunLoopWakeUp(). This thread still needs to + be valid when that function is called on the other thread. */ + pthread_barrier_wait(&dev->shutdown_barrier); + + return NULL; +} + +/* hid_open_path() + * + * path must be a valid path to an IOHIDDevice in the IOService plane + * Example: "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/EHC1@1D,7/AppleUSBEHCI/PLAYSTATION(R)3 Controller@fd120000/IOUSBInterface@0/IOUSBHIDDriver" + */ +hid_device * HID_API_EXPORT hid_open_path(const char *path) +{ + hid_device *dev = NULL; + io_registry_entry_t entry = MACH_PORT_NULL; + + dev = new_hid_device(); + + /* Set up the HID Manager if it hasn't been done */ + if (hid_init() < 0) + return NULL; + + /* Get the IORegistry entry for the given path */ + entry = IORegistryEntryFromPath(kIOMasterPortDefault, path); + if (entry == MACH_PORT_NULL) { + /* Path wasn't valid (maybe device was removed?) */ + goto return_error; + } + + /* Create an IOHIDDevice for the entry */ + dev->device_handle = IOHIDDeviceCreate(kCFAllocatorDefault, entry); + if (dev->device_handle == NULL) { + /* Error creating the HID device */ + goto return_error; + } + + /* Open the IOHIDDevice */ + IOReturn ret = IOHIDDeviceOpen(dev->device_handle, kIOHIDOptionsTypeSeizeDevice); + if (ret == kIOReturnSuccess) { + char str[32]; + + /* Create the buffers for receiving data */ + dev->max_input_report_len = (CFIndex) get_max_report_length(dev->device_handle); + dev->input_report_buf = calloc(dev->max_input_report_len, sizeof(uint8_t)); + + /* Create the Run Loop Mode for this device. + printing the reference seems to work. */ + sprintf(str, "HIDAPI_%p", dev->device_handle); + dev->run_loop_mode = + CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII); + + /* Attach the device to a Run Loop */ + IOHIDDeviceRegisterInputReportCallback( + dev->device_handle, dev->input_report_buf, dev->max_input_report_len, + &hid_report_callback, dev); + IOHIDDeviceRegisterRemovalCallback(dev->device_handle, hid_device_removal_callback, dev); + + /* Start the read thread */ + pthread_create(&dev->thread, NULL, read_thread, dev); + + /* Wait here for the read thread to be initialized. */ + pthread_barrier_wait(&dev->barrier); + + IOObjectRelease(entry); + return dev; + } + else { + goto return_error; + } + +return_error: + if (dev->device_handle != NULL) + CFRelease(dev->device_handle); + + if (entry != MACH_PORT_NULL) + IOObjectRelease(entry); + + free_hid_device(dev); + return NULL; +} + +static int set_report(hid_device *dev, IOHIDReportType type, const unsigned char *data, size_t length) +{ + const unsigned char *data_to_send; + size_t length_to_send; + IOReturn res; + + /* Return if the device has been disconnected. */ + if (dev->disconnected) + return -1; + + if (data[0] == 0x0) { + /* Not using numbered Reports. + Don't send the report number. */ + data_to_send = data+1; + length_to_send = length-1; + } + else { + /* Using numbered Reports. + Send the Report Number */ + data_to_send = data; + length_to_send = length; + } + + if (!dev->disconnected) { + res = IOHIDDeviceSetReport(dev->device_handle, + type, + data[0], /* Report ID*/ + data_to_send, length_to_send); + + if (res == kIOReturnSuccess) { + return length; + } + else + return -1; + } + + return -1; +} + +int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length) +{ + return set_report(dev, kIOHIDReportTypeOutput, data, length); +} + +/* Helper function, so that this isn't duplicated in hid_read(). */ +static int return_data(hid_device *dev, unsigned char *data, size_t length) +{ + /* Copy the data out of the linked list item (rpt) into the + return buffer (data), and delete the liked list item. */ + struct input_report *rpt = dev->input_reports; + size_t len = (length < rpt->len)? length: rpt->len; + memcpy(data, rpt->data, len); + dev->input_reports = rpt->next; + free(rpt->data); + free(rpt); + return len; +} + +static int cond_wait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex) +{ + while (!dev->input_reports) { + int res = pthread_cond_wait(cond, mutex); + if (res != 0) + return res; + + /* A res of 0 means we may have been signaled or it may + be a spurious wakeup. Check to see that there's acutally + data in the queue before returning, and if not, go back + to sleep. See the pthread_cond_timedwait() man page for + details. */ + + if (dev->shutdown_thread || dev->disconnected) + return -1; + } + + return 0; +} + +static int cond_timedwait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) +{ + while (!dev->input_reports) { + int res = pthread_cond_timedwait(cond, mutex, abstime); + if (res != 0) + return res; + + /* A res of 0 means we may have been signaled or it may + be a spurious wakeup. Check to see that there's acutally + data in the queue before returning, and if not, go back + to sleep. See the pthread_cond_timedwait() man page for + details. */ + + if (dev->shutdown_thread || dev->disconnected) + return -1; + } + + return 0; + +} + +int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) +{ + int bytes_read = -1; + + /* Lock the access to the report list. */ + pthread_mutex_lock(&dev->mutex); + + /* There's an input report queued up. Return it. */ + if (dev->input_reports) { + /* Return the first one */ + bytes_read = return_data(dev, data, length); + goto ret; + } + + /* Return if the device has been disconnected. */ + if (dev->disconnected) { + bytes_read = -1; + goto ret; + } + + if (dev->shutdown_thread) { + /* This means the device has been closed (or there + has been an error. An error code of -1 should + be returned. */ + bytes_read = -1; + goto ret; + } + + /* There is no data. Go to sleep and wait for data. */ + + if (milliseconds == -1) { + /* Blocking */ + int res; + res = cond_wait(dev, &dev->condition, &dev->mutex); + if (res == 0) + bytes_read = return_data(dev, data, length); + else { + /* There was an error, or a device disconnection. */ + bytes_read = -1; + } + } + else if (milliseconds > 0) { + /* Non-blocking, but called with timeout. */ + int res; + struct timespec ts; + struct timeval tv; + gettimeofday(&tv, NULL); + TIMEVAL_TO_TIMESPEC(&tv, &ts); + ts.tv_sec += milliseconds / 1000; + ts.tv_nsec += (milliseconds % 1000) * 1000000; + if (ts.tv_nsec >= 1000000000L) { + ts.tv_sec++; + ts.tv_nsec -= 1000000000L; + } + + res = cond_timedwait(dev, &dev->condition, &dev->mutex, &ts); + if (res == 0) + bytes_read = return_data(dev, data, length); + else if (res == ETIMEDOUT) + bytes_read = 0; + else + bytes_read = -1; + } + else { + /* Purely non-blocking */ + bytes_read = 0; + } + +ret: + /* Unlock */ + pthread_mutex_unlock(&dev->mutex); + return bytes_read; +} + +int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); +} + +int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) +{ + /* All Nonblocking operation is handled by the library. */ + dev->blocking = !nonblock; + + return 0; +} + +int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) +{ + return set_report(dev, kIOHIDReportTypeFeature, data, length); +} + +int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) +{ + CFIndex len = length - 1; + IOReturn res; + + /* Return if the device has been unplugged. */ + if (dev->disconnected) + return -1; + + res = IOHIDDeviceGetReport(dev->device_handle, + kIOHIDReportTypeFeature, + data[0], /* Report ID */ + data + 1, &len); + if (res == kIOReturnSuccess) + return len + 1; + else + return -1; +} + + +void HID_API_EXPORT hid_close(hid_device *dev) +{ + if (!dev) + return; + + /* Disconnect the report callback before close. */ + if (!dev->disconnected) { + IOHIDDeviceRegisterInputReportCallback( + dev->device_handle, dev->input_report_buf, dev->max_input_report_len, + NULL, dev); + IOHIDDeviceRegisterRemovalCallback(dev->device_handle, NULL, dev); + IOHIDDeviceUnscheduleFromRunLoop(dev->device_handle, dev->run_loop, dev->run_loop_mode); + IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetMain(), kCFRunLoopDefaultMode); + } + + /* Cause read_thread() to stop. */ + dev->shutdown_thread = 1; + + /* Wake up the run thread's event loop so that the thread can exit. */ + CFRunLoopSourceSignal(dev->source); + CFRunLoopWakeUp(dev->run_loop); + + /* Notify the read thread that it can shut down now. */ + pthread_barrier_wait(&dev->shutdown_barrier); + + /* Wait for read_thread() to end. */ + pthread_join(dev->thread, NULL); + + /* Close the OS handle to the device, but only if it's not + been unplugged. If it's been unplugged, then calling + IOHIDDeviceClose() will crash. */ + if (!dev->disconnected) { + IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeSeizeDevice); + } + + /* Clear out the queue of received reports. */ + pthread_mutex_lock(&dev->mutex); + while (dev->input_reports) { + return_data(dev, NULL, 0); + } + pthread_mutex_unlock(&dev->mutex); + CFRelease(dev->device_handle); + + free_hid_device(dev); +} + +int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_manufacturer_string(dev->device_handle, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_product_string(dev->device_handle, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + return get_serial_number(dev->device_handle, string, maxlen); +} + +int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) +{ + /* TODO: */ + + return 0; +} + + +HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) +{ + /* TODO: */ + + return NULL; +} + + + + + + + +#if 0 +static int32_t get_location_id(IOHIDDeviceRef device) +{ + return get_int_property(device, CFSTR(kIOHIDLocationIDKey)); +} + +static int32_t get_usage(IOHIDDeviceRef device) +{ + int32_t res; + res = get_int_property(device, CFSTR(kIOHIDDeviceUsageKey)); + if (!res) + res = get_int_property(device, CFSTR(kIOHIDPrimaryUsageKey)); + return res; +} + +static int32_t get_usage_page(IOHIDDeviceRef device) +{ + int32_t res; + res = get_int_property(device, CFSTR(kIOHIDDeviceUsagePageKey)); + if (!res) + res = get_int_property(device, CFSTR(kIOHIDPrimaryUsagePageKey)); + return res; +} + +static int get_transport(IOHIDDeviceRef device, wchar_t *buf, size_t len) +{ + return get_string_property(device, CFSTR(kIOHIDTransportKey), buf, len); +} + + +int main(void) +{ + IOHIDManagerRef mgr; + int i; + + mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); + IOHIDManagerSetDeviceMatching(mgr, NULL); + IOHIDManagerOpen(mgr, kIOHIDOptionsTypeNone); + + CFSetRef device_set = IOHIDManagerCopyDevices(mgr); + + CFIndex num_devices = CFSetGetCount(device_set); + IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef)); + CFSetGetValues(device_set, (const void **) device_array); + + for (i = 0; i < num_devices; i++) { + IOHIDDeviceRef dev = device_array[i]; + printf("Device: %p\n", dev); + printf(" %04hx %04hx\n", get_vendor_id(dev), get_product_id(dev)); + + wchar_t serial[256], buf[256]; + char cbuf[256]; + get_serial_number(dev, serial, 256); + + + printf(" Serial: %ls\n", serial); + printf(" Loc: %ld\n", get_location_id(dev)); + get_transport(dev, buf, 256); + printf(" Trans: %ls\n", buf); + make_path(dev, cbuf, 256); + printf(" Path: %s\n", cbuf); + + } + + return 0; +} +#endif diff --git a/src/hidapi/win/hid.c b/src/hidapi/win/hid.c new file mode 100644 index 0000000000..4a71e25520 --- /dev/null +++ b/src/hidapi/win/hid.c @@ -0,0 +1,956 @@ +/******************************************************* + HIDAPI - Multi-Platform library for + communication with HID devices. + + Alan Ott + Signal 11 Software + + 8/22/2009 + + Copyright 2009, All Rights Reserved. + + At the discretion of the user of this library, + this software may be licensed under the terms of the + GNU General Public License v3, a BSD-Style license, or the + original HIDAPI license as outlined in the LICENSE.txt, + LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt + files located at the root of the source distribution. + These files may also be found in the public source + code repository located at: + http://github.com/signal11/hidapi . +********************************************************/ + +#include + +#ifndef _NTDEF_ +typedef LONG NTSTATUS; +#endif + +#ifdef __MINGW32__ +#include +#include +#endif + +#ifdef __CYGWIN__ +#include +#define _wcsdup wcsdup +#endif + +/* The maximum number of characters that can be passed into the + HidD_Get*String() functions without it failing.*/ +#define MAX_STRING_WCHARS 0xFFF + +/*#define HIDAPI_USE_DDK*/ + +#ifdef __cplusplus +extern "C" { +#endif + #include + #include + #ifdef HIDAPI_USE_DDK + #include + #endif + + /* Copied from inc/ddk/hidclass.h, part of the Windows DDK. */ + #define HID_OUT_CTL_CODE(id) \ + CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) + #define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include +#include + + +#include "hidapi.h" + +#undef MIN +#define MIN(x,y) ((x) < (y)? (x): (y)) + +#ifdef _MSC_VER + /* Thanks Microsoft, but I know how to use strncpy(). */ + #pragma warning(disable:4996) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef HIDAPI_USE_DDK + /* Since we're not building with the DDK, and the HID header + files aren't part of the SDK, we have to define all this + stuff here. In lookup_functions(), the function pointers + defined below are set. */ + typedef struct _HIDD_ATTRIBUTES{ + ULONG Size; + USHORT VendorID; + USHORT ProductID; + USHORT VersionNumber; + } HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; + + typedef USHORT USAGE; + typedef struct _HIDP_CAPS { + USAGE Usage; + USAGE UsagePage; + USHORT InputReportByteLength; + USHORT OutputReportByteLength; + USHORT FeatureReportByteLength; + USHORT Reserved[17]; + USHORT fields_not_used_by_hidapi[10]; + } HIDP_CAPS, *PHIDP_CAPS; + typedef void* PHIDP_PREPARSED_DATA; + #define HIDP_STATUS_SUCCESS 0x110000 + + typedef BOOLEAN (__stdcall *HidD_GetAttributes_)(HANDLE device, PHIDD_ATTRIBUTES attrib); + typedef BOOLEAN (__stdcall *HidD_GetSerialNumberString_)(HANDLE device, PVOID buffer, ULONG buffer_len); + typedef BOOLEAN (__stdcall *HidD_GetManufacturerString_)(HANDLE handle, PVOID buffer, ULONG buffer_len); + typedef BOOLEAN (__stdcall *HidD_GetProductString_)(HANDLE handle, PVOID buffer, ULONG buffer_len); + typedef BOOLEAN (__stdcall *HidD_SetFeature_)(HANDLE handle, PVOID data, ULONG length); + typedef BOOLEAN (__stdcall *HidD_GetFeature_)(HANDLE handle, PVOID data, ULONG length); + typedef BOOLEAN (__stdcall *HidD_GetIndexedString_)(HANDLE handle, ULONG string_index, PVOID buffer, ULONG buffer_len); + typedef BOOLEAN (__stdcall *HidD_GetPreparsedData_)(HANDLE handle, PHIDP_PREPARSED_DATA *preparsed_data); + typedef BOOLEAN (__stdcall *HidD_FreePreparsedData_)(PHIDP_PREPARSED_DATA preparsed_data); + typedef NTSTATUS (__stdcall *HidP_GetCaps_)(PHIDP_PREPARSED_DATA preparsed_data, HIDP_CAPS *caps); + typedef BOOLEAN (__stdcall *HidD_SetNumInputBuffers_)(HANDLE handle, ULONG number_buffers); + + static HidD_GetAttributes_ HidD_GetAttributes; + static HidD_GetSerialNumberString_ HidD_GetSerialNumberString; + static HidD_GetManufacturerString_ HidD_GetManufacturerString; + static HidD_GetProductString_ HidD_GetProductString; + static HidD_SetFeature_ HidD_SetFeature; + static HidD_GetFeature_ HidD_GetFeature; + static HidD_GetIndexedString_ HidD_GetIndexedString; + static HidD_GetPreparsedData_ HidD_GetPreparsedData; + static HidD_FreePreparsedData_ HidD_FreePreparsedData; + static HidP_GetCaps_ HidP_GetCaps; + static HidD_SetNumInputBuffers_ HidD_SetNumInputBuffers; + + static HMODULE lib_handle = NULL; + static BOOLEAN initialized = FALSE; +#endif /* HIDAPI_USE_DDK */ + +struct hid_device_ { + HANDLE device_handle; + BOOL blocking; + USHORT output_report_length; + size_t input_report_length; + void *last_error_str; + DWORD last_error_num; + BOOL read_pending; + char *read_buf; + OVERLAPPED ol; +}; + +static hid_device *new_hid_device() +{ + hid_device *dev = (hid_device*) calloc(1, sizeof(hid_device)); + dev->device_handle = INVALID_HANDLE_VALUE; + dev->blocking = TRUE; + dev->output_report_length = 0; + dev->input_report_length = 0; + dev->last_error_str = NULL; + dev->last_error_num = 0; + dev->read_pending = FALSE; + dev->read_buf = NULL; + memset(&dev->ol, 0, sizeof(dev->ol)); + dev->ol.hEvent = CreateEvent(NULL, FALSE, FALSE /*initial state f=nonsignaled*/, NULL); + + return dev; +} + +static void free_hid_device(hid_device *dev) +{ + CloseHandle(dev->ol.hEvent); + CloseHandle(dev->device_handle); + LocalFree(dev->last_error_str); + free(dev->read_buf); + free(dev); +} + +static void register_error(hid_device *dev, const char *op) +{ + WCHAR *ptr, *msg; + + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPVOID)&msg, 0/*sz*/, + NULL); + + /* Get rid of the CR and LF that FormatMessage() sticks at the + end of the message. Thanks Microsoft! */ + ptr = msg; + while (*ptr) { + if (*ptr == '\r') { + *ptr = 0x0000; + break; + } + ptr++; + } + + /* Store the message off in the Device entry so that + the hid_error() function can pick it up. */ + LocalFree(dev->last_error_str); + dev->last_error_str = msg; +} + +#ifndef HIDAPI_USE_DDK +static int lookup_functions() +{ + lib_handle = LoadLibraryA("hid.dll"); + if (lib_handle) { +#define RESOLVE(x) x = (x##_)GetProcAddress(lib_handle, #x); if (!x) return -1; + RESOLVE(HidD_GetAttributes); + RESOLVE(HidD_GetSerialNumberString); + RESOLVE(HidD_GetManufacturerString); + RESOLVE(HidD_GetProductString); + RESOLVE(HidD_SetFeature); + RESOLVE(HidD_GetFeature); + RESOLVE(HidD_GetIndexedString); + RESOLVE(HidD_GetPreparsedData); + RESOLVE(HidD_FreePreparsedData); + RESOLVE(HidP_GetCaps); + RESOLVE(HidD_SetNumInputBuffers); +#undef RESOLVE + } + else + return -1; + + return 0; +} +#endif + +static HANDLE open_device(const char *path, BOOL open_rw) +{ + HANDLE handle; + DWORD desired_access = (open_rw)? (GENERIC_WRITE | GENERIC_READ): 0; + DWORD share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE; + + handle = CreateFileA(path, + desired_access, + share_mode, + NULL, + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED,/*FILE_ATTRIBUTE_NORMAL,*/ + 0); + + return handle; +} + +int HID_API_EXPORT hid_init(void) +{ +#ifndef HIDAPI_USE_DDK + if (!initialized) { + if (lookup_functions() < 0) { + hid_exit(); + return -1; + } + initialized = TRUE; + } +#endif + return 0; +} + +int HID_API_EXPORT hid_exit(void) +{ +#ifndef HIDAPI_USE_DDK + if (lib_handle) + FreeLibrary(lib_handle); + lib_handle = NULL; + initialized = FALSE; +#endif + return 0; +} + +struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id) +{ + BOOL res; + struct hid_device_info *root = NULL; /* return object */ + struct hid_device_info *cur_dev = NULL; + + /* Windows objects for interacting with the driver. */ + GUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30} }; + SP_DEVINFO_DATA devinfo_data; + SP_DEVICE_INTERFACE_DATA device_interface_data; + SP_DEVICE_INTERFACE_DETAIL_DATA_A *device_interface_detail_data = NULL; + HDEVINFO device_info_set = INVALID_HANDLE_VALUE; + int device_index = 0; + int i; + + if (hid_init() < 0) + return NULL; + + /* Initialize the Windows objects. */ + memset(&devinfo_data, 0x0, sizeof(devinfo_data)); + devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA); + device_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + + /* Get information for all the devices belonging to the HID class. */ + device_info_set = SetupDiGetClassDevsA(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + + /* Iterate over each device in the HID class, looking for the right one. */ + + for (;;) { + HANDLE write_handle = INVALID_HANDLE_VALUE; + DWORD required_size = 0; + HIDD_ATTRIBUTES attrib; + + res = SetupDiEnumDeviceInterfaces(device_info_set, + NULL, + &InterfaceClassGuid, + device_index, + &device_interface_data); + + if (!res) { + /* A return of FALSE from this function means that + there are no more devices. */ + break; + } + + /* Call with 0-sized detail size, and let the function + tell us how long the detail struct needs to be. The + size is put in &required_size. */ + res = SetupDiGetDeviceInterfaceDetailA(device_info_set, + &device_interface_data, + NULL, + 0, + &required_size, + NULL); + + /* Allocate a long enough structure for device_interface_detail_data. */ + device_interface_detail_data = (SP_DEVICE_INTERFACE_DETAIL_DATA_A*) malloc(required_size); + device_interface_detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); + + /* Get the detailed data for this device. The detail data gives us + the device path for this device, which is then passed into + CreateFile() to get a handle to the device. */ + res = SetupDiGetDeviceInterfaceDetailA(device_info_set, + &device_interface_data, + device_interface_detail_data, + required_size, + NULL, + NULL); + + if (!res) { + /* register_error(dev, "Unable to call SetupDiGetDeviceInterfaceDetail"); + Continue to the next device. */ + goto cont; + } + + /* Make sure this device is of Setup Class "HIDClass" and has a + driver bound to it. */ + for (i = 0; ; i++) { + char driver_name[256]; + + /* Populate devinfo_data. This function will return failure + when there are no more interfaces left. */ + res = SetupDiEnumDeviceInfo(device_info_set, i, &devinfo_data); + if (!res) + goto cont; + + res = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data, + SPDRP_CLASS, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL); + if (!res) + goto cont; + + if ((strcmp(driver_name, "HIDClass") == 0) || + (strcmp(driver_name, "Mouse") == 0) || + (strcmp(driver_name, "Keyboard") == 0)) { + /* See if there's a driver bound. */ + res = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data, + SPDRP_DRIVER, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL); + if (res) + break; + } + } + + //wprintf(L"HandleName: %s\n", device_interface_detail_data->DevicePath); + + /* Open a handle to the device */ + write_handle = open_device(device_interface_detail_data->DevicePath, FALSE); + + /* Check validity of write_handle. */ + if (write_handle == INVALID_HANDLE_VALUE) { + /* Unable to open the device. */ + //register_error(dev, "CreateFile"); + goto cont_close; + } + + + /* Get the Vendor ID and Product ID for this device. */ + attrib.Size = sizeof(HIDD_ATTRIBUTES); + HidD_GetAttributes(write_handle, &attrib); + //wprintf(L"Product/Vendor: %x %x\n", attrib.ProductID, attrib.VendorID); + + /* Check the VID/PID to see if we should add this + device to the enumeration list. */ + if ((vendor_id == 0x0 || attrib.VendorID == vendor_id) && + (product_id == 0x0 || attrib.ProductID == product_id)) { + + #define WSTR_LEN 512 + const char *str; + struct hid_device_info *tmp; + PHIDP_PREPARSED_DATA pp_data = NULL; + HIDP_CAPS caps; + BOOLEAN res; + NTSTATUS nt_res; + wchar_t wstr[WSTR_LEN]; /* TODO: Determine Size */ + size_t len; + + /* VID/PID match. Create the record. */ + tmp = (struct hid_device_info*) calloc(1, sizeof(struct hid_device_info)); + if (cur_dev) { + cur_dev->next = tmp; + } + else { + root = tmp; + } + cur_dev = tmp; + + /* Get the Usage Page and Usage for this device. */ + res = HidD_GetPreparsedData(write_handle, &pp_data); + if (res) { + nt_res = HidP_GetCaps(pp_data, &caps); + if (nt_res == HIDP_STATUS_SUCCESS) { + cur_dev->usage_page = caps.UsagePage; + cur_dev->usage = caps.Usage; + } + + HidD_FreePreparsedData(pp_data); + } + + /* Fill out the record */ + cur_dev->next = NULL; + str = device_interface_detail_data->DevicePath; + if (str) { + len = strlen(str); + cur_dev->path = (char*) calloc(len+1, sizeof(char)); + strncpy(cur_dev->path, str, len+1); + cur_dev->path[len] = '\0'; + } + else + cur_dev->path = NULL; + + /* Serial Number */ + res = HidD_GetSerialNumberString(write_handle, wstr, sizeof(wstr)); + wstr[WSTR_LEN-1] = 0x0000; + if (res) { + cur_dev->serial_number = _wcsdup(wstr); + } + + /* Manufacturer String */ + res = HidD_GetManufacturerString(write_handle, wstr, sizeof(wstr)); + wstr[WSTR_LEN-1] = 0x0000; + if (res) { + cur_dev->manufacturer_string = _wcsdup(wstr); + } + + /* Product String */ + res = HidD_GetProductString(write_handle, wstr, sizeof(wstr)); + wstr[WSTR_LEN-1] = 0x0000; + if (res) { + cur_dev->product_string = _wcsdup(wstr); + } + + /* VID/PID */ + cur_dev->vendor_id = attrib.VendorID; + cur_dev->product_id = attrib.ProductID; + + /* Release Number */ + cur_dev->release_number = attrib.VersionNumber; + + /* Interface Number. It can sometimes be parsed out of the path + on Windows if a device has multiple interfaces. See + http://msdn.microsoft.com/en-us/windows/hardware/gg487473 or + search for "Hardware IDs for HID Devices" at MSDN. If it's not + in the path, it's set to -1. */ + cur_dev->interface_number = -1; + if (cur_dev->path) { + char *interface_component = strstr(cur_dev->path, "&mi_"); + if (interface_component) { + char *hex_str = interface_component + 4; + char *endptr = NULL; + cur_dev->interface_number = strtol(hex_str, &endptr, 16); + if (endptr == hex_str) { + /* The parsing failed. Set interface_number to -1. */ + cur_dev->interface_number = -1; + } + } + } + } + +cont_close: + CloseHandle(write_handle); +cont: + /* We no longer need the detail data. It can be freed */ + free(device_interface_detail_data); + + device_index++; + + } + + /* Close the device information handle. */ + SetupDiDestroyDeviceInfoList(device_info_set); + + return root; + +} + +void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs) +{ + /* TODO: Merge this with the Linux version. This function is platform-independent. */ + struct hid_device_info *d = devs; + while (d) { + struct hid_device_info *next = d->next; + free(d->path); + free(d->serial_number); + free(d->manufacturer_string); + free(d->product_string); + free(d); + d = next; + } +} + + +HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) +{ + /* TODO: Merge this functions with the Linux version. This function should be platform independent. */ + struct hid_device_info *devs, *cur_dev; + const char *path_to_open = NULL; + hid_device *handle = NULL; + + devs = hid_enumerate(vendor_id, product_id); + cur_dev = devs; + while (cur_dev) { + if (cur_dev->vendor_id == vendor_id && + cur_dev->product_id == product_id) { + if (serial_number) { + if (wcscmp(serial_number, cur_dev->serial_number) == 0) { + path_to_open = cur_dev->path; + break; + } + } + else { + path_to_open = cur_dev->path; + break; + } + } + cur_dev = cur_dev->next; + } + + if (path_to_open) { + /* Open the device */ + handle = hid_open_path(path_to_open); + } + + hid_free_enumeration(devs); + + return handle; +} + +HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path) +{ + hid_device *dev; + HIDP_CAPS caps; + PHIDP_PREPARSED_DATA pp_data = NULL; + BOOLEAN res; + NTSTATUS nt_res; + + if (hid_init() < 0) { + return NULL; + } + + dev = new_hid_device(); + + /* Open a handle to the device */ + dev->device_handle = open_device(path, TRUE); + + /* Check validity of write_handle. */ + if (dev->device_handle == INVALID_HANDLE_VALUE) { + /* System devices, such as keyboards and mice, cannot be opened in + read-write mode, because the system takes exclusive control over + them. This is to prevent keyloggers. However, feature reports + can still be sent and received. Retry opening the device, but + without read/write access. */ + dev->device_handle = open_device(path, FALSE); + + /* Check the validity of the limited device_handle. */ + if (dev->device_handle == INVALID_HANDLE_VALUE) { + /* Unable to open the device, even without read-write mode. */ + register_error(dev, "CreateFile"); + goto err; + } + } + + /* Set the Input Report buffer size to 64 reports. */ + res = HidD_SetNumInputBuffers(dev->device_handle, 64); + if (!res) { + register_error(dev, "HidD_SetNumInputBuffers"); + goto err; + } + + /* Get the Input Report length for the device. */ + res = HidD_GetPreparsedData(dev->device_handle, &pp_data); + if (!res) { + register_error(dev, "HidD_GetPreparsedData"); + goto err; + } + nt_res = HidP_GetCaps(pp_data, &caps); + if (nt_res != HIDP_STATUS_SUCCESS) { + register_error(dev, "HidP_GetCaps"); + goto err_pp_data; + } + dev->output_report_length = caps.OutputReportByteLength; + dev->input_report_length = caps.InputReportByteLength; + HidD_FreePreparsedData(pp_data); + + dev->read_buf = (char*) malloc(dev->input_report_length); + + return dev; + +err_pp_data: + HidD_FreePreparsedData(pp_data); +err: + free_hid_device(dev); + return NULL; +} + +int HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char *data, size_t length) +{ + DWORD bytes_written; + BOOL res; + + OVERLAPPED ol; + unsigned char *buf; + memset(&ol, 0, sizeof(ol)); + + /* Make sure the right number of bytes are passed to WriteFile. Windows + expects the number of bytes which are in the _longest_ report (plus + one for the report number) bytes even if the data is a report + which is shorter than that. Windows gives us this value in + caps.OutputReportByteLength. If a user passes in fewer bytes than this, + create a temporary buffer which is the proper size. */ + if (length >= dev->output_report_length) { + /* The user passed the right number of bytes. Use the buffer as-is. */ + buf = (unsigned char *) data; + } else { + /* Create a temporary buffer and copy the user's data + into it, padding the rest with zeros. */ + buf = (unsigned char *) malloc(dev->output_report_length); + memcpy(buf, data, length); + memset(buf + length, 0, dev->output_report_length - length); + length = dev->output_report_length; + } + + res = WriteFile(dev->device_handle, buf, length, NULL, &ol); + + if (!res) { + if (GetLastError() != ERROR_IO_PENDING) { + /* WriteFile() failed. Return error. */ + register_error(dev, "WriteFile"); + bytes_written = -1; + goto end_of_function; + } + } + + /* Wait here until the write is done. This makes + hid_write() synchronous. */ + res = GetOverlappedResult(dev->device_handle, &ol, &bytes_written, TRUE/*wait*/); + if (!res) { + /* The Write operation failed. */ + register_error(dev, "WriteFile"); + bytes_written = -1; + goto end_of_function; + } + +end_of_function: + if (buf != data) + free(buf); + + return bytes_written; +} + + +int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) +{ + DWORD bytes_read = 0; + size_t copy_len = 0; + BOOL res; + + /* Copy the handle for convenience. */ + HANDLE ev = dev->ol.hEvent; + + if (!dev->read_pending) { + /* Start an Overlapped I/O read. */ + dev->read_pending = TRUE; + memset(dev->read_buf, 0, dev->input_report_length); + ResetEvent(ev); + res = ReadFile(dev->device_handle, dev->read_buf, dev->input_report_length, &bytes_read, &dev->ol); + + if (!res) { + if (GetLastError() != ERROR_IO_PENDING) { + /* ReadFile() has failed. + Clean up and return error. */ + CancelIo(dev->device_handle); + dev->read_pending = FALSE; + goto end_of_function; + } + } + } + + if (milliseconds >= 0) { + /* See if there is any data yet. */ + res = WaitForSingleObject(ev, milliseconds); + if (res != WAIT_OBJECT_0) { + /* There was no data this time. Return zero bytes available, + but leave the Overlapped I/O running. */ + return 0; + } + } + + /* Either WaitForSingleObject() told us that ReadFile has completed, or + we are in non-blocking mode. Get the number of bytes read. The actual + data has been copied to the data[] array which was passed to ReadFile(). */ + res = GetOverlappedResult(dev->device_handle, &dev->ol, &bytes_read, TRUE/*wait*/); + + /* Set pending back to false, even if GetOverlappedResult() returned error. */ + dev->read_pending = FALSE; + + if (res && bytes_read > 0) { + if (dev->read_buf[0] == 0x0) { + /* If report numbers aren't being used, but Windows sticks a report + number (0x0) on the beginning of the report anyway. To make this + work like the other platforms, and to make it work more like the + HID spec, we'll skip over this byte. */ + bytes_read--; + copy_len = length > bytes_read ? bytes_read : length; + memcpy(data, dev->read_buf+1, copy_len); + } + else { + /* Copy the whole buffer, report number and all. */ + copy_len = length > bytes_read ? bytes_read : length; + memcpy(data, dev->read_buf, copy_len); + } + } + +end_of_function: + if (!res) { + register_error(dev, "GetOverlappedResult"); + return -1; + } + + return copy_len; +} + +int HID_API_EXPORT HID_API_CALL hid_read(hid_device *dev, unsigned char *data, size_t length) +{ + return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); +} + +int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *dev, int nonblock) +{ + dev->blocking = !nonblock; + return 0; /* Success */ +} + +int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) +{ + BOOL res = HidD_SetFeature(dev->device_handle, (PVOID)data, length); + if (!res) { + register_error(dev, "HidD_SetFeature"); + return -1; + } + + return length; +} + + +int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) +{ + BOOL res; +#if 0 + res = HidD_GetFeature(dev->device_handle, data, length); + if (!res) { + register_error(dev, "HidD_GetFeature"); + return -1; + } + return 0; /* HidD_GetFeature() doesn't give us an actual length, unfortunately */ +#else + DWORD bytes_returned; + + OVERLAPPED ol; + memset(&ol, 0, sizeof(ol)); + + res = DeviceIoControl(dev->device_handle, + IOCTL_HID_GET_FEATURE, + data, length, + data, length, + &bytes_returned, &ol); + + if (!res) { + if (GetLastError() != ERROR_IO_PENDING) { + /* DeviceIoControl() failed. Return error. */ + register_error(dev, "Send Feature Report DeviceIoControl"); + return -1; + } + } + + /* Wait here until the write is done. This makes + hid_get_feature_report() synchronous. */ + res = GetOverlappedResult(dev->device_handle, &ol, &bytes_returned, TRUE/*wait*/); + if (!res) { + /* The operation failed. */ + register_error(dev, "Send Feature Report GetOverLappedResult"); + return -1; + } + + /* bytes_returned does not include the first byte which contains the + report ID. The data buffer actually contains one more byte than + bytes_returned. */ + bytes_returned++; + + return bytes_returned; +#endif +} + +void HID_API_EXPORT HID_API_CALL hid_close(hid_device *dev) +{ + if (!dev) + return; + CancelIo(dev->device_handle); + free_hid_device(dev); +} + +int HID_API_EXPORT_CALL HID_API_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + BOOL res; + + res = HidD_GetManufacturerString(dev->device_handle, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS)); + if (!res) { + register_error(dev, "HidD_GetManufacturerString"); + return -1; + } + + return 0; +} + +int HID_API_EXPORT_CALL HID_API_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + BOOL res; + + res = HidD_GetProductString(dev->device_handle, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS)); + if (!res) { + register_error(dev, "HidD_GetProductString"); + return -1; + } + + return 0; +} + +int HID_API_EXPORT_CALL HID_API_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) +{ + BOOL res; + + res = HidD_GetSerialNumberString(dev->device_handle, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS)); + if (!res) { + register_error(dev, "HidD_GetSerialNumberString"); + return -1; + } + + return 0; +} + +int HID_API_EXPORT_CALL HID_API_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) +{ + BOOL res; + + res = HidD_GetIndexedString(dev->device_handle, string_index, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS)); + if (!res) { + register_error(dev, "HidD_GetIndexedString"); + return -1; + } + + return 0; +} + + +HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) +{ + return (wchar_t*)dev->last_error_str; +} + + +/*#define PICPGM*/ +/*#define S11*/ +#define P32 +#ifdef S11 + unsigned short VendorID = 0xa0a0; + unsigned short ProductID = 0x0001; +#endif + +#ifdef P32 + unsigned short VendorID = 0x04d8; + unsigned short ProductID = 0x3f; +#endif + + +#ifdef PICPGM + unsigned short VendorID = 0x04d8; + unsigned short ProductID = 0x0033; +#endif + + +#if 0 +int __cdecl main(int argc, char* argv[]) +{ + int res; + unsigned char buf[65]; + + UNREFERENCED_PARAMETER(argc); + UNREFERENCED_PARAMETER(argv); + + /* Set up the command buffer. */ + memset(buf,0x00,sizeof(buf)); + buf[0] = 0; + buf[1] = 0x81; + + + /* Open the device. */ + int handle = open(VendorID, ProductID, L"12345"); + if (handle < 0) + printf("unable to open device\n"); + + + /* Toggle LED (cmd 0x80) */ + buf[1] = 0x80; + res = write(handle, buf, 65); + if (res < 0) + printf("Unable to write()\n"); + + /* Request state (cmd 0x81) */ + buf[1] = 0x81; + write(handle, buf, 65); + if (res < 0) + printf("Unable to write() (2)\n"); + + /* Read requested state */ + read(handle, buf, 65); + if (res < 0) + printf("Unable to read()\n"); + + /* Print out the returned buffer. */ + for (int i = 0; i < 4; i++) + printf("buf[%d]: %d\n", i, buf[i]); + + return 0; +} +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif diff --git a/src/imgui/README.md b/src/imgui/README.md new file mode 100644 index 0000000000..26e3444748 --- /dev/null +++ b/src/imgui/README.md @@ -0,0 +1,12 @@ +** Dear ImGui is a bloat-free graphical user interface library for C++.** + +For more information go to https://github.com/ocornut/imgui + +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 50b7f471ce..d52294acd2 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 2822e3e236..1b78dd83c1 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? +- FREQUENTLY ASKED QUESTIONS (FAQ) + - Read all answers online: https://www.dearimgui.org/faq, or in docs/FAQ.md (with a Markdown viewer) -CODE +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 - ====================================== + FREQUENTLY ASKED QUESTIONS (FAQ) + ================================ - 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.) + 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: 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. + Q&A: Basics + =========== - 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: + 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. - 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) + 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 - 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) + Q&A: Integration + ================ - User code may do: + 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. - // Cast our texture type to ImTextureID / void* - MyTexture* texture = g_CoffeeTableTexture; - ImGui::Image((void*)texture, ImVec2(texture->Width, texture->Height)); + 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 - The renderer function called after ImGui::Render() will receive that same value that the user code passed: + Q&A: Usage + ---------- - // 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 - [...] - 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? + 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 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&A: Fonts, Text + ================ 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 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: 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. + >> See https://www.dearimgui.org/faq and docs/FONTS.txt - // Add default Japanese ranges - io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, io.Fonts->GetGlyphRangesJapanese()); + Q&A: Concerns + ============= - // 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 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); + 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 - 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. - - 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: 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&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 // toupper, isprint +#include // toupper #include // vsnprintf, sscanf, printf #if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier #include // 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* out_list, ImDrawList* draw_list); -static void AddWindowToDrawData(ImVector* out_list, ImGuiWindow* window); static void AddWindowToSortBuffer(ImVector* 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) { - const int n = ImStrlenW(InputCharacters); - if (n + 1 < IM_ARRAYSIZE(InputCharacters)) - { - InputCharacters[n] = c; - InputCharacters[n+1] = '\0'; - } + if (c > 0 && c <= IM_UNICODE_CODEPOINT_MAX) + InputQueueCharacters.push_back((ImWchar)c); } void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars) { - // 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]); + while (*utf8_chars != 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::ClearInputCharacters() +{ + 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) +char* ImStrdup(const char* str) { - size_t len = strlen(str) + 1; - void* buf = ImGui::MemAlloc(len); - return (char*)memcpy(buf, (const void*)str, len); + size_t len = strlen(str); + void* buf = IM_ALLOC(len + 1); + return (char*)memcpy(buf, (const void*)str, len + 1); +} + +char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* src) +{ + 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 -// Pass data_size==0 for zero-terminated strings -// 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) +// 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] = { - 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; - } - } + 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, +}; +// 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 ImHashData(const void* data_p, size_t data_size, ImU32 seed) +{ + 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 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::iterator LowerBound(ImVector& data, ImGuiID key) +static ImGuiStorage::ImGuiStoragePair* LowerBound(ImVector& data, ImGuiID key) { - ImVector::iterator first = data.begin(); - ImVector::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::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::iterator it = LowerBound(const_cast&>(Data), key); + ImGuiStoragePair* it = LowerBound(const_cast&>(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::iterator it = LowerBound(const_cast&>(Data), key); + ImGuiStoragePair* it = LowerBound(const_cast&>(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::iterator it = LowerBound(const_cast&>(Data), key); + ImGuiStoragePair* it = LowerBound(const_cast&>(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::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::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::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::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::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::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* out) const +void ImGuiTextFilter::ImGuiTextRange::split(char separator, ImVector* out) const { out->resize(0); const char* wb = b; @@ -1902,25 +1990,25 @@ void ImGuiTextFilter::TextRange::split(char separator, ImVector* 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 { - window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, NULL); + 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, text, text_display_end); + 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 + { + 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_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. - - if (window->FocusIdxAllCounter == window->FocusIdxAllRequestCurrent) - return true; - if (is_tab_stop && window->FocusIdxTabCounter == window->FocusIdxTabRequestCurrent) + // 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.NavJustTabbedId = id; - return true; + 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. + } + + // Handle focus requests + if (g.FocusRequestCurrWindow == window) + { + 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->OverlayDrawList; + return &GImGui->BackgroundDrawList; +} + +ImDrawList* ImGui::GetForegroundDrawList() +{ + 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; } } +static void StartLockWheelingWindow(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + 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; - if (!g.HoveredWindow || g.HoveredWindow->Collapsed) - return; + + // 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.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.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); + g.BackgroundDrawList.Clear(); + g.BackgroundDrawList.PushTextureID(g.IO.Fonts->TexID); + g.BackgroundDrawList.PushClipRectFullScreen(); - // Mark rendering data as invalid to prevent user who may have a handle on it to use it + 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.PrivateClipboard.clear(); - g.InputTextState.TextW.clear(); - g.InputTextState.InitialText.clear(); - g.InputTextState.TempBuffer.clear(); + g.BackgroundDrawList.ClearFreeMemory(); + g.ForegroundDrawList.ClearFreeMemory(); + + g.TabBars.Clear(); + g.CurrentTabBarStack.clear(); + g.ShrinkWidthBuffer.clear(); + + g.PrivateClipboard.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* 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* 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* 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* 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,13 +4353,90 @@ 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::IsMouseClicked(ImGuiMouseButton button, bool repeat) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + const float t = g.IO.MouseDownDuration[button]; + if (t == 0.0f) + return true; + + if (repeat && t > g.IO.KeyRepeatDelay) + { + // 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(ImGuiMouseButton button) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseReleased[button]; +} + +bool ImGui::IsMouseDoubleClicked(ImGuiMouseButton button) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseDoubleClicked[button]; +} + +// [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 (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() +{ + 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.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. +bool ImGui::IsMousePosValid(const ImVec2* mouse_pos) +{ + // 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; + ImVec2 p = mouse_pos ? *mouse_pos : GImGui->IO.MousePos; + return p.x >= MOUSE_INVALID && p.y >= MOUSE_INVALID; +} + bool ImGui::IsAnyMouseDown() { ImGuiContext& g = *GImGui; @@ -3872,86 +4446,23 @@ bool ImGui::IsAnyMouseDown() return false; } -bool ImGui::IsMouseClicked(int button, bool repeat) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - const float t = g.IO.MouseDownDuration[button]; - if (t == 0.0f) - return true; - - 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)) - return true; - } - - return false; -} - -bool ImGui::IsMouseReleased(int button) -{ - ImGuiContext& g = *GImGui; - IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); - return g.IO.MouseReleased[button]; -} - -bool ImGui::IsMouseDoubleClicked(int 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) -{ - 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; -} - -ImVec2 ImGui::GetMousePos() -{ - return GImGui->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; - return g.IO.MousePos; -} - -// 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; - const float MOUSE_INVALID = -256000.0f; - return mouse_pos->x >= MOUSE_INVALID && mouse_pos->y >= MOUSE_INVALID; -} - +// 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; - 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; + if ((flags & ImGuiWindowFlags_NoResize) || (flags & ImGuiWindowFlags_AlwaysAutoResize) || window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) + return false; + if (window->WasActive == false) // Early out to avoid running this code for e.g. an hidden implicit/fallback Debug window. + return false; + + 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 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_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] = {}; + 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) + 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 = ImFloor(window->Size.x * 0.65f); + else + 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); - // 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)) - 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); - if (!window->Collapsed) - UpdateManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0]); - - // 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); - else - window->ItemWidthDefault = (float)(int)(g.FontSize * 16.0f); - // 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; + 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; - // 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); + // 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); - // 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); + 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 RECTANGLES (2- THOSE AFFECTED BY SCROLLING) - // 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)); + // 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; +} + +// [Internal] Absolute coordinate. Saner. This is not exposed until we finishing refactoring work rect features. +ImVec2 ImGui::GetContentRegionMaxAbs() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImVec2 mx = window->ContentRegionRect.Max; + if (window->DC.CurrentColumns) + mx.x = window->WorkRect.Max.x; return mx; } ImVec2 ImGui::GetContentRegionAvail() { - ImGuiWindow* window = GetCurrentWindowRead(); - return GetContentRegionMax() - (window->DC.CursorPos - window->Pos); -} - -float ImGui::GetContentRegionAvailWidth() -{ - 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) -{ - // 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; -} - -// 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) -{ - 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); -} - void ImGui::ActivateItem(ImGuiID id) { ImGuiContext& g = *GImGui; g.NavNextActivateId = id; } +void ImGui::PushFocusScope(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + window->IDStack.push_back(window->DC.NavFocusScopeIdCurrent); + window->DC.NavFocusScopeIdCurrent = id; +} + +void ImGui::PopFocusScope() +{ + ImGuiContext& g = *GImGui; + 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); + tooltip_flags |= ImGuiTooltipFlags_OverridePreviousTooltip; } - else - { - BeginTooltipEx(0, false); - } -} -// 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,7 +7491,183 @@ void ImGui::OpenPopupEx(ImGuiID id) } } -bool ImGui::OpenPopupOnItemClick(const char* str_id, int mouse_button) +void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup) +{ + ImGuiContext& g = *GImGui; + if (g.OpenPopupStack.empty()) + return; + + // 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 popup_count_to_keep = 0; + if (ref_window) + { + // 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++) + { + 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 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 (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, bool restore_focus_to_window_under_popup) +{ + ImGuiContext& g = *GImGui; + 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); + + 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.BeginPopupStack.Size - 1; + if (popup_idx < 0 || popup_idx >= g.OpenPopupStack.Size || g.BeginPopupStack[popup_idx].PopupId != g.OpenPopupStack[popup_idx].PopupId) + return; + + // 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--; + } + //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 flags) +{ + ImGuiContext& g = *GImGui; + if (!IsPopupOpen(id)) + { + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + return false; + } + + char name[20]; + 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 + + 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(); + + return is_open; +} + +bool ImGui::BeginPopup(const char* str_id, ImGuiWindowFlags flags) +{ + ImGuiContext& g = *GImGui; + if (g.OpenPopupStack.Size <= g.BeginPopupStack.Size) // Early out for performance + { + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + return false; + } + 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; + ImGuiWindow* window = g.CurrentWindow; + const ImGuiID id = window->GetID(name); + if (!IsPopupOpen(id)) + { + 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.Flags & ImGuiNextWindowDataFlags_HasPos) == 0) + SetNextWindowPos(g.IO.DisplaySize * 0.5f, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f)); + + 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) + ClosePopupToLevel(g.BeginPopupStack.Size, true); + return false; + } + return is_open; +} + +void ImGui::EndPopup() +{ + 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(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)) @@ -6459,148 +7680,14 @@ bool ImGui::OpenPopupOnItemClick(const char* str_id, int mouse_button) return false; } -void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window) -{ - ImGuiContext& g = *GImGui; - if (g.OpenPopupStack.empty()) - return; - - // 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; - if (ref_window) - { - for (n = 0; n < g.OpenPopupStack.Size; n++) - { - ImGuiPopupRef& popup = g.OpenPopupStack[n]; - 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) - 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); -} - -void ImGui::ClosePopupToLevel(int remaining) -{ - 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; - g.OpenPopupStack.resize(remaining); -} - -void ImGui::ClosePopup(ImGuiID id) -{ - if (!IsPopupOpen(id)) - return; - ImGuiContext& g = *GImGui; - ClosePopupToLevel(g.OpenPopupStack.Size - 1); -} - -// 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) - return; - while (popup_idx > 0 && g.OpenPopupStack[popup_idx].Window && (g.OpenPopupStack[popup_idx].Window->Flags & ImGuiWindowFlags_ChildMenu)) - popup_idx--; - ClosePopupToLevel(popup_idx); -} - -bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags) -{ - ImGuiContext& g = *GImGui; - if (!IsPopupOpen(id)) - { - g.NextWindowData.Clear(); // 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 - 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); - if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display) - EndPopup(); - - return is_open; -} - -bool ImGui::BeginPopup(const char* str_id, ImGuiWindowFlags flags) -{ - ImGuiContext& g = *GImGui; - if (g.OpenPopupStack.Size <= g.CurrentPopupStack.Size) // Early out for performance - { - g.NextWindowData.Clear(); // 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); -} - -bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags flags) -{ - ImGuiContext& g = *GImGui; - ImGuiWindow* window = g.CurrentWindow; - const ImGuiID id = window->GetID(name); - if (!IsPopupOpen(id)) - { - g.NextWindowData.Clear(); // 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) - 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); - 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); - return false; - } - return is_open; -} - -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); - - // Make all menus and popups wrap around for now, may need to expose that policy. - NavMoveRequestTryWrapping(g.CurrentWindow, ImGuiNavMoveFlags_LoopY); - - End(); -} - // 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<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); + 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); + } - // 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); - - // 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) { - 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 + { + 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; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(g.LogEnabled == false); + IM_ASSERT(g.LogFile == NULL); + IM_ASSERT(g.LogBuffer.empty()); + g.LogEnabled = true; + 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; +} + +void ImGui::LogToTTY(int auto_open_depth) { ImGuiContext& g = *GImGui; if (g.LogEnabled) return; - ImGuiWindow* window = g.CurrentWindow; - - IM_ASSERT(g.LogFile == NULL); + IM_UNUSED(auto_open_depth); +#ifndef IMGUI_DISABLE_TTY_FUNCTIONS + LogBegin(ImGuiLogType_TTY, auto_open_depth); g.LogFile = stdout; - g.LogEnabled = true; - g.LogStartDepth = window->DC.TreeDepth; - if (max_depth >= 0) - g.LogAutoExpandMaxDepth = max_depth; +#endif } -// Start logging ImGui output to given file -void ImGui::LogToFile(int max_depth, const char* filename) +// 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; - ImGuiWindow* window = g.CurrentWindow; + // 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 #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 #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 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 // 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 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 #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& 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."); - if (g.IO.KeyCtrl && show_window_begin_order) + 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(); + } + + // 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 90cde6304e..c2bbb7f710 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 // FLT_MAX -#include // va_list +#ifndef IMGUI_DISABLE + +//----------------------------------------------------------------------------- +// Header mess +//----------------------------------------------------------------------------- + +// Includes +#include // FLT_MIN, FLT_MAX +#include // va_list, va_start, va_end #include // ptrdiff_t, NULL #include // 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 #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 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 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 +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& src) { Size = Capacity = 0; Data = NULL; operator=(src); } + inline ImVector& operator=(const ImVector& 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& 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; // // 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]; // // 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. + 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; // // 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]; // // 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; // // 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; // (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; // (0.0f,0.0f) // [obsolete: just use io.DisplaySize] If the values are the same, we defaults to Min=(0.0f) and Max=DisplaySize + ImFontAtlas*Fonts; // // 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 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) + // 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 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 -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& src) { Size = Capacity = 0; Data = NULL; operator=(src); } - inline ImVector& operator=(const ImVector& 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& 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 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 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; + 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* out) const; + 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* out) const; }; - char InputBuf[256]; - ImVector Filters; - int CountGrep; + char InputBuf[256]; + ImVectorFilters; + int CountGrep; }; // Helper: Growable text buffer for logging/accumulating text @@ -1374,17 +1654,18 @@ struct ImGuiTextFilter struct ImGuiTextBuffer { ImVector 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 Data; + + ImVector 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 +// 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 { - 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 -{ - // 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 CmdBuffer; - ImVector IdxBuffer; + ImVector _CmdBuffer; + ImVector _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 _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 _ClipRectStack; // [Internal] ImVector _TextureIdStack; // [Internal] ImVector _Path; // [Internal] current path building - int _ChannelsCurrent; // [Internal] current channel number (0) - int _ChannelsCount; // [Internal] number of active channels (1+) - ImVector _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 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* 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 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* 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 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 CustomRects; // Rectangles for packing custom texture data into the atlas. + ImVector CustomRects; // Rectangles for packing custom texture data into the atlas. ImVector 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; // // 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 Glyphs; // // All glyphs. - ImVector IndexAdvanceX; // // Sparse. Glyphs->AdvanceX in a directly indexable way (more cache-friendly, for CalcTextSize functions which are often bottleneck in large UI). - ImVector 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: Hot ~20/24 bytes (for CalcTextSize) + ImVector 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: 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 ~36/48 bytes (for CalcTextSize + render loop) + ImVector IndexLookup; // 12-16 // out // // Sparse. Index glyphs by Unicode code-point. + ImVector 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 : ""; } @@ -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 3173ab858d..7664f1b4bb 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 // toupper, isprint +#ifndef IMGUI_DISABLE + +#include // toupper #include // INT_MIN, INT_MAX #include // sqrtf, powf, cosf, sinf, floorf, ceilf #include // 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", ¤t_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"; - 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); + 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 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(); + } + + 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)", "", bufpass, 64, ImGuiInputTextFlags_Password | ImGuiInputTextFlags_CharsNoBlank); + ImGui::InputText("password (clear)", bufpass, 64, ImGuiInputTextFlags_CharsNoBlank); + 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* my_str = (ImVector*)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* 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 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(); + } 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", ¤t, 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", ¤t, 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::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::Text("Banana"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("One\nTwo\nThree"); - // Bullet - ImGui::Button("Button##3"); - ImGui::SameLine(0.0f, spacing); - ImGui::BulletText("Bullet text"); + ImGui::Button("HOP##1"); ImGui::SameLine(); + ImGui::Text("Banana"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("Banana"); - ImGui::AlignTextToFramePadding(); - ImGui::BulletText("Node"); - ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##4"); + ImGui::Button("HOP##2"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("Banana"); + ImGui::Unindent(); + } + + ImGui::Spacing(); + + { + ImGui::BulletText("Misc items:"); + ImGui::Indent(); + + // 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); - 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::PopItemWidth(); - if (scroll_to) track = false; + // 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(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_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()) { - if (track && line == track_line) + 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 + { + 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 - } - else - { - ImGui::Text("Line %d", line); + 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); + } } } - float scroll_y = ImGui::GetScrollY(), scroll_max_y = ImGui::GetScrollMaxY(); + float scroll_y = ImGui::GetScrollY(); + float scroll_max_y = ImGui::GetScrollMaxY(); ImGui::EndChild(); - ImGui::Text("%.0f/%0.f", scroll_y, scroll_max_y); + ImGui::Text("%.0f/%.0f", scroll_y, scroll_max_y); ImGui::EndGroup(); } - 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()."); + // 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++) + { + 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_x = ImGui::GetScrollX(); + float scroll_max_x = ImGui::GetScrollMaxX(); + ImGui::EndChild(); + 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::PopID(); + + // 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(); + 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::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); - } + // 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]; @@ -2456,9 +3080,150 @@ 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."); + HelpMarker("Save/Revert in local non-persistent storage. Default Colors definition are not affected. Use \"Export\" 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(); - } + ImGui::Separator(); - if (ImGui::TreeNode("Settings")) + if (ImGui::BeginTabBar("##tabs", ImGuiTabBarFlags_None)) { - 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(); - } - - if (ImGui::TreeNode("Colors")) - { - 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); + 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(); + } + + 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", ImGui::GetFontSize() * 16); + + 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, 0), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened); + ImGui::PushItemWidth(-160); 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::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."); - - static ImGuiTextFilter filter; - filter.Draw("Filter colors", 200); - - 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); - - 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) - { - // 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]; - } - ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); - ImGui::TextUnformatted(name); - ImGui::PopID(); - } - ImGui::PopItemWidth(); - ImGui::EndChild(); - - ImGui::TreePop(); - } - - 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::PushItemWidth(100); - for (int i = 0; i < atlas->Fonts.Size; i++) - { - 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) - { - 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)) + 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) { - // Display all glyphs of the fonts in separate pages of 256 characters - for (int base = 0; base < 0x10000; base += 256) + // 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::PopItemWidth(); + ImGui::EndChild(); + + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Fonts")) + { + 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++) + { + 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) + { + 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 Items; - bool ScrollToBottom; + ImVector Commands; ImVector History; int HistoryPos; // -1: new line, 0..History.Size-1 browsing history. - ImVector 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 LineOffsets; // Index to lines offset - bool ScrollToBottom; + ImVector 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 - void Clear() { Buf.clear(); LineOffsets.clear(); } + ExampleAppLog() + { + AutoScroll = true; + 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: "); 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); + if (ImGui::BeginTabBar("##TabBar")) { - 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++) + // Primitives + if (ImGui::BeginTabItem("Primitives")) { - 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(); - { - static ImVector 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; - } - if (ImGui::IsItemHovered()) - { - if (!adding_line && ImGui::IsMouseClicked(0)) + 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::BeginTabItem("Canvas")) + { + static ImVector 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 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 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); } } - 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(); } + + // 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(); + } + } + } + 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 553fb16ee6..4e6f1374b8 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 // 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 (glibc uses . Note that Cygwin may have _WIN32 defined, so the order matters here) #elif defined(_WIN32) #include // 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() -{ - // 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++) - { - 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; } - } - 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) +// 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) { - ImDrawCmd& draw_cmd = CmdBuffer.Data[CmdBuffer.Size-1]; + // 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)) + { + _VtxCurrentOffset = VtxBuffer.Size; + _VtxCurrentIdx = 0; + AddDrawCmd(); + } + + 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* 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* 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; - 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); + // 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); } -void ImDrawList::AddBezierCurve(const ImVec2& pos0, const ImVec2& cp0, const ImVec2& cp1, const ImVec2& pos1, ImU32 col, float thickness, int num_segments) +// 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; + + // 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); +} + +// 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 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* 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++) + // Temporary storage for building + ImVector src_tmp_array; + ImVector 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()); + + // 1. Initialize font loading structure, check font data validity + for (int src_i = 0; src_i < atlas->ConfigData.Size; src_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; - - // 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 - { - 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)); + // (We technically don't need to zero-clear buf_rects, but let's do it for the sake of sanity) + ImVector buf_rects; + ImVector 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()); - // 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++) + // 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++) { - 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; - // 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++) + 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++) { - 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; - } - - // 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++) - { - 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]; - 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(); + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + if (src_tmp.GlyphsCount == 0) + continue; - const float font_scale = stbtt_ScaleForPixelHeight(&tmp.FontInfo, cfg.SizePixels); + 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) + + 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 = src_tmp.GlyphsList[glyph_i]; + const stbtt_packedchar& pc = src_tmp.PackedChars[glyph_i]; - const int codepoint = range.first_unicode_codepoint_in_range + char_idx; - if (cfg.MergeMode && dst_font->FindGlyphNoFallback((ImWchar)codepoint)) - continue; + 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; - 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); - } + // 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& user_rects = atlas->CustomRects; + ImVector& 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 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* out_ranges) +void ImFontGlyphRangesBuilder::BuildRanges(ImVector* 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* 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 bac04ae6af..5de13c3658 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 // FILE* +#include // FILE*, sscanf #include // NULL, malloc, free, qsort, atoi, atof #include // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf #include // 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 -#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!) +// 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_NEWLINE "\n" -#endif #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 (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!) +#else +#define IM_NEWLINE "\n" +#endif +#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; } +#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: 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; } -#define ImQsort qsort -// 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: 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 static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; } template static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; } template static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; } template static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); } template static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; } +template 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 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); -// 1D vector (this odd construct is used to facilitate the transition between 1D and 2D and maintenance of some patches) -struct ImVec1 +// Helper: ImBoolVector +// Store 1-bit per value. Note that Resize() currently clears the whole vector. +struct IMGUI_API ImBoolVector { - float x; - ImVec1() { x = 0.0f; } - ImVec1(float _x) { x = _x; } + ImVector 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; } }; +// 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 +struct IMGUI_API ImPool +{ + ImVector 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 +struct IMGUI_API ImChunkStream +{ + ImVector 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 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 InitialText; // backup of end-user buffer at the time of focus (in UTF-8, unaltered) - ImVector 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 TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity. + ImVector 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; + 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; // " - // Temporarily set when active - ImGuiInputTextFlags UserFlags; - 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 - 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 + // 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 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. + 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() - { - 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); - } - - void Clear() - { - PosCond = SizeCond = ContentSizeCond = CollapsedCond = SizeConstraintCond = FocusCond = BgAlphaCond = 0; - } + ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); } + inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; } }; -// Main imgui context +enum ImGuiNextItemDataFlags_ +{ + ImGuiNextItemDataFlags_None = 0, + ImGuiNextItemDataFlags_HasWidth = 1 << 0, + ImGuiNextItemDataFlags_HasOpen = 1 << 1 +}; + +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 Windows; // Windows, sorted in display order, back to front - ImVector WindowsFocusOrder; // Windows, sorted in focus order, back to front - ImVector WindowsSortBuffer; + ImVector 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 WindowsTempSortBuffer; // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child ImVector 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 ColorModifiers; // Stack for PushStyleColor()/PopStyleColor() + + // Next window/item data + ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions + ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions + + // Shared stacks + ImVector ColorModifiers; // Stack for PushStyleColor()/PopStyleColor() ImVector StyleModifiers; // Stack for PushStyleVar()/PopStyleVar() ImVector FontStack; // Stack for PushFont()/PopFont() - ImVector OpenPopupStack; // Which popups are open (persistent) - ImVector 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; + ImVectorOpenPopupStack; // Which popups are open (persistent) + ImVectorBeginPopupStack; // 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 DragDropPayloadBufHeap; // We don't expose the ImVector<> directly - unsigned char DragDropPayloadBufLocal[8]; // Local buffer for small payloads + ImVector 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 TabBars; + ImVector CurrentTabBarStack; + ImVector 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 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 SettingsHandlers; // List of .ini settings handlers - ImVector 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 SettingsHandlers; // List of .ini settings handlers + ImChunkStream 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 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 ItemWidthStack; ImVector TextWrapPosStack; ImVectorGroupStack; - 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 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 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 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 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 + ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1) + ImRect NavRectRel[ImGuiNavLayer_COUNT]; // 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; // " + 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. @@ -1101,6 +1541,76 @@ struct ImGuiItemHoveredDataBackup void Restore() const { ImGuiWindow* window = GImGui->CurrentWindow; window->DC.LastItemId = LastItemId; window->DC.LastItemStatusFlags = LastItemStatusFlags; window->DC.LastItemRect = LastItemRect; window->DC.LastItemDisplayRect = LastItemDisplayRect; } }; +//----------------------------------------------------------------------------- +// 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 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. @@ -1108,29 +1618,35 @@ struct ImGuiItemHoveredDataBackup 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(const char* format, ImGuiDataType data_type, float v); " - template 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 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 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 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 IMGUI_API float SliderCalcRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, float power, float linear_zero_pos); template 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 7bf5938bd4..6d2c95d991 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 // toupper, isprint +#include // toupper #if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier #include // 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 // -#elif defined(__GNUC__) -#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 +#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 +#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 | * | .. (NOT on release) <-- MOST COMMON! (*) only if both click/release were over bounds - // PressedOnClick | | .. - // PressedOnRelease | | .. (NOT on release) - // PressedOnDoubleClick | | .. - // FIXME-NAV: We don't honor those different behaviors. - if ((flags & ImGuiButtonFlags_PressedOnClickRelease) && g.IO.MouseClicked[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) { - SetActiveID(id, window); - if (!(flags & ImGuiButtonFlags_NoNavFocus)) - SetFocusID(id, window); - 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_PressedOnClick) && g.IO.MouseClicked[0]) || ((flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseDoubleClicked[0])) + if ((flags & ImGuiButtonFlags_PressedOnRelease) && mouse_button_released != -1) { - pressed = true; - if (flags & ImGuiButtonFlags_NoHoldingActiveID) - ClearActiveID(); - else - SetActiveID(id, window); // Hold on ID - FocusWindow(window); - } - if ((flags & ImGuiButtonFlags_PressedOnRelease) && g.IO.MouseReleased[0]) - { - if (!((flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[0] >= g.IO.KeyRepeatDelay)) // Repeat mode trumps + // 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 - 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 + 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 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; + + // 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; - const bool horizontal = (direction == ImGuiLayoutType_Horizontal); const ImGuiStyle& style = g.Style; - const ImGuiID id = window->GetID(horizontal ? "#SCROLLX" : "#SCROLLY"); + const bool allow_interaction = (alpha >= 1.0f); + const bool horizontal = (axis == ImGuiAxis_X); - // 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; - - 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))); + 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 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; - // 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 + ImGuiContext& g = *GImGui; + IM_ASSERT(ImIsPowerOfTwo(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; + // 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; + + // 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(" |"); } - - // 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; - - 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)) + else if (flags & ImGuiSeparatorFlags_Horizontal) { - if (window->DC.ColumnsSet) - PushColumnClipRect(); - return; - } + // 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)); + ImGuiColumns* columns = (flags & ImGuiSeparatorFlags_SpanAllColumns) ? window->DC.CurrentColumns : NULL; + if (columns) + PushColumnsBackground(); - if (g.LogEnabled) - LogRenderedText(NULL, IM_NEWLINE "--------------------------------"); - - 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(); + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; 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)) - 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 @@ -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 -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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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)) + const bool hovered = ItemHoverable(frame_bb, 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.IO.MouseDoubleClicked[0] || g.NavInputId == id) + 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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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(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,8 +3506,120 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2 if (hovered) g.MouseCursor = ImGuiMouseCursor_TextInput; + // NB: we are only allowed to access 'edit_state' if we are the active widget. + ImGuiInputTextState* state = NULL; + if (g.InputTextState.ID == id) + state = &g.InputTextState; + + 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_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); + + 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) + { + // 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) + { + // 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); + + // 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); + } + + // 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; + + // 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)) + { + 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) + if (is_password && !is_displaying_hint) { const ImFontGlyph* glyph = g.Font->FindGlyph('*'); ImFont* password_font = &g.InputTextPasswordFont; @@ -3168,92 +3635,16 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2 PushFont(password_font); } - // NB: we are only allowed to access 'edit_state' if we are the active widget. - ImGuiInputTextState& edit_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_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)); - - 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) - { - if (g.ActiveId != id) - { - // 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))) - select_all = true; - } - SetActiveID(id, window); - SetFocusID(id, window); - FocusWindow(window); - if (!is_multiline && !(flags & ImGuiInputTextFlags_CallbackHistory)) - g.ActiveIdAllowNavDirFlags |= ((1 << ImGuiDir_Up) | (1 << ImGuiDir_Down)); - } - else if (io.MouseClicked[0]) - { - // Release focus when we click outside - clear_active_id = true; - } - - bool value_changed = false; - bool enter_pressed = false; + // Process mouse inputs and character inputs int backup_current_text_length = 0; - if (g.ActiveId == id) { - 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(); - } - - 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; + 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; - if (io.InputCharacters[0]) + // 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); + } + + // 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; + 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)) { 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) + 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 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; - - // 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; - + // 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 + 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) - { - edit_state.CursorAnim += io.DeltaTime; + 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; + 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) + { + buf_display = hint; + buf_display_end = hint + strlen(hint); + } + + // 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) + { + 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[1] = text_begin + ImMin(edit_state.StbState.select_start, edit_state.StbState.select_end); - searches_result_line_number[1] = -1; + 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(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)); + 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_editable) - g.PlatformImePos = ImVec2(cursor_screen_pos.x - 1, cursor_screen_pos.y - g.FontSize); + // 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); - ImU32 hue_color32 = ColorConvertFloat4ToU32(hue_color_f); - ImU32 col32_no_alpha = ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 1.0f)); + 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 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; - bool hovered, held, pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags); - if (!(flags & ImGuiTreeNodeFlags_Leaf)) + // 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 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)) - { - 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 - } - } + bool moving_toward_other_child_menu = false; - 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); + 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)) + { + // 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; + + 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); - if (!menu_is_open && want_open && g.OpenPopupStack.Size > g.CurrentPopupStack.Size) + 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.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 2b07dcc82c..ff2a85df42 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 9e12469be7..2077d02aed 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 f65deb5034..193338afb2 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/libigl/igl/copyleft/cgal/SelfIntersectMesh.h b/src/libigl/igl/copyleft/cgal/SelfIntersectMesh.h index 5a70fc39e7..39a4e1a7e3 100644 --- a/src/libigl/igl/copyleft/cgal/SelfIntersectMesh.h +++ b/src/libigl/igl/copyleft/cgal/SelfIntersectMesh.h @@ -635,13 +635,30 @@ inline bool igl::copyleft::cgal::SelfIntersectMesh< { using namespace std; + auto opposite_vertex = [](const Index a0, const Index a1) { + // get opposite index of A + int a2=-1; + for(int c=0;c<3;++c) + if(c!=a0 && c!=a1) { + a2 = c; + break; + } + assert(a2 != -1); + return a2; + }; + // must be co-planar - if( - A.supporting_plane() != B.supporting_plane() && - A.supporting_plane() != B.supporting_plane().opposite()) - { + Index a2 = opposite_vertex(shared[0].first, shared[1].first); + if (! B.supporting_plane().has_on(A.vertex(a2))) return false; - } + + Index b2 = opposite_vertex(shared[0].second, shared[1].second); + + if (int(CGAL::coplanar_orientation(A.vertex(shared[0].first), A.vertex(shared[1].first), A.vertex(a2))) * + int(CGAL::coplanar_orientation(B.vertex(shared[0].second), B.vertex(shared[1].second), B.vertex(b2))) < 0) + // There is certainly no self intersection as the non-shared triangle vertices lie on opposite sides of the shared edge. + return false; + // Since A and B are non-degenerate the intersection must be a polygon // (triangle). Either // - the vertex of A (B) opposite the shared edge of lies on B (A), or @@ -650,22 +667,10 @@ inline bool igl::copyleft::cgal::SelfIntersectMesh< // Determine if the vertex opposite edge (a0,a1) in triangle A lies in // (intersects) triangle B const auto & opposite_point_inside = []( - const Triangle_3 & A, const Index a0, const Index a1, const Triangle_3 & B) + const Triangle_3 & A, const Index a2, const Triangle_3 & B) -> bool { - // get opposite index - Index a2 = -1; - for(int c = 0;c<3;c++) - { - if(c != a0 && c != a1) - { - a2 = c; - break; - } - } - assert(a2 != -1); - bool ret = CGAL::do_intersect(A.vertex(a2),B); - return ret; + return CGAL::do_intersect(A.vertex(a2),B); }; // Determine if edge opposite vertex va in triangle A intersects edge @@ -681,8 +686,8 @@ inline bool igl::copyleft::cgal::SelfIntersectMesh< }; if( - !opposite_point_inside(A,shared[0].first,shared[1].first,B) && - !opposite_point_inside(B,shared[0].second,shared[1].second,A) && + !opposite_point_inside(A,a2,B) && + !opposite_point_inside(B,b2,A) && !opposite_edges_intersect(A,shared[0].first,B,shared[1].second) && !opposite_edges_intersect(A,shared[1].first,B,shared[0].second)) { @@ -936,4 +941,4 @@ inline void igl::copyleft::cgal::SelfIntersectMesh< //process_chunk(0, candidate_triangle_pairs.size()); } -#endif +#endif \ No newline at end of file diff --git a/src/libnest2d/CMakeLists.txt b/src/libnest2d/CMakeLists.txt index 6484da3d06..592ab069c3 100644 --- a/src/libnest2d/CMakeLists.txt +++ b/src/libnest2d/CMakeLists.txt @@ -24,7 +24,7 @@ set(LIBNEST2D_SRCFILES src/libnest2d.cpp ) -add_library(libnest2d ${LIBNEST2D_SRCFILES}) +add_library(libnest2d STATIC ${LIBNEST2D_SRCFILES}) target_include_directories(libnest2d PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) target_link_libraries(libnest2d PUBLIC clipper NLopt::nlopt TBB::tbb Boost::boost) diff --git a/src/libnest2d/LICENSE.txt b/src/libnest2d/LICENSE.txt index dba13ed2dd..07b1d92c0e 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. 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. - - - Copyright (C) - - 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 . - -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 -. + + 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 57da6ec12e..dd80322bcc 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 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 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(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 72e239a707..c447cfcd93 100644 --- a/src/libnest2d/include/libnest2d/geometry_traits.hpp +++ b/src/libnest2d/include/libnest2d/geometry_traits.hpp @@ -982,6 +982,9 @@ template inline double area(const S& poly, const PolygonTag& ) }); } +template +inline double area(const RawShapes& shapes, const MultiPolygonTag&); + template // 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 b6d7fcdcf9..5eef28c407 100644 --- a/src/libnest2d/include/libnest2d/libnest2d.hpp +++ b/src/libnest2d/include/libnest2d/libnest2d.hpp @@ -27,6 +27,7 @@ using Coord = TCoord; using Box = _Box; using Segment = _Segment; using Circle = _Circle; +using MultiPolygon = TMultiShape; using Item = _Item; using Rectangle = _Rectangle; diff --git a/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp b/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp index 0030287586..6cdaadd257 100644 --- a/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp +++ b/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp @@ -278,6 +278,8 @@ template class EdgeCache { inline Vertex coords(const ContourCache& cache, double distance) const { assert(distance >= .0 && distance <= 1.0); + if (cache.distances.empty() || cache.emap.empty()) return Vertex{}; + if (distance > 1.0) distance = std::fmod(distance, 1.0); // distance is from 0.0 to 1.0, we scale it up to the full length of // the circumference @@ -526,15 +528,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(bb.width()) - bin.width(); + auto hdiff = TCompute(bb.height()) - bin.height(); + double diff = .0; + if(wdiff > 0) diff += double(wdiff); + if(hdiff > 0) diff += double(hdiff); + return diff; } @@ -1116,12 +1115,8 @@ private: for(Item& item : items_) item.translate(d); } - void setInitialPosition(Item& item) { - auto sh = item.rawShape(); - sl::translate(sh, item.translation()); - sl::rotate(sh, item.rotation()); - - Box bb = sl::boundingBox(sh); + void setInitialPosition(Item& item) { + Box bb = item.boundingBox(); Vertex ci, cb; auto bbin = sl::boundingBox(bin_); diff --git a/src/libnest2d/include/libnest2d/selections/selection_boilerplate.hpp b/src/libnest2d/include/libnest2d/selections/selection_boilerplate.hpp index 8e65bafe98..e963782961 100644 --- a/src/libnest2d/include/libnest2d/selections/selection_boilerplate.hpp +++ b/src/libnest2d/include/libnest2d/selections/selection_boilerplate.hpp @@ -43,7 +43,10 @@ protected: Placer p{bin}; p.configure(pcfg); - if (itm.area() <= 0 || !p.pack(cpy)) it = c.erase(it); + if (itm.area() <= 0 || !p.pack(cpy)) { + static_cast(*it).binId(BIN_ID_UNSET); + it = c.erase(it); + } else it++; } } diff --git a/src/libnest2d/tools/svgtools.hpp b/src/libnest2d/tools/svgtools.hpp index e1ed1ad05a..2a05b551d1 100644 --- a/src/libnest2d/tools/svgtools.hpp +++ b/src/libnest2d/tools/svgtools.hpp @@ -5,7 +5,7 @@ #include #include -#include +#include namespace libnest2d { namespace svg { @@ -48,23 +48,28 @@ public: conf_.width = static_cast(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( - 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(tsh, - 1.0/conf_.mm_in_coord_units) + "\n"; + currentLayer() += + shapelike::serialize(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 0000000000..964133faae --- /dev/null +++ b/src/libslic3r/AABBTreeIndirect.hpp @@ -0,0 +1,732 @@ +// 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 +// while the implicit balanced tree representation and memory optimizations are Vojtech's. + +#ifndef slic3r_AABBTreeIndirect_hpp_ +#define slic3r_AABBTreeIndirect_hpp_ + +#include +#include +#include +#include + +#include "Utils.hpp" // for next_highest_power_of_2() + +extern "C" +{ +// Ray-Triangle Intersection Test Routines by Tomas Moller, May 2000 +#include +} +// Definition of the ray intersection hit structure. +#include + +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 +class Tree +{ +public: + static constexpr int NumDimensions = ANumDimensions; + using CoordType = ACoordType; + using VectorType = Eigen::Matrix; + using BoundingBox = Eigen::AlignedBox; + // 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 + 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 + void build(std::vector &&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& 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 + void build(const std::vector &input) + { + std::vector 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 + void build_recursive(std::vector &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 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 + void partition_input(std::vector &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 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 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 + struct RayIntersector { + using VertexType = AVertexType; + using IndexedFaceType = AIndexedFaceType; + using TreeType = ATreeType; + using VectorType = AVectorType; + + const std::vector &vertices; + const std::vector &faces; + const TreeType &tree; + + const VectorType origin; + const VectorType dir; + const VectorType invdir; + }; + + template + struct RayIntersectorHits : RayIntersector { + std::vector 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 + inline bool ray_box_intersect_invdir( + const Eigen::MatrixBase &origin, + const Eigen::MatrixBase &inv_dir, + Eigen::AlignedBox 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 + std::enable_if_t::value && std::is_same::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(origin.data()), const_cast(dir.data()), + const_cast(v0.data()), const_cast(v1.data()), const_cast(v2.data()), + &t, &u, &v); + } + + template + std::enable_if_t::value && !std::is_same::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; + Vector w0 = v0.template cast(); + Vector w1 = v1.template cast(); + Vector w2 = v2.template cast(); + return intersect_triangle1(const_cast(origin.data()), const_cast(dir.data()), + w0.data(), w1.data(), w2.data(), &t, &u, &v); + } + + template + std::enable_if_t::value && std::is_same::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; + Vector o = origin.template cast(); + Vector d = dir.template cast(); + return intersect_triangle1(o.data(), d.data(), const_cast(v0.data()), const_cast(v1.data()), const_cast(v2.data()), &t, &u, &v); + } + + template + std::enable_if_t::value && ! std::is_same::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; + Vector o = origin.template cast(); + Vector d = dir.template cast(); + Vector w0 = v0.template cast(); + Vector w1 = v1.template cast(); + Vector w2 = v2.template cast(); + return intersect_triangle1(o.data(), d.data(), w0.data(), w1.data(), w2.data(), &t, &u, &v); + } + + template + 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(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 + 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(0), std::numeric_limits::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 + struct IndexedTriangleSetDistancer { + using VertexType = AVertexType; + using IndexedFaceType = AIndexedFaceType; + using TreeType = ATreeType; + using VectorType = AVectorType; + + const std::vector &vertices; + const std::vector &faces; + const TreeType &tree; + + const VectorType origin; + }; + + // Real-time collision detection, Ericson, Chapter 5 + template + 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 + 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 &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( + distancer.origin, + distancer.vertices[triangle(0)].template cast(), + distancer.vertices[triangle(1)].template cast(), + distancer.vertices[triangle(2)].template cast()); + 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())) + look_left(); + if (node_right.bbox.contains(distancer.origin.template cast())) + 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 +inline Tree<3, typename VertexType::Scalar> build_aabb_tree_over_indexed_triangle_set( + // Indexed triangle set - 3D vertices. + const std::vector &vertices, + // Indexed triangle set - triangular faces, references to vertices. + const std::vector &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 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 +inline bool intersect_ray_first_hit( + // Indexed triangle set - 3D vertices. + const std::vector &vertices, + // Indexed triangle set - triangular faces, references to vertices. + const std::vector &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 { + 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::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 +inline bool intersect_ray_all_hits( + // Indexed triangle set - 3D vertices. + const std::vector &vertices, + // Indexed triangle set - triangular faces, references to vertices. + const std::vector &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 &hits) +{ + auto ray_intersector = detail::RayIntersectorHits { + 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 +inline typename VectorType::Scalar squared_distance_to_indexed_triangle_set( + // Indexed triangle set - 3D vertices. + const std::vector &vertices, + // Indexed triangle set - triangular faces, references to vertices. + const std::vector &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 &hit_point_out) +{ + using Scalar = typename VectorType::Scalar; + auto distancer = detail::IndexedTriangleSetDistancer + { 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::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 +inline bool is_any_triangle_in_radius( + // Indexed triangle set - 3D vertices. + const std::vector &vertices, + // Indexed triangle set - triangular faces, references to vertices. + const std::vector &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 + { 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(); +} + +} // namespace AABBTreeIndirect +} // namespace Slic3r + +#endif /* slic3r_AABBTreeIndirect_hpp_ */ diff --git a/src/slic3r/GUI/AppConfig.cpp b/src/libslic3r/AppConfig.cpp similarity index 54% rename from src/slic3r/GUI/AppConfig.cpp rename to src/libslic3r/AppConfig.cpp index 6b3f54f3a7..1f1b1623b0 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 -#include -#include #include -#include #include #include -#include +#include +#include #include #include #include -#include -#include +#include #include -#include +#include -#include -#include "I18N.hpp" +//#include +//#include "I18N.hpp" namespace Slic3r { @@ -40,48 +38,99 @@ 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 (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("version_check").empty()) - set("version_check", "1"); - if (get("preset_update").empty()) - set("preset_update", "1"); + if (get("show_drop_project_dialog").empty()) + set("show_drop_project_dialog", "1"); + if (get("drop_project_action").empty()) + set("drop_project_action", "1"); - // remove old 'use_legacy_opengl' parameter from this config, if present - if (!get("use_legacy_opengl").empty()) - erase("", "use_legacy_opengl"); + 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"); #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("use_custom_toolbar_size").empty()) - set("use_custom_toolbar_size", "0"); + if (get("remember_output_path").empty()) + set("remember_output_path", "1"); - if (get("custom_toolbar_size").empty()) - set("custom_toolbar_size", "100"); + 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 ENABLE_ENVIRONMENT_MAP + if (get("use_environment_map").empty()) + set("use_environment_map", "0"); +#endif // ENABLE_ENVIRONMENT_MAP + + if (get("use_inches").empty()) + set("use_inches", "0"); + } + + if (get("seq_top_layer_only").empty()) + set("seq_top_layer_only", "1"); if (get("use_perspective_camera").empty()) set("use_perspective_camera", "1"); + if (get("use_free_camera").empty()) + set("use_free_camera", "0"); + + if (get("reverse_mouse_wheel_zoom").empty()) + set("reverse_mouse_wheel_zoom", "0"); + + if (get("show_splash_screen").empty()) + set("show_splash_screen", "1"); + + if (get("default_action_on_close_application").empty()) + set("default_action_on_close_application", "none"); // , "discard" or "save" + + if (get("default_action_on_select_preset").empty()) + set("default_action_on_select_preset", "none"); // , "transfer", "discard" or "save" + // Remove legacy window positions/sizes erase("", "main_frame_maximized"); erase("", "main_frame_pos"); @@ -91,7 +140,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; @@ -101,10 +150,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 manualy delete the file to recover from the error. Your user profiles will not be affected.")) + + "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. @@ -147,13 +201,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 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(); @@ -161,7 +237,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 &kvp : m_storage[""]) c << kvp.first << " = " << kvp.second << std::endl; @@ -271,6 +350,33 @@ void AppConfig::set_recent_projects(const std::vector& recent_proje } } +void AppConfig::set_mouse_device(const std::string& name, double translation_speed, double translation_deadzone, float rotation_speed, float rotation_deadzone, double zoom_speed, bool swap_yz) +{ + std::string key = std::string("mouse_device:") + name; + auto it = m_storage.find(key); + if (it == m_storage.end()) + it = m_storage.insert(std::map>::value_type(key, std::map())).first; + + it->second.clear(); + it->second["translation_speed"] = std::to_string(translation_speed); + it->second["translation_deadzone"] = std::to_string(translation_deadzone); + it->second["rotation_speed"] = std::to_string(rotation_speed); + it->second["rotation_deadzone"] = std::to_string(rotation_deadzone); + it->second["zoom_speed"] = std::to_string(zoom_speed); + it->second["swap_yz"] = swap_yz ? "1" : "0"; +} + +std::vector AppConfig::get_mouse_device_names() const +{ + static constexpr const char *prefix = "mouse_device:"; + static const size_t prefix_len = strlen(prefix); + std::vector out; + for (const std::pair>& key_value_pair : m_storage) + 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; +} + void AppConfig::update_config_dir(const std::string &dir) { this->set("recent", "config_directory", dir); @@ -280,9 +386,10 @@ void AppConfig::update_skein_dir(const std::string &dir) { this->set("recent", "skein_directory", dir); } - +/* std::string AppConfig::get_last_output_dir(const std::string &alt) const { + const auto it = m_storage.find(""); if (it != m_storage.end()) { const auto it2 = it->second.find("last_output_path"); @@ -297,6 +404,26 @@ void AppConfig::update_last_output_dir(const std::string &dir) { this->set("", "last_output_path", dir); } +*/ +std::string AppConfig::get_last_output_dir(const std::string& alt, const bool removable) const +{ + std::string s1 = (removable ? "last_output_path_removable" : "last_output_path"); + std::string s2 = (removable ? "remember_output_path_removable" : "remember_output_path"); + const auto it = m_storage.find(""); + if (it != m_storage.end()) { + const auto it2 = it->second.find(s1); + const auto it3 = it->second.find(s2); + if (it2 != it->second.end() && it3 != it->second.end() && !it2->second.empty() && it3->second == "1") + return it2->second; + } + return alt; +} + +void AppConfig::update_last_output_dir(const std::string& dir, const bool removable) +{ + this->set("", (removable ? "last_output_path_removable" : "last_output_path"), dir); +} + void AppConfig::reset_selections() { @@ -307,13 +434,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 @@ -324,7 +456,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 similarity index 65% rename from src/slic3r/GUI/AppConfig.hpp rename to src/libslic3r/AppConfig.hpp index 97c369ab64..c8ccd18cd8 100644 --- a/src/slic3r/GUI/AppConfig.hpp +++ b/src/libslic3r/AppConfig.hpp @@ -5,6 +5,8 @@ #include #include +#include + #include "libslic3r/Config.hpp" #include "libslic3r/Semver.hpp" @@ -13,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(); @@ -27,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(); @@ -52,7 +62,13 @@ public: std::string get(const std::string &key) const { std::string value; this->get("", key, value); return value; } void set(const std::string §ion, const std::string &key, const std::string &value) - { + { +#ifndef _NDEBUG + std::string key_trimmed = key; + boost::trim_all(key_trimmed); + assert(key_trimmed == key); + assert(! key_trimmed.empty()); +#endif // _NDEBUG std::string &old = m_storage[section][key]; if (old != value) { old = value; @@ -102,8 +118,10 @@ public: void update_config_dir(const std::string &dir); void update_skein_dir(const std::string &dir); - std::string get_last_output_dir(const std::string &alt) const; - void update_last_output_dir(const std::string &dir); + //std::string get_last_output_dir(const std::string &alt) const; + //void update_last_output_dir(const std::string &dir); + std::string get_last_output_dir(const std::string& alt, const bool removable = false) const; + void update_last_output_dir(const std::string &dir, const bool removable = false); // reset the current print / filament / printer selections, so that // the PresetBundle::load_selections(const AppConfig &config) call will select @@ -111,29 +129,61 @@ 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 get_recent_projects() const; void set_recent_projects(const std::vector& recent_projects); + void set_mouse_device(const std::string& name, double translation_speed, double translation_deadzone, float rotation_speed, float rotation_deadzone, double zoom_speed, bool swap_yz); + std::vector get_mouse_device_names() const; + bool get_mouse_device_translation_speed(const std::string& name, double& speed) const + { return get_3dmouse_device_numeric_value(name, "translation_speed", speed); } + bool get_mouse_device_translation_deadzone(const std::string& name, double& deadzone) const + { return get_3dmouse_device_numeric_value(name, "translation_deadzone", deadzone); } + bool get_mouse_device_rotation_speed(const std::string& name, float& speed) const + { return get_3dmouse_device_numeric_value(name, "rotation_speed", speed); } + bool get_mouse_device_rotation_deadzone(const std::string& name, float& deadzone) const + { return get_3dmouse_device_numeric_value(name, "rotation_deadzone", deadzone); } + bool get_mouse_device_zoom_speed(const std::string& name, double& speed) const + { return get_3dmouse_device_numeric_value(name, "zoom_speed", speed); } + bool get_mouse_device_swap_yz(const std::string& name, bool& swap) const + { return get_3dmouse_device_numeric_value(name, "swap_yz", swap); } + static const std::string SECTION_FILAMENTS; static const std::string SECTION_MATERIALS; + private: + template + bool get_3dmouse_device_numeric_value(const std::string &device_name, const char *parameter_name, T &out) const + { + std::string key = std::string("mouse_device:") + device_name; + auto it = m_storage.find(key); + if (it == m_storage.end()) + return false; + auto it_val = it->second.find(parameter_name); + if (it_val == it->second.end()) + return false; + out = T(::atof(it_val->second.c_str())); + return true; + } + + // Type of application: Editor or GCodeViewer + EAppMode m_mode { EAppMode::Editor }; // Map of section, name -> value std::map> m_storage; // Map of enabled vendors / models / variants diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp index 3fa7e1841a..6ae7dd6a2e 100644 --- a/src/libslic3r/Arrange.cpp +++ b/src/libslic3r/Arrange.cpp @@ -1,7 +1,7 @@ #include "Arrange.hpp" -#include "Geometry.hpp" #include "SVG.hpp" -#include "MTUtils.hpp" + +#include "BoundingBox.hpp" #include #include @@ -52,8 +52,8 @@ template struct NfpImpl namespace Slic3r { template, int...EigenArgs> -inline SLIC3R_CONSTEXPR Eigen::Matrix unscaled( - const ClipperLib::IntPoint &v) SLIC3R_NOEXCEPT +inline constexpr Eigen::Matrix unscaled( + const ClipperLib::IntPoint &v) noexcept { return Eigen::Matrix{unscaled(v.X), unscaled(v.Y)}; @@ -83,7 +83,7 @@ const double BIG_ITEM_TRESHOLD = 0.02; // Fill in the placer algorithm configuration with values carefully chosen for // Slic3r. template -void fillConfig(PConf& pcfg) { +void fill_config(PConf& pcfg) { // Align the arranged pile into the center of the bin pcfg.alignment = PConf::Alignment::CENTER; @@ -105,7 +105,7 @@ void fillConfig(PConf& pcfg) { // 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& result, const Box &binbb) +static double fixed_overfit(const std::tuple& result, const Box &binbb) { double score = std::get<0>(result); Box pilebb = std::get<1>(result); @@ -312,7 +312,7 @@ public: , m_bin_area(sl::area(bin)) , m_norm(std::sqrt(m_bin_area)) { - fillConfig(m_pconf); + fill_config(m_pconf); // Set up a callback that is called just before arranging starts // This functionality is provided by the Nester class (m_pack). @@ -363,6 +363,9 @@ public: m_item_count = 0; } + PConfig& config() { return m_pconf; } + const PConfig& config() const { return m_pconf; } + inline void preload(std::vector& fixeditems) { m_pconf.alignment = PConfig::Alignment::DONT_ALIGN; auto bb = sl::boundingBox(m_bin); @@ -393,11 +396,14 @@ template<> std::function AutoArranger::get_objfn() double score = std::get<0>(result); auto& fullbb = std::get<1>(result); - double miss = Placer::overfit(fullbb, m_bin); + auto bin = m_bin; + sl::offset(bin, -EPSILON * (m_bin.width() + m_bin.height())); + + double miss = Placer::overfit(fullbb, bin); miss = miss > 0? miss : 0; score += miss*miss; - return score; + return score; }; } @@ -438,127 +444,6 @@ std::function AutoArranger::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 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 void remove_large_items(std::vector &items, Bin &&bin) { auto it = items.begin(); @@ -572,12 +457,12 @@ void _arrange( std::vector & shapes, std::vector & excludes, const BinT & bin, - coord_t minobjd, + const ArrangeParams & params, std::function progressfn, std::function stopfn) { // Integer ceiling the min distance from the bed perimeters - coord_t md = minobjd - 2 * scaled(0.1 + EPSILON); + coord_t md = params.min_obj_distance; md = (md % 2) ? md / 2 + 1 : md / 2; auto corrected_bin = bin; @@ -585,7 +470,10 @@ void _arrange( AutoArranger arranger{corrected_bin, progressfn, stopfn}; - auto infl = coord_t(std::ceil(minobjd / 2.0)); + arranger.config().accuracy = params.accuracy; + arranger.config().parallel = params.parallel; + + 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); @@ -603,44 +491,106 @@ void _arrange( 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 progressind, - std::function 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(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) +{ + 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 ¢er, const Points& points) { + std::vector vertex_distances; + double avg_dist = 0; + + for (auto pt : 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 = {}; + break; + } + } + + return ret; +} + +// Create Item from Arrangeable +static void process_arrangeable(const ArrangePolygon &arrpoly, + std::vector & outp) +{ + Polygon p = arrpoly.poly.contour; + const Vec2crd &offs = arrpoly.translation; + double rotation = arrpoly.rotation; + + if (p.is_counter_clockwise()) p.reverse(); + + clppr::Polygon clpath(Slic3rMultiPoint_to_ClipperPath(p)); + + if (!clpath.Contour.empty()) { + 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<> +void arrange(ArrangePolygons & items, + const ArrangePolygons &excludes, + const Points & bed, + const ArrangeParams & params) +{ + if (bed.empty()) + arrange(items, excludes, InfiniteBed{}, params); + else if (bed.size() == 1) + arrange(items, excludes, InfiniteBed{bed.front()}, params); + 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) + arrange(items, excludes, bb, params); + else if (!std::isnan(circ.radius())) + arrange(items, excludes, circ, params); + else + arrange(items, excludes, Polygon(bed), params); + } +} + +template +void arrange(ArrangePolygons & arrangables, + const ArrangePolygons &excludes, + const BedT & bed, + const ArrangeParams & params) { namespace clppr = ClipperLib; std::vector items, fixeditems; items.reserve(arrangables.size()); - // Create Item from Arrangeable - auto process_arrangeable = [](const ArrangePolygon &arrpoly, - std::vector & outp) - { - Polygon p = arrpoly.poly.contour; - const Vec2crd &offs = arrpoly.translation; - double rotation = arrpoly.rotation; - - if (p.is_counter_clockwise()) p.reverse(); - - clppr::Polygon clpath(Slic3rMultiPoint_to_ClipperPath(p)); - - if (!clpath.Contour.empty()) { - 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); - }; - for (ArrangePolygon &arrangeable : arrangables) process_arrangeable(arrangeable, items); @@ -649,45 +599,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(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 +612,10 @@ void arrange(ArrangePolygons & arrangables, } } -// Arrange, without the fixed items (excludes) -void arrange(ArrangePolygons & inp, - coord_t min_d, - const BedShapeHint & bedhint, - std::function prfn, - std::function stopfn) -{ - arrange(inp, {}, min_d, bedhint, prfn, stopfn); -} +template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const BoundingBox &bed, const ArrangeParams ¶ms); +template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const CircleBed &bed, const ArrangeParams ¶ms); +template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const Polygon &bed, const ArrangeParams ¶ms); +template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const InfiniteBed &bed, const ArrangeParams ¶ms); } // namespace arr } // namespace Slic3r diff --git a/src/libslic3r/Arrange.hpp b/src/libslic3r/Arrange.hpp index 1cfe1c907d..7630ab3e8e 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 allowed_rotations = {0.}; + /// Optional setter function which can store arbitrary data in its closure std::function setter = nullptr; @@ -140,6 +66,30 @@ struct ArrangePolygon { using ArrangePolygons = std::vector; +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 = 0.65f; + + /// Allow parallel execution. + bool parallel = true; + + /// Progress indicator callback called when an object gets packed. + /// The unsigned argument is the number of items remaining to pack. + std::function progressind; + + /// A predicate returning true if abort is needed. + std::function stopcondition; + + ArrangeParams() = default; + explicit ArrangeParams(coord_t md) : min_obj_distance(md) {} +}; + /** * \brief Arranges the input polygons. * @@ -150,33 +100,23 @@ using ArrangePolygons = std::vector; * \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 progressind = nullptr, - std::function stopcondition = nullptr); +template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const TBed &bed, const ArrangeParams ¶ms = {}); -/// 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 progressind = nullptr, - std::function stopcondition = nullptr); +// 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 ¶ms); + +extern template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const BoundingBox &bed, const ArrangeParams ¶ms); +extern template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const CircleBed &bed, const ArrangeParams ¶ms); +extern template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const Polygon &bed, const ArrangeParams ¶ms); +extern template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const InfiniteBed &bed, const ArrangeParams ¶ms); + +inline void arrange(ArrangePolygons &items, const Points &bed, const ArrangeParams ¶ms = {}) { arrange(items, {}, bed, params); } +inline void arrange(ArrangePolygons &items, const BoundingBox &bed, const ArrangeParams ¶ms = {}) { arrange(items, {}, bed, params); } +inline void arrange(ArrangePolygons &items, const CircleBed &bed, const ArrangeParams ¶ms = {}) { arrange(items, {}, bed, params); } +inline void arrange(ArrangePolygons &items, const Polygon &bed, const ArrangeParams ¶ms = {}) { arrange(items, {}, bed, params); } +inline void arrange(ArrangePolygons &items, const InfiniteBed &bed, const ArrangeParams ¶ms = {}) { arrange(items, {}, bed, params); } + +}} // namespace Slic3r::arrangement -} // arr -} // Slic3r #endif // MODELARRANGE_HPP diff --git a/src/libslic3r/BoundingBox.cpp b/src/libslic3r/BoundingBox.cpp index d3cca7ff24..eb4e042a08 100644 --- a/src/libslic3r/BoundingBox.cpp +++ b/src/libslic3r/BoundingBox.cpp @@ -11,17 +11,6 @@ template BoundingBoxBase::BoundingBoxBase(const std::vector &point template BoundingBox3Base::BoundingBox3Base(const std::vector &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::merge(const PointClass &point) } } template void BoundingBoxBase::merge(const Point &point); +template void BoundingBoxBase::merge(const Vec2f &point); template void BoundingBoxBase::merge(const Vec2d &point); template void @@ -112,6 +102,7 @@ BoundingBoxBase::merge(const BoundingBoxBase &bb) } } template void BoundingBoxBase::merge(const BoundingBoxBase &bb); +template void BoundingBoxBase::merge(const BoundingBoxBase &bb); template void BoundingBoxBase::merge(const BoundingBoxBase &bb); template void @@ -126,6 +117,7 @@ BoundingBox3Base::merge(const PointClass &point) this->defined = true; } } +template void BoundingBox3Base::merge(const Vec3f &point); template void BoundingBox3Base::merge(const Vec3d &point); template void @@ -158,6 +150,7 @@ BoundingBoxBase::size() const return PointClass(this->max(0) - this->min(0), this->max(1) - this->min(1)); } template Point BoundingBoxBase::size() const; +template Vec2f BoundingBoxBase::size() const; template Vec2d BoundingBoxBase::size() const; template PointClass @@ -165,6 +158,7 @@ BoundingBox3Base::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::size() const; template Vec3d BoundingBox3Base::size() const; template double BoundingBoxBase::radius() const @@ -211,6 +205,7 @@ BoundingBoxBase::center() const return (this->min + this->max) / 2; } template Point BoundingBoxBase::center() const; +template Vec2f BoundingBoxBase::center() const; template Vec2d BoundingBoxBase::center() const; template PointClass @@ -218,6 +213,7 @@ BoundingBox3Base::center() const { return (this->min + this->max) / 2; } +template Vec3f BoundingBox3Base::center() const; template Vec3d BoundingBox3Base::center() const; template coordf_t @@ -226,6 +222,7 @@ BoundingBox3Base::max_size() const PointClass s = size(); return std::max(s(0), std::max(s(1), s(2))); } +template coordf_t BoundingBox3Base::max_size() const; template coordf_t BoundingBox3Base::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 4fbe72163c..065476cb28 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& points) : min(PointClass::Zero()), max(PointClass::Zero()) { - if (points.empty()) - throw std::invalid_argument("Empty point set supplied to BoundingBoxBase constructor"); - - typename std::vector::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::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); @@ -63,10 +68,12 @@ public: BoundingBox3Base(const PointClass &pmin, const PointClass &pmax) : BoundingBoxBase(pmin, pmax) { if (pmin(2) >= pmax(2)) BoundingBoxBase::defined = false; } + BoundingBox3Base(const PointClass &p1, const PointClass &p2, const PointClass &p3) : + BoundingBoxBase(p1, p1) { merge(p2); merge(p3); } BoundingBox3Base(const std::vector& 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::const_iterator it = points.begin(); this->min = *it; this->max = *it; @@ -107,24 +114,32 @@ extern template void BoundingBoxBase::scale(double factor); extern template void BoundingBoxBase::offset(coordf_t delta); extern template void BoundingBoxBase::offset(coordf_t delta); extern template void BoundingBoxBase::merge(const Point &point); +extern template void BoundingBoxBase::merge(const Vec2f &point); extern template void BoundingBoxBase::merge(const Vec2d &point); extern template void BoundingBoxBase::merge(const Points &points); extern template void BoundingBoxBase::merge(const Pointfs &points); extern template void BoundingBoxBase::merge(const BoundingBoxBase &bb); +extern template void BoundingBoxBase::merge(const BoundingBoxBase &bb); extern template void BoundingBoxBase::merge(const BoundingBoxBase &bb); extern template Point BoundingBoxBase::size() const; +extern template Vec2f BoundingBoxBase::size() const; extern template Vec2d BoundingBoxBase::size() const; extern template double BoundingBoxBase::radius() const; extern template double BoundingBoxBase::radius() const; extern template Point BoundingBoxBase::center() const; +extern template Vec2f BoundingBoxBase::center() const; extern template Vec2d BoundingBoxBase::center() const; +extern template void BoundingBox3Base::merge(const Vec3f &point); extern template void BoundingBox3Base::merge(const Vec3d &point); extern template void BoundingBox3Base::merge(const Pointf3s &points); extern template void BoundingBox3Base::merge(const BoundingBox3Base &bb); +extern template Vec3f BoundingBox3Base::size() const; extern template Vec3d BoundingBox3Base::size() const; extern template double BoundingBox3Base::radius() const; extern template void BoundingBox3Base::offset(coordf_t delta); +extern template Vec3f BoundingBox3Base::center() const; extern template Vec3d BoundingBox3Base::center() const; +extern template coordf_t BoundingBox3Base::max_size() const; extern template coordf_t BoundingBox3Base::max_size() const; class BoundingBox : public BoundingBoxBase @@ -143,7 +158,6 @@ public: BoundingBox() : BoundingBoxBase() {} BoundingBox(const Point &pmin, const Point &pmax) : BoundingBoxBase(pmin, pmax) {} BoundingBox(const Points &points) : BoundingBoxBase(points) {} - BoundingBox(const Lines &lines); friend BoundingBox get_extents_rotated(const Points &points, double angle); }; @@ -186,6 +200,25 @@ inline bool empty(const BoundingBox3Base &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 +auto cast(const BoundingBoxBase &b) +{ + return BoundingBoxBase>{b.min.template cast(), + b.max.template cast()}; +} + +template +auto cast(const BoundingBox3Base &b) +{ + return BoundingBox3Base>{b.min.template cast(), + b.max.template cast()}; +} + } // namespace Slic3r // Serialization through the Cereal library diff --git a/src/libslic3r/BridgeDetector.cpp b/src/libslic3r/BridgeDetector.cpp index ce7c960fa3..bf8907c3fe 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 c8e259caa9..150d66d756 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) @@ -9,6 +9,11 @@ if (MINGW) add_compile_options(-Wa,-mbig-obj) endif () +set(OpenVDBUtils_SOURCES "") +if (TARGET OpenVDB::openvdb) + set(OpenVDBUtils_SOURCES OpenVDBUtils.cpp OpenVDBUtils.hpp) +endif() + add_library(libslic3r STATIC pchheader.cpp pchheader.hpp @@ -41,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 @@ -55,10 +62,9 @@ add_library(libslic3r STATIC Fill/FillRectilinear.hpp Fill/FillRectilinear2.cpp Fill/FillRectilinear2.hpp - Fill/FillRectilinear3.cpp - Fill/FillRectilinear3.hpp Flow.cpp Flow.hpp + format.hpp Format/3mf.cpp Format/3mf.hpp Format/AMF.cpp @@ -71,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 @@ -81,24 +87,24 @@ 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.cpp GCode.hpp GCodeReader.cpp GCodeReader.hpp # GCodeSender.cpp # GCodeSender.hpp - GCodeTimeEstimator.cpp - GCodeTimeEstimator.hpp GCodeWriter.cpp GCodeWriter.hpp Geometry.cpp @@ -114,6 +120,10 @@ add_library(libslic3r STATIC Line.hpp Model.cpp Model.hpp + ModelArrange.hpp + ModelArrange.cpp + CustomGCode.cpp + CustomGCode.hpp Arrange.hpp Arrange.cpp MotionPlanner.cpp @@ -135,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 @@ -143,15 +159,19 @@ add_library(libslic3r STATIC PrintConfig.hpp PrintObject.cpp PrintRegion.cpp + PNGRead.hpp + PNGRead.cpp Semver.cpp ShortestPath.cpp ShortestPath.hpp SLAPrint.cpp + SLAPrintSteps.cpp + SLAPrintSteps.hpp SLAPrint.hpp - SLA/SLAAutoSupports.hpp - SLA/SLAAutoSupports.cpp Slicing.cpp Slicing.hpp + SlicesToTriangleMesh.hpp + SlicesToTriangleMesh.cpp SlicingAdaptive.cpp SlicingAdaptive.hpp SupportMaterial.cpp @@ -167,49 +187,113 @@ 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 MinAreaBoundingBox.cpp miniz_extension.hpp miniz_extension.cpp - SLA/SLACommon.hpp - SLA/SLABoilerPlate.hpp - SLA/SLAPad.hpp - SLA/SLAPad.cpp - SLA/SLASupportTreeBuilder.hpp - SLA/SLASupportTreeBuildsteps.hpp - SLA/SLASupportTreeBuildsteps.cpp - SLA/SLASupportTreeBuilder.cpp - SLA/SLAConcurrency.hpp - SLA/SLASupportTree.hpp - SLA/SLASupportTree.cpp - SLA/SLASupportTreeIGL.cpp - SLA/SLARotfinder.hpp - SLA/SLARotfinder.cpp - SLA/SLABoostAdapter.hpp - SLA/SLASpatIndex.hpp - SLA/SLARaster.hpp - SLA/SLARaster.cpp - SLA/SLARasterWriter.hpp - SLA/SLARasterWriter.cpp + SimplifyMesh.hpp + SimplifyMeshImpl.hpp + SimplifyMesh.cpp + MarchingSquares.hpp + Optimize/Optimizer.hpp + Optimize/NLoptOptimizer.hpp + Optimize/BruteforceOptimizer.hpp + ${OpenVDBUtils_SOURCES} + SLA/Pad.hpp + SLA/Pad.cpp + SLA/SupportTreeBuilder.hpp + SLA/SupportTreeMesher.hpp + SLA/SupportTreeMesher.cpp + SLA/SupportTreeBuildsteps.hpp + SLA/SupportTreeBuildsteps.cpp + SLA/SupportTreeBuilder.cpp + SLA/Concurrency.hpp + SLA/SupportTree.hpp + SLA/SupportTree.cpp +# SLA/SupportTreeIGL.cpp + SLA/Rotfinder.hpp + SLA/Rotfinder.cpp + SLA/BoostAdapter.hpp + SLA/SpatIndex.hpp + 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 + SLA/Hollowing.cpp + SLA/JobController.hpp + SLA/SupportPoint.hpp + SLA/SupportPointGenerator.hpp + SLA/SupportPointGenerator.cpp + SLA/Contour3D.hpp + SLA/Contour3D.cpp + SLA/IndexedMesh.hpp + SLA/IndexedMesh.cpp + SLA/Clustering.hpp + SLA/Clustering.cpp + SLA/ReprojectPointsOnMesh.hpp ) +if (SLIC3R_STATIC) + set(CGAL_Boost_USE_STATIC_LIBS ON CACHE BOOL "" FORCE) +endif () +set(CGAL_DO_NOT_WARN_ABOUT_CMAKE_BUILD_TYPE ON CACHE BOOL "" FORCE) + +cmake_policy(PUSH) +cmake_policy(SET CMP0011 NEW) +find_package(CGAL REQUIRED) +cmake_policy(POP) + +add_library(libslic3r_cgal STATIC MeshBoolean.cpp MeshBoolean.hpp) +target_include_directories(libslic3r_cgal PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + +# Reset compile options of libslic3r_cgal. Despite it being linked privately, CGAL options +# (-frounding-math) still propagate to dependent libs which is not desired. +get_target_property(_cgal_tgt CGAL::CGAL ALIASED_TARGET) +if (NOT TARGET ${_cgal_tgt}) + set (_cgal_tgt CGAL::CGAL) +endif () +get_target_property(_opts ${_cgal_tgt} INTERFACE_COMPILE_OPTIONS) +if (_opts) + set(_opts_bad "${_opts}") + set(_opts_good "${_opts}") + list(FILTER _opts_bad INCLUDE REGEX frounding-math) + list(FILTER _opts_good EXCLUDE REGEX frounding-math) + set_target_properties(${_cgal_tgt} PROPERTIES INTERFACE_COMPILE_OPTIONS "${_opts_good}") + target_compile_options(libslic3r_cgal PRIVATE "${_opts_bad}") +endif() + +target_link_libraries(libslic3r_cgal PRIVATE ${_cgal_tgt} libigl) + +if (MSVC AND "${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") # 32 bit MSVC workaround + target_compile_definitions(libslic3r_cgal PRIVATE CGAL_DO_NOT_USE_MPZF) +endif () + encoding_check(libslic3r) -if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY) - add_precompiled_header(libslic3r pchheader.hpp FORCEINCLUDE) -endif () - 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 @@ -226,14 +310,24 @@ target_link_libraries(libslic3r qhull semver TBB::tbb - # OpenVDB::openvdb + libslic3r_cgal ${CMAKE_DL_LIBS} + PNG::PNG + ZLIB::ZLIB ) +if (TARGET OpenVDB::openvdb) + target_link_libraries(libslic3r OpenVDB::openvdb) +endif() + if(WIN32) target_link_libraries(libslic3r Psapi.lib) endif() if(SLIC3R_PROFILE) - target_link_libraries(slic3r Shiny) + target_link_libraries(libslic3r Shiny) endif() + +if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY) + add_precompiled_header(libslic3r pchheader.hpp FORCEINCLUDE) +endif () diff --git a/src/libslic3r/ClipperUtils.cpp b/src/libslic3r/ClipperUtils.cpp index f053aea296..16d985e9c9 100644 --- a/src/libslic3r/ClipperUtils.cpp +++ b/src/libslic3r/ClipperUtils.cpp @@ -8,7 +8,16 @@ #include "SVG.hpp" #endif /* CLIPPER_UTILS_DEBUG */ -#include +// Profiling support using the Shiny intrusive profiler +//#define CLIPPER_UTILS_PROFILE +#if defined(SLIC3R_PROFILE) && defined(CLIPPER_UTILS_PROFILE) + #include + #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; @@ -679,133 +688,73 @@ ClipperLib::PolyTree union_pt(ExPolygons &&subject, bool safety_offset_) return _clipper_do(ClipperLib::ctUnion, std::move(subject), Polygons(), ClipperLib::pftEvenOdd, safety_offset_); } -Polygons -union_pt_chained(const Polygons &subject, bool safety_offset_) -{ - ClipperLib::PolyTree polytree = union_pt(subject, safety_offset_); - - Polygons retval; - traverse_pt(polytree.Childs, &retval); - return retval; -} - -static ClipperLib::PolyNodes order_nodes(const ClipperLib::PolyNodes &nodes) +// Simple spatial ordering of Polynodes +ClipperLib::PolyNodes order_nodes(const ClipperLib::PolyNodes &nodes) { // collect ordering points Points ordering_points; ordering_points.reserve(nodes.size()); + for (const ClipperLib::PolyNode *node : nodes) - ordering_points.emplace_back(Point(node->Contour.front().X, node->Contour.front().Y)); - + ordering_points.emplace_back( + Point(node->Contour.front().X, node->Contour.front().Y)); + // perform the ordering - ClipperLib::PolyNodes ordered_nodes = chain_clipper_polynodes(ordering_points, nodes); - + ClipperLib::PolyNodes ordered_nodes = + chain_clipper_polynodes(ordering_points, nodes); + return ordered_nodes; } -enum class e_ordering { - ORDER_POLYNODES, - DONT_ORDER_POLYNODES -}; - -template -void foreach_node(const ClipperLib::PolyNodes &nodes, - std::function fn); - -template<> void foreach_node( - const ClipperLib::PolyNodes & nodes, - std::function fn) +static void traverse_pt_noholes(const ClipperLib::PolyNodes &nodes, Polygons *out) { - for (auto &n : nodes) fn(n); + foreach_node(nodes, [&out](const ClipperLib::PolyNode *node) + { + traverse_pt_noholes(node->Childs, out); + out->emplace_back(ClipperPath_to_Slic3rPolygon(node->Contour)); + if (node->IsHole()) out->back().reverse(); // ccw + }); } -template<> void foreach_node( - const ClipperLib::PolyNodes & nodes, - std::function fn) -{ - auto ordered_nodes = order_nodes(nodes); - for (auto &n : ordered_nodes) fn(n); -} - -template -void _traverse_pt(const ClipperLib::PolyNodes &nodes, Polygons *retval) +static void traverse_pt_old(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 - foreach_node(nodes, [&retval](const ClipperLib::PolyNode *node) { + for (ClipperLib::PolyNodes::iterator it = ordered_nodes.begin(); it != ordered_nodes.end(); ++it) { // traverse the next depth - _traverse_pt(node->Childs, retval); - retval->emplace_back(ClipperPath_to_Slic3rPolygon(node->Contour)); - if (node->IsHole()) retval->back().reverse(); // ccw - }); + traverse_pt_old((*it)->Childs, retval); + retval->push_back(ClipperPath_to_Slic3rPolygon((*it)->Contour)); + if ((*it)->IsHole()) retval->back().reverse(); // ccw + } } -template -void _traverse_pt(const ClipperLib::PolyNode *tree, ExPolygons *retval) +Polygons union_pt_chained(const Polygons &subject, bool safety_offset_) { - if (!retval || !tree) return; + ClipperLib::PolyTree polytree = union_pt(subject, safety_offset_); - ExPolygons &retv = *retval; + Polygons retval; + traverse_pt_old(polytree.Childs, &retval); + return retval; - std::function hole_fn; +// TODO: This needs to be tested: +// ClipperLib::PolyTree polytree = union_pt(subject, safety_offset_); - auto contour_fn = [&retv, &hole_fn](const ClipperLib::PolyNode *pptr) { - ExPolygon poly; - poly.contour.points = ClipperPath_to_Slic3rPolygon(pptr->Contour); - auto fn = std::bind(hole_fn, std::placeholders::_1, poly); - foreach_node(pptr->Childs, fn); - retv.push_back(poly); - }; - - hole_fn = [&contour_fn](const ClipperLib::PolyNode *pptr, ExPolygon& poly) - { - poly.holes.emplace_back(); - poly.holes.back().points = ClipperPath_to_Slic3rPolygon(pptr->Contour); - foreach_node(pptr->Childs, contour_fn); - }; - - contour_fn(tree); -} - -template -void _traverse_pt(const ClipperLib::PolyNodes &nodes, ExPolygons *retval) -{ - // Here is the actual traverse - foreach_node(nodes, [&retval](const ClipperLib::PolyNode *node) { - _traverse_pt(node, retval); - }); -} - -void traverse_pt(const ClipperLib::PolyNode *tree, ExPolygons *retval) -{ - _traverse_pt(tree, retval); -} - -void traverse_pt_unordered(const ClipperLib::PolyNode *tree, ExPolygons *retval) -{ - _traverse_pt(tree, retval); -} - -void traverse_pt(const ClipperLib::PolyNodes &nodes, Polygons *retval) -{ - _traverse_pt(nodes, retval); -} - -void traverse_pt(const ClipperLib::PolyNodes &nodes, ExPolygons *retval) -{ - _traverse_pt(nodes, retval); -} - -void traverse_pt_unordered(const ClipperLib::PolyNodes &nodes, Polygons *retval) -{ - _traverse_pt(nodes, retval); -} - -void traverse_pt_unordered(const ClipperLib::PolyNodes &nodes, ExPolygons *retval) -{ - _traverse_pt(nodes, retval); +// Polygons retval; +// traverse_pt_noholes(polytree.Childs, &retval); +// return retval; } Polygons simplify_polygons(const Polygons &subject, bool preserve_collinear) @@ -850,7 +799,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); @@ -872,11 +821,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)); @@ -915,7 +864,12 @@ Polygons top_level_islands(const Slic3r::Polygons &polygons) } // Outer offset shall not split the input contour into multiples. It is expected, that the solution will be non empty and it will contain just a single polygon. -ClipperLib::Paths fix_after_outer_offset(const ClipperLib::Path &input, ClipperLib::PolyFillType filltype, bool reverse_result) +ClipperLib::Paths fix_after_outer_offset( + const ClipperLib::Path &input, + // combination of default prameters to correspond to void ClipperOffset::Execute(Paths& solution, double delta) + // to produce a CCW output contour from CCW input contour for a positive offset. + ClipperLib::PolyFillType filltype, // = ClipperLib::pftPositive + bool reverse_result) // = false { ClipperLib::Paths solution; if (! input.empty()) { @@ -927,8 +881,13 @@ ClipperLib::Paths fix_after_outer_offset(const ClipperLib::Path &input, ClipperL return solution; } -// Inner offset may split the source contour into multiple contours, but one shall not be inside the other. -ClipperLib::Paths fix_after_inner_offset(const ClipperLib::Path &input, ClipperLib::PolyFillType filltype, bool reverse_result) +// Inner offset may split the source contour into multiple contours, but one resulting contour shall not lie inside the other. +ClipperLib::Paths fix_after_inner_offset( + const ClipperLib::Path &input, + // combination of default prameters to correspond to void ClipperOffset::Execute(Paths& solution, double delta) + // to produce a CCW output contour from CCW input contour for a negative offset. + ClipperLib::PolyFillType filltype, // = ClipperLib::pftNegative + bool reverse_result) // = true { ClipperLib::Paths solution; if (! input.empty()) { @@ -1101,12 +1060,20 @@ Polygons variable_offset_inner(const ExPolygon &expoly, const std::vector 0.); +#endif /* NDEBUG */ // 2) Offset the holes one by one, collect the results. 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::pftPositive, false)); + append(holes, fix_after_outer_offset(mittered_offset_path_scaled(hole, deltas[1 + &hole - expoly.holes.data()], miter_limit), ClipperLib::pftNegative, false)); +#ifndef NDEBUG + for (auto &c : holes) + assert(ClipperLib::Area(c) > 0.); +#endif /* NDEBUG */ // 3) Subtract holes from the contours. ClipperLib::Paths output; @@ -1137,12 +1104,20 @@ for (const std::vector& ds : deltas) // 1) Offset the outer contour. ClipperLib::Paths contours = fix_after_outer_offset(mittered_offset_path_scaled(expoly.contour.points, deltas.front(), miter_limit), ClipperLib::pftPositive, false); +#ifndef NDEBUG + for (auto &c : contours) + assert(ClipperLib::Area(c) > 0.); +#endif /* NDEBUG */ // 2) Offset the holes one by one, collect the results. 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)); +#ifndef NDEBUG + for (auto &c : holes) + assert(ClipperLib::Area(c) > 0.); +#endif /* NDEBUG */ // 3) Subtract holes from the contours. ClipperLib::Paths output; @@ -1173,12 +1148,20 @@ for (const std::vector& ds : deltas) // 1) Offset the outer contour. ClipperLib::Paths contours = fix_after_outer_offset(mittered_offset_path_scaled(expoly.contour.points, deltas.front(), miter_limit), ClipperLib::pftPositive, false); +#ifndef NDEBUG + for (auto &c : contours) + assert(ClipperLib::Area(c) > 0.); +#endif /* NDEBUG */ // 2) Offset the holes one by one, collect the results. 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)); +#ifndef NDEBUG + for (auto &c : holes) + assert(ClipperLib::Area(c) > 0.); +#endif /* NDEBUG */ // 3) Subtract holes from the contours. unscaleClipperPolygons(contours); @@ -1212,13 +1195,21 @@ ExPolygons variable_offset_inner_ex(const ExPolygon &expoly, const std::vector 0.); +#endif /* NDEBUG */ // 2) Offset the holes one by one, collect the results. 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, true)); + append(holes, fix_after_outer_offset(mittered_offset_path_scaled(hole, deltas[1 + &hole - expoly.holes.data()], miter_limit), ClipperLib::pftNegative, false)); +#ifndef NDEBUG + for (auto &c : holes) + assert(ClipperLib::Area(c) > 0.); +#endif /* NDEBUG */ // 3) Subtract holes from the contours. unscaleClipperPolygons(contours); diff --git a/src/libslic3r/ClipperUtils.hpp b/src/libslic3r/ClipperUtils.hpp index 5a41a6a909..0828ec21fd 100644 --- a/src/libslic3r/ClipperUtils.hpp +++ b/src/libslic3r/ClipperUtils.hpp @@ -214,7 +214,6 @@ inline Slic3r::ExPolygons union_ex(const Slic3r::Surfaces &subject, bool safety_ return _clipper_ex(ClipperLib::ctUnion, to_polygons(subject), Slic3r::Polygons(), safety_offset_); } - ClipperLib::PolyTree union_pt(const Slic3r::Polygons &subject, bool safety_offset_ = false); ClipperLib::PolyTree union_pt(const Slic3r::ExPolygons &subject, bool safety_offset_ = false); ClipperLib::PolyTree union_pt(Slic3r::Polygons &&subject, bool safety_offset_ = false); @@ -222,13 +221,95 @@ ClipperLib::PolyTree union_pt(Slic3r::ExPolygons &&subject, bool safety_offset_ Slic3r::Polygons union_pt_chained(const Slic3r::Polygons &subject, bool safety_offset_ = false); -void traverse_pt(const ClipperLib::PolyNodes &nodes, Slic3r::Polygons *retval); -void traverse_pt(const ClipperLib::PolyNodes &nodes, Slic3r::ExPolygons *retval); -void traverse_pt(const ClipperLib::PolyNode *tree, Slic3r::ExPolygons *retval); +ClipperLib::PolyNodes order_nodes(const ClipperLib::PolyNodes &nodes); + +// Implementing generalized loop (foreach) over a list of nodes which can be +// ordered or unordered (performance gain) based on template parameter +enum class e_ordering { + ON, + OFF +}; + +// Create a template struct, template functions can not be partially specialized +template struct _foreach_node { + void operator()(const ClipperLib::PolyNodes &nodes, Fn &&fn); +}; + +// Specialization with NO ordering +template struct _foreach_node { + void operator()(const ClipperLib::PolyNodes &nodes, Fn &&fn) + { + for (auto &n : nodes) fn(n); + } +}; + +// Specialization with ordering +template struct _foreach_node { + void operator()(const ClipperLib::PolyNodes &nodes, Fn &&fn) + { + auto ordered_nodes = order_nodes(nodes); + for (auto &n : nodes) fn(n); + } +}; + +// Wrapper function for the foreach_node which can deduce arguments automatically +template +void foreach_node(const ClipperLib::PolyNodes &nodes, Fn &&fn) +{ + _foreach_node()(nodes, std::forward(fn)); +} + +// Collecting polygons of the tree into a list of Polygons, holes have clockwise +// orientation. +template +void traverse_pt(const ClipperLib::PolyNode *tree, Polygons *out) +{ + if (!tree) return; // terminates recursion + + // Push the contour of the current level + out->emplace_back(ClipperPath_to_Slic3rPolygon(tree->Contour)); + + // Do the recursion for all the children. + traverse_pt(tree->Childs, out); +} + +// Collecting polygons of the tree into a list of ExPolygons. +template +void traverse_pt(const ClipperLib::PolyNode *tree, ExPolygons *out) +{ + if (!tree) return; + else if(tree->IsHole()) { + // Levels of holes are skipped and handled together with the + // contour levels. + traverse_pt(tree->Childs, out); + return; + } + + ExPolygon level; + level.contour = ClipperPath_to_Slic3rPolygon(tree->Contour); + + foreach_node(tree->Childs, + [out, &level] (const ClipperLib::PolyNode *node) { + + // Holes are collected here. + level.holes.emplace_back(ClipperPath_to_Slic3rPolygon(node->Contour)); + + // By doing a recursion, a new level expoly is created with the contour + // and holes of the lower level. Doing this for all the childs. + traverse_pt(node->Childs, out); + }); + + out->emplace_back(level); +} + +template +void traverse_pt(const ClipperLib::PolyNodes &nodes, ExOrJustPolygons *retval) +{ + foreach_node(nodes, [&retval](const ClipperLib::PolyNode *node) { + traverse_pt(node, retval); + }); +} -void traverse_pt_unordered(const ClipperLib::PolyNodes &nodes, Slic3r::Polygons *retval); -void traverse_pt_unordered(const ClipperLib::PolyNodes &nodes, Slic3r::ExPolygons *retval); -void traverse_pt_unordered(const ClipperLib::PolyNode *tree, Slic3r::ExPolygons *retval); /* OTHER */ Slic3r::Polygons simplify_polygons(const Slic3r::Polygons &subject, bool preserve_collinear = false); diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp index 9d24d8cb79..03ce0ad406 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 #include #include #include -#include // std::runtime_error #include #include #include @@ -192,6 +192,23 @@ bool unescape_strings_cstyle(const std::string &str, std::vector &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 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 ConfigOptionDef::cli_args(const std::string &key) const { std::vector args; @@ -217,7 +234,7 @@ ConfigOption* ConfigOptionDef::create_empty_option() const case coInts: return new ConfigOptionIntsNullable(); case coPercents: return new ConfigOptionPercentsNullable(); 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) { @@ -237,7 +254,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 +481,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 items) @@ -534,7 +551,7 @@ double ConfigBase::get_abs_value(const t_config_option_key &opt_key) const return opt_def->ratio_over.empty() ? 0. : static_cast(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 +562,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(raw_opt)->get_abs_value(ratio_over); } @@ -608,11 +625,11 @@ 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(); - auto data_length = std::min(65535, file_length); + auto data_length = std::min(65535, file_length); ifs.seekg(file_length - data_length, ifs.beg); std::vector data(size_t(data_length) + 1, 0); ifs.read(data.data(), data_length); @@ -620,7 +637,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. @@ -630,39 +647,38 @@ size_t ConfigBase::load_from_gcode_string(const char* str) return 0; // Walk line by line in reverse until a non-configuration key appears. - char *data_start = const_cast(str); + const char *data_start = str; // boost::nowide::ifstream seems to cook the text data somehow, so less then the 64k of characters may be retrieved. - char *end = data_start + strlen(str); + const char *end = data_start + strlen(str); size_t num_key_value_pairs = 0; for (;;) { // Extract next line. for (--end; end > data_start && (*end == '\r' || *end == '\n'); --end); if (end == data_start) break; - char *start = end; - *(++end) = 0; + const char *start = end ++; for (; start > data_start && *start != '\r' && *start != '\n'; --start); if (start == data_start) break; // Extracted a line from start to end. Extract the key = value pair. - if (end - (++start) < 10 || start[0] != ';' || start[1] != ' ') + if (end - (++ start) < 10 || start[0] != ';' || start[1] != ' ') break; - char *key = start + 2; + const char *key = start + 2; if (!(*key >= 'a' && *key <= 'z') || (*key >= 'A' && *key <= 'Z')) // A key must start with a letter. break; - char *sep = strchr(key, '='); - if (sep == nullptr || sep[-1] != ' ' || sep[1] != ' ') + const char *sep = key; + for (; sep != end && *sep != '='; ++ sep) ; + if (sep == end || sep[-1] != ' ' || sep[1] != ' ') break; - char *value = sep + 2; + const char *value = sep + 2; if (value > end) break; - char *key_end = sep - 1; + const char *key_end = sep - 1; if (key_end - key < 3) break; - *key_end = 0; // The key may contain letters, digits and underscores. - for (char *c = key; c != key_end; ++c) + for (const char *c = key; c != key_end; ++ c) if (!((*c >= 'a' && *c <= 'z') || (*c >= 'A' && *c <= 'Z') || (*c >= '0' && *c <= '9') || *c == '_')) { key = nullptr; break; @@ -670,7 +686,7 @@ size_t ConfigBase::load_from_gcode_string(const char* str) if (key == nullptr) break; try { - this->set_deserialize(key, value); + this->set_deserialize(std::string(key, key_end), std::string(value, end)); ++num_key_value_pairs; } catch (UnknownOptionException & /* e */) { @@ -750,7 +766,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(); @@ -758,17 +774,23 @@ ConfigOption* DynamicConfig::optptr(const t_config_option_key &opt_key, bool cre return opt; } -void DynamicConfig::read_cli(const std::vector &tokens, t_config_option_keys* extra, t_config_option_keys* keys) +const ConfigOption* DynamicConfig::optptr(const t_config_option_key &opt_key) const { - std::vector args; - // push a bogus executable name (argv[0]) - args.emplace_back(const_cast("")); - for (size_t i = 0; i < tokens.size(); ++ i) - args.emplace_back(const_cast(tokens[i].c_str())); - this->read_cli(int(args.size()), &args[0], extra, keys); + auto it = options.find(opt_key); + return (it == options.end()) ? nullptr : it->second.get(); } -bool DynamicConfig::read_cli(int argc, char** argv, t_config_option_keys* extra, t_config_option_keys* keys) +void DynamicConfig::read_cli(const std::vector &tokens, t_config_option_keys* extra, t_config_option_keys* keys) +{ + std::vector args; + // push a bogus executable name (argv[0]) + args.emplace_back(""); + for (size_t i = 0; i < tokens.size(); ++ i) + args.emplace_back(tokens[i].c_str()); + this->read_cli(int(args.size()), args.data(), extra, keys); +} + +bool DynamicConfig::read_cli(int argc, const char* const argv[], t_config_option_keys* extra, t_config_option_keys* keys) { // cache the CLI option => opt_key mapping std::map opts; diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index c49dd134ed..6ef6f143c5 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -13,11 +13,12 @@ #include #include "libslic3r.h" #include "clonable_ptr.hpp" +#include "Exception.hpp" #include "Point.hpp" #include -#include -#include +#include +#include #include #include @@ -33,33 +34,34 @@ extern std::string escape_strings_cstyle(const std::vector &strs); extern bool unescape_string_cstyle(const std::string &str, std::string &out); extern bool unescape_strings_cstyle(const std::string &str, std::vector &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. @@ -168,7 +170,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*>(rhs)); this->value = static_cast*>(rhs)->value; } @@ -176,7 +178,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*>(&rhs)); return this->value == static_cast*>(&rhs)->value; } @@ -240,7 +242,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*>(rhs)); this->values = static_cast*>(rhs)->values; } @@ -257,12 +259,12 @@ public: if (opt->type() == this->type()) { auto other = static_cast*>(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*>(opt)->value); else - throw std::runtime_error("ConfigOptionVector::set():: Assigning an incompatible type"); + throw Slic3r::RuntimeError("ConfigOptionVector::set():: Assigning an incompatible type"); } } @@ -281,21 +283,21 @@ public: // Assign the first value of the rhs vector. auto other = static_cast*>(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*>(rhs)->value; else - throw std::runtime_error("ConfigOptionVector::set_at(): Assigning an incompatible type"); + throw Slic3r::RuntimeError("ConfigOptionVector::set_at(): Assigning an incompatible type"); } - T& get_at(size_t i) + const T& get_at(size_t i) const { assert(! this->values.empty()); return (i < this->values.size()) ? this->values[i] : this->values.front(); } - const T& get_at(size_t i) const { return const_cast*>(this)->get_at(i); } + T& get_at(size_t i) { return const_cast(std::as_const(*this).get_at(i)); } // Resize this vector by duplicating the /*last*/first value. // If the current vector is empty, the default value is used instead. @@ -311,9 +313,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*>(opt_default)->values.front()); } else { // Resize by duplicating the last value. @@ -330,7 +332,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*>(&rhs)); return this->values == static_cast*>(&rhs)->values; } @@ -342,9 +344,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*>(rhs); if (! rhs->nullable()) // Overridding a non-nullable object with another non-nullable object. @@ -362,9 +364,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*>(rhs); if (! rhs->nullable()) { // Overridding a non-nullable object with another non-nullable object. @@ -453,7 +455,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*>(&rhs)); return vectors_equal(this->values, static_cast*>(&rhs)->values); } @@ -500,7 +502,7 @@ public: if (NULLABLE) this->values.push_back(nil_value()); else - 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 +527,9 @@ protected: if (NULLABLE) ss << "nil"; else - std::runtime_error("Serializing NaN"); + throw Slic3r::RuntimeError("Serializing NaN"); } else - std::runtime_error("Serializing invalid number"); + throw Slic3r::RuntimeError("Serializing invalid number"); } static bool vectors_equal(const std::vector &v1, const std::vector &v2) { if (NULLABLE) { @@ -646,7 +648,7 @@ public: if (NULLABLE) this->values.push_back(nil_value()); else - 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 +665,7 @@ private: if (NULLABLE) ss << "nil"; else - std::runtime_error("Serializing NaN"); + throw Slic3r::RuntimeError("Serializing NaN"); } else ss << v; } @@ -686,6 +688,7 @@ public: ConfigOption* clone() const override { return new ConfigOptionString(*this); } ConfigOptionString& operator=(const ConfigOption *opt) { this->set(opt); return *this; } bool operator==(const ConfigOptionString &rhs) const { return this->value == rhs.value; } + bool empty() const { return this->value.empty(); } std::string serialize() const override { @@ -847,7 +850,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(&rhs)); return *this == *static_cast(&rhs); } @@ -858,7 +861,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(rhs)); *this = *static_cast(rhs); } @@ -1126,7 +1129,7 @@ public: if (NULLABLE) this->values.push_back(nil_value()); else - 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); } @@ -1139,7 +1142,7 @@ protected: if (NULLABLE) ss << "nil"; else - std::runtime_error("Serializing NaN"); + throw Slic3r::RuntimeError("Serializing NaN"); } else ss << (v ? "1" : "0"); } @@ -1175,14 +1178,14 @@ public: bool operator==(const ConfigOption &rhs) const override { if (rhs.type() != this->type()) - throw std::runtime_error("ConfigOptionEnum: Comparing incompatible types"); + throw Slic3r::RuntimeError("ConfigOptionEnum: Comparing incompatible types"); // rhs could be of the following type: ConfigOptionEnumGeneric or ConfigOptionEnum return this->value == (T)rhs.getInt(); } void set(const ConfigOption *rhs) override { if (rhs->type() != this->type()) - throw std::runtime_error("ConfigOptionEnum: Assigning an incompatible type"); + throw Slic3r::RuntimeError("ConfigOptionEnum: Assigning an incompatible type"); // rhs could be of the following type: ConfigOptionEnumGeneric or ConfigOptionEnum this->value = (T)rhs->getInt(); } @@ -1259,14 +1262,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 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 this->value = rhs->getInt(); } @@ -1321,7 +1324,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) { @@ -1340,7 +1343,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); } } } @@ -1352,7 +1355,7 @@ public: case coInts: archive(*static_cast(opt)); break; case coPercents: archive(*static_cast(opt));break; case coBools: archive(*static_cast(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) { @@ -1371,7 +1374,7 @@ public: case coBool: archive(*static_cast(opt)); break; case coBools: archive(*static_cast(opt)); break; case coEnum: archive(*static_cast(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. @@ -1413,6 +1416,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. @@ -1494,8 +1499,49 @@ protected: ConfigOptionDef* add_nullable(const t_config_option_key &opt_key, ConfigOptionType type); }; +// A pure interface to resolving ConfigOptions. +// This pure interface is useful as a base of ConfigBase, also it may be overriden to combine +// various config sources. +class ConfigOptionResolver +{ +public: + ConfigOptionResolver() {} + virtual ~ConfigOptionResolver() {} + + // Find a ConfigOption instance for a given name. + virtual const ConfigOption* optptr(const t_config_option_key &opt_key) const = 0; + + bool has(const t_config_option_key &opt_key) const { return this->optptr(opt_key) != nullptr; } + + const ConfigOption* option(const t_config_option_key &opt_key) const { return this->optptr(opt_key); } + + template + const TYPE* option(const t_config_option_key& opt_key) const + { + const ConfigOption* opt = this->optptr(opt_key); + return (opt == nullptr || opt->type() != TYPE::static_type()) ? nullptr : static_cast(opt); + } + + const ConfigOption* option_throw(const t_config_option_key& opt_key) const + { + const ConfigOption* opt = this->optptr(opt_key); + if (opt == nullptr) + throw UnknownOptionException(opt_key); + return opt; + } + + template + const TYPE* option_throw(const t_config_option_key& opt_key) const + { + const ConfigOption* opt = this->option_throw(opt_key); + if (opt->type() != TYPE::static_type()) + throw BadOptionTypeException("Conversion to a wrong type"); + return static_cast(opt); + } +}; + // An abstract configuration store. -class ConfigBase +class ConfigBase : public ConfigOptionResolver { public: // Definition of configuration values for the purpose of GUI presentation, editing, value mapping and config file handling. @@ -1503,7 +1549,7 @@ public: // but it carries the defaults of the configuration values. ConfigBase() {} - virtual ~ConfigBase() {} + ~ConfigBase() override {} // Virtual overridables: public: @@ -1513,6 +1559,7 @@ public: virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) = 0; // Collect names of all configuration values maintained by this configuration store. virtual t_config_option_keys keys() const = 0; + protected: // Verify whether the opt_key has not been obsoleted or renamed. // Both opt_key and value may be modified by handle_legacy(). @@ -1521,12 +1568,10 @@ protected: virtual void handle_legacy(t_config_option_key &/*opt_key*/, std::string &/*value*/) const {} public: + using ConfigOptionResolver::option; + using ConfigOptionResolver::option_throw; + // Non-virtual methods: - bool has(const t_config_option_key &opt_key) const { return this->option(opt_key) != nullptr; } - - const ConfigOption* option(const t_config_option_key &opt_key) const - { return const_cast(this)->option(opt_key, false); } - ConfigOption* option(const t_config_option_key &opt_key, bool create = false) { return this->optptr(opt_key, create); } @@ -1537,10 +1582,6 @@ public: return (opt == nullptr || opt->type() != TYPE::static_type()) ? nullptr : static_cast(opt); } - template - const TYPE* option(const t_config_option_key &opt_key) const - { return const_cast(this)->option(opt_key, false); } - ConfigOption* option_throw(const t_config_option_key &opt_key, bool create = false) { ConfigOption *opt = this->optptr(opt_key, create); @@ -1549,9 +1590,6 @@ public: return opt; } - const ConfigOption* option_throw(const t_config_option_key &opt_key) const - { return const_cast(this)->option_throw(opt_key, false); } - template TYPE* option_throw(const t_config_option_key &opt_key, bool create = false) { @@ -1561,10 +1599,6 @@ public: return static_cast(opt); } - template - const TYPE* option_throw(const t_config_option_key &opt_key) const - { return const_cast(this)->option_throw(opt_key, false); } - // Apply all keys of other ConfigBase defined by this->def() to this ConfigBase. // An UnknownOptionException is thrown in case some option keys of other are not defined by this->def(), // or this ConfigBase is of a StaticConfig type and it does not support some of the keys, and ignore_nonexistent is not set. @@ -1638,7 +1672,7 @@ class DynamicConfig : public virtual ConfigBase public: DynamicConfig() {} DynamicConfig(const DynamicConfig &rhs) { *this = rhs; } - DynamicConfig(DynamicConfig &&rhs) : options(std::move(rhs.options)) { rhs.options.clear(); } + DynamicConfig(DynamicConfig &&rhs) noexcept : options(std::move(rhs.options)) { rhs.options.clear(); } explicit DynamicConfig(const ConfigBase &rhs, const t_config_option_keys &keys); explicit DynamicConfig(const ConfigBase& rhs) : DynamicConfig(rhs, rhs.keys()) {} virtual ~DynamicConfig() override { clear(); } @@ -1656,7 +1690,7 @@ public: // Move a content of one DynamicConfig to another DynamicConfig. // If rhs.def() is not null, then it has to be equal to this->def(). - DynamicConfig& operator=(DynamicConfig &&rhs) + DynamicConfig& operator=(DynamicConfig &&rhs) noexcept { assert(this->def() == nullptr || this->def() == rhs.def()); this->clear(); @@ -1735,6 +1769,8 @@ public: { return dynamic_cast(this->option(opt_key, create)); } template const T* opt(const t_config_option_key &opt_key) const { return dynamic_cast(this->option(opt_key)); } + // Overrides ConfigResolver::optptr(). + const ConfigOption* optptr(const t_config_option_key &opt_key) const override; // Overrides ConfigBase::optptr(). Find ando/or create a ConfigOption instance for a given name. ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) override; // Overrides ConfigBase::keys(). Collect names of all configuration values maintained by this configuration store. @@ -1779,7 +1815,7 @@ public: // Command line processing void read_cli(const std::vector &tokens, t_config_option_keys* extra, t_config_option_keys* keys = nullptr); - bool read_cli(int argc, char** argv, t_config_option_keys* extra, t_config_option_keys* keys = nullptr); + bool read_cli(int argc, const char* const argv[], t_config_option_keys* extra, t_config_option_keys* keys = nullptr); std::map>::const_iterator cbegin() const { return options.cbegin(); } std::map>::const_iterator cend() const { return options.cend(); } diff --git a/src/libslic3r/CustomGCode.cpp b/src/libslic3r/CustomGCode.cpp new file mode 100644 index 0000000000..193235bf83 --- /dev/null +++ b/src/libslic3r/CustomGCode.cpp @@ -0,0 +1,73 @@ +#include "CustomGCode.hpp" +#include "Config.hpp" +#include "GCode.hpp" +#include "GCodeWriter.hpp" + +namespace Slic3r { + +namespace CustomGCode { + +// If loaded configuration has a "colorprint_heights" option (if it was imported from older Slicer), +// and if CustomGCode::Info.gcodes is empty (there is no color print data available in a new format +// then CustomGCode::Info.gcodes should be updated considering this option. +extern void update_custom_gcode_per_print_z_from_config(Info& info, DynamicPrintConfig* config) +{ + auto *colorprint_heights = config->option("colorprint_heights"); + if (colorprint_heights == nullptr) + 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& 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, ColorChange, 1, colors[(++i)%7] }); + + info.mode = SingleExtruder; + } + + // The "colorprint_heights" config value has been deprecated. At this point of time it has been converted + // to a new format and therefore it shall be erased. + config->erase("colorprint_heights"); +} + +// If information for custom Gcode per print Z was imported from older Slicer, mode will be undefined. +// So, we should set CustomGCode::Info.mode should be updated considering code values from items. +extern void check_mode_for_custom_gcode_per_print_z(Info& info) +{ + if (info.mode != Undef) + return; + + bool is_single_extruder = true; + for (auto item : info.gcodes) + { + if (item.type == ToolChange) { + info.mode = MultiAsSingle; + return; + } + if (item.type == ColorChange && item.extruder > 1) + is_single_extruder = false; + } + + info.mode = is_single_extruder ? SingleExtruder : MultiExtruder; +} + +// Return pairs of sorted by increasing print_z from custom_gcode_per_print_z. +// print_z corresponds to the first layer printed with the new extruder. +std::vector> custom_tool_changes(const Info& custom_gcode_per_print_z, size_t num_extruders) +{ + std::vector> custom_tool_changes; + for (const Item& custom_gcode : custom_gcode_per_print_z.gcodes) + if (custom_gcode.type == ToolChange) { + // If extruder count in PrinterSettings was changed, use default (0) extruder for extruders, more than num_extruders + assert(custom_gcode.extruder >= 0); + custom_tool_changes.emplace_back(custom_gcode.print_z, static_cast(size_t(custom_gcode.extruder) > num_extruders ? 1 : custom_gcode.extruder)); + } + return custom_tool_changes; +} + +} // namespace CustomGCode + +} // namespace Slic3r diff --git a/src/libslic3r/CustomGCode.hpp b/src/libslic3r/CustomGCode.hpp new file mode 100644 index 0000000000..334b404313 --- /dev/null +++ b/src/libslic3r/CustomGCode.hpp @@ -0,0 +1,94 @@ +#ifndef slic3r_CustomGCode_hpp_ +#define slic3r_CustomGCode_hpp_ + +#include +#include + +namespace Slic3r { + +class DynamicPrintConfig; + +namespace CustomGCode { + +enum Type +{ + ColorChange, + PausePrint, + ToolChange, + Template, + Custom +}; + +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.type == this->type ) && + (rhs.extruder == this->extruder ) && + (rhs.color == this->color ) && + (rhs.extra == this->extra ); + } + bool operator!=(const Item& rhs) const { return ! (*this == rhs); } + + double print_z; + 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 +{ + Undef, + SingleExtruder, // Single extruder printer preset is selected + MultiAsSingle, // Multiple extruder printer preset is selected, but + // this mode works just for Single extruder print + // (The same extruder is assigned to all ModelObjects and ModelVolumes). + MultiExtruder // Multiple extruder printer preset is selected +}; + +// string anlogue of custom_code_per_height mode +static constexpr char SingleExtruderMode[] = "SingleExtruder"; +static constexpr char MultiAsSingleMode [] = "MultiAsSingle"; +static constexpr char MultiExtruderMode [] = "MultiExtruder"; + +struct Info +{ + Mode mode = Undef; + std::vector gcodes; + + bool operator==(const Info& rhs) const + { + return (rhs.mode == this->mode ) && + (rhs.gcodes == this->gcodes ); + } + bool operator!=(const Info& rhs) const { return !(*this == rhs); } +}; + +// If loaded configuration has a "colorprint_heights" option (if it was imported from older Slicer), +// and if CustomGCode::Info.gcodes is empty (there is no color print data available in a new format +// then CustomGCode::Info.gcodes should be updated considering this option. +extern void update_custom_gcode_per_print_z_from_config(Info& info, DynamicPrintConfig* config); + +// If information for custom Gcode per print Z was imported from older Slicer, mode will be undefined. +// So, we should set CustomGCode::Info.mode should be updated considering code values from items. +extern void check_mode_for_custom_gcode_per_print_z(Info& info); + +// Return pairs of sorted by increasing print_z from custom_gcode_per_print_z. +// print_z corresponds to the first layer printed with the new extruder. +std::vector> custom_tool_changes(const Info& custom_gcode_per_print_z, size_t num_extruders); + +} // namespace CustomGCode + +} // namespace Slic3r + + + +#endif /* slic3r_CustomGCode_hpp_ */ diff --git a/src/libslic3r/EdgeGrid.cpp b/src/libslic3r/EdgeGrid.cpp index 065a69ba36..486a7b1aa8 100644 --- a/src/libslic3r/EdgeGrid.cpp +++ b/src/libslic3r/EdgeGrid.cpp @@ -1147,7 +1147,7 @@ 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.); @@ -1586,12 +1586,17 @@ std::vector> ++ cnt; } } - len /= double(cnt); - bbox.offset(20); - EdgeGrid::Grid grid; - grid.set_bbox(bbox); - grid.create(polygons, len); - return grid.intersecting_edges(); + + std::vector> 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 81517a5c4b..6a9f482a1d 100644 --- a/src/libslic3r/EdgeGrid.hpp +++ b/src/libslic3r/EdgeGrid.hpp @@ -218,10 +218,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(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); 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)) diff --git a/src/libslic3r/ElephantFootCompensation.cpp b/src/libslic3r/ElephantFootCompensation.cpp index 69a20b5ece..c111576275 100644 --- a/src/libslic3r/ElephantFootCompensation.cpp +++ b/src/libslic3r/ElephantFootCompensation.cpp @@ -472,7 +472,7 @@ static inline void smooth_compensation_banded(const Points &contour, float band, float l2 = (pthis - pprev).squaredNorm(); if (l2 < dist_min2) { float l = sqrt(l2); - int jprev = exchange(j, prev_idx_modulo(j, contour)); + int jprev = std::exchange(j, prev_idx_modulo(j, contour)); while (j != i) { const Vec2f pp = contour[j].cast(); const float lthis = (pp - pprev).norm(); @@ -487,7 +487,7 @@ static inline void smooth_compensation_banded(const Points &contour, float band, prev = use_min ? std::min(prev, compensation[j]) : compensation[j]; pprev = pp; l = lnext; - jprev = exchange(j, prev_idx_modulo(j, contour)); + jprev = std::exchange(j, prev_idx_modulo(j, contour)); } } @@ -497,7 +497,7 @@ static inline void smooth_compensation_banded(const Points &contour, float band, l2 = (pprev - pthis).squaredNorm(); if (l2 < dist_min2) { float l = sqrt(l2); - int jprev = exchange(j, next_idx_modulo(j, contour)); + int jprev = std::exchange(j, next_idx_modulo(j, contour)); while (j != i) { const Vec2f pp = contour[j].cast(); const float lthis = (pp - pprev).norm(); @@ -512,7 +512,7 @@ static inline void smooth_compensation_banded(const Points &contour, float band, next = use_min ? std::min(next, compensation[j]) : compensation[j]; pprev = pp; l = lnext; - jprev = exchange(j, next_idx_modulo(j, contour)); + jprev = std::exchange(j, next_idx_modulo(j, contour)); } } @@ -524,11 +524,22 @@ static inline void smooth_compensation_banded(const Points &contour, float band, } } -ExPolygon elephant_foot_compensation(const ExPolygon &input_expoly, const Flow &external_perimeter_flow, const double compensation) +#ifndef NDEBUG +static bool validate_expoly_orientation(const ExPolygon &expoly) +{ + bool valid = expoly.contour.is_counter_clockwise(); + for (auto &h : expoly.holes) + valid &= h.is_clockwise(); + return valid; +} +#endif /* NDEBUG */ + +ExPolygon elephant_foot_compensation(const ExPolygon &input_expoly, double min_contour_width, const double compensation) { - // The contour shall be wide enough to apply the external perimeter plus compensation on both sides. - double min_contour_width = double(external_perimeter_flow.scaled_width() + external_perimeter_flow.scaled_spacing()); + assert(validate_expoly_orientation(input_expoly)); + double scaled_compensation = scale_(compensation); + min_contour_width = scale_(min_contour_width); double min_contour_width_compensated = min_contour_width + 2. * scaled_compensation; // Make the search radius a bit larger for the averaging in contour_distance over a fan of rays to work. double search_radius = min_contour_width_compensated + min_contour_width * 0.5; @@ -547,6 +558,7 @@ ExPolygon elephant_foot_compensation(const ExPolygon &input_expoly, const Flow & { EdgeGrid::Grid grid; ExPolygon simplified = input_expoly.simplify(SCALED_EPSILON).front(); + assert(validate_expoly_orientation(simplified)); BoundingBox bbox = get_extents(simplified.contour); bbox.offset(SCALED_EPSILON); grid.set_bbox(bbox); @@ -559,6 +571,7 @@ ExPolygon elephant_foot_compensation(const ExPolygon &input_expoly, const Flow & Polygon &poly = (idx_contour == 0) ? resampled.contour : resampled.holes[idx_contour - 1]; std::vector resampled_point_parameters; poly.points = resample_polygon(poly.points, resample_interval, resampled_point_parameters); + assert(poly.is_counter_clockwise() == (idx_contour == 0)); std::vector dists = contour_distance2(grid, idx_contour, poly.points, resampled_point_parameters, scaled_compensation, search_radius); for (float &d : dists) { // printf("Point %d, Distance: %lf\n", int(&d - dists.data()), unscale(d)); @@ -593,10 +606,18 @@ ExPolygon elephant_foot_compensation(const ExPolygon &input_expoly, const Flow & assert(out_vec.size() == 1); } } - + + assert(validate_expoly_orientation(out)); return out; } +ExPolygon elephant_foot_compensation(const ExPolygon &input, const Flow &external_perimeter_flow, const double compensation) +{ + // The contour shall be wide enough to apply the external perimeter plus compensation on both sides. + double min_contour_width = double(external_perimeter_flow.width + external_perimeter_flow.spacing()); + return elephant_foot_compensation(input, min_contour_width, compensation); +} + ExPolygons elephant_foot_compensation(const ExPolygons &input, const Flow &external_perimeter_flow, const double compensation) { ExPolygons out; @@ -606,4 +627,13 @@ ExPolygons elephant_foot_compensation(const ExPolygons &input, const Flow &exter return out; } +ExPolygons elephant_foot_compensation(const ExPolygons &input, double min_contour_width, const double compensation) +{ + ExPolygons out; + out.reserve(input.size()); + for (const ExPolygon &expoly : input) + out.emplace_back(elephant_foot_compensation(expoly, min_contour_width, compensation)); + return out; +} + } // namespace Slic3r diff --git a/src/libslic3r/ElephantFootCompensation.hpp b/src/libslic3r/ElephantFootCompensation.hpp index 0119df1af5..beb17d10b8 100644 --- a/src/libslic3r/ElephantFootCompensation.hpp +++ b/src/libslic3r/ElephantFootCompensation.hpp @@ -8,6 +8,8 @@ namespace Slic3r { class Flow; +ExPolygon elephant_foot_compensation(const ExPolygon &input, double min_countour_width, const double compensation); +ExPolygons elephant_foot_compensation(const ExPolygons &input, double min_countour_width, const double compensation); ExPolygon elephant_foot_compensation(const ExPolygon &input, const Flow &external_perimeter_flow, const double compensation); ExPolygons elephant_foot_compensation(const ExPolygons &input, const Flow &external_perimeter_flow, const double compensation); diff --git a/src/libslic3r/ExPolygon.cpp b/src/libslic3r/ExPolygon.cpp index f9c470450c..5bdd5055ec 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" @@ -404,7 +405,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 +420,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 +436,7 @@ void ExPolygon::triangulate_pp(Polygons* polygons) const std::list 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::iterator poly = output.begin(); poly != output.end(); ++poly) { @@ -548,7 +549,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 +592,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 } @@ -657,4 +658,23 @@ bool remove_sticks(ExPolygon &poly) return remove_sticks(poly.contour) || remove_sticks(poly.holes); } +void keep_largest_contour_only(ExPolygons &polygons) +{ + if (polygons.size() > 1) { + double max_area = 0.; + ExPolygon* max_area_polygon = nullptr; + for (ExPolygon& p : polygons) { + double a = p.contour.area(); + if (a > max_area) { + max_area = a; + max_area_polygon = &p; + } + } + assert(max_area_polygon != nullptr); + ExPolygon p(std::move(*max_area_polygon)); + polygons.clear(); + polygons.emplace_back(std::move(p)); + } +} + } // namespace Slic3r diff --git a/src/libslic3r/ExPolygon.hpp b/src/libslic3r/ExPolygon.hpp index 4ee8974f47..373853f972 100644 --- a/src/libslic3r/ExPolygon.hpp +++ b/src/libslic3r/ExPolygon.hpp @@ -19,7 +19,7 @@ class ExPolygon public: ExPolygon() {} ExPolygon(const ExPolygon &other) : contour(other.contour), holes(other.holes) {} - ExPolygon(ExPolygon &&other) : contour(std::move(other.contour)), holes(std::move(other.holes)) {} + ExPolygon(ExPolygon &&other) noexcept : contour(std::move(other.contour)), holes(std::move(other.holes)) {} explicit ExPolygon(const Polygon &contour) : contour(contour) {} explicit ExPolygon(Polygon &&contour) : contour(std::move(contour)) {} explicit ExPolygon(const Points &contour) : contour(contour) {} @@ -32,7 +32,7 @@ public: ExPolygon(std::initializer_list contour, std::initializer_list hole) : contour(contour), holes({ hole }) {} ExPolygon& operator=(const ExPolygon &other) { contour = other.contour; holes = other.holes; return *this; } - ExPolygon& operator=(ExPolygon &&other) { contour = std::move(other.contour); holes = std::move(other.holes); return *this; } + ExPolygon& operator=(ExPolygon &&other) noexcept { contour = std::move(other.contour); holes = std::move(other.holes); return *this; } Polygon contour; Polygons holes; @@ -327,11 +327,20 @@ extern BoundingBox get_extents_rotated(const ExPolygons &polygons, double angle) extern std::vector get_extents_vector(const ExPolygons &polygons); extern bool remove_sticks(ExPolygon &poly); +extern void keep_largest_contour_only(ExPolygons &polygons); extern std::list expoly_to_polypartition_input(const ExPolygons &expp); extern std::list expoly_to_polypartition_input(const ExPolygon &ex); extern std::vector polypartition_output_to_triangles(const std::list &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 0000000000..2879055335 --- /dev/null +++ b/src/libslic3r/Exception.hpp @@ -0,0 +1,30 @@ +#ifndef _libslic3r_Exception_h_ +#define _libslic3r_Exception_h_ + +#include + +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); +// 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/Extruder.cpp b/src/libslic3r/Extruder.cpp index 74d900825d..f7a5c50071 100644 --- a/src/libslic3r/Extruder.cpp +++ b/src/libslic3r/Extruder.cpp @@ -1,4 +1,5 @@ #include "Extruder.hpp" +#include "PrintConfig.hpp" namespace Slic3r { diff --git a/src/libslic3r/Extruder.hpp b/src/libslic3r/Extruder.hpp index df92bf84b3..e9c6927f85 100644 --- a/src/libslic3r/Extruder.hpp +++ b/src/libslic3r/Extruder.hpp @@ -3,10 +3,11 @@ #include "libslic3r.h" #include "Point.hpp" -#include "PrintConfig.hpp" namespace Slic3r { +class GCodeConfig; + class Extruder { public: @@ -48,9 +49,6 @@ public: double retract_length_toolchange() const; double retract_restart_extra_toolchange() const; - // Constructor for a key object, to be used by the stdlib search functions. - static Extruder key(unsigned int id) { return Extruder(id); } - private: // Private constructor to create a key for a search in std::set. Extruder(unsigned int id) : m_id(id) {} diff --git a/src/libslic3r/ExtrusionEntity.cpp b/src/libslic3r/ExtrusionEntity.cpp index c0d08c84b7..6516713ce6 100644 --- a/src/libslic3r/ExtrusionEntity.cpp +++ b/src/libslic3r/ExtrusionEntity.cpp @@ -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 b76991f1cc..6b0153b2ea 100644 --- a/src/libslic3r/ExtrusionEntity.hpp +++ b/src/libslic3r/ExtrusionEntity.hpp @@ -6,6 +6,7 @@ #include "Polyline.hpp" #include +#include 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 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.cpp b/src/libslic3r/ExtrusionEntityCollection.cpp index e1a9709d1a..391ac2d587 100644 --- a/src/libslic3r/ExtrusionEntityCollection.cpp +++ b/src/libslic3r/ExtrusionEntityCollection.cpp @@ -6,6 +6,18 @@ namespace Slic3r { +void filter_by_extrusion_role_in_place(ExtrusionEntitiesPtr &extrusion_entities, ExtrusionRole role) +{ + if (role != erMixed) { + auto first = extrusion_entities.begin(); + auto last = extrusion_entities.end(); + extrusion_entities.erase( + std::remove_if(first, last, [&role](const ExtrusionEntity* ee) { + return ee->role() != role; }), + last); + } +} + ExtrusionEntityCollection::ExtrusionEntityCollection(const ExtrusionPaths &paths) : no_sort(false) { @@ -74,31 +86,16 @@ void ExtrusionEntityCollection::remove(size_t i) this->entities.erase(this->entities.begin() + i); } -ExtrusionEntityCollection ExtrusionEntityCollection::chained_path_from(const Point &start_near, ExtrusionRole role) const +ExtrusionEntityCollection ExtrusionEntityCollection::chained_path_from(const ExtrusionEntitiesPtr& extrusion_entities, const Point &start_near, ExtrusionRole role) { - ExtrusionEntityCollection out; - if (this->no_sort) { - out = *this; - } else { - if (role == erMixed) - out = *this; - else { - for (const ExtrusionEntity *ee : this->entities) { - if (role != erMixed) { - // The caller wants only paths with a specific extrusion role. - auto role2 = ee->role(); - if (role != role2) { - // This extrusion entity does not match the role asked. - assert(role2 != erMixed); - continue; - } - } - out.entities.emplace_back(ee->clone()); - } - } - chain_and_reorder_extrusion_entities(out.entities, &start_near); - } - return out; + // Return a filtered copy of the collection. + ExtrusionEntityCollection out; + out.entities = filter_by_extrusion_role(extrusion_entities, role); + // Clone the extrusion entities. + for (auto &ptr : out.entities) + ptr = ptr->clone(); + chain_and_reorder_extrusion_entities(out.entities, &start_near); + return out; } void ExtrusionEntityCollection::polygons_covered_by_width(Polygons &out, const float scaled_epsilon) const diff --git a/src/libslic3r/ExtrusionEntityCollection.hpp b/src/libslic3r/ExtrusionEntityCollection.hpp index 3084e5741a..5e40ab32ec 100644 --- a/src/libslic3r/ExtrusionEntityCollection.hpp +++ b/src/libslic3r/ExtrusionEntityCollection.hpp @@ -2,10 +2,26 @@ #define slic3r_ExtrusionEntityCollection_hpp_ #include "libslic3r.h" +#include "Exception.hpp" #include "ExtrusionEntity.hpp" namespace Slic3r { +// Remove those items from extrusion_entities, that do not match role. +// Do nothing if role is mixed. +// Removed elements are NOT being deleted. +void filter_by_extrusion_role_in_place(ExtrusionEntitiesPtr &extrusion_entities, ExtrusionRole role); + +// Return new vector of ExtrusionEntities* with only those items from input extrusion_entities, that match role. +// Return all extrusion entities if role is mixed. +// Returned extrusion entities are shared with the source vector, they are NOT cloned, they are considered to be owned by extrusion_entities. +inline ExtrusionEntitiesPtr filter_by_extrusion_role(const ExtrusionEntitiesPtr &extrusion_entities, ExtrusionRole role) +{ + ExtrusionEntitiesPtr out { extrusion_entities }; + filter_by_extrusion_role_in_place(out, role); + return out; +} + class ExtrusionEntityCollection : public ExtrusionEntity { public: @@ -25,7 +41,7 @@ public: ~ExtrusionEntityCollection() { clear(); } explicit operator ExtrusionPaths() const; - bool is_collection() const { return true; } + bool is_collection() const override { return true; } ExtrusionRole role() const override { ExtrusionRole out = erNone; for (const ExtrusionEntity *ee : entities) { @@ -34,7 +50,7 @@ public: } return out; } - bool can_reverse() const { return !this->no_sort; } + bool can_reverse() const override { return !this->no_sort; } bool empty() const { return this->entities.empty(); } void clear(); void swap (ExtrusionEntityCollection &c); @@ -65,10 +81,12 @@ public: } void replace(size_t i, const ExtrusionEntity &entity); void remove(size_t i); - ExtrusionEntityCollection chained_path_from(const Point &start_near, ExtrusionRole role = erMixed) const; - void reverse(); - const Point& first_point() const { return this->entities.front()->first_point(); } - const Point& last_point() const { return this->entities.back()->last_point(); } + static ExtrusionEntityCollection chained_path_from(const ExtrusionEntitiesPtr &extrusion_entities, const Point &start_near, ExtrusionRole role = erMixed); + ExtrusionEntityCollection chained_path_from(const Point &start_near, ExtrusionRole role = erMixed) const + { return this->no_sort ? *this : chained_path_from(this->entities, start_near, role); } + void reverse() override; + const Point& first_point() const override { return this->entities.front()->first_point(); } + const Point& last_point() const override { return this->entities.back()->last_point(); } // Produce a list of 2D polygons covered by the extruded paths, offsetted by the extrusion width. // Increase the offset by scaled_epsilon to achieve an overlap, so a union will produce no gaps. void polygons_covered_by_width(Polygons &out, const float scaled_epsilon) const override; @@ -85,12 +103,12 @@ public: /// You should be iterating over flatten().entities if you are interested in the underlying ExtrusionEntities (and don't care about hierarchy). /// \param preserve_ordering Flag to method that will flatten if and only if the underlying collection is sortable when True (default: False). ExtrusionEntityCollection flatten(bool preserve_ordering = false) const; - double min_mm3_per_mm() const; + double min_mm3_per_mm() const override; double total_volume() const override { double volume=0.; for (const auto& ent : entities) volume+=ent->total_volume(); return volume; } // Following methods shall never be called on an ExtrusionEntityCollection. - Polyline as_polyline() const { - throw std::runtime_error("Calling as_polyline() on a ExtrusionEntityCollection"); + Polyline as_polyline() const override { + throw Slic3r::RuntimeError("Calling as_polyline() on a ExtrusionEntityCollection"); return Polyline(); }; @@ -100,11 +118,11 @@ public: } double length() const override { - throw std::runtime_error("Calling length() on a ExtrusionEntityCollection"); + throw Slic3r::RuntimeError("Calling length() on a ExtrusionEntityCollection"); return 0.; } }; -} +} // namespace Slic3r #endif diff --git a/src/libslic3r/FileParserError.hpp b/src/libslic3r/FileParserError.hpp index 3f560fa4f5..b7e63d84e0 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 ab20bbddb9..3e24d502d6 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -10,6 +10,7 @@ #include "../Surface.hpp" #include "FillBase.hpp" +#include "FillRectilinear2.hpp" namespace Slic3r { @@ -114,7 +115,7 @@ std::vector group_fills(const Layer &layer) if (surface.surface_type == stInternalVoid) has_internal_voids = true; else { - FlowRole extrusion_role = (surface.surface_type == stTop) ? frTopSolidInfill : (surface.is_solid() ? frSolidInfill : frInfill); + 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; @@ -132,7 +133,7 @@ std::vector group_fills(const Layer &layer) is_bridge ? erBridgeInfill : (surface.is_solid() ? - ((surface.surface_type == stTop) ? erTopSolidInfill : erSolidInfill) : + (surface.is_top() ? erTopSolidInfill : erSolidInfill) : erInternalInfill); params.bridge_angle = float(surface.bridge_angle); params.angle = float(Geometry::deg2rad(layerm.region()->config().fill_angle.value)); @@ -317,7 +318,7 @@ void export_group_fills_to_svg(const char *path, const std::vector #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 +345,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; @@ -372,7 +374,11 @@ void Layer::make_fills() // 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 +394,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 +424,170 @@ 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 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()); + + FillRectilinear2 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.dont_connect = true; + fill_params.dont_connect = false; + 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 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 9e35450849..64963495a3 100644 --- a/src/libslic3r/Fill/Fill.hpp +++ b/src/libslic3r/Fill/Fill.hpp @@ -6,7 +6,6 @@ #include #include "../libslic3r.h" -#include "../BoundingBox.hpp" #include "../PrintConfig.hpp" #include "FillBase.hpp" diff --git a/src/libslic3r/Fill/Fill3DHoneycomb.cpp b/src/libslic3r/Fill/Fill3DHoneycomb.cpp index 6c4b4d9036..8aac6e49c8 100644 --- a/src/libslic3r/Fill/Fill3DHoneycomb.cpp +++ b/src/libslic3r/Fill/Fill3DHoneycomb.cpp @@ -169,7 +169,7 @@ void Fill3DHoneycomb::_fill_surface_single( if (params.dont_connect) append(polylines_out, std::move(polylines_chained)); else - this->connect_infill(std::move(polylines_chained), expolygon, polylines_out, params); + this->connect_infill(std::move(polylines_chained), expolygon, polylines_out, this->spacing, params); } } diff --git a/src/libslic3r/Fill/FillAdaptive.cpp b/src/libslic3r/Fill/FillAdaptive.cpp new file mode 100644 index 0000000000..ba13b2a975 --- /dev/null +++ b/src/libslic3r/Fill/FillAdaptive.cpp @@ -0,0 +1,746 @@ +#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 + +#include +#include +#include + +// Boost pool: Don't use mutexes to synchronize memory allocation. +#define BOOST_POOL_NO_MT +#include + +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 +bool triangle_AABB_intersects(const Vector &a, const Vector &b, const Vector &c, const BoundingBoxBase &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 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 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 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 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 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 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 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 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 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::max(); + const Vec3d v1 = b - a; + auto l1 = v1.squaredNorm(); + const Vec3d v2 = c - b; + auto l2 = v2.squaredNorm(); + const Vec3d v3 = a - c; + auto l3 = v3.squaredNorm(); + + // Is the triangle valid? + if (l1 > 0. && l2 > 0. && l3 > 0.) + { + // 1) Project point into the plane of the triangle. + const Vec3d n = v1.cross(v2); + double d = (p - a).dot(n); + const Vec3d foot_pt = p - n * d / n.squaredNorm(); + + // 2) Maximum projection of n. + int proj_axis; + n.array().cwiseAbs().maxCoeff(&proj_axis); + + // 3) Test whether the foot_pt is inside the triangle. + { + auto inside_triangle = [](const Vec2d& v1, const Vec2d& v2, const Vec2d& v3, const Vec2d& pt) { + const double d1 = cross2(v1, pt); + const double d2 = cross2(v2, pt); + const double d3 = cross2(v3, pt); + // Testing both CCW and CW orientations. + return (d1 >= 0. && d2 >= 0. && d3 >= 0.) || (d1 <= 0. && d2 <= 0. && d3 <= 0.); + }; + bool inside; + switch (proj_axis) { + case 0: + inside = inside_triangle({v1.y(), v1.z()}, {v2.y(), v2.z()}, {v3.y(), v3.z()}, {foot_pt.y(), foot_pt.z()}); break; + case 1: + inside = inside_triangle({v1.z(), v1.x()}, {v2.z(), v2.x()}, {v3.z(), v3.x()}, {foot_pt.z(), foot_pt.x()}); break; + default: + assert(proj_axis == 2); + inside = inside_triangle({v1.x(), v1.y()}, {v2.x(), v2.y()}, {v3.x(), v3.y()}, {foot_pt.x(), foot_pt.y()}); break; + } + if (inside) + return (p - foot_pt).squaredNorm(); + } + + // 4) Find minimum distance to triangle vertices and edges. + out = std::min((p - a).squaredNorm(), std::min((p - b).squaredNorm(), (p - c).squaredNorm())); + auto t = (p - a).dot(v1); + if (t > 0. && t < l1) + out = std::min(out, (a + v1 * (t / l1) - p).squaredNorm()); + t = (p - b).dot(v2); + if (t > 0. && t < l2) + out = std::min(out, (b + v2 * (t / l2) - p).squaredNorm()); + t = (p - c).dot(v3); + if (t > 0. && t < l3) + out = std::min(out, (c + v3 * (t / l3) - p).squaredNorm()); + } + + return out; +} + +// Ordering of children cubes. +static const std::array child_centers { + 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, 3> child_traversal_order { + std::array{ 2, 3, 0, 1, 6, 7, 4, 5 }, + std::array{ 4, 0, 6, 2, 5, 1, 7, 3 }, + std::array{ 1, 5, 0, 4, 3, 7, 2, 6 }, +}; + +struct Cube +{ + Vec3d center; +#ifndef NDEBUG + Vec3d center_octree; +#endif // NDEBUG + std::array children {}; // initialized to nullptrs + Cube(const Vec3d ¢er) : 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 pool; + Cube* root_cube { nullptr }; + Vec3d origin; + std::vector cubes_properties; + + Octree(const Vec3d &origin, const std::vector &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 ¤t_bbox, int depth); +}; + +void OctreeDeleter::operator()(Octree *p) { + delete p; +} + +std::pair 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 region_fill_data; + region_fill_data.reserve(print_object.print()->regions().size()); + bool build_octree = false; + const std::vector &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, 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; + region_fill_data.push_back(RegionFillData({ + has_adaptive_infill ? Tristate::Maybe : Tristate::No, + has_support_infill ? Tristate::Maybe : Tristate::No, + config.fill_density, + config.infill_extrusion_width != 0. ? config.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::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 &cubes_properties; + // Top of the current layer. + const double z_position; + // Order of traversal for this line direction. + const std::array 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 temp_lines; + // Final output + std::vector 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 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 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 &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::max()) { + last_line.a = new_line.a; + } else if ((new_line.a - last_line.b).cwiseAbs().maxCoeff() > 300) { // 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) +{ + 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) { + Vec2d a = polyline.points.front().cast(); + Vec2d d = polyline.points.back().cast(); + 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(); + polyline.points.back() = d.cast(); + } else + polyline.points.clear(); + } else if (polyline.size() > 2) { + Vec2d b = polyline.points[1].cast(); + Vec2d c = polyline.points[polyline.points.size() - 2].cast(); + Vec2d v = b - a; + double l = v.norm(); + if (l > trim_length) { + a += v * trim_length / l; + polyline.points.front() = a.cast(); + } 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(); + else + polyline.points.pop_back(); + } + svg.draw(polyline, "black"); + } +} +#endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */ + +void Filler::_fill_surface_single( + const FillParams & params, + unsigned int thickness_layers, + const std::pair &direction, + ExPolygon &expolygon, + Polylines &polylines_out) +{ + assert (this->adapt_fill_octree); + + Polylines all_polylines; + { + // 3 contexts for three directions of infill lines + std::array 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(); + } + // Collect the lines. + std::vector 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::max()) + lines.emplace_back(line); + } +#if 0 + // Chain touching line segments, convert lines to polylines. + //all_polylines = chain_lines(lines, 300.); // SCALED_EPSILON is 100 and it is not enough +#else + // 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 }; }); +#endif + } + + // Crop all polylines + all_polylines = intersection_pl(std::move(all_polylines), to_polygons(expolygon)); + +#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 */ + + if (params.dont_connect || all_polylines.size() <= 1) + append(polylines_out, std::move(all_polylines)); + else + connect_infill(chain_polylines(std::move(all_polylines)), 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 ¢er) +{ + const auto p = (bbox.min - center); + const auto s = bbox.size(); + double r2max = 0.; + for (int i = 0; i < 8; ++ i) + r2max = std::max(r2max, (p + Vec3d(s.x() * double(i & 1), s.y() * double(i & 2), s.z() * double(i & 4))).squaredNorm()); + return sqrt(r2max); +} + +static std::vector make_cubes_properties(double max_cube_edge_length, double line_spacing) +{ + max_cube_edge_length += EPSILON; + + std::vector 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 &overhang_triangles, + coordf_t line_spacing, + bool support_overhangs_only) +{ + assert(line_spacing > 0); + assert(! std::isnan(line_spacing)); + + BoundingBox3Base bbox(triangle_mesh.vertices); + Vec3d cube_center = bbox.center().cast(); + std::vector 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(); + auto b = triangle_mesh.vertices[tri[1]].cast(); + auto c = triangle_mesh.vertices[tri[2]].cast(); + 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 ¤t_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 0000000000..f10c40b99f --- /dev/null +++ b/src/libslic3r/Fill/FillAdaptive.hpp @@ -0,0 +1,75 @@ +// 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; + +// 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 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 &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: + virtual ~Filler() {} + +protected: + virtual Fill* clone() const { return new Filler(*this); }; + virtual void _fill_surface_single( + const FillParams ¶ms, + unsigned int thickness_layers, + const std::pair &direction, + ExPolygon &expolygon, + Polylines &polylines_out); + virtual bool no_sort() const { return true; } +}; + +}; // namespace FillAdaptive +} // namespace Slic3r + +#endif // slic3r_FillAdaptive_hpp_ diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp index 88eba9a51f..3d5415d3c0 100644 --- a/src/libslic3r/Fill/FillBase.cpp +++ b/src/libslic3r/Fill/FillBase.cpp @@ -2,6 +2,7 @@ #include "../ClipperUtils.hpp" #include "../EdgeGrid.hpp" +#include "../Geometry.hpp" #include "../Surface.hpp" #include "../PrintConfig.hpp" #include "../libslic3r.h" @@ -14,7 +15,7 @@ #include "FillPlanePath.hpp" #include "FillRectilinear.hpp" #include "FillRectilinear2.hpp" -#include "FillRectilinear3.hpp" +#include "FillAdaptive.hpp" namespace Slic3r { @@ -26,7 +27,7 @@ Fill* Fill::new_from_type(const InfillPattern type) case ip3DHoneycomb: return new Fill3DHoneycomb(); case ipGyroid: return new FillGyroid(); case ipRectilinear: return new FillRectilinear2(); -// case ipRectilinear: return new FillRectilinear(); + case ipMonotonic: return new FillMonotonic(); case ipLine: return new FillLine(); case ipGrid: return new FillGrid2(); case ipTriangles: return new FillTriangles(); @@ -36,7 +37,9 @@ Fill* Fill::new_from_type(const InfillPattern type) 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"); } } @@ -609,16 +612,15 @@ static inline SegmentPoint clip_start_segment_and_point(const Points &polyline, // Initialized to "invalid". SegmentPoint out; if (polyline.size() >= 2) { - const double d2 = distance * distance; Vec2d pt_prev = polyline.front().cast(); - for (int i = 1; i < polyline.size(); ++ i) { + for (size_t i = 1; i < polyline.size(); ++ i) { Vec2d pt = polyline[i].cast(); Vec2d v = pt - pt_prev; double l2 = v.squaredNorm(); - if (l2 > d2) { + if (l2 > distance * distance) { out.idx_segment = i; out.t = distance / sqrt(l2); - out.point = pt + out.t * v; + out.point = pt_prev + out.t * v; break; } distance -= sqrt(l2); @@ -635,16 +637,17 @@ static inline SegmentPoint clip_end_segment_and_point(const Points &polyline, do // Initialized to "invalid". SegmentPoint out; if (polyline.size() >= 2) { - const double d2 = distance * distance; Vec2d pt_next = polyline.back().cast(); for (int i = int(polyline.size()) - 2; i >= 0; -- i) { Vec2d pt = polyline[i].cast(); Vec2d v = pt - pt_next; double l2 = v.squaredNorm(); - if (l2 > d2) { + if (l2 > distance * distance) { out.idx_segment = i; out.t = distance / sqrt(l2); - out.point = pt + out.t * v; + 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); @@ -654,21 +657,26 @@ static inline SegmentPoint clip_end_segment_and_point(const Points &polyline, do 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) +{ + 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(); +} + static inline double segment_point_distance_squared(const Vec2d &p1a, const Vec2d &p1b, const Vec2d &p2) { - const Vec2d v = p1b - p1a; - const Vec2d va = p2 - p1a; - const double l2 = v.squaredNorm(); + const Vec2d v = p1b - p1a; + const double l2 = v.squaredNorm(); if (l2 < EPSILON) // p1a == p1b - return va.squaredNorm(); - // Project p2 onto the (p1a, p1b) segment. - const double t = va.dot(v); - if (t < 0.) - return va.squaredNorm(); - else if (t > l2) - return (p2 - p1b).squaredNorm(); - return ((t / l2) * v - va).squaredNorm(); + return (p2 - p1a).squaredNorm(); + return segment_point_distance_squared(p1a, p1b, v, v.squaredNorm(), p2); } // Distance to the closest point of line. @@ -684,43 +692,11 @@ static inline double min_distance_of_segments(const Vec2d &p1a, const Vec2d &p1b 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, p2a); + return segment_point_distance_squared(p1a, p1b, v1, l1_2, p2a); - // Project p2a, p2b onto the (p1a, p1b) segment. - auto project_p2a_p2b_onto_seg_p1a_p1b = [](const Vec2d& p1a, const Vec2d& p1b, const Vec2d& p2a, const Vec2d& p2b, const Vec2d& v1, const double l1_2) { - Vec2d v1a2a = p2a - p1a; - Vec2d v1a2b = p2b - p1a; - double t1 = v1a2a.dot(v1); - double t2 = v1a2b.dot(v1); - if (t1 <= 0.) { - if (t2 <= 0.) - // Both p2a and p2b are left of v1. - return (((t1 < t2) ? p2b : p2a) - p1a).squaredNorm(); - else if (t2 < l1_2) - // Project p2b onto the (p1a, p1b) segment. - return ((t2 / l1_2) * v1 - v1a2b).squaredNorm(); - } - else if (t1 >= l1_2) { - if (t2 >= l1_2) - // Both p2a and p2b are right of v1. - return (((t1 < t2) ? p2a : p2b) - p1b).squaredNorm(); - else if (t2 < l1_2) - // Project p2b onto the (p1a, p1b) segment. - return ((t2 / l1_2) * v1 - v1a2b).squaredNorm(); - } - else { - // Project p1b onto the (p1a, p1b) segment. - double dist_min = ((t2 / l1_2) * v1 - v1a2a).squaredNorm(); - if (t2 > 0. && t2 < l1_2) - dist_min = std::min(dist_min, ((t2 / l1_2) * v1 - v1a2b).squaredNorm()); - return dist_min; - } - return std::numeric_limits::max(); - }; - - return std::min( - project_p2a_p2b_onto_seg_p1a_p1b(p1a, p1b, p2a, p2b, v1, l1_2), - project_p2a_p2b_onto_seg_p1a_p1b(p2a, p2b, p1a, p1b, v2, l2_2)); + 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))); } // Mark the segments of split boundary as consumed if they are very close to some of the infill line. @@ -756,11 +732,26 @@ void mark_boundary_segments_touching_infill( const Vec2d seg_pt2 = segment.second.cast(); 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]; + 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. - if (segment_point_distance_squared(*this->pt1, *this->pt2, seg_pt1) < this->dist2_max) + 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 + { + 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(), this->pt2->cast()), "magenta"); + } +#endif } } // Continue traversing the grid along the edge. @@ -777,6 +768,9 @@ void mark_boundary_segments_touching_infill( const Vec2d *pt2; } visitor(grid, boundary, boundary_data, distance_colliding * distance_colliding); + BoundingBoxf bboxf(boundary_bbox.min.cast(), boundary_bbox.max.cast()); + bboxf.offset(- SCALED_EPSILON); + for (const Polyline &polyline : infill) { // Clip the infill polyline by the Eucledian distance along the polyline. SegmentPoint start_point = clip_start_segment_and_point(polyline.points, clip_distance); @@ -806,25 +800,39 @@ void mark_boundary_segments_touching_infill( visitor.init(pt1d, pt2d); grid.visit_cells_intersecting_thick_line(pt1, pt2, distance_colliding, visitor); #else - Vec2d pt1 = (point_idx == start_point.idx_segment) ? start_point.point : polyline.points[point_idx].cast(); - Vec2d pt2 = (point_idx == end_point .idx_segment) ? end_point .point : polyline.points[point_idx].cast(); + Vec2d pt1 = (point_idx == start_point.idx_segment) ? start_point.point : polyline.points[point_idx ].cast(); + Vec2d pt2 = (point_idx == end_point .idx_segment) ? end_point .point : polyline.points[point_idx + 1].cast(); +#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_infill0", iRun ++).c_str(), get_extents(expoly)); + svg.draw(expoly, "green"); + svg.draw(polyline, "blue"); + svg.draw(Line(pt1.cast(), pt2.cast()), "magenta", scale_(0.1)); + } +#endif 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 a = pt1 - v - vperp; Vec2d b = pt1 + v - vperp; - grid.visit_cells_intersecting_line(a.cast(), b.cast(), visitor); + if (Geometry::liang_barsky_line_clipping(a, b, bboxf)) + grid.visit_cells_intersecting_line(a.cast(), b.cast(), visitor); a = pt1 - v + vperp; b = pt1 + v + vperp; - grid.visit_cells_intersecting_line(a.cast(), b.cast(), visitor); + if (Geometry::liang_barsky_line_clipping(a, b, bboxf)) + grid.visit_cells_intersecting_line(a.cast(), b.cast(), visitor); #endif } } } } -void Fill::connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary_src, Polylines &polylines_out, const FillParams ¶ms) +void Fill::connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary_src, Polylines &polylines_out, const double spacing, const FillParams ¶ms) { assert(! infill_ordered.empty()); assert(! boundary_src.contour.points.empty()); @@ -838,8 +846,9 @@ void Fill::connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary_ boundary.assign(boundary_src.holes.size() + 1, Points()); boundary_data.assign(boundary_src.holes.size() + 1, std::vector()); // Mapping the infill_ordered end point to a (contour, point) of boundary. - std::vector> map_infill_end_point_to_boundary; - map_infill_end_point_to_boundary.assign(infill_ordered.size() * 2, std::pair(std::numeric_limits::max(), std::numeric_limits::max())); + std::vector> map_infill_end_point_to_boundary; + static constexpr auto boundary_idx_unconnected = std::numeric_limits::max(); + map_infill_end_point_to_boundary.assign(infill_ordered.size() * 2, std::pair(boundary_idx_unconnected, boundary_idx_unconnected)); { // Project the infill_ordered end points onto boundary_src. std::vector> intersection_points; @@ -889,27 +898,28 @@ void Fill::connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary_ contour_data.front().param = contour_data.back().param + (contour_dst.back().cast() - contour_dst.front().cast()).norm(); } -#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(), +#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 std::pair &contour_point) { return contour_point.first < boundary.size() && contour_point.second < boundary[contour_point.first].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. { - //const double clip_distance = scale_(this->spacing); - const double clip_distance = 3. * scale_(this->spacing); - const double distance_colliding = scale_(this->spacing); + // @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); } // Connection from end of one infill line to the start of another infill line. - //const float length_max = scale_(this->spacing); -// const float length_max = scale_((2. / params.density) * this->spacing); - const float length_max = scale_((1000. / params.density) * this->spacing); + //const float length_max = scale_(spacing); +// const float length_max = scale_((2. / params.density) * spacing); + const float length_max = scale_((1000. / params.density) * spacing); std::vector merged_with(infill_ordered.size()); for (size_t i = 0; i < merged_with.size(); ++ i) merged_with[i] = i; @@ -926,9 +936,9 @@ void Fill::connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary_ const Polyline &pl2 = infill_ordered[idx_chain]; const std::pair *cp1 = &map_infill_end_point_to_boundary[(idx_chain - 1) * 2 + 1]; const std::pair *cp2 = &map_infill_end_point_to_boundary[idx_chain * 2]; - const std::vector &contour_data = boundary_data[cp1->first]; - if (cp1->first == cp2->first) { + if (cp1->first != boundary_idx_unconnected && cp1->first == cp2->first) { // End points on the same contour. Try to connect them. + const std::vector &contour_data = boundary_data[cp1->first]; 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; @@ -951,12 +961,26 @@ void Fill::connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary_ size_t idx_chain_last = 0; for (ConnectionCost &connection_cost : connections_sorted) { - const std::pair *cp1 = &map_infill_end_point_to_boundary[connection_cost.idx_first * 2 + 1]; - const std::pair *cp2 = &map_infill_end_point_to_boundary[(connection_cost.idx_first + 1) * 2]; - assert(cp1->first == cp2->first); + const std::pair *cp1 = &map_infill_end_point_to_boundary[connection_cost.idx_first * 2 + 1]; + const std::pair *cp1prev = cp1 - 1; + const std::pair *cp2 = &map_infill_end_point_to_boundary[(connection_cost.idx_first + 1) * 2]; + const std::pair *cp2next = cp2 + 1; + assert(cp1->first == cp2->first && cp1->first != boundary_idx_unconnected); std::vector &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; @@ -975,6 +999,10 @@ void Fill::connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary_ // 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; } 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) diff --git a/src/libslic3r/Fill/FillBase.hpp b/src/libslic3r/Fill/FillBase.hpp index d005f6e4ad..e25480fa57 100644 --- a/src/libslic3r/Fill/FillBase.hpp +++ b/src/libslic3r/Fill/FillBase.hpp @@ -5,42 +5,51 @@ #include #include #include +#include #include #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; } // 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; + bool dont_connect { false }; // 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::value, "FillParams class is not POD (and it should be - see constructor)."); @@ -66,6 +75,9 @@ 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() {} @@ -111,9 +123,9 @@ protected: virtual std::pair _infill_direction(const Surface *surface) const; - void connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary, Polylines &polylines_out, const FillParams ¶ms); - public: + static void connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary, Polylines &polylines_out, double spacing, const FillParams ¶ms); + static coord_t _adjust_solid_spacing(const coord_t width, const coord_t distance); // Align a coordinate to a grid. The coordinate may be negative, diff --git a/src/libslic3r/Fill/FillGyroid.cpp b/src/libslic3r/Fill/FillGyroid.cpp index ed0586edfe..964b87cefc 100644 --- a/src/libslic3r/Fill/FillGyroid.cpp +++ b/src/libslic3r/Fill/FillGyroid.cpp @@ -156,7 +156,7 @@ void FillGyroid::_fill_surface_single( Polylines &polylines_out) { float infill_angle = this->angle + (CorrectionAngle * 2*M_PI) / 360.; - if(abs(infill_angle) >= EPSILON) + if(std::abs(infill_angle) >= EPSILON) expolygon.rotate(-infill_angle); BoundingBox bb = expolygon.contour.bounding_box(); @@ -185,6 +185,7 @@ void FillGyroid::_fill_surface_single( if (! polylines.empty()) // remove too small bits (larger than longer) 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); }), polylines.end()); @@ -195,9 +196,10 @@ void FillGyroid::_fill_surface_single( if (params.dont_connect) append(polylines_out, std::move(polylines)); else - this->connect_infill(std::move(polylines), expolygon, polylines_out, params); + 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/FillRectilinear2.cpp b/src/libslic3r/Fill/FillRectilinear2.cpp index 8aea758860..493bb7c6f3 100644 --- a/src/libslic3r/Fill/FillRectilinear2.cpp +++ b/src/libslic3r/Fill/FillRectilinear2.cpp @@ -4,7 +4,9 @@ #include #include #include +#include +#include #include #include "../ClipperUtils.hpp" @@ -105,26 +107,15 @@ static inline void polygon_segment_append_reversed(Points &out, const Polygon &p } // Intersection point of a vertical line with a polygon segment. -class SegmentIntersection +struct 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; + size_t iContour { 0 }; // 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; + 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. @@ -141,30 +132,131 @@ public: // 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 + enum SegmentIntersectionType : char { + UNKNOWN, + OUTER_LOW, + OUTER_HIGH, + INNER_LOW, + INNER_HIGH, }; - SegmentIntersectionType type; + SegmentIntersectionType type { UNKNOWN }; + // 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 }; + + 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; + 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; + 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; } + 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. @@ -250,11 +342,11 @@ public: 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. -class SegmentedIntersectionLine +struct SegmentedIntersectionLine { -public: // Index of this vertical intersection line. size_t idx; // x position of this vertical intersection line. @@ -263,6 +355,25 @@ public: std::vector intersections; }; +static SegmentIntersection phony_outer_intersection(SegmentIntersection::SegmentIntersectionType type, coord_t pos) +{ + assert(type == SegmentIntersection::OUTER_LOW || type == SegmentIntersection::OUTER_HIGH); + SegmentIntersection out; + // Invalid contour & segment. + out.iContour = std::numeric_limits::max(); + out.iSegment = std::numeric_limits::max(); + out.pos_p = pos; + out.type = type; + // Invalid prev / next. + out.prev_on_contour = -1; + out.next_on_contour = -1; + out.prev_on_contour_type = SegmentIntersection::LinkType::Phony; + out.next_on_contour_type = SegmentIntersection::LinkType::Phony; + out.prev_on_contour_quality = SegmentIntersection::LinkQuality::Invalid; + out.next_on_contour_quality = SegmentIntersection::LinkQuality::Invalid; + return out; +} + // A container maintaining an expolygon with its inner offsetted polygon. // The purpose of the inner offsetted polygon is to provide segments to connect the infill lines. struct ExPolygonWithOffset @@ -290,10 +401,10 @@ public: // bool sticks_removed = remove_sticks(polygons_src); // if (sticks_removed) printf("Sticks removed!\n"); - polygons_outer = offset(polygons_src, aoffset1, + polygons_outer = offset(polygons_src, float(aoffset1), ClipperLib::jtMiter, mitterLimit); - polygons_inner = offset(polygons_outer, aoffset2 - aoffset1, + 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. @@ -364,226 +475,92 @@ static inline int distance_of_segmens(const Polygon &poly, size_t seg1, size_t s return d; } -// For a vertical line, an inner contour and an intersection point, -// find an intersection point on the previous resp. next vertical line. -// The intersection point is connected with the prev resp. next intersection point with iInnerContour. -// Return -1 if there is no such point on the previous resp. next vertical line. -static inline int intersection_on_prev_next_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - bool dir_is_next) -{ - size_t iVerticalLineOther = iVerticalLine; - if (dir_is_next) { - if (++ iVerticalLineOther == segs.size()) - // No successive vertical line. - return -1; - } else if (iVerticalLineOther -- == 0) { - // No preceding vertical line. - return -1; - } - - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); -// const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour); - const bool forward = itsct.is_low() == dir_is_next; - // Resulting index of an intersection point on il2. - int out = -1; - // Find an intersection point on iVerticalLineOther, intersecting iInnerContour - // at the same orientation as iIntersection, and being closest to iIntersection - // in the number of contour segments, when following the direction of the contour. - int dmin = std::numeric_limits::max(); - for (size_t i = 0; i < il2.intersections.size(); ++ i) { - const SegmentIntersection &itsct2 = il2.intersections[i]; - if (itsct.iContour == itsct2.iContour && itsct.type == itsct2.type) { - /* - if (itsct.is_low()) { - assert(itsct.type == SegmentIntersection::INNER_LOW); - assert(iIntersection > 0); - assert(il.intersections[iIntersection-1].type == SegmentIntersection::OUTER_LOW); - assert(i > 0); - if (il2.intersections[i-1].is_inner()) - // Take only the lowest inner intersection point. - continue; - assert(il2.intersections[i-1].type == SegmentIntersection::OUTER_LOW); - } else { - assert(itsct.type == SegmentIntersection::INNER_HIGH); - assert(iIntersection+1 < il.intersections.size()); - assert(il.intersections[iIntersection+1].type == SegmentIntersection::OUTER_HIGH); - assert(i+1 < il2.intersections.size()); - if (il2.intersections[i+1].is_inner()) - // Take only the highest inner intersection point. - continue; - assert(il2.intersections[i+1].type == SegmentIntersection::OUTER_HIGH); - } - */ - // The intersection points lie on the same contour and have the same orientation. - // Find the intersection point with a shortest path in the direction of the contour. - int d = distance_of_segmens(poly, itsct.iSegment, itsct2.iSegment, forward); - if (d < dmin) { - out = i; - dmin = d; - } - } - } - //FIXME this routine is not asymptotic optimal, it will be slow if there are many intersection points along the line. - return out; -} - -static inline int intersection_on_prev_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection) -{ - return intersection_on_prev_next_vertical_line(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, false); -} - -static inline int intersection_on_next_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection) -{ - return intersection_on_prev_next_vertical_line(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, true); -} - -enum IntersectionTypeOtherVLine { - // There is no connection point on the other vertical line. - INTERSECTION_TYPE_OTHER_VLINE_UNDEFINED = -1, - // Connection point on the other vertical segment was found - // and it could be followed. - INTERSECTION_TYPE_OTHER_VLINE_OK = 0, - // The connection segment connects to a middle of a vertical segment. - // Cannot follow. - INTERSECTION_TYPE_OTHER_VLINE_INNER, - // Cannot extend the contor to this intersection point as either the connection segment - // or the succeeding vertical segment were already consumed. - INTERSECTION_TYPE_OTHER_VLINE_CONSUMED, - // Not the first intersection along the contor. This intersection point - // has been preceded by an intersection point along the vertical line. - INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST, -}; - // Find an intersection on a previous line, but return -1, if the connecting segment of a perimeter was already extruded. -static inline IntersectionTypeOtherVLine intersection_type_on_prev_next_vertical_line( +static inline bool intersection_on_prev_next_vertical_line_valid( const std::vector &segs, size_t iVerticalLine, size_t iIntersection, - size_t iIntersectionOther, - bool dir_is_next) + SegmentIntersection::Side side) { - // 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()); + 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 < il_other.intersections.size()); + assert(iIntersectionOther + 1 < vline_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()) + 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 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) + 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 INTERSECTION_TYPE_OTHER_VLINE_CONSUMED; - if (itsct_other.is_low() ? itsct_other.consumed_vertical_up : il_other.intersections[iIntersectionOther-1].consumed_vertical_up) + 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 INTERSECTION_TYPE_OTHER_VLINE_CONSUMED; - return INTERSECTION_TYPE_OTHER_VLINE_OK; + 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 IntersectionTypeOtherVLine intersection_type_on_prev_vertical_line( +static inline bool intersection_on_prev_vertical_line_valid( const std::vector &segs, size_t iVerticalLine, - size_t iIntersection, - size_t iIntersectionPrev) + size_t iIntersection) { - return intersection_type_on_prev_next_vertical_line(segs, iVerticalLine, iIntersection, iIntersectionPrev, false); + return intersection_on_prev_next_vertical_line_valid(segs, iVerticalLine, iIntersection, SegmentIntersection::Side::Left); } -static inline IntersectionTypeOtherVLine intersection_type_on_next_vertical_line( +static inline bool intersection_on_next_vertical_line_valid( const std::vector &segs, size_t iVerticalLine, - size_t iIntersection, - size_t iIntersectionNext) + size_t iIntersection) { - return intersection_type_on_prev_next_vertical_line(segs, iVerticalLine, iIntersection, iIntersectionNext, true); + 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_prev_next_segment_length( +static inline coordf_t measure_perimeter_horizontal_segment_length( const ExPolygonWithOffset &poly_with_offset, const std::vector &segs, size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2, - bool dir_is_next) -{ - size_t iVerticalLineOther = iVerticalLine; - if (dir_is_next) { - if (++ iVerticalLineOther == segs.size()) - // No successive vertical line. - return coordf_t(-1); - } else if (iVerticalLineOther -- == 0) { - // No preceding vertical line. - return coordf_t(-1); - } - - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther]; - const SegmentIntersection &itsct2 = il2.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); -// const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour); - assert(itsct.type == itsct2.type); - assert(itsct.iContour == itsct2.iContour); - assert(itsct.is_inner()); - const bool forward = itsct.is_low() == dir_is_next; - - Point p1(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 &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); -} + 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); -static inline coordf_t measure_perimeter_next_segment_length( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2) -{ - return measure_perimeter_prev_next_segment_length(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, iIntersection2, true); + 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. @@ -632,7 +609,6 @@ static inline coordf_t measure_perimeter_segment_on_vertical_line_length( const ExPolygonWithOffset &poly_with_offset, const std::vector &segs, size_t iVerticalLine, - size_t iInnerContour, size_t iIntersection, size_t iIntersection2, bool forward) @@ -640,11 +616,9 @@ static inline coordf_t measure_perimeter_segment_on_vertical_line_length( 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()); + const Polygon &poly = poly_with_offset.contour(itsct.iContour); + assert(itsct.is_inner() == 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()); @@ -730,10 +704,10 @@ static inline float measure_outer_contour_slab( distance_of_segmens(poly, iSegBelow, itsct.iSegment, true); int d_up = (iAbove == -1) ? std::numeric_limits::max() : distance_of_segmens(poly, iSegAbove, itsct.iSegment, true); - if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up)) + 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. - intrsctn_type_prev = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST; + 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; @@ -759,80 +733,15 @@ enum DirectionMask DIR_BACKWARD = 2 }; -bool FillRectilinear2::fill_surface_by_lines(const Surface *surface, const FillParams ¶ms, float angleBase, float pattern_shift, Polylines &polylines_out) +static std::vector slice_region_by_vertical_lines(const ExPolygonWithOffset &poly_with_offset, size_t n_vlines, coord_t x0, coord_t line_spacing) { - // 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 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(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 segs(n_vlines, SegmentedIntersectionLine()); - for (size_t i = 0; i < n_vlines; ++ i) { + 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) @@ -977,26 +886,1793 @@ bool FillRectilinear2::fill_surface_by_lines(const Surface *surface, const FillP } // Verify the segments. If something is wrong, give up. -#define ASSERT_OR_RETURN(CONDITION) do { assert(CONDITION); if (! (CONDITION)) return false; } while (0) +#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_OR_RETURN((sil.intersections.size() & 1) == 0); + 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_OR_RETURN(sil.intersections[i].type == SegmentIntersection::OUTER_LOW); + ASSERT_THROW(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); + 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_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); + 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_OR_RETURN +#undef ASSERT_THROW + + return segs; +} + +#ifndef NDEBUG +bool validate_segment_intersection_connectivity(const std::vector &segs) +{ + // Validate the connectivity. + for (size_t i_vline = 0; i_vline + 1 < segs.size(); ++ i_vline) { + const SegmentedIntersectionLine &il_left = segs[i_vline]; + const SegmentedIntersectionLine &il_right = segs[i_vline + 1]; + for (const SegmentIntersection &it : il_left.intersections) { + if (it.has_right_horizontal()) { + const SegmentIntersection &it_right = il_right.intersections[it.right_horizontal()]; + // For a right link there is a symmetric left link. + assert(it.iContour == it_right.iContour); + assert(it.type == it_right.type); + assert(it_right.has_left_horizontal()); + assert(it_right.left_horizontal() == int(&it - il_left.intersections.data())); + } + } + for (const SegmentIntersection &it : il_right.intersections) { + if (it.has_left_horizontal()) { + const SegmentIntersection &it_left = il_left.intersections[it.left_horizontal()]; + // For a right link there is a symmetric left link. + assert(it.iContour == it_left.iContour); + assert(it.type == it_left.type); + assert(it_left.has_right_horizontal()); + assert(it_left.right_horizontal() == int(&it - il_right.intersections.data())); + } + } + } + for (size_t i_vline = 0; i_vline < segs.size(); ++ i_vline) { + const SegmentedIntersectionLine &il = segs[i_vline]; + for (const SegmentIntersection &it : il.intersections) { + auto i_it = int(&it - il.intersections.data()); + if (it.has_left_vertical_up()) { + assert(il.intersections[it.left_vertical_up()].left_vertical_down() == i_it); + assert(il.intersections[it.left_vertical_up()].prev_on_contour_quality == it.prev_on_contour_quality); + } + if (it.has_left_vertical_down()) { + assert(il.intersections[it.left_vertical_down()].left_vertical_up() == i_it); + assert(il.intersections[it.left_vertical_down()].prev_on_contour_quality == it.prev_on_contour_quality); + } + if (it.has_right_vertical_up()) { + assert(il.intersections[it.right_vertical_up()].right_vertical_down() == i_it); + assert(il.intersections[it.right_vertical_up()].next_on_contour_quality == it.next_on_contour_quality); + } + if (it.has_right_vertical_down()) { + assert(il.intersections[it.right_vertical_down()].right_vertical_up() == i_it); + assert(il.intersections[it.right_vertical_down()].next_on_contour_quality == it.next_on_contour_quality); + } + } + } + return true; +} +#endif /* NDEBUG */ + +// Connect each contour / vertical line intersection point with another two contour / vertical line intersection points. +// (fill in SegmentIntersection::{prev_on_contour, prev_on_contour_vertical, next_on_contour, next_on_contour_vertical}. +// These contour points are either on the same vertical line, or on the vertical line left / right to the current one. +static void connect_segment_intersections_by_contours( + const ExPolygonWithOffset &poly_with_offset, std::vector &segs, + const FillParams ¶ms, 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::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::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 &segs) +{ + // Keep the vector outside the loops, so they will not be reallocated. + // Where to insert new outer points. + std::vector insert_after; + // Mapping of indices of current intersection line after inserting new outer points. + std::vector map; + std::vector temp_intersections; + + for (size_t i_vline = 1; i_vline < segs.size(); ++ i_vline) { + SegmentedIntersectionLine &il = segs[i_vline]; + assert(il.intersections.empty() || il.intersections.size() >= 2); + if (! il.intersections.empty()) { + assert(il.intersections.front().type == SegmentIntersection::OUTER_LOW); + assert(il.intersections.back().type == SegmentIntersection::OUTER_HIGH); + auto end = il.intersections.end() - 1; + insert_after.clear(); + for (auto it = il.intersections.begin() + 1; it != end;) { + if (it->type == SegmentIntersection::OUTER_HIGH) { + ++ it; + assert(it->type == SegmentIntersection::OUTER_LOW); + ++ it; + } else { + auto lo = it; + assert(lo->type == SegmentIntersection::INNER_LOW); + auto hi = ++ it; + assert(hi->type == SegmentIntersection::INNER_HIGH); + auto lo2 = ++ it; + if (lo2->type == SegmentIntersection::INNER_LOW) { + // INNER_HIGH followed by INNER_LOW. The outer contour may have squeezed the inner contour into two separate loops. + // In that case one shall insert a phony OUTER_HIGH / OUTER_LOW pair. + int up = hi->vertical_up(); + int dn = lo2->vertical_down(); +#ifndef _NDEBUG + assert(up == -1 || up > 0); + assert(dn == -1 || dn >= 0); + assert((up == -1 && dn == -1) || (dn + 1 == up)); +#endif // _NDEBUG + bool pinched = dn + 1 != up; + if (pinched) { + // hi is not connected with its inner contour to lo2. + // Insert a phony OUTER_HIGH / OUTER_LOW pair. +#if 0 + static int pinch_idx = 0; + printf("Pinched %d\n", pinch_idx++); +#endif + insert_after.emplace_back(hi - il.intersections.begin()); + } + } + } + } + + if (! insert_after.empty()) { + // Insert phony OUTER_HIGH / OUTER_LOW pairs, adjust indices pointing to intersection points on this contour. + map.clear(); + { + size_t i = 0; + temp_intersections.clear(); + for (size_t idx_inset_after : insert_after) { + for (; i <= idx_inset_after; ++ i) { + map.emplace_back(temp_intersections.size()); + temp_intersections.emplace_back(il.intersections[i]); + } + coord_t pos = (temp_intersections.back().pos() + il.intersections[i].pos()) / 2; + temp_intersections.emplace_back(phony_outer_intersection(SegmentIntersection::OUTER_HIGH, pos)); + temp_intersections.emplace_back(phony_outer_intersection(SegmentIntersection::OUTER_LOW, pos)); + } + for (; i < il.intersections.size(); ++ i) { + map.emplace_back(temp_intersections.size()); + temp_intersections.emplace_back(il.intersections[i]); + } + temp_intersections.swap(il.intersections); + } + // Reindex references on current intersection line. + for (SegmentIntersection &ip : il.intersections) { + if (ip.has_left_vertical()) + ip.prev_on_contour = map[ip.prev_on_contour]; + if (ip.has_right_vertical()) + ip.next_on_contour = map[ip.next_on_contour]; + } + // Reindex references on previous intersection line. + for (SegmentIntersection &ip : segs[i_vline - 1].intersections) + if (ip.has_right_horizontal()) + ip.next_on_contour = map[ip.next_on_contour]; + if (i_vline < segs.size()) { + // Reindex references on next intersection line. + for (SegmentIntersection &ip : segs[i_vline + 1].intersections) + if (ip.has_left_horizontal()) + ip.prev_on_contour = map[ip.prev_on_contour]; + } + } + } + } + + 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(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(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& 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().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 left_neighbors; + // Right regions are held to pick a next region to be extruded using the "Ant colony" heuristics. + boost::container::small_vector right_neighbors; +#else + // For debugging, use the normal vector as it is better supported by debug visualizers. + std::vector left_neighbors; + std::vector 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 ®ions, + const ExPolygonWithOffset &poly_with_offset, + const std::vector &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 ®ion_from, bool flipped_from, const MonotonicRegion ®ion_to, bool flipped_to) + { + int row = 2 * int(®ion_from - m_regions.data()) + flipped_from; + int col = 2 * int(®ion_to - m_regions.data()) + flipped_to; + 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(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(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 ®ion_from, const MonotonicRegion ®ion_to, bool flipped_to) + { return (*this)(*region_from.region, region_from.flipped, region_to, flipped_to); } + AntPath& operator()(const MonotonicRegion ®ion_from, bool flipped_from, const MonotonicRegionLink ®ion_to) + { return (*this)(region_from, flipped_from, *region_to.region, region_to.flipped); } + AntPath& operator()(const MonotonicRegionLink ®ion_from, const MonotonicRegionLink ®ion_to) + { return (*this)(*region_from.region, region_from.flipped, *region_to.region, region_to.flipped); } + +private: + // Source regions, used for addressing and updating m_matrix. + const std::vector &m_regions; + // To calculate the intersection points and contour lengths. + const ExPolygonWithOffset &m_poly_with_offset; + const std::vector &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 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(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(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 left_overlap(SegmentIntersection &start, SegmentIntersection &end, SegmentedIntersectionLine &vline_this, SegmentedIntersectionLine &vline_left) +{ + std::pair 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 left_overlap(std::pair &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 right_overlap(SegmentIntersection &start, SegmentIntersection &end, SegmentedIntersectionLine &vline_this, SegmentedIntersectionLine &vline_right) +{ + std::pair 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 right_overlap(std::pair &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 generate_montonous_regions(std::vector &segs) +{ + std::vector monotonic_regions; + +#ifndef NDEBUG + #define SLIC3R_DEBUG_MONOTONOUS_REGIONS +#endif + +#ifdef SLIC3R_DEBUG_MONOTONOUS_REGIONS + std::vector>> consumed(segs.size()); + auto test_overlap = [&consumed](int segment, int low, int high) { + for (const std::pair& 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 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 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 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; +} + +// 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 ®ion, bool dir, const ExPolygonWithOffset &poly_with_offset, const std::vector &segs) +{ + // From the initial point (i_vline, i_intersection), follow a path. + int i_intersection = region.left_intersection_point(dir); + 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(); + if (inext != -1 && 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; + i_intersection = inext; + } 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; + if (inext == -1) { + // 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()); + } else + i_intersection = inext; + } + + ++ i_vline; + } + + return unscale(total_length); +} + +static void connect_monotonic_regions(std::vector ®ions, const ExPolygonWithOffset &poly_with_offset, std::vector &segs) +{ + // Map from low intersection to left / right side of a monotonic region. + using MapType = std::pair; + std::vector map_intersection_to_region_start; + std::vector map_intersection_to_region_end; + map_intersection_to_region_start.reserve(regions.size()); + map_intersection_to_region_end.reserve(regions.size()); + for (MonotonicRegion ®ion : regions) { + map_intersection_to_region_start.emplace_back(&segs[region.left.vline].intersections[region.left.low], ®ion); + map_intersection_to_region_end.emplace_back(&segs[region.right.vline].intersections[region.right.low], ®ion); + } + 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 ®ion : 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(®ion); + 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(®ion); + 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 ®ion : regions) { + std::sort(region.left_neighbors.begin(), region.left_neighbors.end()); + std::sort(region.right_neighbors.begin(), region.right_neighbors.end()); + } + for (MonotonicRegion ®ion : regions) { + for (MonotonicRegion *neighbor : region.left_neighbors) { + auto it = std::lower_bound(neighbor->right_neighbors.begin(), neighbor->right_neighbors.end(), ®ion); + if (it == neighbor->right_neighbors.end() || *it != ®ion) + neighbor->right_neighbors.insert(it, ®ion); + } + for (MonotonicRegion *neighbor : region.right_neighbors) { + auto it = std::lower_bound(neighbor->left_neighbors.begin(), neighbor->left_neighbors.end(), ®ion); + if (it == neighbor->left_neighbors.end() || *it != ®ion) + neighbor->left_neighbors.insert(it, ®ion); + } + } + +#ifndef NDEBUG + // Verify symmetry of the left_neighbors / right_neighbors. + for (MonotonicRegion ®ion : regions) { + for (MonotonicRegion *neighbor : region.left_neighbors) { + assert(std::count(region.left_neighbors.begin(), region.left_neighbors.end(), neighbor) == 1); + assert(std::find(neighbor->right_neighbors.begin(), neighbor->right_neighbors.end(), ®ion) != neighbor->right_neighbors.end()); + } + for (MonotonicRegion *neighbor : region.right_neighbors) { + assert(std::count(region.right_neighbors.begin(), region.right_neighbors.end(), neighbor) == 1); + assert(std::find(neighbor->left_neighbors.begin(), neighbor->left_neighbors.end(), ®ion) != neighbor->left_neighbors.end()); + } + } +#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 ®ion : regions) { + region.len1 = montonous_region_path_length(region, false, poly_with_offset, segs); + region.len2 = montonous_region_path_length(region, true, poly_with_offset, segs); + // Subtract the smaller length from the longer one, so we will optimize just with the positive difference of the two. + 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 &path, const std::vector &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 +inline void print_ant(const std::string& fmt, TArgs&&... args) { +#ifdef SLIC3R_DEBUG_ANTS + std::cout << Slic3r::format(fmt, std::forward(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 chain_monotonic_regions( + std::vector ®ions, const ExPolygonWithOffset &poly_with_offset, const std::vector &segs, std::mt19937_64 &rng) +{ + // Number of left neighbors (regions that this region depends on, this region cannot be printed before the regions left of it are printed) + self. + std::vector left_neighbors_unprocessed(regions.size(), 1); + // Queue of regions, which have their left neighbors already printed. + std::vector queue; + queue.reserve(regions.size()); + for (MonotonicRegion ®ion : regions) + if (region.left_neighbors.empty()) + queue.emplace_back(®ion); + else + left_neighbors_unprocessed[®ion - 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 path, best_path; + path.reserve(regions.size()); + best_path.reserve(regions.size()); + float best_path_length = std::numeric_limits::max(); + + struct NextCandidate { + MonotonicRegion *region; + AntPath *link; + AntPath *link_flipped; + float probability; + bool dir; + }; + std::vector next_candidates; + + auto validate_unprocessed = +#ifdef NDEBUG + []() { return true; }; +#else + [®ions, &left_neighbors_unprocessed, &path, &queue]() { + std::vector regions_processed(regions.size(), false); + std::vector 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 ®ion = regions[i]; + if (regions_processed[i] || regions_in_queue[i]) { + assert(left_neighbors_unprocessed[i] == (regions_in_queue[i] ? 1 : 0)); + // All left neighbors should be processed already. + for (const 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 ®ion = *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 ®ion = *path.back().region; + bool dir = path.back().flipped; + // Sort by distance to pt. + next_candidates.clear(); + next_candidates.reserve(region.right_neighbors.size() * 2); + for (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::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::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 &path, const ExPolygonWithOffset &poly_with_offset, const std::vector &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 ®ion = *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 ®ion_prev = *path_segment_prev.region; + bool dir_prev = path_segment_prev.flipped; + int i_vline_prev = region_prev.right.vline; + const SegmentedIntersectionLine &vline_prev = segs[i_vline_prev]; + 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(); + if (inext != -1 && 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); + i_intersection = inext; + } 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(); + if (inext == -1) { + // 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()); + } else + i_intersection = inext; + } + + ++ i_vline; + } + } + + if (polyline != nullptr) { + // Finish the current vertical line, + const MonotonicRegion ®ion = *path.back().region; + const SegmentedIntersectionLine &vline = segs[region.right.vline]; + const SegmentIntersection *ip = &vline.intersections[region.right_intersection_point(path.back().flipped)]; + assert(ip->is_inner()); + ip->is_low() ? -- ip : ++ ip; + assert(ip->is_outer()); + polyline->points.back() = Point(vline.pos, ip->pos()); + finish_polyline(); + } +} + +bool FillRectilinear2::fill_surface_by_lines(const Surface *surface, const FillParams ¶ms, 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 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, + 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.full_infill() && !params.dont_adjust) { + line_spacing = this->_adjust_solid_spacing(bounding_box.size()(0), line_spacing); + this->spacing = unscale(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 + 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("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 */ + + std::vector 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. @@ -1018,352 +2694,22 @@ bool FillRectilinear2::fill_surface_by_lines(const Surface *surface, const FillP 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; - } + //FIXME this is a hack to get the monotonic infill rolling. We likely want a smarter switch, likely based on user decison. + bool monotonic_infill = params.monotonic; // || params.density > 0.99; + if (monotonic_infill) { + // Sometimes the outer contour pinches the inner contour from both sides along a single vertical line. + // This situation is not handled correctly by generate_montonous_regions(). + // Insert phony OUTER_HIGH / OUTER_LOW pairs at the position where the contour is pinched. + pinch_contours_insert_phony_outer_intersections(segs); + std::vector regions = generate_montonous_regions(segs); + connect_monotonic_regions(regions, poly_with_offset, segs); + if (! regions.empty()) { + std::mt19937_64 rng; + std::vector path = chain_monotonic_regions(regions, poly_with_offset, segs, rng); + polylines_from_paths(path, poly_with_offset, segs, polylines_out); } - } - - // Now construct a graph. - // Find the first point. - // Naively one would expect to achieve best results by chaining the paths by the shortest distance, - // but that procedure does not create the longest continuous paths. - // A simple "sweep left to right" procedure achieves better results. - size_t i_vline = 0; - size_t i_intersection = size_t(-1); - // Follow the line, connect the lines into a graph. - // Until no new line could be added to the output path: - Point pointLast; - Polyline *polyline_current = NULL; - if (! polylines_out.empty()) - pointLast = polylines_out.back().points.back(); - for (;;) { - if (i_intersection == size_t(-1)) { - // The path has been interrupted. Find a next starting point, closest to the previous extruder position. - coordf_t dist2min = std::numeric_limits().max(); - for (size_t i_vline2 = 0; i_vline2 < segs.size(); ++ i_vline2) { - const SegmentedIntersectionLine &seg = segs[i_vline2]; - if (! seg.intersections.empty()) { - assert(seg.intersections.size() > 1); - // Even number of intersections with the loops. - assert((seg.intersections.size() & 1) == 0); - assert(seg.intersections.front().type == SegmentIntersection::OUTER_LOW); - for (size_t i = 0; i < seg.intersections.size(); ++ i) { - const SegmentIntersection &intrsctn = seg.intersections[i]; - if (intrsctn.is_outer()) { - assert(intrsctn.is_low() || i > 0); - bool consumed = intrsctn.is_low() ? - intrsctn.consumed_vertical_up : - seg.intersections[i-1].consumed_vertical_up; - if (! consumed) { - coordf_t dist2 = 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::max() : - distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, intrsctn->iSegment, forward); - int d_down = (iSegBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegBelow, intrsctn->iSegment, forward); - int d_up = (iSegAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegAbove, intrsctn->iSegment, forward); - if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up)) - // The vertical crossing comes eralier than the prev crossing. - // Disable the perimeter going back. - intrsctn_type_prev = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST; - if (going_up ? (d_up > std::min(d_horiz, d_down)) : (d_down > std::min(d_horiz, d_up))) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~(forward ? DIR_BACKWARD : DIR_FORWARD); - } - { - int d_horiz = (iNext == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, intrsctn->iSegment, segs[i_vline+1].intersections[iNext].iSegment, forward); - int d_down = (iSegBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, intrsctn->iSegment, iSegBelow, forward); - int d_up = (iSegAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, intrsctn->iSegment, iSegAbove, forward); - if (intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up)) - // The vertical crossing comes eralier than the prev crossing. - // Disable the perimeter going forward. - intrsctn_type_next = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST; - if (going_up ? (d_up > std::min(d_horiz, d_down)) : (d_down > std::min(d_horiz, d_up))) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~(forward ? DIR_FORWARD : DIR_BACKWARD); - } - } - - // 4) Try to connect to a previous or next vertical line, making a zig-zag pattern. - if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK || intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK) { - coordf_t distPrev = (intrsctn_type_prev != INTERSECTION_TYPE_OTHER_VLINE_OK) ? std::numeric_limits::max() : - measure_perimeter_prev_segment_length(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iPrev); - coordf_t distNext = (intrsctn_type_next != INTERSECTION_TYPE_OTHER_VLINE_OK) ? std::numeric_limits::max() : - measure_perimeter_next_segment_length(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext); - // Take the shorter path. - //FIXME this may not be always the best strategy to take the shortest connection line now. - bool take_next = (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK) ? - (distNext < distPrev) : - intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK; - assert(intrsctn->is_inner()); - bool skip = params.dont_connect || (link_max_length > 0 && (take_next ? distNext : distPrev) > link_max_length); - if (skip) { - // Just skip the connecting contour and start a new path. - goto dont_connect; - polyline_current->points.push_back(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; - } + } else + traverse_graph_generate_polylines(poly_with_offset, params, this->link_max_length, segs, polylines_out); #ifdef SLIC3R_DEBUG { @@ -1410,6 +2756,17 @@ Polylines FillRectilinear2::fill_surface(const Surface *surface, const FillParam return polylines_out; } +Polylines FillMonotonic::fill_surface(const Surface *surface, const FillParams ¶ms) +{ + FillParams params2 = params; + params2.monotonic = true; + Polylines polylines_out; + if (! fill_surface_by_lines(surface, params2, 0.f, 0.f, polylines_out)) { + printf("FillMonotonic::fill_surface() failed to fill a region.\n"); + } + return polylines_out; +} + Polylines FillGrid2::fill_surface(const Surface *surface, const FillParams ¶ms) { // Each linear fill covers half of the target coverage. @@ -1464,10 +2821,10 @@ Polylines FillCubic::fill_surface(const Surface *surface, const FillParams ¶ 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) || + if (! fill_surface_by_lines(surface, params2, 0.f, float(dx), polylines_out) || + ! fill_surface_by_lines(surface, params2, float(M_PI / 3.), - float(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)) { + ! fill_surface_by_lines(surface, params3, float(M_PI * 2. / 3.), float(dx), polylines_out)) { printf("FillCubic::fill_surface() failed to fill a region.\n"); } return polylines_out; diff --git a/src/libslic3r/Fill/FillRectilinear2.hpp b/src/libslic3r/Fill/FillRectilinear2.hpp index 4459919b08..fd28f155d4 100644 --- a/src/libslic3r/Fill/FillRectilinear2.hpp +++ b/src/libslic3r/Fill/FillRectilinear2.hpp @@ -13,18 +13,27 @@ class FillRectilinear2 : public Fill { public: virtual Fill* clone() const { return new FillRectilinear2(*this); }; - virtual ~FillRectilinear2() {} + virtual ~FillRectilinear2() = default; virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); protected: bool fill_surface_by_lines(const Surface *surface, const FillParams ¶ms, float angleBase, float pattern_shift, Polylines &polylines_out); }; +class FillMonotonic : public FillRectilinear2 +{ +public: + virtual Fill* clone() const { return new FillMonotonic(*this); }; + virtual ~FillMonotonic() = default; + virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); + virtual bool no_sort() const { return true; } +}; + class FillGrid2 : public FillRectilinear2 { public: virtual Fill* clone() const { return new FillGrid2(*this); }; - virtual ~FillGrid2() {} + virtual ~FillGrid2() = default; virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); protected: @@ -36,7 +45,7 @@ class FillTriangles : public FillRectilinear2 { public: virtual Fill* clone() const { return new FillTriangles(*this); }; - virtual ~FillTriangles() {} + virtual ~FillTriangles() = default; virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); protected: @@ -48,7 +57,7 @@ class FillStars : public FillRectilinear2 { public: virtual Fill* clone() const { return new FillStars(*this); }; - virtual ~FillStars() {} + virtual ~FillStars() = default; virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); protected: @@ -60,7 +69,7 @@ class FillCubic : public FillRectilinear2 { public: virtual Fill* clone() const { return new FillCubic(*this); }; - virtual ~FillCubic() {} + virtual ~FillCubic() = default; virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); protected: diff --git a/src/libslic3r/Fill/FillRectilinear3.cpp b/src/libslic3r/Fill/FillRectilinear3.cpp deleted file mode 100644 index 078feeae92..0000000000 --- a/src/libslic3r/Fill/FillRectilinear3.cpp +++ /dev/null @@ -1,1642 +0,0 @@ -#include -#include - -#include -#include -#include - -#include - -#include "../ClipperUtils.hpp" -#include "../ExPolygon.hpp" -#include "../Geometry.hpp" -#include "../Surface.hpp" -#include "../Int128.hpp" - -#include "FillRectilinear3.hpp" - -// #define SLIC3R_DEBUG - -// Make assert active if SLIC3R_DEBUG -#ifdef SLIC3R_DEBUG - #undef NDEBUG - #define DEBUG - #define _DEBUG - #include "../SVG.hpp" -#endif - -#include - -namespace Slic3r { - -namespace FillRectilinear3_Internal { - -// A container maintaining the source expolygon with its inner offsetted polygon. -// The source expolygon is offsetted twice: -// 1) A tiny offset is used to get a contour, to which the open hatching lines will be extended. -// 2) A larger offset is used to get a contor, along which the individual hatching lines will be connected. -struct ExPolygonWithOffset -{ -public: - ExPolygonWithOffset( - const ExPolygon &expolygon, - float aoffset1, - float aoffset2) - { - // Copy and rotate the source polygons. - polygons_src = expolygon; - - double mitterLimit = 3.; - // for the infill pattern, don't cut the corners. - // default miterLimt = 3 - //double mitterLimit = 10.; - assert(aoffset1 < 0); - assert(aoffset2 < 0); - assert(aoffset2 < aoffset1); -// bool sticks_removed = remove_sticks(polygons_src); -// if (sticks_removed) printf("Sticks removed!\n"); - polygons_outer = offset(polygons_src, aoffset1, - ClipperLib::jtMiter, - mitterLimit); - polygons_inner = offset(polygons_outer, aoffset2 - aoffset1, - ClipperLib::jtMiter, - mitterLimit); - // Filter out contours with zero area or small area, contours with 2 points only. - const double min_area_threshold = 0.01 * aoffset2 * aoffset2; - remove_small(polygons_outer, min_area_threshold); - remove_small(polygons_inner, min_area_threshold); - remove_sticks(polygons_outer); - remove_sticks(polygons_inner); - n_contours_outer = polygons_outer.size(); - n_contours_inner = polygons_inner.size(); - n_contours = n_contours_outer + n_contours_inner; - polygons_ccw.assign(n_contours, false); - for (size_t i = 0; i < n_contours; ++ i) { - contour(i).remove_duplicate_points(); - assert(! contour(i).has_duplicate_points()); - polygons_ccw[i] = Slic3r::Geometry::is_ccw(contour(i)); - } - } - - // Any contour with offset1 - bool is_contour_outer(size_t idx) const { return idx < n_contours_outer; } - // Any contour with offset2 - bool is_contour_inner(size_t idx) const { return idx >= n_contours_outer; } - - const Polygon& contour(size_t idx) const - { return is_contour_outer(idx) ? polygons_outer[idx] : polygons_inner[idx - n_contours_outer]; } - - Polygon& contour(size_t idx) - { return is_contour_outer(idx) ? polygons_outer[idx] : polygons_inner[idx - n_contours_outer]; } - - bool is_contour_ccw(size_t idx) const { return polygons_ccw[idx] != 0; } - - BoundingBox bounding_box_src() const - { return get_extents(polygons_src); } - BoundingBox bounding_box_outer() const - { return get_extents(polygons_outer); } - BoundingBox bounding_box_inner() const - { return get_extents(polygons_inner); } - -#ifdef SLIC3R_DEBUG - void export_to_svg(Slic3r::SVG &svg) const { - svg.draw_outline(polygons_src, "black"); - svg.draw_outline(polygons_outer, "green"); - svg.draw_outline(polygons_inner, "brown"); - } -#endif /* SLIC3R_DEBUG */ - - ExPolygon polygons_src; - Polygons polygons_outer; - Polygons polygons_inner; - - size_t n_contours_outer; - size_t n_contours_inner; - size_t n_contours; - -protected: - // For each polygon of polygons_inner, remember its orientation. - std::vector polygons_ccw; -}; - -class SegmentedIntersectionLine; - -// Intersection point of a vertical line with a polygon segment. -class SegmentIntersection -{ -public: - SegmentIntersection() : - line(nullptr), - expoly_with_offset(nullptr), - iContour(0), - iSegment(0), - type(UNKNOWN), - consumed_vertical_up(false), - consumed_perimeter_right(false) - {} - - // Parent object owning this intersection point. - const SegmentedIntersectionLine *line; - // Container with the source expolygon and its shrank copies, to be intersected by the line. - const ExPolygonWithOffset *expoly_with_offset; - - // Index of a contour in ExPolygonWithOffset, with which this vertical line intersects. - size_t iContour; - // Index of a segment in iContour, with which this vertical line intersects. - size_t iSegment; - - // Kind of intersection. With the original contour, or with the inner offestted contour? - // A vertical segment will be at least intersected by OUTER_LOW, OUTER_HIGH, - // but it could be intersected with OUTER_LOW, INNER_LOW, INNER_HIGH, OUTER_HIGH, - // and there may be more than one pair of INNER_LOW, INNER_HIGH between OUTER_LOW, OUTER_HIGH. - enum SegmentIntersectionType { - OUTER_LOW = 0, - OUTER_HIGH = 1, - INNER_LOW = 2, - INNER_HIGH = 3, - UNKNOWN = -1 - }; - SegmentIntersectionType type; - - // For the INNER_LOW type, this point may be connected to another INNER_LOW point following a perimeter contour. - // For the INNER_HIGH type, this point may be connected to another INNER_HIGH point following a perimeter contour. - // If INNER_LOW is connected to INNER_HIGH or vice versa, - // one has to make sure the vertical infill line does not overlap with the connecting perimeter line. - bool is_inner() const { return type == INNER_LOW || type == INNER_HIGH; } - bool is_outer() const { return type == OUTER_LOW || type == OUTER_HIGH; } - bool is_low () const { return type == INNER_LOW || type == OUTER_LOW; } - bool is_high () const { return type == INNER_HIGH || type == OUTER_HIGH; } - - // Calculate a position of this intersection point. The position does not need to be necessary exact. - Point pos() const; - - // Returns 0, if this and other segments intersect at the hatching line. - // Returns -1, if this intersection is below the other intersection on the hatching line. - // Returns +1 otherwise. - int ordering_along_line(const SegmentIntersection &other) const; - - // Compare two y intersection points given by rational numbers. - bool operator< (const SegmentIntersection &other) const; - // { return this->ordering_along_line(other) == -1; } - bool operator==(const SegmentIntersection &other) const { return this->ordering_along_line(other) == 0; } - - //FIXME legacy code, suporting the old graph traversal algorithm. Please remove. - // Was this segment along the y axis consumed? - // Up means up along the vertical segment. - bool consumed_vertical_up; - // Was a segment of the inner perimeter contour consumed? - // Right means right from the vertical segment. - bool consumed_perimeter_right; -}; - -// A single hathing line intersecting the ExPolygonWithOffset. -class SegmentedIntersectionLine -{ -public: - // Index of this vertical intersection line. - size_t idx; - // Position of the line along the X axis of the oriented bounding box. -// coord_t x; - // Position of this vertical intersection line, rotated to the world coordinate system. - Point pos; - // Direction of this vertical intersection line, rotated to the world coordinate system. The direction is not normalized to maintain a sufficient accuracy! - Vector dir; - // List of intersection points with polygons, sorted increasingly by the y axis. - // The SegmentIntersection keeps a pointer to this object to access the start and direction of this line. - std::vector intersections; -}; - -// Return an intersection point of the parent SegmentedIntersectionLine with the segment of a parent ExPolygonWithOffset. -// The intersected segment of the ExPolygonWithOffset is addressed with (iContour, iSegment). -// When calling this method, the SegmentedIntersectionLine must not be parallel with the segment. -Point SegmentIntersection::pos() const -{ - // Get the two rays to be intersected. - const Polygon &poly = this->expoly_with_offset->contour(this->iContour); - // 30 bits + 1 signum bit. - const Point &seg_start = poly.points[(this->iSegment == 0) ? poly.points.size() - 1 : this->iSegment - 1]; - const Point &seg_end = poly.points[this->iSegment]; - // Point, vector of the segment. - const Vec2d p1(seg_start.cast()); - const Vec2d v1((seg_end - seg_start).cast()); - // Point, vector of this hatching line. - const Vec2d p2(line->pos.cast()); - const Vec2d v2(line->dir.cast()); - // Intersect the two rays. - double denom = v1(0) * v2(1) - v2(0) * v1(1); - Point out; - if (denom == 0.) { - // Lines are collinear. As the pos() method is not supposed to be called on collinear vectors, - // the source vectors are not quite collinear. Return the center of the contour segment. - out = seg_start + seg_end; - out(0) >>= 1; - out(1) >>= 1; - } else { - // Find the intersection point. - double t = (v2(0) * (p1(1) - p2(1)) - v2(1) * (p1(0) - p2(0))) / denom; - if (t < 0.) - out = seg_start; - else if (t > 1.) - out = seg_end; - else { - out(0) = coord_t(floor(p1(0) + t * v1(0) + 0.5)); - out(1) = coord_t(floor(p1(1) + t * v1(1) + 0.5)); - } - } - return out; -} - -static inline int signum(int64_t v) { return (v > 0) - (v < 0); } - -// Returns 0, if this and other segments intersect at the hatching line. -// Returns -1, if this intersection is below the other intersection on the hatching line. -// Returns +1 otherwise. -int SegmentIntersection::ordering_along_line(const SegmentIntersection &other) const -{ - assert(this->line == other.line); - assert(this->expoly_with_offset == other.expoly_with_offset); - - if (this->iContour == other.iContour && this->iSegment == other.iSegment) - return true; - - // Segment of this - const Polygon &poly_a = this->expoly_with_offset->contour(this->iContour); - // 30 bits + 1 signum bit. - const Point &seg_start_a = poly_a.points[(this->iSegment == 0) ? poly_a.points.size() - 1 : this->iSegment - 1]; - const Point &seg_end_a = poly_a.points[this->iSegment]; - - // Segment of other - const Polygon &poly_b = this->expoly_with_offset->contour(other.iContour); - // 30 bits + 1 signum bit. - const Point &seg_start_b = poly_b.points[(other.iSegment == 0) ? poly_b.points.size() - 1 : other.iSegment - 1]; - const Point &seg_end_b = poly_b.points[other.iSegment]; - - if (this->iContour == other.iContour) { - if ((this->iSegment + 1) % poly_a.points.size() == other.iSegment) { - // other.iSegment succeeds this->iSegment - assert(seg_end_a == seg_start_b); - // Avoid calling the 128bit x 128bit multiplication below if this->line intersects the common point. - if (cross2(Vec2i64(this->line->dir.cast()), (seg_end_b - this->line->pos).cast()) == 0) - return 0; - } else if ((other.iSegment + 1) % poly_a.points.size() == this->iSegment) { - // this->iSegment succeeds other.iSegment - assert(seg_start_a == seg_end_b); - // Avoid calling the 128bit x 128bit multiplication below if this->line intersects the common point. - if (cross2(Vec2i64(this->line->dir.cast()), (seg_start_a - this->line->pos).cast()) == 0) - return 0; - } else { - // General case. - } - } - - // First test, whether both points of one segment are completely in one half-plane of the other line. - const Vec2i64 vec_b = (seg_end_b - seg_start_b).cast(); - int side_start = signum(cross2(vec_b, (seg_start_a - seg_start_b).cast())); - int side_end = signum(cross2(vec_b, (seg_end_a - seg_start_b).cast())); - int side = side_start * side_end; - if (side > 0) - // This segment is completely inside one half-plane of the other line, therefore the ordering is trivial. - return signum(cross2(vec_b, this->line->dir.cast())) * side_start; - - const Vec2i64 vec_a = (seg_end_a - seg_start_a).cast(); - int side_start2 = signum(cross2(vec_a, (seg_start_b - seg_start_a).cast())); - int side_end2 = signum(cross2(vec_a, (seg_end_b - seg_start_a).cast())); - int side2 = side_start2 * side_end2; - //if (side == 0 && side2 == 0) - // The segments share one of their end points. - if (side2 > 0) - // This segment is completely inside one half-plane of the other line, therefore the ordering is trivial. - return signum(cross2(this->line->dir.cast(), vec_a)) * side_start2; - - // The two segments intersect and they are not sucessive segments of the same contour. - // Ordering of the points depends on the position of the segment intersection (left / right from this->line), - // therefore a simple test over the input segment end points is not sufficient. - - // Find the parameters of intersection of the two segmetns with this->line. - int64_t denom1 = cross2(this->line->dir.cast(), vec_a); - int64_t denom2 = cross2(this->line->dir.cast(), vec_b); - Vec2i64 vx_a = (seg_start_a - this->line->pos).cast(); - Vec2i64 vx_b = (seg_start_b - this->line->pos).cast(); - int64_t t1_times_denom1 = vx_a(0) * vec_a(1) - vx_a(1) * vec_a(0); - int64_t t2_times_denom2 = vx_b(0) * vec_b(1) - vx_b(1) * vec_b(0); - assert(denom1 != 0); - assert(denom2 != 0); - return Int128::compare_rationals_filtered(t1_times_denom1, denom1, t2_times_denom2, denom2); -} - -// Compare two y intersection points given by rational numbers. -bool SegmentIntersection::operator<(const SegmentIntersection &other) const -{ -#ifdef _DEBUG - Point p1 = this->pos(); - Point p2 = other.pos(); - int64_t d = this->line->dir.cast().dot((p2 - p1).cast()); -#endif /* _DEBUG */ - int ordering = this->ordering_along_line(other); -#ifdef _DEBUG - if (ordering == -1) - assert(d >= - int64_t(SCALED_EPSILON)); - else if (ordering == 1) - assert(d <= int64_t(SCALED_EPSILON)); -#endif /* _DEBUG */ - return ordering == -1; -} - -// When doing a rectilinear / grid / triangle / stars / cubic infill, -// the following class holds the hatching lines of each of the hatching directions. -class InfillHatchingSingleDirection -{ -public: - // Hatching angle, CCW from the X axis. - double angle; - // Starting point of the 1st hatching line. - Point start_point; - // Direction vector, its size is not normalized to maintain a sufficient accuracy! - Vector direction; - // Spacing of the hatching lines, perpendicular to the direction vector. - coord_t line_spacing; - // Infill segments oriented at angle. - std::vector segs; -}; - -// For the rectilinear, grid, triangles, stars and cubic pattern fill one InfillHatchingSingleDirection structure -// for each infill direction. The segments stored in InfillHatchingSingleDirection will then form a graph of candidate -// paths to be extruded. -static bool prepare_infill_hatching_segments( - // Input geometry to be hatch, containing two concentric contours for each input contour. - const ExPolygonWithOffset &poly_with_offset, - // fill density, dont_adjust - const FillParams ¶ms, - // angle, pattern_shift, spacing - FillRectilinear3::FillDirParams &fill_dir_params, - // Reference point of the pattern, to which the infill lines will be alligned, and the base angle. - const std::pair &rotate_vector, - // Resulting straight segments of the infill graph. - InfillHatchingSingleDirection &out) -{ - out.angle = rotate_vector.first + fill_dir_params.angle; - out.direction = Point(coord_t(scale_(1000)), coord_t(0)); - // Hatch along the Y axis of the rotated coordinate system. - out.direction.rotate(out.angle + 0.5 * M_PI); - out.segs.clear(); - - assert(params.density > 0.0001f && params.density <= 1.f); - coord_t line_spacing = coord_t(scale_(fill_dir_params.spacing) / params.density); - - // Bounding box around the source contour, aligned with out.angle. - BoundingBox bounding_box = get_extents_rotated(poly_with_offset.polygons_src.contour, - out.angle); - - // Define the flow spacing according to requested density. - if (params.full_infill() && ! params.dont_adjust) { - // Full infill, adjust the line spacing to fit an integer number of lines. - out.line_spacing = Fill::_adjust_solid_spacing(bounding_box.size()(0), line_spacing); - // Report back the adjusted line spacing. - fill_dir_params.spacing = unscale(line_spacing); - } else { - // Extend bounding box so that our pattern will be aligned with the other layers. - // Transform the reference point to the rotated coordinate system. - Point refpt = rotate_vector.second.rotated(- out.angle); - // _align_to_grid will not work correctly with positive pattern_shift. - coord_t pattern_shift_scaled = coord_t(scale_(fill_dir_params.pattern_shift)) % line_spacing; - refpt(0) -= (pattern_shift_scaled >= 0) ? pattern_shift_scaled : (line_spacing + pattern_shift_scaled); - bounding_box.merge(Fill::_align_to_grid( - bounding_box.min, - Point(line_spacing, line_spacing), - refpt)); - } - - // Intersect a set of euqally spaced vertical lines wiht expolygon. - // n_vlines = ceil(bbox_width / line_spacing) - size_t n_vlines = (bounding_box.max(0) - bounding_box.min(0) + line_spacing - 1) / line_spacing; - coord_t x0 = bounding_box.min(0); - if (params.full_infill()) - x0 += coord_t((line_spacing + SCALED_EPSILON) / 2); - - out.line_spacing = line_spacing; - out.start_point = Point(x0, bounding_box.min(1)); - out.start_point.rotate(out.angle); - -#ifdef SLIC3R_DEBUG - static int iRun = 0; - BoundingBox bbox_svg = poly_with_offset.bounding_box_outer(); - ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-%d.svg", iRun), bbox_svg); // , scale_(1.)); - poly_with_offset.export_to_svg(svg); - { - ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-initial-%d.svg", iRun), bbox_svg); // , scale_(1.)); - poly_with_offset.export_to_svg(svg); - } - iRun ++; -#endif /* SLIC3R_DEBUG */ - - // For each contour - // Allocate storage for the segments. - out.segs.assign(n_vlines, SegmentedIntersectionLine()); - double cos_a = cos(out.angle); - double sin_a = sin(out.angle); - for (size_t i = 0; i < n_vlines; ++ i) { - auto &seg = out.segs[i]; - seg.idx = i; - // seg(0) = x0 + coord_t(i) * line_spacing; - coord_t x = x0 + coord_t(i) * line_spacing; - seg.pos(0) = coord_t(floor(cos_a * x - sin_a * bounding_box.min(1) + 0.5)); - seg.pos(1) = coord_t(floor(cos_a * bounding_box.min(1) + sin_a * x + 0.5)); - seg.dir = out.direction; - } - - for (size_t iContour = 0; iContour < poly_with_offset.n_contours; ++ iContour) { - const Points &contour = poly_with_offset.contour(iContour).points; - if (contour.size() < 2) - continue; - // For each segment - for (size_t iSegment = 0; iSegment < contour.size(); ++ iSegment) { - size_t iPrev = ((iSegment == 0) ? contour.size() : iSegment) - 1; - const Point *pl = &contour[iPrev]; - const Point *pr = &contour[iSegment]; - // Orient the segment to the direction vector. - const Point v = *pr - *pl; - int orientation = Int128::sign_determinant_2x2_filtered(v(0), v(1), out.direction(0), out.direction(1)); - if (orientation == 0) - // Ignore strictly vertical segments. - continue; - if (orientation < 0) - // Always orient the input segment consistently towards the hatching direction. - std::swap(pl, pr); - // Which of the equally spaced vertical lines is intersected by this segment? - coord_t l = (coord_t)floor(cos_a * (*pl)(0) + sin_a * (*pl)(1) - SCALED_EPSILON); - coord_t r = (coord_t)ceil (cos_a * (*pr)(0) + sin_a * (*pr)(1) + SCALED_EPSILON); - assert(l < r - SCALED_EPSILON); - // il, ir are the left / right indices of vertical lines intersecting a segment - int il = std::max(0, (l - x0 + line_spacing) / line_spacing); - int ir = std::min(int(out.segs.size()) - 1, (r - x0) / line_spacing); - // The previous tests were done with floating point arithmetics over an epsilon-extended interval. - // Now do the same tests with exact arithmetics over the exact interval. - while (il <= ir && int128::orient(out.segs[il].pos, out.segs[il].pos + out.direction, *pl) < 0) - ++ il; - while (il <= ir && int128::orient(out.segs[ir].pos, out.segs[ir].pos + out.direction, *pr) > 0) - -- ir; - // Here it is ensured, that - // 1) out.seg is not parallel to (pl, pr) - // 2) all lines from il to ir intersect . - assert(il >= 0 && ir < int(out.segs.size())); - for (int i = il; i <= ir; ++ i) { - // assert(out.segs[i](0) == i * line_spacing + x0); - // assert(l <= out.segs[i](0)); - // assert(r >= out.segs[i](0)); - SegmentIntersection is; - is.line = &out.segs[i]; - is.expoly_with_offset = &poly_with_offset; - is.iContour = iContour; - is.iSegment = iSegment; - // Test whether the calculated intersection point falls into the bounding box of the input segment. - // +-1 to take rounding into account. - assert(int128::orient(out.segs[i].pos, out.segs[i].pos + out.direction, *pl) >= 0); - assert(int128::orient(out.segs[i].pos, out.segs[i].pos + out.direction, *pr) <= 0); - assert(is.pos()(0) + 1 >= std::min((*pl)(0), (*pr)(0))); - assert(is.pos()(1) + 1 >= std::min((*pl)(1), (*pr)(1))); - assert(is.pos()(0) <= std::max((*pl)(0), (*pr)(0)) + 1); - assert(is.pos()(1) <= std::max((*pl)(1), (*pr)(1)) + 1); - out.segs[i].intersections.push_back(is); - } - } - } - - // Sort the intersections along their segments, specify the intersection types. - for (size_t i_seg = 0; i_seg < out.segs.size(); ++ i_seg) { - SegmentedIntersectionLine &sil = out.segs[i_seg]; - // Sort the intersection points using exact rational arithmetic. - std::sort(sil.intersections.begin(), sil.intersections.end()); -#ifdef _DEBUG - // Verify that the intersections are sorted along the haching direction. - for (size_t i = 1; i < sil.intersections.size(); ++ i) { - Point p1 = sil.intersections[i - 1].pos(); - Point p2 = sil.intersections[i].pos(); - int64_t d = sil.dir.cast().dot((p2 - p1).cast()); - assert(d >= - int64_t(SCALED_EPSILON)); - } -#endif /* _DEBUG */ - // Assign the intersection types, remove duplicate or overlapping intersection points. - // When a loop vertex touches a vertical line, intersection point is generated for both segments. - // If such two segments are oriented equally, then one of them is removed. - // Otherwise the vertex is tangential to the vertical line and both segments are removed. - // The same rule applies, if the loop is pinched into a single point and this point touches the vertical line: - // The loop has a zero vertical size at the vertical line, therefore the intersection point is removed. - size_t j = 0; - for (size_t i = 0; i < sil.intersections.size(); ++ i) { - // What is the orientation of the segment at the intersection point? - size_t iContour = sil.intersections[i].iContour; - const Points &contour = poly_with_offset.contour(iContour).points; - size_t iSegment = sil.intersections[i].iSegment; - size_t iPrev = ((iSegment == 0) ? contour.size() : iSegment) - 1; - int dir = int128::cross(contour[iSegment] - contour[iPrev], sil.dir); - bool low = dir > 0; - sil.intersections[i].type = poly_with_offset.is_contour_outer(iContour) ? - (low ? SegmentIntersection::OUTER_LOW : SegmentIntersection::OUTER_HIGH) : - (low ? SegmentIntersection::INNER_LOW : SegmentIntersection::INNER_HIGH); - if (j > 0 && sil.intersections[i].iContour == sil.intersections[j-1].iContour) { - // Two successive intersection points on a vertical line with the same contour. This may be a special case. - if (sil.intersections[i] == sil.intersections[j-1]) { - // Two successive segments meet exactly at the vertical line. - #ifdef SLIC3R_DEBUG - // Verify that the segments of sil.intersections[i] and sil.intersections[j-1] are adjoint. - size_t iSegment2 = sil.intersections[j-1].iSegment; - size_t iPrev2 = ((iSegment2 == 0) ? contour.size() : iSegment2) - 1; - assert(iSegment == iPrev2 || iSegment2 == iPrev); - #endif /* SLIC3R_DEBUG */ - if (sil.intersections[i].type == sil.intersections[j-1].type) { - // Two successive segments of the same direction (both to the right or both to the left) - // meet exactly at the vertical line. - // Remove the second intersection point. - } else { - // This is a loop returning to the same point. - // It may as well be a vertex of a loop touching this vertical line. - // Remove both the lines. - -- j; - } - } else if (sil.intersections[i].type == sil.intersections[j-1].type) { - // Two non successive segments of the same direction (both to the right or both to the left) - // meet exactly at the vertical line. That means there is a Z shaped path, where the center segment - // of the Z shaped path is aligned with this vertical line. - // Remove one of the intersection points while maximizing the vertical segment length. - if (low) { - // Remove the second intersection point, keep the first intersection point. - } else { - // Remove the first intersection point, keep the second intersection point. - sil.intersections[j-1] = sil.intersections[i]; - } - } else { - // Vertical line intersects a contour segment at a general position (not at one of its end points). - // or the contour just touches this vertical line with a vertical segment or a sequence of vertical segments. - // Keep both intersection points. - if (j < i) - sil.intersections[j] = sil.intersections[i]; - ++ j; - } - } else { - // Vertical line intersects a contour segment at a general position (not at one of its end points). - if (j < i) - sil.intersections[j] = sil.intersections[i]; - ++ j; - } - } - // Shrink the list of intersections, if any of the intersection was removed during the classification. - if (j < sil.intersections.size()) - sil.intersections.erase(sil.intersections.begin() + j, sil.intersections.end()); - } - - // Verify the segments. If something is wrong, give up. -#define ASSERT_OR_RETURN(CONDITION) do { assert(CONDITION); if (! (CONDITION)) return false; } while (0) -#ifdef _MSC_VER - #pragma warning(push) - #pragma warning(disable: 4127) -#endif - for (size_t i_seg = 0; i_seg < out.segs.size(); ++ i_seg) { - SegmentedIntersectionLine &sil = out.segs[i_seg]; - // The intersection points have to be even. - ASSERT_OR_RETURN((sil.intersections.size() & 1) == 0); - for (size_t i = 0; i < sil.intersections.size();) { - // An intersection segment crossing the bigger contour may cross the inner offsetted contour even number of times. - ASSERT_OR_RETURN(sil.intersections[i].type == SegmentIntersection::OUTER_LOW); - size_t j = i + 1; - ASSERT_OR_RETURN(j < sil.intersections.size()); - ASSERT_OR_RETURN(sil.intersections[j].type == SegmentIntersection::INNER_LOW || sil.intersections[j].type == SegmentIntersection::OUTER_HIGH); - for (; j < sil.intersections.size() && sil.intersections[j].is_inner(); ++ j) ; - ASSERT_OR_RETURN(j < sil.intersections.size()); - ASSERT_OR_RETURN((j & 1) == 1); - ASSERT_OR_RETURN(sil.intersections[j].type == SegmentIntersection::OUTER_HIGH); - ASSERT_OR_RETURN(i + 1 == j || sil.intersections[j - 1].type == SegmentIntersection::INNER_HIGH); - i = j + 1; - } - } -#undef ASSERT_OR_RETURN -#ifdef _MSC_VER - #pragma warning(push) -#endif /* _MSC_VER */ - -#ifdef SLIC3R_DEBUG - // Paint the segments and finalize the SVG file. - for (size_t i_seg = 0; i_seg < out.segs.size(); ++ i_seg) { - SegmentedIntersectionLine &sil = out.segs[i_seg]; - for (size_t i = 0; i < sil.intersections.size();) { - size_t j = i + 1; - for (; j < sil.intersections.size() && sil.intersections[j].is_inner(); ++ j) ; - if (i + 1 == j) { - svg.draw(Line(sil.intersections[i ].pos(), sil.intersections[j ].pos()), "blue"); - } else { - svg.draw(Line(sil.intersections[i ].pos(), sil.intersections[i+1].pos()), "green"); - svg.draw(Line(sil.intersections[i+1].pos(), sil.intersections[j-1].pos()), (j - i + 1 > 4) ? "yellow" : "magenta"); - svg.draw(Line(sil.intersections[j-1].pos(), sil.intersections[j ].pos()), "green"); - } - i = j + 1; - } - } - svg.Close(); -#endif /* SLIC3R_DEBUG */ - - - return true; -} - - - - - - - - -/****************************************************************** Legacy code, to be replaced by a graph algorithm ******************************************************************/ - - -// Having a segment of a closed polygon, calculate its Euclidian length. -// The segment indices seg1 and seg2 signify an end point of an edge in the forward direction of the loop, -// therefore the point p1 lies on poly.points[seg1-1], poly.points[seg1] etc. -static inline coordf_t segment_length(const Polygon &poly, size_t seg1, const Point &p1, size_t seg2, const Point &p2) -{ -#ifdef SLIC3R_DEBUG - // Verify that p1 lies on seg1. This is difficult to verify precisely, - // but at least verify, that p1 lies in the bounding box of seg1. - for (size_t i = 0; i < 2; ++ i) { - size_t seg = (i == 0) ? seg1 : seg2; - Point px = (i == 0) ? p1 : p2; - Point pa = poly.points[((seg == 0) ? poly.points.size() : seg) - 1]; - Point pb = poly.points[seg]; - if (pa(0) > pb(0)) - std::swap(pa(0), pb(0)); - if (pa(1) > pb(1)) - std::swap(pa(1), pb(1)); - assert(px(0) >= pa(0) && px(0) <= pb(0)); - assert(px(1) >= pa(1) && px(1) <= pb(1)); - } -#endif /* SLIC3R_DEBUG */ - const Point *pPrev = &p1; - const Point *pThis = NULL; - coordf_t len = 0; - if (seg1 <= seg2) { - for (size_t i = seg1; i < seg2; ++ i, pPrev = pThis) - len += (*pPrev - *(pThis = &poly.points[i])).cast().norm(); - } else { - for (size_t i = seg1; i < poly.points.size(); ++ i, pPrev = pThis) - len += (*pPrev - *(pThis = &poly.points[i])).cast().norm(); - for (size_t i = 0; i < seg2; ++ i, pPrev = pThis) - len += (*pPrev - *(pThis = &poly.points[i])).cast().norm(); - } - len += (*pPrev - p2).cast().norm(); - return len; -} - -// Append a segment of a closed polygon to a polyline. -// The segment indices seg1 and seg2 signify an end point of an edge in the forward direction of the loop. -// Only insert intermediate points between seg1 and seg2. -static inline void polygon_segment_append(Points &out, const Polygon &polygon, size_t seg1, size_t seg2) -{ - if (seg1 == seg2) { - // Nothing to append from this segment. - } else if (seg1 < seg2) { - // Do not append a point pointed to by seg2. - out.insert(out.end(), polygon.points.begin() + seg1, polygon.points.begin() + seg2); - } else { - out.reserve(out.size() + seg2 + polygon.points.size() - seg1); - out.insert(out.end(), polygon.points.begin() + seg1, polygon.points.end()); - // Do not append a point pointed to by seg2. - out.insert(out.end(), polygon.points.begin(), polygon.points.begin() + seg2); - } -} - -// Append a segment of a closed polygon to a polyline. -// The segment indices seg1 and seg2 signify an end point of an edge in the forward direction of the loop, -// but this time the segment is traversed backward. -// Only insert intermediate points between seg1 and seg2. -static inline void polygon_segment_append_reversed(Points &out, const Polygon &polygon, size_t seg1, size_t seg2) -{ - if (seg1 >= seg2) { - out.reserve(seg1 - seg2); - for (size_t i = seg1; i > seg2; -- i) - out.push_back(polygon.points[i - 1]); - } else { - // it could be, that seg1 == seg2. In that case, append the complete loop. - out.reserve(out.size() + seg2 + polygon.points.size() - seg1); - for (size_t i = seg1; i > 0; -- i) - out.push_back(polygon.points[i - 1]); - for (size_t i = polygon.points.size(); i > seg2; -- i) - out.push_back(polygon.points[i - 1]); - } -} - -static inline int distance_of_segmens(const Polygon &poly, size_t seg1, size_t seg2, bool forward) -{ - int d = int(seg2) - int(seg1); - if (! forward) - d = - d; - if (d < 0) - d += int(poly.points.size()); - return d; -} - -// For a vertical line, an inner contour and an intersection point, -// find an intersection point on the previous resp. next vertical line. -// The intersection point is connected with the prev resp. next intersection point with iInnerContour. -// Return -1 if there is no such point on the previous resp. next vertical line. -static inline int intersection_on_prev_next_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - bool dir_is_next) -{ - size_t iVerticalLineOther = iVerticalLine; - if (dir_is_next) { - if (++ iVerticalLineOther == segs.size()) - // No successive vertical line. - return -1; - } else if (iVerticalLineOther -- == 0) { - // No preceding vertical line. - return -1; - } - - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); -// const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour); - const bool forward = itsct.is_low() == dir_is_next; - // Resulting index of an intersection point on il2. - int out = -1; - // Find an intersection point on iVerticalLineOther, intersecting iInnerContour - // at the same orientation as iIntersection, and being closest to iIntersection - // in the number of contour segments, when following the direction of the contour. - int dmin = std::numeric_limits::max(); - for (size_t i = 0; i < il2.intersections.size(); ++ i) { - const SegmentIntersection &itsct2 = il2.intersections[i]; - if (itsct.iContour == itsct2.iContour && itsct.type == itsct2.type) { - /* - if (itsct.is_low()) { - assert(itsct.type == SegmentIntersection::INNER_LOW); - assert(iIntersection > 0); - assert(il.intersections[iIntersection-1].type == SegmentIntersection::OUTER_LOW); - assert(i > 0); - if (il2.intersections[i-1].is_inner()) - // Take only the lowest inner intersection point. - continue; - assert(il2.intersections[i-1].type == SegmentIntersection::OUTER_LOW); - } else { - assert(itsct.type == SegmentIntersection::INNER_HIGH); - assert(iIntersection+1 < il.intersections.size()); - assert(il.intersections[iIntersection+1].type == SegmentIntersection::OUTER_HIGH); - assert(i+1 < il2.intersections.size()); - if (il2.intersections[i+1].is_inner()) - // Take only the highest inner intersection point. - continue; - assert(il2.intersections[i+1].type == SegmentIntersection::OUTER_HIGH); - } - */ - // The intersection points lie on the same contour and have the same orientation. - // Find the intersection point with a shortest path in the direction of the contour. - int d = distance_of_segmens(poly, itsct.iSegment, itsct2.iSegment, forward); - if (d < dmin) { - out = i; - dmin = d; - } - } - } - //FIXME this routine is not asymptotic optimal, it will be slow if there are many intersection points along the line. - return out; -} - -static inline int intersection_on_prev_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection) -{ - return intersection_on_prev_next_vertical_line(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, false); -} - -static inline int intersection_on_next_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection) -{ - return intersection_on_prev_next_vertical_line(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, true); -} - -enum IntersectionTypeOtherVLine { - // There is no connection point on the other vertical line. - INTERSECTION_TYPE_OTHER_VLINE_UNDEFINED = -1, - // Connection point on the other vertical segment was found - // and it could be followed. - INTERSECTION_TYPE_OTHER_VLINE_OK = 0, - // The connection segment connects to a middle of a vertical segment. - // Cannot follow. - INTERSECTION_TYPE_OTHER_VLINE_INNER, - // Cannot extend the contor to this intersection point as either the connection segment - // or the succeeding vertical segment were already consumed. - INTERSECTION_TYPE_OTHER_VLINE_CONSUMED, - // Not the first intersection along the contor. This intersection point - // has been preceded by an intersection point along the vertical line. - INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST, -}; - -// Find an intersection on a previous line, but return -1, if the connecting segment of a perimeter was already extruded. -static inline IntersectionTypeOtherVLine intersection_type_on_prev_next_vertical_line( - const std::vector &segs, - size_t iVerticalLine, - size_t iIntersection, - size_t iIntersectionOther, - bool dir_is_next) -{ - // This routine will propose a connecting line even if the connecting perimeter segment intersects - // iVertical line multiple times before reaching iIntersectionOther. - if (iIntersectionOther == size_t(-1)) - return INTERSECTION_TYPE_OTHER_VLINE_UNDEFINED; - assert(dir_is_next ? (iVerticalLine + 1 < segs.size()) : (iVerticalLine > 0)); - const SegmentedIntersectionLine &il_this = segs[iVerticalLine]; - const SegmentIntersection &itsct_this = il_this.intersections[iIntersection]; - const SegmentedIntersectionLine &il_other = segs[dir_is_next ? (iVerticalLine+1) : (iVerticalLine-1)]; - const SegmentIntersection &itsct_other = il_other.intersections[iIntersectionOther]; - assert(itsct_other.is_inner()); - assert(iIntersectionOther > 0); - assert(iIntersectionOther + 1 < il_other.intersections.size()); - // Is iIntersectionOther at the boundary of a vertical segment? - const SegmentIntersection &itsct_other2 = il_other.intersections[itsct_other.is_low() ? iIntersectionOther - 1 : iIntersectionOther + 1]; - if (itsct_other2.is_inner()) - // Cannot follow a perimeter segment into the middle of another vertical segment. - // Only perimeter segments connecting to the end of a vertical segment are followed. - return INTERSECTION_TYPE_OTHER_VLINE_INNER; - assert(itsct_other.is_low() == itsct_other2.is_low()); - if (dir_is_next ? itsct_this.consumed_perimeter_right : itsct_other.consumed_perimeter_right) - // This perimeter segment was already consumed. - return INTERSECTION_TYPE_OTHER_VLINE_CONSUMED; - if (itsct_other.is_low() ? itsct_other.consumed_vertical_up : il_other.intersections[iIntersectionOther-1].consumed_vertical_up) - // This vertical segment was already consumed. - return INTERSECTION_TYPE_OTHER_VLINE_CONSUMED; - return INTERSECTION_TYPE_OTHER_VLINE_OK; -} - -static inline IntersectionTypeOtherVLine intersection_type_on_prev_vertical_line( - const std::vector &segs, - size_t iVerticalLine, - size_t iIntersection, - size_t iIntersectionPrev) -{ - return intersection_type_on_prev_next_vertical_line(segs, iVerticalLine, iIntersection, iIntersectionPrev, false); -} - -static inline IntersectionTypeOtherVLine intersection_type_on_next_vertical_line( - const std::vector &segs, - size_t iVerticalLine, - size_t iIntersection, - size_t iIntersectionNext) -{ - return intersection_type_on_prev_next_vertical_line(segs, iVerticalLine, iIntersection, iIntersectionNext, true); -} - -// Measure an Euclidian length of a perimeter segment when going from iIntersection to iIntersection2. -static inline coordf_t measure_perimeter_prev_next_segment_length( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2, - bool dir_is_next) -{ - size_t iVerticalLineOther = iVerticalLine; - if (dir_is_next) { - if (++ iVerticalLineOther == segs.size()) - // No successive vertical line. - return coordf_t(-1); - } else if (iVerticalLineOther -- == 0) { - // No preceding vertical line. - return coordf_t(-1); - } - - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther]; - const SegmentIntersection &itsct2 = il2.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); -// const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour); - assert(itsct.type == itsct2.type); - assert(itsct.iContour == itsct2.iContour); - assert(itsct.is_inner()); - const bool forward = itsct.is_low() == dir_is_next; - - Point p1 = itsct.pos(); - Point p2 = itsct2.pos(); - return forward ? - segment_length(poly, itsct .iSegment, p1, itsct2.iSegment, p2) : - segment_length(poly, itsct2.iSegment, p2, itsct .iSegment, p1); -} - -static inline coordf_t measure_perimeter_prev_segment_length( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2) -{ - return measure_perimeter_prev_next_segment_length(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, iIntersection2, false); -} - -static inline coordf_t measure_perimeter_next_segment_length( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2) -{ - return measure_perimeter_prev_next_segment_length(poly_with_offset, segs, iVerticalLine, iInnerContour, iIntersection, iIntersection2, true); -} - -// Append the points of a perimeter segment when going from iIntersection to iIntersection2. -// The first point (the point of iIntersection) will not be inserted, -// the last point will be inserted. -static inline void emit_perimeter_prev_next_segment( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2, - Polyline &out, - bool dir_is_next) -{ - size_t iVerticalLineOther = iVerticalLine; - if (dir_is_next) { - ++ iVerticalLineOther; - assert(iVerticalLineOther < segs.size()); - } else { - assert(iVerticalLineOther > 0); - -- iVerticalLineOther; - } - - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentedIntersectionLine &il2 = segs[iVerticalLineOther]; - const SegmentIntersection &itsct2 = il2.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); -// const bool ccw = poly_with_offset.is_contour_ccw(iInnerContour); - assert(itsct.type == itsct2.type); - assert(itsct.iContour == itsct2.iContour); - assert(itsct.is_inner()); - const bool forward = itsct.is_low() == dir_is_next; - // Do not append the first point. - // out.points.push_back(Point(il.pos, itsct.pos)); - if (forward) - polygon_segment_append(out.points, poly, itsct.iSegment, itsct2.iSegment); - else - polygon_segment_append_reversed(out.points, poly, itsct.iSegment, itsct2.iSegment); - // Append the last point. - out.points.push_back(itsct2.pos()); -} - -static inline coordf_t measure_perimeter_segment_on_vertical_line_length( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2, - bool forward) -{ - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentIntersection &itsct2 = il.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); - assert(itsct.is_inner()); - assert(itsct2.is_inner()); - assert(itsct.type != itsct2.type); - assert(itsct.iContour == iInnerContour); - assert(itsct.iContour == itsct2.iContour); - return forward ? - segment_length(poly, itsct .iSegment, itsct.pos(), itsct2.iSegment, itsct2.pos()) : - segment_length(poly, itsct2.iSegment, itsct2.pos(), itsct .iSegment, itsct.pos()); -} - -// Append the points of a perimeter segment when going from iIntersection to iIntersection2. -// The first point (the point of iIntersection) will not be inserted, -// the last point will be inserted. -static inline void emit_perimeter_segment_on_vertical_line( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t iVerticalLine, - size_t iInnerContour, - size_t iIntersection, - size_t iIntersection2, - Polyline &out, - bool forward) -{ - const SegmentedIntersectionLine &il = segs[iVerticalLine]; - const SegmentIntersection &itsct = il.intersections[iIntersection]; - const SegmentIntersection &itsct2 = il.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour(iInnerContour); - assert(itsct.is_inner()); - assert(itsct2.is_inner()); - assert(itsct.type != itsct2.type); - assert(itsct.iContour == iInnerContour); - assert(itsct.iContour == itsct2.iContour); - // Do not append the first point. - // out.points.push_back(Point(il.pos, itsct.pos)); - if (forward) - polygon_segment_append(out.points, poly, itsct.iSegment, itsct2.iSegment); - else - polygon_segment_append_reversed(out.points, poly, itsct.iSegment, itsct2.iSegment); - // Append the last point. - out.points.push_back(itsct2.pos()); -} - -//TBD: For precise infill, measure the area of a slab spanned by an infill line. -/* -static inline float measure_outer_contour_slab( - const ExPolygonWithOffset &poly_with_offset, - const std::vector &segs, - size_t i_vline, - size_t iIntersection) -{ - const SegmentedIntersectionLine &il = segs[i_vline]; - const SegmentIntersection &itsct = il.intersections[i_vline]; - const SegmentIntersection &itsct2 = il.intersections[iIntersection2]; - const Polygon &poly = poly_with_offset.contour((itsct.iContour); - assert(itsct.is_outer()); - assert(itsct2.is_outer()); - assert(itsct.type != itsct2.type); - assert(itsct.iContour == itsct2.iContour); - if (! itsct.is_outer() || ! itsct2.is_outer() || itsct.type == itsct2.type || itsct.iContour != itsct2.iContour) - // Error, return zero area. - return 0.f; - - // Find possible connection points on the previous / next vertical line. - int iPrev = intersection_on_prev_vertical_line(poly_with_offset, segs, i_vline, itsct.iContour, i_intersection); - int iNext = intersection_on_next_vertical_line(poly_with_offset, segs, i_vline, itsct.iContour, i_intersection); - // Find possible connection points on the same vertical line. - int iAbove = iBelow = -1; - // Does the perimeter intersect the current vertical line above intrsctn? - for (size_t i = i_intersection + 1; i + 1 < seg.intersections.size(); ++ i) - if (seg.intersections[i].iContour == itsct.iContour) - { iAbove = i; break; } - // Does the perimeter intersect the current vertical line below intrsctn? - for (int i = int(i_intersection) - 1; i > 0; -- i) - if (seg.intersections[i].iContour == itsct.iContour) - { iBelow = i; break; } - - if (iSegAbove != -1 && seg.intersections[iAbove].type == SegmentIntersection::OUTER_HIGH) { - // Invalidate iPrev resp. iNext, if the perimeter crosses the current vertical line earlier than iPrev resp. iNext. - // The perimeter contour orientation. - const Polygon &poly = poly_with_offset.contour(itsct.iContour); - { - int d_horiz = (iPrev == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, itsct.iSegment, true); - int d_down = (iBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegBelow, itsct.iSegment, true); - int d_up = (iAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegAbove, itsct.iSegment, true); - if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up)) - // The vertical crossing comes eralier than the prev crossing. - // Disable the perimeter going back. - intrsctn_type_prev = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST; - if (d_up > std::min(d_horiz, d_down)) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~DIR_BACKWARD; - } - { - int d_horiz = (iNext == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, itsct.iSegment, segs[i_vline+1].intersections[iNext].iSegment, true); - int d_down = (iSegBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, itsct.iSegment, iSegBelow, true); - int d_up = (iSegAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, itsct.iSegment, iSegAbove, true); - if (d_up > std::min(d_horiz, d_down)) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~DIR_FORWARD; - } - } -} -*/ - -enum DirectionMask -{ - DIR_FORWARD = 1, - DIR_BACKWARD = 2 -}; - -// For the rectilinear, grid, triangles, stars and cubic pattern fill one InfillHatchingSingleDirection structure -// for each infill direction. The segments stored in InfillHatchingSingleDirection will then form a graph of candidate -// paths to be extruded. -static bool fill_hatching_segments_legacy( - // Input geometry to be hatch, containing two concentric contours for each input contour. - const ExPolygonWithOffset &poly_with_offset, - // fill density, dont_adjust - const FillParams ¶ms, - const coord_t link_max_length, - // Resulting straight segments of the infill graph. - InfillHatchingSingleDirection &hatching, - Polylines &polylines_out) -{ - // At the end, only the new polylines will be rotated back. - size_t n_polylines_out_initial = polylines_out.size(); - - std::vector &segs = hatching.segs; - - // For each outer only chords, measure their maximum distance to the bow of the outer contour. - // Mark an outer only chord as consumed, if the distance is low. - for (size_t i_vline = 0; i_vline < segs.size(); ++ i_vline) { - SegmentedIntersectionLine &seg = segs[i_vline]; - for (size_t i_intersection = 0; i_intersection + 1 < seg.intersections.size(); ++ i_intersection) { - if (seg.intersections[i_intersection].type == SegmentIntersection::OUTER_LOW && - seg.intersections[i_intersection+1].type == SegmentIntersection::OUTER_HIGH) { - bool consumed = false; -// if (params.full_infill()) { -// measure_outer_contour_slab(poly_with_offset, segs, i_vline, i_ntersection); -// } else - consumed = true; - seg.intersections[i_intersection].consumed_vertical_up = consumed; - } - } - } - - // Now construct a graph. - // Find the first point. - // Naively one would expect to achieve best results by chaining the paths by the shortest distance, - // but that procedure does not create the longest continuous paths. - // A simple "sweep left to right" procedure achieves better results. - size_t i_vline = 0; - size_t i_intersection = size_t(-1); - // Follow the line, connect the lines into a graph. - // Until no new line could be added to the output path: - Point pointLast; - Polyline *polyline_current = NULL; - if (! polylines_out.empty()) - pointLast = polylines_out.back().points.back(); - for (;;) { - if (i_intersection == size_t(-1)) { - // The path has been interrupted. Find a next starting point, closest to the previous extruder position. - coordf_t dist2min = std::numeric_limits().max(); - for (size_t i_vline2 = 0; i_vline2 < segs.size(); ++ i_vline2) { - const SegmentedIntersectionLine &seg = segs[i_vline2]; - if (! seg.intersections.empty()) { - assert(seg.intersections.size() > 1); - // Even number of intersections with the loops. - assert((seg.intersections.size() & 1) == 0); - assert(seg.intersections.front().type == SegmentIntersection::OUTER_LOW); - for (size_t i = 0; i < seg.intersections.size(); ++ i) { - const SegmentIntersection &intrsctn = seg.intersections[i]; - if (intrsctn.is_outer()) { - assert(intrsctn.is_low() || i > 0); - bool consumed = intrsctn.is_low() ? - intrsctn.consumed_vertical_up : - seg.intersections[i-1].consumed_vertical_up; - if (! consumed) { - coordf_t dist2 = (intrsctn.pos() - pointLast).cast().norm(); - if (dist2 < dist2min) { - dist2min = dist2; - i_vline = i_vline2; - i_intersection = i; - //FIXME We are taking the first left point always. Verify, that the caller chains the paths - // by a shortest distance, while reversing the paths if needed. - //if (polylines_out.empty()) - // Initial state, take the first line, which is the first from the left. - goto found; - } - } - } - } - } - } - if (i_intersection == size_t(-1)) - // We are finished. - break; - found: - // Start a new path. - polylines_out.push_back(Polyline()); - polyline_current = &polylines_out.back(); - // Emit the first point of a path. - pointLast = segs[i_vline].intersections[i_intersection].pos(); - polyline_current->points.push_back(pointLast); - } - - // From the initial point (i_vline, i_intersection), follow a path. - SegmentedIntersectionLine &seg = segs[i_vline]; - SegmentIntersection *intrsctn = &seg.intersections[i_intersection]; - bool going_up = intrsctn->is_low(); - bool try_connect = false; - if (going_up) { - assert(! intrsctn->consumed_vertical_up); - assert(i_intersection + 1 < seg.intersections.size()); - // Step back to the beginning of the vertical segment to mark it as consumed. - if (intrsctn->is_inner()) { - assert(i_intersection > 0); - -- intrsctn; - -- i_intersection; - } - // Consume the complete vertical segment up to the outer contour. - do { - intrsctn->consumed_vertical_up = true; - ++ intrsctn; - ++ i_intersection; - assert(i_intersection < seg.intersections.size()); - } while (intrsctn->type != SegmentIntersection::OUTER_HIGH); - if ((intrsctn - 1)->is_inner()) { - // Step back. - -- intrsctn; - -- i_intersection; - assert(intrsctn->type == SegmentIntersection::INNER_HIGH); - try_connect = true; - } - } else { - // Going down. - assert(intrsctn->is_high()); - assert(i_intersection > 0); - assert(! (intrsctn - 1)->consumed_vertical_up); - // Consume the complete vertical segment up to the outer contour. - if (intrsctn->is_inner()) - intrsctn->consumed_vertical_up = true; - do { - assert(i_intersection > 0); - -- intrsctn; - -- i_intersection; - intrsctn->consumed_vertical_up = true; - } while (intrsctn->type != SegmentIntersection::OUTER_LOW); - if ((intrsctn + 1)->is_inner()) { - // Step back. - ++ intrsctn; - ++ i_intersection; - assert(intrsctn->type == SegmentIntersection::INNER_LOW); - try_connect = true; - } - } - if (try_connect) { - // Decide, whether to finish the segment, or whether to follow the perimeter. - - // 1) Find possible connection points on the previous / next vertical line. - int iPrev = intersection_on_prev_vertical_line(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection); - int iNext = intersection_on_next_vertical_line(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection); - IntersectionTypeOtherVLine intrsctn_type_prev = intersection_type_on_prev_vertical_line(segs, i_vline, i_intersection, iPrev); - IntersectionTypeOtherVLine intrsctn_type_next = intersection_type_on_next_vertical_line(segs, i_vline, i_intersection, iNext); - - // 2) Find possible connection points on the same vertical line. - int iAbove = -1; - int iBelow = -1; - int iSegAbove = -1; - int iSegBelow = -1; - { -// SegmentIntersection::SegmentIntersectionType type_crossing = (intrsctn->type == SegmentIntersection::INNER_LOW) ? -// SegmentIntersection::INNER_HIGH : SegmentIntersection::INNER_LOW; - // Does the perimeter intersect the current vertical line above intrsctn? - for (size_t i = i_intersection + 1; i + 1 < seg.intersections.size(); ++ i) -// if (seg.intersections[i].iContour == intrsctn->iContour && seg.intersections[i].type == type_crossing) { - if (seg.intersections[i].iContour == intrsctn->iContour) { - iAbove = i; - iSegAbove = seg.intersections[i].iSegment; - break; - } - // Does the perimeter intersect the current vertical line below intrsctn? - for (size_t i = i_intersection - 1; i > 0; -- i) -// if (seg.intersections[i].iContour == intrsctn->iContour && seg.intersections[i].type == type_crossing) { - if (seg.intersections[i].iContour == intrsctn->iContour) { - iBelow = i; - iSegBelow = seg.intersections[i].iSegment; - break; - } - } - - // 3) Sort the intersection points, clear iPrev / iNext / iSegBelow / iSegAbove, - // if it is preceded by any other intersection point along the contour. - unsigned int vert_seg_dir_valid_mask = - (going_up ? - (iSegAbove != -1 && seg.intersections[iAbove].type == SegmentIntersection::INNER_LOW) : - (iSegBelow != -1 && seg.intersections[iBelow].type == SegmentIntersection::INNER_HIGH)) ? - (DIR_FORWARD | DIR_BACKWARD) : - 0; - { - // Invalidate iPrev resp. iNext, if the perimeter crosses the current vertical line earlier than iPrev resp. iNext. - // The perimeter contour orientation. - const bool forward = intrsctn->is_low(); // == poly_with_offset.is_contour_ccw(intrsctn->iContour); - const Polygon &poly = poly_with_offset.contour(intrsctn->iContour); - { - int d_horiz = (iPrev == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, intrsctn->iSegment, forward); - int d_down = (iSegBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegBelow, intrsctn->iSegment, forward); - int d_up = (iSegAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, iSegAbove, intrsctn->iSegment, forward); - if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up)) - // The vertical crossing comes eralier than the prev crossing. - // Disable the perimeter going back. - intrsctn_type_prev = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST; - if (going_up ? (d_up > std::min(d_horiz, d_down)) : (d_down > std::min(d_horiz, d_up))) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~(forward ? DIR_BACKWARD : DIR_FORWARD); - } - { - int d_horiz = (iNext == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, intrsctn->iSegment, segs[i_vline+1].intersections[iNext].iSegment, forward); - int d_down = (iSegBelow == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, intrsctn->iSegment, iSegBelow, forward); - int d_up = (iSegAbove == -1) ? std::numeric_limits::max() : - distance_of_segmens(poly, intrsctn->iSegment, iSegAbove, forward); - if (intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK && d_horiz > std::min(d_down, d_up)) - // The vertical crossing comes eralier than the prev crossing. - // Disable the perimeter going forward. - intrsctn_type_next = INTERSECTION_TYPE_OTHER_VLINE_NOT_FIRST; - if (going_up ? (d_up > std::min(d_horiz, d_down)) : (d_down > std::min(d_horiz, d_up))) - // The horizontal crossing comes earlier than the vertical crossing. - vert_seg_dir_valid_mask &= ~(forward ? DIR_FORWARD : DIR_BACKWARD); - } - } - - // 4) Try to connect to a previous or next vertical line, making a zig-zag pattern. - if (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK || intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK) { - coordf_t distPrev = (intrsctn_type_prev != INTERSECTION_TYPE_OTHER_VLINE_OK) ? std::numeric_limits::max() : - measure_perimeter_prev_segment_length(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iPrev); - coordf_t distNext = (intrsctn_type_next != INTERSECTION_TYPE_OTHER_VLINE_OK) ? std::numeric_limits::max() : - measure_perimeter_next_segment_length(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext); - // Take the shorter path. - //FIXME this may not be always the best strategy to take the shortest connection line now. - bool take_next = (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK) ? - (distNext < distPrev) : - intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK; - assert(intrsctn->is_inner()); - bool skip = params.dont_connect || (link_max_length > 0 && (take_next ? distNext : distPrev) > link_max_length); - if (skip) { - // Just skip the connecting contour and start a new path. - goto dont_connect; - polyline_current->points.push_back(intrsctn->pos()); - polylines_out.push_back(Polyline()); - polyline_current = &polylines_out.back(); - const SegmentedIntersectionLine &il2 = segs[take_next ? (i_vline + 1) : (i_vline - 1)]; - polyline_current->points.push_back(il2.intersections[take_next ? iNext : iPrev].pos()); - } else { - polyline_current->points.push_back(intrsctn->pos()); - emit_perimeter_prev_next_segment(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, take_next ? iNext : iPrev, *polyline_current, take_next); - } - // Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed. - if (iPrev != -1) - segs[i_vline-1].intersections[iPrev].consumed_perimeter_right = true; - if (iNext != -1) - intrsctn->consumed_perimeter_right = true; - //FIXME consume the left / right connecting segments at the other end of this line? Currently it is not critical because a perimeter segment is not followed if the vertical segment at the other side has already been consumed. - // Advance to the neighbor line. - if (take_next) { - ++ i_vline; - i_intersection = iNext; - } else { - -- i_vline; - i_intersection = iPrev; - } - continue; - } - - // 5) Try to connect to a previous or next point on the same vertical line. - if (vert_seg_dir_valid_mask) { - bool valid = true; - // Verify, that there is no intersection with the inner contour up to the end of the contour segment. - // Verify, that the successive segment has not been consumed yet. - if (going_up) { - if (seg.intersections[iAbove].consumed_vertical_up) { - valid = false; - } else { - for (int i = (int)i_intersection + 1; i < iAbove && valid; ++i) - if (seg.intersections[i].is_inner()) - valid = false; - } - } else { - if (seg.intersections[iBelow-1].consumed_vertical_up) { - valid = false; - } else { - for (int i = iBelow + 1; i < (int)i_intersection && valid; ++i) - if (seg.intersections[i].is_inner()) - valid = false; - } - } - if (valid) { - const Polygon &poly = poly_with_offset.contour(intrsctn->iContour); - int iNext = going_up ? iAbove : iBelow; - int iSegNext = going_up ? iSegAbove : iSegBelow; - bool dir_forward = (vert_seg_dir_valid_mask == (DIR_FORWARD | DIR_BACKWARD)) ? - // Take the shorter length between the current and the next intersection point. - (distance_of_segmens(poly, intrsctn->iSegment, iSegNext, true) < - distance_of_segmens(poly, intrsctn->iSegment, iSegNext, false)) : - (vert_seg_dir_valid_mask == DIR_FORWARD); - // Skip this perimeter line? - bool skip = params.dont_connect; - if (! skip && link_max_length > 0) { - coordf_t link_length = measure_perimeter_segment_on_vertical_line_length( - poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext, dir_forward); - skip = link_length > link_max_length; - } - polyline_current->points.push_back(intrsctn->pos()); - if (skip) { - // Just skip the connecting contour and start a new path. - polylines_out.push_back(Polyline()); - polyline_current = &polylines_out.back(); - polyline_current->points.push_back(seg.intersections[iNext].pos()); - } else { - // Consume the connecting contour and the next segment. - emit_perimeter_segment_on_vertical_line(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext, *polyline_current, dir_forward); - } - // Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed. - // If there are any outer intersection points skipped (bypassed) by the contour, - // mark them as processed. - if (going_up) { - for (int i = (int)i_intersection; i < iAbove; ++ i) - seg.intersections[i].consumed_vertical_up = true; - } else { - for (int i = iBelow; i < (int)i_intersection; ++ i) - seg.intersections[i].consumed_vertical_up = true; - } -// seg.intersections[going_up ? i_intersection : i_intersection - 1].consumed_vertical_up = true; - intrsctn->consumed_perimeter_right = true; - i_intersection = iNext; - if (going_up) - ++ intrsctn; - else - -- intrsctn; - intrsctn->consumed_perimeter_right = true; - continue; - } - } - dont_connect: - // No way to continue the current polyline. Take the rest of the line up to the outer contour. - // This will finish the polyline, starting another polyline at a new point. - if (going_up) - ++ intrsctn; - else - -- intrsctn; - } - - // Finish the current vertical line, - // reset the current vertical line to pick a new starting point in the next round. - assert(intrsctn->is_outer()); - assert(intrsctn->is_high() == going_up); - pointLast = intrsctn->pos(); - polyline_current->points.push_back(pointLast); - // Handle duplicate points and zero length segments. - polyline_current->remove_duplicate_points(); - assert(! polyline_current->has_duplicate_points()); - // Handle nearly zero length edges. - if (polyline_current->points.size() <= 1 || - (polyline_current->points.size() == 2 && - std::abs(polyline_current->points.front()(0) - polyline_current->points.back()(0)) < SCALED_EPSILON && - std::abs(polyline_current->points.front()(1) - polyline_current->points.back()(1)) < SCALED_EPSILON)) - polylines_out.pop_back(); - intrsctn = NULL; - i_intersection = -1; - polyline_current = NULL; - } - -#ifdef SLIC3R_DEBUG - { - static int iRun = 0; - BoundingBox bbox_svg = poly_with_offset.bounding_box_outer(); - { - ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-final-%03d.svg", iRun), bbox_svg); // , scale_(1.)); - poly_with_offset.export_to_svg(svg); - for (size_t i = n_polylines_out_initial; i < polylines_out.size(); ++ i) - svg.draw(polylines_out[i].lines(), "black"); - } - // Paint a picture per polyline. This makes it easier to discover the order of the polylines and their overlap. - for (size_t i_polyline = n_polylines_out_initial; i_polyline < polylines_out.size(); ++ i_polyline) { - ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-final-%03d-%03d.svg", iRun, i_polyline), bbox_svg); // , scale_(1.)); - svg.draw(polylines_out[i_polyline].lines(), "black"); - } - } -#endif /* SLIC3R_DEBUG */ - - // paths must be rotated back - for (Polylines::iterator it = polylines_out.begin() + n_polylines_out_initial; it != polylines_out.end(); ++ it) { - // No need to translate, the absolute position is irrelevant. - // it->translate(- rotate_vector.second(0), - rotate_vector.second(1)); - assert(! it->has_duplicate_points()); - //it->rotate(rotate_vector.first); - //FIXME rather simplify the paths to avoid very short edges? - //assert(! it->has_duplicate_points()); - it->remove_duplicate_points(); - } - -#ifdef SLIC3R_DEBUG - // Verify, that there are no duplicate points in the sequence. - for (Polyline &polyline : polylines_out) - assert(! polyline.has_duplicate_points()); -#endif /* SLIC3R_DEBUG */ - - return true; -} - -}; // namespace FillRectilinear3_Internal - -bool FillRectilinear3::fill_surface_by_lines(const Surface *surface, const FillParams ¶ms, std::vector &fill_dir_params, Polylines &polylines_out) -{ - assert(params.density > 0.0001f && params.density <= 1.f); - - const float INFILL_OVERLAP_OVER_SPACING = 0.45f; - assert(INFILL_OVERLAP_OVER_SPACING > 0 && INFILL_OVERLAP_OVER_SPACING < 0.5f); - - // On the polygons of poly_with_offset, the infill lines will be connected. - FillRectilinear3_Internal::ExPolygonWithOffset poly_with_offset( - surface->expolygon, - float(scale_(- (0.5 - INFILL_OVERLAP_OVER_SPACING) * this->spacing)), - float(scale_(- 0.5 * this->spacing))); - if (poly_with_offset.n_contours_inner == 0) { - // Not a single infill line fits. - //FIXME maybe one shall trigger the gap fill here? - return true; - } - - // Rotate polygons so that we can work with vertical lines here - std::pair rotate_vector = this->_infill_direction(surface); - std::vector hatching(fill_dir_params.size(), FillRectilinear3_Internal::InfillHatchingSingleDirection()); - for (size_t i = 0; i < hatching.size(); ++ i) - if (! FillRectilinear3_Internal::prepare_infill_hatching_segments(poly_with_offset, params, fill_dir_params[i], rotate_vector, hatching[i])) - return false; - - for (size_t i = 0; i < hatching.size(); ++ i) - if (! FillRectilinear3_Internal::fill_hatching_segments_legacy( - poly_with_offset, - params, - this->link_max_length, - hatching[i], - polylines_out)) - return false; - - return true; -} - -Polylines FillRectilinear3::fill_surface(const Surface *surface, const FillParams ¶ms) -{ - Polylines polylines_out; - std::vector fill_dir_params; - fill_dir_params.emplace_back(FillDirParams(this->spacing, 0.f)); - if (! fill_surface_by_lines(surface, params, fill_dir_params, polylines_out)) - printf("FillRectilinear3::fill_surface() failed to fill a region.\n"); - if (params.full_infill() && ! params.dont_adjust) - // Return back the adjusted spacing. - this->spacing = fill_dir_params.front().spacing; - return polylines_out; -} - -Polylines FillGrid3::fill_surface(const Surface *surface, const FillParams ¶ms) -{ - // Each linear fill covers half of the target coverage. - FillParams params2 = params; - params2.density *= 0.5f; - Polylines polylines_out; - std::vector fill_dir_params; - fill_dir_params.emplace_back(FillDirParams(this->spacing, 0.f)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, float(M_PI / 2.))); - if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out)) - printf("FillGrid3::fill_surface() failed to fill a region.\n"); - return polylines_out; -} - -Polylines FillTriangles3::fill_surface(const Surface *surface, const FillParams ¶ms) -{ - // Each linear fill covers 1/3 of the target coverage. - FillParams params2 = params; - params2.density *= 0.333333333f; - Polylines polylines_out; - std::vector fill_dir_params; - fill_dir_params.emplace_back(FillDirParams(this->spacing, 0.)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, M_PI / 3.)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, 2. * M_PI / 3.)); - if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out)) - printf("FillTriangles3::fill_surface() failed to fill a region.\n"); - return polylines_out; -} - -Polylines FillStars3::fill_surface(const Surface *surface, const FillParams ¶ms) -{ - // Each linear fill covers 1/3 of the target coverage. - FillParams params2 = params; - params2.density *= 0.333333333f; - Polylines polylines_out; - std::vector fill_dir_params; - fill_dir_params.emplace_back(FillDirParams(this->spacing, 0.)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, M_PI / 3.)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, 2. * M_PI / 3., 0.5 * this->spacing / params2.density)); - if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out)) - printf("FillStars3::fill_surface() failed to fill a region.\n"); - return polylines_out; -} - -Polylines FillCubic3::fill_surface(const Surface *surface, const FillParams ¶ms) -{ - // Each linear fill covers 1/3 of the target coverage. - FillParams params2 = params; - params2.density *= 0.333333333f; - Polylines polylines_out; - std::vector fill_dir_params; - coordf_t dx = sqrt(0.5) * z; - fill_dir_params.emplace_back(FillDirParams(this->spacing, 0., dx)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, M_PI / 3., -dx)); - fill_dir_params.emplace_back(FillDirParams(this->spacing, 2. * M_PI / 3., dx)); - if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out)) - printf("FillCubic3::fill_surface() failed to fill a region.\n"); - return polylines_out; -} - -} // namespace Slic3r diff --git a/src/libslic3r/Fill/FillRectilinear3.hpp b/src/libslic3r/Fill/FillRectilinear3.hpp deleted file mode 100644 index 2023a25b77..0000000000 --- a/src/libslic3r/Fill/FillRectilinear3.hpp +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef slic3r_FillRectilinear3_hpp_ -#define slic3r_FillRectilinear3_hpp_ - -#include "../libslic3r.h" - -#include "FillBase.hpp" - -namespace Slic3r { - -class Surface; - -class FillRectilinear3 : public Fill -{ -public: - virtual Fill* clone() const { return new FillRectilinear3(*this); }; - virtual ~FillRectilinear3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); - - struct FillDirParams - { - FillDirParams(coordf_t spacing, double angle, coordf_t pattern_shift = 0.f) : - spacing(spacing), angle(angle), pattern_shift(pattern_shift) {} - coordf_t spacing; - double angle; - coordf_t pattern_shift; - }; - -protected: - bool fill_surface_by_lines(const Surface *surface, const FillParams ¶ms, std::vector &fill_dir_params, Polylines &polylines_out); -}; - -class FillGrid3 : public FillRectilinear3 -{ -public: - virtual Fill* clone() const { return new FillGrid3(*this); }; - virtual ~FillGrid3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); - -protected: - // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. - virtual float _layer_angle(size_t /* idx */) const { return 0.f; } -}; - -class FillTriangles3 : public FillRectilinear3 -{ -public: - virtual Fill* clone() const { return new FillTriangles3(*this); }; - virtual ~FillTriangles3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); - -protected: - // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. - virtual float _layer_angle(size_t /* idx */) const { return 0.f; } -}; - -class FillStars3 : public FillRectilinear3 -{ -public: - virtual Fill* clone() const { return new FillStars3(*this); }; - virtual ~FillStars3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); - -protected: - // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. - virtual float _layer_angle(size_t /* idx */) const { return 0.f; } -}; - -class FillCubic3 : public FillRectilinear3 -{ -public: - virtual Fill* clone() const { return new FillCubic3(*this); }; - virtual ~FillCubic3() {} - virtual Polylines fill_surface(const Surface *surface, const FillParams ¶ms); - -protected: - // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill. - virtual float _layer_angle(size_t /* idx */) const { return 0.f; } -}; - - -}; // namespace Slic3r - -#endif // slic3r_FillRectilinear3_hpp_ diff --git a/src/libslic3r/Flow.cpp b/src/libslic3r/Flow.cpp index 6069677a1b..e5dcf07310 100644 --- a/src/libslic3r/Flow.cpp +++ b/src/libslic3r/Flow.cpp @@ -1,12 +1,24 @@ #include "Flow.hpp" +#include "I18N.hpp" #include "Print.hpp" #include #include +#include + +// Mark string for localization and translate. +#define L(s) Slic3r::I18N::translate(s) + namespace Slic3r { +FlowErrorNegativeSpacing::FlowErrorNegativeSpacing() : + FlowError("Flow::spacing() produced negative spacing. Did you set some extrusion width too small?") {} + +FlowErrorNegativeFlow::FlowErrorNegativeFlow() : + FlowError("Flow::mm3_per_mm() produced negative flow. Did you set some extrusion width too small?") {} + // This static method returns a sane extrusion width default. -static inline float auto_extrusion_width(FlowRole role, float nozzle_diameter, float height) +float Flow::auto_extrusion_width(FlowRole role, float nozzle_diameter) { switch (role) { case frSupportMaterial: @@ -22,13 +34,99 @@ static inline float auto_extrusion_width(FlowRole role, float nozzle_diameter, f } } +// Used by the Flow::extrusion_width() funtion to provide hints to the user on default extrusion width values, +// and to provide reasonable values to the PlaceholderParser. +static inline FlowRole opt_key_to_flow_role(const std::string &opt_key) +{ + if (opt_key == "perimeter_extrusion_width" || + // or all the defaults: + opt_key == "extrusion_width" || opt_key == "first_layer_extrusion_width") + return frPerimeter; + else if (opt_key == "external_perimeter_extrusion_width") + return frExternalPerimeter; + else if (opt_key == "infill_extrusion_width") + return frInfill; + else if (opt_key == "solid_infill_extrusion_width") + return frSolidInfill; + else if (opt_key == "top_infill_extrusion_width") + return frTopSolidInfill; + else if (opt_key == "support_material_extrusion_width") + return frSupportMaterial; + else + 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) +{ + throw FlowErrorMissingVariable((boost::format(L("Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible.")) % opt_key % dependent_opt_key).str()); +} + +// Used to provide hints to the user on default extrusion width values, and to provide reasonable values to the PlaceholderParser. +double Flow::extrusion_width(const std::string& opt_key, const ConfigOptionFloatOrPercent* opt, const ConfigOptionResolver& config, const unsigned int first_printing_extruder) +{ + assert(opt != nullptr); + + bool first_layer = boost::starts_with(opt_key, "first_layer_"); + +#if 0 +// This is the logic used for skit / brim, but not for the rest of the 1st layer. + if (opt->value == 0. && first_layer) { + // The "first_layer_extrusion_width" was set to zero, try a substitute. + opt = config.option("perimeter_extrusion_width"); + if (opt == nullptr) + throw_on_missing_variable(opt_key, "perimeter_extrusion_width"); + } +#endif + + if (opt->value == 0.) { + // The role specific extrusion width value was set to zero, try the role non-specific extrusion width. + opt = config.option("extrusion_width"); + if (opt == nullptr) + throw_on_missing_variable(opt_key, "extrusion_width"); + // Use the "layer_height" instead of "first_layer_height". + first_layer = false; + } + + if (opt->percent) { + auto opt_key_layer_height = first_layer ? "first_layer_height" : "layer_height"; + auto opt_layer_height = config.option(opt_key_layer_height); + if (opt_layer_height == nullptr) + throw_on_missing_variable(opt_key, opt_key_layer_height); + double layer_height = opt_layer_height->getFloat(); + if (first_layer && static_cast(opt_layer_height)->percent) { + // first_layer_height depends on layer_height. + opt_layer_height = config.option("layer_height"); + if (opt_layer_height == nullptr) + throw_on_missing_variable(opt_key, "layer_height"); + layer_height *= 0.01 * opt_layer_height->getFloat(); + } + return opt->get_abs_value(layer_height); + } + + if (opt->value == 0.) { + // If user left option to 0, calculate a sane default width. + auto opt_nozzle_diameters = config.option("nozzle_diameter"); + if (opt_nozzle_diameters == nullptr) + throw_on_missing_variable(opt_key, "nozzle_diameter"); + return auto_extrusion_width(opt_key_to_flow_role(opt_key), float(opt_nozzle_diameters->get_at(first_printing_extruder))); + } + + return opt->value; +} + +// Used to provide hints to the user on default extrusion width values, and to provide reasonable values to the PlaceholderParser. +double Flow::extrusion_width(const std::string& opt_key, const ConfigOptionResolver &config, const unsigned int first_printing_extruder) +{ + return extrusion_width(opt_key, config.option(opt_key), config, first_printing_extruder); +} + // This constructor builds a Flow object from an extrusion width config setting // and other context properties. Flow Flow::new_from_config_width(FlowRole role, const ConfigOptionFloatOrPercent &width, float nozzle_diameter, float height, float bridge_flow_ratio) { // 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) { @@ -39,7 +137,7 @@ Flow Flow::new_from_config_width(FlowRole role, const ConfigOptionFloatOrPercent sqrt(bridge_flow_ratio) * nozzle_diameter; } else if (! width.percent && width.value == 0.) { // If user left option to 0, calculate a sane default width. - w = auto_extrusion_width(role, nozzle_diameter, height); + w = auto_extrusion_width(role, nozzle_diameter); } else { // If user set a manual value, use it. w = float(width.get_abs_value(height)); @@ -53,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. @@ -82,7 +180,7 @@ float Flow::spacing() const #endif // assert(res > 0.f); if (res <= 0.f) - throw std::runtime_error("Flow::spacing() produced negative spacing. Did you set some extrusion width too small?"); + throw FlowErrorNegativeSpacing(); return res; } @@ -98,7 +196,7 @@ float Flow::spacing(const Flow &other) const 0.5 * this->spacing() + 0.5 * other.spacing()); // assert(res > 0.f); if (res <= 0.f) - throw std::runtime_error("Flow::spacing() produced negative spacing. Did you set some extrusion width too small?"); + throw FlowErrorNegativeSpacing(); return res; } @@ -107,12 +205,12 @@ double Flow::mm3_per_mm() const { float res = this->bridge ? // Area of a circle with dmr of this->width. - (this->width * this->width) * 0.25 * PI : + float((this->width * this->width) * 0.25 * PI) : // Rectangle with semicircles at the ends. ~ h (w - 0.215 h) - this->height * (this->width - this->height * (1. - 0.25 * PI)); + float(this->height * (this->width - this->height * (1. - 0.25 * PI))); //assert(res > 0.); if (res <= 0.) - throw std::runtime_error("Flow::mm3_per_mm() produced negative flow. Did you set some extrusion width too small?"); + throw FlowErrorNegativeFlow(); return res; } diff --git a/src/libslic3r/Flow.hpp b/src/libslic3r/Flow.hpp index 51cc4da9d4..9e57ce9079 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,6 +28,31 @@ enum FlowRole { frSupportMaterialInterface, }; +class FlowError : public Slic3r::InvalidArgument +{ +public: + FlowError(const std::string& what_arg) : Slic3r::InvalidArgument(what_arg) {} + FlowError(const char* what_arg) : Slic3r::InvalidArgument(what_arg) {} +}; + +class FlowErrorNegativeSpacing : public FlowError +{ +public: + FlowErrorNegativeSpacing(); +}; + +class FlowErrorNegativeFlow : public FlowError +{ +public: + FlowErrorNegativeFlow(); +}; + +class FlowErrorMissingVariable : public FlowError +{ +public: + FlowErrorMissingVariable(const std::string& what_arg) : FlowError(what_arg) {} +}; + class Flow { public: @@ -64,6 +90,16 @@ public: // This method is used exclusively to calculate new flow of 100% infill, where the extrusion width was allowed to scale // to fit a region with integer number of lines. static Flow new_from_spacing(float spacing, float nozzle_diameter, float height, bool bridge); + + // Sane extrusion width defautl based on nozzle diameter. + // The defaults were derived from manual Prusa MK3 profiles. + static float auto_extrusion_width(FlowRole role, float nozzle_diameter); + + // Extrusion width from full config, taking into account the defaults (when set to zero) and ratios (percentages). + // Precise value depends on layer index (1st layer vs. other layers vs. variable layer height), + // on active extruder etc. Therefore the value calculated by this function shall be used as a hint only. + static double extrusion_width(const std::string &opt_key, const ConfigOptionFloatOrPercent *opt, const ConfigOptionResolver &config, const unsigned int first_printing_extruder = 0); + static double extrusion_width(const std::string &opt_key, const ConfigOptionResolver &config, const unsigned int first_printing_extruder = 0); }; extern Flow support_material_flow(const PrintObject *object, float layer_height = 0.f); diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp index ff3cf777d3..a4fd228fc4 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" @@ -34,8 +34,12 @@ namespace pt = boost::property_tree; // VERSION NUMBERS // 0 : .3mf, files saved by older slic3r or other applications. No version definition in them. // 1 : Introduction of 3mf versioning. No other change in data saved into 3mf files. -// 2 : Meshes saved in their local system; Volumes' matrices and source data added to Metadata/Slic3r_PE_model.config file. -const unsigned int VERSION_3MF = 2; +// 2 : Volumes' matrices and source data added to Metadata/Slic3r_PE_model.config file, meshes transformed back to their coordinate system on loading. +// WARNING !! -> the version number has been rolled back to 1 +// the next change should use 3 +const unsigned int VERSION_3MF = 1; +// Allow loading version 2 file as well. +const unsigned int VERSION_3MF_COMPATIBLE = 2; const char* SLIC3RPE_3MF_VERSION = "slic3rpe:Version3mf"; // definition of the metadata name saved into .model file const std::string MODEL_FOLDER = "3D/"; @@ -43,14 +47,14 @@ 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"; const std::string LAYER_CONFIG_RANGES_FILE = "Metadata/Prusa_Slicer_layer_config_ranges.xml"; const std::string SLA_SUPPORT_POINTS_FILE = "Metadata/Slic3r_PE_sla_support_points.txt"; +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"; @@ -82,6 +86,9 @@ 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* CUSTOM_SUPPORTS_ATTR = "slic3rpe:custom_supports"; +const char* CUSTOM_SEAM_ATTR = "slic3rpe:custom_seam"; const char* KEY_ATTR = "key"; const char* VALUE_ATTR = "value"; @@ -117,11 +124,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) @@ -279,6 +286,8 @@ namespace Slic3r { { std::vector vertices; std::vector triangles; + std::vector custom_supports; + std::vector custom_seam; bool empty() { @@ -289,6 +298,8 @@ namespace Slic3r { { vertices.clear(); triangles.clear(); + custom_supports.clear(); + custom_seam.clear(); } }; @@ -379,6 +390,7 @@ namespace Slic3r { typedef std::map> IdToLayerHeightsProfileMap; typedef std::map IdToLayerConfigRangesMap; typedef std::map> IdToSlaSupportPointsMap; + typedef std::map> IdToSlaDrainHolesMap; // Version of the 3mf file unsigned int m_version; @@ -397,6 +409,7 @@ namespace Slic3r { IdToLayerHeightsProfileMap m_layer_heights_profiles; IdToLayerConfigRangesMap m_layer_config_ranges; IdToSlaSupportPointsMap m_sla_support_points; + IdToSlaDrainHolesMap m_sla_drain_holes; std::string m_curr_metadata_name; std::string m_curr_characters; std::string m_name; @@ -416,6 +429,9 @@ namespace Slic3r { void _extract_layer_heights_profile_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); void _extract_layer_config_ranges_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); void _extract_sla_support_points_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); + void _extract_sla_drain_holes_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); + + void _extract_custom_gcode_per_print_z_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat); void _extract_print_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, DynamicPrintConfig& config, const std::string& archive_filename); bool _extract_model_config_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat, Model& model); @@ -592,7 +608,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()); } } } @@ -621,11 +637,21 @@ namespace Slic3r { // extract sla support points file _extract_sla_support_points_from_archive(archive, stat); } + else if (boost::algorithm::iequals(name, SLA_DRAIN_HOLES_FILE)) + { + // extract sla support points file + _extract_sla_drain_holes_from_archive(archive, stat); + } else if (boost::algorithm::iequals(name, PRINT_CONFIG_FILE)) { // extract slic3r print config file _extract_print_config_from_archive(archive, stat, config, filename); } + if (boost::algorithm::iequals(name, CUSTOM_GCODE_PER_PRINT_Z_FILE)) + { + // extract slic3r layer config ranges file + _extract_custom_gcode_per_print_z_from_archive(archive, stat); + } else if (boost::algorithm::iequals(name, MODEL_CONFIG_FILE)) { // extract slic3r model config file @@ -657,19 +683,24 @@ 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 = std::move(obj_drain_holes->second); + } IdToMetadataMap::iterator obj_metadata = m_objects_metadata.find(object.first); if (obj_metadata != m_objects_metadata.end()) @@ -703,8 +734,8 @@ namespace Slic3r { return false; } - // fixes the min z of the model if negative - model.adjust_min_z(); +// // fixes the min z of the model if negative +// model.adjust_min_z(); return true; } @@ -750,7 +781,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; @@ -759,7 +790,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) { @@ -903,7 +934,7 @@ namespace Slic3r { double max_z = range_tree.get(".max_z"); // get Z range information - DynamicPrintConfig& config = config_ranges[{ min_z, max_z }]; + DynamicPrintConfig config; for (const auto& option : range_tree) { @@ -914,10 +945,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))); } } } @@ -942,8 +975,9 @@ namespace Slic3r { // Info on format versioning - see 3mf.hpp int version = 0; - if (!objects.empty() && objects[0].find("support_points_format_version=") != std::string::npos) { - objects[0].erase(objects[0].begin(), objects[0].begin() + 30); // removes the string + std::string key("support_points_format_version="); + if (!objects.empty() && objects[0].find(key) != std::string::npos) { + objects[0].erase(objects[0].begin(), objects[0].begin() + long(key.size())); // removes the string version = std::stoi(objects[0]); objects.erase(objects.begin()); // pop the header } @@ -1009,6 +1043,99 @@ namespace Slic3r { } } } + + void _3MF_Importer::_extract_sla_drain_holes_from_archive(mz_zip_archive& archive, const mz_zip_archive_file_stat& stat) + { + if (stat.m_uncomp_size > 0) + { + std::string buffer(size_t(stat.m_uncomp_size), 0); + mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); + if (res == 0) + { + add_error("Error while reading sla support points data to buffer"); + return; + } + + if (buffer.back() == '\n') + buffer.pop_back(); + + std::vector objects; + boost::split(objects, buffer, boost::is_any_of("\n"), boost::token_compress_off); + + // Info on format versioning - see 3mf.hpp + int version = 0; + std::string key("drain_holes_format_version="); + if (!objects.empty() && objects[0].find(key) != std::string::npos) { + objects[0].erase(objects[0].begin(), objects[0].begin() + long(key.size())); // removes the string + version = std::stoi(objects[0]); + objects.erase(objects.begin()); // pop the header + } + + for (const std::string& object : objects) + { + std::vector object_data; + boost::split(object_data, object, boost::is_any_of("|"), boost::token_compress_off); + + if (object_data.size() != 2) + { + add_error("Error while reading object data"); + continue; + } + + std::vector object_data_id; + boost::split(object_data_id, object_data[0], boost::is_any_of("="), boost::token_compress_off); + if (object_data_id.size() != 2) + { + add_error("Error while reading object id"); + continue; + } + + int object_id = std::atoi(object_data_id[1].c_str()); + if (object_id == 0) + { + add_error("Found invalid object id"); + continue; + } + + IdToSlaDrainHolesMap::iterator object_item = m_sla_drain_holes.find(object_id); + if (object_item != m_sla_drain_holes.end()) + { + add_error("Found duplicated SLA drain holes"); + continue; + } + + std::vector object_data_points; + boost::split(object_data_points, object_data[1], boost::is_any_of(" "), boost::token_compress_off); + + sla::DrainHoles sla_drain_holes; + + if (version == 1) { + for (unsigned int i=0; i 0) + { + std::string buffer((size_t)stat.m_uncomp_size, 0); + mz_bool res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (void*)buffer.data(), (size_t)stat.m_uncomp_size, 0); + if (res == 0) { + add_error("Error while reading custom Gcodes per height data to buffer"); + return; + } + + std::istringstream iss(buffer); // wrap returned xml to istringstream + pt::ptree main_tree; + pt::read_xml(iss, main_tree); + + if (main_tree.front().first != "custom_gcodes_per_print_z") + return; + pt::ptree code_tree = main_tree.front().second; + + m_model->custom_gcode_per_print_z.gcodes.clear(); + + for (const auto& code : code_tree) + { + if (code.first == "mode") + { + pt::ptree tree = code.second; + std::string mode = tree.get(".value"); + m_model->custom_gcode_per_print_z.mode = mode == CustomGCode::SingleExtruderMode ? CustomGCode::Mode::SingleExtruder : + mode == CustomGCode::MultiAsSingleMode ? CustomGCode::Mode::MultiAsSingle : + CustomGCode::Mode::MultiExtruder; + } + if (code.first != "code") + continue; + + pt::ptree tree = code.second; + double print_z = tree.get (".print_z" ); + int extruder = tree.get (".extruder"); + std::string color = tree.get (".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 (".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(tree.get(".type")); + extra = tree.get(".extra"); + } + m_model->custom_gcode_per_print_z.gcodes.push_back(CustomGCode::Item{print_z, type, extruder, color, extra}) ; + } + } + } + void _3MF_Importer::_handle_start_model_xml_element(const char* name, const char** attributes) { if (m_xml_parser == nullptr) @@ -1367,6 +1557,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; } @@ -1467,10 +1660,12 @@ namespace Slic3r { { m_version = (unsigned int)atoi(m_curr_characters.c_str()); - if (m_check_version && (m_version > VERSION_3MF)) + if (m_check_version && (m_version > VERSION_3MF_COMPATIBLE)) { - std::string msg = _(L("The selected 3mf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible.")); - throw version_error(msg.c_str()); + // std::string msg = _(L("The selected 3mf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible.")); + // throw version_error(msg.c_str()); + const std::string msg = (boost::format(_(L("The selected 3mf file has been saved with a newer version of %1% and is not compatible."))) % std::string(SLIC3R_APP_NAME)).str(); + throw version_error(msg); } } @@ -1563,6 +1758,9 @@ namespace Slic3r { return false; } + // Added because of github #3435, currently not used by PrusaSlicer + // int instances_count_id = get_attribute_value_int(attributes, num_attributes, INSTANCESCOUNT_ATTR); + m_objects_metadata.insert(IdToMetadataMap::value_type(object_id, ObjectMetadata())); m_curr_config.object_id = object_id; return true; @@ -1651,20 +1849,18 @@ namespace Slic3r { return false; } - Slic3r::Geometry::Transformation transform; - if (m_version > 1) + Transform3d volume_matrix_to_object = Transform3d::Identity(); + bool has_transform = false; + // extract the volume transformation from the volume's metadata, if present + for (const Metadata& metadata : volume_data.metadata) { - // extract the volume transformation from the volume's metadata, if present - for (const Metadata& metadata : volume_data.metadata) + if (metadata.key == MATRIX_KEY) { - if (metadata.key == MATRIX_KEY) - { - transform.set_from_string(metadata.value); - break; - } + volume_matrix_to_object = Slic3r::Geometry::transform3d_from_string(metadata.value); + has_transform = ! volume_matrix_to_object.isApprox(Transform3d::Identity(), 1e-10); + break; } } - Transform3d inv_matrix = transform.get_matrix().inverse(); // splits volume out of imported geometry TriangleMesh triangle_mesh; @@ -1684,11 +1880,7 @@ namespace Slic3r { for (unsigned int v = 0; v < 3; ++v) { unsigned int tri_id = geometry.triangles[src_start_id + ii + v] * 3; - Vec3f vertex(geometry.vertices[tri_id + 0], geometry.vertices[tri_id + 1], geometry.vertices[tri_id + 2]); - if (m_version > 1) - // revert the vertices to the original mesh reference system - vertex = (inv_matrix * vertex.cast()).cast(); - ::memcpy(facet.vertex[v].data(), (const void*)vertex.data(), 3 * sizeof(float)); + facet.vertex[v] = Vec3f(geometry.vertices[tri_id + 0], geometry.vertices[tri_id + 1], geometry.vertices[tri_id + 2]); } } @@ -1696,11 +1888,23 @@ namespace Slic3r { triangle_mesh.repair(); ModelVolume* volume = object.add_volume(std::move(triangle_mesh)); - // apply the volume matrix taken from the metadata, if present - if (m_version > 1) - volume->set_transformation(transform); + // stores the volume matrix taken from the metadata, if present + if (has_transform) + 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; isupported_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) { @@ -1811,54 +2015,37 @@ namespace Slic3r { typedef std::vector BuildItemsList; typedef std::map IdToObjectDataMap; + bool m_fullpath_sources{ true }; + public: -#if ENABLE_THUMBNAIL_GENERATOR - bool save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, const ThumbnailData* thumbnail_data = nullptr); -#else - bool save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config); -#endif // 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); 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); bool _add_layer_height_profile_file_to_archive(mz_zip_archive& archive, Model& model); bool _add_layer_config_ranges_file_to_archive(mz_zip_archive& archive, Model& model); bool _add_sla_support_points_file_to_archive(mz_zip_archive& archive, Model& model); + 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, const DynamicPrintConfig* config); }; -#if ENABLE_THUMBNAIL_GENERATOR - bool _3MF_Exporter::save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, const ThumbnailData* thumbnail_data) + 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) - { - 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); @@ -1877,7 +2064,6 @@ namespace Slic3r { return false; } -#if ENABLE_THUMBNAIL_GENERATOR if ((thumbnail_data != nullptr) && thumbnail_data->is_valid()) { // Adds the file Metadata/thumbnail.png. @@ -1888,7 +2074,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. @@ -1903,7 +2088,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); @@ -1939,6 +2124,23 @@ namespace Slic3r { boost::filesystem::remove(filename); return false; } + + if (!_add_sla_drain_holes_file_to_archive(archive, model)) + { + close_zip_writer(&archive); + boost::filesystem::remove(filename); + return false; + } + + + // Adds custom gcode per height file ("Metadata/Prusa_Slicer_custom_gcode_per_print_z.xml"). + // All custom gcode per height of whole Model are stored here + if (!_add_custom_gcode_per_print_z_file_to_archive(archive, model, config)) + { + close_zip_writer(&archive); + boost::filesystem::remove(filename); + return false; + } // Adds slic3r print config file ("Metadata/Slic3r_PE.config"). // This file contains the content of FullPrintConfing / SLAFullPrintConfig. @@ -1983,9 +2185,7 @@ namespace Slic3r { stream << "\n"; stream << " \n"; stream << " \n"; -#if ENABLE_THUMBNAIL_GENERATOR stream << " \n"; -#endif // ENABLE_THUMBNAIL_GENERATOR stream << ""; std::string out = stream.str(); @@ -1999,7 +2199,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; @@ -2017,7 +2216,6 @@ namespace Slic3r { return res; } -#endif // ENABLE_THUMBNAIL_GENERATOR bool _3MF_Exporter::_add_relationships_file_to_archive(mz_zip_archive& archive) { @@ -2025,9 +2223,7 @@ namespace Slic3r { stream << "\n"; stream << "\n"; stream << " \n"; -#if ENABLE_THUMBNAIL_GENERATOR stream << " \n"; -#endif // ENABLE_THUMBNAIL_GENERATOR stream << ""; std::string out = stream.str(); @@ -2041,7 +2237,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 @@ -2052,6 +2248,19 @@ namespace Slic3r { stream << "\n"; stream << "<" << MODEL_TAG << " unit=\"millimeter\" xml:lang=\"en-US\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\" xmlns:slic3rpe=\"http://schemas.slic3r.org/3mf/2017/06\">\n"; stream << " <" << METADATA_TAG << " name=\"" << SLIC3RPE_3MF_VERSION << "\">" << VERSION_3MF << "\n"; + std::string name = boost::filesystem::path(filename).stem().string(); + stream << " <" << METADATA_TAG << " name=\"Title\">" << name << "\n"; + stream << " <" << METADATA_TAG << " name=\"Designer\">" << "\n"; + stream << " <" << METADATA_TAG << " name=\"Description\">" << name << "\n"; + stream << " <" << METADATA_TAG << " name=\"Copyright\">" << "\n"; + stream << " <" << METADATA_TAG << " name=\"LicenseTerms\">" << "\n"; + stream << " <" << METADATA_TAG << " name=\"Rating\">" << "\n"; + std::string date = Slic3r::Utils::utc_timestamp(Slic3r::Utils::get_current_time_utc()); + // keep only the date part of the string + date = date.substr(0, 10); + stream << " <" << METADATA_TAG << " name=\"CreationDate\">" << date << "\n"; + stream << " <" << METADATA_TAG << " name=\"ModificationDate\">" << date << "\n"; + stream << " <" << METADATA_TAG << " name=\"Application\">" << SLIC3R_APP_KEY << "-" << SLIC3R_VERSION << "\n"; stream << " <" << RESOURCES_TAG << ">\n"; // Instance transformations, indexed by the 3MF object ID (which is a linear serialization of all instances of all ModelObjects). @@ -2154,9 +2363,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; @@ -2200,13 +2409,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"; } } @@ -2256,7 +2474,7 @@ namespace Slic3r { for (const ModelObject* object : model.objects) { ++count; - const std::vector &layer_height_profile = object->layer_height_profile; + const std::vector& 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); @@ -2311,7 +2529,7 @@ namespace Slic3r { range_tree.put(".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)); @@ -2324,7 +2542,7 @@ namespace Slic3r { if (!tree.empty()) { std::ostringstream oss; - boost::property_tree::write_xml(oss, tree); + pt::write_xml(oss, tree); out = oss.str(); // Post processing("beautification") of the output string for a better preview @@ -2387,6 +2605,61 @@ namespace Slic3r { } return true; } + + bool _3MF_Exporter::_add_sla_drain_holes_file_to_archive(mz_zip_archive& archive, Model& model) + { + const char *const fmt = "object_id=%d|"; + std::string out; + + unsigned int count = 0; + for (const ModelObject* object : model.objects) + { + ++count; + 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); + + // Store the layer height profile as a single space separated list. + for (size_t i = 0; i < drain_holes.size(); ++i) + out += string_printf((i == 0 ? "%f %f %f %f %f %f %f %f" : " %f %f %f %f %f %f %f %f"), + drain_holes[i].pos(0), + drain_holes[i].pos(1), + drain_holes[i].pos(2), + drain_holes[i].normal(0), + drain_holes[i].normal(1), + drain_holes[i].normal(2), + drain_holes[i].radius, + drain_holes[i].height); + + out += "\n"; + } + } + + if (!out.empty()) + { + // Adds version header at the beginning: + out = std::string("drain_holes_format_version=") + std::to_string(drain_holes_format_version) + std::string("\n") + out; + + if (!mz_zip_writer_add_mem(&archive, SLA_DRAIN_HOLES_FILE.c_str(), static_cast(out.data()), out.length(), mz_uint(MZ_DEFAULT_COMPRESSION))) + { + add_error("Unable to add sla support points file to archive"); + return false; + } + } + return true; + } bool _3MF_Exporter::_add_print_config_file_to_archive(mz_zip_archive& archive, const DynamicPrintConfig &config) { @@ -2413,6 +2686,9 @@ namespace Slic3r { bool _3MF_Exporter::_add_model_config_file_to_archive(mz_zip_archive& archive, const Model& model, const IdToObjectDataMap &objects_data) { std::stringstream stream; + // Store mesh transformation in full precision, as the volumes are stored transformed and they need to be transformed back + // when loaded as accurately as possible. + stream << std::setprecision(std::numeric_limits::max_digits10); stream << "\n"; stream << "<" << CONFIG_TAG << ">\n"; @@ -2421,7 +2697,8 @@ namespace Slic3r { const ModelObject* obj = obj_metadata.second.object; if (obj != nullptr) { - stream << " <" << OBJECT_TAG << " id=\"" << obj_metadata.first << "\">\n"; + // Output of instances count added because of github #3435, currently not used by PrusaSlicer + stream << " <" << OBJECT_TAG << " " << ID_ATTR << "=\"" << obj_metadata.first << "\" " << INSTANCESCOUNT_ATTR << "=\"" << obj->instances.size() << "\">\n"; // stores object's name if (!obj->name.empty()) @@ -2459,7 +2736,7 @@ namespace Slic3r { // stores volume's local matrix stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << MATRIX_KEY << "\" " << VALUE_ATTR << "=\""; - const Transform3d& matrix = volume->get_matrix(); + Transform3d matrix = volume->get_matrix() * volume->source.transform.get_matrix(); for (int r = 0; r < 4; ++r) { for (int c = 0; c < 4; ++c) @@ -2474,7 +2751,8 @@ namespace Slic3r { // stores volume's source data if (!volume->source.input_file.empty()) { - stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << SOURCE_FILE_KEY << "\" " << VALUE_ATTR << "=\"" << xml_escape(volume->source.input_file) << "\"/>\n"; + 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"; @@ -2510,7 +2788,64 @@ namespace Slic3r { return true; } - bool load_3mf(const char* path, DynamicPrintConfig* config, Model* model, bool check_version) +bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archive& archive, Model& model, const DynamicPrintConfig* config) +{ + std::string out = ""; + + if (!model.custom_gcode_per_print_z.gcodes.empty()) + { + pt::ptree tree; + pt::ptree& main_tree = tree.add("custom_gcodes_per_print_z", ""); + + for (const CustomGCode::Item& code : model.custom_gcode_per_print_z.gcodes) + { + pt::ptree& code_tree = main_tree.add("code", ""); + + // store data of custom_gcode_per_print_z + code_tree.put(".print_z" , code.print_z ); + code_tree.put(".type" , static_cast(code.type)); + code_tree.put(".extruder" , code.extruder ); + code_tree.put(".color" , code.color ); + code_tree.put(".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(".gcode" , gcode ); + } + + pt::ptree& mode_tree = main_tree.add("mode", ""); + // store mode of a custom_gcode_per_print_z + mode_tree.put(".value", model.custom_gcode_per_print_z.mode == CustomGCode::Mode::SingleExtruder ? CustomGCode::SingleExtruderMode : + model.custom_gcode_per_print_z.mode == CustomGCode::Mode::MultiAsSingle ? CustomGCode::MultiAsSingleMode : + CustomGCode::MultiExtruderMode); + + if (!tree.empty()) + { + std::ostringstream oss; + boost::property_tree::write_xml(oss, tree); + out = oss.str(); + + // Post processing("beautification") of the output string + boost::replace_all(out, "><", ">\n<"); + } + } + + if (!out.empty()) + { + if (!mz_zip_writer_add_mem(&archive, CUSTOM_GCODE_PER_PRINT_Z_FILE.c_str(), (const void*)out.data(), out.length(), MZ_DEFAULT_COMPRESSION)) + { + add_error("Unable to add custom Gcodes per print_z file to archive"); + return false; + } + } + + return true; +} + +bool load_3mf(const char* path, DynamicPrintConfig* config, Model* model, bool check_version) { if ((path == nullptr) || (config == nullptr) || (model == nullptr)) return false; @@ -2521,22 +2856,13 @@ namespace Slic3r { return res; } -#if ENABLE_THUMBNAIL_GENERATOR - bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, const ThumbnailData* thumbnail_data) -#else - bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config) -#endif // ENABLE_THUMBNAIL_GENERATOR +bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data) { if ((path == nullptr) || (model == nullptr)) return false; _3MF_Exporter exporter; -#if ENABLE_THUMBNAIL_GENERATOR - bool res = exporter.save_model_to_file(path, *model, config, thumbnail_data); -#else - bool res = exporter.save_model_to_file(path, *model, config); -#endif // ENABLE_THUMBNAIL_GENERATOR - + bool res = exporter.save_model_to_file(path, *model, config, fullpath_sources, thumbnail_data); if (!res) exporter.log_errors(); diff --git a/src/libslic3r/Format/3mf.hpp b/src/libslic3r/Format/3mf.hpp index 2e85b7f59e..ccfd9356d8 100644 --- a/src/libslic3r/Format/3mf.hpp +++ b/src/libslic3r/Format/3mf.hpp @@ -19,24 +19,22 @@ namespace Slic3r { enum { support_points_format_version = 1 }; + + enum { + drain_holes_format_version = 1 + }; 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, const ThumbnailData* thumbnail_data = nullptr); -#else - extern bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config); -#endif // ENABLE_THUMBNAIL_GENERATOR + extern bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data = nullptr); -}; // namespace Slic3r +} // namespace Slic3r #endif /* slic3r_Format_3mf_hpp_ */ diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp index 181d6cb993..a2117d63bf 100644 --- a/src/libslic3r/Format/AMF.cpp +++ b/src/libslic3r/Format/AMF.cpp @@ -7,15 +7,21 @@ #include #include "../libslic3r.h" +#include "../Exception.hpp" #include "../Model.hpp" #include "../GCode.hpp" #include "../PrintConfig.hpp" #include "../Utils.hpp" #include "../I18N.hpp" #include "../Geometry.hpp" +#include "../CustomGCode.hpp" #include "AMF.hpp" +#include +#include +namespace pt = boost::property_tree; + #include #include #include @@ -37,8 +43,11 @@ // Added x and y components of rotation // Added x, y and z components of scale // Added x, y and z components of mirror -// 3 : Meshes saved in their local system; Added volumes' matrices and source data -const unsigned int VERSION_AMF = 3; +// 3 : Added volumes' matrices and source data, meshes transformed back to their coordinate system on loading. +// WARNING !! -> the version number has been rolled back to 2 +// the next change should use 4 +const unsigned int VERSION_AMF = 2; +const unsigned int VERSION_AMF_COMPATIBLE = 3; const char* SLIC3RPE_AMF_VERSION = "slic3rpe_amf_version"; const char* SLIC3R_CONFIG_TYPE = "slic3rpe_config"; @@ -147,6 +156,9 @@ struct AMFParserContext NODE_TYPE_MIRRORY, // amf/constellation/instance/mirrory NODE_TYPE_MIRRORZ, // amf/constellation/instance/mirrorz NODE_TYPE_PRINTABLE, // amf/constellation/instance/mirrorz + NODE_TYPE_CUSTOM_GCODE, // amf/custom_code_per_height + NODE_TYPE_GCODE_PER_HEIGHT, // amf/custom_code_per_height/code + NODE_TYPE_CUSTOM_GCODE_MODE, // amf/custom_code_per_height/mode NODE_TYPE_METADATA, // anywhere under amf/*/metadata }; @@ -222,12 +234,14 @@ struct AMFParserContext ModelVolume *m_volume; // Faces collected for the current m_volume. std::vector m_volume_facets; + // Transformation matrix of a volume mesh from its coordinate system to Object's coordinate system. + Transform3d m_volume_transform; // Current material allocated for an amf/metadata subtree. ModelMaterial *m_material; // 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[3]; + std::string m_value[5]; // Pointer to config to update if config data are stored inside the amf file DynamicPrintConfig *m_config; @@ -268,6 +282,8 @@ void AMFParserContext::startElement(const char *name, const char **atts) } } else if (strcmp(name, "constellation") == 0) { node_type_new = NODE_TYPE_CONSTELLATION; + } else if (strcmp(name, "custom_gcodes_per_height") == 0) { + node_type_new = NODE_TYPE_CUSTOM_GCODE; } break; case 2: @@ -294,6 +310,36 @@ void AMFParserContext::startElement(const char *name, const char **atts) } else this->stop(); + } + else if (m_path[1] == NODE_TYPE_CUSTOM_GCODE) { + 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, "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(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; + m_value[0] = get_attribute(atts, "value"); + } } break; case 3: @@ -304,6 +350,7 @@ void AMFParserContext::startElement(const char *name, const char **atts) else if (strcmp(name, "volume") == 0) { assert(! m_volume); m_volume = m_object->add_volume(TriangleMesh()); + m_volume_transform = Transform3d::Identity(); node_type_new = NODE_TYPE_VOLUME; } } else if (m_path[2] == NODE_TYPE_INSTANCE) { @@ -563,27 +610,21 @@ void AMFParserContext::endElement(const char * /* name */) stl.stats.original_num_facets = stl.stats.number_of_facets; stl_allocate(&stl); - Slic3r::Geometry::Transformation transform; - if (m_version > 2) - transform = m_volume->get_transformation(); - - Transform3d inv_matrix = transform.get_matrix().inverse(); - + bool has_transform = ! m_volume_transform.isApprox(Transform3d::Identity(), 1e-10); for (size_t i = 0; i < m_volume_facets.size();) { stl_facet &facet = stl.facet_start[i/3]; for (unsigned int v = 0; v < 3; ++v) { unsigned int tri_id = m_volume_facets[i++] * 3; - Vec3f vertex(m_object_vertices[tri_id + 0], m_object_vertices[tri_id + 1], m_object_vertices[tri_id + 2]); - if (m_version > 2) - // revert the vertices to the original mesh reference system - vertex = (inv_matrix * vertex.cast()).cast(); - ::memcpy((void*)facet.vertex[v].data(), (const void*)vertex.data(), 3 * sizeof(float)); + facet.vertex[v] = Vec3f(m_object_vertices[tri_id + 0], m_object_vertices[tri_id + 1], m_object_vertices[tri_id + 2]); } - } + } stl_get_size(&stl); mesh.repair(); m_volume->set_mesh(std::move(mesh)); + // stores the volume matrix taken from the metadata, if present + if (has_transform) + m_volume->source.transform = Slic3r::Geometry::Transformation(m_volume_transform); if (m_volume->source.input_file.empty() && (m_volume->type() == ModelVolumeType::MODEL_PART)) { m_volume->source.object_idx = (int)m_model.objects.size() - 1; @@ -616,13 +657,38 @@ void AMFParserContext::endElement(const char * /* name */) m_instance = nullptr; break; + case NODE_TYPE_GCODE_PER_HEIGHT: { + 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(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, type, extruder, color, extra}); + + for (std::string& val: m_value) + val.clear(); + break; + } + + case NODE_TYPE_CUSTOM_GCODE_MODE: { + const std::string& mode = m_value[0]; + + m_model.custom_gcode_per_print_z.mode = mode == CustomGCode::SingleExtruderMode ? CustomGCode::Mode::SingleExtruder : + mode == CustomGCode::MultiAsSingleMode ? CustomGCode::Mode::MultiAsSingle : + CustomGCode::Mode::MultiExtruder; + for (std::string& val: m_value) + val.clear(); + break; + } + case NODE_TYPE_METADATA: if ((m_config != nullptr) && strncmp(m_value[0].c_str(), SLIC3R_CONFIG_TYPE, strlen(SLIC3R_CONFIG_TYPE)) == 0) m_config->load_from_gcode_string(m_value[1].c_str()); 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; @@ -639,22 +705,24 @@ void AMFParserContext::endElement(const char * /* name */) config->set_deserialize(opt_key, m_value[1]); } 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 = const_cast(m_value[1].c_str()); + char *p = m_value[1].data(); + std::vector 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. unsigned char coord_idx = 0; Eigen::Matrix point(Eigen::Matrix::Zero()); - char *p = const_cast(m_value[1].c_str()); + char *p = m_value[1].data(); for (;;) { char *end = strchr(p, ';'); if (end != nullptr) @@ -674,7 +742,7 @@ void AMFParserContext::endElement(const char * /* name */) else if (m_path.size() == 5 && m_path[1] == NODE_TYPE_OBJECT && m_path[3] == NODE_TYPE_RANGE && m_object && strcmp(opt_key, "layer_height_range") == 0) { // Parse object's layer_height_range, a semicolon separated doubles. - char* p = const_cast(m_value[1].c_str()); + char* p = m_value[1].data(); char* end = strchr(p, ';'); *end = 0; @@ -690,9 +758,7 @@ void AMFParserContext::endElement(const char * /* name */) m_volume->set_type(ModelVolume::type_from_string(m_value[1])); } else if (strcmp(opt_key, "matrix") == 0) { - Geometry::Transformation transform; - transform.set_from_string(m_value[1]); - m_volume->set_transformation(transform); + m_volume_transform = Slic3r::Geometry::transform3d_from_string(m_value[1]); } else if (strcmp(opt_key, "source_file") == 0) { m_volume->source.input_file = m_value[1]; @@ -860,7 +926,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; @@ -882,10 +948,12 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi ctx.endDocument(); - if (check_version && (ctx.m_version > VERSION_AMF)) + 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()); + // 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 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 Slic3r::FileIOError(msg); } return true; @@ -929,7 +997,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; @@ -966,7 +1034,7 @@ bool load_amf(const char* path, DynamicPrintConfig* config, Model* model, bool c return false; std::string zip_mask(2, '\0'); - file.read(const_cast(zip_mask.data()), 2); + file.read(zip_mask.data(), 2); file.close(); return (zip_mask == "PK") ? load_amf_archive(path, config, model, check_version) : load_amf_file(path, config, model); @@ -975,7 +1043,7 @@ bool load_amf(const char* path, DynamicPrintConfig* config, Model* model, bool c return false; } -bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) +bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources) { if ((path == nullptr) || (model == nullptr)) return false; @@ -1029,7 +1097,7 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) stream << " " << object->config.opt_serialize(key) << "\n"; if (!object->name.empty()) stream << " " << xml_escape(object->name) << "\n"; - const std::vector &layer_height_profile = object->layer_height_profile; + const std::vector &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 << " "; @@ -1046,7 +1114,7 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) // Store the layer config range as a single semicolon separated list. stream << " \n"; size_t layer_counter = 0; - for (auto range : config_ranges) { + for (const auto &range : config_ranges) { stream << " \n"; stream << " "; @@ -1082,9 +1150,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) { @@ -1115,7 +1183,8 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) stream << " 1\n"; stream << " " << ModelVolume::type_to_string(volume->type()) << "\n"; stream << " "; - const Transform3d& matrix = volume->get_matrix(); + const Transform3d& matrix = volume->get_matrix() * volume->source.transform.get_matrix(); + stream << std::setprecision(std::numeric_limits::max_digits10); for (int r = 0; r < 4; ++r) { for (int c = 0; c < 4; ++c) @@ -1128,13 +1197,15 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) stream << "\n"; if (!volume->source.input_file.empty()) { - stream << " " << xml_escape(volume->source.input_file) << "\n"; + std::string input_file = xml_escape(fullpath_sources ? volume->source.input_file : boost::filesystem::path(volume->source.input_file).filename().string()); + stream << " " << input_file << "\n"; stream << " " << volume->source.object_idx << "\n"; stream << " " << volume->source.volume_idx << "\n"; stream << " " << volume->source.mesh_offset(0) << "\n"; stream << " " << volume->source.mesh_offset(1) << "\n"; stream << " " << volume->source.mesh_offset(2) << "\n"; } + stream << std::setprecision(std::numeric_limits::max_digits10); const indexed_triangle_set &its = volume->mesh().its; for (size_t i = 0; i < its.indices.size(); ++i) { stream << " \n"; @@ -1150,7 +1221,7 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) for (ModelInstance *instance : object->instances) { char buf[512]; sprintf(buf, - " \n" + " \n" " %lf\n" " %lf\n" " %lf\n" @@ -1190,6 +1261,58 @@ bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config) stream << instances; stream << " \n"; } + + if (!model->custom_gcode_per_print_z.gcodes.empty()) + { + std::string out = ""; + pt::ptree tree; + + pt::ptree& main_tree = tree.add("custom_gcodes_per_height", ""); + + for (const CustomGCode::Item& code : model->custom_gcode_per_print_z.gcodes) + { + pt::ptree& code_tree = main_tree.add("code", ""); + // store custom_gcode_per_print_z gcodes information + code_tree.put(".print_z" , code.print_z ); + code_tree.put(".type" , static_cast(code.type)); + code_tree.put(".extruder" , code.extruder ); + code_tree.put(".color" , code.color ); + code_tree.put(".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(".gcode" , gcode ); + } + + pt::ptree& mode_tree = main_tree.add("mode", ""); + // store mode of a custom_gcode_per_print_z + mode_tree.put(".value", + model->custom_gcode_per_print_z.mode == CustomGCode::Mode::SingleExtruder ? CustomGCode::SingleExtruderMode : + model->custom_gcode_per_print_z.mode == CustomGCode::Mode::MultiAsSingle ? + CustomGCode::MultiAsSingleMode : CustomGCode::MultiExtruderMode); + + if (!tree.empty()) + { + std::ostringstream oss; + pt::write_xml(oss, tree); + out = oss.str(); + + size_t del_header_pos = out.find("\n \n <", ">\n<"); + + stream << out << "\n"; + } + } + stream << "\n"; std::string internal_amf_filename = boost::ireplace_last_copy(boost::filesystem::path(export_path).filename().string(), ".zip.amf", ".amf"); diff --git a/src/libslic3r/Format/AMF.hpp b/src/libslic3r/Format/AMF.hpp index 1206d60d07..3e33d4aa37 100644 --- a/src/libslic3r/Format/AMF.hpp +++ b/src/libslic3r/Format/AMF.hpp @@ -11,7 +11,7 @@ extern bool load_amf(const char* path, DynamicPrintConfig* config, Model* model, // Save the given model and the config data into an amf file. // The model could be modified during the export process if meshes are not repaired or have no shared vertices -extern bool store_amf(const char *path, Model *model, const DynamicPrintConfig *config); +extern bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources); }; // namespace Slic3r diff --git a/src/libslic3r/Format/PRUS.cpp b/src/libslic3r/Format/PRUS.cpp index d6f87197df..e2c38d9576 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 scene_xml_data; // For grouping multiple STLs into a single ModelObject for multi-material prints. std::map 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 0000000000..c4a9f5864f --- /dev/null +++ b/src/libslic3r/Format/SL1.cpp @@ -0,0 +1,481 @@ +#include "SL1.hpp" +#include "GCode/ThumbnailData.hpp" +#include "libslic3r/Time.hpp" + +#include +#include + +#include "libslic3r/Zipper.hpp" +#include "libslic3r/SLAPrint.hpp" + +#include + +#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/PNGRead.hpp" + +#include +#include +#include + +namespace marchsq { + +template<> struct _RasterTraits { + 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 buf; std::string fname; }; +struct ArchiveData { + boost::property_tree::ptree profile, config; + std::vector 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 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()(r1.fname, r2.fname); + }); + + arch.images.insert(it, read_png(entry, zip, name)); + } + } + } + + return arch; +} + +ExPolygons rings_to_expolygons(const std::vector &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 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("display_pixels_x"); + auto *opt_disp_rows = cfg.option("display_pixels_y"); + auto *opt_disp_w = cfg.option("display_width"); + auto *opt_disp_h = cfg.option("display_height"); + auto *opt_mirror_x = cfg.option("display_mirror_x"); + auto *opt_mirror_y = cfg.option("display_mirror_y"); + auto *opt_orient = cfg.option>("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("layer_height"); + auto *opt_init_layerh = cfg.option("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 extract_slices_from_sla_archive( + ArchiveData & arch, + const RasterParams & rstp, + std::function progr) +{ + auto jobdir = arch.config.get("jobDir"); + for (auto &c : jobdir) c = std::tolower(c); + + std::vector 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 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 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 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; + +namespace { + +std::string to_ini(const ConfMap &m) +{ + std::string ret; + for (auto ¶m : 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 SL1Archive::create_raster() const +{ + sla::RasterBase::Resolution res; + sla::RasterBase::PixelDim pxdim; + std::array 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 0000000000..ab731ff841 --- /dev/null +++ b/src/libslic3r/Format/SL1.hpp @@ -0,0 +1,62 @@ +#ifndef ARCHIVETRAITS_HPP +#define ARCHIVETRAITS_HPP + +#include + +#include "libslic3r/Zipper.hpp" +#include "libslic3r/SLAPrint.hpp" + +namespace Slic3r { + +class SL1Archive: public SLAPrinter { + SLAPrinterConfig m_cfg; + +protected: + uqptr 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 progr = [](int) { return true; }); + +inline void import_sla_archive( + const std::string & zipfname, + Vec2i windowsize, + TriangleMesh & out, + std::function 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 c805667f81..8c1a53459d 100644 --- a/src/libslic3r/Format/objparser.cpp +++ b/src/libslic3r/Format/objparser.cpp @@ -355,6 +355,35 @@ bool objparse(const char *path, ObjData &data) return true; } +bool objparse(std::istream &stream, ObjData &data) +{ + try { + char buf[65536 * 2]; + size_t len = 0; + size_t lenPrev = 0; + while ((len = size_t(stream.read(buf + lenPrev, 65536).gcount())) != 0) { + len += lenPrev; + size_t lastLine = 0; + for (size_t i = 0; i < len; ++ i) + if (buf[i] == '\r' || buf[i] == '\n') { + buf[i] = 0; + char *c = buf + lastLine; + while (*c == ' ' || *c == '\t') + ++ c; + obj_parseline(c, data); + lastLine = i + 1; + } + lenPrev = len - lastLine; + memmove(buf, buf + lastLine, lenPrev); + } + } + catch (std::bad_alloc&) { + printf("Out of memory\r\n"); + } + + return true; +} + template bool savevector(FILE *pFile, const std::vector &v) { @@ -420,7 +449,7 @@ bool loadvector(FILE *pFile, std::vector &v) if (::fread(&len, sizeof(len), 1, pFile) != 1) return false; std::string s(" ", len); - if (::fread(const_cast(s.c_str()), 1, len, pFile) != len) + if (::fread(s.data(), 1, len, pFile) != len) return false; v.push_back(std::move(s)); } @@ -442,7 +471,7 @@ bool loadvectornameidx(FILE *pFile, std::vector &v) if (::fread(&len, sizeof(len), 1, pFile) != 1) return false; v[i].name.assign(" ", len); - if (::fread(const_cast(v[i].name.c_str()), 1, len, pFile) != len) + if (::fread(v[i].name.data(), 1, len, pFile) != len) return false; } return true; diff --git a/src/libslic3r/Format/objparser.hpp b/src/libslic3r/Format/objparser.hpp index 5fc25e297b..5f3f010e4a 100644 --- a/src/libslic3r/Format/objparser.hpp +++ b/src/libslic3r/Format/objparser.hpp @@ -3,6 +3,7 @@ #include #include +#include namespace ObjParser { @@ -97,6 +98,7 @@ struct ObjData { }; extern bool objparse(const char *path, ObjData &data); +extern bool objparse(std::istream &stream, ObjData &data); extern bool objbinsave(const char *path, const ObjData &data); diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 56a94b28c2..61ef9a1bd5 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1,29 +1,28 @@ #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" -#if ENABLE_THUMBNAIL_GENERATOR -#include "GCode/ThumbnailData.hpp" -#endif // ENABLE_THUMBNAIL_GENERATOR #include "ShortestPath.hpp" +#include "Print.hpp" #include "Utils.hpp" +#include "libslic3r.h" #include #include #include +#include #include #include #include #include #include -#if ENABLE_THUMBNAIL_GENERATOR #include -#endif // ENABLE_THUMBNAIL_GENERATOR #include #include @@ -35,9 +34,9 @@ #include -#if ENABLE_THUMBNAIL_GENERATOR_PNG_TO_GCODE #include "miniz_extension.hpp" -#endif // ENABLE_THUMBNAIL_GENERATOR_PNG_TO_GCODE + +using namespace std::literals::string_view_literals; #if 0 // Enable debugging and asserts, even in the release build. @@ -50,311 +49,316 @@ 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'; -} - - -// 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: ; + static inline void check_add_eol(std::string& gcode) + { + if (!gcode.empty() && gcode.back() != '\n') + gcode += '\n'; } - return ok; -} -void AvoidCrossingPerimeters::init_external_mp(const Print &print) -{ - m_external_mp = Slic3r::make_unique(union_ex(this->collect_contours_all_layers(print.objects()))); -} -// 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; -} - -// 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_per_layer((object->layers().size() + 1) / 2); - tbb::parallel_for(tbb::blocked_range(0, object->layers().size() / 2), - [&object, &polygons_per_layer](const tbb::blocked_range &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->slices.size() + layer2->slices.size()); - for (const ExPolygon &expoly : layer1->slices) - //FIXME no holes? - polys.emplace_back(expoly.contour); - for (const ExPolygon &expoly : layer2->slices) - //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->slices.size()); - for (const ExPolygon &expoly : layer->slices) - //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(0, cnt / 2), - [&polygons_per_layer](const tbb::blocked_range &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 Point © : object->copies()) { - // 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(copy); - } - } - 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 - (this->_get_temp(gcodegen) + gcodegen.config().standby_temperature_delta.value, false); - } - - 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) : - 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()); -} - -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" - ); + // 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; } - gcodegen.set_last_pos(wipe_path.points.back()); + { + // 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:; } - - // prevent wiping again on same path - this->reset_path(); - } - - 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))); -} - -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 gcode; - - // Toolchangeresult.gcode assumes the wipe tower corner is at the origin - // 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; + return ok; } - 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(); + void AvoidCrossingPerimeters::init_external_mp(const Print& print) + { + m_external_mp = Slic3r::make_unique(union_ex(this->collect_contours_all_layers(print.objects()))); } - 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(); + // 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; } - - // 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); + // 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_per_layer((object->layers().size() + 1) / 2); + tbb::parallel_for(tbb::blocked_range(0, object->layers().size() / 2), + [&object, &polygons_per_layer](const tbb::blocked_range& 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(0, cnt / 2), + [&polygons_per_layer](const tbb::blocked_range& 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 = 1; i < cnt / 2; ++i) + polygons_per_layer[i] = std::move(polygons_per_layer[i * 2]); + if (cnt & 1) + polygons_per_layer[cnt / 2] = std::move(polygons_per_layer[cnt - 1]); + 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); + } } + return islands; } - // 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*/) { + + 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 + (this->_get_temp(gcodegen) + gcodegen.config().standby_temperature_delta.value, false, gcodegen.writer().extruder()->id()); + } + + 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(); + } + + 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" + ); + } + gcodegen.set_last_pos(wipe_path.points.back()); + } + + // prevent wiping again on same path + this->reset_path(); + } + + 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))); + } + + 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; + + // 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 = 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); + } + } + + // 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()) { + 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)); toolchange_gcode_str = gcodegen.placeholder_parser_process("toolchange_gcode", toolchange_gcode, new_extruder_id, &config); check_add_eol(toolchange_gcode_str); } @@ -362,291 +366,277 @@ 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. + // 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("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); - } + 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()); - 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()))); - } - } - - // Let the planner know we are traveling between objects. - gcodegen.m_avoid_crossing_perimeters.use_external_mp_once = true; - 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(); - - 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 - if (line.find("G1 ") == 0) { - 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') - line_str >> pos.x(); - else - if (ch == 'Y') - line_str >> pos.y(); - else - line_out << ch; - } - - transformed_pos = pos; - transformed_pos = Eigen::Rotation2Df(angle) * transformed_pos; - transformed_pos += translation; - - if (transformed_pos != old_pos) { - line = line_out.str(); - std::ostringstream oss; - oss << std::fixed << std::setprecision(3) << "G1 "; - if (transformed_pos.x() != old_pos.x()) - oss << " X" << transformed_pos.x() - extruder_offset.x(); - if (transformed_pos.y() != old_pos.y()) - oss << " Y" << transformed_pos.y() - extruder_offset.y(); - - line.replace(line.find("G1 "), 3, oss.str()); - old_pos = transformed_pos; - } - } - - 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(); - - // If the extruder offset changed, add an extra move so everything is continuous - if (extruder_offset != m_extruder_offsets[tcr.initial_tool].cast()) { - 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; -} - - -std::string WipeTowerIntegration::prime(GCode &gcodegen) -{ - assert(m_layer_idx == 0); - std::string gcode; - - if (&m_priming != nullptr) { - // 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); - - } // 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)));*/ + gcodegen.writer().travel_to_xy(end_pos.cast()); + 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.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; } - 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 std::runtime_error("Wipe tower generation failed, possibly due to empty first layer."); + // 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(); + 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); - // 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; + 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; + } } - 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; -} + gcode_out += line + "\n"; -// 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; -} + // 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(); + + // If the extruder offset changed, add an extra move so everything is continuous + if (extruder_offset != m_extruder_offsets[tcr.initial_tool].cast()) { + 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; + } + + + std::string WipeTowerIntegration::prime(GCode& gcodegen) + { + assert(m_layer_idx == 0); + std::string gcode; + + for (const WipeTower::ToolChangeResult& tcr : m_priming) { + if (! tcr.extrusions.empty()) + gcode += append_tcr(gcodegen, tcr, tcr.new_tool); + } + + 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; + } + + 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; + } + + // 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 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::collect_layers_to_print(const PrintObject &object) +std::vector GCode::collect_layers_to_print(const PrintObject& object) { std::vector 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) - - if (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" + - _(L("Object name: ")) + object.model_object()->name + "\n" + _(L("Print z: ")) + + if (has_extrusions && layer_to_print.print_z() > maximal_print_z + 2. * EPSILON) { + const_cast(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 items. -std::vector>> GCode::collect_layers_to_print(const Print &print) +std::vector>> GCode::collect_layers_to_print(const Print& print) { struct OrderingItem { coordf_t print_z; @@ -661,30 +651,31 @@ std::vector>> 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 <p : 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 = <p - &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>> 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> 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]); } @@ -694,11 +685,18 @@ std::vector>> GCode::collec return layers_to_print; } -#if ENABLE_THUMBNAIL_GENERATOR -void GCode::do_export(Print* print, const char* path, GCodePreviewData* preview_data, const std::vector* thumbnail_data) -#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(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(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(); @@ -718,22 +716,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_data); -#else - this->_do_export(*print, file); -#endif // ENABLE_THUMBNAIL_GENERATOR + this->_do_export(*print, file, thumbnail_cb); 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. @@ -754,145 +746,269 @@ void GCode::do_export(Print *print, const char *path, GCodePreviewData *preview_ 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); + throw Slic3r::RuntimeError(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(); PROFILE_OUTPUT(debug_out_path("gcode-export-profile.txt").c_str()); } -#if ENABLE_THUMBNAIL_GENERATOR -void GCode::_do_export(Print& print, FILE* file, const std::vector* thumbnail_data) -#else -void GCode::_do_export(Print &print, FILE *file) -#endif // ENABLE_THUMBNAIL_GENERATOR +// free functions called by GCode::_do_export() +namespace DoExport { + 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) + { + // get the minimum cross-section used in the print + std::vector mm3_per_mm; + for (auto object : print.objects()) { + for (size_t region_id = 0; region_id < object->region_volumes.size(); ++ region_id) { + const PrintRegion* region = print.regions()[region_id]; + for (auto layer : object->layers()) { + const LayerRegion* layerm = layer->regions()[region_id]; + if (region->config().get_abs_value("perimeter_speed") == 0 || + region->config().get_abs_value("small_perimeter_speed") == 0 || + region->config().get_abs_value("external_perimeter_speed") == 0 || + region->config().get_abs_value("bridge_speed") == 0) + mm3_per_mm.push_back(layerm->perimeters.min_mm3_per_mm()); + 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()); + } + } + if (object->config().get_abs_value("support_material_speed") == 0 || + object->config().get_abs_value("support_material_interface_speed") == 0) + for (auto layer : object->support_layers()) + mm3_per_mm.push_back(layer->support_fills.min_mm3_per_mm()); + } + // filter out 0-width segments + mm3_per_mm.erase(std::remove_if(mm3_per_mm.begin(), mm3_per_mm.end(), [](double v) { return v < 0.000001; }), mm3_per_mm.end()); + double volumetric_speed = 0.; + if (! mm3_per_mm.empty()) { + // In order to honor max_print_speed we need to find a target volumetric + // speed that we can use throughout the print. So we define this target + // volumetric speed as the volumetric speed produced by printing the + // smallest cross-section at the maximum speed: any larger cross-section + // will need slower feedrates. + volumetric_speed = *std::min_element(mm3_per_mm.begin(), mm3_per_mm.end()) * print.config().max_print_speed.value; + // limit such volumetric speed with max_volumetric_speed if set + if (print.config().max_volumetric_speed.value > 0) + volumetric_speed = std::min(volumetric_speed, print.config().max_volumetric_speed.value); + } + return volumetric_speed; + } + + + 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) { + Points skirt_points; + for (const ExtrusionEntity *ee : print.skirt().entities) + for (const ExtrusionPath &path : dynamic_cast(ee)->paths) + append(skirt_points, path.polyline.points); + if (! skirt_points.empty()) { + Polygon outer_skirt = Slic3r::Geometry::convex_hull(skirt_points); + Polygons skirts; + for (unsigned int extruder_id : print.extruders()) { + const Vec2d &extruder_offset = print.config().extruder_offset.get_at(extruder_id); + Polygon s(outer_skirt); + s.translate(Point::new_scale(-extruder_offset(0), -extruder_offset(1))); + skirts.emplace_back(std::move(s)); + } + ooze_prevention.enable = true; + ooze_prevention.standby_points = offset(Slic3r::Geometry::convex_hull(skirts), float(scale_(3.))).front().equally_spaced_points(float(scale_(10.))); + #if 0 + require "Slic3r/SVG.pm"; + Slic3r::SVG::output( + "ooze_prevention.svg", + red_polygons => \@skirts, + polygons => [$outer_skirt], + points => $gcodegen->ooze_prevention->standby_points, + ); + #endif + } + } + } + + template + static void export_thumbnails_to_file(ThumbnailsGeneratorCallback &thumbnail_cb, const std::vector &sizes, WriteToOutput output, ThrowIfCanceledCallback throw_if_canceled) + { + // Write thumbnails using base64 encoding + if (thumbnail_cb != nullptr) + { + const size_t max_row_length = 78; + ThumbnailsList thumbnails; + thumbnail_cb(thumbnails, sizes, true, true, true, true); + for (const ThumbnailData& data : thumbnails) + { + if (data.is_valid()) + { + size_t png_size = 0; + void* png_data = tdefl_write_image_to_png_file_in_memory_ex((const void*)data.pixels.data(), data.width, data.height, 4, &png_size, MZ_DEFAULT_LEVEL, 1); + if (png_data != nullptr) + { + std::string encoded; + encoded.resize(boost::beast::detail::base64::encoded_size(png_size)); + encoded.resize(boost::beast::detail::base64::encode((void*)&encoded[0], (const void*)png_data, png_size)); + + output((boost::format("\n;\n; thumbnail begin %dx%d %d\n") % data.width % data.height % encoded.size()).str().c_str()); + + unsigned int row_count = 0; + while (encoded.size() > max_row_length) + { + output((boost::format("; %s\n") % encoded.substr(0, max_row_length)).str().c_str()); + encoded = encoded.substr(max_row_length); + ++row_count; + } + + if (encoded.size() > 0) + output((boost::format("; %s\n") % encoded).str().c_str()); + + output("; thumbnail end\n;\n"); + + mz_free(png_data); + } + } + throw_if_canceled(); + } + } + } + + // 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 bool has_wipe_tower, + const WipeTowerData &wipe_tower_data, + const std::vector &extruders, + PrintStatistics &print_statistics) + { + std::string filament_stats_string_out; + + print_statistics.clear(); + print_statistics.total_toolchanges = std::max(0, wipe_tower_data.number_of_toolchanges); + if (! extruders.empty()) { + std::pair out_filament_used_mm ("; filament used [mm] = ", 0); + std::pair out_filament_used_cm3("; filament used [cm3] = ", 0); + std::pair out_filament_used_g ("; filament used [g] = ", 0); + std::pair out_filament_cost ("; filament cost = ", 0); + for (const Extruder &extruder : extruders) { + double used_filament = extruder.used_filament() + (has_wipe_tower ? wipe_tower_data.used_filament[extruder.id()] : 0.f); + double extruded_volume = extruder.extruded_volume() + (has_wipe_tower ? wipe_tower_data.used_filament[extruder.id()] * 2.4052f : 0.f); // assumes 1.75mm filament diameter + double filament_weight = extruded_volume * extruder.filament_density() * 0.001; + double filament_cost = filament_weight * extruder.filament_cost() * 0.001; + auto append = [&extruder, &extruders](std::pair &dst, const char *tmpl, double value) { + while (dst.second < extruder.id()) { + // Fill in the non-printing extruders with zeros. + dst.first += (dst.second > 0) ? ", 0" : "0"; + ++ dst.second; + } + if (dst.second > 0) + dst.first += ", "; + char buf[64]; + sprintf(buf, tmpl, value); + dst.first += buf; + ++ dst.second; + }; + print_statistics.filament_stats.insert(std::pair{extruder.id(), (float)used_filament}); + 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, "%.2lf", filament_weight); + if (filament_cost > 0.) { + print_statistics.total_cost = print_statistics.total_cost + filament_cost; + append(out_filament_cost, "%.2lf", filament_cost); + } + } + print_statistics.total_used_filament += used_filament; + print_statistics.total_extruded_volume += extruded_volume; + print_statistics.total_wipe_tower_filament += has_wipe_tower ? used_filament - extruder.used_filament() : 0.; + print_statistics.total_wipe_tower_cost += has_wipe_tower ? (extruded_volume - extruder.extruded_volume())* extruder.filament_density() * 0.001 * extruder.filament_cost() * 0.001 : 0.; + } + 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) + filament_stats_string_out += "\n" + out_filament_used_g.first; + if (out_filament_cost.second) + filament_stats_string_out += "\n" + out_filament_cost.first; + } + 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 sort_object_instances_by_max_z(const Print &print) +{ + std::vector 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 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(). +std::vector sort_object_instances_by_model_order(const Print& print) +{ + // Build up map from ModelInstance* to PrintInstance* + std::vector> model_instance_to_print_instance; + model_instance_to_print_instance.reserve(print.num_object_instances()); + for (const PrintObject *print_object : print.objects()) + for (const PrintInstance &print_instance : print_object->instances()) + model_instance_to_print_instance.emplace_back(print_instance.model_instance, &print_instance); + std::sort(model_instance_to_print_instance.begin(), model_instance_to_print_instance.end(), [](auto &l, auto &r) { return l.first < r.first; }); + + std::vector instances; + instances.reserve(model_instance_to_print_instance.size()); + for (const ModelObject *model_object : print.model().objects) + for (const ModelInstance *model_instance : model_object->instances) { + auto it = std::lower_bound(model_instance_to_print_instance.begin(), model_instance_to_print_instance.end(), std::make_pair(model_instance, nullptr), [](auto &l, auto &r) { return l.first < r.first; }); + if (it != model_instance_to_print_instance.end() && it->first == model_instance) + instances.emplace_back(it->second); + } + return instances; +} + +void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thumbnail_cb) { PROFILE_FUNC(); - // resets time estimators - m_normal_time_estimator.reset(); - m_normal_time_estimator.set_dialect(print.config().gcode_flavor); - m_silent_time_estimator_enabled = (print.config().gcode_flavor == gcfMarlin) && print.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 (print.config().gcode_flavor.value == gcfMarlin) { - m_normal_time_estimator.set_max_acceleration((float)print.config().machine_max_acceleration_extruding.values[0]); - m_normal_time_estimator.set_retract_acceleration((float)print.config().machine_max_acceleration_retracting.values[0]); - m_normal_time_estimator.set_minimum_feedrate((float)print.config().machine_min_extruding_rate.values[0]); - m_normal_time_estimator.set_minimum_travel_feedrate((float)print.config().machine_min_travel_rate.values[0]); - m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, (float)print.config().machine_max_acceleration_x.values[0]); - m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, (float)print.config().machine_max_acceleration_y.values[0]); - m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, (float)print.config().machine_max_acceleration_z.values[0]); - m_normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, (float)print.config().machine_max_acceleration_e.values[0]); - m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, (float)print.config().machine_max_feedrate_x.values[0]); - m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, (float)print.config().machine_max_feedrate_y.values[0]); - m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, (float)print.config().machine_max_feedrate_z.values[0]); - m_normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, (float)print.config().machine_max_feedrate_e.values[0]); - m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, (float)print.config().machine_max_jerk_x.values[0]); - m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, (float)print.config().machine_max_jerk_y.values[0]); - m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, (float)print.config().machine_max_jerk_z.values[0]); - m_normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, (float)print.config().machine_max_jerk_e.values[0]); - - if (m_silent_time_estimator_enabled) - { - m_silent_time_estimator.reset(); - m_silent_time_estimator.set_dialect(print.config().gcode_flavor); - /* "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 - */ - m_silent_time_estimator.set_max_acceleration((float)print.config().machine_max_acceleration_extruding.values.back()); - m_silent_time_estimator.set_retract_acceleration((float)print.config().machine_max_acceleration_retracting.values.back()); - m_silent_time_estimator.set_minimum_feedrate((float)print.config().machine_min_extruding_rate.values.back()); - m_silent_time_estimator.set_minimum_travel_feedrate((float)print.config().machine_min_travel_rate.values.back()); - m_silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, (float)print.config().machine_max_acceleration_x.values.back()); - m_silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, (float)print.config().machine_max_acceleration_y.values.back()); - m_silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, (float)print.config().machine_max_acceleration_z.values.back()); - m_silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, (float)print.config().machine_max_acceleration_e.values.back()); - m_silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, (float)print.config().machine_max_feedrate_x.values.back()); - m_silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, (float)print.config().machine_max_feedrate_y.values.back()); - m_silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, (float)print.config().machine_max_feedrate_z.values.back()); - m_silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, (float)print.config().machine_max_feedrate_e.values.back()); - m_silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, (float)print.config().machine_max_jerk_x.values.back()); - m_silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, (float)print.config().machine_max_jerk_y.values.back()); - m_silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, (float)print.config().machine_max_jerk_z.values.back()); - m_silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, (float)print.config().machine_max_jerk_e.values.back()); - if (print.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. - m_silent_time_estimator.set_filament_load_times(print.config().filament_load_time.values); - m_silent_time_estimator.set_filament_unload_times(print.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 (print.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. - m_normal_time_estimator.set_filament_load_times(print.config().filament_load_time.values); - m_normal_time_estimator.set_filament_unload_times(print.config().filament_unload_time.values); - } - - // resets analyzer - m_analyzer.reset(); - - // send extruder offset data to analyzer - GCodeAnalyzer::ExtruderOffsetsMap extruder_offsets; - for (unsigned int extruder_id : print.extruders()) - { - Vec2d offset = print.config().extruder_offset.get_at(extruder_id); - if (!offset.isApprox(Vec2d::Zero())) - extruder_offsets[extruder_id] = offset; - } - m_analyzer.set_extruder_offsets(extruder_offsets); - - // send extruders count to analyzer to allow it to detect invalid extruder idxs - const ConfigOptionStrings* extruders_opt = dynamic_cast(print.config().option("extruder_colour")); - const ConfigOptionStrings* filamemts_opt = dynamic_cast(print.config().option("filament_colour")); - m_analyzer.set_extruders_count(std::max((unsigned int)extruders_opt->values.size(), (unsigned int)filamemts_opt->values.size())); - - // tell analyzer about the gcode flavor - m_analyzer.set_gcode_flavor(print.config().gcode_flavor); + // 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.0f; + m_last_layer_z = 0.0f; +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + m_last_mm3_per_mm = 0.0; + m_last_width = 0.0f; +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING // How many times will be change_layer() called? // change_layer() in turn increments the progress bar status. @@ -907,7 +1023,7 @@ void GCode::_do_export(Print &print, FILE *file) for (auto layer : object->support_layers()) zs.push_back(layer->print_z); std::sort(zs.begin(), zs.end()); - m_layer_count += (unsigned int)(object->copies().size() * (std::unique(zs.begin(), zs.end()) - zs.begin())); + m_layer_count += (unsigned int)(object->instances().size() * (std::unique(zs.begin(), zs.end()) - zs.begin())); } } else { // Print all objects with the same print_z together. @@ -926,54 +1042,10 @@ void GCode::_do_export(Print &print, FILE *file) m_enable_cooling_markers = true; this->apply_print_config(print.config()); - this->set_extruders(print.extruders()); - - // Initialize colorprint. - m_colorprint_heights = cast(print.config().colorprint_heights.values); - // Initialize autospeed. - { - // get the minimum cross-section used in the print - std::vector mm3_per_mm; - for (auto object : print.objects()) { - for (size_t region_id = 0; region_id < object->region_volumes.size(); ++ region_id) { - const PrintRegion* region = print.regions()[region_id]; - for (auto layer : object->layers()) { - const LayerRegion* layerm = layer->regions()[region_id]; - if (region->config().get_abs_value("perimeter_speed" ) == 0 || - region->config().get_abs_value("small_perimeter_speed" ) == 0 || - region->config().get_abs_value("external_perimeter_speed" ) == 0 || - region->config().get_abs_value("bridge_speed" ) == 0) - mm3_per_mm.push_back(layerm->perimeters.min_mm3_per_mm()); - 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()); - } - } - if (object->config().get_abs_value("support_material_speed" ) == 0 || - object->config().get_abs_value("support_material_interface_speed" ) == 0) - for (auto layer : object->support_layers()) - mm3_per_mm.push_back(layer->support_fills.min_mm3_per_mm()); - } - print.throw_if_canceled(); - // filter out 0-width segments - mm3_per_mm.erase(std::remove_if(mm3_per_mm.begin(), mm3_per_mm.end(), [](double v) { return v < 0.000001; }), mm3_per_mm.end()); - if (! mm3_per_mm.empty()) { - // In order to honor max_print_speed we need to find a target volumetric - // speed that we can use throughout the print. So we define this target - // volumetric speed as the volumetric speed produced by printing the - // smallest cross-section at the maximum speed: any larger cross-section - // will need slower feedrates. - m_volumetric_speed = *std::min_element(mm3_per_mm.begin(), mm3_per_mm.end()) * print.config().max_print_speed.value; - // limit such volumetric speed with max_volumetric_speed if set - if (print.config().max_volumetric_speed.value > 0) - m_volumetric_speed = std::min(m_volumetric_speed, print.config().max_volumetric_speed.value); - } - } + m_volumetric_speed = DoExport::autospeed_volumetric_limit(print); print.throw_if_canceled(); - + m_cooling_buffer = make_unique(*this); if (print.config().spiral_vase.value) m_spiral_vase = make_unique(print.config()); @@ -989,80 +1061,9 @@ 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()); -#if ENABLE_THUMBNAIL_GENERATOR - // Write thumbnails using base64 encoding - if (thumbnail_data != nullptr) - { - const size_t max_row_length = 78; - - for (const ThumbnailData& data : *thumbnail_data) - { - if (data.is_valid()) - { -#if ENABLE_THUMBNAIL_GENERATOR_PNG_TO_GCODE - size_t png_size = 0; - void* png_data = tdefl_write_image_to_png_file_in_memory_ex((const void*)data.pixels.data(), data.width, data.height, 4, &png_size, MZ_DEFAULT_LEVEL, 1); - if (png_data != nullptr) - { - std::string encoded; - encoded.resize(boost::beast::detail::base64::encoded_size(png_size)); - encoded.resize(boost::beast::detail::base64::encode((void*)&encoded[0], (const void*)png_data, png_size)); - - _write_format(file, "\n;\n; thumbnail begin %dx%d %d\n", data.width, data.height, encoded.size()); - - unsigned int row_count = 0; - while (encoded.size() > max_row_length) - { - _write_format(file, "; %s\n", encoded.substr(0, max_row_length).c_str()); - encoded = encoded.substr(max_row_length); - ++row_count; - } - - if (encoded.size() > 0) - _write_format(file, "; %s\n", encoded.c_str()); - - _write(file, "; thumbnail end\n;\n"); - - mz_free(png_data); - } -#else - _write_format(file, "\n;\n; thumbnail begin %dx%d\n", data.width, data.height); - - size_t row_size = 4 * data.width; - for (int r = (int)data.height - 1; r >= 0; --r) - { - std::string encoded; - encoded.resize(boost::beast::detail::base64::encoded_size(row_size)); - encoded.resize(boost::beast::detail::base64::encode((void*)&encoded[0], (const void*)(data.pixels.data() + r * row_size), row_size)); - - unsigned int row_count = 0; - while (encoded.size() > max_row_length) - { - if (row_count == 0) - _write_format(file, "; %s\n", encoded.substr(0, max_row_length).c_str()); - else - _write_format(file, ";>%s\n", encoded.substr(0, max_row_length).c_str()); - - encoded = encoded.substr(max_row_length); - ++row_count; - } - - if (encoded.size() > 0) - { - if (row_count == 0) - _write_format(file, "; %s\n", encoded.c_str()); - else - _write_format(file, ";>%s\n", encoded.c_str()); - } - } - - _write(file, "; thumbnail end\n;\n"); -#endif // ENABLE_THUMBNAIL_GENERATOR_PNG_TO_GCODE - } - print.throw_if_canceled(); - } - } -#endif // ENABLE_THUMBNAIL_GENERATOR + DoExport::export_thumbnails_to_file(thumbnail_cb, print.full_print_config().option("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) { @@ -1096,17 +1097,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); - } - - // Hold total number of print toolchanges. Check for negative toolchanges (single extruder mode) and set to 0 (no tool change). - int total_toolchanges = std::max(0, print.wipe_tower_data().number_of_toolchanges); + _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(); @@ -1118,27 +1112,39 @@ void GCode::_do_export(Print &print, FILE *file) ToolOrdering tool_ordering; unsigned int initial_extruder_id = (unsigned int)-1; unsigned int final_extruder_id = (unsigned int)-1; - size_t initial_print_object_id = 0; bool has_wipe_tower = false; + std::vector print_object_instances_ordering; + std::vector::const_iterator print_object_instance_sequential_active; if (print.config().complete_objects.value) { + // Order object instances for sequential print. + print_object_instances_ordering = sort_object_instances_by_model_order(print); +// print_object_instances_ordering = sort_object_instances_by_max_z(print); // Find the 1st printing object, find its tool ordering and the initial extruder ID. - for (; initial_print_object_id < print.objects().size(); ++initial_print_object_id) { - tool_ordering = ToolOrdering(*print.objects()[initial_print_object_id], initial_extruder_id); - if ((initial_extruder_id = tool_ordering.first_extruder()) != (unsigned int)-1) + print_object_instance_sequential_active = print_object_instances_ordering.begin(); + for (; print_object_instance_sequential_active != print_object_instances_ordering.end(); ++ print_object_instance_sequential_active) { + tool_ordering = ToolOrdering(*(*print_object_instance_sequential_active)->print_object, initial_extruder_id); + if ((initial_extruder_id = tool_ordering.first_extruder()) != static_cast(-1)) break; } + // 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()); } 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.wipe_tower_data().tool_ordering.empty() ? - ToolOrdering(print, initial_extruder_id) : - print.wipe_tower_data().tool_ordering; + 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) ? + initial_extruder_id = (has_wipe_tower && ! print.config().single_extruder_multi_material_priming) ? // The priming towers will be skipped. tool_ordering.all_extruders().back() : - // Don't skip the priming towers. + // Don't skip the priming towers. 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()); + // Order object instances using a nearest neighbor search. + print_object_instances_ordering = chain_print_object_instances(print); } if (initial_extruder_id == (unsigned int)-1) { // Nothing to print! @@ -1170,20 +1176,37 @@ void GCode::_do_export(Print &print, FILE *file) // For the start / end G-code to do the priming and final filament pull in case there is no wipe tower provided. 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", total_toolchanges); + 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(); + 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 - char buf[32]; - sprintf(buf, ";%s%d\n", GCodeAnalyzer::Extrusion_Role_Tag.c_str(), erCustom); - _writeln(file, buf); - } + // 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); @@ -1211,36 +1234,12 @@ void GCode::_do_export(Print &print, FILE *file) } // Calculate wiping points if needed - if (print.config().ooze_prevention.value && ! print.config().single_extruder_multi_material) { - Points skirt_points; - for (const ExtrusionEntity *ee : print.skirt().entities) - for (const ExtrusionPath &path : dynamic_cast(ee)->paths) - append(skirt_points, path.polyline.points); - if (! skirt_points.empty()) { - Polygon outer_skirt = Slic3r::Geometry::convex_hull(skirt_points); - Polygons skirts; - for (unsigned int extruder_id : print.extruders()) { - const Vec2d &extruder_offset = print.config().extruder_offset.get_at(extruder_id); - Polygon s(outer_skirt); - s.translate(Point::new_scale(-extruder_offset(0), -extruder_offset(1))); - skirts.emplace_back(std::move(s)); - } - m_ooze_prevention.enable = true; - m_ooze_prevention.standby_points = - offset(Slic3r::Geometry::convex_hull(skirts), scale_(3.f)).front().equally_spaced_points(scale_(10.)); -#if 0 - require "Slic3r/SVG.pm"; - Slic3r::SVG::output( - "ooze_prevention.svg", - red_polygons => \@skirts, - polygons => [$outer_skirt], - points => $gcodegen->ooze_prevention->standby_points, - ); -#endif - } - print.throw_if_canceled(); - } - + 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. @@ -1249,72 +1248,64 @@ void GCode::_do_export(Print &print, FILE *file) // Do all objects for each layer. if (print.config().complete_objects.value) { - // Print objects from the smallest to the tallest to avoid collisions - // when moving onto next object starting point. - std::vector objects(print.objects()); - std::sort(objects.begin(), objects.end(), [](const PrintObject* po1, const PrintObject* po2) { return po1->size(2) < po2->size(2); }); size_t finished_objects = 0; - for (size_t object_id = initial_print_object_id; object_id < objects.size(); ++ object_id) { - const PrintObject &object = *objects[object_id]; - for (const Point © : object.copies()) { - // Get optimal tool ordering to minimize tool switches of a multi-exruder print. - if (object_id != initial_print_object_id || © != object.copies().data()) { - // Don't initialize for the first object and first copy. - tool_ordering = ToolOrdering(object, final_extruder_id); - unsigned int new_extruder_id = tool_ordering.first_extruder(); - if (new_extruder_id == (unsigned int)-1) - // Skip this object. - continue; - initial_extruder_id = new_extruder_id; - final_extruder_id = tool_ordering.last_extruder(); - assert(final_extruder_id != (unsigned int)-1); - } - print.throw_if_canceled(); - this->set_origin(unscale(copy)); - if (finished_objects > 0) { - // 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; - _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; - // 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. - m_placeholder_parser.set("current_object_idx", int(finished_objects)); - std::string between_objects_gcode = this->placeholder_parser_process("between_objects_gcode", print.config().between_objects_gcode.value, initial_extruder_id); - // Set first layer bed and extruder temperatures, don't wait for it to reach the temperature. - this->_print_first_layer_bed_temperature(file, print, between_objects_gcode, initial_extruder_id, false); - this->_print_first_layer_extruder_temperatures(file, print, between_objects_gcode, initial_extruder_id, false); - _writeln(file, between_objects_gcode); - } - // Reset the cooling buffer internal state (the current position, feed rate, accelerations). - m_cooling_buffer->reset(); - m_cooling_buffer->set_current_extruder(initial_extruder_id); - // Pair the object layers with the support layers by z, extrude them. - std::vector layers_to_print = collect_layers_to_print(object); - for (const LayerToPrint <p : layers_to_print) { - std::vector lrs; - lrs.emplace_back(std::move(ltp)); - this->process_layer(file, print, lrs, tool_ordering.tools_for_layer(ltp.print_z()), nullptr, © - object.copies().data()); - print.throw_if_canceled(); - } -#ifdef HAS_PRESSURE_EQUALIZER - if (m_pressure_equalizer) - _write(file, m_pressure_equalizer->process("", true)); -#endif /* HAS_PRESSURE_EQUALIZER */ - ++ finished_objects; - // Flag indicating whether the nozzle temperature changes from 1st to 2nd layer were performed. - // Reset it when starting another object from 1st layer. - m_second_layer_things_done = false; + const PrintObject *prev_object = (*print_object_instance_sequential_active)->print_object; + for (; print_object_instance_sequential_active != print_object_instances_ordering.end(); ++ print_object_instance_sequential_active) { + const PrintObject &object = *(*print_object_instance_sequential_active)->print_object; + if (&object != prev_object || tool_ordering.first_extruder() != final_extruder_id) { + tool_ordering = ToolOrdering(object, final_extruder_id); + unsigned int new_extruder_id = tool_ordering.first_extruder(); + if (new_extruder_id == (unsigned int)-1) + // Skip this object. + continue; + initial_extruder_id = new_extruder_id; + final_extruder_id = tool_ordering.last_extruder(); + assert(final_extruder_id != (unsigned int)-1); } + print.throw_if_canceled(); + this->set_origin(unscale((*print_object_instance_sequential_active)->shift)); + if (finished_objects > 0) { + // 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; + _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; + // 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. + m_placeholder_parser.set("current_object_idx", int(finished_objects)); + std::string between_objects_gcode = this->placeholder_parser_process("between_objects_gcode", print.config().between_objects_gcode.value, initial_extruder_id); + // Set first layer bed and extruder temperatures, don't wait for it to reach the temperature. + this->_print_first_layer_bed_temperature(file, print, between_objects_gcode, initial_extruder_id, false); + this->_print_first_layer_extruder_temperatures(file, print, between_objects_gcode, initial_extruder_id, false); + _writeln(file, between_objects_gcode); + } + // Reset the cooling buffer internal state (the current position, feed rate, accelerations). + m_cooling_buffer->reset(); + m_cooling_buffer->set_current_extruder(initial_extruder_id); + // Pair the object layers with the support layers by z, extrude them. + std::vector layers_to_print = collect_layers_to_print(object); + for (const LayerToPrint <p : layers_to_print) { + std::vector lrs; + lrs.emplace_back(std::move(ltp)); + this->process_layer(file, print, lrs, tool_ordering.tools_for_layer(ltp.print_z()), nullptr, *print_object_instance_sequential_active - object.instances().data()); + print.throw_if_canceled(); + } +#ifdef HAS_PRESSURE_EQUALIZER + if (m_pressure_equalizer) + _write(file, m_pressure_equalizer->process("", true)); +#endif /* HAS_PRESSURE_EQUALIZER */ + ++ finished_objects; + // Flag indicating whether the nozzle temperature changes from 1st to 2nd layer were performed. + // Reset it when starting another object from 1st layer. + m_second_layer_things_done = false; + prev_object = &object; } } else { - // Order object instances using a nearest neighbor search. - std::vector> print_object_instances_ordering = chain_print_object_instances(print); // Sort layers by Z. // All extrusion moves with the same top layer height are extruded uninterrupted. std::vector>> layers_to_print = collect_layers_to_print(print); @@ -1323,7 +1314,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; @@ -1369,13 +1360,8 @@ 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 - char buf[32]; - sprintf(buf, ";%s%d\n", GCodeAnalyzer::Extrusion_Role_Tag.c_str(), erCustom); - _writeln(file, buf); - } + // 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. { @@ -1389,7 +1375,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)); } @@ -1401,86 +1387,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. - print.m_print_statistics.clear(); - print.m_print_statistics.estimated_normal_print_time = m_normal_time_estimator.get_time_dhms(); - print.m_print_statistics.estimated_silent_print_time = m_silent_time_estimator_enabled ? m_silent_time_estimator.get_time_dhms() : "N/A"; - print.m_print_statistics.estimated_normal_color_print_times = m_normal_time_estimator.get_color_times_dhms(true); - if (m_silent_time_estimator_enabled) - print.m_print_statistics.estimated_silent_color_print_times = m_silent_time_estimator.get_color_times_dhms(true); - print.m_print_statistics.total_toolchanges = total_toolchanges; - std::vector extruders = m_writer.extruders(); - if (! extruders.empty()) { - std::pair out_filament_used_mm ("; filament used [mm] = ", 0); - std::pair out_filament_used_cm3("; filament used [cm3] = ", 0); - std::pair out_filament_used_g ("; filament used [g] = ", 0); - std::pair out_filament_cost ("; filament cost = ", 0); - for (const Extruder &extruder : extruders) { - double used_filament = extruder.used_filament() + (has_wipe_tower ? print.wipe_tower_data().used_filament[extruder.id()] : 0.f); - double extruded_volume = extruder.extruded_volume() + (has_wipe_tower ? print.wipe_tower_data().used_filament[extruder.id()] * 2.4052f : 0.f); // assumes 1.75mm filament diameter - double filament_weight = extruded_volume * extruder.filament_density() * 0.001; - double filament_cost = filament_weight * extruder.filament_cost() * 0.001; - auto append = [&extruder, &extruders](std::pair &dst, const char *tmpl, double value) { - while (dst.second < extruder.id()) { - // Fill in the non-printing extruders with zeros. - dst.first += (dst.second > 0) ? ", 0" : "0"; - ++ dst.second; - } - if (dst.second > 0) - dst.first += ", "; - char buf[64]; - sprintf(buf, tmpl, value); - dst.first += buf; - ++ dst.second; - }; - print.m_print_statistics.filament_stats.insert(std::pair(extruder.id(), (float)used_filament)); - append(out_filament_used_mm, "%.1lf", used_filament); - append(out_filament_used_cm3, "%.1lf", extruded_volume * 0.001); - if (filament_weight > 0.) { - print.m_print_statistics.total_weight = print.m_print_statistics.total_weight + filament_weight; - append(out_filament_used_g, "%.1lf", filament_weight); - if (filament_cost > 0.) { - print.m_print_statistics.total_cost = print.m_print_statistics.total_cost + filament_cost; - append(out_filament_cost, "%.1lf", filament_cost); - } - } - print.m_print_statistics.total_used_filament += used_filament; - print.m_print_statistics.total_extruded_volume += extruded_volume; - print.m_print_statistics.total_wipe_tower_filament += has_wipe_tower ? used_filament - extruder.used_filament() : 0.; - print.m_print_statistics.total_wipe_tower_cost += has_wipe_tower ? (extruded_volume - extruder.extruded_volume())* extruder.filament_density() * 0.001 * extruder.filament_cost() * 0.001 : 0.; - } - _writeln(file, out_filament_used_mm.first); - _writeln(file, out_filament_used_cm3.first); - if (out_filament_used_g.second) - _writeln(file, out_filament_used_g.first); - if (out_filament_cost.second) - _writeln(file, out_filament_cost.first); - } - _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(file, DoExport::update_print_stats_and_format_filament_stats( + // Const inputs + 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] = %.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); @@ -1497,15 +1425,15 @@ std::string GCode::placeholder_parser_process(const std::string &name, const std m_placeholder_parser_failed_templates.insert(name); // 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()) @@ -1516,20 +1444,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') { @@ -1538,22 +1472,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; } @@ -1561,7 +1499,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), @@ -1597,7 +1535,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 @@ -1611,11 +1549,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) @@ -1642,9 +1582,9 @@ void GCode::_print_first_layer_extruder_temperatures(FILE *file, Print &print, c } inline GCode::ObjectByExtruder& object_by_extruder( - std::map> &by_extruder, - unsigned int extruder_id, - size_t object_idx, + std::map> &by_extruder, + unsigned int extruder_id, + size_t object_idx, size_t num_objects) { std::vector &objects_by_extruder = by_extruder[extruder_id]; @@ -1654,9 +1594,9 @@ inline GCode::ObjectByExtruder& object_by_extruder( } inline std::vector& object_islands_by_extruder( - std::map> &by_extruder, - unsigned int extruder_id, - size_t object_idx, + std::map> &by_extruder, + unsigned int extruder_id, + size_t object_idx, size_t num_objects, size_t num_islands) { @@ -1667,71 +1607,212 @@ inline std::vector& object_islands_by_extruder( } std::vector GCode::sort_print_object_instances( - std::vector &objects_by_extruder, - const std::vector &layers, - // Ordering must be defined for normal (non-sequential print). - const std::vector> *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 &objects_by_extruder, + const std::vector &layers, + // Ordering must be defined for normal (non-sequential print). + const std::vector *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 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> 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()); + // Create mapping from PrintObject* to ObjectByExtruder*. + std::vector> 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 std::pair &instance_id : *ordering) { - const PrintObject &print_object = *print.objects()[instance_id.first]; - std::pair 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_id.second); - } - } - } - return out; + if (! sorted.empty()) { + out.reserve(sorted.size()); + for (const PrintInstance *instance : *ordering) { + const PrintObject &print_object = *instance->print_object; + std::pair 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; } -// In sequential mode, process_layer is called once per each object and its copy, +namespace ProcessLayer +{ + + static std::string emit_custom_gcode_per_print_z( + const CustomGCode::Item *custom_gcode, + // ID of the first extruder printing this layer. + unsigned int first_extruder_id, + 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->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 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 += config.color_change_gcode;//ColorChangeCode; + gcode += "\n"; + } + } + else + { + if (gcode_type == CustomGCode::PausePrint) // Pause print + { + // 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"; + gcode += config.pause_print_gcode; + } + else + { + // 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; + + } + 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> &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(i, std::min(i + lines_per_extruder, n_loops)); + } + + static std::map> make_skirt_loops_per_extruder_1st_layer( + const Print &print, + const std::vector & /*layers */, + const LayerTools &layer_tools, + // Heights (print_z) at which the skirt has already been extruded. + std::vector &skirt_done) + { + // 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. + std::map> 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_done.emplace_back(layer_tools.print_z); + } + return skirt_loops_per_extruder_out; + } + + static std::map> make_skirt_loops_per_extruder_other_layers( + const Print &print, + const std::vector &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 &skirt_done) + { + // 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. + std::map> skirt_loops_per_extruder_out; + if (print.has_skirt() && ! print.skirt().entities.empty() && + // Not enough skirt layers printed yet. + //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 && + // 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(0, print.config().skirts.value); +#else + // 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 + assert(!skirt_done.empty()); + skirt_done.emplace_back(layer_tools.print_z); + } + return skirt_loops_per_extruder_out; + } + +} // namespace Skirt + +// 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 // and performing the extruder specific extrusions together. void GCode::process_layer( // Write into the output file. - FILE *file, - const Print &print, + FILE *file, + const Print &print, // Set of object & print layers of the same PrintObject and with the same print_z. - const std::vector &layers, - const LayerTools &layer_tools, - // Pairs of PrintObject index and its instance index. - const std::vector> *ordering, + const std::vector &layers, + const LayerTools &layer_tools, + // Pairs of PrintObject index and its instance index. + const std::vector *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) + 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); @@ -1748,7 +1829,7 @@ void GCode::process_layer( if (l.support_layer != nullptr && support_layer == nullptr) support_layer = l.support_layer; } - const Layer &layer = (object_layer != nullptr) ? *object_layer : *support_layer; + const Layer &layer = (object_layer != nullptr) ? *object_layer : *support_layer; coordf_t print_z = layer.print_z; bool first_layer = layer.id() == 0; unsigned int first_extruder_id = layer_tools.extruders.front(); @@ -1773,9 +1854,23 @@ void GCode::process_layer( } // 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(print_z) : static_cast(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(print_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; @@ -1786,7 +1881,7 @@ void GCode::process_layer( + "\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)); @@ -1812,77 +1907,22 @@ void GCode::process_layer( m_second_layer_things_done = true; } - // Let's issue a filament change command if requested at this layer. - // In case there are more toolchange requests that weren't done yet and should happen simultaneously, erase them all. - // (Layers can be close to each other, model could have been resliced with bigger layer height, ...). - bool colorprint_change = false; - while (!m_colorprint_heights.empty() && m_colorprint_heights.front()-EPSILON < layer.print_z) { - m_colorprint_heights.erase(m_colorprint_heights.begin()); - colorprint_change = true; + // Map from extruder ID to index of skirt loops to be extruded with that extruder. + std::map> skirt_loops_per_extruder; + + 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()); } - - // we should add or not colorprint_change in respect to nozzle_diameter count instead of really used extruders count - if (colorprint_change && print./*extruders()*/config().nozzle_diameter.size()==1) - { - // add tag for analyzer - gcode += "; " + GCodeAnalyzer::Color_Change_Tag + "\n"; - // add tag for time estimator - gcode += "; " + GCodeTimeEstimator::Color_Change_Tag + "\n"; - gcode += "M600\n"; - } - - // 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. - bool extrude_skirt = - ! print.skirt().entities.empty() && - // Not enough skirt layers printed yet. - (m_skirt_done.size() < (size_t)print.config().skirt_height.value || print.has_infinite_skirt()) && - // This print_z has not been extruded yet - (m_skirt_done.empty() ? 0. : m_skirt_done.back()) < print_z - EPSILON && - // and this layer is the 1st layer, or it is an object layer, or it is a raft layer. - (first_layer || object_layer != nullptr || support_layer->id() < (size_t)m_config.raft_layers.value); - std::map> skirt_loops_per_extruder; - coordf_t skirt_height = 0.; - if (extrude_skirt) { - // Fill in skirt_loops_per_extruder. - skirt_height = print_z - (m_skirt_done.empty() ? 0. : m_skirt_done.back()); - m_skirt_done.push_back(print_z); - if (first_layer) { - // Prime the extruders over the skirt lines. - std::vector extruder_ids = m_writer.extruder_ids(); - // Reorder the extruders, so that the last used extruder is at the front. - for (size_t i = 1; i < extruder_ids.size(); ++ i) - if (extruder_ids[i] == first_extruder_id) { - // Move the last extruder to the front. - memmove(extruder_ids.data() + 1, extruder_ids.data(), i * sizeof(unsigned int)); - extruder_ids.front() = first_extruder_id; - break; - } - size_t n_loops = print.skirt().entities.size(); - if (n_loops <= extruder_ids.size()) { - for (size_t i = 0; i < n_loops; ++i) - skirt_loops_per_extruder[extruder_ids[i]] = std::pair(i, i + 1); - } else { - // Assign skirt loops to the extruders. - std::vector extruder_loops(extruder_ids.size(), 1); - n_loops -= extruder_loops.size(); - while (n_loops > 0) { - for (size_t i = 0; i < extruder_ids.size() && n_loops > 0; ++ i, -- n_loops) - ++ extruder_loops[i]; - } - for (size_t i = 0; i < extruder_ids.size(); ++ i) - skirt_loops_per_extruder[extruder_ids[i]] = std::make_pair( - (i == 0) ? 0 : extruder_loops[i - 1], - ((i == 0) ? 0 : extruder_loops[i - 1]) + extruder_loops[i]); - } - } else - // Extrude all skirts with the current extruder. - skirt_loops_per_extruder[first_extruder_id] = std::pair(0, print.config().skirts.value); - } + skirt_loops_per_extruder = first_layer ? + Skirt::make_skirt_loops_per_extruder_1st_layer(print, layers, layer_tools, m_skirt_done) : + Skirt::make_skirt_loops_per_extruder_other_layers(print, layers, layer_tools, support_layer, m_skirt_done); // Group extrusions by an extruder, then by an object, an island and a region. std::map> by_extruder; + bool is_anything_overridden = const_cast(layer_tools).wiping_extrusions().is_anything_overridden(); for (const LayerToPrint &layer_to_print : layers) { if (layer_to_print.support_layer != nullptr) { const SupportLayer &support_layer = *layer_to_print.support_layer; @@ -1933,8 +1973,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 @@ -1942,78 +1982,91 @@ void GCode::process_layer( // - for each island, we extrude perimeters first, unless user set the infill_first // option // (Still, we have to keep track of regions because we need to apply their config) - size_t n_slices = layer.slices.size(); - const std::vector &layer_surface_bboxes = layer.slices_bboxes; + size_t n_slices = layer.lslices.size(); + const std::vector &layer_surface_bboxes = layer.lslices_bboxes; // Traverse the slices in an increasing order of bounding box size, so that the islands inside another islands are tested first, // so we can just test a point inside ExPolygon::contour and we may skip testing the holes. std::vector slices_test_order; slices_test_order.reserve(n_slices); for (size_t i = 0; i < n_slices; ++ i) - slices_test_order.emplace_back(i); - std::sort(slices_test_order.begin(), slices_test_order.end(), [&layer_surface_bboxes](int i, int j) { - const Vec2d s1 = layer_surface_bboxes[i].size().cast(); - const Vec2d s2 = layer_surface_bboxes[j].size().cast(); - return s1.x() * s1.y() < s2.x() * s2.y(); + 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(); + const Vec2d s2 = layer_surface_bboxes[j].size().cast(); + 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) && - layer.slices[i].contour.contains(point); + layer.lslices[i].contour.contains(point); }; - for (size_t region_id = 0; region_id < print.regions().size(); ++ region_id) { - const LayerRegion *layerm = (region_id < layer.regions().size()) ? layer.regions()[region_id] : nullptr; + for (size_t region_id = 0; region_id < layer.regions().size(); ++ region_id) { + const LayerRegion *layerm = layer.regions()[region_id]; if (layerm == nullptr) continue; const PrintRegion ®ion = *print.regions()[region_id]; - // Now we must process perimeters and infills and create islands of extrusions in by_region std::map. // It is also necessary to save which extrusions are part of MM wiping and which are not. // The process is almost the same for perimeters and infills - we will do it in a cycle that repeats twice: - for (std::string entity_type("infills") ; entity_type != "done" ; entity_type = entity_type=="infills" ? "perimeters" : "done") { - - const ExtrusionEntitiesPtr& source_entities = entity_type=="infills" ? layerm->fills.entities : layerm->perimeters.entities; - - for (const ExtrusionEntity *ee : source_entities) { - // fill represents infill extrusions of a single island. - const auto *fill = dynamic_cast(ee); - if (fill->entities.empty()) // This shouldn't happen but first_point() would fail. + std::vector printing_extruders; + for (const ObjectByExtruder::Island::Region::Type entity_type : { ObjectByExtruder::Island::Region::INFILL, ObjectByExtruder::Island::Region::PERIMETERS }) { + for (const ExtrusionEntity *ee : (entity_type == ObjectByExtruder::Island::Region::INFILL) ? layerm->fills.entities : layerm->perimeters.entities) { + // extrusions represents infill or perimeter extrusions of a single island. + assert(dynamic_cast(ee) != nullptr); + const auto *extrusions = static_cast(ee); + if (extrusions->entities.empty()) // This shouldn't happen but first_point() would fail. continue; // This extrusion is part of certain Region, which tells us which extruder should be used for it: - int correct_extruder_id = Print::get_extruder(*fill, region); + int correct_extruder_id = layer_tools.extruder(*extrusions, region); // Let's recover vector of extruder overrides: - const ExtruderPerCopy* entity_overrides = const_cast(layer_tools).wiping_extrusions().get_extruder_overrides(fill, correct_extruder_id, layer_to_print.object()->copies().size()); + 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 + // 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(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(- 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 : layer_tools.extruders) + for (unsigned int extruder : printing_extruders) { - // Init by_extruder item only if we actually use the extruder: - if (std::find(entity_overrides->begin(), entity_overrides->end(), extruder) != entity_overrides->end() || // at least one copy is overridden to use this extruder - std::find(entity_overrides->begin(), entity_overrides->end(), -extruder-1) != entity_overrides->end() || // at least one copy would normally be printed with this extruder (see get_extruder_overrides function for explanation) - (std::find(layer_tools.extruders.begin(), layer_tools.extruders.end(), correct_extruder_id) == layer_tools.extruders.end() && extruder == layer_tools.extruders.back())) // 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) - { - std::vector &islands = object_islands_by_extruder( - by_extruder, - extruder, - &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]; - if (// fill->first_point does not fit inside any slice - last || - // fill->first_point fits inside ith slice - point_inside_surface(island_idx, fill->first_point())) { - if (islands[island_idx].by_region.empty()) - islands[island_idx].by_region.assign(print.regions().size(), ObjectByExtruder::Island::Region()); - islands[island_idx].by_region[region_id].append(entity_type, fill, entity_overrides, layer_to_print.object()->copies().size()); - break; - } + std::vector &islands = object_islands_by_extruder( + by_extruder, + extruder, + &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]; + if (// extrusions->first_point does not fit inside any slice + last || + // extrusions->first_point fits inside ith slice + point_inside_surface(island_idx, extrusions->first_point())) { + if (islands[island_idx].by_region.empty()) + islands[island_idx].by_region.assign(print.regions().size(), ObjectByExtruder::Island::Region()); + islands[island_idx].by_region[region_id].append(entity_type, extrusions, entity_overrides); + break; } } } @@ -2032,33 +2085,30 @@ 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 (extrude_skirt) { - auto loops_it = skirt_loops_per_extruder.find(extruder_id); - if (loops_it != skirt_loops_per_extruder.end()) { - const std::pair loops = loops_it->second; - this->set_origin(0.,0.); - m_avoid_crossing_perimeters.use_external_mp = true; - Flow skirt_flow = print.skirt_flow(); - for (size_t i = loops.first; i < loops.second; ++ i) { - // Adjust flow according to this layer's layer height. - ExtrusionLoop loop = *dynamic_cast(print.skirt().entities[i]); - Flow layer_skirt_flow(skirt_flow); - layer_skirt_flow.height = (float)skirt_height; - double mm3_per_mm = layer_skirt_flow.mm3_per_mm(); - for (ExtrusionPath &path : loop.paths) { - path.height = (float)layer.height; - path.mm3_per_mm = mm3_per_mm; - } - gcode += this->extrude_loop(loop, "skirt", m_config.support_material_speed.value); + if (auto loops_it = skirt_loops_per_extruder.find(extruder_id); loops_it != skirt_loops_per_extruder.end()) { + const std::pair loops = loops_it->second; + this->set_origin(0., 0.); + m_avoid_crossing_perimeters.use_external_mp = true; + 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(); + for (size_t i = loops.first; i < loops.second; ++i) { + // Adjust flow according to this layer's layer height. + ExtrusionLoop loop = *dynamic_cast(print.skirt().entities[i]); + for (ExtrusionPath &path : loop.paths) { + path.height = layer_skirt_flow.height; + path.mm3_per_mm = mm3_per_mm; } - 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; + //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; + // 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; } // Extrude brim with the extruder of the 1st region. @@ -2079,10 +2129,10 @@ void GCode::process_layer( if (objects_by_extruder_it == by_extruder.end()) continue; - std::vector instances_to_print = sort_print_object_instances(objects_by_extruder_it->second, layers, ordering, single_object_instance_idx); + std::vector 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): - bool is_anything_overridden = const_cast(layer_tools).wiping_extrusions().is_anything_overridden(); + std::vector 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"; @@ -2091,12 +2141,12 @@ 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->slices, true)); + m_avoid_crossing_perimeters.init_layer_mp(union_ex(m_layer->lslices, true)); 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.copies()[instance_to_print.instance_id]; + const Point &offset = instance_to_print.print_object.instances()[instance_to_print.instance_id].shift; std::pair 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; @@ -2110,24 +2160,26 @@ void GCode::process_layer( m_layer = layers[instance_to_print.layer_id].layer(); } for (ObjectByExtruder::Island &island : instance_to_print.object_by_extruder.islands) { - const auto& by_region_specific = is_anything_overridden ? island.by_region_per_copy(instance_to_print.instance_id, extruder_id, print_wipe_extrusions) : island.by_region; - + const auto& by_region_specific = is_anything_overridden ? island.by_region_per_copy(by_region_per_copy_cache, static_cast(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. 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. @@ -2145,13 +2197,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(); } @@ -2163,16 +2211,29 @@ 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, + //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); + }; for (const std::string &key : cfg.keys()) - if (key != "compatible_prints" && key != "compatible_printers" && ! cfg.option(key)->is_nil()) + if (! is_banned(key) && ! cfg.option(key)->is_nil()) str += "; " + key + " = " + cfg.opt_serialize(key) + "\n"; } void GCode::set_extruders(const std::vector &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) @@ -2183,7 +2244,7 @@ void GCode::set_extruders(const std::vector &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)), @@ -2197,13 +2258,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; } @@ -2223,178 +2284,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::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().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; -} - -std::vector polygon_parameter_by_length(const Polygon &polygon) -{ - // Parametrize the polygon by its length. - std::vector 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().norm(); - lengths.back() = lengths[lengths.size()-2] + (polygon.points.front() - polygon.points.back()).cast().norm(); - return lengths; -} - -std::vector polygon_angles_at_vertices(const Polygon &polygon, const std::vector &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 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 *lower_layer_edge_grid) { @@ -2406,7 +2303,7 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou // Create the distance field for a layer below. const coord_t distance_field_resolution = coord_t(scale_(1.) + 0.5); *lower_layer_edge_grid = make_unique(); - (*lower_layer_edge_grid)->create(m_layer->lower_layer->slices, distance_field_resolution); + (*lower_layer_edge_grid)->create(m_layer->lower_layer->lslices, distance_field_resolution); (*lower_layer_edge_grid)->calculate_sdf(); #if 0 { @@ -2421,194 +2318,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) { - last_pos = m_layer->object()->bounding_box().center(); - last_pos(1) += 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 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 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->id(), 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) { @@ -2617,31 +2369,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 @@ -2657,7 +2409,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; } @@ -2689,7 +2441,7 @@ std::string GCode::extrude_entity(const ExtrusionEntity &entity, std::string des else if (const ExtrusionLoop* loop = dynamic_cast(&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 ""; } @@ -2711,29 +2463,41 @@ std::string GCode::extrude_path(ExtrusionPath path, std::string description, dou std::string GCode::extrude_perimeters(const Print &print, const std::vector &by_region, std::unique_ptr &lower_layer_edge_grid) { std::string gcode; - for (const ObjectByExtruder::Island::Region ®ion : by_region) { - m_config.apply(print.regions()[®ion - &by_region.front()]->config()); - for (ExtrusionEntity *ee : region.perimeters.entities) - gcode += this->extrude_entity(*ee, "perimeter", -1., &lower_layer_edge_grid); - } + for (const ObjectByExtruder::Island::Region ®ion : by_region) + if (! region.perimeters.empty()) { + m_config.apply(print.regions()[®ion - &by_region.front()]->config()); + for (const ExtrusionEntity *ee : region.perimeters) + gcode += this->extrude_entity(*ee, "perimeter", -1., &lower_layer_edge_grid); + } return gcode; } // Chain the paths hierarchically by a greedy algorithm to minimize a travel distance. -std::string GCode::extrude_infill(const Print &print, const std::vector &by_region) +std::string GCode::extrude_infill(const Print &print, const std::vector &by_region, bool ironing) { - std::string gcode; - for (const ObjectByExtruder::Island::Region ®ion : by_region) { - m_config.apply(print.regions()[®ion - &by_region.front()]->config()); - for (ExtrusionEntity *fill : region.infills.chained_path_from(m_last_pos).entities) { - auto *eec = dynamic_cast(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"); + std::string gcode; + ExtrusionEntitiesPtr extrusions; + const char* extrusion_name = ironing ? "ironing" : "infill"; + for (const ObjectByExtruder::Island::Region ®ion : by_region) + if (! region.infills.empty()) { + 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()[®ion - &by_region.front()]->config()); + chain_and_reorder_extrusion_entities(extrusions, &m_last_pos); + for (const ExtrusionEntity *fill : extrusions) { + auto *eec = dynamic_cast(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; } @@ -2767,15 +2531,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); } } @@ -2820,10 +2578,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( @@ -2832,10 +2590,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; @@ -2852,11 +2610,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) { @@ -2871,10 +2629,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()) @@ -2896,7 +2656,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) { @@ -2912,41 +2672,36 @@ 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_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_width != path.width)) - { - m_last_width = path.width; - sprintf(buf, ";%s%f\n", GCodeAnalyzer::Width_Tag.c_str(), m_last_width); - gcode += buf; - } + 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_GCODE_VIEWER_DATA_CHECKING - 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 (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; @@ -2975,40 +2730,40 @@ 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); - + // check whether a straight travel move would need retraction bool needs_retraction = this->needs_retraction(travel, role); - + // 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); - + // 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; - + // generate G-code for the travel move std::string gcode; if (needs_retraction) @@ -3016,12 +2771,12 @@ std::string GCode::travel_to(const Point &point, ExtrusionRole role, std::string 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); + gcode += m_writer.travel_to_xy(this->point_to_gcode(line.b), comment); this->set_last_pos(lines.back().b); } return gcode; @@ -3033,7 +2788,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(m_layer); //FIXME support_layer->support_islands.contains should use some search structure! @@ -3050,7 +2805,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; } @@ -3058,26 +2813,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; } @@ -3085,11 +2840,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); @@ -3101,13 +2856,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. @@ -3119,7 +2874,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) @@ -3168,7 +2923,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; } @@ -3190,59 +2945,102 @@ Point GCode::gcode_to_point(const Vec2d &point) const // Goes through by_region std::vector and returns reference to a subvector of entities, that are to be printed // during infill/perimeter wiping, or normally (depends on wiping_entities parameter) -// Returns a reference to member to avoid copying. -const std::vector& GCode::ObjectByExtruder::Island::by_region_per_copy(unsigned int copy, int extruder, bool wiping_entities) +// Fills in by_region_per_copy_cache and returns its reference. +const std::vector& GCode::ObjectByExtruder::Island::by_region_per_copy(std::vector &by_region_per_copy_cache, unsigned int copy, unsigned int extruder, bool wiping_entities) const { + bool has_overrides = false; + for (const auto& reg : by_region) + if (! reg.infills_overrides.empty() || ! reg.perimeters_overrides.empty()) { + has_overrides = true; + break; + } + + // 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; + + // 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. + // Filter out the extrusions based on the infill_overrides / perimeter_overrides: + for (const auto& reg : by_region) { - by_region_per_copy_cache.push_back(ObjectByExtruder::Island::Region()); // creates a region in the newly created Island + by_region_per_copy_cache.emplace_back(); // creates a region in the newly created Island // Now we are going to iterate through perimeters and infills and pick ones that are supposed to be printed // References are used so that we don't have to repeat the same code for (int iter = 0; iter < 2; ++iter) { - const ExtrusionEntitiesPtr& entities = (iter ? reg.infills.entities : reg.perimeters.entities); - ExtrusionEntityCollection& target_eec = (iter ? by_region_per_copy_cache.back().infills : by_region_per_copy_cache.back().perimeters); - const std::vector& overrides = (iter ? reg.infills_overrides : reg.perimeters_overrides); + const ExtrusionEntitiesPtr& entities = (iter ? reg.infills : reg.perimeters); + ExtrusionEntitiesPtr& target_eec = (iter ? by_region_per_copy_cache.back().infills : by_region_per_copy_cache.back().perimeters); + const std::vector& overrides = (iter ? reg.infills_overrides : reg.perimeters_overrides); // Now the most important thing - which extrusion should we print. // See function ToolOrdering::get_extruder_overrides for details about the negative numbers hack. - int this_extruder_mark = wiping_entities ? extruder : -extruder-1; - - for (unsigned int i=0;iat(copy) == this_extruder_mark) // this copy should be printed with this extruder - target_eec.append((*entities[i])); + 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) + target_eec.emplace_back(entities[i]); + } } } return by_region_per_copy_cache; } - - // This function takes the eec and appends its entities to either perimeters or infills of this Region (depending on the first parameter) // It also saves pointer to ExtruderPerCopy struct (for each entity), that holds information about which extruders should be used for which copy. -void GCode::ObjectByExtruder::Island::Region::append(const std::string& type, const ExtrusionEntityCollection* eec, const ExtruderPerCopy* copies_extruder, size_t object_copies_num) +void GCode::ObjectByExtruder::Island::Region::append(const Type type, const ExtrusionEntityCollection* eec, const WipingExtrusions::ExtruderPerCopy* copies_extruder) { // We are going to manipulate either perimeters or infills, exactly in the same way. Let's create pointers to the proper structure to not repeat ourselves: - ExtrusionEntityCollection* perimeters_or_infills = &infills; - std::vector* perimeters_or_infills_overrides = &infills_overrides; + ExtrusionEntitiesPtr* perimeters_or_infills; + std::vector* perimeters_or_infills_overrides; - if (type == "perimeters") { - perimeters_or_infills = &perimeters; - perimeters_or_infills_overrides = &perimeters_overrides; + switch (type) { + case PERIMETERS: + perimeters_or_infills = &perimeters; + perimeters_or_infills_overrides = &perimeters_overrides; + break; + case INFILL: + perimeters_or_infills = &infills; + perimeters_or_infills_overrides = &infills_overrides; + break; + default: + throw Slic3r::InvalidArgument("Unknown parameter!"); } - else - if (type != "infills") { - throw std::invalid_argument("Unknown parameter!"); - return; - } - // First we append the entities, there are eec->entities.size() of them: - perimeters_or_infills->append(eec->entities); + size_t old_size = perimeters_or_infills->size(); + size_t new_size = old_size + (eec->can_reverse() ? eec->entities.size() : 1); + perimeters_or_infills->reserve(new_size); + if (eec->can_reverse()) { + for (auto* ee : eec->entities) + perimeters_or_infills->emplace_back(ee); + } else + perimeters_or_infills->emplace_back(const_cast(eec)); - for (unsigned int i=0;ientities.size();++i) - perimeters_or_infills_overrides->push_back(copies_extruder); + if (copies_extruder != nullptr) { + // 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 19ec5be3c2..aeac4fcf82 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -8,15 +8,15 @@ #include "MotionPlanner.hpp" #include "Point.hpp" #include "PlaceholderParser.hpp" -#include "Print.hpp" #include "PrintConfig.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" +#include "GCode/ThumbnailData.hpp" #include #include @@ -29,10 +29,10 @@ namespace Slic3r { // Forward declarations. class GCode; -class GCodePreviewData; -#if ENABLE_THUMBNAIL_GENERATOR -struct ThumbnailData; -#endif // ENABLE_THUMBNAIL_GENERATOR + +namespace { struct Item; } +struct PrintInstance; +using PrintObjectPtrs = std::vector; class AvoidCrossingPerimeters { public: @@ -62,6 +62,7 @@ private: std::unique_ptr m_layer_mp; }; + class OozePrevention { public: bool enable; @@ -137,28 +138,33 @@ private: double m_last_wipe_tower_print_z = 0.f; }; +class ColorPrintColors +{ + static const std::vector Colors; +public: + static const std::vector& 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_GCODE_VIEWER_DATA_CHECKING + m_last_mm3_per_mm(0.0), + m_last_width(0.0f), +#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::max(), std::numeric_limits::max())) {} @@ -166,11 +172,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, const std::vector* thumbnail_data = 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; } @@ -197,23 +199,21 @@ public: // append full config to the given string static void append_full_config(const Print& print, std::string& str); -protected: -#if ENABLE_THUMBNAIL_GENERATOR - void _do_export(Print& print, FILE* file, const std::vector* thumbnail_data); -#else - void _do_export(Print &print, FILE *file); -#endif //ENABLE_THUMBNAIL_GENERATOR - // Object and support extrusions of the same PrintObject at the same print_z. + // public, so that it could be accessed by free helper functions from GCode.cpp struct LayerToPrint { LayerToPrint() : object_layer(nullptr), support_layer(nullptr) {} - const Layer *object_layer; - const SupportLayer *support_layer; - const Layer* layer() const { return (object_layer != nullptr) ? object_layer : support_layer; } - const PrintObject* object() const { return (this->layer() != nullptr) ? this->layer()->object() : nullptr; } - coordf_t print_z() const { return (object_layer != nullptr && support_layer != nullptr) ? 0.5 * (object_layer->print_z + support_layer->print_z) : this->layer()->print_z; } + const Layer* object_layer; + const SupportLayer* support_layer; + const Layer* layer() const { return (object_layer != nullptr) ? object_layer : support_layer; } + const PrintObject* object() const { return (this->layer() != nullptr) ? this->layer()->object() : nullptr; } + coordf_t print_z() const { return (object_layer != nullptr && support_layer != nullptr) ? 0.5 * (object_layer->print_z + support_layer->print_z) : this->layer()->print_z; } }; + +private: + void _do_export(Print &print, FILE *file, ThumbnailsGeneratorCallback thumbnail_cb); + static std::vector collect_layers_to_print(const PrintObject &object); static std::vector>> collect_layers_to_print(const Print &print); void process_layer( @@ -224,7 +224,7 @@ protected: const std::vector &layers, const LayerTools &layer_tools, // Pairs of PrintObject index and its instance index. - const std::vector> *ordering, + const std::vector *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_idx = size_t(-1)); @@ -239,7 +239,6 @@ protected: std::string extrude_multi_path(ExtrusionMultiPath multipath, std::string description = "", double speed = -1.); std::string extrude_path(ExtrusionPath path, std::string description = "", double speed = -1.); - typedef std::vector ExtruderPerCopy; // Extruding multiple objects with soluble / non-soluble / combined supports // on a multi-material printer, trying to minimize tool switches. // Following structures sort extrusions by the extruder ID, by an order of objects and object islands. @@ -253,21 +252,29 @@ protected: struct Island { struct Region { - ExtrusionEntityCollection perimeters; - ExtrusionEntityCollection infills; + // Non-owned references to LayerRegion::perimeters::entities + // std::vector would be better here, but there is no way in C++ to convert from std::vector std::vector without copying. + ExtrusionEntitiesPtr perimeters; + // Non-owned references to LayerRegion::fills::entities + ExtrusionEntitiesPtr infills; - std::vector infills_overrides; - std::vector perimeters_overrides; + std::vector infills_overrides; + std::vector perimeters_overrides; + + enum Type { + PERIMETERS, + INFILL, + }; // Appends perimeter/infill entities and writes don't indices of those that are not to be extruder as part of perimeter/infill wiping - void append(const std::string& type, const ExtrusionEntityCollection* eec, const ExtruderPerCopy* copy_extruders, size_t object_copies_num); + void append(const Type type, const ExtrusionEntityCollection* eec, const WipingExtrusions::ExtruderPerCopy* copy_extruders); }; - std::vector by_region; // all extrusions for this island, grouped by regions - const std::vector& by_region_per_copy(unsigned int copy, int extruder, bool wiping_entities = false); // returns reference to subvector of by_region - private: - std::vector by_region_per_copy_cache; // caches vector generated by function above to avoid copying and recalculating + std::vector by_region; // all extrusions for this island, grouped by regions + + // Fills in by_region_per_copy_cache and returns its reference. + const std::vector& by_region_per_copy(std::vector &by_region_per_copy_cache, unsigned int copy, unsigned int extruder, bool wiping_entities = false) const; }; std::vector islands; }; @@ -277,7 +284,9 @@ protected: InstanceToPrint(ObjectByExtruder &object_by_extruder, size_t layer_id, const PrintObject &print_object, size_t instance_id) : object_by_extruder(object_by_extruder), layer_id(layer_id), print_object(print_object), instance_id(instance_id) {} - ObjectByExtruder &object_by_extruder; + // Repository + ObjectByExtruder &object_by_extruder; + // Index into std::vector, which contains Object and Support layers for the current print_z, collected for a single object, or for possibly multiple objects with multiple instances. const size_t layer_id; const PrintObject &print_object; // Instance idx of the copy of a print object. @@ -285,15 +294,16 @@ protected: }; std::vector sort_print_object_instances( - std::vector &objects_by_extruder, + std::vector &objects_by_extruder, + // Object and Support layers for the current print_z, collected for a single object, or for possibly multiple objects with multiple instances. const std::vector &layers, // Ordering must be defined for normal (non-sequential print). - const std::vector> *ordering, + const std::vector *ordering, // For sequential print, the instance of the object to be printing has to be defined. const size_t single_object_instance_idx); std::string extrude_perimeters(const Print &print, const std::vector &by_region, std::unique_ptr &lower_layer_edge_grid); - std::string extrude_infill(const Print &print, const std::vector &by_region); + std::string extrude_infill(const Print &print, const std::vector &by_region, bool ironing); std::string extrude_support(const ExtrusionEntityCollection &support_fills); std::string travel_to(const Point &point, ExtrusionRole role, std::string comment); @@ -302,6 +312,9 @@ protected: 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. */ @@ -322,11 +335,8 @@ protected: // 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; @@ -335,14 +345,16 @@ protected: // 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 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 }; +#if ENABLE_GCODE_VIEWER_DATA_CHECKING double m_last_mm3_per_mm; - float m_last_width; - float m_last_height; + float m_last_width{ 0.0f }; +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING Point m_last_pos; bool m_last_pos_defined; @@ -354,7 +366,7 @@ protected: #endif /* HAS_PRESSURE_EQUALIZER */ std::unique_ptr m_wipe_tower; - // Heights at which the skirt has already been extruded. + // Heights (print_z) at which the skirt has already been extruded. std::vector m_skirt_done; // Has the brim been extruded already? Brim is being extruded only for the first object of a multi-object print. bool m_brim_done; @@ -362,17 +374,11 @@ protected: bool m_second_layer_things_done; // Index of a last object copy extruded. std::pair m_last_obj_copy; - // Layer heights for colorprint - updated before the export and erased during the process - // so no toolchange occurs twice. - std::vector m_colorprint_heights; - // 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()); } @@ -409,6 +415,8 @@ protected: friend class WipeTowerIntegration; }; +std::vector sort_object_instances_by_model_order(const Print& print); + } #endif diff --git a/src/libslic3r/GCode/Analyzer.cpp b/src/libslic3r/GCode/Analyzer.cpp deleted file mode 100644 index 3f0b8735f6..0000000000 --- a/src/libslic3r/GCode/Analyzer.cpp +++ /dev/null @@ -1,1156 +0,0 @@ -#include -#include -#include - -#include "../libslic3r.h" -#include "../PrintConfig.hpp" -#include "../Utils.hpp" -#include "Print.hpp" - -#include - -#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 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) -{ -} - -GCodeAnalyzer::GCodeAnalyzer() -{ - reset(); -} - -void GCodeAnalyzer::set_extruder_offsets(const GCodeAnalyzer::ExtruderOffsetsMap& extruder_offsets) -{ - m_extruder_offsets = extruder_offsets; -} - -void GCodeAnalyzer::set_extruders_count(unsigned int count) -{ - m_extruders_count = count; -} - -void GCodeAnalyzer::set_gcode_flavor(const GCodeFlavor& flavor) -{ - m_gcode_flavor = flavor; -} - -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; -} - -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 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 - { - float current_absolute_position = _get_axis_position(axis); - float current_origin = _get_axis_origin(axis); - float lengthsScaleFactor = (_get_units() == GCodeAnalyzer::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; - }; - - // 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()) - { - _set_axis_origin(E, _get_axis_position(E) - line.e() * lengthsScaleFactor); - anyFound = true; - } - - if (!anyFound) - { - 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 / 256.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); - - // 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) - { - _process_color_change_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() -{ - m_state.cur_cp_color_id++; - _set_cp_color_id(m_state.cur_cp_color_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 cancel_callback) -{ - struct Helper - { - static GCodePreviewData::Extrusion::Layer& get_layer_at_z(GCodePreviewData::Extrusion::LayersList& layers, float z) - { - //FIXME this has a terrible time complexity - for (GCodePreviewData::Extrusion::Layer& layer : layers) - { - // if layer found, return it - if (layer.z == z) - return layer; - } - - // if layer not found, create and return it - layers.emplace_back(z, GCodePreviewData::Extrusion::Paths()); - return layers.back(); - } - - static void store_polyline(const Polyline& polyline, const Metadata& data, float z, GCodePreviewData& preview_data) - { - // if the polyline is valid, create the extrusion path from it and store it - if (polyline.is_valid()) - { - auto& paths = get_layer_at_z(preview_data.extrusion.layers, z).paths; - paths.emplace_back(GCodePreviewData::Extrusion::Path()); - GCodePreviewData::Extrusion::Path &path = paths.back(); - path.polyline = polyline; - path.extrusion_role = data.extrusion_role; - path.mm3_per_mm = data.mm3_per_mm; - path.width = data.width; - path.height = data.height; - path.feedrate = data.feedrate; - path.extruder_id = data.extruder_id; - path.cp_color_id = data.cp_color_id; - path.fan_speed = data.fan_speed; - } - } - }; - - TypeToMovesMap::iterator extrude_moves = m_moves_map.find(GCodeMove::Extrude); - if (extrude_moves == m_moves_map.end()) - return; - - Metadata data; - float z = FLT_MAX; - Polyline polyline; - Vec3d position(FLT_MAX, FLT_MAX, FLT_MAX); - float volumetric_rate = FLT_MAX; - GCodePreviewData::Range height_range; - GCodePreviewData::Range width_range; - GCodePreviewData::Range 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); - volumetric_rate_range.update_from(volumetric_rate); - fan_speed_range.update_from(move.data.fan_speed); - } - else - // append end vertex of the move to current polyline - polyline.append(Point(scale_(move.end_position.x()), scale_(move.end_position.y()))); - - // update current values - position = move.end_position; - } - - // store last polyline - polyline.remove_duplicate_points(); - Helper::store_polyline(polyline, data, z, preview_data); - - // updates preview ranges data - preview_data.ranges.height.update_from(height_range); - preview_data.ranges.width.update_from(width_range); - preview_data.ranges.feedrate.update_from(feedrate_range); - preview_data.ranges.volumetric_rate.update_from(volumetric_rate_range); - preview_data.ranges.fan_speed.update_from(fan_speed_range); - - // we need to sort the layers by their z as they can be shuffled in case of sequential prints - std::sort(preview_data.extrusion.layers.begin(), preview_data.extrusion.layers.end(), [](const GCodePreviewData::Extrusion::Layer& l1, const GCodePreviewData::Extrusion::Layer& l2)->bool { return l1.z < l2.z; }); -} - -void GCodeAnalyzer::_calc_gcode_preview_travel(GCodePreviewData& preview_data, std::function cancel_callback) -{ - struct Helper - { - static void store_polyline(const Polyline3& polyline, GCodePreviewData::Travel::EType type, GCodePreviewData::Travel::Polyline::EDirection direction, - float feedrate, unsigned int extruder_id, GCodePreviewData& preview_data) - { - // if the polyline is valid, store it - if (polyline.is_valid()) - preview_data.travel.polylines.emplace_back(type, direction, feedrate, extruder_id, polyline); - } - }; - - TypeToMovesMap::iterator travel_moves = m_moves_map.find(GCodeMove::Move); - if (travel_moves == m_moves_map.end()) - return; - - Polyline3 polyline; - 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::Range 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); - } - - // store last polyline - polyline.remove_duplicate_points(); - Helper::store_polyline(polyline, type, direction, feedrate, extruder_id, preview_data); - - // updates preview ranges data - preview_data.ranges.height.update_from(height_range); - preview_data.ranges.width.update_from(width_range); - preview_data.ranges.feedrate.update_from(feedrate_range); - - // we need to sort the polylines by their min z as they can be shuffled in case of sequential prints - std::sort(preview_data.travel.polylines.begin(), preview_data.travel.polylines.end(), - [](const GCodePreviewData::Travel::Polyline& p1, const GCodePreviewData::Travel::Polyline& p2)->bool - { return unscale(p1.polyline.bounding_box().min(2)) < unscale(p2.polyline.bounding_box().min(2)); }); -} - -void GCodeAnalyzer::_calc_gcode_preview_retractions(GCodePreviewData& preview_data, std::function cancel_callback) -{ - TypeToMovesMap::iterator retraction_moves = m_moves_map.find(GCodeMove::Retract); - if (retraction_moves == m_moves_map.end()) - return; - - // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)std::max((int)retraction_moves->second.size() / 25, 1); - unsigned int cancel_callback_curr = 0; - - for (const GCodeMove& move : retraction_moves->second) - { - cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; - if (cancel_callback_curr == 0) - cancel_callback(); - - // store position - Vec3crd position((int)scale_(move.start_position.x()), (int)scale_(move.start_position.y()), (int)scale_(move.start_position.z())); - preview_data.retraction.positions.emplace_back(position, move.data.width, move.data.height); - } - - // we need to sort the positions by their z as they can be shuffled in case of sequential prints - std::sort(preview_data.retraction.positions.begin(), preview_data.retraction.positions.end(), - [](const GCodePreviewData::Retraction::Position& p1, const GCodePreviewData::Retraction::Position& p2)->bool - { return unscale(p1.position(2)) < unscale(p2.position(2)); }); -} - -void GCodeAnalyzer::_calc_gcode_preview_unretractions(GCodePreviewData& preview_data, std::function cancel_callback) -{ - TypeToMovesMap::iterator unretraction_moves = m_moves_map.find(GCodeMove::Unretract); - if (unretraction_moves == m_moves_map.end()) - return; - - // to avoid to call the callback too often - unsigned int cancel_callback_threshold = (unsigned int)std::max((int)unretraction_moves->second.size() / 25, 1); - unsigned int cancel_callback_curr = 0; - - for (const GCodeMove& move : unretraction_moves->second) - { - cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold; - if (cancel_callback_curr == 0) - cancel_callback(); - - // store position - Vec3crd position((int)scale_(move.start_position.x()), (int)scale_(move.start_position.y()), (int)scale_(move.start_position.z())); - preview_data.unretraction.positions.emplace_back(position, move.data.width, move.data.height); - } - - // we need to sort the positions by their z as they can be shuffled in case of sequential prints - std::sort(preview_data.unretraction.positions.begin(), preview_data.unretraction.positions.end(), - [](const GCodePreviewData::Retraction::Position& p1, const GCodePreviewData::Retraction::Position& p2)->bool - { return unscale(p1.position(2)) < unscale(p2.position(2)); }); -} - -// Return an estimate of the memory consumed by the time estimator. -size_t GCodeAnalyzer::memory_used() const -{ - size_t out = sizeof(*this); - for (const std::pair &kvp : m_moves_map) - out += sizeof(kvp) + SLIC3R_STDVEC_MEMSIZE(kvp.second, GCodeMove); - out += m_process_output.size(); - return out; -} - -} // namespace Slic3r diff --git a/src/libslic3r/GCode/Analyzer.hpp b/src/libslic3r/GCode/Analyzer.hpp deleted file mode 100644 index df4f6f652c..0000000000 --- a/src/libslic3r/GCode/Analyzer.hpp +++ /dev/null @@ -1,291 +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 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 GCodeMovesList; - typedef std::map TypeToMovesMap; - typedef std::map ExtruderOffsetsMap; - -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 cur_cp_color_id = 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; - - // The output of process_layer() - std::string m_process_output; - -public: - GCodeAnalyzer(); - - void set_extruder_offsets(const ExtruderOffsetsMap& extruder_offsets); - void set_extruders_count(unsigned int count); - - void set_gcode_flavor(const GCodeFlavor& flavor); - - // Reinitialize the analyzer - void reset(); - - // Adds the gcode contained in the given string to the analysis and returns it after removing the workcodes - const std::string& process_gcode(const std::string& gcode); - - // Calculates all data needed for gcode visualization - // throws CanceledException through print->throw_if_canceled() (sent by the caller as callback). - void calc_gcode_preview_data(GCodePreviewData& preview_data, std::function cancel_callback = std::function()); - - // Return an estimate of the memory consumed by the time estimator. - size_t memory_used() const; - - static bool is_valid_extrusion_role(ExtrusionRole role); - -private: - // Processes the given gcode line - void _process_gcode_line(GCodeReader& reader, const GCodeReader::GCodeLine& line); - - // Move - void _processG1(const GCodeReader::GCodeLine& line); - - // Retract - void _processG10(const GCodeReader::GCodeLine& line); - - // Unretract - void _processG11(const GCodeReader::GCodeLine& line); - - // Firmware controlled Retract - void _processG22(const GCodeReader::GCodeLine& line); - - // Firmware controlled Unretract - void _processG23(const GCodeReader::GCodeLine& line); - - // Set to Absolute Positioning - void _processG90(const GCodeReader::GCodeLine& line); - - // Set to Relative Positioning - void _processG91(const GCodeReader::GCodeLine& line); - - // Set Position - void _processG92(const GCodeReader::GCodeLine& line); - - // Set extruder to absolute mode - void _processM82(const GCodeReader::GCodeLine& line); - - // Set extruder to relative mode - void _processM83(const GCodeReader::GCodeLine& line); - - // Set fan speed - void _processM106(const GCodeReader::GCodeLine& line); - - // Disable fan - void _processM107(const GCodeReader::GCodeLine& line); - - // Set tool (MakerWare and Sailfish flavor) - void _processM108orM135(const GCodeReader::GCodeLine& line); - - // Recall stored home offsets - void _processM132(const GCodeReader::GCodeLine& line); - - // Repetier: Store x, y and z position - void _processM401(const GCodeReader::GCodeLine& line); - - // Repetier: Go to stored position - void _processM402(const GCodeReader::GCodeLine& line); - - // Processes T line (Select Tool) - void _processT(const std::string& command); - void _processT(const GCodeReader::GCodeLine& line); - - // Processes the tags - // Returns true if any tag has been processed - bool _process_tags(const GCodeReader::GCodeLine& line); - - // Processes extrusion role tag - void _process_extrusion_role_tag(const std::string& comment, size_t pos); - - // Processes mm3_per_mm tag - void _process_mm3_per_mm_tag(const std::string& comment, size_t pos); - - // Processes width tag - void _process_width_tag(const std::string& comment, size_t pos); - - // Processes height tag - void _process_height_tag(const std::string& comment, size_t pos); - - // Processes color change tag - void _process_color_change_tag(); - - 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 cancel_callback); - void _calc_gcode_preview_travel(GCodePreviewData& preview_data, std::function cancel_callback); - void _calc_gcode_preview_retractions(GCodePreviewData& preview_data, std::function cancel_callback); - void _calc_gcode_preview_unretractions(GCodePreviewData& preview_data, std::function cancel_callback); -}; - -} // namespace Slic3r - -#endif /* slic3r_GCode_Analyzer_hpp_ */ diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp index b00bc73eb7..6815ea73a0 100644 --- a/src/libslic3r/GCode/CoolingBuffer.cpp +++ b/src/libslic3r/GCode/CoolingBuffer.cpp @@ -303,8 +303,8 @@ std::vector CoolingBuffer::parse_layer_gcode(const std:: unsigned int extruder_id = extruders[i].id(); adj.extruder_id = extruder_id; adj.cooling_slow_down_enabled = config.cooling.get_at(extruder_id); - adj.slowdown_below_layer_time = config.slowdown_below_layer_time.get_at(extruder_id); - adj.min_print_speed = config.min_print_speed.get_at(extruder_id); + adj.slowdown_below_layer_time = float(config.slowdown_below_layer_time.get_at(extruder_id)); + adj.min_print_speed = float(config.min_print_speed.get_at(extruder_id)); map_extruder_to_per_extruder_adjustment[extruder_id] = i; } diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp new file mode 100644 index 0000000000..14bd38a33f --- /dev/null +++ b/src/libslic3r/GCode/GCodeProcessor.cpp @@ -0,0 +1,2229 @@ +#include "libslic3r/libslic3r.h" +#include "libslic3r/Utils.hpp" +#include "libslic3r/Print.hpp" +#include "GCodeProcessor.hpp" + +#include +#include +#include + +#include +#include + +#if __has_include() + #include + #include +#endif + +#include + +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::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"; + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING +const std::string GCodeProcessor::Width_Tag = "WIDTH:"; +const std::string GCodeProcessor::Mm3_Per_Mm_Tag = "MM3_PER_MM:"; +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING + +static bool is_valid_extrusion_role(int value) +{ + return (static_cast(erNone) <= value) && (value <= static_cast(erMixed)); +} + +static void set_option_value(ConfigOptionFloats& option, size_t id, float value) +{ + if (id < option.values.size()) + option.values[id] = static_cast(value); +}; + +static float get_option_value(const ConfigOptionFloats& option, size_t id) +{ + return option.values.empty() ? 0.0f : + ((id < option.values.size()) ? static_cast(option.values[id]) : static_cast(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>(); +} + +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(); + g1_times_cache = std::vector(); + std::fill(moves_time.begin(), moves_time.end(), 0.0f); + std::fill(roles_time.begin(), roles_time.end(), 0.0f); + layers_time = std::vector(); +} + +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& 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(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(block.move_type)] += block_time; + roles_time[static_cast(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(); + filament_unload_times = std::vector(); + for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { + machines[i].reset(); + } + machines[static_cast(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 + std::array, static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count)> last_exported; + for (size_t i = 0; i < static_cast(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(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(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { + const TimeMachine& machine = machines[i]; + PrintEstimatedTimeStatistics::ETimeMode mode = static_cast(i); + if (mode == PrintEstimatedTimeStatistics::ETimeMode::Normal || machine.enabled) { + char buf[128]; + sprintf(buf, "; estimated printing time (%s mode) = %s\n", + (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& gcode_line) { + // remove trailing '\n' + std::string line = gcode_line.substr(0, gcode_line.length() - 1); + if (line == "; " + Layer_Change_Tag) + return true; + else + return false; + }; + + // Iterators for the normal and silent cached time estimate entry recently processed, used by process_line_G1. + auto g1_times_cache_it = Slic3r::reserve_vector::const_iterator>(machines.size()); + for (const auto& machine : machines) + g1_times_cache_it.emplace_back(machine.g1_times_cache.begin()); + // add lines M73 to exported gcode + auto process_line_G1 = [&]() { + if (export_remaining_time_enabled) { + for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { + const TimeMachine& machine = machines[i]; + if (machine.enabled) { + // Skip all machine.g1_times_cache below g1_lines_counter. + auto& it = g1_times_cache_it[i]; + while (it != machine.g1_times_cache.end() && it->id < g1_lines_counter) + ++it; + if (it != machine.g1_times_cache.end() && it->id == g1_lines_counter) { + float elapsed_time = it->elapsed_time; + std::pair to_export = { int(100.0f * elapsed_time / machine.time), + time_in_minutes(machine.time - elapsed_time) }; + if (last_exported[i] != to_export) { + export_line += format_line_M73(machine.line_m73_mask.c_str(), + to_export.first, to_export.second); + last_exported[i] = to_export; + } + } + } + } + } + }; + + // 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> 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" } +}; + +unsigned int GCodeProcessor::s_result_id = 0; + +GCodeProcessor::GCodeProcessor() +{ + reset(); + m_time_processor.machines[static_cast(PrintEstimatedTimeStatistics::ETimeMode::Normal)].line_m73_mask = "M73 P%s R%s\n"; + m_time_processor.machines[static_cast(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(); + 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(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(config.filament_diameter.values[i]); + } + + if (config.machine_limits_usage.value != MachineLimitsUsage::Ignore) + m_time_processor.machine_limits = reinterpret_cast(config); + + // Filament load / unload times are not specific to a firmware flavor. Let anybody use it if they find it useful. + // As of now the fields are shown at the UI dialog in the same combo box as the ramming values, so they + // are considered to be active for the single extruder multi-material printers only. + 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(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(config.filament_unload_time.values[i]); + } + + for (size_t i = 0; i < static_cast(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; +} + +void GCodeProcessor::apply_config(const DynamicPrintConfig& config) +{ + m_parser.apply_config(config); + + const ConfigOptionEnum* gcode_flavor = config.option>("gcode_flavor"); + if (gcode_flavor != nullptr) + m_flavor = gcode_flavor->value; + + const ConfigOptionPoints* bed_shape = config.option("bed_shape"); + if (bed_shape != nullptr) + m_result.bed_shape = bed_shape->values; + + const ConfigOptionString* print_settings_id = config.option("print_settings_id"); + if (print_settings_id != nullptr) + m_result.settings_ids.print = print_settings_id->value; + + const ConfigOptionStrings* filament_settings_id = config.option("filament_settings_id"); + if (filament_settings_id != nullptr) + m_result.settings_ids.filament = filament_settings_id->values; + + const ConfigOptionString* printer_settings_id = config.option("printer_settings_id"); + if (printer_settings_id != nullptr) + m_result.settings_ids.printer = printer_settings_id->value; + + const ConfigOptionFloats* filament_diameters = config.option("filament_diameter"); + if (filament_diameters != nullptr) { + for (double diam : filament_diameters->values) { + m_filament_diameters.push_back(static_cast(diam)); + } + } + + m_result.extruders_count = config.option("nozzle_diameter")->values.size(); + + const ConfigOptionPoints* extruder_offset = config.option("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(); + m_extruder_offsets[i] = { offset(0), offset(1), 0.0f }; + } + } + + // ensure at least one (default) color is defined + std::string default_color = "#FF8000"; + m_result.extruder_colors = std::vector(1, default_color); + const ConfigOptionStrings* extruder_colour = config.option("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("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 + 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(i); + } + + const ConfigOptionFloats* filament_load_time = config.option("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(filament_load_time->values[i]); + } + } + + const ConfigOptionFloats* filament_unload_time = config.option("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(filament_unload_time->values[i]); + } + } + + const ConfigOptionFloats* machine_max_acceleration_x = config.option("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("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("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("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("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("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("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("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("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("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("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("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("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("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("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("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(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; + } +} + +void GCodeProcessor::enable_stealth_time_estimator(bool enabled) +{ + m_time_processor.machines[static_cast(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(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_feedrate = 0.0f; + m_width = 0.0f; + m_height = 0.0f; + 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(i); + } + + m_filament_diameters = std::vector(Min_Extruder_Count, 1.75f); + m_extruded_last_z = 0.0f; + m_g1_line_id = 0; + m_layer_id = 0; + m_cp_color.reset(); + + m_producer = EProducer::Unknown; + m_producers_enabled = false; + + m_time_processor.reset(); + + m_result.reset(); + m_result.id = ++s_result_id; + +#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 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(curr_time - last_cancel_callback_time).count() > 100) { + cancel_callback(); + last_cancel_callback_time = curr_time; + } + } + process_gcode_line(line); + }); + + // process the time blocks + for (size_t i = 0; i < static_cast(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::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(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(mode)].time)) : std::string("N/A"); +} + +std::vector>> GCodeProcessor::get_custom_gcode_times(PrintEstimatedTimeStatistics::ETimeMode mode, bool include_remaining) const +{ + std::vector>> ret; + if (mode < PrintEstimatedTimeStatistics::ETimeMode::Count) { + const TimeMachine& machine = m_time_processor.machines[static_cast(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> GCodeProcessor::get_moves_time(PrintEstimatedTimeStatistics::ETimeMode mode) const +{ + std::vector> ret; + if (mode < PrintEstimatedTimeStatistics::ETimeMode::Count) { + for (size_t i = 0; i < m_time_processor.machines[static_cast(mode)].moves_time.size(); ++i) { + float time = m_time_processor.machines[static_cast(mode)].moves_time[i]; + if (time > 0.0f) + ret.push_back({ static_cast(i), time }); + } + } + return ret; +} + +std::vector> GCodeProcessor::get_roles_time(PrintEstimatedTimeStatistics::ETimeMode mode) const +{ + std::vector> ret; + if (mode < PrintEstimatedTimeStatistics::ETimeMode::Count) { + for (size_t i = 0; i < m_time_processor.machines[static_cast(mode)].roles_time.size(); ++i) { + float time = m_time_processor.machines[static_cast(mode)].roles_time[i]; + if (time > 0.0f) + ret.push_back({ static_cast(i), time }); + } + } + return ret; +} + +std::vector GCodeProcessor::get_layers_time(PrintEstimatedTimeStatistics::ETimeMode mode) const +{ + return (mode < PrintEstimatedTimeStatistics::ETimeMode::Count) ? + m_time_processor.machines[static_cast(mode)].layers_time : + std::vector(); +} + +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() + template + struct is_from_chars_convertible : std::false_type {}; + template + struct is_from_chars_convertible(), std::declval(), std::declval()))>> : std::true_type {}; +#endif + +// Returns true if the number was parsed correctly into out and the number spanned the whole input string. +template +[[nodiscard]] static inline bool parse_number(const std::string_view sv, T &out) +{ + // https://www.bfilipek.com/2019/07/detect-overload-from-chars.html#example-stdfromchars +#if __has_include() + // Visual Studio 19 supports from_chars all right. + // OSX compiler that we use only implements std::from_chars just for ints. + // GCC that we compile on does not provide at all. + if constexpr (is_from_chars_convertible::value) { + auto str_end = sv.data() + sv.size(); + auto [end_ptr, error_code] = std::from_chars(sv.data(), str_end, out); + return error_code == std::errc() && end_ptr == str_end; + } + else +#endif + { + // Legacy conversion, which is costly due to having to make a copy of the string before conversion. + try { + assert(sv.size() < 1024); + assert(sv.data() != nullptr); + std::string str { sv }; + size_t read = 0; + if constexpr (std::is_same_v) + out = std::stoi(str, &read); + else if constexpr (std::is_same_v) + out = std::stol(str, &read); + else if constexpr (std::is_same_v) + out = std::stof(str, &read); + else if constexpr (std::is_same_v) + out = std::stod(str, &read); + return str.size() == read; + } catch (...) { + return false; + } + } +} + +void GCodeProcessor::process_tags(const std::string_view comment) +{ + // producers tags + if (m_producers_enabled && process_producers_tags(comment)) + return; + + // extrusion role tag + if (starts_with(comment, Extrusion_Role_Tag)) { + m_extrusion_role = ExtrusionEntity::string_to_role(comment.substr(Extrusion_Role_Tag.length())); + return; + } + + if ((!m_producers_enabled || m_producer == EProducer::PrusaSlicer) && + 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 + + // 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(eid); + } + + m_extruder_colors[extruder_id] = static_cast(m_extruder_offsets.size()) + m_cp_color.counter; // color_change position in list of color for preview + ++m_cp_color.counter; + 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::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); } + 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; + } + + 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; + } + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + // geometry + + // ; 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 + + 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; + } + + 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; + } + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + // geometry + + // 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 + + 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) +{ + auto absolute_position = [this](Axis axis, const GCodeReader::GCodeLine& lineG1) + { + 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; + 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 (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])); + float filament_diameter = (static_cast(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(M_PI) * sqr(filament_radius); + 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 ((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]; + } + } + + if (m_extrusion_role == erExternalPerimeter) + // cross section: rectangle + m_width = delta_pos[E] * static_cast(M_PI * sqr(1.05 * filament_radius)) / (delta_xyz * m_height); + else if (m_extrusion_role == erBridgeInfill || m_extrusion_role == erNone) + // cross section: circle + m_width = static_cast(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(M_PI * sqr(filament_radius)) / (delta_xyz * m_height) + static_cast(1.0 - 0.25 * M_PI) * m_height; + + // clamp width to avoid artifacts which may arise from wrong values of m_height + m_width = std::min(m_width, 1.0f); +// m_width = std::min(m_width, 4.0f * m_height); + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + m_width_compare.update(m_width, m_extrusion_role); +#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(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& blocks = machine.blocks; + + curr.feedrate = (delta_pos[E] == 0.0f) ? + minimum_travel_feedrate(static_cast(i), m_feedrate) : + minimum_feedrate(static_cast(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(i), static_cast(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(i)) : + get_acceleration(static_cast(i)); + + for (unsigned char a = X; a <= E; ++a) { + float axis_max_acceleration = get_axis_max_acceleration(static_cast(i), static_cast(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(i), static_cast(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(i), static_cast(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) +{ + if (!m_time_processor.machine_envelope_processing_enabled) + return; + + // 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(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { + 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) +{ + if (!m_time_processor.machine_envelope_processing_enabled) + return; + + // 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(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { + 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) +{ + if (!m_time_processor.machine_envelope_processing_enabled) + return; + + float value; + for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { + 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(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(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) +{ + if (!m_time_processor.machine_envelope_processing_enabled) + return; + + for (size_t i = 0; i < static_cast(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) { + 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(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(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) { + BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid toolchange (" << command << ")."; + } else { + unsigned char id = static_cast(eid); + if (m_extruder_id != id) { + unsigned char extruders_count = static_cast(m_extruder_offsets.size()); + if (id >= extruders_count) + 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(old_extruder_id)); + m_time_processor.extruder_unloaded = false; + extra_time += get_filament_load_time(static_cast(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(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(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(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(mode)); } + case Y: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_y, static_cast(mode)); } + case Z: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_z, static_cast(mode)); } + case E: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_e, static_cast(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(mode)); } + case Y: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_y, static_cast(mode)); } + case Z: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_z, static_cast(mode)); } + case E: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_e, static_cast(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(mode)); } + case Y: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_y, static_cast(mode)); } + case Z: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_z, static_cast(mode)); } + case E: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_e, static_cast(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(mode)); +} + +float GCodeProcessor::get_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode) const +{ + size_t id = static_cast(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(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(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(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(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(PrintEstimatedTimeStatistics::ETimeMode::Stealth)].enabled) + update_mode(PrintEstimatedTimeStatistics::ETimeMode::Stealth); + else + m_result.time_statistics.modes[static_cast(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 0000000000..ea13d99814 --- /dev/null +++ b/src/libslic3r/GCode/GCodeProcessor.hpp @@ -0,0 +1,588 @@ +#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 +#include +#include +#include + +namespace Slic3r { + + enum class EMoveType : unsigned char + { + Noop, + Retract, + Unretract, + Tool_change, + Color_change, + Pause_Print, + Custom_GCode, + Travel, + Extrude, + Count + }; + + struct PrintEstimatedTimeStatistics + { + enum class ETimeMode : unsigned char + { + Normal, + Stealth, + Count + }; + + struct Mode + { + float time; + std::vector>> custom_gcode_times; + std::vector> moves_times; + std::vector> roles_times; + std::vector layers_times; + + void reset() { + time = 0.0f; + custom_gcode_times.clear(); + moves_times.clear(); + roles_times.clear(); + layers_times.clear(); + } + }; + + std::array(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 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; + +#if ENABLE_GCODE_VIEWER_DATA_CHECKING + static const std::string Width_Tag; + static const std::string Mm3_Per_Mm_Tag; +#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING + + private: + using AxisCoords = std::array; + using ExtruderColors = std::vector; + + 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> 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 blocks; + std::vector g1_times_cache; + std::array(EMoveType::Count)> moves_time; + std::array(ExtrusionRole::erCount)> roles_time; + std::vector 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() + bool machine_envelope_processing_enabled; + MachineEnvelopeConfig machine_limits; + // Additional load / unload times for a filament exchange sequence. + std::vector filament_load_times; + std::vector filament_unload_times; + std::array(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 filament; + std::string printer; + + void reset() + { + print = ""; + filament = std::vector(); + printer = ""; + } + }; + unsigned int id; + std::vector moves; + Pointfs bed_shape; + SettingsIds settings_ids; + size_t extruders_count; + std::vector extruder_colors; + PrintEstimatedTimeStatistics time_statistics; + +#if ENABLE_GCODE_VIEWER_STATISTICS + long long time{ 0 }; + void reset() + { + time = 0; + moves = std::vector(); + bed_shape = Pointfs(); + extruder_colors = std::vector(); + extruders_count = 0; + settings_ids.reset(); + } +#else + void reset() + { + moves = std::vector(); + bed_shape = Pointfs(); + extruder_colors = std::vector(); + 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 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 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 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 m_extruder_offsets; + GCodeFlavor m_flavor; + + AxisCoords m_start_position; // mm + AxisCoords m_end_position; // mm + AxisCoords m_origin; // mm + CachedPosition m_cached_position; + + float m_feedrate; // mm/s + float m_width; // mm + float m_height; // mm + 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 m_filament_diameters; + float m_extruded_last_z; + unsigned int m_g1_line_id; + unsigned int m_layer_id; + CpColor m_cp_color; + + enum class EProducer + { + Unknown, + PrusaSlicer, + Slic3rPE, + Slic3r, + Cura, + Simplify3D, + CraftWare, + ideaMaker + }; + + static const std::vector> 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(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 cancel_callback = nullptr); + + float get_time(PrintEstimatedTimeStatistics::ETimeMode mode) const; + std::string get_time_dhm(PrintEstimatedTimeStatistics::ETimeMode mode) const; + std::vector>> get_custom_gcode_times(PrintEstimatedTimeStatistics::ETimeMode mode, bool include_remaining) const; + + std::vector> get_moves_time(PrintEstimatedTimeStatistics::ETimeMode mode) const; + std::vector> get_roles_time(PrintEstimatedTimeStatistics::ETimeMode mode) const; + std::vector 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 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 25982959be..17aa76fb9d 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); @@ -187,7 +187,7 @@ void run_post_process_scripts(const std::string &path, const PrintConfig &config 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) { std::vector lines; @@ -205,7 +205,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/PressureEqualizer.cpp b/src/libslic3r/GCode/PressureEqualizer.cpp index 3b2a58a884..c3f084a24a 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 53c13a2f23..0000000000 --- a/src/libslic3r/GCode/PreviewData.cpp +++ /dev/null @@ -1,526 +0,0 @@ -#include "Analyzer.hpp" -#include "PreviewData.hpp" -#include -#include -#include "Utils.hpp" - -#include - -//! macro used to mark string used at localization, -#define L(s) (s) - -namespace Slic3r { - -const GCodePreviewData::Color GCodePreviewData::Color::Dummy(0.0f, 0.0f, 0.0f, 0.0f); - -std::vector GCodePreviewData::Color::as_bytes() const -{ - std::vector 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) -{ -} - -const GCodePreviewData::Color GCodePreviewData::Range::Default_Colors[Colors_Count] = -{ - 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) -}; - -GCodePreviewData::Range::Range() -{ - reset(); -} - -void GCodePreviewData::Range::reset() -{ - min = FLT_MAX; - max = -FLT_MAX; -} - -bool GCodePreviewData::Range::empty() const -{ - return min == max; -} - -void GCodePreviewData::Range::update_from(float value) -{ - min = std::min(min, value); - max = std::max(max, value); -} - -void GCodePreviewData::Range::update_from(const Range& other) -{ - min = std::min(min, other.min); - max = std::max(max, other.max); -} - -void GCodePreviewData::Range::set_from(const Range& other) -{ - min = other.min; - max = other.max; -} - -float GCodePreviewData::Range::step_size() const -{ - return (max - min) / (float)(Colors_Count - 1); -} - -GCodePreviewData::Color GCodePreviewData::Range::get_color_at(float value) const -{ - if (empty()) - return Color::Dummy; - - float global_t = (value - min) / step_size(); - - unsigned int low = (unsigned int)global_t; - unsigned int high = clamp((unsigned int)0, Colors_Count - 1, low + 1); - - Color color_low = colors[low]; - Color color_high = colors[high]; - - float local_t = global_t - (float)low; - - // interpolate in RGB space - Color ret; - for (unsigned int i = 0; i < 4; ++i) - { - ret.rgba[i] = lerp(color_low.rgba[i], color_high.rgba[i], local_t); - } - return ret; -} - -GCodePreviewData::LegendItem::LegendItem(const std::string& text, const GCodePreviewData::Color& color) - : text(text) - , color(color) -{ -} - -const GCodePreviewData::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 GCodePreviewData::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 GCodePreviewData::Color GCodePreviewData::Retraction::Default_Color = GCodePreviewData::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() -{ - ::memcpy((void*)ranges.height.colors, (const void*)Range::Default_Colors, Range::Colors_Count * sizeof(Color)); - ::memcpy((void*)ranges.width.colors, (const void*)Range::Default_Colors, Range::Colors_Count * sizeof(Color)); - ::memcpy((void*)ranges.feedrate.colors, (const void*)Range::Default_Colors, Range::Colors_Count * sizeof(Color)); - ::memcpy((void*)ranges.fan_speed.colors, (const void*)Range::Default_Colors, Range::Colors_Count * sizeof(Color)); - ::memcpy((void*)ranges.volumetric_rate.colors, (const void*)Range::Default_Colors, Range::Colors_Count * sizeof(Color)); - - extrusion.set_default(); - travel.set_default(); - retraction.set_default(); - unretraction.set_default(); - shell.set_default(); -} - -void GCodePreviewData::reset() -{ - ranges.width.reset(); - ranges.height.reset(); - ranges.feedrate.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(); -} - -GCodePreviewData::Color GCodePreviewData::get_extrusion_role_color(ExtrusionRole role) const -{ - return extrusion.role_colors[role]; -} - -GCodePreviewData::Color GCodePreviewData::get_height_color(float height) const -{ - return ranges.height.get_color_at(height); -} - -GCodePreviewData::Color GCodePreviewData::get_width_color(float width) const -{ - return ranges.width.get_color_at(width); -} - -GCodePreviewData::Color GCodePreviewData::get_feedrate_color(float feedrate) const -{ - return ranges.feedrate.get_color_at(feedrate); -} - -GCodePreviewData::Color GCodePreviewData::get_fan_speed_color(float fan_speed) const -{ - return ranges.fan_speed.get_color_at(fan_speed); -} - -GCodePreviewData::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& 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& tool_colors, const std::vector>& cp_values) const -{ - struct Helper - { - static void FillListFromRange(LegendItemsList& list, const Range& range, unsigned int decimals, float scale_factor) - { - list.reserve(Range::Colors_Count); - - float step = range.step_size(); - for (int i = Range::Colors_Count - 1; i >= 0; --i) - { - char buf[1024]; - sprintf(buf, "%.*f", decimals, scale_factor * (range.min + (float)i * step)); - list.emplace_back(buf, range.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) - { - GCodePreviewData::Color color; - ::memcpy((void*)color.rgba, (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_values.size(); - for (int i = color_print_cnt; i >= 0 ; --i) - { - GCodePreviewData::Color color; - ::memcpy((void*)color.rgba, (const void*)(tool_colors.data() + (i % color_cnt) * 4), 4 * sizeof(float)); - - if (color_print_cnt == 0) { - items.emplace_back(Slic3r::I18N::translate(L("Default print color")), color); - break; - } - - std::string id_str = std::to_string(i + 1) + ": "; - - if (i == 0) { - items.emplace_back(id_str + (boost::format(Slic3r::I18N::translate(L("up to %.2f mm"))) % cp_values[0].first).str(), color); - break; - } - if (i == color_print_cnt) { - items.emplace_back(id_str + (boost::format(Slic3r::I18N::translate(L("above %.2f mm"))) % cp_values[i - 1].second).str(), color); - continue; - } - -// items.emplace_back((boost::format(Slic3r::I18N::translate(L("%.2f - %.2f mm"))) % cp_values[i-1] % cp_values[i]).str(), color); - items.emplace_back(id_str + (boost::format(Slic3r::I18N::translate(L("%.2f - %.2f mm"))) % cp_values[i - 1].second% cp_values[i].first).str(), 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& GCodePreviewData::ColorPrintColors() -{ - static std::vector color_print = {"#C0392B", "#E67E22", "#F1C40F", "#27AE60", "#1ABC9C", "#2980B9", "#9B59B6"}; - return color_print; -} - -GCodePreviewData::Color operator + (const GCodePreviewData::Color& c1, const GCodePreviewData::Color& c2) -{ - return GCodePreviewData::Color(clamp(0.0f, 1.0f, c1.rgba[0] + c2.rgba[0]), - clamp(0.0f, 1.0f, c1.rgba[1] + c2.rgba[1]), - clamp(0.0f, 1.0f, c1.rgba[2] + c2.rgba[2]), - clamp(0.0f, 1.0f, c1.rgba[3] + c2.rgba[3])); -} - -GCodePreviewData::Color operator * (float f, const GCodePreviewData::Color& color) -{ - return GCodePreviewData::Color(clamp(0.0f, 1.0f, f * color.rgba[0]), - clamp(0.0f, 1.0f, f * color.rgba[1]), - clamp(0.0f, 1.0f, f * color.rgba[2]), - clamp(0.0f, 1.0f, f * color.rgba[3])); -} - -} // namespace Slic3r diff --git a/src/libslic3r/GCode/PreviewData.hpp b/src/libslic3r/GCode/PreviewData.hpp deleted file mode 100644 index 70b6edffdf..0000000000 --- a/src/libslic3r/GCode/PreviewData.hpp +++ /dev/null @@ -1,253 +0,0 @@ -#ifndef slic3r_GCode_PreviewData_hpp_ -#define slic3r_GCode_PreviewData_hpp_ - -#include "../libslic3r.h" -#include "../ExtrusionEntity.hpp" -#include "../Point.hpp" - -namespace Slic3r { - -class GCodePreviewData -{ -public: - struct Color - { - float rgba[4]; - - Color(const float *argba) { memcpy(this->rgba, argba, sizeof(float) * 4); } - Color(float r = 1.f, float g = 1.f, float b = 1.f, float a = 1.f) { rgba[0] = r; rgba[1] = g; rgba[2] = b; rgba[3] = a; } - - std::vector as_bytes() const; - - static const Color Dummy; - }; - - // Color mapping from a range into a smooth rainbow of 10 colors. - struct Range - { - static const unsigned int Colors_Count = 10; - static const Color Default_Colors[Colors_Count]; - - Color colors[Colors_Count]; - float min; - float max; - - Range(); - - void reset(); - bool empty() const; - void update_from(float value); - void update_from(const Range& other); - void set_from(const Range& other); - float step_size() const; - - 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; - }; - - struct LegendItem - { - std::string text; - Color color; - - LegendItem(const std::string& text, const Color& color); - }; - - typedef std::vector 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; - - struct Layer - { - float z; - Paths paths; - - Layer(float z, const Paths& paths); - }; - - typedef std::vector 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 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 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& colors); - - std::string get_legend_title() const; - LegendItemsList get_legend_items(const std::vector& tool_colors, const std::vector>& cp_values) const; - - // Return an estimate of the memory consumed by the time estimator. - size_t memory_used() const; - - static const std::vector& ColorPrintColors(); -}; - -GCodePreviewData::Color operator + (const GCodePreviewData::Color& c1, const GCodePreviewData::Color& c2); -GCodePreviewData::Color operator * (float f, const GCodePreviewData::Color& color); - -} // namespace Slic3r - -#endif /* slic3r_GCode_PreviewData_hpp_ */ diff --git a/src/libslic3r/GCode/PrintExtents.cpp b/src/libslic3r/GCode/PrintExtents.cpp index d44ef1aad5..a86411519f 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" @@ -29,7 +30,7 @@ static inline BoundingBox extrusion_polyline_extents(const Polyline &polyline, c static inline BoundingBoxf extrusionentity_extents(const ExtrusionPath &extrusion_path) { - BoundingBox bbox = extrusion_polyline_extents(extrusion_path.polyline, scale_(0.5 * extrusion_path.width)); + BoundingBox bbox = extrusion_polyline_extents(extrusion_path.polyline, coord_t(scale_(0.5 * extrusion_path.width))); BoundingBoxf bboxf; if (! empty(bbox)) { bboxf.min = unscale(bbox.min); @@ -43,7 +44,7 @@ static inline BoundingBoxf extrusionentity_extents(const ExtrusionLoop &extrusio { BoundingBox bbox; for (const ExtrusionPath &extrusion_path : extrusion_loop.paths) - bbox.merge(extrusion_polyline_extents(extrusion_path.polyline, scale_(0.5 * extrusion_path.width))); + bbox.merge(extrusion_polyline_extents(extrusion_path.polyline, coord_t(scale_(0.5 * extrusion_path.width)))); BoundingBoxf bboxf; if (! empty(bbox)) { bboxf.min = unscale(bbox.min); @@ -57,7 +58,7 @@ static inline BoundingBoxf extrusionentity_extents(const ExtrusionMultiPath &ext { BoundingBox bbox; for (const ExtrusionPath &extrusion_path : extrusion_multi_path.paths) - bbox.merge(extrusion_polyline_extents(extrusion_path.polyline, scale_(0.5 * extrusion_path.width))); + bbox.merge(extrusion_polyline_extents(extrusion_path.polyline, coord_t(scale_(0.5 * extrusion_path.width)))); BoundingBoxf bboxf; if (! empty(bbox)) { bboxf.min = unscale(bbox.min); @@ -93,7 +94,7 @@ static BoundingBoxf extrusionentity_extents(const ExtrusionEntity *extrusion_ent auto *extrusion_entity_collection = dynamic_cast(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(); } @@ -121,9 +122,9 @@ BoundingBoxf get_print_object_extrusions_extents(const PrintObject &print_object if (support_layer) for (const ExtrusionEntity *extrusion_entity : support_layer->support_fills.entities) bbox_this.merge(extrusionentity_extents(extrusion_entity)); - for (const Point &offset : print_object.copies()) { + for (const PrintInstance &instance : print_object.instances()) { BoundingBoxf bbox_translated(bbox_this); - bbox_translated.translate(unscale(offset)); + bbox_translated.translate(unscale(instance.shift)); bbox.merge(bbox_translated); } } diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp new file mode 100644 index 0000000000..db31f8f67f --- /dev/null +++ b/src/libslic3r/GCode/SeamPlacer.cpp @@ -0,0 +1,672 @@ +#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" + +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::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().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 polygon_angles_at_vertices(const Polygon &polygon, const std::vector &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 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_last_seam_position.clear(); + m_seam_history.clear(); + + for (const PrintObject* po : print.objects()) { + po->project_and_append_custom_facets(true, EnforcerBlockerType::ENFORCER, m_enforcers); + po->project_and_append_custom_facets(true, EnforcerBlockerType::BLOCKER, m_blockers); + } + const std::vector& nozzle_dmrs = print.config().nozzle_diameter.values; + float max_nozzle_dmr = *std::max_element(nozzle_dmrs.begin(), nozzle_dmrs.end()); + for (ExPolygons& explgs : m_enforcers) + explgs = Slic3r::offset_ex(explgs, scale_(max_nozzle_dmr)); + for (ExPolygons& explgs : m_blockers) + explgs = Slic3r::offset_ex(explgs, scale_(max_nozzle_dmr)); +} + + + +Point SeamPlacer::get_seam(const size_t layer_idx, 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); + + if (this->is_custom_seam_on_layer(layer_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 pos = m_seam_history.get_last_seam(po, layer_idx, polygon_bb); + if (pos.has_value()) { + //last_pos = m_last_seam_position[po]; + last_pos = *pos; + last_pos_weight = is_custom_enforcer_on_layer(layer_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 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 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, 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)) { + // 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 (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 (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. + //FIXME This works correctly for inner contours first only. + last_pos = this->get_random_seam(layer_idx, polygon); + } + if (loop.role() == erExternalPerimeter && is_custom_seam_on_layer(layer_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, &saw_custom); + if (saw_custom) + last_pos = candidate; + } + return last_pos; + } +} + + +Point SeamPlacer::get_random_seam(size_t layer_idx, const Polygon& polygon, + bool* saw_custom) const +{ + // Parametrize the polygon by its length. + std::vector lengths = polygon.parameter_by_length(); + + // Which of the points are inside enforcers/blockers? + std::vector enforcers_idxs; + std::vector blockers_idxs; + this->get_enforcers_and_blockers(layer_idx, polygon, 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; + + // FIXME FIXME FIXME: This is just to test the outcome and whether it is + // reasonable. The algorithm should really sum the length of all available + // pieces, get a random length and find the respective point. + float rand_len = 0.f; + size_t pt_idx = 0; + do { + rand_len = lengths.back() * (rand()/float(RAND_MAX)); + auto it = std::lower_bound(lengths.begin(), lengths.end(), rand_len); + pt_idx = it == lengths.end() ? 0 : (it-lengths.begin()-1); + + // If there are blockers and the point is inside, repeat. + // If there are enforcers and the point is NOT inside, repeat. + } while ((has_blockers && std::binary_search(blockers_idxs.begin(), blockers_idxs.end(), pt_idx)) + || (has_enforcers && ! std::binary_search(enforcers_idxs.begin(), enforcers_idxs.end(), pt_idx))); + + if (! has_enforcers && ! has_blockers) { + // The polygon may be too coarse, calculate the point exactly. + 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, + std::vector& enforcers_idxs, + std::vector& blockers_idxs) const +{ + enforcers_idxs.clear(); + blockers_idxs.clear(); + + // FIXME: This is quadratic and it should be improved, maybe by building + // an AABB tree (or at least utilize bounding boxes). + for (size_t i=0; i find_enforcer_centers(const Polygon& polygon, + const std::vector& lengths, + const std::vector& enforcers_idxs) +{ + std::vector 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 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, + std::vector& penalties, + const std::vector& lengths, + int layer_id, SeamPosition seam_position) const +{ + if (! is_custom_seam_on_layer(layer_id)) + return; + + std::vector enforcers_idxs; + std::vector blockers_idxs; + this->get_enforcers_and_blockers(layer_id, polygon, 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 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_(20.); +// SVG svg("custom_seam" + os.str() + ".svg", BoundingBox(Point(-a, -a), Point(a, a))); +// /*if (! m_enforcers.empty()) +// svg.draw(m_enforcers[layer_id], "blue"); +// if (! m_blockers.empty()) +// svg.draw(m_blockers[layer_id], "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 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 out; + + auto seams_it = m_data_last_layer.find(po); + if (seams_it == m_data_last_layer.end()) + return out; + + const std::vector& 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::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 0000000000..e603b7d57b --- /dev/null +++ b/src/libslic3r/GCode/SeamPlacer.hpp @@ -0,0 +1,89 @@ +#ifndef libslic3r_SeamPlacer_hpp_ +#define libslic3r_SeamPlacer_hpp_ + +#include + +#include "libslic3r/ExPolygon.hpp" +#include "libslic3r/PrintConfig.hpp" +#include "libslic3r/BoundingBox.hpp" + +namespace Slic3r { + +class PrintObject; +class ExtrusionLoop; +class Print; +namespace EdgeGrid { class Grid; } + + +class SeamHistory { +public: + SeamHistory() { clear(); } + std::optional 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> m_data_last_layer; + std::map> m_data_this_layer; + size_t m_layer_id; +}; + + + +class SeamPlacer { +public: + void init(const Print& print); + + Point get_seam(const size_t layer_idx, 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); + +private: + std::vector m_enforcers; + std::vector m_blockers; + + //std::map 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, + std::vector& enforcers_idxs, + std::vector& blockers_idxs) const; + + // Apply penalties to points inside enforcers/blockers. + void apply_custom_seam(const Polygon& polygon, + std::vector& penalties, + const std::vector& 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, + bool* saw_custom = nullptr) const; + + // Is there any enforcer/blocker on this layer? + bool is_custom_seam_on_layer(size_t layer_id) const { + return is_custom_enforcer_on_layer(layer_id) + || is_custom_blocker_on_layer(layer_id); + } + + bool is_custom_enforcer_on_layer(size_t layer_id) const { + return (! m_enforcers.empty() && ! m_enforcers[layer_id].empty()); + } + + bool is_custom_blocker_on_layer(size_t layer_id) const { + return (! m_blockers.empty() && ! m_blockers[layer_id].empty()); + } +}; + + +} + +#endif // libslic3r_SeamPlacer_hpp_ diff --git a/src/libslic3r/GCode/SpiralVase.cpp b/src/libslic3r/GCode/SpiralVase.cpp index a4ae42b318..a3c190069e 100644 --- a/src/libslic3r/GCode/SpiralVase.cpp +++ b/src/libslic3r/GCode/SpiralVase.cpp @@ -16,8 +16,8 @@ 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) { - this->_reader.parse_buffer(gcode); + if (! this->enable) { + m_reader.parse_buffer(gcode); return gcode; } @@ -29,7 +29,7 @@ std::string SpiralVase::process_layer(const std::string &gcode) { //FIXME Performance warning: This copies the GCodeConfig of the reader. - GCodeReader r = this->_reader; // clone + GCodeReader r = m_reader; // clone 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,7 @@ std::string SpiralVase::process_layer(const std::string &gcode) z -= layer_height; std::string new_gcode; - this->_reader.parse_buffer(gcode, [&new_gcode, &z, &layer_height, &total_layer_length] + m_reader.parse_buffer(gcode, [&new_gcode, &z, &layer_height, &total_layer_length] (GCodeReader &reader, GCodeReader::GCodeLine line) { if (line.cmd_is("G1")) { if (line.has_z()) { diff --git a/src/libslic3r/GCode/SpiralVase.hpp b/src/libslic3r/GCode/SpiralVase.hpp index e35ca640c3..496c1425c5 100644 --- a/src/libslic3r/GCode/SpiralVase.hpp +++ b/src/libslic3r/GCode/SpiralVase.hpp @@ -7,20 +7,19 @@ namespace Slic3r { class SpiralVase { - public: - bool enable; +public: + bool enable = false; - SpiralVase(const PrintConfig &config) - : enable(false), _config(&config) + SpiralVase(const PrintConfig &config) : m_config(&config) { - this->_reader.z() = (float)this->_config->z_offset; - this->_reader.apply_config(*this->_config); + m_reader.z() = (float)m_config->z_offset; + m_reader.apply_config(*m_config); }; std::string process_layer(const std::string &gcode); - private: - const PrintConfig* _config; - GCodeReader _reader; +private: + const PrintConfig *m_config; + GCodeReader m_reader; }; } diff --git a/src/libslic3r/GCode/ThumbnailData.cpp b/src/libslic3r/GCode/ThumbnailData.cpp index 80165916b5..a5941bff16 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 9823ffd31a..2a302ed855 100644 --- a/src/libslic3r/GCode/ThumbnailData.hpp +++ b/src/libslic3r/GCode/ThumbnailData.hpp @@ -1,9 +1,8 @@ #ifndef slic3r_ThumbnailData_hpp_ #define slic3r_ThumbnailData_hpp_ -#if ENABLE_THUMBNAIL_GENERATOR - #include +#include "libslic3r/Point.hpp" namespace Slic3r { @@ -20,8 +19,9 @@ struct ThumbnailData bool is_valid() const; }; +typedef std::vector ThumbnailsList; +typedef std::function ThumbnailsGeneratorCallback; + } // 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 b7d1d57dfa..74f061e4ea 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 @@ -13,13 +14,16 @@ #include #include +#include + + namespace Slic3r { // Returns true in case that extruder a comes before b (b does not have to be present). False otherwise. bool LayerTools::is_extruder_order(unsigned int a, unsigned int b) const { - if (a==b) + if (a == b) return false; for (auto extruder : extruders) { @@ -32,6 +36,39 @@ bool LayerTools::is_extruder_order(unsigned int a, unsigned int b) const return false; } +// Return a zero based extruder from the region, or extruder_override if overriden. +unsigned int LayerTools::perimeter_extruder(const PrintRegion ®ion) const +{ + assert(region.config().perimeter_extruder.value > 0); + return ((this->extruder_override == 0) ? region.config().perimeter_extruder.value : this->extruder_override) - 1; +} + +unsigned int LayerTools::infill_extruder(const PrintRegion ®ion) const +{ + assert(region.config().infill_extruder.value > 0); + return ((this->extruder_override == 0) ? region.config().infill_extruder.value : this->extruder_override) - 1; +} + +unsigned int LayerTools::solid_infill_extruder(const PrintRegion ®ion) const +{ + assert(region.config().solid_infill_extruder.value > 0); + return ((this->extruder_override == 0) ? region.config().solid_infill_extruder.value : this->extruder_override) - 1; +} + +// Returns a zero based extruder this eec should be printed with, according to PrintRegion config or extruder_override if overriden. +unsigned int LayerTools::extruder(const ExtrusionEntityCollection &extrusions, const PrintRegion ®ion) const +{ + assert(region.config().perimeter_extruder.value > 0); + assert(region.config().infill_extruder.value > 0); + assert(region.config().solid_infill_extruder.value > 0); + // 1 based extruder ID. + unsigned int extruder = ((this->extruder_override == 0) ? + (is_infill(extrusions.role()) ? + (is_solid_infill(extrusions.entities.front()->role()) ? region.config().solid_infill_extruder : region.config().infill_extruder) : + region.config().perimeter_extruder.value) : + this->extruder_override); + return (extruder == 0) ? 0 : extruder - 1; +} // For the use case when each object is printed separately // (print.config().complete_objects is true). @@ -52,12 +89,12 @@ ToolOrdering::ToolOrdering(const PrintObject &object, unsigned int first_extrude } // Collect extruders reuqired to print the layers. - this->collect_extruders(object); + this->collect_extruders(object, std::vector>()); // 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); } @@ -70,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 zs; for (auto object : print.objects()) { @@ -85,18 +123,31 @@ 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); } + // Use the extruder switches from Model::custom_gcode_per_print_z to override the extruder to print the object. + // Do it only if all the objects were configured to be printed with a single extruder. + std::vector> per_layer_extruder_switches; + if (auto num_extruders = unsigned(print.config().nozzle_diameter.size()); + num_extruders > 1 && print.object_extruders().size() == 1 && // the current Print's configuration is CustomGCode::MultiAsSingle + print.model().custom_gcode_per_print_z.mode == CustomGCode::MultiAsSingle) { + // Printing a single extruder platter on a printer with more than 1 extruder (or single-extruder multi-material). + // There may be custom per-layer tool changes available at the model. + per_layer_extruder_switches = custom_tool_changes(print.model().custom_gcode_per_print_z, num_extruders); + } + // Collect extruders reuqired to print the layers. for (auto object : print.objects()) - this->collect_extruders(*object); + this->collect_extruders(*object, per_layer_extruder_switches); // 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); } @@ -111,13 +162,13 @@ void ToolOrdering::initialize_layers(std::vector &zs) coordf_t zmax = zs[i] + EPSILON; for (; j < zs.size() && zs[j] <= zmax; ++ j) ; // Assign an average print_z to the set of layers with nearly equal print_z. - m_layer_tools.emplace_back(LayerTools(0.5 * (zs[i] + zs[j-1]), m_print_config_ptr)); + m_layer_tools.emplace_back(LayerTools(0.5 * (zs[i] + zs[j-1]))); i = j; } } // Collect extruders reuqired to print layers. -void ToolOrdering::collect_extruders(const PrintObject &object) +void ToolOrdering::collect_extruders(const PrintObject &object, const std::vector> &per_layer_extruder_switches) { // Collect the support extruders. for (auto support_layer : object.support_layers()) { @@ -134,9 +185,23 @@ void ToolOrdering::collect_extruders(const PrintObject &object) if (has_support || has_interface) layer_tools.has_support = true; } + + // Extruder overrides are ordered by print_z. + std::vector>::const_iterator it_per_layer_extruder_override; + it_per_layer_extruder_override = per_layer_extruder_switches.begin(); + unsigned int extruder_override = 0; + // Collect the object extruders. for (auto layer : object.layers()) { LayerTools &layer_tools = this->tools_for_layer(layer->print_z); + + // Override extruder with the next + for (; it_per_layer_extruder_override != per_layer_extruder_switches.end() && it_per_layer_extruder_override->first < layer->print_z + EPSILON; ++ it_per_layer_extruder_override) + extruder_override = (int)it_per_layer_extruder_override->second; + + // Store the current extruder override (set to zero if no overriden), so that layer_tools.wiping_extrusions().is_overridable_and_mark() will use it. + layer_tools.extruder_override = extruder_override; + // What extruders are required to print this object layer? for (size_t region_id = 0; region_id < object.region_volumes.size(); ++ region_id) { const LayerRegion *layerm = (region_id < layer->regions().size()) ? layer->regions()[region_id] : nullptr; @@ -150,19 +215,16 @@ void ToolOrdering::collect_extruders(const PrintObject &object) if (m_print_config_ptr) { // in this case complete_objects is false (see ToolOrdering constructors) something_nonoverriddable = false; for (const auto& eec : layerm->perimeters.entities) // let's check if there are nonoverriddable entities - if (!layer_tools.wiping_extrusions().is_overriddable(dynamic_cast(*eec), *m_print_config_ptr, object, region)) { + if (!layer_tools.wiping_extrusions().is_overriddable_and_mark(dynamic_cast(*eec), *m_print_config_ptr, object, region)) something_nonoverriddable = true; - break; - } } if (something_nonoverriddable) - layer_tools.extruders.push_back(region.config().perimeter_extruder.value); + layer_tools.extruders.emplace_back((extruder_override == 0) ? region.config().perimeter_extruder.value : extruder_override); layer_tools.has_object = true; } - bool has_infill = false; bool has_solid_infill = false; bool something_nonoverriddable = false; @@ -176,17 +238,19 @@ void ToolOrdering::collect_extruders(const PrintObject &object) has_infill = true; if (m_print_config_ptr) { - if (!something_nonoverriddable && !layer_tools.wiping_extrusions().is_overriddable(*fill, *m_print_config_ptr, object, region)) + if (! layer_tools.wiping_extrusions().is_overriddable_and_mark(*fill, *m_print_config_ptr, object, region)) something_nonoverriddable = true; } } - if (something_nonoverriddable || !m_print_config_ptr) - { - if (has_solid_infill) - layer_tools.extruders.push_back(region.config().solid_infill_extruder); - if (has_infill) - layer_tools.extruders.push_back(region.config().infill_extruder); + if (something_nonoverriddable || !m_print_config_ptr) { + if (extruder_override == 0) { + if (has_solid_infill) + layer_tools.extruders.emplace_back(region.config().solid_infill_extruder); + if (has_infill) + layer_tools.extruders.emplace_back(region.config().infill_extruder); + } else if (has_solid_infill || has_infill) + layer_tools.extruders.emplace_back(extruder_override); } if (has_solid_infill || has_infill) layer_tools.has_object = true; @@ -199,7 +263,7 @@ void ToolOrdering::collect_extruders(const PrintObject &object) // make sure that there are some tools for each object layer (e.g. tall wiping object will result in empty extruders vector) if (layer.extruders.empty() && layer.has_object) - layer.extruders.push_back(0); // 0="dontcare" extruder - it will be taken care of in reorder_extruders + layer.extruders.emplace_back(0); // 0="dontcare" extruder - it will be taken care of in reorder_extruders } } @@ -254,12 +318,10 @@ void ToolOrdering::reorder_extruders(unsigned int last_extruder_id) for (unsigned int &extruder_id : lt.extruders) { assert(extruder_id > 0); -- 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; @@ -292,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 < = m_layer_tools[i]; const LayerTools <_next = m_layer_tools[i + 1]; @@ -345,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; } @@ -394,17 +460,91 @@ void ToolOrdering::collect_extruder_statistics(bool prime_multi_material) } } +// Assign a pointer to a custom G-code to the respective ToolOrdering::LayerTools. +// Ignore color changes, which are performed on a layer and for such an extruder, that the extruder will not be printing above that layer. +// If multiple events are planned over a span of a single layer, use the last one. +void ToolOrdering::assign_custom_gcodes(const Print &print) +{ + // Only valid for non-sequential print. + assert(! print.config().complete_objects.value); + const CustomGCode::Info &custom_gcode_per_print_z = print.model().custom_gcode_per_print_z; + if (custom_gcode_per_print_z.gcodes.empty()) + return; + + auto num_extruders = unsigned(print.config().nozzle_diameter.size()); + CustomGCode::Mode mode = + (num_extruders == 1) ? CustomGCode::SingleExtruder : + print.object_extruders().size() == 1 ? CustomGCode::MultiAsSingle : CustomGCode::MultiExtruder; + CustomGCode::Mode model_mode = print.model().custom_gcode_per_print_z.mode; + std::vector extruder_printing_above(num_extruders, false); + auto custom_gcode_it = custom_gcode_per_print_z.gcodes.rbegin(); + // Tool changes and color changes will be ignored, if the model's tool/color changes were entered in mm mode and the print is in non mm mode + // or vice versa. + bool ignore_tool_and_color_changes = (mode == CustomGCode::MultiExtruder) != (model_mode == CustomGCode::MultiExtruder); + // If printing on a single extruder machine, make the tool changes trigger color change (M600) events. + bool tool_changes_as_color_changes = mode == CustomGCode::SingleExtruder && model_mode == CustomGCode::MultiAsSingle; + + // From the last layer to the first one: + for (auto it_lt = m_layer_tools.rbegin(); it_lt != m_layer_tools.rend(); ++ it_lt) { + LayerTools < = *it_lt; + // Add the extruders of the current layer to the set of extruders printing at and above this print_z. + 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->type == CustomGCode::ToolChange); ++ custom_gcode_it); + if (custom_gcode_it == custom_gcode_per_print_z.gcodes.rend()) + // Custom G-codes were processed. + break; + // Some custom G-code is configured for this layer or a layer below. + const CustomGCode::Item &custom_gcode = *custom_gcode_it; + // print_z of the layer below the current layer. + coordf_t print_z_below = 0.; + if (auto it_lt_below = it_lt; ++ it_lt_below != m_layer_tools.rend()) + 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.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. + (color_change ? + mode == CustomGCode::SingleExtruder || + (custom_gcode.extruder <= int(num_extruders) && extruder_printing_above[unsigned(custom_gcode.extruder - 1)]) : + tool_change && tool_changes_as_color_changes); + if (pause_or_custom_gcode || apply_color_change) + lt.custom_gcode = &custom_gcode; + // Consume that custom G-code event. + ++ custom_gcode_it; + } + } +} + +const LayerTools& ToolOrdering::tools_for_layer(coordf_t print_z) const +{ + auto it_layer_tools = std::lower_bound(m_layer_tools.begin(), m_layer_tools.end(), LayerTools(print_z - EPSILON)); + assert(it_layer_tools != m_layer_tools.end()); + coordf_t dist_min = std::abs(it_layer_tools->print_z - print_z); + for (++ it_layer_tools; it_layer_tools != m_layer_tools.end(); ++ it_layer_tools) { + coordf_t d = std::abs(it_layer_tools->print_z - print_z); + if (d >= dist_min) + break; + dist_min = d; + } + -- it_layer_tools; + assert(dist_min < EPSILON); + return *it_layer_tools; +} // This function is called from Print::mark_wiping_extrusions and sets extruder this entity should be printed with (-1 .. as usual) -void WipingExtrusions::set_extruder_override(const ExtrusionEntity* entity, unsigned int copy_id, int extruder, unsigned int num_of_copies) +void WipingExtrusions::set_extruder_override(const ExtrusionEntity* entity, size_t copy_id, int extruder, size_t num_of_copies) { something_overridden = true; - auto entity_map_it = (entity_map.insert(std::make_pair(entity, std::vector()))).first; // (add and) return iterator - auto& copies_vector = entity_map_it->second; - if (copies_vector.size() < num_of_copies) - copies_vector.resize(num_of_copies, -1); + auto entity_map_it = (entity_map.emplace(entity, ExtruderPerCopy())).first; // (add and) return iterator + ExtruderPerCopy& copies_vector = entity_map_it->second; + copies_vector.resize(num_of_copies, -1); if (copies_vector[copy_id] != -1) std::cout << "ERROR: Entity extruder overriden multiple times!!!\n"; // A debugging message - this must never happen. @@ -412,7 +552,6 @@ void WipingExtrusions::set_extruder_override(const ExtrusionEntity* entity, unsi copies_vector[copy_id] = extruder; } - // Finds first non-soluble extruder on the layer int WipingExtrusions::first_nonsoluble_extruder_on_layer(const PrintConfig& print_config) const { @@ -435,11 +574,10 @@ int WipingExtrusions::last_nonsoluble_extruder_on_layer(const PrintConfig& print return (-1); } - // Decides whether this entity could be overridden bool WipingExtrusions::is_overriddable(const ExtrusionEntityCollection& eec, const PrintConfig& print_config, const PrintObject& object, const PrintRegion& region) const { - if (print_config.filament_soluble.get_at(Print::get_extruder(eec, region))) + if (print_config.filament_soluble.get_at(m_layer_tools->extruder(eec, region))) return false; if (object.config().wipe_into_objects) @@ -451,7 +589,6 @@ bool WipingExtrusions::is_overriddable(const ExtrusionEntityCollection& eec, con return true; } - // Following function iterates through all extrusions on the layer, remembers those that could be used for wiping after toolchange // and returns volume that is left to be wiped on the wipe tower. float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int old_extruder, unsigned int new_extruder, float volume_to_wipe) @@ -459,8 +596,8 @@ float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int const LayerTools& lt = *m_layer_tools; const float min_infill_volume = 0.f; // ignore infill with smaller volume than this - if (print.config().filament_soluble.get_at(old_extruder) || print.config().filament_soluble.get_at(new_extruder)) - return volume_to_wipe; // Soluble filament cannot be wiped in a random infill, neither the filament after it + if (! this->something_overridable || volume_to_wipe <= 0. || print.config().filament_soluble.get_at(old_extruder) || print.config().filament_soluble.get_at(new_extruder)) + return std::max(0.f, volume_to_wipe); // Soluble filament cannot be wiped in a random infill, neither the filament after it // we will sort objects so that dedicated for wiping are at the beginning: PrintObjectPtrs object_list = print.objects(); @@ -483,13 +620,13 @@ float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int const PrintObject* object = object_list[i]; // Finds this layer: - auto this_layer_it = std::find_if(object->layers().begin(), object->layers().end(), [<](const Layer* lay) { return std::abs(lt.print_z - lay->print_z)layers().end()) - continue; - const Layer* this_layer = *this_layer_it; - size_t num_of_copies = object->copies().size(); + const Layer* this_layer = object->get_layer_at_printz(lt.print_z, EPSILON); + if (this_layer == nullptr) + continue; + size_t num_of_copies = object->instances().size(); - for (unsigned int copy = 0; copy < num_of_copies; ++copy) { // iterate through copies first, so that we mark neighbouring infills to minimize travel moves + // iterate through copies (aka PrintObject instances) first, so that we mark neighbouring infills to minimize travel moves + for (unsigned int copy = 0; copy < num_of_copies; ++copy) { for (size_t region_id = 0; region_id < object->region_volumes.size(); ++ region_id) { const auto& region = *object->print()->regions()[region_id]; @@ -497,51 +634,48 @@ float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int if (!region.config().wipe_into_infill && !object->config().wipe_into_objects) continue; - - if ((!print.config().infill_first ? perimeters_done : !perimeters_done) || (!object->config().wipe_into_objects && region.config().wipe_into_infill)) { + bool wipe_into_infill_only = ! object->config().wipe_into_objects && region.config().wipe_into_infill; + if (print.config().infill_first != perimeters_done || wipe_into_infill_only) { for (const ExtrusionEntity* ee : this_layer->regions()[region_id]->fills.entities) { // iterate through all infill Collections auto* fill = dynamic_cast(ee); if (!is_overriddable(*fill, print.config(), *object, region)) continue; - if (volume_to_wipe<=0) - continue; - - if (!object->config().wipe_into_objects && !print.config().infill_first && region.config().wipe_into_infill) + if (wipe_into_infill_only && ! print.config().infill_first) // In this case we must check that the original extruder is used on this layer before the one we are overridding // (and the perimeters will be finished before the infill is printed): - if (!lt.is_extruder_order(region.config().perimeter_extruder - 1, new_extruder)) + if (!lt.is_extruder_order(lt.perimeter_extruder(region), new_extruder)) continue; if ((!is_entity_overridden(fill, copy) && fill->total_volume() > min_infill_volume)) { // this infill will be used to wipe this extruder set_extruder_override(fill, copy, new_extruder, num_of_copies); - volume_to_wipe -= float(fill->total_volume()); + if ((volume_to_wipe -= float(fill->total_volume())) <= 0.f) + // More material was purged already than asked for. + return 0.f; } } } // Now the same for perimeters - see comments above for explanation: - if (object->config().wipe_into_objects && (print.config().infill_first ? perimeters_done : !perimeters_done)) + if (object->config().wipe_into_objects && print.config().infill_first == perimeters_done) { for (const ExtrusionEntity* ee : this_layer->regions()[region_id]->perimeters.entities) { auto* fill = dynamic_cast(ee); - if (!is_overriddable(*fill, print.config(), *object, region)) - continue; - - if (volume_to_wipe<=0) - continue; - - if ((!is_entity_overridden(fill, copy) && fill->total_volume() > min_infill_volume)) { + if (is_overriddable(*fill, print.config(), *object, region) && !is_entity_overridden(fill, copy) && fill->total_volume() > min_infill_volume) { set_extruder_override(fill, copy, new_extruder, num_of_copies); - volume_to_wipe -= float(fill->total_volume()); + if ((volume_to_wipe -= float(fill->total_volume())) <= 0.f) + // More material was purged already than asked for. + return 0.f; } } } } } } - return std::max(0.f, volume_to_wipe); + // Some purge remains to be done on the Wipe Tower. + assert(volume_to_wipe > 0.); + return volume_to_wipe; } @@ -552,17 +686,19 @@ float WipingExtrusions::mark_wiping_extrusions(const Print& print, unsigned int // them again and make sure we override it. void WipingExtrusions::ensure_perimeters_infills_order(const Print& print) { + if (! this->something_overridable) + return; + const LayerTools& lt = *m_layer_tools; unsigned int first_nonsoluble_extruder = first_nonsoluble_extruder_on_layer(print.config()); unsigned int last_nonsoluble_extruder = last_nonsoluble_extruder_on_layer(print.config()); for (const PrintObject* object : print.objects()) { // Finds this layer: - auto this_layer_it = std::find_if(object->layers().begin(), object->layers().end(), [<](const Layer* lay) { return std::abs(lt.print_z - lay->print_z)layers().end()) - continue; - const Layer* this_layer = *this_layer_it; - size_t num_of_copies = object->copies().size(); + const Layer* this_layer = object->get_layer_at_printz(lt.print_z, EPSILON); + if (this_layer == nullptr) + continue; + size_t num_of_copies = object->instances().size(); for (size_t copy = 0; copy < num_of_copies; ++copy) { // iterate through copies first, so that we mark neighbouring infills to minimize travel moves for (size_t region_id = 0; region_id < object->region_volumes.size(); ++ region_id) { @@ -584,9 +720,8 @@ void WipingExtrusions::ensure_perimeters_infills_order(const Print& print) // Either way, we will now force-override it with something suitable: if (print.config().infill_first || object->config().wipe_into_objects // in this case the perimeter is overridden, so we can override by the last one safely - || lt.is_extruder_order(region.config().perimeter_extruder - 1, last_nonsoluble_extruder // !infill_first, but perimeter is already printed when last extruder prints - || std::find(lt.extruders.begin(), lt.extruders.end(), region.config().infill_extruder - 1) == lt.extruders.end()) // we have to force override - this could violate infill_first (FIXME) - ) + || lt.is_extruder_order(lt.perimeter_extruder(region), last_nonsoluble_extruder // !infill_first, but perimeter is already printed when last extruder prints + || ! lt.has_extruder(lt.infill_extruder(region)))) // we have to force override - this could violate infill_first (FIXME) set_extruder_override(fill, copy, (print.config().infill_first ? first_nonsoluble_extruder : last_nonsoluble_extruder), num_of_copies); else { // In this case we can (and should) leave it to be printed normally. @@ -597,42 +732,31 @@ void WipingExtrusions::ensure_perimeters_infills_order(const Print& print) // Now the same for perimeters - see comments above for explanation: for (const ExtrusionEntity* ee : this_layer->regions()[region_id]->perimeters.entities) { // iterate through all perimeter Collections auto* fill = dynamic_cast(ee); - if (!is_overriddable(*fill, print.config(), *object, region) - || is_entity_overridden(fill, copy) ) - continue; - - set_extruder_override(fill, copy, (print.config().infill_first ? last_nonsoluble_extruder : first_nonsoluble_extruder), num_of_copies); + if (is_overriddable(*fill, print.config(), *object, region) && ! is_entity_overridden(fill, copy)) + set_extruder_override(fill, copy, (print.config().infill_first ? last_nonsoluble_extruder : first_nonsoluble_extruder), num_of_copies); } } } } } - - - - - - -// Following function is called from process_layer and returns pointer to vector with information about which extruders should be used for given copy of this entity. -// It first makes sure the pointer is valid (creates the vector if it does not exist) and contains a record for each copy -// It also modifies the vector in place and changes all -1 to correct_extruder_id (at the time the overrides were created, correct extruders were not known, -// so -1 was used as "print as usual". -// The resulting vector has to keep track of which extrusions are the ones that were overridden and which were not. In the extruder is used as overridden, -// its number is saved as it is (zero-based index). Usual extrusions are saved as -number-1 (unfortunately there is no negative zero). -const std::vector* WipingExtrusions::get_extruder_overrides(const ExtrusionEntity* entity, int correct_extruder_id, size_t num_of_copies) +// Following function is called from GCode::process_layer and returns pointer to vector with information about which extruders should be used for given copy of this entity. +// If this extrusion does not have any override, nullptr is returned. +// Otherwise it modifies the vector in place and changes all -1 to correct_extruder_id (at the time the overrides were created, correct extruders were not known, +// so -1 was used as "print as usual"). +// The resulting vector therefore keeps track of which extrusions are the ones that were overridden and which were not. If the extruder used is overridden, +// its number is saved as is (zero-based index). Regular extrusions are saved as -number-1 (unfortunately there is no negative zero). +const WipingExtrusions::ExtruderPerCopy* WipingExtrusions::get_extruder_overrides(const ExtrusionEntity* entity, int correct_extruder_id, size_t num_of_copies) { + ExtruderPerCopy *overrides = nullptr; auto entity_map_it = entity_map.find(entity); - if (entity_map_it == entity_map.end()) - entity_map_it = (entity_map.insert(std::make_pair(entity, std::vector()))).first; - - // Now the entity_map_it should be valid, let's make sure the vector is long enough: - entity_map_it->second.resize(num_of_copies, -1); - - // Each -1 now means "print as usual" - we will replace it with actual extruder id (shifted it so we don't lose that information): - std::replace(entity_map_it->second.begin(), entity_map_it->second.end(), -1, -correct_extruder_id-1); - - return &(entity_map_it->second); + if (entity_map_it != entity_map.end()) { + overrides = &entity_map_it->second; + overrides->resize(num_of_copies, -1); + // Each -1 now means "print as usual" - we will replace it with actual extruder id (shifted it so we don't lose that information): + std::replace(overrides->begin(), overrides->end(), -1, -correct_extruder_id-1); + } + return overrides; } diff --git a/src/libslic3r/GCode/ToolOrdering.hpp b/src/libslic3r/GCode/ToolOrdering.hpp index 0d4b83ecbc..e2e07533fa 100644 --- a/src/libslic3r/GCode/ToolOrdering.hpp +++ b/src/libslic3r/GCode/ToolOrdering.hpp @@ -5,11 +5,17 @@ #include "../libslic3r.h" +#include + +#include + namespace Slic3r { class Print; class PrintObject; class LayerTools; +namespace CustomGCode { struct Item; } +class PrintRegion; @@ -23,8 +29,11 @@ public: return something_overridden; } + // When allocating extruder overrides of an object's ExtrusionEntity, overrides for maximum 3 copies are allocated in place. + typedef boost::container::small_vector ExtruderPerCopy; + // This is called from GCode::process_layer - see implementation for further comments: - const std::vector* get_extruder_overrides(const ExtrusionEntity* entity, int correct_extruder_id, size_t num_of_copies); + const ExtruderPerCopy* get_extruder_overrides(const ExtrusionEntity* entity, int correct_extruder_id, size_t num_of_copies); // This function goes through all infill entities, decides which ones will be used for wiping and // marks them by the extruder id. Returns volume that remains to be wiped on the wipe tower: @@ -33,6 +42,11 @@ public: void ensure_perimeters_infills_order(const Print& print); bool is_overriddable(const ExtrusionEntityCollection& ee, const PrintConfig& print_config, const PrintObject& object, const PrintRegion& region) const; + bool is_overriddable_and_mark(const ExtrusionEntityCollection& ee, const PrintConfig& print_config, const PrintObject& object, const PrintRegion& region) { + bool out = this->is_overriddable(ee, print_config, object, region); + this->something_overridable |= out; + return out; + } void set_layer_tools_ptr(const LayerTools* lt) { m_layer_tools = lt; } @@ -41,16 +55,18 @@ private: int last_nonsoluble_extruder_on_layer(const PrintConfig& print_config) const; // This function is called from mark_wiping_extrusions and sets extruder that it should be printed with (-1 .. as usual) - void set_extruder_override(const ExtrusionEntity* entity, unsigned int copy_id, int extruder, unsigned int num_of_copies); + void set_extruder_override(const ExtrusionEntity* entity, size_t copy_id, int extruder, size_t num_of_copies); // Returns true in case that entity is not printed with its usual extruder for a given copy: bool is_entity_overridden(const ExtrusionEntity* entity, size_t copy_id) const { - return (entity_map.find(entity) == entity_map.end() ? false : entity_map.at(entity).at(copy_id) != -1); + auto it = entity_map.find(entity); + return it == entity_map.end() ? false : it->second[copy_id] != -1; } - std::map> entity_map; // to keep track of who prints what + std::map 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 }; @@ -58,13 +74,7 @@ private: class LayerTools { public: - LayerTools(const coordf_t z, const PrintConfig* print_config_ptr = nullptr) : - print_z(z), - has_object(false), - has_support(false), - has_wipe_tower(false), - wipe_tower_partitions(0), - wipe_tower_layer_height(0.) {} + LayerTools(const coordf_t z) : print_z(z) {} // Changing these operators to epsilon version can make a problem in cases where support and object layers get close to each other. // In case someone tries to do it, make sure you know what you're doing and test it properly (slice multiple objects at once with supports). @@ -72,20 +82,33 @@ public: bool operator==(const LayerTools &rhs) const { return print_z == rhs.print_z; } bool is_extruder_order(unsigned int a, unsigned int b) const; + bool has_extruder(unsigned int extruder) const { return std::find(this->extruders.begin(), this->extruders.end(), extruder) != this->extruders.end(); } - coordf_t print_z; - bool has_object; - bool has_support; + // Return a zero based extruder from the region, or extruder_override if overriden. + unsigned int perimeter_extruder(const PrintRegion ®ion) const; + unsigned int infill_extruder(const PrintRegion ®ion) const; + unsigned int solid_infill_extruder(const PrintRegion ®ion) const; + // Returns a zero based extruder this eec should be printed with, according to PrintRegion config or extruder_override if overriden. + unsigned int extruder(const ExtrusionEntityCollection &extrusions, const PrintRegion ®ion) const; + + coordf_t print_z = 0.; + bool has_object = false; + bool has_support = false; // Zero based extruder IDs, ordered to minimize tool switches. std::vector extruders; + // If per layer extruder switches are inserted by the G-code preview slider, this value contains the new (1 based) extruder, with which the whole object layer is being printed with. + // If not overriden, it is set to 0. + unsigned int extruder_override = 0; // Will there be anything extruded on this layer for the wipe tower? // Due to the support layers possibly interleaving the object layers, // wipe tower will be disabled for some support only layers. - bool has_wipe_tower; + bool has_wipe_tower = false; // Number of wipe tower partitions to support the required number of tool switches // and to support the wipe tower partitions above this one. - size_t wipe_tower_partitions; - coordf_t wipe_tower_layer_height; + size_t wipe_tower_partitions = 0; + coordf_t wipe_tower_layer_height = 0.; + // Custom G-code (color change, extruder switch, pause) to be performed before this layer starts to print. + const CustomGCode::Item *custom_gcode = nullptr; WipingExtrusions& wiping_extrusions() { m_wiping_extrusions.set_layer_tools_ptr(this); @@ -106,14 +129,20 @@ public: // For the use case when each object is printed separately // (print.config.complete_objects is true). - ToolOrdering(const PrintObject &object, unsigned int first_extruder = (unsigned int)-1, bool prime_multi_material = false); + ToolOrdering(const PrintObject &object, unsigned int first_extruder, bool prime_multi_material = false); // For the use case when all objects are printed at once. // (print.config.complete_objects is false). - ToolOrdering(const Print &print, unsigned int first_extruder = (unsigned int)-1, bool prime_multi_material = false); + ToolOrdering(const Print &print, unsigned int first_extruder, bool prime_multi_material = false); void clear() { m_layer_tools.clear(); } + // Only valid for non-sequential print: + // Assign a pointer to a custom G-code to the respective ToolOrdering::LayerTools. + // Ignore color changes, which are performed on a layer and for such an extruder, that the extruder will not be printing above that layer. + // If multiple events are planned over a span of a single layer, use the last one. + void assign_custom_gcodes(const Print &print); + // Get the first extruder printing, including the extruder priming areas, returns -1 if there is no layer printed. unsigned int first_extruder() const { return m_first_printing_extruder; } @@ -123,25 +152,9 @@ public: // For a multi-material print, the printing extruders are ordered in the order they shall be primed. const std::vector& all_extruders() const { return m_all_printing_extruders; } - template static auto tools_for_layer(Self& self, coordf_t print_z) -> decltype (*self.m_layer_tools.begin()) - { - auto it_layer_tools = std::lower_bound(self.m_layer_tools.begin(), self.m_layer_tools.end(), LayerTools(print_z - EPSILON)); - assert(it_layer_tools != self.m_layer_tools.end()); - coordf_t dist_min = std::abs(it_layer_tools->print_z - print_z); - for (++ it_layer_tools; it_layer_tools != self.m_layer_tools.end(); ++it_layer_tools) { - coordf_t d = std::abs(it_layer_tools->print_z - print_z); - if (d >= dist_min) - break; - dist_min = d; - } - -- it_layer_tools; - assert(dist_min < EPSILON); - return *it_layer_tools; - } - // Find LayerTools with the closest print_z. - LayerTools& tools_for_layer(coordf_t print_z) { return tools_for_layer(*this, print_z); } - const LayerTools& tools_for_layer(coordf_t print_z) const { return tools_for_layer(*this, print_z); } + const LayerTools& tools_for_layer(coordf_t print_z) const; + LayerTools& tools_for_layer(coordf_t print_z) { return const_cast(std::as_const(*this).tools_for_layer(print_z)); } const LayerTools& front() const { return m_layer_tools.front(); } const LayerTools& back() const { return m_layer_tools.back(); } @@ -153,9 +166,9 @@ public: private: void initialize_layers(std::vector &zs); - void collect_extruders(const PrintObject &object); + void collect_extruders(const PrintObject &object, const std::vector> &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 m_layer_tools; @@ -166,7 +179,6 @@ private: // All extruders, which extrude some material over m_layer_tools. std::vector m_all_printing_extruders; - const PrintConfig* m_print_config_ptr = nullptr; }; diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp index cd326b9a0d..c70ef8ae09 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 -#include +#include #include #include #include -#include "Analyzer.hpp" +#include "GCodeProcessor.hpp" #include "BoundingBox.hpp" -#if defined(__linux) || defined(__GNUC__ ) -#include -#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,42 @@ 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_GCODE_VIEWER_DATA_CHECKING change_analyzer_line_width(line_width); +#endif // 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_GCODE_VIEWER_DATA_CHECKING + 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; + 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 +95,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 +147,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 +351,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 +393,26 @@ public: WipeTowerWriter& append(const std::string& text) { m_gcode += text; return *this; } + std::vector 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 m_wipe_path; float m_current_z; float m_current_feedrate; size_t m_current_tool; @@ -409,7 +428,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& m_filpar; @@ -465,6 +486,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>& 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), @@ -492,6 +534,9 @@ WipeTower::WipeTower(const PrintConfig& config, const std::vector& bed_points = config.bed_shape.values; m_bed_shape = (bed_points.size() == 4 ? RectangularBed : CircularBed); m_bed_width = float(BoundingBoxf(bed_points).size().x()); + m_bed_bottom_left = m_bed_shape == RectangularBed + ? Vec2f(bed_points.front().x(), bed_points.front().y()) + : Vec2f::Zero(); } @@ -566,6 +611,8 @@ std::vector WipeTower::prime( // In case of a circular bed, place it so it goes across the diameter and hope it will fit if (m_bed_shape == CircularBed) cleaning_box.translate(-m_bed_width/2 + m_bed_width * 0.03f, -m_bed_width * 0.12f); + if (m_bed_shape == RectangularBed) + cleaning_box.translate(m_bed_bottom_left); std::vector results; @@ -618,20 +665,6 @@ std::vector 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. @@ -645,6 +678,8 @@ std::vector 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 @@ -656,7 +691,7 @@ std::vector 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(); @@ -733,7 +768,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()); + } } } @@ -752,18 +789,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) @@ -796,13 +822,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"); @@ -816,18 +844,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); } @@ -845,8 +862,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_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_GCODE_VIEWER_DATA_CHECKING unsigned i = 0; // iterates through ramming_speed m_left_to_right = true; // current direction of ramming @@ -866,13 +887,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) { @@ -880,13 +894,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 ) ) { @@ -923,7 +930,9 @@ void WipeTower::toolchange_Unload( } } Vec2f end_of_ramming(writer.x(),writer.y()); +#if 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_GCODE_VIEWER_DATA_CHECKING // Retraction: float old_x = writer.x(); @@ -935,12 +944,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 @@ -1004,9 +1007,10 @@ void WipeTower::toolchange_Change( writer.append("[toolchange_gcode]\n"); // Travel to where we assume we are. Custom toolchange or some special T code handling (parking extruder etc) - // gcode could have left the extruder somewhere, we cannot just start extruding. - Vec2f current_pos = writer.pos_rotated(); - writer.append(std::string("G1 X") + std::to_string(current_pos.x()) + " Y" + std::to_string(current_pos.y()) + "\n"); + // gcode could have left the extruder somewhere, we cannot just start extruding. We should also inform the + // postprocessor that we absolutely want to have this in the gcode, even if it thought it is the same as before. + Vec2f current_pos = writer.pos_rotated(); + writer.append(std::string("G1 X") + std::to_string(current_pos.x()) + " Y" + std::to_string(current_pos.y()) + never_skip_tag() + "\n"); // The toolchange Tn command will be inserted later, only in case that the user does // not provide a custom toolchange gcode. @@ -1032,11 +1036,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*/ @@ -1106,11 +1105,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. @@ -1174,7 +1176,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); @@ -1193,10 +1196,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"); @@ -1210,18 +1216,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 @@ -1292,7 +1287,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); @@ -1354,7 +1349,7 @@ void WipeTower::generate(std::vector> & 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(); @@ -1368,6 +1363,7 @@ void WipeTower::generate(std::vector> & 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)); @@ -1403,4 +1399,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 3114900559..0f9b0b87d1 100644 --- a/src/libslic3r/GCode/WipeTower.hpp +++ b/src/libslic3r/GCode/WipeTower.hpp @@ -17,9 +17,12 @@ class PrintConfig; enum GCodeFlavor : unsigned char; + class WipeTower { public: + static const std::string never_skip_tag() { return "_GCODE_WIPE_TOWER_NEVER_SKIP_TAG"; } + struct Extrusion { Extrusion(const Vec2f &pos, float width, unsigned int tool) : pos(pos), width(width), tool(tool) {} @@ -54,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 wipe_path; + // Initial tool int initial_tool; @@ -74,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 ) @@ -96,6 +112,8 @@ public: + + // Switch to a next layer. void set_layer( // Print height of this layer. @@ -149,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. @@ -184,8 +202,6 @@ public: }; private: - WipeTower(); - enum wipe_shape // A fill-in direction { SHAPE_NORMAL = 1, @@ -231,6 +247,7 @@ private: CircularBed } m_bed_shape; float m_bed_width; // width of the bed bounding box + Vec2f m_bed_bottom_left; // bottom-left corner coordinates (for rectangular beds) float m_perimeter_width = 0.4f * Width_To_Nozzle_Ratio; // Width of an extrusion line, also a perimeter spacing for 100% infill. float m_extrusion_flow = 0.038f; //0.029f;// Extrusion flow is derived from m_perimeter_width, layer height and filament diameter. diff --git a/src/libslic3r/GCodeReader.cpp b/src/libslic3r/GCodeReader.cpp index cd1ff867bc..2ef238f105 100644 --- a/src/libslic3r/GCodeReader.cpp +++ b/src/libslic3r/GCodeReader.cpp @@ -1,6 +1,7 @@ #include "GCodeReader.hpp" #include #include +#include #include #include #include @@ -40,7 +41,7 @@ const char* GCodeReader::parse_line_internal(const char *ptr, GCodeLine &gline, if (is_end_of_gcode_line(*c)) break; // Check the name of the axis. - Axis axis = NUM_AXES; + Axis axis = NUM_AXES_WITH_UNKNOWN; switch (*c) { case 'X': axis = X; break; case 'Y': axis = Y; break; @@ -49,15 +50,19 @@ const char* GCodeReader::parse_line_internal(const char *ptr, GCodeLine &gline, default: if (*c == m_extrusion_axis) axis = E; + else if (*c >= 'A' && *c <= 'Z') + // Unknown axis, but we still want to remember that such a axis was seen. + axis = UNKNOWN_AXIS; break; } - if (axis != NUM_AXES) { + if (axis != NUM_AXES_WITH_UNKNOWN) { // Try to parse the numeric value. char *pend = nullptr; double v = strtod(++ c, &pend); if (pend != nullptr && is_end_of_word(*pend)) { // The axis value has been parsed correctly. - gline.m_axis[int(axis)] = float(v); + if (axis != UNKNOWN_AXIS) + gline.m_axis[int(axis)] = float(v); gline.m_mask |= 1 << int(axis); c = pend; } else @@ -109,9 +114,10 @@ void GCodeReader::update_coordinates(GCodeLine &gline, std::pairparse_line(line, callback); } diff --git a/src/libslic3r/GCodeReader.hpp b/src/libslic3r/GCodeReader.hpp index 24f9792675..d90a231608 100644 --- a/src/libslic3r/GCodeReader.hpp +++ b/src/libslic3r/GCodeReader.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include "PrintConfig.hpp" namespace Slic3r { @@ -17,13 +18,13 @@ public: GCodeLine() { reset(); } void reset() { m_mask = 0; memset(m_axis, 0, sizeof(m_axis)); m_raw.clear(); } - const std::string& raw() const { return m_raw; } - const std::string cmd() const { + const std::string& raw() const { return m_raw; } + const std::string_view cmd() const { const char *cmd = GCodeReader::skip_whitespaces(m_raw.c_str()); - return std::string(cmd, GCodeReader::skip_word(cmd)); + return std::string_view(cmd, GCodeReader::skip_word(cmd) - cmd); } - const std::string comment() const - { size_t pos = m_raw.find(';'); return (pos == std::string::npos) ? "" : m_raw.substr(pos + 1); } + const std::string_view comment() const + { size_t pos = m_raw.find(';'); return (pos == std::string::npos) ? std::string_view() : std::string_view(m_raw).substr(pos + 1); } bool has(Axis axis) const { return (m_mask & (1 << int(axis))) != 0; } float value(Axis axis) const { return m_axis[axis]; } @@ -58,6 +59,7 @@ public: bool has_z() const { return this->has(Z); } bool has_e() const { return this->has(E); } bool has_f() const { return this->has(F); } + bool has_unknown_axis() const { return this->has(UNKNOWN_AXIS); } float x() const { return m_axis[X]; } float y() const { return m_axis[Y]; } float z() const { return m_axis[Z]; } @@ -106,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]; } @@ -119,6 +122,7 @@ public: float f() const { return m_position[F]; } char extrusion_axis() const { return m_extrusion_axis; } + void set_extrusion_axis(char axis) { m_extrusion_axis = axis; } private: const char* parse_line_internal(const char *ptr, GCodeLine &gline, std::pair &command); @@ -143,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 0988091ce3..7bda299923 100644 --- a/src/libslic3r/GCodeSender.cpp +++ b/src/libslic3r/GCodeSender.cpp @@ -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 c624c0fce8..0000000000 --- a/src/libslic3r/GCodeTimeEstimator.cpp +++ /dev/null @@ -1,1641 +0,0 @@ -#include "GCodeTimeEstimator.hpp" -#include "Utils.hpp" -#include -#include - -#include - -#include -#include -#include - -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"; - - 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_color_times && (m_color_time_cache != 0.0f)) - m_color_times.push_back(m_color_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_color_times && (m_color_time_cache != 0.0f)) - m_color_times.push_back(m_color_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_color_times && (m_color_time_cache != 0.0f)) - m_color_times.push_back(m_color_time_cache); - -#if ENABLE_MOVE_STATS - _log_moves_stats(); -#endif // ENABLE_MOVE_STATS - } - - void GCodeTimeEstimator::calculate_time_from_lines(const std::vector& gcode_lines) - { - reset(); - - auto action = [this](GCodeReader &reader, const GCodeReader::GCodeLine &line) - { this->_process_gcode_line(reader, line); }; - for (const std::string& line : gcode_lines) - m_parser.parse_line(line, action); - _calculate_time(); - - if (m_needs_color_times && (m_color_time_cache != 0.0f)) - m_color_times.push_back(m_color_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 - if (gcode_line == "; " + Color_Change_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 &filament_load_times) - { - m_state.filament_load_times.clear(); - for (double t : filament_load_times) - m_state.filament_load_times.push_back((float)t); - } - - void GCodeTimeEstimator::set_filament_unload_times(const std::vector &filament_unload_times) - { - m_state.filament_unload_times.clear(); - for (double t : filament_unload_times) - m_state.filament_unload_times.push_back((float)t); - } - - float GCodeTimeEstimator::get_filament_load_time(unsigned int id_extruder) - { - return - (m_state.filament_load_times.empty() || id_extruder == m_state.extruder_id_unloaded) ? - 0 : - (m_state.filament_load_times.size() <= id_extruder) ? - m_state.filament_load_times.front() : - m_state.filament_load_times[id_extruder]; - } - - float GCodeTimeEstimator::get_filament_unload_time(unsigned int id_extruder) - { - return - (m_state.filament_unload_times.empty() || id_extruder == m_state.extruder_id_unloaded) ? - 0 : - (m_state.filament_unload_times.size() <= id_extruder) ? - m_state.filament_unload_times.front() : - m_state.filament_unload_times[id_extruder]; - } - - void GCodeTimeEstimator::set_extrude_factor_override_percentage(float percentage) - { - m_state.extrude_factor_override_percentage = percentage; - } - - float GCodeTimeEstimator::get_extrude_factor_override_percentage() const - { - return m_state.extrude_factor_override_percentage; - } - - void GCodeTimeEstimator::set_dialect(GCodeFlavor dialect) - { - m_state.dialect = dialect; - } - - GCodeFlavor GCodeTimeEstimator::get_dialect() const - { - PROFILE_FUNC(); - return m_state.dialect; - } - - void GCodeTimeEstimator::set_units(GCodeTimeEstimator::EUnits units) - { - m_state.units = units; - } - - GCodeTimeEstimator::EUnits GCodeTimeEstimator::get_units() const - { - return m_state.units; - } - - void GCodeTimeEstimator::set_global_positioning_type(GCodeTimeEstimator::EPositioningType type) - { - m_state.global_positioning_type = type; - } - - GCodeTimeEstimator::EPositioningType GCodeTimeEstimator::get_global_positioning_type() const - { - return m_state.global_positioning_type; - } - - void GCodeTimeEstimator::set_e_local_positioning_type(GCodeTimeEstimator::EPositioningType type) - { - m_state.e_local_positioning_type = type; - } - - GCodeTimeEstimator::EPositioningType GCodeTimeEstimator::get_e_local_positioning_type() const - { - return m_state.e_local_positioning_type; - } - - int GCodeTimeEstimator::get_g1_line_id() const - { - return m_state.g1_line_id; - } - - void GCodeTimeEstimator::increment_g1_line_id() - { - ++m_state.g1_line_id; - } - - void GCodeTimeEstimator::reset_g1_line_id() - { - m_state.g1_line_id = 0; - } - - void GCodeTimeEstimator::set_extruder_id(unsigned int id) - { - m_state.extruder_id = id; - } - - unsigned int GCodeTimeEstimator::get_extruder_id() const - { - return m_state.extruder_id; - } - - void GCodeTimeEstimator::reset_extruder_id() - { - // Set the initial extruder ID to unknown. For the multi-material setup it means - // that all the filaments are parked in the MMU and no filament is loaded yet. - m_state.extruder_id = m_state.extruder_id_unloaded; - } - - void GCodeTimeEstimator::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_minutes() const - { - return _get_time_minutes(get_time()); - } - - std::vector GCodeTimeEstimator::get_color_times() const - { - return m_color_times; - } - - std::vector GCodeTimeEstimator::get_color_times_dhms(bool include_remaining) const - { - std::vector ret; - float total_time = 0.0f; - for (float t : m_color_times) - { - std::string time = _get_time_dhms(t); - if (include_remaining) - { - time += " ("; - time += _get_time_dhms(m_time - total_time); - time += ")"; - } - total_time += t; - ret.push_back(time); - } - return ret; - } - - std::vector GCodeTimeEstimator::get_color_times_minutes(bool include_remaining) const - { - std::vector ret; - float total_time = 0.0f; - for (float t : m_color_times) - { - std::string time = _get_time_minutes(t); - if (include_remaining) - { - time += " ("; - time += _get_time_minutes(m_time - total_time); - time += ")"; - } - total_time += t; - } - 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_color_times = false; - m_color_times.clear(); - m_color_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_color_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_color_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()) - { - set_axis_origin(E, get_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_color_change_tag(); - return true; - } - - return false; - } - - void GCodeTimeEstimator::_process_color_change_tag() - { - PROFILE_FUNC(); - m_needs_color_times = true; - _calculate_time(); - if (m_color_time_cache != 0.0f) - { - m_color_times.push_back(m_color_time_cache); - m_color_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_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 0219c87d1e..0000000000 --- a/src/libslic3r/GCodeTimeEstimator.hpp +++ /dev/null @@ -1,485 +0,0 @@ -#ifndef slic3r_GCodeTimeEstimator_hpp_ -#define slic3r_GCodeTimeEstimator_hpp_ - -#include "libslic3r.h" -#include "PrintConfig.hpp" -#include "GCodeReader.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; - - 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 filament_load_times; - std::vector filament_unload_times; - unsigned int g1_line_id; - // extruder_id is currently used to correctly calculate filament load / unload times - // into the total print time. This is currently only really used by the MK3 MMU2: - // Extruder id (-1) means no filament is loaded yet, all the filaments are parked in the MK3 MMU2 unit. - static const unsigned int extruder_id_unloaded = (unsigned int)-1; - unsigned int extruder_id; - }; - - public: - struct Block - { -#if ENABLE_MOVE_STATS - enum EMoveType : unsigned char - { - Noop, - Retract, - Unretract, - Tool_change, - Move, - Extrude, - Num_Types - }; -#endif // ENABLE_MOVE_STATS - - struct FeedrateProfile - { - float entry; // mm/s - float cruise; // mm/s - float exit; // mm/s - }; - - struct Trapezoid - { - float 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 BlocksList; - -#if ENABLE_MOVE_STATS - struct MoveStats - { - unsigned int count; - float time; - - MoveStats(); - }; - - typedef std::map MovesStatsMap; -#endif // ENABLE_MOVE_STATS - - public: - typedef std::pair G1LineIdToBlockId; - typedef std::vector 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 color print times - bool m_needs_color_times; - std::vector m_color_times; - float m_color_time_cache; - -#if ENABLE_MOVE_STATS - MovesStatsMap _moves_stats; -#endif // ENABLE_MOVE_STATS - - public: - explicit GCodeTimeEstimator(EMode mode); - - // Adds the given gcode line - void add_gcode_line(const std::string& gcode_line); - - void add_gcode_block(const char *ptr); - void add_gcode_block(const std::string &str) { this->add_gcode_block(str.c_str()); } - - // Calculates the time estimate from the gcode lines added using add_gcode_line() or add_gcode_block() - // start_from_beginning: - // if set to true all blocks will be used to calculate the time estimate, - // if set to false only the blocks not yet processed will be used and the calculated time will be added to the current calculated time - void calculate_time(bool start_from_beginning); - - // Calculates the time estimate from the given gcode in string format - void calculate_time_from_text(const std::string& gcode); - - // Calculates the time estimate from the gcode contained in the file with the given filename - void calculate_time_from_file(const std::string& file); - - // Calculates the time estimate from the gcode contained in given list of gcode lines - void calculate_time_from_lines(const std::vector& gcode_lines); - - // Process the gcode contained in the file with the given filename, - // replacing placeholders with correspondent new lines M73 - // placing new lines M73 (containing the remaining time) where needed (in dependence of the given interval in seconds) - // and removing working tags (as those used for color changes) - // if normal_mode == nullptr no M73 line will be added for normal mode - // if silent_mode == nullptr no M73 line will be added for silent mode - static bool post_process(const std::string& filename, float interval_sec, const PostProcessData* const normal_mode, const PostProcessData* const silent_mode); - - // Set current position on the given axis with the given value - void set_axis_position(EAxis axis, float position); - // Set current origin on the given axis with the given value - void set_axis_origin(EAxis axis, float position); - - void set_axis_max_feedrate(EAxis axis, float feedrate_mm_sec); - void set_axis_max_acceleration(EAxis axis, float acceleration); - void set_axis_max_jerk(EAxis axis, float jerk); - - // Returns current position on the given axis - float get_axis_position(EAxis axis) const; - // Returns current origin on the given axis - float get_axis_origin(EAxis axis) const; - - float get_axis_max_feedrate(EAxis axis) const; - float get_axis_max_acceleration(EAxis axis) const; - float get_axis_max_jerk(EAxis axis) const; - - void set_feedrate(float feedrate_mm_sec); - float get_feedrate() const; - - void set_acceleration(float acceleration_mm_sec2); - float get_acceleration() const; - - // Maximum acceleration for the machine. The firmware simulator will clamp the M204 Sxxx to this maximum. - void set_max_acceleration(float acceleration_mm_sec2); - float get_max_acceleration() const; - - void set_retract_acceleration(float acceleration_mm_sec2); - float get_retract_acceleration() const; - - void set_minimum_feedrate(float feedrate_mm_sec); - float get_minimum_feedrate() const; - - void set_minimum_travel_feedrate(float feedrate_mm_sec); - float get_minimum_travel_feedrate() const; - - void set_filament_load_times(const std::vector &filament_load_times); - void set_filament_unload_times(const std::vector &filament_unload_times); - float get_filament_load_time(unsigned int id_extruder); - float get_filament_unload_time(unsigned int id_extruder); - - void set_extrude_factor_override_percentage(float percentage); - float get_extrude_factor_override_percentage() const; - - void set_dialect(GCodeFlavor dialect); - GCodeFlavor get_dialect() const; - - void set_units(EUnits units); - EUnits get_units() const; - - void set_global_positioning_type(EPositioningType type); - EPositioningType get_global_positioning_type() const; - - void set_e_local_positioning_type(EPositioningType type); - EPositioningType get_e_local_positioning_type() const; - - int get_g1_line_id() const; - void increment_g1_line_id(); - void reset_g1_line_id(); - - void set_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 minutes (integer) - std::string get_time_minutes() const; - - // Returns the estimated time, in seconds, for each color - std::vector get_color_times() const; - - // Returns the estimated time, in format DDd HHh MMm SSs, for each color - // If include_remaining==true the strings will be formatted as: "time for color (remaining time at color start)" - std::vector get_color_times_dhms(bool include_remaining) const; - - // Returns the estimated time, in minutes (integer), for each color - // If include_remaining==true the strings will be formatted as: "time for color (remaining time at color start)" - std::vector get_color_times_minutes(bool include_remaining) const; - - // 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 color change tag - void _process_color_change_tag(); - - // 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, 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 364ba12ae1..c09d819de3 100644 --- a/src/libslic3r/GCodeWriter.cpp +++ b/src/libslic3r/GCodeWriter.cpp @@ -1,4 +1,5 @@ #include "GCodeWriter.hpp" +#include "CustomGCode.hpp" #include #include #include @@ -19,12 +20,13 @@ 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 = (print_config.gcode_flavor.value == gcfMarlin) ? - print_config.machine_max_acceleration_extruding.values.front() : 0; + 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); } -void GCodeWriter::set_extruders(const std::vector &extruder_ids) +void GCodeWriter::set_extruders(std::vector extruder_ids) { + std::sort(extruder_ids.begin(), extruder_ids.end()); m_extruders.clear(); m_extruders.reserve(extruder_ids.size()); for (unsigned int extruder_id : extruder_ids) @@ -44,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 { @@ -70,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"; } @@ -86,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(); @@ -247,9 +262,9 @@ std::string GCodeWriter::toolchange_prefix() const std::string GCodeWriter::toolchange(unsigned int extruder_id) { // set the new extruder - auto it_extruder = std::lower_bound(m_extruders.begin(), m_extruders.end(), Extruder::key(extruder_id)); - assert(it_extruder != m_extruders.end()); - m_extruder = const_cast(&*it_extruder); + auto it_extruder = Slic3r::lower_bound_by_predicate(m_extruders.begin(), m_extruders.end(), [extruder_id](const Extruder &e) { return e.id() < extruder_id; }); + assert(it_extruder != m_extruders.end() && it_extruder->id() == extruder_id); + m_extruder = &*it_extruder; // return the toolchange command // if we are running a single-extruder setup, just set the extruder and return nothing diff --git a/src/libslic3r/GCodeWriter.hpp b/src/libslic3r/GCodeWriter.hpp index 664b0e3a1d..3a57c8bd29 100644 --- a/src/libslic3r/GCodeWriter.hpp +++ b/src/libslic3r/GCodeWriter.hpp @@ -28,7 +28,7 @@ public: std::string extrusion_axis() const { return m_extrusion_axis; } void apply_print_config(const PrintConfig &print_config); // Extruders are expected to be sorted in an increasing order. - void set_extruders(const std::vector &extruder_ids); + void set_extruders(std::vector extruder_ids); const std::vector& extruders() const { return m_extruders; } std::vector extruder_ids() const { std::vector out; @@ -69,7 +69,8 @@ public: Vec3d get_position() const { return m_pos; } private: - std::vector m_extruders; + // Extruders are sorted by their ID, so that binary search is possible. + std::vector m_extruders; std::string m_extrusion_axis; bool m_single_extruder_multi_material; Extruder* m_extruder; diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp index 46d7ef1543..3b9fcd6176 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" @@ -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); @@ -1187,14 +1188,12 @@ MedialAxis::validate_edge(const VD::edge_type* edge) return true; } -const Line& -MedialAxis::retrieve_segment(const VD::cell_type* cell) const +const Line& MedialAxis::retrieve_segment(const VD::cell_type* cell) const { return this->lines[cell->source_index()]; } -const Point& -MedialAxis::retrieve_endpoint(const VD::cell_type* cell) const +const Point& MedialAxis::retrieve_endpoint(const VD::cell_type* cell) const { const Line& line = this->retrieve_segment(cell); if (cell->source_category() == SOURCE_CATEGORY_SEGMENT_START_POINT) { @@ -1208,11 +1207,8 @@ void assemble_transform(Transform3d& transform, const Vec3d& translation, const { transform = Transform3d::Identity(); transform.translate(translation); - transform.rotate(Eigen::AngleAxisd(rotation(2), Vec3d::UnitZ())); - transform.rotate(Eigen::AngleAxisd(rotation(1), Vec3d::UnitY())); - transform.rotate(Eigen::AngleAxisd(rotation(0), Vec3d::UnitX())); - transform.scale(scale); - transform.scale(mirror); + transform.rotate(Eigen::AngleAxisd(rotation(2), Vec3d::UnitZ()) * Eigen::AngleAxisd(rotation(1), Vec3d::UnitY()) * Eigen::AngleAxisd(rotation(0), Vec3d::UnitX())); + transform.scale(scale.cwiseProduct(mirror)); } Transform3d assemble_transform(const Vec3d& translation, const Vec3d& rotation, const Vec3d& scale, const Vec3d& mirror) @@ -1420,32 +1416,6 @@ void Transformation::set_from_transform(const Transform3d& transform) // std::cout << "something went wrong in extracting data from matrix" << std::endl; } -void Transformation::set_from_string(const std::string& transform_str) -{ - Transform3d transform = Transform3d::Identity(); - - if (!transform_str.empty()) - { - std::vector mat_elements_str; - boost::split(mat_elements_str, transform_str, boost::is_any_of(" "), boost::token_compress_on); - - unsigned int size = (unsigned int)mat_elements_str.size(); - if (size == 16) - { - unsigned int i = 0; - for (unsigned int r = 0; r < 4; ++r) - { - for (unsigned int c = 0; c < 4; ++c) - { - transform(r, c) = ::atof(mat_elements_str[i++].c_str()); - } - } - } - } - - set_from_transform(transform); -} - void Transformation::reset() { m_offset = Vec3d::Zero(); @@ -1536,6 +1506,33 @@ Transformation Transformation::volume_to_bed_transformation(const Transformation return out; } +// For parsing a transformation matrix from 3MF / AMF. +Transform3d transform3d_from_string(const std::string& transform_str) +{ + Transform3d transform = Transform3d::Identity(); + + if (!transform_str.empty()) + { + std::vector mat_elements_str; + boost::split(mat_elements_str, transform_str, boost::is_any_of(" "), boost::token_compress_on); + + unsigned int size = (unsigned int)mat_elements_str.size(); + if (size == 16) + { + unsigned int i = 0; + for (unsigned int r = 0; r < 4; ++r) + { + for (unsigned int c = 0; c < 4; ++c) + { + transform(r, c) = ::atof(mat_elements_str[i++].c_str()); + } + } + } + } + + return transform; +} + Eigen::Quaterniond rotation_xyz_diff(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to) { return diff --git a/src/libslic3r/Geometry.hpp b/src/libslic3r/Geometry.hpp index d996658f27..b690b478d9 100644 --- a/src/libslic3r/Geometry.hpp +++ b/src/libslic3r/Geometry.hpp @@ -10,6 +10,7 @@ // Serialization through the Cereal library #include +#define BOOST_VORONOI_USE_GMP 1 #include "boost/polygon/voronoi.hpp" namespace ClipperLib { @@ -114,27 +115,162 @@ inline bool segment_segment_intersection(const Vec2d &p1, const Vec2d &v1, const return true; } - -inline int segments_could_intersect( - const Slic3r::Point &ip1, const Slic3r::Point &ip2, - const Slic3r::Point &jp1, const Slic3r::Point &jp2) -{ - Vec2i64 iv = (ip2 - ip1).cast(); - Vec2i64 vij1 = (jp1 - ip1).cast(); - Vec2i64 vij2 = (jp2 - ip1).cast(); - 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; -} - 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 + { + Vec2i64 iv = (ip2 - ip1).cast(); + Vec2i64 vij1 = (jp1 - ip1).cast(); + Vec2i64 vij2 = (jp2 - ip1).cast(); + 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 sign1 = segments_could_intersect(ip1, ip2, jp1, jp2); + std::pair 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 inline T foot_pt(const T &line_pt, const T &line_dir, const T &pt) { - return segments_could_intersect(ip1, ip2, jp1, jp2) <= 0 && - segments_could_intersect(jp1, jp2, ip1, ip2) <= 0; + 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 Vec2d foot_pt(const Line &iline, const Point &ipt) +{ + return foot_pt(iline.a.cast(), (iline.b - iline.a).cast(), ipt.cast()); +} + +template inline auto ray_point_distance_squared(const T &ray_pt, const T &ray_dir, const T &pt) +{ + return (foot_pt(ray_pt, ray_dir, pt) - pt).squaredNorm(); +} + +template 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()).squaredNorm(); +} + +inline double ray_point_distance(const Line &iline, const Point &ipt) +{ + return (foot_pt(iline, ipt) - ipt.cast()).norm(); +} + +// Based on Liang-Barsky function by Daniel White @ http://www.skytopia.com/project/articles/compsci/clipping.html +template +inline bool liang_barsky_line_clipping( + // Start and end points of the source line, result will be stored there as well. + Eigen::Matrix &x0, + Eigen::Matrix &x1, + // Bounding box to clip with. + const BoundingBoxBase> &bbox) +{ + Eigen::Matrix 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; + } + } + } + + // Clipped successfully. + x1 = x0 + t1 * v; + x0 += t0 * v; + return true; +} + +// Based on Liang-Barsky function by Daniel White @ http://www.skytopia.com/project/articles/compsci/clipping.html +template +bool liang_barsky_line_clipping( + // Start and end points of the source line. + const Eigen::Matrix &x0src, + const Eigen::Matrix &x1src, + // Bounding box to clip with. + const BoundingBoxBase> &bbox, + // Start and end points of the clipped line. + Eigen::Matrix &x0clip, + Eigen::Matrix &x1clip) +{ + x0clip = x0src; + x1clip = x1src; + return liang_barsky_line_clipping(x0clip, x1clip, bbox); } Pointf3s convex_hull(Pointf3s points); @@ -145,7 +281,7 @@ bool directions_parallel(double angle1, double angle2, double max_diff = 0); template bool contains(const std::vector &vector, const Point &point); template T rad2deg(T angle) { return T(180.0) * angle / T(PI); } double rad2deg_dir(double angle); -template T deg2rad(T angle) { return T(PI) * angle / T(180.0); } +template constexpr T deg2rad(const T angle) { return T(PI) * angle / T(180.0); } template T angle_to_0_2PI(T angle) { static const T TWO_PI = T(2) * T(PI); @@ -178,8 +314,16 @@ bool arrange( // output Pointfs &positions); +class VoronoiDiagram : public boost::polygon::voronoi_diagram { +public: + typedef double coord_type; + typedef boost::polygon::point_data point_type; + typedef boost::polygon::segment_data segment_type; + typedef boost::polygon::rectangle_data rect_type; +}; + class MedialAxis { - public: +public: Lines lines; const ExPolygon* expolygon; double max_width; @@ -189,14 +333,8 @@ class MedialAxis { void build(ThickPolylines* polylines); void build(Polylines* polylines); - private: - class VD : public boost::polygon::voronoi_diagram { - public: - typedef double coord_type; - typedef boost::polygon::point_data point_type; - typedef boost::polygon::segment_data segment_type; - typedef boost::polygon::rectangle_data rect_type; - }; +private: + using VD = VoronoiDiagram; VD vd; std::set edges, valid_edges; std::map > thickness; @@ -287,7 +425,6 @@ public: void set_mirror(Axis axis, double mirror); void set_from_transform(const Transform3d& transform); - void set_from_string(const std::string& transform_str); void reset(); @@ -312,6 +449,9 @@ private: } }; +// For parsing a transformation matrix from 3MF / AMF. +extern Transform3d transform3d_from_string(const std::string& transform_str); + // Rotation when going from the first coordinate system with rotation rot_xyz_from applied // to a coordinate system with rot_xyz_to applied. extern Eigen::Quaterniond rotation_xyz_diff(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to); diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index 53a7f2fc45..29b20d2e19 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -47,8 +47,8 @@ void Layer::make_slices() slices = union_ex(slices_p); } - this->slices.clear(); - this->slices.reserve(slices.size()); + this->lslices.clear(); + this->lslices.reserve(slices.size()); // prepare ordering points Points ordering_points; @@ -61,19 +61,21 @@ void Layer::make_slices() // populate slices vector for (size_t i : order) - this->slices.push_back(std::move(slices[i])); + 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() { - if (m_regions.size() == 1) { + 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. - m_regions.front()->slices.set(this->slices, stInternal); + // 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); } else { for (LayerRegion *layerm : m_regions) - // without safety offset, artifacts are generated (GH #2494) + // without safety offset, artifacts are generated (upstream Slic3r GH #2494) layerm->slices.set(union_ex(to_polygons(std::move(layerm->slices.surfaces)), true), stInternal); } } @@ -110,72 +112,82 @@ void Layer::make_perimeters() // keep track of regions whose perimeters we have already generated std::vector done(m_regions.size(), false); - for (LayerRegionPtrs::iterator layerm = m_regions.begin(); layerm != m_regions.end(); ++ layerm) { - size_t region_id = layerm - m_regions.begin(); - if (done[region_id]) - continue; - BOOST_LOG_TRIVIAL(trace) << "Generating perimeters for layer " << this->id() << ", region " << region_id; - done[region_id] = true; - const PrintRegionConfig &config = (*layerm)->region()->config(); - - // find compatible regions - LayerRegionPtrs layerms; - layerms.push_back(*layerm); - for (LayerRegionPtrs::const_iterator it = layerm + 1; it != m_regions.end(); ++it) { - LayerRegion* other_layerm = *it; - const PrintRegionConfig &other_config = other_layerm->region()->config(); - if (config.perimeter_extruder == other_config.perimeter_extruder - && config.perimeters == other_config.perimeters - && config.perimeter_speed == other_config.perimeter_speed - && config.external_perimeter_speed == other_config.external_perimeter_speed - && config.gap_fill_speed == other_config.gap_fill_speed - && config.overhangs == other_config.overhangs - && config.opt_serialize("perimeter_extrusion_width") == other_config.opt_serialize("perimeter_extrusion_width") - && config.thin_walls == other_config.thin_walls - && config.external_perimeters_first == other_config.external_perimeters_first - && config.infill_overlap == other_config.infill_overlap) { - layerms.push_back(other_layerm); - done[it - m_regions.begin()] = true; - } - } - - if (layerms.size() == 1) { // optimization - (*layerm)->fill_surfaces.surfaces.clear(); - (*layerm)->make_perimeters((*layerm)->slices, &(*layerm)->fill_surfaces); - (*layerm)->fill_expolygons = to_expolygons((*layerm)->fill_surfaces.surfaces); - } else { - SurfaceCollection new_slices; - // Use the region with highest infill rate, as the make_perimeters() function below decides on the gap fill based on the infill existence. - LayerRegion *layerm_config = layerms.front(); - { - // group slices (surfaces) according to number of extra perimeters - std::map slices; // extra_perimeters => [ surface, surface... ] - for (LayerRegion *layerm : layerms) { - for (Surface &surface : layerm->slices.surfaces) - slices[surface.extra_perimeters].emplace_back(surface); - if (layerm->region()->config().fill_density > layerm_config->region()->config().fill_density) - layerm_config = layerm; - } - // merge the surfaces assigned to each group - for (std::pair &surfaces_with_extra_perimeters : slices) - new_slices.append(union_ex(surfaces_with_extra_perimeters.second, true), surfaces_with_extra_perimeters.second.front()); - } - - // make perimeters - SurfaceCollection fill_surfaces; - layerm_config->make_perimeters(new_slices, &fill_surfaces); + for (LayerRegionPtrs::iterator layerm = m_regions.begin(); layerm != m_regions.end(); ++ layerm) + if ((*layerm)->slices.empty()) { + (*layerm)->perimeters.clear(); + (*layerm)->fills.clear(); + (*layerm)->thin_fills.clear(); + } else { + size_t region_id = layerm - m_regions.begin(); + if (done[region_id]) + continue; + BOOST_LOG_TRIVIAL(trace) << "Generating perimeters for layer " << this->id() << ", region " << region_id; + done[region_id] = true; + const PrintRegionConfig &config = (*layerm)->region()->config(); + + // find compatible regions + LayerRegionPtrs layerms; + layerms.push_back(*layerm); + for (LayerRegionPtrs::const_iterator it = layerm + 1; it != m_regions.end(); ++it) + if (! (*it)->slices.empty()) { + LayerRegion* other_layerm = *it; + const PrintRegionConfig &other_config = other_layerm->region()->config(); + if (config.perimeter_extruder == other_config.perimeter_extruder + && config.perimeters == other_config.perimeters + && config.perimeter_speed == other_config.perimeter_speed + && config.external_perimeter_speed == other_config.external_perimeter_speed + && config.gap_fill_speed == other_config.gap_fill_speed + && config.overhangs == other_config.overhangs + && config.opt_serialize("perimeter_extrusion_width") == other_config.opt_serialize("perimeter_extrusion_width") + && config.thin_walls == other_config.thin_walls + && config.external_perimeters_first == other_config.external_perimeters_first + && config.infill_overlap == other_config.infill_overlap) + { + other_layerm->perimeters.clear(); + other_layerm->fills.clear(); + other_layerm->thin_fills.clear(); + layerms.push_back(other_layerm); + done[it - m_regions.begin()] = true; + } + } + + if (layerms.size() == 1) { // optimization + (*layerm)->fill_surfaces.surfaces.clear(); + (*layerm)->make_perimeters((*layerm)->slices, &(*layerm)->fill_surfaces); + (*layerm)->fill_expolygons = to_expolygons((*layerm)->fill_surfaces.surfaces); + } else { + SurfaceCollection new_slices; + // Use the region with highest infill rate, as the make_perimeters() function below decides on the gap fill based on the infill existence. + LayerRegion *layerm_config = layerms.front(); + { + // group slices (surfaces) according to number of extra perimeters + std::map slices; // extra_perimeters => [ surface, surface... ] + for (LayerRegion *layerm : layerms) { + for (Surface &surface : layerm->slices.surfaces) + slices[surface.extra_perimeters].emplace_back(surface); + if (layerm->region()->config().fill_density > layerm_config->region()->config().fill_density) + layerm_config = layerm; + } + // merge the surfaces assigned to each group + for (std::pair &surfaces_with_extra_perimeters : slices) + new_slices.append(union_ex(surfaces_with_extra_perimeters.second, true), surfaces_with_extra_perimeters.second.front()); + } + + // make perimeters + SurfaceCollection fill_surfaces; + layerm_config->make_perimeters(new_slices, &fill_surfaces); - // assign fill_surfaces to each layer - if (!fill_surfaces.surfaces.empty()) { - for (LayerRegionPtrs::iterator l = layerms.begin(); l != layerms.end(); ++l) { - // Separate the fill surfaces. - ExPolygons expp = intersection_ex(to_polygons(fill_surfaces), (*l)->slices); - (*l)->fill_expolygons = expp; - (*l)->fill_surfaces.set(std::move(expp), fill_surfaces.surfaces.front()); - } - } - } - } + // assign fill_surfaces to each layer + if (!fill_surfaces.surfaces.empty()) { + for (LayerRegionPtrs::iterator l = layerms.begin(); l != layerms.end(); ++l) { + // Separate the fill surfaces. + ExPolygons expp = intersection_ex(to_polygons(fill_surfaces), (*l)->slices); + (*l)->fill_expolygons = expp; + (*l)->fill_surfaces.set(std::move(expp), fill_surfaces.surfaces.front()); + } + } + } + } BOOST_LOG_TRIVIAL(trace) << "Generating perimeters for layer " << this->id() << " - Done"; } diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index 9a4297ce55..8285b5493f 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: @@ -36,11 +40,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; @@ -105,13 +104,18 @@ public: coordf_t slice_z; // Z used for slicing in unscaled coordinates coordf_t print_z; // Z used for printing in unscaled coordinates coordf_t height; // layer height in unscaled coordinates + coordf_t bottom_z() const { return this->print_z - this->height; } - // collection of expolygons generated by slicing the original geometry; - // also known as 'islands' (all regions and surface types are merged here) - // The slices are chained by the shortest traverse distance and this traversal - // order will be recovered by the G-code generator. - ExPolygons slices; - std::vector slices_bboxes; + // Collection of expolygons generated by slicing the possibly multiple meshes of the source geometry + // (with possibly differing extruder ID and slicing parameters) and merged. + // For the first layer, if the ELephant foot compensation is applied, this lslice is uncompensated, therefore + // it includes the Elephant foot effect, thus it corresponds to the shape of the printed 1st layer. + // These lslices aka islands are chained by the shortest traverse distance and this traversal + // order will be applied by the G-code generator to the extrusions fitting into these lslices. + // These lslices are also used to detect overhangs and overlaps between successive layers, therefore it is important + // that the 1st lslice is not compensated by the Elephant foot compensation algorithm. + ExPolygons lslices; + std::vector lslices_bboxes; size_t region_count() const { return m_regions.size(); } const LayerRegion* get_region(int idx) const { return m_regions.at(idx); } @@ -134,7 +138,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; @@ -165,6 +171,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 35acaf9983..5fda69f779 100644 --- a/src/libslic3r/LayerRegion.cpp +++ b/src/libslic3r/LayerRegion.cpp @@ -72,7 +72,7 @@ void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollec if (this->layer()->lower_layer != nullptr) // Cummulative sum of polygons over all the regions. - g.lower_slices = &this->layer()->lower_layer->slices; + g.lower_slices = &this->layer()->lower_layer->lslices; g.layer_id = (int)this->layer()->id(); g.ext_perimeter_flow = this->flow(frExternalPerimeter); @@ -117,7 +117,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly // Voids are sparse infills if infill rate is zero. Polygons voids; for (const Surface &surface : this->fill_surfaces.surfaces) { - if (surface.surface_type == stTop) { + if (surface.is_top()) { // Collect the top surfaces, inflate them and trim them by the bottom surfaces. // This gives the priority to bottom surfaces. surfaces_append(top, offset_ex(surface.expolygon, margin, EXTERNAL_SURFACES_OFFSET_PARAMETERS), surface); @@ -139,7 +139,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly // Remove voids from fill_boundaries, that are not supported by the layer below. if (lower_layer_covered == nullptr) { lower_layer_covered = &lower_layer_covered_tmp; - lower_layer_covered_tmp = to_polygons(lower_layer->slices); + lower_layer_covered_tmp = to_polygons(lower_layer->lslices); } if (! lower_layer_covered->empty()) voids = diff(voids, *lower_layer_covered); @@ -260,11 +260,11 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly // of very thin (but still working) anchors, the grown expolygon would go beyond them BridgeDetector bd( initial, - lower_layer->slices, + lower_layer->lslices, 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)) { @@ -313,7 +313,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly s2.clear(); } } - if (s1.surface_type == stTop) + if (s1.is_top()) // Trim the top surfaces by the bottom surfaces. This gives the priority to the bottom surfaces. polys = diff(polys, bottom_polygons); surfaces_append( @@ -362,8 +362,10 @@ void LayerRegion::prepare_fill_surfaces() alter fill_surfaces boundaries on which our idempotency relies since that's the only meaningful information returned by psPerimeters. */ + bool spiral_vase = this->layer()->object()->print()->config().spiral_vase; + // if no solid layers are requested, turn top/bottom surfaces to internal - if (this->region()->config().top_solid_layers == 0) { + if (! spiral_vase && this->region()->config().top_solid_layers == 0) { for (Surface &surface : this->fill_surfaces.surfaces) if (surface.is_top()) surface.surface_type = this->layer()->object()->config().infill_only_where_needed ? stInternalVoid : stInternal; @@ -375,7 +377,7 @@ void LayerRegion::prepare_fill_surfaces() } // turn too small internal regions into solid regions according to the user setting - if (this->region()->config().fill_density.value > 0) { + if (! spiral_vase && this->region()->config().fill_density.value > 0) { // scaling an area requires two calls! double min_area = scale_(scale_(this->region()->config().solid_infill_below_area.value)); for (Surface &surface : this->fill_surfaces.surfaces) diff --git a/src/libslic3r/Line.cpp b/src/libslic3r/Line.cpp index e5f7b8fa91..0c43154a9b 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(); - const Vec2d va = (point - a).cast(); - 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().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; @@ -107,6 +89,17 @@ bool Line::intersection(const Line &l2, Point *intersection) const return false; // not intersecting } +bool Line::clip_with_bbox(const BoundingBox &bbox) +{ + Vec2d x0clip, x1clip; + bool result = Geometry::liang_barsky_line_clipping(this->a.cast(), this->b.cast(), BoundingBoxf(bbox.min.cast(), bbox.max.cast()), x0clip, x1clip); + if (result) { + this->a = x0clip.cast(); + this->b = x1clip.cast(); + } + return result; +} + Vec3d Linef3::intersect_plane(double z) const { auto v = (this->b - this->a).cast(); @@ -114,4 +107,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 559ca946a8..980303feda 100644 --- a/src/libslic3r/Line.hpp +++ b/src/libslic3r/Line.hpp @@ -6,6 +6,7 @@ namespace Slic3r { +class BoundingBox; class Line; class Line3; class Linef3; @@ -17,6 +18,35 @@ typedef std::vector ThickLines; Linef3 transform(const Linef3& line, const Transform3d& t); +namespace line_alg { + +// Distance to the closest point of line. +template +double distance_to_squared(const L &line, const Vec &point) +{ + const Vec v = line.vector().template cast(); + const Vec va = (point - line.a).template cast(); + 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().squaredNorm(); // beyond the 'b' end of the segment + return (t * v - va).squaredNorm(); +} + +template +double distance_to(const L &line, const Vec &point) +{ + return std::sqrt(distance_to_squared(line, point)); +} + +} // namespace line_alg + class Line { public: @@ -43,8 +73,10 @@ public: Vector normal() const { return Vector((this->b(1) - this->a(1)), -(this->b(0) - this->a(0))); } bool intersection(const Line& line, Point* intersection) const; 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); - 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; @@ -100,6 +132,8 @@ public: Vec3d b; }; +BoundingBox get_extents(const Lines &lines); + } // namespace Slic3r // start Boost @@ -120,4 +154,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 63ff6fb09d..555cfe5019 100644 --- a/src/libslic3r/MTUtils.hpp +++ b/src/libslic3r/MTUtils.hpp @@ -10,7 +10,6 @@ #include #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 IndexBasedIterator -{ - static const size_t NONE = size_t(-1); - - std::reference_wrapper 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 Range { @@ -252,15 +114,13 @@ template struct remove_cvref template using remove_cvref_t = typename remove_cvref::type; -template using DefaultContainer = std::vector; - /// Exactly like Matlab https://www.mathworks.com/help/matlab/ref/linspace.html -template class Container = DefaultContainer> -inline Container> linspace(const T &start, - const T &stop, - const I &n) +template> +inline std::vector linspace_vector(const ArithmeticOnly &start, + const T &stop, + const I &n) { - Container> vals(n, T()); + std::vector vals(n, T()); T stride = (stop - start) / n; size_t i = 0; @@ -271,17 +131,30 @@ inline Container> linspace(const T &start, return vals; } +template +inline std::array, N> linspace_array(const T &start, const T &stop) +{ + std::array vals = {T()}; + + T stride = (stop - start) / N; + size_t i = 0; + std::generate(vals.begin(), vals.end(), [&i, start, stride] { + return start + i++ * stride; + }); + + return vals; +} + /// A set of equidistant values starting from 'start' (inclusive), ending /// in the closest multiple of 'stride' less than or equal to 'end' and /// leaving 'stride' space between each value. /// Very similar to Matlab [start:stride:end] notation. -template class Container = DefaultContainer> -inline Container> grid(const T &start, - const T &stop, - const T &stride) +template +inline std::vector> grid(const T &start, + const T &stop, + const T &stride) { - Container> - vals(size_t(std::ceil((stop - start) / stride)), T()); + std::vector vals(size_t(std::ceil((stop - start) / stride)), T()); int i = 0; std::generate(vals.begin(), vals.end(), [&i, start, stride] { @@ -291,107 +164,6 @@ inline Container> grid(const T &start, return vals; } - -// A shorter C++14 style form of the enable_if metafunction -template -using enable_if_t = typename std::enable_if::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 struct is_scaled_coord -{ - static const SLIC3R_CONSTEXPR bool value = - std::is_integral::value && - std::numeric_limits::digits >= - std::numeric_limits::digits; -}; - -// Meta predicates for floating, 'scaled coord' and generic arithmetic types -template -using FloatingOnly = enable_if_t::value, O>; - -template -using ScaledCoordOnly = enable_if_t::value, O>; - -template -using IntegerOnly = enable_if_t::value, O>; - -template -using ArithmeticOnly = enable_if_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> -inline constexpr FloatingOnly 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> -inline constexpr ScaledCoordOnly scaled(const Tin &v) noexcept -{ - //return static_cast(std::round(v / SCALING_FACTOR)); - return Tout(v / Tin(SCALING_FACTOR)); -} - -// Conversion for Eigen vectors (N dimensional points) -template, - int...EigenArgs> -inline Eigen::Matrix, N, EigenArgs...> -scaled(const Eigen::Matrix &v) -{ - return (v / SCALING_FACTOR).template cast(); -} - -// Conversion from arithmetic scaled type to floating point unscaled -template, - class = FloatingOnly> -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 = FloatingOnly, - int...EigenArgs> -inline constexpr Eigen::Matrix -unscaled(const Eigen::Matrix &v) noexcept -{ - return v.template cast() * SCALING_FACTOR; -} - -template // Arbitrary allocator can be used -inline IntegerOnly> reserve_vector(I capacity) -{ - std::vector ret; - if (capacity > I(0)) ret.reserve(size_t(capacity)); - - return ret; -} - } // namespace Slic3r #endif // MTUTILS_HPP diff --git a/src/libslic3r/MarchingSquares.hpp b/src/libslic3r/MarchingSquares.hpp new file mode 100644 index 0000000000..d5f07fbde6 --- /dev/null +++ b/src/libslic3r/MarchingSquares.hpp @@ -0,0 +1,448 @@ +#ifndef MARCHINGSQUARES_HPP +#define MARCHINGSQUARES_HPP + +#include +#include +#include +#include +#include + +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; + +// Specialize this struct to register a raster type for the Marching squares alg +template 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 struct _Loop { + template 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 using RasterTraits = _RasterTraits>; +template using TRasterValue = typename RasterTraits::ValueType; + +template size_t rows(const T &raster) +{ + return RasterTraits::rows(raster); +} + +template size_t cols(const T &raster) +{ + return RasterTraits::cols(raster); +} + +template TRasterValue isoval(const T &rst, const Coord &crd) +{ + return RasterTraits::get(rst, crd.r, crd.c); +} + +template +void for_each(ExecutionPolicy&& policy, It from, It to, Fn &&fn) +{ + _Loop::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 constexpr std::underlying_type_t _t(E e) noexcept +{ + return static_cast>(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 Grid { + const Rst * m_rst = nullptr; + Coord m_cellsize, m_res_1, m_window, m_gridsize, m_grid_1; + std::vector 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 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 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; + using pointer = TRasterValue *; + using reference = TRasterValue &; + 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 + void tag_grid(ExecutionPolicy &&policy, TRasterValue isoval) + { + // parallel for r + for_each (std::forward(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 scan_rings() + { + std::vector 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 + void interpolate_rings(ExecutionPolicy && policy, + std::vector &rings, + TRasterValue isov) + { + for_each(std::forward(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 +std::vector execute_with_policy(ExecutionPolicy && policy, + const Raster & raster, + TRasterValue 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 grid{raster, windowsize, overlap}; + + grid.tag_grid(std::forward(policy), isoval); + std::vector rings = grid.scan_rings(); + grid.interpolate_rings(std::forward(policy), rings, isoval); + + return rings; +} + +template +std::vector execute(const Raster &raster, + TRasterValue 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 new file mode 100644 index 0000000000..6ffc5dec39 --- /dev/null +++ b/src/libslic3r/MeshBoolean.cpp @@ -0,0 +1,276 @@ +#include "Exception.hpp" +#include "MeshBoolean.hpp" +#include "libslic3r/TriangleMesh.hpp" +#undef PI + +// Include igl first. It defines "L" macro which then clashes with our localization +#include +#undef L + +// CGAL headers +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Slic3r { +namespace MeshBoolean { + +using MapMatrixXfUnaligned = Eigen::Map>; +using MapMatrixXiUnaligned = Eigen::Map>; + +TriangleMesh eigen_to_triangle_mesh(const EigenMesh &emesh) +{ + auto &VC = emesh.first; auto &FC = emesh.second; + + Pointf3s points(size_t(VC.rows())); + std::vector facets(size_t(FC.rows())); + + for (Eigen::Index i = 0; i < VC.rows(); ++i) + points[size_t(i)] = VC.row(i); + + for (Eigen::Index i = 0; i < FC.rows(); ++i) + facets[size_t(i)] = FC.row(i); + + TriangleMesh out{points, facets}; + out.require_shared_vertices(); + return out; +} + +EigenMesh triangle_mesh_to_eigen(const TriangleMesh &mesh) +{ + EigenMesh emesh; + emesh.first = MapMatrixXfUnaligned(mesh.its.vertices.front().data(), + Eigen::Index(mesh.its.vertices.size()), + 3).cast(); + + emesh.second = MapMatrixXiUnaligned(mesh.its.indices.front().data(), + Eigen::Index(mesh.its.indices.size()), + 3); + return emesh; +} + +void minus(EigenMesh &A, const EigenMesh &B) +{ + auto &[VA, FA] = A; + auto &[VB, FB] = B; + + Eigen::MatrixXd VC; + Eigen::MatrixXi FC; + igl::MeshBooleanType boolean_type(igl::MESH_BOOLEAN_TYPE_MINUS); + igl::copyleft::cgal::mesh_boolean(VA, FA, VB, FB, boolean_type, VC, FC); + + VA = std::move(VC); FA = std::move(FC); +} + +void minus(TriangleMesh& A, const TriangleMesh& B) +{ + EigenMesh eA = triangle_mesh_to_eigen(A); + minus(eA, triangle_mesh_to_eigen(B)); + A = eigen_to_triangle_mesh(eA); +} + +void self_union(EigenMesh &A) +{ + EigenMesh result; + auto &[V, F] = A; + auto &[VC, FC] = result; + + igl::MeshBooleanType boolean_type(igl::MESH_BOOLEAN_TYPE_UNION); + igl::copyleft::cgal::mesh_boolean(V, F, Eigen::MatrixXd(), Eigen::MatrixXi(), boolean_type, VC, FC); + + A = std::move(result); +} + +void self_union(TriangleMesh& mesh) +{ + auto eM = triangle_mesh_to_eigen(mesh); + self_union(eM); + mesh = eigen_to_triangle_mesh(eM); +} + +namespace cgal { + +namespace CGALProc = CGAL::Polygon_mesh_processing; +namespace CGALParams = CGAL::Polygon_mesh_processing::parameters; + +using EpecKernel = CGAL::Exact_predicates_exact_constructions_kernel; +using EpicKernel = CGAL::Exact_predicates_inexact_constructions_kernel; +using _EpicMesh = CGAL::Surface_mesh; +using _EpecMesh = CGAL::Surface_mesh; + +struct CGALMesh { _EpicMesh m; }; + +// ///////////////////////////////////////////////////////////////////////////// +// Converions from and to CGAL mesh +// ///////////////////////////////////////////////////////////////////////////// + +template void triangle_mesh_to_cgal(const TriangleMesh &M, _Mesh &out) +{ + using Index3 = std::array; + + if (M.empty()) return; + + std::vector points; + std::vector indices; + points.reserve(M.its.vertices.size()); + indices.reserve(M.its.indices.size()); + for (auto &v : M.its.vertices) points.emplace_back(v.x(), v.y(), v.z()); + for (auto &_f : M.its.indices) { + auto f = _f.cast(); + indices.emplace_back(Index3{f(0), f(1), f(2)}); + } + + CGALProc::orient_polygon_soup(points, indices); + CGALProc::polygon_soup_to_polygon_mesh(points, indices, out); + + // Number the faces because 'orient_to_bound_a_volume' needs a face <--> index map + unsigned index = 0; + for (auto face : out.faces()) face = CGAL::SM_Face_index(index++); + + if(CGAL::is_closed(out)) + CGALProc::orient_to_bound_a_volume(out); + else + throw Slic3r::RuntimeError("Mesh not watertight"); +} + +inline Vec3d to_vec3d(const _EpicMesh::Point &v) +{ + return {v.x(), v.y(), v.z()}; +} + +inline Vec3d to_vec3d(const _EpecMesh::Point &v) +{ + CGAL::Cartesian_converter cvt; + auto iv = cvt(v); + return {iv.x(), iv.y(), iv.z()}; +} + +template TriangleMesh cgal_to_triangle_mesh(const _Mesh &cgalmesh) +{ + Pointf3s points; + std::vector facets; + points.reserve(cgalmesh.num_vertices()); + facets.reserve(cgalmesh.num_faces()); + + for (auto &vi : cgalmesh.vertices()) { + auto &v = cgalmesh.point(vi); // Don't ask... + points.emplace_back(to_vec3d(v)); + } + + for (auto &face : cgalmesh.faces()) { + auto vtc = cgalmesh.vertices_around_face(cgalmesh.halfedge(face)); + int i = 0; + Vec3i trface; + for (auto v : vtc) trface(i++) = static_cast(v); + facets.emplace_back(trface); + } + + TriangleMesh out{points, facets}; + out.require_shared_vertices(); + return out; +} + +std::unique_ptr triangle_mesh_to_cgal(const TriangleMesh &M) +{ + std::unique_ptr out(new CGALMesh{}); + triangle_mesh_to_cgal(M, out->m); + return out; +} + +TriangleMesh cgal_to_triangle_mesh(const CGALMesh &cgalmesh) +{ + return cgal_to_triangle_mesh(cgalmesh.m); +} + +// ///////////////////////////////////////////////////////////////////////////// +// Boolean operations for CGAL meshes +// ///////////////////////////////////////////////////////////////////////////// + +static bool _cgal_diff(CGALMesh &A, CGALMesh &B, CGALMesh &R) +{ + const auto &p = CGALParams::throw_on_self_intersection(true); + return CGALProc::corefine_and_compute_difference(A.m, B.m, R.m, p, p); +} + +static bool _cgal_union(CGALMesh &A, CGALMesh &B, CGALMesh &R) +{ + const auto &p = CGALParams::throw_on_self_intersection(true); + return CGALProc::corefine_and_compute_union(A.m, B.m, R.m, p, p); +} + +static bool _cgal_intersection(CGALMesh &A, CGALMesh &B, CGALMesh &R) +{ + const auto &p = CGALParams::throw_on_self_intersection(true); + return CGALProc::corefine_and_compute_intersection(A.m, B.m, R.m, p, p); +} + +template void _cgal_do(Op &&op, CGALMesh &A, CGALMesh &B) +{ + bool success = false; + try { + CGALMesh result; + success = op(A, B, result); + A = std::move(result); // In-place operation does not work + } catch (...) { + success = false; + } + + if (! success) + throw Slic3r::RuntimeError("CGAL mesh boolean operation failed."); +} + +void minus(CGALMesh &A, CGALMesh &B) { _cgal_do(_cgal_diff, A, B); } +void plus(CGALMesh &A, CGALMesh &B) { _cgal_do(_cgal_union, A, B); } +void intersect(CGALMesh &A, CGALMesh &B) { _cgal_do(_cgal_intersection, A, B); } +bool does_self_intersect(const CGALMesh &mesh) { return CGALProc::does_self_intersect(mesh.m); } + +// ///////////////////////////////////////////////////////////////////////////// +// Now the public functions for TriangleMesh input: +// ///////////////////////////////////////////////////////////////////////////// + +template void _mesh_boolean_do(Op &&op, TriangleMesh &A, const TriangleMesh &B) +{ + CGALMesh meshA; + CGALMesh meshB; + triangle_mesh_to_cgal(A, meshA.m); + triangle_mesh_to_cgal(B, meshB.m); + + _cgal_do(op, meshA, meshB); + + A = cgal_to_triangle_mesh(meshA.m); +} + +void minus(TriangleMesh &A, const TriangleMesh &B) +{ + _mesh_boolean_do(_cgal_diff, A, B); +} + +void plus(TriangleMesh &A, const TriangleMesh &B) +{ + _mesh_boolean_do(_cgal_union, A, B); +} + +void intersect(TriangleMesh &A, const TriangleMesh &B) +{ + _mesh_boolean_do(_cgal_intersection, A, B); +} + +bool does_self_intersect(const TriangleMesh &mesh) +{ + CGALMesh cgalm; + triangle_mesh_to_cgal(mesh, cgalm.m); + return CGALProc::does_self_intersect(cgalm.m); +} + +void CGALMeshDeleter::operator()(CGALMesh *ptr) { delete ptr; } + +} // namespace cgal + +} // namespace MeshBoolean +} // namespace Slic3r diff --git a/src/libslic3r/MeshBoolean.hpp b/src/libslic3r/MeshBoolean.hpp new file mode 100644 index 0000000000..ce17a13286 --- /dev/null +++ b/src/libslic3r/MeshBoolean.hpp @@ -0,0 +1,49 @@ +#ifndef libslic3r_MeshBoolean_hpp_ +#define libslic3r_MeshBoolean_hpp_ + +#include +#include + +#include +#include + +namespace Slic3r { + +namespace MeshBoolean { + +using EigenMesh = std::pair; + +TriangleMesh eigen_to_triangle_mesh(const EigenMesh &emesh); +EigenMesh triangle_mesh_to_eigen(const TriangleMesh &mesh); + +void minus(EigenMesh &A, const EigenMesh &B); +void self_union(EigenMesh &A); + +void minus(TriangleMesh& A, const TriangleMesh& B); +void self_union(TriangleMesh& mesh); + +namespace cgal { + +struct CGALMesh; +struct CGALMeshDeleter { void operator()(CGALMesh *ptr); }; + +std::unique_ptr triangle_mesh_to_cgal(const TriangleMesh &M); +TriangleMesh cgal_to_triangle_mesh(const CGALMesh &cgalmesh); + +// Do boolean mesh difference with CGAL bypassing igl. +void minus(TriangleMesh &A, const TriangleMesh &B); +void plus(TriangleMesh &A, const TriangleMesh &B); +void intersect(TriangleMesh &A, const TriangleMesh &B); + +void minus(CGALMesh &A, CGALMesh &B); +void plus(CGALMesh &A, CGALMesh &B); +void intersect(CGALMesh &A, CGALMesh &B); + +bool does_self_intersect(const TriangleMesh &mesh); +bool does_self_intersect(const CGALMesh &mesh); + +} + +} // namespace MeshBoolean +} // namespace Slic3r +#endif // libslic3r_MeshBoolean_hpp_ diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp index 061c5bd50a..7dfc0a7267 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" @@ -18,6 +21,7 @@ #include "SVG.hpp" #include +#include "GCodeWriter.hpp" namespace Slic3r { @@ -41,6 +45,9 @@ Model& Model::assign_copy(const Model &rhs) mo->set_model(this); this->objects.emplace_back(mo); } + + // copy custom code per height + this->custom_gcode_per_print_z = rhs.custom_gcode_per_print_z; return *this; } @@ -59,6 +66,9 @@ Model& Model::assign_copy(Model &&rhs) for (ModelObject *model_object : this->objects) model_object->set_model(this); rhs.objects.clear(); + + // copy custom code per height + this->custom_gcode_per_print_z = std::move(rhs.custom_gcode_per_print_z); return *this; } @@ -104,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; @@ -118,6 +128,9 @@ Model Model::read_from_file(const std::string& input_file, DynamicPrintConfig* c if (add_default_instances) model.add_default_instances(); + CustomGCode::update_custom_gcode_per_print_z_from_config(model.custom_gcode_per_print_z, config); + CustomGCode::check_mode_for_custom_gcode_per_print_z(model.custom_gcode_per_print_z); + return model; } @@ -131,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) { @@ -153,6 +166,9 @@ Model Model::read_from_archive(const std::string& input_file, DynamicPrintConfig if (add_default_instances) model.add_default_instances(); + CustomGCode::update_custom_gcode_per_print_z_from_config(model.custom_gcode_per_print_z, config); + CustomGCode::check_mode_for_custom_gcode_per_print_z(model.custom_gcode_per_print_z); + return model; } @@ -341,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"; @@ -543,6 +449,26 @@ 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() +{ + double in_to_mm = 25.4; + for (ModelObject* obj : this->objects) + if (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)); +} + void Model::adjust_min_z() { if (objects.empty()) @@ -606,6 +532,7 @@ ModelObject& ModelObject::assign_copy(const ModelObject &rhs) assert(this->config.id() == rhs.config.id()); this->sla_support_points = rhs.sla_support_points; this->sla_points_status = rhs.sla_points_status; + this->sla_drain_holes = rhs.sla_drain_holes; this->layer_config_ranges = rhs.layer_config_ranges; // #ys_FIXME_experiment this->layer_height_profile = rhs.layer_height_profile; this->printable = rhs.printable; @@ -646,6 +573,7 @@ ModelObject& ModelObject::assign_copy(ModelObject &&rhs) assert(this->config.id() == rhs.config.id()); this->sla_support_points = std::move(rhs.sla_support_points); this->sla_points_status = std::move(rhs.sla_points_status); + this->sla_drain_holes = std::move(rhs.sla_drain_holes); this->layer_config_ranges = std::move(rhs.layer_config_ranges); // #ys_FIXME_experiment this->layer_height_profile = std::move(rhs.layer_height_profile); this->origin_translation = std::move(rhs.origin_translation); @@ -677,6 +605,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. @@ -831,7 +760,7 @@ TriangleMesh ModelObject::mesh() const } // 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 platter +// Currently used by ModelObject::mesh(), to calculate the 2D envelope for 2D plater // and to display the object statistics at ModelObject::print_info(). TriangleMesh ModelObject::raw_mesh() const { @@ -846,6 +775,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()).cast().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 { @@ -887,14 +848,12 @@ 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) - { if (v->is_model_part()) m_raw_bounding_box.merge(v->mesh().transformed_bounding_box(inst_matrix * v->get_matrix())); - } } return m_raw_bounding_box; } @@ -1061,6 +1020,58 @@ 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 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) + { + volume->supported_facets.clear(); + volume->seam_facets.clear(); + if (!volume->mesh().empty()) { + TriangleMesh mesh(volume->mesh()); + mesh.require_shared_vertices(); + + ModelVolume* vol = new_object->add_volume(mesh); + vol->name = volume->name; + vol->set_type(volume->type()); + // Don't copy the config's ID. + vol->config.assign_config(volume->config); + assert(vol->config.id().valid()); + assert(vol->config.id() != volume->config.id()); + vol->set_material(volume->material_id(), *volume->material()); + + // Perform conversion + if (volume_idxs.empty() || + std::find(volume_idxs.begin(), volume_idxs.end(), vol_idx) != volume_idxs.end()) { + vol->scale_geometry_after_creation(versor); + vol->set_offset(versor.cwiseProduct(volume->get_offset())); + } + 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 material_ids; @@ -1099,17 +1110,19 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b if (keep_upper) { upper->set_model(nullptr); upper->sla_support_points.clear(); + upper->sla_drain_holes.clear(); upper->sla_points_status = sla::PointsStatus::NoPoints; upper->clear_volumes(); - upper->input_file = ""; + upper->input_file.clear(); } if (keep_lower) { lower->set_model(nullptr); lower->sla_support_points.clear(); + lower->sla_drain_holes.clear(); lower->sla_points_status = sla::PointsStatus::NoPoints; lower->clear_volumes(); - lower->input_file = ""; + lower->input_file.clear(); } // Because transformations are going to be applied to meshes directly, @@ -1133,6 +1146,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. @@ -1142,7 +1158,8 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b if (keep_upper) { upper->add_volume(*volume); } if (keep_lower) { lower->add_volume(*volume); } } - else { + else if (! volume->mesh().empty()) { + TriangleMesh upper_mesh, lower_mesh; // Transform the mesh by the combined transformation matrix. @@ -1150,7 +1167,9 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b TriangleMesh mesh(volume->mesh()); mesh.transform(instance_matrix * volume_matrix, true); volume->reset_mesh(); - + + mesh.require_shared_vertices(); + // Perform cut TriangleMeshSlicer tms(&mesh); tms.cut(float(z), &upper_mesh, &lower_mesh); @@ -1173,7 +1192,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(vol->config) = static_cast(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()); @@ -1182,8 +1201,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(vol->config) = static_cast(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()); @@ -1260,7 +1279,7 @@ void ModelObject::split(ModelObjectPtrs* new_objects) ModelObject* new_object = m_model->add_object(); new_object->name = this->name; // Don't copy the config's ID. - static_cast(new_object->config) = static_cast(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()); @@ -1275,6 +1294,8 @@ void ModelObject::split(ModelObjectPtrs* new_objects) } new_vol->set_offset(Vec3d::Zero()); + // reset the source to disable reload from disk + new_vol->source = ModelVolume::Source(); new_objects->emplace_back(new_object); delete mesh; } @@ -1282,6 +1303,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. @@ -1330,6 +1372,8 @@ void ModelObject::bake_xy_rotation_into_meshes(size_t instance_idx) model_volume->set_mirror(Vec3d(1., 1., 1.)); // Move the reference point of the volume to compensate for the change of the instance trafo. model_volume->set_offset(volume_offset_correction * volume_trafo.get_offset()); + // reset the source to disable reload from disk + model_volume->source = ModelVolume::Source(); } this->invalidate_bounding_box(); @@ -1392,8 +1436,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; } @@ -1473,9 +1517,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) @@ -1641,6 +1682,8 @@ size_t ModelVolume::split(unsigned int max_extruders) this->calculate_convex_hull(); // Assign a new unique ID, so that a new GLVolume will be generated. this->set_new_unique_id(); + // reset the source to disable reload from disk + this->source = ModelVolume::Source(); } else this->object->volumes.insert(this->object->volumes.begin() + (++ivolume), new ModelVolume(object, *this, std::move(*mesh))); @@ -1683,6 +1726,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) @@ -1823,6 +1874,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> 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& 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(); // zero current state or create new + std::vector& 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) @@ -1886,6 +2014,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; isupported_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; iseam_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) @@ -1896,7 +2044,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) { @@ -1966,6 +2114,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 410c2d3ef4..c2965f60cb 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -3,14 +3,15 @@ #include "libslic3r.h" #include "Geometry.hpp" -#include "Layer.hpp" #include "ObjectID.hpp" #include "Point.hpp" #include "PrintConfig.hpp" #include "Slicing.hpp" -#include "SLA/SLACommon.hpp" +#include "SLA/SupportPoint.hpp" +#include "SLA/Hollowing.hpp" #include "TriangleMesh.hpp" #include "Arrange.hpp" +#include "CustomGCode.hpp" #include #include @@ -37,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; @@ -53,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 void serialize(Archive &ar) { - ar(cereal::base_class(this)); - } + // called by ModelObject::assign_copy() + ModelConfigObject& operator=(const ModelConfigObject &rhs) = default; + ModelConfigObject& operator=(ModelConfigObject &&rhs) = default; + + template void serialize(Archive &ar) { + ar(cereal::base_class(this)); + } }; namespace Internal { @@ -133,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) @@ -159,7 +165,7 @@ private: ModelMaterial() : ObjectBase(-1), config(-1), m_model(nullptr) { assert(this->id().invalid()); assert(this->config.id().invalid()); } template void serialize(Archive &ar) { assert(this->id().invalid()); assert(this->config.id().invalid()); - Internal::StaticSerializationWrapper config_wrapper(config); + Internal::StaticSerializationWrapper config_wrapper(config); ar(attributes, config_wrapper); // assert(this->id().valid()); assert(this->config.id().valid()); } @@ -170,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 get() const throw() { return m_data; } + bool empty() const throw() { return m_data.empty(); } + void set(const std::vector &data) { if (m_data != data) { m_data = data; this->touch(); } } + void set(std::vector &&data) { if (m_data != data) { m_data = std::move(data); this->touch(); } } + void clear() { m_data.clear(); this->touch(); } + + template void serialize(Archive &ar) + { + ar(cereal::base_class(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 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, @@ -186,22 +231,25 @@ 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 are packed into a 1D array. - std::vector layer_height_profile; + LayerHeightProfile layer_height_profile; // Whether or not this object is printable bool printable; // This vector holds position of selected support points for SLA. The data are // saved in mesh coordinates to allow using them for several instances. // The format is (x, y, z, point_size, supports_island) - std::vector sla_support_points; + sla::SupportPoints sla_support_points; // To keep track of where the points came from (used for synchronization between // the SLA gizmo and the backend). - sla::PointsStatus sla_points_status = sla::PointsStatus::NoPoints; + sla::PointsStatus sla_points_status = sla::PointsStatus::NoPoints; + + // Holes to be drilled into the object so resin can flow out + sla::DrainHoles sla_drain_holes; /* This vector accumulates the total translation applied to the object by the center_around_origin() method. Callers might want to apply the same translation @@ -209,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); @@ -236,8 +284,10 @@ public: // A mesh containing all transformed instances of this object. TriangleMesh mesh() const; // 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 platter. + // 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. @@ -275,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 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. @@ -308,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) @@ -366,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 void serialize(Archive &ar) { ar(cereal::base_class(this)); - Internal::StaticSerializationWrapper config_wrapper(config); - ar(name, input_file, instances, volumes, config_wrapper, layer_config_ranges, layer_height_profile, sla_support_points, sla_points_status, printable, origin_translation, + Internal::StaticSerializationWrapper config_wrapper(config); + Internal::StaticSerializationWrapper 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); } }; @@ -386,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>& 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 void serialize(Archive &ar) + { + ar(cereal::base_class(this), m_data); + } + + std::map> m_data; + + // To access set_new_unique_id() when copy / pasting a ModelVolume. + friend class ModelVolume; +}; + // An object STL, or a modifier volume, over which a different set of parameters shall be applied. // ModelVolume instances are owned by a ModelObject. class ModelVolume final : public ObjectBase @@ -399,8 +551,13 @@ public: int object_idx{ -1 }; int volume_idx{ -1 }; Vec3d mesh_offset{ Vec3d::Zero() }; + Geometry::Transformation transform; - template void serialize(Archive& ar) { ar(input_file, object_idx, volume_idx, mesh_offset); } + template void serialize(Archive& ar) { + //FIXME Vojtech: Serialize / deserialize only if the Source is set. + // likely testing input_file or object_idx would be sufficient. + ar(input_file, object_idx, volume_idx, mesh_offset, transform); + } }; Source source; @@ -413,10 +570,16 @@ public: void reset_mesh() { m_mesh = std::make_shared(); } // 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; } @@ -466,6 +629,7 @@ public: const Geometry::Transformation& get_transformation() const { return m_transformation; } void set_transformation(const Geometry::Transformation& transformation) { m_transformation = transformation; } + void set_transformation(const Transform3d &trafo) { m_transformation.set_from_transform(trafo); } const Vec3d& get_offset() const { return m_transformation.get_offset(); } double get_offset(Axis axis) const { return m_transformation.get_offset(axis); } @@ -494,7 +658,12 @@ public: const Transform3d& get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const { return m_transformation.get_matrix(dont_translate, dont_rotate, dont_scale, dont_mirror); } - void set_new_unique_id() { ObjectBase::set_new_unique_id(); this->config.set_new_unique_id(); } + void set_new_unique_id() { + ObjectBase::set_new_unique_id(); + this->config.set_new_unique_id(); + this->supported_facets.set_new_unique_id(); + this->seam_facets.set_new_unique_id(); + } protected: friend class Print; @@ -505,7 +674,7 @@ protected: // Copies IDs of both the ModelVolume and its config. explicit ModelVolume(const ModelVolume &rhs) = default; void set_model_object(ModelObject *model_object) { object = model_object; } - void assign_new_unique_ids_recursive() override { ObjectBase::set_new_unique_id(); config.set_new_unique_id(); } + void assign_new_unique_ids_recursive() override; void transform_this_mesh(const Transform3d& t, bool fix_left_handed); void transform_this_mesh(const Matrix3d& m, bool fix_left_handed); @@ -529,35 +698,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; @@ -565,12 +770,17 @@ private: friend class cereal::access; friend class UndoRedo::StackImpl; // Used for deserialization, therefore no IDs are allocated. - ModelVolume() : ObjectBase(-1), config(-1), object(nullptr) { - assert(this->id().invalid()); assert(this->config.id().invalid()); + ModelVolume() : ObjectBase(-1), config(-1), supported_facets(-1), seam_facets(-1), object(nullptr) { + assert(this->id().invalid()); + assert(this->config.id().invalid()); + assert(this->supported_facets.id().invalid()); + assert(this->seam_facets.id().invalid()); } template void load(Archive &ar) { bool has_convex_hull; ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull); + cereal::load_by_value(ar, supported_facets); + cereal::load_by_value(ar, seam_facets); cereal::load_by_value(ar, config); assert(m_mesh); if (has_convex_hull) { @@ -584,31 +794,34 @@ private: template void save(Archive &ar) const { bool has_convex_hull = m_convex_hull.get() != nullptr; ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull); + cereal::save_by_value(ar, 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; @@ -655,18 +868,19 @@ 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); set_offset(X, unscale(offs(X))); set_offset(Y, unscale(offs(Y))); + this->object->invalidate_bounding_box(); } protected: @@ -683,10 +897,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; @@ -701,6 +915,7 @@ private: } }; + class ModelWipeTower final : public ObjectBase { public: @@ -745,6 +960,9 @@ public: ModelObjectPtrs objects; // Wipe tower object. ModelWipeTower wipe_tower; + + // Extensions for color print + CustomGCode::Info custom_gcode_per_print_z; // Default constructor assigns a new ID to the model. Model() { assert(this->id().valid()); } @@ -791,14 +1009,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(); // Ensures that the min z of the model is not negative void adjust_min_z(); @@ -811,7 +1029,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(); @@ -820,7 +1038,7 @@ private: template void serialize(Archive &ar) { Internal::StaticSerializationWrapper wipe_tower_wrapper(wipe_tower); ar(materials, objects, wipe_tower_wrapper); - } + } }; #undef OBJECTBASE_DERIVED_COPY_MOVE_CLONE @@ -838,6 +1056,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); @@ -855,7 +1081,7 @@ void check_model_ids_equal(const Model &model1, const Model &model2); namespace cereal { template struct specialize {}; - template struct specialize {}; + template struct specialize {}; } #endif /* slic3r_Model_hpp_ */ diff --git a/src/libslic3r/ModelArrange.cpp b/src/libslic3r/ModelArrange.cpp new file mode 100644 index 0000000000..230b04de5d --- /dev/null +++ b/src/libslic3r/ModelArrange.cpp @@ -0,0 +1,85 @@ +#include "ModelArrange.hpp" + +#include +#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(), + 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 = Geometry::convex_hull(apts); + 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 0000000000..124c5c018f --- /dev/null +++ b/src/libslic3r/ModelArrange.hpp @@ -0,0 +1,71 @@ +#ifndef MODELARRANGE_HPP +#define MODELARRANGE_HPP + +#include + +namespace Slic3r { + +class Model; +class ModelInstance; +using ModelInstancePtrs = std::vector; + +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; + +[[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 +bool arrange_objects(Model & model, + const TBed & bed, + const ArrangeParams ¶ms, + 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 +void duplicate(Model & model, + size_t copies_num, + const TBed & bed, + const ArrangeParams ¶ms, + 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 +void duplicate_objects(Model & model, + size_t copies_num, + const TBed & bed, + const ArrangeParams ¶ms, + 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 index 42bc6c2f1b..ae50df8f49 100644 --- a/src/libslic3r/MotionPlanner.cpp +++ b/src/libslic3r/MotionPlanner.cpp @@ -6,6 +6,7 @@ #include // for numeric_limits #include +#define BOOST_VORONOI_USE_GMP 1 #include "boost/polygon/voronoi.hpp" using boost::polygon::voronoi_builder; using boost::polygon::voronoi_diagram; @@ -319,7 +320,7 @@ Polyline MotionPlannerGraph::shortest_path(size_t node_start, size_t node_end) c std::vector map_node_to_queue_id(m_adjacency_list.size(), size_t(-1)); distance[node_start] = 0.; - auto queue = make_mutable_priority_queue( + auto queue = make_mutable_priority_queue( [&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()); diff --git a/src/libslic3r/MutablePriorityQueue.hpp b/src/libslic3r/MutablePriorityQueue.hpp index da469b7ba2..b20bf60ea7 100644 --- a/src/libslic3r/MutablePriorityQueue.hpp +++ b/src/libslic3r/MutablePriorityQueue.hpp @@ -3,7 +3,7 @@ #include -template +template class MutablePriorityQueue { public: @@ -42,26 +42,30 @@ private: LessPredicate m_less_predicate; }; -template -MutablePriorityQueue make_mutable_priority_queue(IndexSetter &&index_setter, LessPredicate &&less_predicate) +template +MutablePriorityQueue make_mutable_priority_queue(IndexSetter &&index_setter, LessPredicate &&less_predicate) { - return MutablePriorityQueue( + return MutablePriorityQueue( std::forward(index_setter), std::forward(less_predicate)); } -template -inline void MutablePriorityQueue::clear() +template +inline void MutablePriorityQueue::clear() { -#ifndef NDEBUG - for (size_t idx = 0; idx < m_heap.size(); ++ idx) - // Mark as removed from the queue. - m_index_setter(m_heap[idx], std::numeric_limits::max()); +#ifdef NDEBUG + // Only mark as removed from the queue in release mode, if configured so. + if (ResetIndexWhenRemoved) #endif /* NDEBUG */ + { + for (size_t idx = 0; idx < m_heap.size(); ++ idx) + // Mark as removed from the queue. + m_index_setter(m_heap[idx], std::numeric_limits::max()); + } m_heap.clear(); } -template -inline void MutablePriorityQueue::push(const T &item) +template +inline void MutablePriorityQueue::push(const T &item) { size_t idx = m_heap.size(); m_heap.emplace_back(item); @@ -69,8 +73,8 @@ inline void MutablePriorityQueue::push(const T &i update_heap_up(0, idx); } -template -inline void MutablePriorityQueue::push(T &&item) +template +inline void MutablePriorityQueue::push(T &&item) { size_t idx = m_heap.size(); m_heap.emplace_back(std::move(item)); @@ -78,14 +82,18 @@ inline void MutablePriorityQueue::push(T &&item) update_heap_up(0, idx); } -template -inline void MutablePriorityQueue::pop() +template +inline void MutablePriorityQueue::pop() { assert(! m_heap.empty()); -#ifndef NDEBUG - // Mark as removed from the queue. - m_index_setter(m_heap.front(), std::numeric_limits::max()); +#ifdef NDEBUG + // Only mark as removed from the queue in release mode, if configured so. + if (ResetIndexWhenRemoved) #endif /* NDEBUG */ + { + // Mark as removed from the queue. + m_index_setter(m_heap.front(), std::numeric_limits::max()); + } if (m_heap.size() > 1) { m_heap.front() = m_heap.back(); m_heap.pop_back(); @@ -95,14 +103,18 @@ inline void MutablePriorityQueue::pop() m_heap.clear(); } -template -inline void MutablePriorityQueue::remove(size_t idx) +template +inline void MutablePriorityQueue::remove(size_t idx) { assert(idx < m_heap.size()); -#ifndef NDEBUG - // Mark as removed from the queue. - m_index_setter(m_heap[idx], std::numeric_limits::max()); +#ifdef NDEBUG + // Only mark as removed from the queue in release mode, if configured so. + if (ResetIndexWhenRemoved) #endif /* NDEBUG */ + { + // Mark as removed from the queue. + m_index_setter(m_heap[idx], std::numeric_limits::max()); + } if (idx + 1 == m_heap.size()) { m_heap.pop_back(); return; @@ -114,8 +126,8 @@ inline void MutablePriorityQueue::remove(size_t i update_heap_up(0, idx); } -template -inline void MutablePriorityQueue::update_heap_up(size_t top, size_t bottom) +template +inline void MutablePriorityQueue::update_heap_up(size_t top, size_t bottom) { size_t childIdx = bottom; T *child = &m_heap[childIdx]; @@ -138,8 +150,8 @@ inline void MutablePriorityQueue::update_heap_up( } } -template -inline void MutablePriorityQueue::update_heap_down(size_t top, size_t bottom) +template +inline void MutablePriorityQueue::update_heap_down(size_t top, size_t bottom) { size_t parentIdx = top; T *parent = &m_heap[parentIdx]; diff --git a/src/libslic3r/ObjectID.cpp b/src/libslic3r/ObjectID.cpp index b188d84c06..7177c47fec 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 484d1173ba..ea7c748a50 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 static void load_and_construct(Archive & ar, cereal::construct &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 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 new file mode 100644 index 0000000000..31ae203ddf --- /dev/null +++ b/src/libslic3r/OpenVDBUtils.cpp @@ -0,0 +1,164 @@ +#define NOMINMAX +#include "OpenVDBUtils.hpp" +#include +#include +#include +#include + +//#include "MTUtils.hpp" + +namespace Slic3r { + +class TriangleMeshDataAdapter { +public: + const TriangleMesh &mesh; + + size_t polygonCount() const { return mesh.its.indices.size(); } + size_t pointCount() const { return mesh.its.vertices.size(); } + size_t vertexCount(size_t) const { return 3; } + + // Return position pos in local grid index space for polygon n and vertex v + void getIndexSpacePoint(size_t n, size_t v, openvdb::Vec3d& pos) const; +}; + +class Contour3DDataAdapter { +public: + const sla::Contour3D &mesh; + + size_t polygonCount() const { return mesh.faces3.size() + mesh.faces4.size(); } + size_t pointCount() const { return mesh.points.size(); } + size_t vertexCount(size_t n) const { return n < mesh.faces3.size() ? 3 : 4; } + + // Return position pos in local grid index space for polygon n and vertex v + void getIndexSpacePoint(size_t n, size_t v, openvdb::Vec3d& pos) const; +}; + +void TriangleMeshDataAdapter::getIndexSpacePoint(size_t n, + size_t v, + openvdb::Vec3d &pos) const +{ + auto vidx = size_t(mesh.its.indices[n](Eigen::Index(v))); + Slic3r::Vec3d p = mesh.its.vertices[vidx].cast(); + pos = {p.x(), p.y(), p.z()}; +} + +void Contour3DDataAdapter::getIndexSpacePoint(size_t n, + size_t v, + openvdb::Vec3d &pos) const +{ + size_t vidx = 0; + if (n < mesh.faces3.size()) vidx = size_t(mesh.faces3[n](Eigen::Index(v))); + else vidx = size_t(mesh.faces4[n - mesh.faces3.size()](Eigen::Index(v))); + + Slic3r::Vec3d p = mesh.points[vidx]; + pos = {p.x(), p.y(), p.z()}; +} + + +// 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, + float interiorBandWidth, + int flags) +{ + openvdb::initialize(); + + 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( + 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( + TriangleMeshDataAdapter{mesh}, tr, exteriorBandWidth, + interiorBandWidth, flags); + } + + return grid; +} + +openvdb::FloatGrid::Ptr mesh_to_grid(const sla::Contour3D &mesh, + const openvdb::math::Transform &tr, + float exteriorBandWidth, + float interiorBandWidth, + int flags) +{ + openvdb::initialize(); + return openvdb::tools::meshToVolume( + Contour3DDataAdapter{mesh}, tr, exteriorBandWidth, interiorBandWidth, + flags); +} + +template +sla::Contour3D _volumeToMesh(const Grid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) +{ + openvdb::initialize(); + + std::vector points; + std::vector triangles; + std::vector quads; + + openvdb::tools::volumeToMesh(grid, points, triangles, quads, isovalue, + adaptivity, relaxDisorientedTriangles); + + sla::Contour3D ret; + ret.points.reserve(points.size()); + ret.faces3.reserve(triangles.size()); + ret.faces4.reserve(quads.size()); + + for (auto &v : points) ret.points.emplace_back(to_vec3d(v)); + for (auto &v : triangles) ret.faces3.emplace_back(to_vec3i(v)); + for (auto &v : quads) ret.faces4.emplace_back(to_vec4i(v)); + + return ret; +} + +TriangleMesh grid_to_mesh(const openvdb::FloatGrid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) +{ + return to_triangle_mesh( + _volumeToMesh(grid, isovalue, adaptivity, relaxDisorientedTriangles)); +} + +sla::Contour3D grid_to_contour3d(const openvdb::FloatGrid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles) +{ + return _volumeToMesh(grid, isovalue, adaptivity, + relaxDisorientedTriangles); +} + +openvdb::FloatGrid::Ptr redistance_grid(const openvdb::FloatGrid &grid, double iso, double er, double ir) +{ + return openvdb::tools::levelSetRebuild(grid, float(iso), float(er), float(ir)); +} + +} // namespace Slic3r diff --git a/src/libslic3r/OpenVDBUtils.hpp b/src/libslic3r/OpenVDBUtils.hpp new file mode 100644 index 0000000000..e35231d35b --- /dev/null +++ b/src/libslic3r/OpenVDBUtils.hpp @@ -0,0 +1,44 @@ +#ifndef OPENVDBUTILS_HPP +#define OPENVDBUTILS_HPP + +#include +#include +#include + +namespace Slic3r { + +inline Vec3f to_vec3f(const openvdb::Vec3s &v) { return Vec3f{v.x(), v.y(), v.z()}; } +inline Vec3d to_vec3d(const openvdb::Vec3s &v) { return to_vec3f(v).cast(); } +inline Vec3i to_vec3i(const openvdb::Vec3I &v) { return Vec3i{int(v[0]), int(v[1]), int(v[2])}; } +inline Vec4i to_vec4i(const openvdb::Vec4I &v) { return Vec4i{int(v[0]), int(v[1]), int(v[2]), int(v[3])}; } + +openvdb::FloatGrid::Ptr mesh_to_grid(const TriangleMesh & mesh, + const openvdb::math::Transform &tr = {}, + float exteriorBandWidth = 3.0f, + float interiorBandWidth = 3.0f, + int flags = 0); + +openvdb::FloatGrid::Ptr mesh_to_grid(const sla::Contour3D & mesh, + const openvdb::math::Transform &tr = {}, + float exteriorBandWidth = 3.0f, + float interiorBandWidth = 3.0f, + int flags = 0); + +sla::Contour3D grid_to_contour3d(const openvdb::FloatGrid &grid, + double isovalue, + double adaptivity, + bool relaxDisorientedTriangles = true); + +TriangleMesh grid_to_mesh(const openvdb::FloatGrid &grid, + double isovalue = 0.0, + double adaptivity = 0.0, + bool relaxDisorientedTriangles = true); + +openvdb::FloatGrid::Ptr redistance_grid(const openvdb::FloatGrid &grid, + double iso, + double ext_range = 3., + double int_range = 3.); + +} // namespace Slic3r + +#endif // OPENVDBUTILS_HPP diff --git a/src/libslic3r/Optimize/BruteforceOptimizer.hpp b/src/libslic3r/Optimize/BruteforceOptimizer.hpp new file mode 100644 index 0000000000..2daef538e7 --- /dev/null +++ b/src/libslic3r/Optimize/BruteforceOptimizer.hpp @@ -0,0 +1,140 @@ +#ifndef BRUTEFORCEOPTIMIZER_HPP +#define BRUTEFORCEOPTIMIZER_HPP + +#include + +namespace Slic3r { namespace opt { + +namespace detail { +// Implementing a bruteforce optimizer + +// Return the number of iterations needed to reach a specific grid position (idx) +template +long num_iter(const std::array &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 + bool run(std::array &idx, + Result &result, + const Bounds &bounds, + Fn &&fn, + Cmp &&cmp) + { + if (stc.stop_condition()) return false; + + if constexpr (D < 0) { // Let's evaluate fn + Input 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(idx, result, bounds, std::forward(fn), + std::forward(cmp))) + return false; + } + } + + return true; + } + + template + Result optimize(Fn&& fn, + const Input &/*initvals*/, + const Bounds& bounds) + { + std::array idx = {}; + Result result; + + if (to_min) { + result.score = std::numeric_limits::max(); + run(idx, result, bounds, std::forward(fn), + std::less{}); + } + else { + result.score = std::numeric_limits::lowest(); + run(idx, result, bounds, std::forward(fn), + std::greater{}); + } + + return result; + } +}; + +} // namespace detail + +using AlgBruteForce = detail::AlgBurteForce; + +template<> +class Optimizer { + 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 + Result optimize(Func&& func, + const Input &initvals, + const Bounds& bounds) + { + return m_alg.optimize(std::forward(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 0000000000..826b1632ae --- /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 +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#include + +#include + +namespace Slic3r { namespace opt { + +namespace detail { + +// Helper types for NLopt algorithm selection in template contexts +template 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 +struct NLoptAlgComb {}; + +template struct IsNLoptAlg { + static const constexpr bool value = false; +}; + +template struct IsNLoptAlg> { + static const constexpr bool value = true; +}; + +template +struct IsNLoptAlg> { + static const constexpr bool value = true; +}; + +template +using NLoptOnly = std::enable_if_t::value, T>; + + +enum class OptDir { MIN, MAX }; // Where to optimize + +struct NLopt { // Helper RAII class for nlopt_opt + nlopt_opt ptr = nullptr; + + template explicit NLopt(A&&...a) + { + ptr = nlopt_create(std::forward(a)...); + } + + NLopt(const NLopt&) = delete; + NLopt(NLopt&&) = delete; + NLopt& operator=(const NLopt&) = delete; + NLopt& operator=(NLopt&&) = delete; + + ~NLopt() { nlopt_destroy(ptr); } +}; + +template class NLoptOpt {}; + +// Optimizers based on NLopt. +template class NLoptOpt> { +protected: + StopCriteria m_stopcr; + OptDir m_dir; + + template using TOptData = + std::tuple*, NLoptOpt*, nlopt_opt>; + + template + static double optfunc(unsigned n, const double *params, + double *gradient, + void *data) + { + assert(n >= N); + + auto tdata = static_cast*>(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(params); + + double scoreval = 0.; + using RetT = decltype((*fnptr)(funval)); + if constexpr (std::is_convertible_v>) { + ScoreGradient 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 + void set_up(NLopt &nl, const Bounds& bounds) + { + std::array 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 + Result optimize(NLopt &nl, Fn &&fn, const Input &initvals) + { + Result r; + + TOptData data = std::make_tuple(&fn, this, nl.ptr); + + switch(m_dir) { + case OptDir::MIN: + nlopt_set_min_objective(nl.ptr, optfunc, &data); break; + case OptDir::MAX: + nlopt_set_max_objective(nl.ptr, optfunc, &data); break; + } + + r.optimum = initvals; + r.resultcode = nlopt_optimize(nl.ptr, r.optimum.data(), &r.score); + + return r; + } + +public: + + template + Result optimize(Func&& func, + const Input &initvals, + const Bounds& bounds) + { + NLopt nl{alg, N}; + set_up(nl, bounds); + + return optimize(nl, std::forward(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 +class NLoptOpt>: public NLoptOpt> +{ + using Base = NLoptOpt>; +public: + + template + Result optimize(Fn&& f, + const Input &initvals, + const Bounds& 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(f), initvals); + } + + explicit NLoptOpt(StopCriteria stopcr = {}) : Base{stopcr} {} +}; + +} // namespace detail; + +// Optimizers based on NLopt. +template class Optimizer> { + detail::NLoptOpt 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 + Result optimize(Func&& func, + const Input &initvals, + const Bounds& bounds) + { + return m_opt.optimize(std::forward(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; +using AlgNLoptSubplex = detail::NLoptAlg; +using AlgNLoptSimplex = detail::NLoptAlg; +using AlgNLoptDIRECT = detail::NLoptAlg; +using AlgNLoptMLSL = detail::NLoptAlg; + +}} // 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 0000000000..05191eba26 --- /dev/null +++ b/src/libslic3r/Optimize/Optimizer.hpp @@ -0,0 +1,182 @@ +#ifndef OPTIMIZER_HPP +#define OPTIMIZER_HPP + +#include +#include +#include +#include +#include +#include +#include + +namespace Slic3r { namespace opt { + +// A type to hold the complete result of the optimization. +template struct Result { + int resultcode; // Method dependent + std::array 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::min(), + double max = std::numeric_limits::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 using Input = std::array; +template using Bounds = std::array; + +// 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 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 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 struct ScoreGradient { + double score; + std::optional> gradient; + + ScoreGradient(double s, const std::array &grad) + : score{s}, gradient{grad} + {} +}; + +// Helper to be used in static_assert. +template struct always_false { enum { value = false }; }; + +// Basic interface to optimizer object +template class Optimizer { +public: + + Optimizer(const StopCriteria &) + { + static_assert (always_false::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 &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 + Result optimize(Func&& /*func*/, + const Input &/*initvals*/, + const Bounds& /*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 auto to_arr(const T *a) +{ + std::array r; + std::copy(a, a + N, std::begin(r)); + return r; +} + +template auto to_arr(const T (&a) [N]) +{ + return to_arr(static_cast(a)); +} + +} // namespace detail + +// Helper functions to create bounds, initial value +template Bounds bounds(const Bound (&b) [N]) { return detail::to_arr(b); } +template Input initvals(const double (&a) [N]) { return detail::to_arr(a); } +template auto score_gradient(double s, const double (&grad)[N]) +{ + return ScoreGradient(s, detail::to_arr(grad)); +} + +}} // namespace Slic3r::opt + +#endif // OPTIMIZER_HPP diff --git a/src/libslic3r/PNGRead.cpp b/src/libslic3r/PNGRead.cpp new file mode 100644 index 0000000000..e66143b845 --- /dev/null +++ b/src/libslic3r/PNGRead.cpp @@ -0,0 +1,100 @@ +#include "PNGRead.hpp" + +#include + +#include +#include + +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(rb.buf); + std::copy(inbuf, inbuf + PNG_SIG_BYTES, buf); +#else + auto buf = static_cast(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. +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(png_get_io_ptr(png_ptr)); + + if (!reader || !reader->is_ok()) return; + + reader->read(static_cast(outBytes), byteCountToRead); +} + +bool decode_png(IStream &in_buf, ImageGreyscale &out_img) +{ + static const constexpr int PNG_SIG_BYTES = 8; + + std::vector 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(&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(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; +} + +}} // namespace Slic3r::png diff --git a/src/libslic3r/PNGRead.hpp b/src/libslic3r/PNGRead.hpp new file mode 100644 index 0000000000..082edd5691 --- /dev/null +++ b/src/libslic3r/PNGRead.hpp @@ -0,0 +1,70 @@ +#ifndef PNGREAD_HPP +#define PNGREAD_HPP + +#include +#include +#include + +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 struct Image { + std::vector buf; + size_t rows, cols; + PxT get(size_t row, size_t col) const { return buf[row * cols + col]; } +}; + +using ImageGreyscale = Image; + +// 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; +// 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 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(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... + +}} // namespace Slic3r::png + +#endif // PNGREAD_HPP diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 450fff3515..3cd91dafe4 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -312,6 +312,10 @@ 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) { + // Remove all but the largest area polygon. + keep_largest_contour_only(offsets); + } } else { //FIXME Is this offset correct if the line width of the inner perimeters differs // from the line width of the infill? diff --git a/src/libslic3r/PlaceholderParser.cpp b/src/libslic3r/PlaceholderParser.cpp index 0cfd974152..0434e3a0aa 100644 --- a/src/libslic3r/PlaceholderParser.cpp +++ b/src/libslic3r/PlaceholderParser.cpp @@ -1,4 +1,6 @@ #include "PlaceholderParser.hpp" +#include "Exception.hpp" +#include "Flow.hpp" #include #include #include @@ -99,11 +101,7 @@ static inline bool opts_equal(const DynamicConfig &config_old, const DynamicConf const ConfigOption *opt_old = config_old.option(opt_key); const ConfigOption *opt_new = config_new.option(opt_key); assert(opt_new != nullptr); - if (opt_old == nullptr) - return false; - return (opt_new->type() == coFloatOrPercent) ? - dynamic_cast(opt_old)->value == config_new.get_abs_value(opt_key) : - *opt_new == *opt_old; + return opt_old != nullptr && *opt_new == *opt_old; } std::vector PlaceholderParser::config_diff(const DynamicPrintConfig &rhs) @@ -126,14 +124,7 @@ bool PlaceholderParser::apply_config(const DynamicPrintConfig &rhs) bool modified = false; for (const t_config_option_key &opt_key : rhs.keys()) { if (! opts_equal(m_config, rhs, opt_key)) { - // Store a copy of the config option. - // Convert FloatOrPercent values to floats first. - //FIXME there are some ratio_over chains, which end with empty ratio_with. - // For example, XXX_extrusion_width parameters are not handled by get_abs_value correctly. - const ConfigOption *opt_rhs = rhs.option(opt_key); - this->set(opt_key, (opt_rhs->type() == coFloatOrPercent) ? - new ConfigOptionFloat(rhs.get_abs_value(opt_key)) : - opt_rhs->clone()); + this->set(opt_key, rhs.option(opt_key)->clone()); modified = true; } } @@ -142,16 +133,8 @@ bool PlaceholderParser::apply_config(const DynamicPrintConfig &rhs) void PlaceholderParser::apply_only(const DynamicPrintConfig &rhs, const std::vector &keys) { - for (const t_config_option_key &opt_key : keys) { - // Store a copy of the config option. - // Convert FloatOrPercent values to floats first. - //FIXME there are some ratio_over chains, which end with empty ratio_with. - // For example, XXX_extrusion_width parameters are not handled by get_abs_value correctly. - const ConfigOption *opt_rhs = rhs.option(opt_key); - this->set(opt_key, (opt_rhs->type() == coFloatOrPercent) ? - new ConfigOptionFloat(rhs.get_abs_value(opt_key)) : - opt_rhs->clone()); - } + for (const t_config_option_key &opt_key : keys) + this->set(opt_key, rhs.option(opt_key)->clone()); } void PlaceholderParser::apply_config(DynamicPrintConfig &&rhs) @@ -332,6 +315,21 @@ namespace client return expr(); } + expr unary_integer(const Iterator start_pos) const + { + switch (this->type) { + case TYPE_INT : + return expr(this->i(), start_pos, this->it_range.end()); + case TYPE_DOUBLE: + return expr(static_cast(this->d()), start_pos, this->it_range.end()); + default: + this->throw_exception("Cannot convert to integer."); + } + assert(false); + // Suppress compiler warnings. + return expr(); + } + expr unary_not(const Iterator start_pos) const { switch (this->type) { @@ -403,7 +401,7 @@ namespace client { this->throw_if_not_numeric("Cannot divide a non-numeric type."); rhs.throw_if_not_numeric("Cannot divide with a non-numeric type."); - if ((this->type == TYPE_INT) ? (rhs.i() == 0) : (rhs.d() == 0.)) + if ((rhs.type == TYPE_INT) ? (rhs.i() == 0) : (rhs.d() == 0.)) rhs.throw_exception("Division by zero"); if (this->type == TYPE_DOUBLE || rhs.type == TYPE_DOUBLE) { double d = this->as_d() / rhs.as_d(); @@ -415,6 +413,22 @@ namespace client return *this; } + expr &operator%=(const expr &rhs) + { + this->throw_if_not_numeric("Cannot divide a non-numeric type."); + rhs.throw_if_not_numeric("Cannot divide with a non-numeric type."); + if ((rhs.type == TYPE_INT) ? (rhs.i() == 0) : (rhs.d() == 0.)) + rhs.throw_exception("Division by zero"); + if (this->type == TYPE_DOUBLE || rhs.type == TYPE_DOUBLE) { + double d = std::fmod(this->as_d(), rhs.as_d()); + this->data.d = d; + this->type = TYPE_DOUBLE; + } else + this->data.i %= rhs.i(); + this->it_range = boost::iterator_range(this->it_range.begin(), rhs.it_range.end()); + return *this; + } + static void to_string2(expr &self, std::string &out) { out = self.to_string(); @@ -604,7 +618,7 @@ namespace client return os; } - struct MyContext { + struct MyContext : public ConfigOptionResolver { const DynamicConfig *external_config = nullptr; const DynamicConfig *config = nullptr; const DynamicConfig *config_override = nullptr; @@ -619,7 +633,7 @@ namespace client static void evaluate_full_macro(const MyContext *ctx, bool &result) { result = ! ctx->just_boolean_expression; } - const ConfigOption* resolve_symbol(const std::string &opt_key) const + const ConfigOption* optptr(const t_config_option_key &opt_key) const override { const ConfigOption *opt = nullptr; if (config_override != nullptr) @@ -631,6 +645,8 @@ namespace client return opt; } + const ConfigOption* resolve_symbol(const std::string &opt_key) const { return this->optptr(opt_key); } + template static void legacy_variable_expansion( const MyContext *ctx, @@ -727,7 +743,43 @@ namespace client case coPoint: output.set_s(opt.opt->serialize()); break; case coBool: output.set_b(opt.opt->getBool()); break; case coFloatOrPercent: - ctx->throw_exception("FloatOrPercent variables are not supported", opt.it_range); + { + std::string opt_key(opt.it_range.begin(), opt.it_range.end()); + if (boost::ends_with(opt_key, "extrusion_width")) { + // Extrusion width supports defaults and a complex graph of dependencies. + output.set_d(Flow::extrusion_width(opt_key, *ctx, static_cast(ctx->current_extruder_id))); + } else if (! static_cast(opt.opt)->percent) { + // Not a percent, just return the value. + output.set_d(opt.opt->getFloat()); + } else { + // Resolve dependencies using the "ratio_over" link to a parent value. + const ConfigOptionDef *opt_def = print_config_def.get(opt_key); + assert(opt_def != nullptr); + double v = opt.opt->getFloat() * 0.01; // percent to ratio + for (;;) { + const ConfigOption *opt_parent = opt_def->ratio_over.empty() ? nullptr : ctx->resolve_symbol(opt_def->ratio_over); + if (opt_parent == nullptr) + ctx->throw_exception("FloatOrPercent variable failed to resolve the \"ratio_over\" dependencies", opt.it_range); + if (boost::ends_with(opt_def->ratio_over, "extrusion_width")) { + // Extrusion width supports defaults and a complex graph of dependencies. + assert(opt_parent->type() == coFloatOrPercent); + v *= Flow::extrusion_width(opt_def->ratio_over, static_cast(opt_parent), *ctx, static_cast(ctx->current_extruder_id)); + break; + } + if (opt_parent->type() == coFloat || opt_parent->type() == coFloatOrPercent) { + v *= opt_parent->getFloat(); + if (opt_parent->type() == coFloat || ! static_cast(opt_parent)->percent) + break; + v *= 0.01; // percent to ratio + } + // Continue one level up in the "ratio_over" hierarchy. + opt_def = print_config_def.get(opt_def->ratio_over); + assert(opt_def != nullptr); + } + output.set_d(v); + } + break; + } default: ctx->throw_exception("Unknown scalar variable type", opt.it_range); } @@ -814,7 +866,7 @@ namespace client } else { // Use the human readable error message. msg += ". "; - msg + it->second; + msg += it->second; } } msg += '\n'; @@ -1087,6 +1139,7 @@ namespace client unary_expression(_r1) [_val = _1] >> *( (lit('*') > unary_expression(_r1) ) [_val *= _1] | (lit('/') > unary_expression(_r1) ) [_val /= _1] + | (lit('%') > unary_expression(_r1) ) [_val %= _1] ); multiplicative_expression.name("multiplicative_expression"); @@ -1102,11 +1155,13 @@ namespace client static void string_(boost::iterator_range &it_range, expr &out) { out = expr(std::string(it_range.begin() + 1, it_range.end() - 1), it_range.begin(), it_range.end()); } static void expr_(expr &value, Iterator &end_pos, expr &out) - { out = expr(std::move(value), out.it_range.begin(), end_pos); } + { auto begin_pos = out.it_range.begin(); out = expr(std::move(value), begin_pos, end_pos); } static void minus_(expr &value, expr &out) { out = value.unary_minus(out.it_range.begin()); } static void not_(expr &value, expr &out) { out = value.unary_not(out.it_range.begin()); } + static void to_int(expr &value, expr &out) + { out = value.unary_integer(out.it_range.begin()); } }; unary_expression = iter_pos[px::bind(&FactorActions::set_start_pos, _1, _val)] >> ( scalar_variable_reference(_r1) [ _val = _1 ] @@ -1118,6 +1173,7 @@ namespace client [ px::bind(&expr::min, _val, _2) ] | (kw["max"] > '(' > conditional_expression(_r1) [_val = _1] > ',' > conditional_expression(_r1) > ')') [ px::bind(&expr::max, _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) ] | (kw[bool_] > iter_pos) [ px::bind(&FactorActions::bool_, _1, _2, _val) ] @@ -1145,6 +1201,7 @@ namespace client keywords.add ("and") ("if") + ("int") //("inf") ("else") ("elsif") @@ -1247,7 +1304,7 @@ 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::RuntimeError(context.error_message); } return output; } @@ -1263,7 +1320,7 @@ std::string PlaceholderParser::process(const std::string &templ, unsigned int cu } // 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 14fdc5c285..14be020aca 100644 --- a/src/libslic3r/PlaceholderParser.hpp +++ b/src/libslic3r/PlaceholderParser.hpp @@ -40,11 +40,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, const DynamicConfig *config_override = nullptr) const; + // Throws Slic3r::RuntimeError on syntax or runtime error. + std::string process(const std::string &templ, unsigned int current_extruder_id = 0, const DynamicConfig *config_override = 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::RuntimeError 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 c2417d0dc9..f3ed413421 100644 --- a/src/libslic3r/Point.cpp +++ b/src/libslic3r/Point.cpp @@ -44,16 +44,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 ¢er) { double cur_x = (double)(*this)(0); diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp index dced5c02a7..5082bb746f 100644 --- a/src/libslic3r/Point.hpp +++ b/src/libslic3r/Point.hpp @@ -24,7 +24,9 @@ typedef Eigen::Matrix Vec2crd; typedef Eigen::Matrix Vec3crd; typedef Eigen::Matrix Vec2i; typedef Eigen::Matrix Vec3i; +typedef Eigen::Matrix Vec2i32; typedef Eigen::Matrix Vec2i64; +typedef Eigen::Matrix Vec3i32; typedef Eigen::Matrix Vec3i64; // Vector types with a double coordinate base type. @@ -53,15 +55,18 @@ typedef Eigen::Transform Transform3d inline bool operator<(const Vec2d &lhs, const Vec2d &rhs) { return lhs(0) < rhs(0) || (lhs(0) == rhs(0) && lhs(1) < rhs(1)); } +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 Eigen::Matrix +to_2d(const Eigen::Matrix &ptN) { return {ptN(0), ptN(1)}; } + +//inline Vec2i32 to_2d(const Vec3i32 &pt3) { return Vec2i32(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)); } 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); } @@ -83,14 +88,16 @@ inline std::string to_string(const Vec3d &pt) { return std::string("[") + std: std::vector transform(const std::vector& points, const Transform3f& t); Pointf3s transform(const Pointf3s& points, const Transform3d& t); +template using Vec = Eigen::Matrix; + 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 +105,7 @@ public: template Point(const Eigen::MatrixBase &other) : Vec2crd(other) {} static Point new_scale(coordf_t x, coordf_t y) { return Point(coord_t(scale_(x)), coord_t(scale_(y))); } + static Point new_scale(const Vec2d &v) { return Point(coord_t(scale_(v.x())), coord_t(scale_(v.y()))); } // This method allows you to assign Eigen expressions to MyVectorType template @@ -112,8 +120,16 @@ 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 ¢er); Point rotated(double angle) const { Point res(*this); res.rotate(angle); return res; } Point rotated(double angle, const Point ¢er) const { Point res(*this); res.rotate(angle, center); return res; } @@ -286,6 +302,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> +inline constexpr FloatingOnly 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> +inline constexpr ScaledCoordOnly scaled(const Tin &v) noexcept +{ + //return static_cast(std::round(v / SCALING_FACTOR)); + return Tout(v / Tin(SCALING_FACTOR)); +} + +// Conversion for Eigen vectors (N dimensional points) +template, + int...EigenArgs> +inline Eigen::Matrix, N, EigenArgs...> +scaled(const Eigen::Matrix &v) +{ + return (v / SCALING_FACTOR).template cast(); +} + +// Conversion from arithmetic scaled type to floating point unscaled +template, + class = FloatingOnly> +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 = FloatingOnly, + int...EigenArgs> +inline constexpr Eigen::Matrix +unscaled(const Eigen::Matrix &v) noexcept +{ + return v.template cast() * SCALING_FACTOR; +} + } // namespace Slic3r // start Boost @@ -300,7 +382,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 +390,10 @@ namespace boost { namespace polygon { struct point_mutable_traits { 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 e1e2991444..13cdf65b4f 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,6 +260,44 @@ Point Polygon::point_projection(const Point &point) const return proj; } +std::vector Polygon::parameter_by_length() const +{ + // Parametrize the polygon by its length. + std::vector 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().norm(); + lengths.back() = lengths[lengths.size()-2] + (points.front() - points.back()).cast().norm(); + return lengths; +} + +void Polygon::densify(float min_length, std::vector* lengths_ptr) +{ + std::vector lengths_local; + std::vector& 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 Points &points) { return BoundingBox(points); diff --git a/src/libslic3r/Polygon.hpp b/src/libslic3r/Polygon.hpp index 8230b49f8a..f5aa289143 100644 --- a/src/libslic3r/Polygon.hpp +++ b/src/libslic3r/Polygon.hpp @@ -22,6 +22,7 @@ public: const Point& operator[](Points::size_type idx) const { return this->points[idx]; } Polygon() {} + virtual ~Polygon() = default; explicit Polygon(const Points &points) : MultiPoint(points) {} Polygon(std::initializer_list points) : MultiPoint(points) {} Polygon(const Polygon &other) : MultiPoint(other.points) {} @@ -39,14 +40,15 @@ public: // last point == first point for polygons const Point& last_point() const override { return this->points.front(); } - virtual Lines lines() const; + Lines lines() const override; Polyline split_at_vertex(const Point &point) const; // Split a closed polygon into an open polyline, with the split point duplicated at both ends. Polyline split_at_index(int index) const; // 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,12 +61,14 @@ 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* 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 parameter_by_length() const; }; inline bool operator==(const Polygon &lhs, const Polygon &rhs) { return lhs.points == rhs.points; } @@ -84,6 +88,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 +163,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 26aad83d2b..d24788c7bc 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()); } @@ -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 7e3a1e5065..2a53a13f9f 100644 --- a/src/libslic3r/Polyline.hpp +++ b/src/libslic3r/Polyline.hpp @@ -65,7 +65,7 @@ public: const Point& last_point() const override { return this->points.back(); } const Point& leftmost_point() const; - virtual Lines lines() const; + Lines lines() const override; void clip_end(double distance); void clip_start(double distance); void extend_end(double distance); diff --git a/src/slic3r/GUI/Preset.cpp b/src/libslic3r/Preset.cpp similarity index 58% rename from src/slic3r/GUI/Preset.cpp rename to src/libslic3r/Preset.cpp index 32a03b6b2f..199f4e9369 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1,10 +1,8 @@ #include +#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 #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 #include #include @@ -19,6 +27,7 @@ #include #include #include +#include #include #include @@ -30,15 +39,9 @@ #include #include -#include -#include -#include -#include - -#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); } @@ -184,6 +187,19 @@ VendorProfile VendorProfile::from_ini(const ptree &tree, const boost::filesystem } else { BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: Malformed variants field: `%2%`") % id % variants_field; } + auto default_materials_field = section.second.get("default_materials", ""); + if (default_materials_field.empty()) + default_materials_field = section.second.get("default_filaments", ""); + if (Slic3r::unescape_strings_cstyle(default_materials_field, model.default_materials)) { + Slic3r::sort_remove_duplicates(model.default_materials); + if (! model.default_materials.empty() && model.default_materials.front().empty()) + // An empty material was inserted into the list of default materials. Remove it. + model.default_materials.erase(model.default_materials.begin()); + } else { + BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: Malformed default_materials field: `%2%`") % id % default_materials_field; + } + model.bed_model = section.second.get("bed_model", ""); + model.bed_texture = section.second.get("bed_texture", ""); if (! model.id.empty() && ! model.variants.empty()) res.models.push_back(std::move(model)); } @@ -232,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. @@ -303,60 +319,58 @@ std::string Preset::label() const return this->name + (this->is_dirty ? g_suffix_modified : ""); } -bool Preset::is_compatible_with_print(const Preset &active_print) const +bool is_compatible_with_print(const PresetWithVendorProfile &preset, const PresetWithVendorProfile &active_print, const PresetWithVendorProfile &active_printer) { - auto &condition = this->compatible_prints_condition(); - auto *compatible_prints = dynamic_cast(this->config.option("compatible_prints")); + if (preset.vendor != nullptr && preset.vendor != active_printer.vendor) + // The current profile has a vendor assigned and it is different from the active print's vendor. + return false; + auto &condition = preset.preset.compatible_prints_condition(); + auto *compatible_prints = dynamic_cast(preset.preset.config.option("compatible_prints")); bool has_compatible_prints = compatible_prints != nullptr && ! compatible_prints->values.empty(); if (! has_compatible_prints && ! condition.empty()) { try { - return PlaceholderParser::evaluate_boolean_expression(condition, active_print.config); + return PlaceholderParser::evaluate_boolean_expression(condition, active_print.preset.config); } catch (const std::runtime_error &err) { //FIXME in case of an error, return "compatible with everything". - printf("Preset::is_compatible_with_print - parsing error of compatible_prints_condition %s:\n%s\n", active_print.name.c_str(), err.what()); + printf("Preset::is_compatible_with_print - parsing error of compatible_prints_condition %s:\n%s\n", active_print.preset.name.c_str(), err.what()); return true; } } - return this->is_default || active_print.name.empty() || ! has_compatible_prints || - std::find(compatible_prints->values.begin(), compatible_prints->values.end(), active_print.name) != + return preset.preset.is_default || active_print.preset.name.empty() || ! has_compatible_prints || + std::find(compatible_prints->values.begin(), compatible_prints->values.end(), active_print.preset.name) != compatible_prints->values.end(); } -bool Preset::is_compatible_with_printer(const Preset &active_printer, const DynamicPrintConfig *extra_config) const +bool is_compatible_with_printer(const PresetWithVendorProfile &preset, const PresetWithVendorProfile &active_printer, const DynamicPrintConfig *extra_config) { - auto &condition = this->compatible_printers_condition(); - auto *compatible_printers = dynamic_cast(this->config.option("compatible_printers")); + if (preset.vendor != nullptr && preset.vendor != active_printer.vendor) + // The current profile has a vendor assigned and it is different from the active print's vendor. + return false; + auto &condition = preset.preset.compatible_printers_condition(); + auto *compatible_printers = dynamic_cast(preset.preset.config.option("compatible_printers")); bool has_compatible_printers = compatible_printers != nullptr && ! compatible_printers->values.empty(); if (! has_compatible_printers && ! condition.empty()) { try { - return PlaceholderParser::evaluate_boolean_expression(condition, active_printer.config, extra_config); + return PlaceholderParser::evaluate_boolean_expression(condition, active_printer.preset.config, extra_config); } catch (const std::runtime_error &err) { //FIXME in case of an error, return "compatible with everything". - printf("Preset::is_compatible_with_printer - parsing error of compatible_printers_condition %s:\n%s\n", active_printer.name.c_str(), err.what()); + printf("Preset::is_compatible_with_printer - parsing error of compatible_printers_condition %s:\n%s\n", active_printer.preset.name.c_str(), err.what()); return true; } } - return this->is_default || active_printer.name.empty() || ! has_compatible_printers || - std::find(compatible_printers->values.begin(), compatible_printers->values.end(), active_printer.name) != + return preset.preset.is_default || active_printer.preset.name.empty() || ! has_compatible_printers || + std::find(compatible_printers->values.begin(), compatible_printers->values.end(), active_printer.preset.name) != compatible_printers->values.end(); } -bool Preset::is_compatible_with_printer(const Preset &active_printer) const +bool is_compatible_with_printer(const PresetWithVendorProfile &preset, const PresetWithVendorProfile &active_printer) { DynamicPrintConfig config; - config.set_key_value("printer_preset", new ConfigOptionString(active_printer.name)); - const ConfigOption *opt = active_printer.config.option("nozzle_diameter"); + config.set_key_value("printer_preset", new ConfigOptionString(active_printer.preset.name)); + const ConfigOption *opt = active_printer.preset.config.option("nozzle_diameter"); if (opt) config.set_key_value("num_extruders", new ConfigOptionInt((int)static_cast(opt)->values.size())); - return this->is_compatible_with_printer(active_printer, &config); -} - -bool Preset::update_compatible(const Preset &active_printer, const DynamicPrintConfig *extra_config, const Preset *active_print) -{ - this->is_compatible = is_compatible_with_printer(active_printer, extra_config); - if (active_print != nullptr) - this->is_compatible &= is_compatible_with_print(*active_print); - return this->is_compatible; + return is_compatible_with_printer(preset, active_printer, &config); } void Preset::set_visible_from_appconfig(const AppConfig &app_config) @@ -366,31 +380,44 @@ void Preset::set_visible_from_appconfig(const AppConfig &app_config) if (type == TYPE_PRINTER) { const std::string &model = config.opt_string("printer_model"); const std::string &variant = config.opt_string("printer_variant"); - if (model.empty() || variant.empty()) { return; } + if (model.empty() || variant.empty()) + return; is_visible = app_config.get_variant(vendor->id, model, variant); - } else if (type == TYPE_FILAMENT) { - is_visible = app_config.has("filaments", name); - } else if (type == TYPE_SLA_MATERIAL) { - is_visible = app_config.has("sla_materials", name); + } else if (type == TYPE_FILAMENT || type == TYPE_SLA_MATERIAL) { + const std::string §ion_name = (type == TYPE_FILAMENT) ? AppConfig::SECTION_FILAMENTS : AppConfig::SECTION_MATERIALS; + if (app_config.has_section(section_name)) { + // Check whether this profile is marked as "installed" in PrusaSlicer.ini, + // or whether a profile is marked as "installed", which this profile may have been renamed from. + const std::map &installed = app_config.get_section(section_name); + auto has = [&installed](const std::string &name) { + auto it = installed.find(name); + return it != installed.end() && ! it->second.empty(); + }; + is_visible = has(this->name); + for (auto it = this->renamed_from.begin(); ! is_visible && it != this->renamed_from.end(); ++ it) + is_visible = has(*it); + } } } const std::vector& Preset::print_options() { static std::vector s_opts { - "layer_height", "first_layer_height", "perimeters", "spiral_vase", "slice_closing_radius", "top_solid_layers", "bottom_solid_layers", + "layer_height", "first_layer_height", "perimeters", "spiral_vase", "slice_closing_radius", + "top_solid_layers", "top_solid_min_thickness", "bottom_solid_layers", "bottom_solid_min_thickness", "extra_perimeters", "ensure_vertical_shell_thickness", "avoid_crossing_perimeters", "thin_walls", "overhangs", "seam_position", "external_perimeters_first", "fill_density", "fill_pattern", "top_fill_pattern", "bottom_fill_pattern", "infill_every_layers", "infill_only_where_needed", "solid_infill_every_layers", "fill_angle", "bridge_angle", - "solid_infill_below_area", "only_retract_when_crossing_perimeters", "infill_first", "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", #ifdef HAS_PRESSURE_EQUALIZER "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative", #endif /* HAS_PRESSURE_EQUALIZER */ "perimeter_speed", "small_perimeter_speed", "external_perimeter_speed", "infill_speed", "solid_infill_speed", "top_solid_infill_speed", "support_material_speed", "support_material_xy_spacing", "support_material_interface_speed", "bridge_speed", "gap_fill_speed", "travel_speed", "first_layer_speed", "perimeter_acceleration", "infill_acceleration", - "bridge_acceleration", "first_layer_acceleration", "default_acceleration", "skirts", "skirt_distance", "skirt_height", + "bridge_acceleration", "first_layer_acceleration", "default_acceleration", "skirts", "skirt_distance", "skirt_height", "draft_shield", "min_skirt_length", "brim_width", "support_material", "support_material_auto", "support_material_threshold", "support_material_enforce_layers", "raft_layers", "support_material_pattern", "support_material_with_sheath", "support_material_spacing", "support_material_synchronize_layers", "support_material_angle", "support_material_interface_layers", @@ -427,26 +454,40 @@ const std::vector& Preset::filament_options() return s_opts; } +const std::vector& Preset::machine_limits_options() +{ + static std::vector s_opts; + if (s_opts.empty()) { + s_opts = { + "machine_max_acceleration_extruding", "machine_max_acceleration_retracting", + "machine_max_acceleration_x", "machine_max_acceleration_y", "machine_max_acceleration_z", "machine_max_acceleration_e", + "machine_max_feedrate_x", "machine_max_feedrate_y", "machine_max_feedrate_z", "machine_max_feedrate_e", + "machine_min_extruding_rate", "machine_min_travel_rate", + "machine_max_jerk_x", "machine_max_jerk_y", "machine_max_jerk_z", "machine_max_jerk_e", + }; + } + return s_opts; +} + const std::vector& Preset::printer_options() { static std::vector s_opts; if (s_opts.empty()) { s_opts = { "printer_technology", - "bed_shape", "bed_custom_texture", "bed_custom_model", "z_offset", "gcode_flavor", "use_relative_e_distances", "serial_port", "serial_speed", + "bed_shape", "bed_custom_texture", "bed_custom_model", "z_offset", "gcode_flavor", "use_relative_e_distances", "use_firmware_retraction", "use_volumetric_e", "variable_layer_height", + //FIXME the print host keys are left here just for conversion from the Printer preset to Physical Printer preset. "host_type", "print_host", "printhost_apikey", "printhost_cafile", "single_extruder_multi_material", "start_gcode", "end_gcode", "before_layer_gcode", "layer_gcode", "toolchange_gcode", + "color_change_gcode", "pause_print_gcode", "template_custom_gcode", "between_objects_gcode", "printer_vendor", "printer_model", "printer_variant", "printer_notes", "cooling_tube_retraction", "cooling_tube_length", "high_current_on_filament_swap", "parking_pos_retraction", "extra_loading_move", "max_print_height", "default_print_profile", "inherits", - "remaining_times", "silent_mode", "machine_max_acceleration_extruding", "machine_max_acceleration_retracting", - "machine_max_acceleration_x", "machine_max_acceleration_y", "machine_max_acceleration_z", "machine_max_acceleration_e", - "machine_max_feedrate_x", "machine_max_feedrate_y", "machine_max_feedrate_z", "machine_max_feedrate_e", - "machine_min_extruding_rate", "machine_min_travel_rate", - "machine_max_jerk_x", "machine_max_jerk_y", "machine_max_jerk_z", "machine_max_jerk_e", - "thumbnails" + "remaining_times", "silent_mode", + "machine_limits_usage", "thumbnails" }; + s_opts.insert(s_opts.end(), Preset::machine_limits_options().begin(), Preset::machine_limits_options().end()); s_opts.insert(s_opts.end(), Preset::nozzle_options().begin(), Preset::nozzle_options().end()); } return s_opts; @@ -471,6 +512,8 @@ const std::vector& 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", "support_pillar_widening_factor", @@ -497,6 +540,10 @@ const std::vector& Preset::sla_print_options() "pad_object_connector_stride", "pad_object_connector_width", "pad_object_connector_penetration", + "hollowing_enable", + "hollowing_min_thickness", + "hollowing_quality", + "hollowing_closing_distance", "output_filename_format", "default_sla_print_profile", "compatible_printers", @@ -538,16 +585,18 @@ const std::vector& Preset::sla_printer_options() s_opts = { "printer_technology", "bed_shape", "bed_custom_texture", "bed_custom_model", "max_print_height", - "bed_shape", "max_print_height", "display_width", "display_height", "display_pixels_x", "display_pixels_y", "display_mirror_x", "display_mirror_y", "display_orientation", "fast_tilt_time", "slow_tilt_time", "area_fill", "relative_correction", "absolute_correction", + "elefant_foot_compensation", + "elefant_foot_min_width", "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" @@ -559,10 +608,7 @@ const std::vector& Preset::sla_printer_options() PresetCollection::PresetCollection(Preset::Type type, const std::vector &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); @@ -571,12 +617,6 @@ PresetCollection::PresetCollection(Preset::Type type, const std::vectorselect_preset(0); } + m_map_alias_to_profile_name.clear(); + m_map_system_profile_renamed.clear(); } void PresetCollection::add_default_preset(const std::vector &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &preset_name) @@ -607,7 +649,9 @@ void PresetCollection::add_default_preset(const std::vector &keys, // Throws an exception on error. void PresetCollection::load_presets(const std::string &dir_path, const std::string &subdir) { - 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. @@ -643,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) { @@ -657,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 @@ -669,16 +713,17 @@ Preset& PresetCollection::load_preset(const std::string &path, const std::string return this->load_preset(path, name, std::move(cfg), select); } -static bool profile_print_params_same(const DynamicPrintConfig &cfg1, const DynamicPrintConfig &cfg2) +static bool profile_print_params_same(const DynamicPrintConfig &cfg_old, const DynamicPrintConfig &cfg_new) { - t_config_option_keys diff = cfg1.diff(cfg2); + t_config_option_keys diff = cfg_old.diff(cfg_new); // Following keys are used by the UI, not by the slicing core, therefore they are not important // when comparing profiles for equality. Ignore them. for (const char *key : { "compatible_prints", "compatible_prints_condition", "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", - "printhost_apikey", "printhost_cafile" }) + //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(); @@ -705,6 +750,11 @@ Preset& PresetCollection::load_external_preset( // Is there a preset already loaded with the name stored inside the config? std::deque::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 && profile_print_params_same(it->config, cfg)) { // The preset exists and it matches the values stored inside config. if (select) @@ -772,7 +822,7 @@ Preset& PresetCollection::load_preset(const std::string &path, const std::string return preset; } -void PresetCollection::save_current_preset(const std::string &new_name) +void PresetCollection::save_current_preset(const std::string &new_name, bool detach) { // 1) Find the preset with a new_name or create a new one, // initialize it with the edited config. @@ -787,6 +837,13 @@ void PresetCollection::save_current_preset(const std::string &new_name) preset.config = std::move(m_edited_preset.config); // The newly saved preset will be activated -> make it visible. preset.is_visible = true; + if (detach) { + // Clear the link to the parent profile. + preset.vendor = nullptr; + preset.inherits().clear(); + preset.alias.clear(); + preset.renamed_from.clear(); + } } else { // Creating a new preset. Preset &preset = *m_presets.insert(it, m_edited_preset); @@ -795,7 +852,12 @@ void PresetCollection::save_current_preset(const std::string &new_name) preset.name = new_name; preset.file = this->path_from_name(new_name); preset.vendor = nullptr; - if (preset.is_system) { + preset.alias.clear(); + preset.renamed_from.clear(); + if (detach) { + // Clear the link to the parent profile. + inherits.clear(); + } else if (preset.is_system) { // Inheriting from a system preset. inherits = /* preset.vendor->name + "/" + */ old_name; } else if (inherits.empty()) { @@ -810,6 +872,8 @@ void PresetCollection::save_current_preset(const std::string &new_name) preset.is_external = false; // The newly saved preset will be activated -> make it visible. preset.is_visible = true; + // Just system presets have aliases + preset.alias.clear(); } // 2) Activate the saved preset. this->select_preset_by_name(new_name, true); @@ -853,43 +917,32 @@ bool PresetCollection::delete_preset(const std::string& name) return true; } -void PresetCollection::load_bitmap_default(wxWindow *window, const std::string &file_name) -{ - // XXX: See note in PresetBundle::load_compatible_bitmaps() - (void)window; - *m_bitmap_main_frame = create_scaled_bitmap(nullptr, file_name); -} - -void PresetCollection::load_bitmap_add(wxWindow *window, const std::string &file_name) -{ - // XXX: See note in PresetBundle::load_compatible_bitmaps() - (void)window; - *m_bitmap_add = create_scaled_bitmap(nullptr, 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; -// const std::string &inherits = this->get_edited_preset().inherits(); -// if (inherits.empty()) -// return this->get_selected_preset().is_system ? &this->get_selected_preset() : nullptr; - std::string inherits = this->get_edited_preset().inherits(); - if (inherits.empty()) - { - if (this->get_selected_preset().is_system || this->get_selected_preset().is_default) - return &this->get_selected_preset(); - if (this->get_selected_preset().is_external) + const Preset &selected_preset = this->get_selected_preset(); + if (selected_preset.is_system || selected_preset.is_default) + return &selected_preset; + + const Preset &edited_preset = this->get_edited_preset(); + const std::string &inherits = edited_preset.inherits(); + const Preset *preset = nullptr; + if (inherits.empty()) { + if (selected_preset.is_external) return nullptr; - - inherits = m_type != Preset::Type::TYPE_PRINTER ? "- default -" : - this->get_edited_preset().printer_technology() == ptFFF ? - "- default FFF -" : "- default SLA -" ; + preset = &this->default_preset(m_type == Preset::Type::TYPE_PRINTER && edited_preset.printer_technology() == ptSLA ? 1 : 0); + } else + preset = this->find_preset(inherits, false); + if (preset == nullptr) { + // Resolve the "renamed_from" field. + assert(! inherits.empty()); + auto it = this->find_preset_renamed(inherits); + if (it != m_presets.end()) + preset = &(*it); } - - const Preset* preset = this->find_preset(inherits, false); return (preset == nullptr/* || preset->is_default*/ || preset->is_external) ? nullptr : preset; } @@ -900,9 +953,51 @@ const Preset* PresetCollection::get_preset_parent(const Preset& child) const // return this->get_selected_preset().is_system ? &this->get_selected_preset() : nullptr; return nullptr; const Preset* preset = this->find_preset(inherits, false); + if (preset == nullptr) { + auto it = this->find_preset_renamed(inherits); + if (it != m_presets.end()) + preset = &(*it); + } return (preset == nullptr/* || preset->is_default */|| preset->is_external) ? nullptr : preset; } +// Return vendor of the first parent profile, for which the vendor is defined, or null if such profile does not exist. +PresetWithVendorProfile PresetCollection::get_preset_with_vendor_profile(const Preset &preset) const +{ + const Preset *p = &preset; + const VendorProfile *v = nullptr; + do { + if (p->vendor != nullptr) { + v = p->vendor; + break; + } + p = this->get_preset_parent(*p); + } while (p != nullptr); + return PresetWithVendorProfile(preset, v); +} + +const std::string& PresetCollection::get_preset_name_by_alias(const std::string& alias) const +{ + for ( + // Find the 1st profile name with the alias. + auto it = Slic3r::lower_bound_by_predicate(m_map_alias_to_profile_name.begin(), m_map_alias_to_profile_name.end(), [&alias](auto &l){ return l.first < alias; }); + // Continue over all profile names with the same alias. + it != m_map_alias_to_profile_name.end() && it->first == alias; ++ it) + if (auto it_preset = this->find_preset_internal(it->second); + it_preset != m_presets.end() && it_preset->name == it->second && + it_preset->is_visible && (it_preset->is_compatible || size_t(it_preset - m_presets.begin()) == m_idx_selected)) + return it_preset->name; + return alias; +} + +const std::string* PresetCollection::get_preset_name_renamed(const std::string &old_name) const +{ + auto it_renamed = m_map_system_profile_renamed.find(old_name); + if (it_renamed != m_map_system_profile_renamed.end()) + return &it_renamed->second; + return nullptr; +} + const std::string& PresetCollection::get_suffix_modified() { return g_suffix_modified; } @@ -940,23 +1035,35 @@ void PresetCollection::set_default_suppressed(bool default_suppressed) } } -size_t PresetCollection::update_compatible_internal(const Preset &active_printer, const Preset *active_print, bool unselect_if_incompatible) +size_t PresetCollection::update_compatible_internal(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, PresetSelectCompatibleType unselect_if_incompatible) { DynamicPrintConfig config; - config.set_key_value("printer_preset", new ConfigOptionString(active_printer.name)); - const ConfigOption *opt = active_printer.config.option("nozzle_diameter"); + config.set_key_value("printer_preset", new ConfigOptionString(active_printer.preset.name)); + const ConfigOption *opt = active_printer.preset.config.option("nozzle_diameter"); if (opt) config.set_key_value("num_extruders", new ConfigOptionInt((int)static_cast(opt)->values.size())); + bool some_compatible = false; for (size_t idx_preset = m_num_default_presets; idx_preset < m_presets.size(); ++ idx_preset) { bool selected = idx_preset == m_idx_selected; Preset &preset_selected = m_presets[idx_preset]; Preset &preset_edited = selected ? m_edited_preset : preset_selected; - if (! preset_edited.update_compatible(active_printer, &config, active_print) && - selected && unselect_if_incompatible) - m_idx_selected = -1; + + 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); + some_compatible |= preset_edited.is_compatible; + if (active_print != nullptr) + preset_edited.is_compatible &= is_compatible_with_print(this_preset_with_vendor_profile, *active_print, active_printer); + if (! preset_edited.is_compatible && selected && + (unselect_if_incompatible == PresetSelectCompatibleType::Always || (unselect_if_incompatible == PresetSelectCompatibleType::OnlyIfWasCompatible && was_compatible))) + m_idx_selected = size_t(-1); if (selected) preset_selected.is_compatible = preset_edited.is_compatible; } + // Update visibility of the default profiles here if the defaults are suppressed, the current profile is not compatible and we don't want to select another compatible profile. + if (m_idx_selected >= m_num_default_presets && m_default_suppressed) + for (size_t i = 0; i < m_num_default_presets; ++ i) + m_presets[i].is_visible = ! some_compatible; return m_idx_selected; } @@ -968,231 +1075,15 @@ size_t PresetCollection::update_compatible_internal(const Preset &active_printer // 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_platter_ui(GUI::PresetComboBox *ui) -{ - if (ui == nullptr) - return; - - // Otherwise fill in the list from scratch. - ui->Freeze(); - ui->Clear(); - size_t selected_preset_item = 0; - - 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 nonsys_presets; - wxString selected = ""; - 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 = ""; - // 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 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(*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((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) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *bmp); - if (i == m_idx_selected) - 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->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::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { - ui->Append(it->first, *it->second); - if (it->first == selected) - selected_preset_item = ui->GetCount() - 1; - } - } - if (m_type == Preset::TYPE_PRINTER) { - 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 += "add_printer"; - wxBitmap *bmp = m_bitmap_cache->find(bitmap_key); - if (bmp == nullptr) { - // Create the bitmap with color bars. - std::vector 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); - bmp = m_bitmap_cache->insert(bitmap_key, bmps); - } - ui->set_label_marker(ui->Append(PresetCollection::separator(L("Add a new printer")), *bmp), GUI::PresetComboBox::LABEL_ITEM_WIZARD_PRINTERS); - } else if (m_type == Preset::TYPE_SLA_MATERIAL) { - ui->set_label_marker(ui->Append(PresetCollection::separator(L("Add/Remove materials")), wxNullBitmap), GUI::PresetComboBox::LABEL_ITEM_WIZARD_MATERIALS); - } - - ui->SetSelection(selected_preset_item); - ui->SetToolTip(ui->GetString(selected_preset_item)); - 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 = 0; - - /* 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 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"; - 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 bmps; - const wxBitmap* tmp_bmp = preset.is_compatible ? m_bitmap_compatible : m_bitmap_incompatible; - bmps.emplace_back((tmp_bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *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) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *bmp); - if (i == m_idx_selected) - 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::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { - ui->Append(it->first, *it->second); - if (it->first == selected) - selected_preset_item = ui->GetCount() - 1; - } - } - if (m_type == Preset::TYPE_PRINTER) { - wxBitmap *bmp = m_bitmap_cache->find("add_printer_tab"); - if (bmp == nullptr) { - // Create the bitmap with color bars. - std::vector bmps; - bmps.emplace_back(*m_bitmap_main_frame); - bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap); - bmp = m_bitmap_cache->insert("add_printer_tab", bmps); - } - ui->Append(PresetCollection::separator("Add a new printer"), *bmp); - } - 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; } @@ -1202,7 +1093,7 @@ void add_correct_opts_to_diff(const std::string &opt_key, t_config_option_keys& const T* opt_init = static_cast(other.option(opt_key)); const T* opt_cur = static_cast(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]) @@ -1219,7 +1110,7 @@ inline t_config_option_keys deep_diff(const ConfigBase &config_this, const Confi const ConfigOption *other_opt = config_other.option(opt_key); if (this_opt != nullptr && other_opt != nullptr && *this_opt != *other_opt) { - if (opt_key == "bed_shape" || opt_key == "compatible_prints" || opt_key == "compatible_printers") { + if (opt_key == "bed_shape" || opt_key == "thumbnails" || opt_key == "compatible_prints" || opt_key == "compatible_printers") { diff.emplace_back(opt_key); continue; } @@ -1341,6 +1232,25 @@ std::vector PresetCollection::merge_presets(PresetCollection &&othe return duplicates; } +void PresetCollection::update_map_alias_to_profile_name() +{ + m_map_alias_to_profile_name.clear(); + for (const Preset &preset : m_presets) + m_map_alias_to_profile_name.emplace_back(preset.alias, preset.name); + std::sort(m_map_alias_to_profile_name.begin(), m_map_alias_to_profile_name.end(), [](auto &l, auto &r) { return l.first < r.first; }); +} + +void PresetCollection::update_map_system_profile_renamed() +{ + m_map_system_profile_renamed.clear(); + for (Preset &preset : m_presets) + for (const std::string &renamed_from : preset.renamed_from) { + const auto [it, success] = m_map_system_profile_renamed.insert(std::pair(renamed_from, preset.name)); + if (! success) + BOOST_LOG_TRIVIAL(error) << boost::format("Preset name \"%1%\" was marked as renamed from \"%2%\", though preset name \"%3%\" was marked as renamed from \"%2%\" as well.") % preset.name % renamed_from % it->second; + } +} + std::string PresetCollection::name() const { switch (this->type()) { @@ -1387,16 +1297,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("printer_technology"); @@ -1414,4 +1314,545 @@ 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& PhysicalPrinter::printer_options() +{ + static std::vector 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 PhysicalPrinter::presets_with_print_host_information(const PrinterPresetCollection& printer_presets) +{ + std::vector 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& 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 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, 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& 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 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(in_name) == boost::to_lower_copy(name); + }; + + if (it == m_printers.end() || !is_equal_name(it->name)) + return nullptr; + return &this->printer(it - m_printers.begin()); +} + +std::deque::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(name); + + size_t i = 0; + for (const PhysicalPrinter& printer : m_printers) { + if (boost::to_lower_copy(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 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 PhysicalPrinterCollection::get_printers_with_preset(const std::string& preset_name) +{ + std::vector 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 PhysicalPrinterCollection::get_printers_with_only_preset(const std::string& preset_name) +{ + std::vector 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 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) + { + const VendorProfile::PrinterModel *out = nullptr; + if (preset.vendor != nullptr) { + auto *printer_model = preset.config.opt("printer_model"); + if (printer_model != nullptr && ! printer_model->value.empty()) { + auto it = std::find_if(preset.vendor->models.begin(), preset.vendor->models.end(), [printer_model](const VendorProfile::PrinterModel &pm) { return pm.id == printer_model->value; }); + if (it != preset.vendor->models.end()) + out = &(*it); + } + } + 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::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::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 similarity index 56% rename from src/slic3r/GUI/Preset.hpp rename to src/libslic3r/Preset.hpp index e2e4baa88c..6409eee7ca 100644 --- a/src/slic3r/GUI/Preset.hpp +++ b/src/libslic3r/Preset.hpp @@ -8,27 +8,14 @@ #include #include -#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, @@ -61,6 +48,10 @@ public: PrinterTechnology technology; std::string family; std::vector variants; + std::vector default_materials; + // Vendor & Printer Model specific print bed model & texture. + std::string bed_model; + std::string bed_texture; PrinterVariant* variant(const std::string &name) { for (auto &v : this->variants) @@ -79,6 +70,8 @@ public: VendorProfile() {} VendorProfile(std::string id) : id(std::move(id)) {} + bool valid() const { return ! name.empty() && ! id.empty() && config_version.valid(); } + // Load VendorProfile from an ini file. // If `load_all` is false, only the header with basic info (name, version, URLs) is loaded. static VendorProfile from_ini(const boost::filesystem::path &path, bool load_all=true); @@ -91,6 +84,17 @@ public: bool operator==(const VendorProfile &rhs) const { return this->id == rhs.id; } }; +class Preset; + +// Helper to hold a profile with its vendor definition, where the vendor definition may have been extracted from a parent system preset. +// The parent preset is only accessible through PresetCollection, therefore to allow definition of the various is_compatible_with methods +// outside of the PresetCollection, this composite is returned by PresetCollection::get_preset_with_vendor_profile() when needed. +struct PresetWithVendorProfile { + PresetWithVendorProfile(const Preset &preset, const VendorProfile *vendor) : preset(preset), vendor(vendor) {} + const Preset &preset; + const VendorProfile *vendor; +}; + // Note: it is imporant that map is used here rather than unordered_map, // because we need iterators to not be invalidated, // because Preset and the ConfigWizard hold pointers to VendorProfiles. @@ -108,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) {} @@ -148,6 +153,13 @@ public: // Configuration data, loaded from a file, or set from the defaults. DynamicPrintConfig config; + // Alias of the preset + std::string alias; + // List of profile names, from which this profile was renamed at some point of time. + // This list is then used to match profiles by their names when loaded from .gcode, .3mf, .amf, + // and to match the "inherits" field of user profiles with updated system profiles. + std::vector renamed_from; + void save(); // Return a label of this preset, consisting of a name and a "(modified)" suffix, if this preset is dirty. @@ -158,10 +170,6 @@ public: void set_dirty(bool dirty = true) { this->is_dirty = dirty; } void reset_dirty() { this->is_dirty = false; } - bool is_compatible_with_print(const Preset &active_print) const; - bool is_compatible_with_printer(const Preset &active_printer, const DynamicPrintConfig *extra_config) const; - bool is_compatible_with_printer(const Preset &active_printer) const; - // Returns the name of the preset, from which this preset inherits. static std::string& inherits(DynamicPrintConfig &cfg) { return cfg.option("inherits", true)->value; } std::string& inherits() { return Preset::inherits(this->config); } @@ -195,9 +203,6 @@ public: // This call returns a reference, it may add a new entry into the DynamicPrintConfig. PrinterTechnology& printer_technology_ref() { return this->config.option>("printer_technology", true)->value; } - // Mark this preset as compatible if it is compatible with active_printer. - bool update_compatible(const Preset &active_printer, const DynamicPrintConfig *extra_config, const Preset *active_print = nullptr); - // Set is_visible according to application config void set_visible_from_appconfig(const AppConfig &app_config); @@ -213,13 +218,16 @@ public: static const std::vector& printer_options(); // Nozzle options of the printer options. static const std::vector& nozzle_options(); + // Printer machine limits, those are contained in printer_options(). + static const std::vector& machine_limits_options(); static const std::vector& sla_printer_options(); static const std::vector& sla_material_options(); static const std::vector& 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); // Report configuration fields, which are misplaced into a wrong group, remove them from the config. static std::string remove_invalid_keys(DynamicPrintConfig &config, const DynamicPrintConfig &default_config); @@ -227,7 +235,19 @@ public: protected: friend class PresetCollection; friend class PresetBundle; - static std::string remove_suffix_modified(const std::string &name); +}; + +bool is_compatible_with_print (const PresetWithVendorProfile &preset, const PresetWithVendorProfile &active_print, const PresetWithVendorProfile &active_printer); +bool is_compatible_with_printer(const PresetWithVendorProfile &preset, const PresetWithVendorProfile &active_printer, const DynamicPrintConfig *extra_config); +bool is_compatible_with_printer(const PresetWithVendorProfile &preset, const PresetWithVendorProfile &active_printer); + +enum class PresetSelectCompatibleType { + // Never select a compatible preset if the newly selected profile is not compatible. + Never, + // Only select a compatible preset if the active profile used to be compatible, but it is no more. + OnlyIfWasCompatible, + // Always select a compatible preset if the active profile is no more compatible. + Always }; // Collections of presets of the same type (one of the Print, Filament or Printer type). @@ -282,7 +302,7 @@ public: // 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. // All presets are marked as not modified and the new preset is activated. - void save_current_preset(const std::string &new_name); + void save_current_preset(const std::string &new_name, bool detach = false); // Delete the current preset, activate the first visible preset. // returns true if the preset was deleted successfully. @@ -291,18 +311,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(wxWindow *window, const std::string &file_name); - - // Load "add new printer" bitmap to be placed at the wxBitmapComboBox of a MainFrame. - void load_bitmap_add(wxWindow *window, 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; } @@ -312,23 +320,31 @@ 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 // reflected by the UI. const Preset* get_selected_preset_parent() const; - // get parent preset for some child preset + // Get parent preset for a child preset, based on the "inherits" field of a child, + // where the "inherits" profile name is searched for in both m_presets and m_map_system_profile_renamed. const Preset* get_preset_parent(const Preset& child) const; // Return the selected preset including the user modifications. Preset& get_edited_preset() { return m_edited_preset; } const Preset& get_edited_preset() const { return m_edited_preset; } + // Return vendor of the first parent profile, for which the vendor is defined, or null if such profile does not exist. + PresetWithVendorProfile get_preset_with_vendor_profile(const Preset &preset) const; + PresetWithVendorProfile get_edited_preset_with_vendor_profile() const { return this->get_preset_with_vendor_profile(this->get_edited_preset()); } + + const std::string& get_preset_name_by_alias(const std::string& alias) const; + const std::string* get_preset_name_renamed(const std::string &old_name) const; + // used to update preset_choice from Tab const std::deque& 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. @@ -336,7 +352,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(this)->preset(idx); } void discard_current_changes() { m_presets[m_idx_selected].reset_dirty(); m_edited_preset = m_presets[m_idx_selected]; } @@ -355,18 +371,28 @@ public: size_t i = m_default_suppressed ? m_num_default_presets : 0; size_t n = this->m_presets.size(); size_t i_compatible = n; + int match_quality = -1; for (; i < n; ++ i) - if (m_presets[i].is_compatible) { - if (prefered_condition(m_presets[i].name)) - return i; - if (i_compatible == n) - // Store the first compatible profile into i_compatible. + // 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) { + int this_match_quality = prefered_condition(m_presets[i]); + if (this_match_quality > match_quality) { + if (match_quality == std::numeric_limits::max()) + // Better match will not be found. + return i; + // Store the first compatible profile with highest match quality into i_compatible. i_compatible = i; + match_quality = this_match_quality; + } } - return (i_compatible == n) ? 0 : i_compatible; + return (i_compatible == n) ? + // No compatible preset found, return the default preset. + 0 : + // Compatible preset found. + i_compatible; } // Return index of the first compatible preset. Certainly at least the '- default -' preset shall be compatible. - size_t first_compatible_idx() const { return this->first_compatible_idx([](const std::string&){return true;}); } + size_t first_compatible_idx() const { return this->first_compatible_idx([](const Preset&) -> int { return 0; }); } // Return index of the first visible preset. Certainly at least the '- default -' preset shall be visible. // Return the first visible preset. Certainly at least the '- default -' preset shall be visible. @@ -383,14 +409,14 @@ public: // For Print / Filament presets, disable those, which are not compatible with the printer. template - void update_compatible(const Preset &active_printer, const Preset *active_print, bool select_other_if_incompatible, PreferedCondition prefered_condition) + void update_compatible(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, PresetSelectCompatibleType select_other_if_incompatible, PreferedCondition prefered_condition) { if (this->update_compatible_internal(active_printer, active_print, select_other_if_incompatible) == (size_t)-1) // Find some other compatible preset, or the "-- default --" preset. this->select_preset(this->first_compatible_idx(prefered_condition)); } - void update_compatible(const Preset &active_printer, const Preset *active_print, bool select_other_if_incompatible) - { this->update_compatible(active_printer, active_print, select_other_if_incompatible, [](const std::string&){return true;}); } + 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 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;}); } @@ -406,18 +432,9 @@ public: // Return a sorted list of system preset names. std::vector 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_platter_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. @@ -427,16 +444,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. @@ -446,6 +454,12 @@ protected: // Merge one vendor's presets with the other vendor's presets, report duplicates. std::vector merge_presets(PresetCollection &&other, const VendorMap &new_vendors); + // Update m_map_alias_to_profile_name from loaded system profiles. + void update_map_alias_to_profile_name(); + + // Update m_map_system_profile_renamed from loaded system profiles. + void update_map_system_profile_renamed(); + private: PresetCollection(); PresetCollection(const PresetCollection &other); @@ -457,8 +471,7 @@ private: // If a preset does not exist, an iterator is returned indicating where to insert a preset with the same name. std::deque::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) @@ -471,8 +484,16 @@ private: } std::deque::const_iterator find_preset_internal(const std::string &name) const { return const_cast(this)->find_preset_internal(name); } + std::deque::iterator find_preset_renamed(const std::string &name) { + auto it_renamed = m_map_system_profile_renamed.find(name); + auto it = (it_renamed == m_map_system_profile_renamed.end()) ? m_presets.end() : this->find_preset_internal(it_renamed->second); + assert((it_renamed == m_map_system_profile_renamed.end()) || (it != m_presets.end() && it->name == it_renamed->second)); + return it; + } + std::deque::const_iterator find_preset_renamed(const std::string &name) const + { return const_cast(this)->find_preset_renamed(name); } - size_t update_compatible_internal(const Preset &active_printer, const Preset *active_print, bool unselect_if_incompatible); + size_t update_compatible_internal(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, PresetSelectCompatibleType unselect_if_incompatible); static std::vector dirty_options(const Preset *edited, const Preset *reference, const bool is_printer_type = false); @@ -482,30 +503,21 @@ private: // 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 m_presets; + // System profiles may have aliases. Map to the full profile name. + std::vector> m_map_alias_to_profile_name; + // Map from old system profile name to a current system profile name. + std::map m_map_system_profile_renamed; // 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 Platter. - // 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; }; @@ -522,6 +534,214 @@ public: const Preset* find_by_model_id(const std::string &model_id) const; }; +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) : name(name), config(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 preset_names; + + // Has this profile been loaded? + bool loaded = false; + + static std::string separator(); + static const std::vector& printer_options(); + static const std::vector& print_host_options(); + static std::vector presets_with_print_host_information(const PrinterPresetCollection& printer_presets); + static bool has_print_host_information(const DynamicPrintConfig& config); + + const std::set& 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>("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& keys); + ~PhysicalPrinterCollection() {} + + typedef std::deque::iterator Iterator; + typedef std::deque::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& 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 get_printers_with_preset( const std::string &preset_name); + // Get list of printers which has only "preset_name" preset + std::vector 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); + 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(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(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::iterator find_printer_internal(const std::string& name, bool case_sensitive_search = true); + std::deque::const_iterator find_printer_internal(const std::string& name, bool case_sensitive_search = true) const + { + return const_cast(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 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 similarity index 76% rename from src/slic3r/GUI/PresetBundle.cpp rename to src/libslic3r/PresetBundle.cpp index 01c42d3dec..44df000c3b 100644 --- a/src/slic3r/GUI/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -1,12 +1,12 @@ #include #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 +#include #include #include #include @@ -21,14 +21,6 @@ #include #include -#include -#include -#include -#include -#include - -#include "libslic3r/libslic3r.h" -#include "libslic3r/Utils.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. @@ -45,20 +37,13 @@ static std::vector s_project_options { const char *PresetBundle::PRUSA_BUNDLE = "PrusaResearch"; PresetBundle::PresetBundle() : - prints(Preset::TYPE_PRINT, Preset::print_options(), static_cast(FullPrintConfig::defaults())), - filaments(Preset::TYPE_FILAMENT, Preset::filament_options(), static_cast(FullPrintConfig::defaults())), + prints(Preset::TYPE_PRINT, Preset::print_options(), static_cast(FullPrintConfig::defaults())), + filaments(Preset::TYPE_FILAMENT, Preset::filament_options(), static_cast(FullPrintConfig::defaults())), sla_materials(Preset::TYPE_SLA_MATERIAL, Preset::sla_material_options(), static_cast(SLAFullPrintConfig::defaults())), sla_prints(Preset::TYPE_SLA_PRINT, Preset::sla_print_options(), static_cast(SLAFullPrintConfig::defaults())), - printers(Preset::TYPE_PRINTER, Preset::printer_options(), static_cast(FullPrintConfig::defaults()), "- default FFF -"), - 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(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). @@ -92,11 +77,12 @@ PresetBundle::PresetBundle() : for (size_t i = 0; i < 2; ++ i) { // The following ugly switch is to avoid printers.preset(0) to return the edited instance, as the 0th default is the current one. Preset &preset = this->printers.default_preset(i); - preset.config.optptr("printer_settings_id", true); - preset.config.optptr("printer_vendor", true); - preset.config.optptr("printer_model", true); - preset.config.optptr("printer_variant", true); - preset.config.optptr("thumbnails", true); + for (const char *key : { + "printer_settings_id", "printer_vendor", "printer_model", "printer_variant", "thumbnails", + //FIXME the following keys are only created here for compatibility to be able to parse legacy Printer profiles. + // These keys are converted to Physical Printer profile. After the conversion, they shall be removed. + "host_type", "print_host", "printhost_apikey", "printhost_cafile"}) + preset.config.optptr(key, true); if (i == 0) { preset.config.optptr("default_print_profile", true); preset.config.option("default_filament_profile", true)->values = { "" }; @@ -109,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); @@ -131,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) @@ -179,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) { @@ -194,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()); } } @@ -236,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(false); + 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); } @@ -287,6 +256,8 @@ std::string PresetBundle::load_system_presets() // No config bundle loaded, reset. this->reset(false); } + + this->update_system_maps(); return errors_cummulative; } @@ -311,6 +282,20 @@ std::vector PresetBundle::merge_presets(PresetBundle &&other) return duplicate_prints; } +void PresetBundle::update_system_maps() +{ + this->prints .update_map_system_profile_renamed(); + this->sla_prints .update_map_system_profile_renamed(); + this->filaments .update_map_system_profile_renamed(); + this->sla_materials.update_map_system_profile_renamed(); + this->printers .update_map_system_profile_renamed(); + + this->prints .update_map_alias_to_profile_name(); + this->sla_prints .update_map_alias_to_profile_name(); + this->filaments .update_map_alias_to_profile_name(); + this->sla_materials.update_map_alias_to_profile_name(); +} + static inline std::string remove_ini_suffix(const std::string &name) { std::string out = name; @@ -324,63 +309,95 @@ static inline std::string remove_ini_suffix(const std::string &name) // If the "vendor" section is missing, enable all models and variants of the particular vendor. void PresetBundle::load_installed_printers(const AppConfig &config) { - for (auto &preset : printers) { + this->update_system_maps(); + for (auto &preset : printers) preset.set_visible_from_appconfig(config); +} + +const std::string& PresetBundle::get_preset_name_by_alias( const Preset::Type& preset_type, const std::string& alias) const +{ + // there are not aliases for Printers profiles + if (preset_type == Preset::TYPE_PRINTER || preset_type == Preset::TYPE_INVALID) + return alias; + + const PresetCollection& presets = preset_type == Preset::TYPE_PRINT ? prints : + preset_type == Preset::TYPE_SLA_PRINT ? sla_prints : + preset_type == Preset::TYPE_FILAMENT ? filaments : + sla_materials; + + 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& 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)) { - std::unordered_set comp_filaments; - - for (const Preset &printer : printers) { - if (! printer.is_visible || printer.printer_technology() != ptFFF) { - continue; - } - - for (const Preset &filament : filaments) { - if (filament.is_compatible_with_printer(printer)) { - comp_filaments.insert(&filament); - } - } - } - - for (const auto &filament: comp_filaments) { + // Compatibility with the PrusaSlicer 2.1.1 and older, where the filament profiles were not installable yet. + // Find all filament profiles, which are compatible with installed printers, and act as if these filament profiles + // were installed. + std::unordered_set compatible_filaments; + for (const Preset &printer : printers) + if (printer.is_visible && printer.printer_technology() == ptFFF) { + const PresetWithVendorProfile printer_with_vendor_profile = printers.get_preset_with_vendor_profile(printer); + for (const Preset &filament : filaments) + if (filament.is_system && is_compatible_with_printer(filaments.get_preset_with_vendor_profile(filament), printer_with_vendor_profile)) + compatible_filaments.insert(&filament); + } + // and mark these filaments as installed, therefore this code will not be executed at the next start of the application. + for (const auto &filament: compatible_filaments) config.set(AppConfig::SECTION_FILAMENTS, filament->name, "1"); - } } - for (auto &preset : filaments) { + for (auto &preset : filaments) preset.set_visible_from_appconfig(config); - } } void PresetBundle::load_installed_sla_materials(AppConfig &config) { if (! config.has_section(AppConfig::SECTION_MATERIALS)) { std::unordered_set comp_sla_materials; - - for (const Preset &printer : printers) { - if (! printer.is_visible || printer.printer_technology() != ptSLA) { - continue; - } - - for (const Preset &material : sla_materials) { - if (material.is_compatible_with_printer(printer)) { - comp_sla_materials.insert(&material); - } - } - } - - for (const auto &material: comp_sla_materials) { + // Compatibility with the PrusaSlicer 2.1.1 and older, where the SLA material profiles were not installable yet. + // Find all SLA material profiles, which are compatible with installed printers, and act as if these SLA material profiles + // were installed. + for (const Preset &printer : printers) + if (printer.is_visible && printer.printer_technology() == ptSLA) { + const PresetWithVendorProfile printer_with_vendor_profile = printers.get_preset_with_vendor_profile(printer); + for (const Preset &material : sla_materials) + if (material.is_system && is_compatible_with_printer(sla_materials.get_preset_with_vendor_profile(material), printer_with_vendor_profile)) + comp_sla_materials.insert(&material); + } + // and mark these SLA materials as installed, therefore this code will not be executed at the next start of the application. + for (const auto &material: comp_sla_materials) config.set(AppConfig::SECTION_MATERIALS, material->name, "1"); - } } - for (auto &preset : sla_materials) { + for (auto &preset : sla_materials) preset.set_visible_from_appconfig(config); - } } // Load selections (current print, current filaments, current printer) from config.ini @@ -405,7 +422,7 @@ void PresetBundle::load_selections(AppConfig &config, const std::string &preferr // or from the preferred_model_id suggestion passed in by ConfigWizard. // If the printer profile enumerated by the config are not visible, select an alternate preset. // Do not select alternate profiles for the print / filament profiles as those presets - // will be selected by the following call of this->update_compatible(true). + // will be selected by the following call of this->update_compatible(PresetSelectCompatibleType::Always). const Preset *initial_printer = printers.find_preset(initial_printer_profile_name); const Preset *preferred_printer = printers.find_by_model_id(preferred_model_id); @@ -438,8 +455,15 @@ void PresetBundle::load_selections(AppConfig &config, const std::string &preferr // Always try to select a compatible print and filament preset to the current printer preset, // as the application may have been closed with an active "external" preset, which does not // exist. - this->update_compatible(true); + 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 @@ -459,43 +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(wxWindow *window) -{ - // We don't actually pass the window pointer here and instead generate - // a low DPI bitmap, because the wxBitmapComboBox and wxDataViewCtrl don't support - // high DPI bitmaps very well, they compute their dimensions wrong. - // TODO: Update this when fixed in wxWidgets - // See also PresetCollection::load_bitmap_default() and PresetCollection::load_bitmap_add() - - (void)window; - *m_bitmapCompatible = create_scaled_bitmap(nullptr, "flag_green"); - *m_bitmapIncompatible = create_scaled_bitmap(nullptr, "flag_red"); - *m_bitmapLock = create_scaled_bitmap(nullptr, "lock_closed"); - *m_bitmapLockOpen = create_scaled_bitmap(nullptr, "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 @@ -508,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"); @@ -548,9 +537,11 @@ DynamicPrintConfig PresetBundle::full_fff_config() const while (filament_configs.size() < num_extruders) filament_configs.emplace_back(&this->filaments.first_visible().config); for (const DynamicPrintConfig *cfg : filament_configs) { - compatible_printers_condition.emplace_back(Preset::compatible_printers_condition(*const_cast(cfg))); - compatible_prints_condition .emplace_back(Preset::compatible_prints_condition(*const_cast(cfg))); - inherits .emplace_back(Preset::inherits(*const_cast(cfg))); + // The compatible_prints/printers_condition() returns a reference to configuration key, which may not yet exist. + DynamicPrintConfig &cfg_rw = *const_cast(cfg); + compatible_printers_condition.emplace_back(Preset::compatible_printers_condition(cfg_rw)); + compatible_prints_condition .emplace_back(Preset::compatible_prints_condition(cfg_rw)); + inherits .emplace_back(Preset::inherits(cfg_rw)); } // Option values to set a ConfigOptionVector from. std::vector filament_opts(num_extruders, nullptr); @@ -689,18 +680,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 file 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 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. @@ -862,6 +856,7 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool } // 4) Load the project config values (the per extruder wipe matrix etc). this->project_config.apply_only(config, s_project_options); + break; } case ptSLA: @@ -872,7 +867,7 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool default: break; } - this->update_compatible(false); + this->update_compatible(PresetSelectCompatibleType::Never); } // Load the active configuration of a config bundle from a boost property_tree. This is a private method called from load_config_file. @@ -934,7 +929,7 @@ void PresetBundle::load_config_file_config_bundle(const std::string &path, const for (size_t i = 1; i < std::min(tmp_bundle.filament_presets.size(), this->filament_presets.size()); ++ i) this->filament_presets[i] = load_one(this->filaments, tmp_bundle.filaments, tmp_bundle.filament_presets[i], false); - this->update_compatible(false); + this->update_compatible(PresetSelectCompatibleType::Never); } // Process the Config Bundle loaded as a Boost property tree. @@ -947,8 +942,6 @@ static void flatten_configbundle_hierarchy(boost::property_tree::ptree &tree, co { namespace pt = boost::property_tree; - typedef std::pair 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) {} @@ -1049,7 +1042,11 @@ static void flatten_configbundle_hierarchy(boost::property_tree::ptree &tree, co // Iterate in a reverse order, so the last change will be placed first in merged. for (auto it_inherits = prst->inherits.rbegin(); it_inherits != prst->inherits.rend(); ++ it_inherits) for (auto it = (*it_inherits)->node->begin(); it != (*it_inherits)->node->end(); ++ it) - if (prst->node->find(it->first) == prst->node->not_found()) + if (it->first == "renamed_from") { + // Don't inherit "renamed_from" flag, it does not make sense. The "renamed_from" flag only makes sense for a concrete preset. + if (boost::starts_with((*it_inherits)->name, "*")) + BOOST_LOG_TRIVIAL(error) << boost::format("Nonpublic intermediate preset %1% contains a \"renamed_from\" field, which is ignored") % (*it_inherits)->name; + } else if (prst->node->find(it->first) == prst->node->not_found()) prst->node->add_child(it->first, it->second); } @@ -1092,8 +1089,13 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla const VendorProfile *vendor_profile = nullptr; if (flags & (LOAD_CFGBNDLE_SYSTEM | LOAD_CFGBUNDLE_VENDOR_ONLY)) { auto vp = VendorProfile::from_ini(tree, path); - if (vp.num_variants() == 0) + if (vp.models.size() == 0) { + BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No printer model defined.") % path; return 0; + } else if (vp.num_variants() == 0) { + BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No printer variant defined") % path; + return 0; + } vendor_profile = &this->vendors.insert({vp.id, vp}).first->second; } @@ -1112,16 +1114,22 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla std::vector loaded_sla_prints; std::vector loaded_sla_materials; std::vector loaded_printers; + std::vector loaded_physical_printers; std::string active_print; std::vector 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 §ion : tree) { PresetCollection *presets = nullptr; std::vector *loaded = nullptr; std::string preset_name; + PhysicalPrinterCollection *ph_printers = nullptr; + std::string ph_printer_name; if (boost::starts_with(section.first, "print:")) { presets = &this->prints; loaded = &loaded_prints; @@ -1142,6 +1150,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) { @@ -1160,6 +1172,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") { @@ -1193,19 +1207,32 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla // Load the print, filament or printer preset. const DynamicPrintConfig *default_config = nullptr; DynamicPrintConfig config; + std::string alias_name; + std::vector renamed_from; + auto parse_config_section = [§ion, &alias_name, &renamed_from, &path](DynamicPrintConfig &config) { + for (auto &kvp : section.second) { + if (kvp.first == "alias") + alias_name = kvp.second.data(); + else if (kvp.first == "renamed_from") { + if (! unescape_strings_cstyle(kvp.second.data(), renamed_from)) { + BOOST_LOG_TRIVIAL(error) << "Error in a Vendor Config Bundle \"" << path << "\": The preset \"" << + section.first << "\" contains invalid \"renamed_from\" key, which is being ignored."; + } + } + config.set_deserialize(kvp.first, kvp.second.data()); + } + }; if (presets == &this->printers) { // Select the default config based on the printer_technology field extracted from kvp. DynamicPrintConfig config_src; - for (auto &kvp : section.second) - config_src.set_deserialize(kvp.first, kvp.second.data()); + parse_config_section(config_src); default_config = &presets->default_preset_for(config_src).config; config = *default_config; config.apply(config_src); } else { default_config = &presets->default_preset().config; config = *default_config; - for (auto &kvp : section.second) - config.set_deserialize(kvp.first, kvp.second.data()); + parse_config_section(config); } Preset::normalize(config); // Report configuration fields, which are misplaced into a wrong group. @@ -1283,11 +1310,66 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla loaded.is_system = true; loaded.vendor = vendor_profile; } + + // Derive the profile logical name aka alias from the preset name if the alias was not stated explicitely. + if (alias_name.empty()) { + 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()) + // Add the preset name with the '@' character removed into the "renamed_from" list. + renamed_from.emplace_back(alias_name + preset_name.substr(end_pos + 1)); + boost::trim_right(alias_name); + } + } + if (alias_name.empty()) + loaded.alias = preset_name; + else + loaded.alias = std::move(alias_name); + loaded.renamed_from = std::move(renamed_from); + ++ 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); @@ -1297,16 +1379,18 @@ 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); this->update_multi_material_filament_presets(); for (size_t i = 0; i < std::min(this->filament_presets.size(), active_filaments.size()); ++ i) this->filament_presets[i] = filaments.find_preset(active_filaments[i], true)->name; - this->update_compatible(false); + this->update_compatible(PresetSelectCompatibleType::Never); } - return presets_loaded; + return presets_loaded + ph_printers_loaded; } void PresetBundle::update_multi_material_filament_presets() @@ -1351,47 +1435,137 @@ void PresetBundle::update_multi_material_filament_presets() } } -void PresetBundle::update_compatible(bool select_other_if_incompatible) +void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_print_if_incompatible, PresetSelectCompatibleType select_other_filament_if_incompatible) { - const Preset &printer_preset = this->printers.get_edited_preset(); + const Preset &printer_preset = this->printers.get_edited_preset(); + const PresetWithVendorProfile printer_preset_with_vendor_profile = this->printers.get_preset_with_vendor_profile(printer_preset); + + class PreferedProfileMatch + { + public: + PreferedProfileMatch(const std::string &prefered_alias, const std::string &prefered_name) : + m_prefered_alias(prefered_alias), m_prefered_name(prefered_name) {} + + int operator()(const Preset &preset) const + { + return (! m_prefered_alias.empty() && m_prefered_alias == preset.alias) ? + // Matching an alias, always take this preset with priority. + std::numeric_limits::max() : + // Otherwise take the prefered profile, or the first compatible. + preset.name == m_prefered_name; + } + + private: + const std::string m_prefered_alias; + const std::string &m_prefered_name; + }; + + // Matching by the layer height in addition. + class PreferedPrintProfileMatch : public PreferedProfileMatch + { + public: + PreferedPrintProfileMatch(const Preset &preset, const std::string &prefered_name) : + PreferedProfileMatch(preset.alias, prefered_name), m_prefered_layer_height(preset.config.opt_float("layer_height")) {} + + int operator()(const Preset &preset) const + { + int match_quality = PreferedProfileMatch::operator()(preset); + if (match_quality < std::numeric_limits::max()) { + match_quality += 1; + if (m_prefered_layer_height > 0. && std::abs(preset.config.opt_float("layer_height") - m_prefered_layer_height) < 0.0005) + match_quality *= 10; + } + return match_quality; + } + + private: + const double m_prefered_layer_height; + }; + + // Matching by the layer height in addition. + class PreferedFilamentProfileMatch : public PreferedProfileMatch + { + public: + PreferedFilamentProfileMatch(const Preset *preset, const std::string &prefered_name) : + PreferedProfileMatch(preset ? preset->alias : std::string(), prefered_name), + m_prefered_filament_type(preset ? preset->config.opt_string("filament_type", 0) : std::string()) {} + + int operator()(const Preset &preset) const + { + int match_quality = PreferedProfileMatch::operator()(preset); + if (match_quality < std::numeric_limits::max()) { + match_quality += 1; + if (! m_prefered_filament_type.empty() && m_prefered_filament_type == preset.config.opt_string("filament_type", 0)) + match_quality *= 10; + } + return match_quality; + } + + private: + const std::string m_prefered_filament_type; + }; + + // Matching by the layer height in addition. + class PreferedFilamentsProfileMatch + { + public: + PreferedFilamentsProfileMatch(const Preset &preset, const std::vector &prefered_names) : + m_prefered_alias(preset.alias), + m_prefered_filament_type(preset.config.opt_string("filament_type", 0)), + m_prefered_names(prefered_names) + {} + + int operator()(const Preset &preset) const + { + if (! m_prefered_alias.empty() && m_prefered_alias == preset.alias) + // Matching an alias, always take this preset with priority. + return std::numeric_limits::max(); + int match_quality = (std::find(m_prefered_names.begin(), m_prefered_names.end(), preset.name) != m_prefered_names.end()) + 1; + if (! m_prefered_filament_type.empty() && m_prefered_filament_type == preset.config.opt_string("filament_type", 0)) + match_quality *= 10; + return match_quality; + } + + private: + const std::string m_prefered_alias; + const std::string m_prefered_filament_type; + const std::vector &m_prefered_names; + }; switch (printer_preset.printer_technology()) { case ptFFF: { assert(printer_preset.config.has("default_print_profile")); assert(printer_preset.config.has("default_filament_profile")); - const Preset &print_preset = this->prints.get_edited_preset(); - const std::string &prefered_print_profile = printer_preset.config.opt_string("default_print_profile"); const std::vector &prefered_filament_profiles = printer_preset.config.option("default_filament_profile")->values; - prefered_print_profile.empty() ? - this->prints.update_compatible(printer_preset, nullptr, select_other_if_incompatible) : - this->prints.update_compatible(printer_preset, nullptr, select_other_if_incompatible, - [&prefered_print_profile](const std::string& profile_name) { return profile_name == prefered_print_profile; }); - prefered_filament_profiles.empty() ? - this->filaments.update_compatible(printer_preset, &print_preset, select_other_if_incompatible) : - this->filaments.update_compatible(printer_preset, &print_preset, select_other_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(); }); - if (select_other_if_incompatible) { + this->prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible, + PreferedPrintProfileMatch(this->prints.get_edited_preset(), printer_preset.config.opt_string("default_print_profile"))); + const PresetWithVendorProfile print_preset_with_vendor_profile = this->prints.get_edited_preset_with_vendor_profile(); + // Remember whether the filament profiles were compatible before updating the filament compatibility. + std::vector filament_preset_was_compatible(this->filament_presets.size(), false); + for (size_t idx = 0; idx < this->filament_presets.size(); ++ idx) { + Preset *preset = this->filaments.find_preset(this->filament_presets[idx], false); + filament_preset_was_compatible[idx] = preset != nullptr && preset->is_compatible; + } + // 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. - if (this->filament_presets.size() == 1) - this->filament_presets.front() = this->filaments.get_edited_preset().name; - else - { - for (size_t idx = 0; idx < this->filament_presets.size(); ++idx) { + 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) { + 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; } } } @@ -1401,24 +1575,18 @@ void PresetBundle::update_compatible(bool select_other_if_incompatible) { assert(printer_preset.config.has("default_sla_print_profile")); assert(printer_preset.config.has("default_sla_material_profile")); - const Preset &sla_print_preset = this->sla_prints.get_edited_preset(); - 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, nullptr, select_other_if_incompatible) : - this->sla_prints.update_compatible(printer_preset, nullptr, select_other_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, &sla_print_preset, select_other_if_incompatible) : - this->sla_materials.update_compatible(printer_preset, &sla_print_preset, select_other_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); @@ -1442,6 +1610,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; @@ -1457,6 +1633,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" }; @@ -1472,181 +1650,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); } -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 PresetBundle::parse_color(const std::string &scolor, unsigned char *rgb_out) -{ - rgb_out[0] = rgb_out[1] = rgb_out[2] = 0; - if (scolor.size() != 7 || scolor.front() != '#') - return false; - const char *c = scolor.data() + 1; - for (size_t i = 0; i < 3; ++ i) { - int digit1 = hex_digit_to_int(*c ++); - int digit2 = hex_digit_to_int(*c ++); - if (digit1 == -1 || digit2 == -1) - return false; - rgb_out[i] = (unsigned char)(digit1 * 16 + digit2); - } - return true; -} - -void PresetBundle::load_default_preset_bitmaps(wxWindow *window) -{ - // 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(window, "cog"); - this->sla_prints.load_bitmap_default(window, "cog"); - this->filaments.load_bitmap_default(window, "spool.png"); - this->sla_materials.load_bitmap_default(window, "resin"); - this->printers.load_bitmap_default(window, "printer"); - this->printers.load_bitmap_add(window, "add.png"); - this->load_compatible_bitmaps(window); -} - -void PresetBundle::update_platter_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 (! 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 = 0; - 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 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() - const int icon_height = m_bitmapLock->GetHeight();//2 * icon_unit; //16 * scale_f + 0.5f; - - 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 bmps; - if (wide_icons) - // Paint a red flag for incompatible presets. - bmps.emplace_back(preset.is_compatible ? m_bitmapCache->mkclear(normal_icon_width, icon_height) : *m_bitmapIncompatible); - // Paint the color bars. - 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) { - 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)); - // To avoid asserts, each added bitmap to wxBitmapCombobox should be the same size, so - // for nonsystem presets set a width of empty bitmap to m_bitmapLock->GetWidth() - bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmapLock : m_bitmapCache->mkclear(m_bitmapLock->GetWidth(), icon_height)); -// (preset.is_dirty ? *m_bitmapLockOpen : *m_bitmapLock) : m_bitmapCache->mkclear(16, 16)); - bitmap = m_bitmapCache->insert(bitmap_key, bmps); - } - - 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) - selected_preset_item = ui->GetCount() - 1; - } - 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()); - } - 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::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) { - ui->Append(it->first, *it->second); - if (it->first == selected_str) - selected_preset_item = ui->GetCount() - 1; - } - } - - ui->set_label_marker(ui->Append(PresetCollection::separator(L("Add/Remove filaments")), wxNullBitmap), GUI::PresetComboBox::LABEL_ITEM_WIZARD_FILAMENTS); - - ui->SetSelection(selected_preset_item); - ui->SetToolTip(ui->GetString(selected_preset_item)); - 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 similarity index 84% rename from src/slic3r/GUI/PresetBundle.hpp rename to src/libslic3r/PresetBundle.hpp index b1010e07b0..609e25e2c2 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 -#include #include #include -class wxWindow; - namespace Slic3r { -namespace GUI { - class BitmapCache; -}; - // Bundle of Print + Filament + Printer presets. class PresetBundle { @@ -42,7 +35,10 @@ public: PresetCollection sla_prints; PresetCollection filaments; PresetCollection sla_materials; + 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 filament_presets; @@ -54,8 +50,7 @@ public: // There will be an entry for each system profile loaded, // and the system profiles will point to the VendorProfile instances owned by PresetBundle::vendors. - // std::set vendors; - VendorMap vendors; + VendorMap vendors; struct ObsoletePresets { std::vector prints; @@ -107,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 platter for an idx_extruder. - void update_platter_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); @@ -128,22 +120,27 @@ public: // Also updates the is_visible flag of each preset. // If select_other_if_incompatible is true, then the print or filament preset is switched to some compatible // preset if the current print or filament preset is not compatible. - void update_compatible(bool select_other_if_incompatible); - - static bool parse_color(const std::string &scolor, unsigned char *rgb_out); - - void load_default_preset_bitmaps(wxWindow *window); + 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); } // 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. void load_installed_printers(const AppConfig &config); + 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& unselected_options); + static const char *PRUSA_BUNDLE; private: std::string load_system_presets(); // Merge one vendor's presets with the other vendor's presets, report duplicates. std::vector merge_presets(PresetBundle &&other); + // Update renamed_from and alias maps of system profiles. + void update_system_maps(); // Set the is_visible flag for filaments and sla materials, // apply defaults based on enabled printers when no filaments/materials are installed. @@ -159,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(wxWindow *window); 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 78a09c5113..47d48dd405 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" @@ -24,8 +26,7 @@ #include #include -//! macro used to mark string used at localization, -//! return same string +// Mark string for localization and translate. #define L(s) Slic3r::I18N::translate(s) namespace Slic3r { @@ -162,6 +163,7 @@ bool Print::invalidate_state_by_config_options(const std::vectorcopies().size(); + instances += (unsigned int)print_object->instances().size(); return instances; } @@ -400,7 +404,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(mv_dst.config) = static_cast(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; @@ -447,38 +455,35 @@ static inline bool transform3d_equal(const Transform3d &lhs, const Transform3d & return true; } -struct PrintInstances +struct PrintObjectTrafoAndInstances { - Transform3d trafo; - Points copies; - bool operator<(const PrintInstances &rhs) const { return transform3d_lower(this->trafo, rhs.trafo); } + Transform3d trafo; + PrintInstances instances; + bool operator<(const PrintObjectTrafoAndInstances &rhs) const { return transform3d_lower(this->trafo, rhs.trafo); } }; // Generate a list of trafos and XY offsets for instances of a ModelObject -static std::vector print_objects_from_model_object(const ModelObject &model_object) +static std::vector print_objects_from_model_object(const ModelObject &model_object) { - std::set trafos; - PrintInstances trafo; - trafo.copies.assign(1, Point()); + std::set trafos; + PrintObjectTrafoAndInstances trafo; for (ModelInstance *model_instance : model_object.instances) if (model_instance->is_printable()) { trafo.trafo = model_instance->get_matrix(); - // Set the Z axis of the transformation. - trafo.copies.front() = Point::new_scale(trafo.trafo.data()[12], trafo.trafo.data()[13]); + auto shift = Point::new_scale(trafo.trafo.data()[12], trafo.trafo.data()[13]); + // Reset the XY axes of the transformation. trafo.trafo.data()[12] = 0; trafo.trafo.data()[13] = 0; - auto it = trafos.find(trafo); - if (it == trafos.end()) - trafos.emplace(trafo); - else - const_cast(*it).copies.emplace_back(trafo.copies.front()); + // Search or insert a trafo. + auto it = trafos.emplace(trafo).first; + const_cast(*it).instances.emplace_back(PrintInstance{ nullptr, model_instance, shift }); } - return std::vector(trafos.begin(), trafos.end()); + return std::vector(trafos.begin(), trafos.end()); } // Compare just the layer ranges and their layer heights, not the associated configs. // Ignore the layer heights if check_layer_heights is false. -bool layer_height_ranges_equal(const t_layer_config_ranges &lr1, const t_layer_config_ranges &lr2, bool check_layer_height) +static bool layer_height_ranges_equal(const t_layer_config_ranges &lr1, const t_layer_config_ranges &lr2, bool check_layer_height) { if (lr1.size() != lr2.size()) return false; @@ -493,13 +498,43 @@ bool layer_height_ranges_equal(const t_layer_config_ranges &lr1, const t_layer_c return true; } +// Returns true if va == vb when all CustomGCode items that are not ToolChangeCode are ignored. +static bool custom_per_printz_gcodes_tool_changes_differ(const std::vector &va, const std::vector &vb) +{ + 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->type != CustomGCode::ToolChange) { + // Skip any CustomGCode items, which are not tool changes. + ++ it_a; + continue; + } + if (it_b != vb.end() && it_b->type != CustomGCode::ToolChange) { + // Skip any CustomGCode items, which are not tool changes. + ++ it_b; + continue; + } + if (it_a == va.end() || it_b == vb.end()) + // va or vb contains more Tool Changes than the other. + return true; + assert(it_a->type == CustomGCode::ToolChange); + assert(it_b->type == CustomGCode::ToolChange); + if (*it_a != *it_b) + // The two Tool Changes differ. + return true; + ++ it_a; + ++ it_b; + } + // There is no change in custom Tool Changes. + return false; +} + // Collect diffs of configuration values at various containers, // resolve the filament rectract overrides of extruder retract values. void Print::config_diffs( const DynamicPrintConfig &new_full_config, t_config_option_keys &print_diff, t_config_option_keys &object_diff, t_config_option_keys ®ion_diff, t_config_option_keys &full_config_diff, - DynamicPrintConfig &placeholder_parser_overrides, DynamicPrintConfig &filament_overrides) const { // Collect changes to print config, account for overrides of extruder retract values by filament presets. @@ -535,22 +570,24 @@ void Print::config_diffs( object_diff = m_default_object_config.diff(new_full_config); region_diff = m_default_region_config.diff(new_full_config); // Prepare for storing of the full print config into new_full_config to be exported into the G-code and to be used by the PlaceholderParser. - // As the PlaceholderParser does not interpret the FloatOrPercent values itself, these values are stored into the PlaceholderParser converted to floats. for (const t_config_option_key &opt_key : new_full_config.keys()) { const ConfigOption *opt_old = m_full_print_config.option(opt_key); const ConfigOption *opt_new = new_full_config.option(opt_key); if (opt_old == nullptr || *opt_new != *opt_old) full_config_diff.emplace_back(opt_key); - if (opt_new->type() == coFloatOrPercent) { - // The m_placeholder_parser is never modified by the background processing, GCode.cpp/hpp makes a copy. - const ConfigOption *opt_old_pp = this->placeholder_parser().config().option(opt_key); - double new_value = new_full_config.get_abs_value(opt_key); - if (opt_old_pp == nullptr || static_cast(opt_old_pp)->value != new_value) - placeholder_parser_overrides.set_key_value(opt_key, new ConfigOptionFloat(new_value)); - } } } +std::vector Print::print_object_ids() const +{ + std::vector out; + // Reserve one more for the caller to append the ID of the Print itself. + out.reserve(m_objects.size() + 1); + for (const PrintObject *print_object : m_objects) + out.emplace_back(print_object->id()); + return out; +} + Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_config) { #ifdef _DEBUG @@ -561,12 +598,12 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ 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.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; - DynamicPrintConfig placeholder_parser_overrides, filament_overrides; - this->config_diffs(new_full_config, print_diff, object_diff, region_diff, full_config_diff, placeholder_parser_overrides, filament_overrides); + DynamicPrintConfig filament_overrides; + this->config_diffs(new_full_config, print_diff, object_diff, region_diff, full_config_diff, filament_overrides); // Do not use the ApplyStatus as we will use the max function when updating apply_status. unsigned int apply_status = APPLY_STATUS_UNCHANGED; @@ -586,15 +623,18 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ // which should be stopped if print_diff is not empty. size_t num_extruders = m_config.nozzle_diameter.size(); bool num_extruders_changed = false; - if (! full_config_diff.empty() || ! placeholder_parser_overrides.empty()) { + if (! full_config_diff.empty()) { update_apply_status(this->invalidate_step(psGCodeExport)); - m_placeholder_parser.apply_config(std::move(placeholder_parser_overrides)); // 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()); + // 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); // It is also safe to change m_config now after this->invalidate_state_by_config_options() call. m_config.apply_only(new_full_config, print_diff, true); + //FIXME use move semantics once ConfigBase supports it. m_config.apply(filament_overrides); // Handle changes to object config defaults m_default_object_config.apply_only(new_full_config, object_diff, true); @@ -617,7 +657,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 &range : in) + for (const std::pair &range : in) if (range.first.second > last_z) { coordf_t min_z = std::max(range.first.first, 0.); if (min_z > last_z + EPSILON) { @@ -625,7 +665,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; } @@ -637,11 +677,17 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ else m_ranges.emplace_back(t_layer_height_range(m_ranges.back().first.second, DBL_MAX), nullptr); } + const DynamicPrintConfig* config(const t_layer_height_range &range) const { auto it = std::lower_bound(m_ranges.begin(), m_ranges.end(), std::make_pair< t_layer_height_range, const DynamicPrintConfig*>(t_layer_height_range(range.first - EPSILON, range.second - EPSILON), nullptr)); - assert(it != m_ranges.end()); - assert(it == m_ranges.end() || std::abs(it->first.first - range.first ) < EPSILON); - assert(it == m_ranges.end() || std::abs(it->first.second - range.second) < EPSILON); + // #ys_FIXME_COLOR + // assert(it != m_ranges.end()); + // assert(it == m_ranges.end() || std::abs(it->first.first - range.first ) < EPSILON); + // assert(it == m_ranges.end() || std::abs(it->first.second - range.second) < EPSILON); + if (it == m_ranges.end() || + std::abs(it->first.first - range.first) > EPSILON || + std::abs(it->first.second - range.second) > EPSILON ) + return nullptr; // desired range doesn't found return (it == m_ranges.end()) ? nullptr : it->second; } std::vector>::const_iterator begin() const { return m_ranges.cbegin(); } @@ -685,6 +731,18 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ for (const ModelObject *model_object : m_model.objects) model_object_status.emplace(model_object->id(), ModelObjectStatus::New); } else { + if (m_model.custom_gcode_per_print_z != model.custom_gcode_per_print_z) { + update_apply_status(num_extruders_changed || + // Tool change G-codes are applied as color changes for a single extruder printer, no need to invalidate tool ordering. + //FIXME The tool ordering may be invalidated unnecessarily if the custom_gcode_per_print_z.mode is not applicable + // to the active print / model state, and then it is reset, so it is being applicable, but empty, thus the effect is the same. + (num_extruders > 1 && custom_per_printz_gcodes_tool_changes_differ(m_model.custom_gcode_per_print_z.gcodes, model.custom_gcode_per_print_z.gcodes)) ? + // The Tool Ordering and the Wipe Tower are no more valid. + this->invalidate_steps({ psWipeTower, psGCodeExport }) : + // There is no change in Tool Changes stored in custom_gcode_per_print_z, therefore there is no need to update Tool Ordering. + this->invalidate_step(psGCodeExport)); + m_model.custom_gcode_per_print_z = model.custom_gcode_per_print_z; + } if (model_object_list_equal(m_model, model)) { // The object list did not change. for (const ModelObject *model_object : m_model.objects) @@ -794,14 +852,14 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ // Update the ModelObject instance, possibly invalidate the linked PrintObjects. assert(it_status->status == ModelObjectStatus::Old || it_status->status == ModelObjectStatus::Moved); // Check whether a model part volume was added or removed, their transformations or order changed. - // Only volume IDs, volume types and their order are checked, configuration and other parameters are NOT checked. + // 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())); @@ -811,22 +869,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(model_object.config) = static_cast(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())); @@ -838,7 +902,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); @@ -846,12 +910,31 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ // Copy the ModelObject name, input_file and instances. The instances will be compared against PrintObject instances in the next step. model_object.name = model_object_new.name; model_object.input_file = model_object_new.input_file; - model_object.clear_instances(); - model_object.instances.reserve(model_object_new.instances.size()); - for (const ModelInstance *model_instance : model_object_new.instances) { - model_object.instances.emplace_back(new ModelInstance(*model_instance)); - model_object.instances.back()->set_model_object(&model_object); - } + // Only refresh ModelInstances if there is any change. + if (model_object.instances.size() != model_object_new.instances.size() || + ! std::equal(model_object.instances.begin(), model_object.instances.end(), model_object_new.instances.begin(), [](auto l, auto r){ return l->id() == r->id(); })) { + // G-code generator accesses model_object.instances to generate sequential print ordering matching the Plater object list. + update_apply_status(this->invalidate_step(psGCodeExport)); + model_object.clear_instances(); + model_object.instances.reserve(model_object_new.instances.size()); + for (const ModelInstance *model_instance : model_object_new.instances) { + model_object.instances.emplace_back(new ModelInstance(*model_instance)); + model_object.instances.back()->set_model_object(&model_object); + } + } else if (! std::equal(model_object.instances.begin(), model_object.instances.end(), model_object_new.instances.begin(), + [](auto l, auto r){ return l->print_volume_state == r->print_volume_state && l->printable == r->printable && + l->get_transformation().get_matrix().isApprox(r->get_transformation().get_matrix()); })) { + // If some of the instances changed, the bounding box of the updated ModelObject is likely no more valid. + // This is safe as the ModelObject's bounding box is only accessed from this function, which is called from the main thread only. + model_object.invalidate_bounding_box(); + // Synchronize the content of instances. + auto new_instance = model_object_new.instances.begin(); + for (auto old_instance = model_object.instances.begin(); old_instance != model_object.instances.end(); ++ old_instance, ++ new_instance) { + (*old_instance)->set_transformation((*new_instance)->get_transformation()); + (*old_instance)->print_volume_state = (*new_instance)->print_volume_state; + (*old_instance)->printable = (*new_instance)->printable; + } + } } } @@ -871,15 +954,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); - std::vector new_print_instances = print_objects_from_model_object(*model_object); + // 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 new_print_instances = print_objects_from_model_object(*model_object); if (old.empty()) { // Simple case, just generate new instances. - for (const PrintInstances &print_instances : new_print_instances) { - PrintObject *print_object = new PrintObject(this, model_object, false); - print_object->set_trafo(print_instances.trafo); - print_object->set_copies(print_instances.copies); - print_object->config_apply(config); + 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_apply_config(print_object); print_objects_new.emplace_back(print_object); // print_object_status.emplace(PrintObjectStatus(print_object, PrintObjectStatus::New)); new_objects = true; @@ -891,14 +979,12 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ std::sort(old.begin(), old.end(), [](const PrintObjectStatus *lhs, const PrintObjectStatus *rhs){ return transform3d_lower(lhs->trafo, rhs->trafo); }); // Merge the old / new lists. auto it_old = old.begin(); - for (const PrintInstances &new_instances : new_print_instances) { + for (PrintObjectTrafoAndInstances &new_instances : new_print_instances) { for (; it_old != old.end() && transform3d_lower((*it_old)->trafo, new_instances.trafo); ++ it_old); 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, false); - print_object->set_trafo(new_instances.trafo); - print_object->set_copies(new_instances.copies); - print_object->config_apply(config); + PrintObject *print_object = new PrintObject(this, model_object, new_instances.trafo, std::move(new_instances.instances)); + 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; @@ -906,7 +992,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ const_cast(*it_old)->status = PrintObjectStatus::Deleted; } else { // The PrintObject already exists and the copies differ. - PrintBase::ApplyStatus status = (*it_old)->print_object->set_copies(new_instances.copies); + PrintBase::ApplyStatus status = (*it_old)->print_object->set_instances(std::move(new_instances.instances)); if (status != PrintBase::APPLY_STATUS_UNCHANGED) update_apply_status(status == PrintBase::APPLY_STATUS_INVALIDATED); print_objects_new.emplace_back((*it_old)->print_object); @@ -1089,14 +1175,68 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_ bool Print::has_infinite_skirt() const { - return (m_config.skirt_height == -1 && m_config.skirts > 0) - || (m_config.ooze_prevention && this->extruders().size() > 1); + return (m_config.draft_shield && m_config.skirts > 0) || (m_config.ooze_prevention && this->extruders().size() > 1); } bool Print::has_skirt() const { - return (m_config.skirt_height > 0 && m_config.skirts > 0) - || this->has_infinite_skirt(); + return (m_config.skirt_height > 0 && m_config.skirts > 0) || this->has_infinite_skirt(); +} + +static inline bool sequential_print_horizontal_clearance_valid(const Print &print) +{ + Polygons convex_hulls_other; + std::map map_model_object_to_convex_hull; + for (const PrintObject *print_object : print.objects()) { + assert(! print_object->model_object()->instances.empty()); + assert(! print_object->instances().empty()); + ObjectID model_object_id = print_object->model_object()->id(); + auto it_convex_hull = map_model_object_to_convex_hull.find(model_object_id); + // Get convex hull of all printable volumes assigned to this print object. + ModelInstance *model_instance0 = print_object->model_object()->instances.front(); + if (it_convex_hull == map_model_object_to_convex_hull.end()) { + // Calculate the convex hull of a printable object. + // Grow convex hull with the clearance margin. + // FIXME: Arrangement has different parameters for offsetting (jtMiter, limit 2) + // which causes that the warning will be showed after arrangement with the + // appropriate object distance. Even if I set this to jtMiter the warning still shows up. + it_convex_hull = map_model_object_to_convex_hull.emplace_hint(it_convex_hull, model_object_id, + offset(print_object->model_object()->convex_hull_2d( + Geometry::assemble_transform(Vec3d::Zero(), model_instance0->get_rotation(), model_instance0->get_scaling_factor(), model_instance0->get_mirror())), + // Shrink the extruder_clearance_radius a tiny bit, so that if the object arrangement algorithm placed the objects + // exactly by satisfying the extruder_clearance_radius, this test will not trigger collision. + float(scale_(0.5 * print.config().extruder_clearance_radius.value - EPSILON)), + jtRound, float(scale_(0.1))).front()); + } + // Make a copy, so it may be rotated for instances. + Polygon convex_hull0 = it_convex_hull->second; + double z_diff = Geometry::rotation_diff_z(model_instance0->get_rotation(), print_object->instances().front().model_instance->get_rotation()); + if (std::abs(z_diff) > EPSILON) + convex_hull0.rotate(z_diff); + // Now we check that no instance of convex_hull intersects any of the previously checked object instances. + for (const PrintInstance &instance : print_object->instances()) { + Polygon convex_hull = convex_hull0; + // 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()) + return false; + polygons_append(convex_hulls_other, convex_hull); + } + } + return true; +} + +static inline bool sequential_print_vertical_clearance_valid(const Print &print) +{ + std::vector print_instances_ordered = sort_object_instances_by_model_order(print); + // Ignore the last instance printed. + print_instances_ordered.pop_back(); + // Find the other highest instance. + auto it = std::max_element(print_instances_ordered.begin(), print_instances_ordered.end(), [](auto l, auto r) { + return l->print_object->height() < r->print_object->height(); + }); + return it == print_instances_ordered.end() || (*it)->print_object->height() <= scale_(print.config().extruder_clearance_height.value); } // Precondition: Print::validate() requires the Print::apply() to be called its invocation. @@ -1109,53 +1249,16 @@ std::string Print::validate() const return L("The supplied settings will cause an empty print."); if (m_config.complete_objects) { - // Check horizontal clearance. - { - Polygons convex_hulls_other; - for (const PrintObject *print_object : m_objects) { - assert(! print_object->model_object()->instances.empty()); - assert(! print_object->copies().empty()); - // Get convex hull of all meshes assigned to this print object. - ModelInstance *model_instance0 = print_object->model_object()->instances.front(); - Vec3d rotation = model_instance0->get_rotation(); - rotation.z() = 0.; - // Calculate the convex hull of a printable object centered around X=0,Y=0. - // Grow convex hull with the clearance margin. - // FIXME: Arrangement has different parameters for offsetting (jtMiter, limit 2) - // which causes that the warning will be showed after arrangement with the - // appropriate object distance. Even if I set this to jtMiter the warning still shows up. - Polygon convex_hull0 = offset( - print_object->model_object()->convex_hull_2d( - Geometry::assemble_transform(Vec3d::Zero(), rotation, model_instance0->get_scaling_factor(), model_instance0->get_mirror())), - float(scale_(0.5 * m_config.extruder_clearance_radius.value)), jtRound, float(scale_(0.1))).front(); - // Now we check that no instance of convex_hull intersects any of the previously checked object instances. - for (const Point © : print_object->copies()) { - Polygon convex_hull = convex_hull0; - convex_hull.translate(copy); - if (! intersection(convex_hulls_other, convex_hull).empty()) - return L("Some objects are too close; your extruder will collide with them."); - polygons_append(convex_hulls_other, convex_hull); - } - } - } - // Check vertical clearance. - { - std::vector object_height; - for (const PrintObject *object : m_objects) - object_height.insert(object_height.end(), object->copies().size(), object->size(2)); - std::sort(object_height.begin(), object_height.end()); - // Ignore the tallest *copy* (this is why we repeat height for all of them): - // it will be printed as last one so its height doesn't matter. - object_height.pop_back(); - if (! object_height.empty() && object_height.back() > scale_(m_config.extruder_clearance_height.value)) - return L("Some objects are too tall and cannot be printed without extruder collisions."); - } - } // end if (m_config.complete_objects) + if (! sequential_print_horizontal_clearance_valid(*this)) + return L("Some objects are too close; your extruder will collide with them."); + if (! sequential_print_vertical_clearance_valid(*this)) + return L("Some objects are too tall and cannot be printed without extruder collisions."); + } if (m_config.spiral_vase) { size_t total_copies_count = 0; for (const PrintObject *object : m_objects) - total_copies_count += object->copies().size(); + 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."); @@ -1182,14 +1285,17 @@ 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) return L("Ooze prevention is currently not supported with the wipe tower enabled."); if (m_config.use_volumetric_e) return L("The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."); + if (m_config.complete_objects && extruders().size() > 1) + return L("The Wipe Tower is currently not supported for multimaterial sequential prints."); if (m_objects.size() > 1) { bool has_custom_layering = false; @@ -1258,7 +1364,7 @@ std::string Print::validate() const } while (ref_z == next_ref_z); } if (std::abs(this_height - ref_height) > EPSILON) - return L("The Wipe tower is only supported if all objects have the same layer height profile"); + return L("The Wipe tower is only supported if all objects have the same variable layer height"); i += 2; } } @@ -1364,16 +1470,17 @@ std::string Print::validate() const return std::string(); } +#if 0 // the bounding box of objects placed in copies position // (without taking skirt/brim/support material into account) BoundingBox Print::bounding_box() const { BoundingBox bb; for (const PrintObject *object : m_objects) - for (Point copy : object->m_copies) { - bb.merge(copy); - copy += to_2d(object->size); - bb.merge(copy); + for (const PrintInstance &instance : object->instances()) { + BoundingBox bb2(object->bounding_box()); + bb.merge(bb2.min + instance.shift); + bb.merge(bb2.max + instance.shift); } return bb; } @@ -1418,11 +1525,12 @@ BoundingBox Print::total_bounding_box() const return bb; } +#endif 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"); } @@ -1491,31 +1599,43 @@ 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("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(); + m_tool_ordering.clear(); if (this->has_wipe_tower()) { //this->set_status(95, L("Generating wipe tower")); this->_make_wipe_tower(); + } else if (! this->config().complete_objects.value) { + // 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 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(); @@ -1524,11 +1644,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(); } @@ -1537,17 +1661,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, const std::vector* thumbnail_data) -#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 "; @@ -1558,11 +1678,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_data); -#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(); } @@ -1594,7 +1710,7 @@ void Print::_make_skirt() for (const Layer *layer : object->m_layers) { if (layer->print_z > skirt_height_z) break; - for (const ExPolygon &expoly : layer->slices) + for (const ExPolygon &expoly : layer->lslices) // Collect the outer contour points only, ignore holes for the calculation of the convex hull. append(object_points, expoly.contour.points); } @@ -1606,24 +1722,16 @@ void Print::_make_skirt() append(object_points, extrusion_entity->as_polyline().points); } // Repeat points for each object copy. - for (const Point &shift : object->m_copies) { + for (const PrintInstance &instance : object->instances()) { Points copy_points = object_points; for (Point &pt : copy_points) - pt += shift; + pt += instance.shift; append(points, copy_points); } } // 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_config.wipe_tower_x-m_wipe_tower_data.brim_width, m_config.wipe_tower_y-m_wipe_tower_data.brim_width); - points.push_back(Point(scale_(pt.x()), scale_(pt.y()))); - points.push_back(Point(scale_(pt.x()+width), scale_(pt.y()))); - points.push_back(Point(scale_(pt.x()+width), scale_(pt.y()+depth))); - points.push_back(Point(scale_(pt.x()), scale_(pt.y()+depth))); - } + append(points, this->first_layer_wipe_tower_corners()); if (points.size() < 3) // At least three points required for a convex hull. @@ -1707,28 +1815,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()->slices) - 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->m_copies.size()); - for (const Point &pt : object->m_copies) - for (Polygon &poly : object_islands) { - islands.push_back(poly); - islands.back().translate(pt); - } - } - 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); @@ -1739,6 +1838,11 @@ 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); @@ -1842,8 +1946,8 @@ void Print::_make_brim() for (size_t i = 0; i < loops_trimmed_order.size();) { // Find all pieces that the initial loop was split into. size_t j = i + 1; - for (; j < loops_trimmed_order.size() && loops_trimmed_order[i].first == loops_trimmed_order[j].first; ++ j) ; - const ClipperLib_Z::Path &first_path = *loops_trimmed_order[i].first; + for (; j < loops_trimmed_order.size() && loops_trimmed_order[i].second == loops_trimmed_order[j].second; ++ j) ; + const ClipperLib_Z::Path &first_path = *loops_trimmed_order[i].first; if (i + 1 == j && first_path.size() > 3 && first_path.front().X == first_path.back().X && first_path.front().Y == first_path.back().Y) { auto *loop = new ExtrusionLoop(); m_brim.entities.emplace_back(loop); @@ -1878,6 +1982,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 Print::first_layer_wipe_tower_corners() const +{ + std::vector 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 { @@ -1892,8 +2048,8 @@ const WipeTowerData& Print::wipe_tower_data(size_t extruders_cnt, double first_l // If the wipe tower wasn't created yet, make sure the depth and brim_width members are set to default. if (! is_step_done(psWipeTower) && extruders_cnt !=0) { - float width = m_config.wipe_tower_width; - float brim_spacing = nozzle_diameter * 1.25f - first_layer_height * (1. - M_PI_4); + float width = float(m_config.wipe_tower_width); + float brim_spacing = float(nozzle_diameter * 1.25f - first_layer_height * (1. - M_PI_4)); const_cast(this)->m_wipe_tower_data.depth = (900.f/width) * float(extruders_cnt - 1); const_cast(this)->m_wipe_tower_data.brim_width = 4.5f * brim_spacing; @@ -1902,7 +2058,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(); @@ -1919,6 +2074,7 @@ void Print::_make_wipe_tower() // Let the ToolOrdering class know there will be initial priming extrusions at the start of the print. m_wipe_tower_data.tool_ordering = ToolOrdering(*this, (unsigned int)-1, true); + if (! m_wipe_tower_data.tool_ordering.has_wipe_tower()) // Don't generate any wipe tower. return; @@ -2030,19 +2186,12 @@ 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( - 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(); } -// Returns extruder this eec should be printed with, according to PrintRegion config -int Print::get_extruder(const ExtrusionEntityCollection& fill, const PrintRegion ®ion) -{ - return is_infill(fill.role()) ? std::max(0, (is_solid_infill(fill.entities.front()->role()) ? region.config().solid_infill_extruder : region.config().infill_extruder) - 1) : - std::max(region.config().perimeter_extruder.value - 1, 0); -} - // Generate a recommended G-code output file name based on the format template, default extension, and template parameters // (timestamps, object placeholders derived from the model, current placeholder prameters and print statistics. // Use the final print statistics if available, or just keep the print statistics placeholders if not available yet (before G-code is finalized). @@ -2051,6 +2200,7 @@ std::string Print::output_filename(const std::string &filename_base) const // Set the placeholders for the data know first after the G-code export is finished. // These values will be just propagated into the output file name. DynamicConfig config = this->finished() ? this->print_statistics().config() : this->print_statistics().placeholders(); + config.set_key_value("num_extruders", new ConfigOptionInt((int)m_config.nozzle_diameter.size())); return this->PrintBase::output_filename(m_config.output_filename_format.value, ".gcode", filename_base, &config); } @@ -2059,16 +2209,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 4fcd671665..f370d751d8 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -4,13 +4,16 @@ #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" +#include "GCode/ThumbnailData.hpp" +#include "GCode/GCodeProcessor.hpp" + +#include "libslic3r.h" namespace Slic3r { @@ -18,18 +21,36 @@ class Print; class PrintObject; class ModelObject; class GCode; -class GCodePreviewData; -#if ENABLE_THUMBNAIL_GENERATOR -struct ThumbnailData; -#endif // ENABLE_THUMBNAIL_GENERATOR +enum class SlicingMode : uint32_t; +class Layer; +class SupportLayer; + +namespace FillAdaptive { + struct Octree; + struct OctreeDeleter; + using OctreePtr = std::unique_ptr; +}; // Print step IDs for keeping track of the print state. +// The Print steps are applied in this order. enum PrintStep { - psSkirt, psBrim, psWipeTower, psGCodeExport, psCount, + 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 @@ -50,7 +71,7 @@ public: // Average diameter of nozzles participating on extruding this region. coordf_t bridging_height_avg(const PrintConfig &print_config) const; - // Collect extruder indices used to print this region's object. + // Collect 0-based extruder indices used to print this region's object. void collect_object_printing_extruders(std::vector &object_extruders) const; static void collect_object_printing_extruders(const PrintConfig &print_config, const PrintRegionConfig ®ion_config, std::vector &object_extruders); @@ -71,7 +92,7 @@ private: PrintRegion(Print* print) : m_refcnt(0), m_print(print) {} PrintRegion(Print* print, const PrintRegionConfig &config) : m_refcnt(0), m_print(print), m_config(config) {} - ~PrintRegion() {} + ~PrintRegion() = default; }; @@ -79,6 +100,21 @@ typedef std::vector LayerPtrs; typedef std::vector SupportLayerPtrs; class BoundingBoxf3; // TODO: for temporary constructor parameter +// Single instance of a PrintObject. +// As multiple PrintObjects may be generated for a single ModelObject (their instances differ in rotation around Z), +// ModelObject's instancess will be distributed among these multiple PrintObjects. +struct PrintInstance +{ + // Parent PrintObject + PrintObject *print_object; + // Source ModelInstance of a ModelObject, for which this print_object was created. + const ModelInstance *model_instance; + // Shift of this instance's center into the world coordinates. + Point shift; +}; + +typedef std::vector PrintInstances; + class PrintObject : public PrintObjectBaseWithState { private: // Prevents erroneous use by other classes. @@ -88,21 +124,22 @@ public: // vector of (layer height ranges and vectors of volume ids), indexed by region_id std::vector>> region_volumes; - // this is set to true when LayerRegion->slices is split in top/internal/bottom - // so that next call to make_perimeters() performs a union() before computing loops - bool typed_slices; - - Vec3crd size; // XYZ in scaled coordinates - + // Size of an object: XYZ in scaled coordinates. The size might not be quite snug in XY plane. + const Vec3crd& size() const { return m_size; } const PrintObjectConfig& config() const { return m_config; } const LayerPtrs& layers() const { return m_layers; } const SupportLayerPtrs& support_layers() const { return m_support_layers; } const Transform3d& trafo() const { return m_trafo; } - const Points& copies() const { return m_copies; } - const Point copy_center(size_t idx) const { return m_copies[idx] + m_copies_shift + Point(this->size.x() / 2, this->size.y() / 2); } + const PrintInstances& instances() const { return m_instances; } - // since the object is aligned to origin, bounding box coincides with size - BoundingBox bounding_box() const { return BoundingBox(Point(0,0), to_2d(this->size)); } + // Bounding box is used to align the object infill patterns, and to calculate attractor for the rear seam. + // The bounding box may not be quite snug. + BoundingBox bounding_box() const { return BoundingBox(Point(- m_size.x() / 2, - m_size.y() / 2), Point(m_size.x() / 2, m_size.y() / 2)); } + // Height is used for slicing, for sorting the objects by height for sequential printing and for checking vertical clearence in sequential print mode. + // The height is snug. + coord_t height() const { return m_size.z(); } + // Centering offset of the sliced mesh from the scaled and rotated mesh of the model. + const Point& center_offset() const { return m_center_offset; } // adds region_id, too, if necessary void add_region_volume(unsigned int region_id, int volume_id, const t_layer_height_range &layer_range) { @@ -113,11 +150,17 @@ public: // This is the *total* layer count (including support layers) // this value is not supposed to be compared with Layer::id // since they have different semantics. - size_t total_layer_count() const { return this->layer_count() + this->support_layer_count(); } - size_t layer_count() const { return m_layers.size(); } - void clear_layers(); - Layer* get_layer(int idx) { return m_layers[idx]; } - const Layer* get_layer(int idx) const { return m_layers[idx]; } + size_t total_layer_count() const { return this->layer_count() + this->support_layer_count(); } + size_t layer_count() const { return m_layers.size(); } + void clear_layers(); + 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; + 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; + Layer* get_layer_at_printz(coordf_t print_z, coordf_t epsilon); // 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); @@ -151,17 +194,19 @@ public: std::vector slice_support_blockers() const { return this->slice_support_volumes(ModelVolumeType::SUPPORT_BLOCKER); } std::vector slice_support_enforcers() const { return this->slice_support_volumes(ModelVolumeType::SUPPORT_ENFORCER); } -protected: + // Helpers to project custom facets on slices + void project_and_append_custom_facets(bool seam, EnforcerBlockerType type, std::vector& expolys) const; + +private: // to be called from Print only. friend class Print; - PrintObject(Print* print, ModelObject* model_object, bool add_instances = true); - ~PrintObject() {} + PrintObject(Print* print, ModelObject* model_object, const Transform3d& trafo, PrintInstances&& instances); + ~PrintObject() = default; void config_apply(const ConfigBase &other, bool ignore_nonexistent = false) { this->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); } - void set_trafo(const Transform3d& trafo) { m_trafo = trafo; } - PrintBase::ApplyStatus set_copies(const Points &points); + PrintBase::ApplyStatus set_instances(PrintInstances &&instances); // Invalidates the step, and its depending steps in PrintObject and Print. bool invalidate_step(PrintObjectStep step); // Invalidates all PrintObject and Print steps. @@ -178,11 +223,12 @@ private: void make_perimeters(); void prepare_infill(); void infill(); + void ironing(); void generate_support_material(); void _slice(const std::vector &layer_height_profile); std::string _fix_slicing_errors(); - void _simplify_slices(double distance); + void simplify_slices(double distance); bool has_support_material() const; void detect_surfaces_type(); void process_external_surfaces(); @@ -192,26 +238,32 @@ private: void discover_horizontal_shells(); void combine_infill(); void _generate_support_material(); + std::pair prepare_adaptive_infill_data(); + // XYZ in scaled coordinates + Vec3crd m_size; PrintObjectConfig m_config; // Translation in Z + Rotation + Scaling / Mirroring. Transform3d m_trafo = Transform3d::Identity(); // Slic3r::Point objects in scaled G-code coordinates - Points m_copies; - // scaled coordinates to add to copies (to compensate for the alignment - // operated when creating the object but still preserving a coherent API - // for external callers) - Point m_copies_shift; + std::vector m_instances; + // The mesh is being centered before thrown to Clipper, so that the Clipper's fixed coordinates require less bits. + // This is the adjustment of the the Object's coordinate system towards PrintObject's coordinate system. + Point m_center_offset; SlicingParameters m_slicing_params; LayerPtrs m_layers; SupportLayerPtrs m_support_layers; - std::vector slice_region(size_t region_id, const std::vector &z) const; + // this is set to true when LayerRegion->slices is split in top/internal/bottom + // so that next call to make_perimeters() performs a union() before computing loops + bool m_typed_slices = false; + + std::vector slice_region(size_t region_id, const std::vector &z, SlicingMode mode) const; std::vector slice_modifiers(size_t region_id, const std::vector &z) const; - std::vector slice_volumes(const std::vector &z, const std::vector &volumes) const; - std::vector slice_volume(const std::vector &z, const ModelVolume &volume) const; - std::vector slice_volume(const std::vector &z, const std::vector &ranges, const ModelVolume &volume) const; + std::vector slice_volumes(const std::vector &z, SlicingMode mode, const std::vector &volumes) const; + std::vector slice_volume(const std::vector &z, SlicingMode mode, const ModelVolume &volume) const; + std::vector slice_volume(const std::vector &z, const std::vector &ranges, SlicingMode mode, const ModelVolume &volume) const; }; struct WipeTowerData @@ -219,7 +271,7 @@ struct WipeTowerData // Following section will be consumed by the GCodeGenerator. // Tool ordering of a non-sequential print has to be known to calculate the wipe tower. // Cache it here, so it does not need to be recalculated during the G-code generation. - ToolOrdering tool_ordering; + ToolOrdering &tool_ordering; // Cache of tool changes per print layer. std::unique_ptr> priming; std::vector> tool_changes; @@ -232,7 +284,6 @@ struct WipeTowerData float brim_width; void clear() { - tool_ordering.clear(); priming.reset(nullptr); tool_changes.clear(); final_purge.reset(nullptr); @@ -241,6 +292,14 @@ struct WipeTowerData depth = 0.f; brim_width = 0.f; } + +private: + // Only allow the WipeTowerData to be instantiated internally by Print, + // as this WipeTowerData shares reference to Print::m_tool_ordering. + friend class Print; + WipeTowerData(ToolOrdering &tool_ordering) : tool_ordering(tool_ordering) { clear(); } + WipeTowerData(const WipeTowerData & /* rhs */) = delete; + WipeTowerData &operator=(const WipeTowerData & /* rhs */) = delete; }; struct PrintStatistics @@ -248,8 +307,6 @@ struct PrintStatistics PrintStatistics() { clear(); } std::string estimated_normal_print_time; std::string estimated_silent_print_time; - std::vector estimated_normal_color_print_times; - std::vector estimated_silent_color_print_times; double total_used_filament; double total_extruded_volume; double total_cost; @@ -267,10 +324,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_color_print_times.clear(); - estimated_silent_color_print_times.clear(); total_used_filament = 0.; total_extruded_volume = 0.; total_cost = 0.; @@ -292,10 +345,10 @@ private: // Prevents erroneous use by other classes. typedef PrintBaseWithState Inherited; public: - Print() {} + Print() = default; virtual ~Print() { this->clear(); } - PrinterTechnology technology() const noexcept { return ptFFF; } + PrinterTechnology technology() const noexcept override { return ptFFF; } // Methods, which change the state of Print / PrintObject / PrintRegion. // The following methods are synchronized with process() and export_gcode(), @@ -304,17 +357,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 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, const std::vector* thumbnail_data = 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); } @@ -328,8 +379,6 @@ public: // Returns an empty string if valid, otherwise returns an error message. std::string validate() const override; - BoundingBox bounding_box() const; - BoundingBox total_bounding_box() const; double skirt_first_layer_height() const; Flow brim_flow() const; Flow skirt_flow() const; @@ -345,30 +394,44 @@ public: const PrintConfig& config() const { return m_config; } const PrintObjectConfig& default_object_config() const { return m_default_object_config; } const PrintRegionConfig& default_region_config() const { return m_default_region_config; } + //FIXME returning const vector to non-const PrintObject*, caller could modify PrintObjects! const PrintObjectPtrs& objects() const { return m_objects; } PrintObject* get_object(size_t idx) { return m_objects[idx]; } 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. unsigned int num_object_instances() const; - // Returns extruder this eec should be printed with, according to PrintRegion config: - static int get_extruder(const ExtrusionEntityCollection& fill, const PrintRegion ®ion); - 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; const WipeTowerData& wipe_tower_data(size_t extruders_cnt = 0, double first_layer_height = 0., double nozzle_diameter = 0.) const; + const ToolOrdering& tool_ordering() const { return m_tool_ordering; } std::string output_filename(const std::string &filename_base = std::string()) const override; // Accessed by SupportMaterial const PrintRegion* get_region(size_t idx) const { return m_regions[idx]; } + const ToolOrdering& get_tool_ordering() const { return m_wipe_tower_data.tool_ordering; } // #ys_FIXME just for testing protected: // methods for handling regions @@ -384,7 +447,6 @@ private: const DynamicPrintConfig &new_full_config, t_config_option_keys &print_diff, t_config_option_keys &object_diff, t_config_option_keys ®ion_diff, t_config_option_keys &full_config_diff, - DynamicPrintConfig &placeholder_parser_overrides, DynamicPrintConfig &filament_overrides) const; bool invalidate_state_by_config_options(const std::vector &opt_keys); @@ -392,6 +454,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 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); @@ -405,9 +473,17 @@ 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. - WipeTowerData m_wipe_tower_data; + ToolOrdering m_tool_ordering; + WipeTowerData m_wipe_tower_data {m_tool_ordering}; // Estimated print time, filament consumed. PrintStatistics m_print_statistics; diff --git a/src/libslic3r/PrintBase.cpp b/src/libslic3r/PrintBase.cpp index fdee67f2e4..7cdf6448c3 100644 --- a/src/libslic3r/PrintBase.cpp +++ b/src/libslic3r/PrintBase.cpp @@ -1,3 +1,4 @@ +#include "Exception.hpp" #include "PrintBase.hpp" #include @@ -37,7 +38,7 @@ void PrintBase::update_object_placeholders(DynamicConfig &config, const std::str } } - config.set_key_value("year", new ConfigOptionStrings(v_scale)); + config.set_key_value("scale", new ConfigOptionStrings(v_scale)); if (! input_file.empty()) { // get basename with and without suffix const std::string input_filename = boost::filesystem::path(input_file).filename().string(); @@ -64,11 +65,11 @@ std::string PrintBase::output_filename(const std::string &format, const std::str boost::filesystem::path filename = format.empty() ? cfg.opt_string("input_filename_base") + default_ext : this->placeholder_parser().process(format, 0, &cfg); - if (filename.extension().empty()) - filename = boost::filesystem::change_extension(filename, default_ext); + if (filename.extension().empty()) + 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::RuntimeError(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 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 05d884cc88..bfbabd06b5 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 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(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 - TimeStamp set_done(StepType step, tbb::mutex &mtx, ThrowIfCanceled throw_if_canceled) { + std::pair 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(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 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 retval(static_cast(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 cancel_callback(PrintBase *print); + static tbb::mutex& state_mutex(PrintBase *print); + static std::function 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 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 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 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 m_cancel_status; // Callback to be evoked regularly to update state of the UI thread. status_callback_type m_status_callback; +private: + tbb::atomic 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 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(step), PrintStateBase::WarningLevel::NON_CRITICAL, std::string()); + return status.first; + } bool invalidate_step(PrintStepEnum step) { return m_state.invalidate(step, this->cancel_callback()); } template @@ -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 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(active_step.first), warning_level, message); + } + private: PrintState m_state; }; @@ -394,14 +549,19 @@ public: typedef PrintState 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 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(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 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(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 82815131e2..e623474872 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -80,6 +80,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)); @@ -106,13 +108,61 @@ 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. " "If left blank, the default OS CA certificate repository is used."); def->mode = comAdvanced; def->set_default_value(new ConfigOptionString("")); + + def = this->add("elefant_foot_compensation", coFloat); + def->label = L("Elephant foot compensation"); + def->category = L("Advanced"); + def->tooltip = L("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."); + def->sidetext = L("mm"); + 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::get_enum_values(); + def->enum_values.push_back("key"); + def->enum_values.push_back("user"); + def->enum_labels.push_back("KeyPassword"); + def->enum_labels.push_back("UserPassword"); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionEnum(atKeyPassword)); } void PrintConfigDef::init_fff_params() @@ -134,6 +184,7 @@ void PrintConfigDef::init_fff_params() 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; @@ -168,6 +219,17 @@ void PrintConfigDef::init_fff_params() def->min = 0; def->set_default_value(new ConfigOptionInt(3)); + def = this->add("bottom_solid_min_thickness", coFloat); + //TRN To be shown in Print Settings "Top solid layers" + def->label = L("Bottom"); + def->category = L("Layers and Perimeters"); + def->tooltip = L("The number of bottom solid layers is increased above bottom_solid_layers if necessary to satisfy " + "minimum thickness of bottom shell."); + def->full_label = L("Minimum bottom shell thickness"); + def->sidetext = L("mm"); + def->min = 0; + def->set_default_value(new ConfigOptionFloat(0.)); + def = this->add("bridge_acceleration", coFloat); def->label = L("Bridge"); def->tooltip = L("This is the acceleration your printer will use for bridges. " @@ -233,7 +295,7 @@ void PrintConfigDef::init_fff_params() "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)."); def->mode = comExpert; - def->set_default_value(new ConfigOptionBool(false)); + def->set_default_value(new ConfigOptionBool(true)); def = this->add("colorprint_heights", coFloats); def->label = L("Colorprint height"); @@ -360,16 +422,6 @@ void PrintConfigDef::init_fff_params() def->min = 0; def->set_default_value(new ConfigOptionFloat(6)); - def = this->add("elefant_foot_compensation", coFloat); - def->label = L("Elephant foot compensation"); - def->category = L("Advanced"); - def->tooltip = L("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."); - def->sidetext = L("mm"); - def->min = 0; - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionFloat(0)); - def = this->add("end_gcode", coString); def->label = L("End G-code"); def->tooltip = L("This end procedure is inserted at the end of the output file. " @@ -407,18 +459,20 @@ void PrintConfigDef::init_fff_params() def->cli = "top-fill-pattern|external-fill-pattern|solid-fill-pattern"; def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("rectilinear"); + def->enum_values.push_back("monotonic"); def->enum_values.push_back("concentric"); def->enum_values.push_back("hilbertcurve"); def->enum_values.push_back("archimedeanchords"); def->enum_values.push_back("octagramspiral"); def->enum_labels.push_back(L("Rectilinear")); + def->enum_labels.push_back(L("Monotonic")); def->enum_labels.push_back(L("Concentric")); def->enum_labels.push_back(L("Hilbert Curve")); def->enum_labels.push_back(L("Archimedean Chords")); def->enum_labels.push_back(L("Octagram Spiral")); // solid_fill_pattern is an obsolete equivalent to top_fill_pattern/bottom_fill_pattern. def->aliases = { "solid_fill_pattern", "external_fill_pattern" }; - def->set_default_value(new ConfigOptionEnum(ipRectilinear)); + def->set_default_value(new ConfigOptionEnum(ipMonotonic)); def = this->add("bottom_fill_pattern", coEnum); def->label = L("Bottom fill pattern"); @@ -562,7 +616,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("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."); def->sidetext = L("approximate seconds"); - def->width = 6; def->min = 0; def->max = 1000; def->mode = comExpert; @@ -718,8 +771,9 @@ void PrintConfigDef::init_fff_params() def->gui_type = "f_enum_open"; def->gui_flags = "show_value"; def->enum_values.push_back("PLA"); - def->enum_values.push_back("ABS"); def->enum_values.push_back("PET"); + def->enum_values.push_back("ABS"); + def->enum_values.push_back("ASA"); def->enum_values.push_back("FLEX"); def->enum_values.push_back("HIPS"); def->enum_values.push_back("EDGE"); @@ -829,6 +883,8 @@ 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("Grid")); def->enum_labels.push_back(L("Triangles")); @@ -842,6 +898,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(ipStars)); def = this->add("first_layer_acceleration", coFloat); @@ -855,8 +913,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 }); @@ -897,8 +957,10 @@ 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 }); @@ -928,6 +990,7 @@ void PrintConfigDef::init_fff_params() "The \"No extrusion\" flavor prevents PrusaSlicer from exporting any extrusion value at all."); def->enum_keys_map = &ConfigOptionEnum::get_enum_values(); def->enum_values.push_back("reprap"); + def->enum_values.push_back("reprapfirmware"); def->enum_values.push_back("repetier"); def->enum_values.push_back("teacup"); def->enum_values.push_back("makerware"); @@ -938,6 +1001,7 @@ void PrintConfigDef::init_fff_params() def->enum_values.push_back("smoothie"); def->enum_values.push_back("no-extrusion"); def->enum_labels.push_back("RepRap/Sprinter"); + def->enum_labels.push_back("RepRapFirmware"); def->enum_labels.push_back("Repetier"); def->enum_labels.push_back("Teacup"); def->enum_labels.push_back("MakerWare (MakerBot)"); @@ -948,7 +1012,7 @@ void PrintConfigDef::init_fff_params() def->enum_labels.push_back("Smoothie"); def->enum_labels.push_back(L("No extrusion")); def->mode = comExpert; - def->set_default_value(new ConfigOptionEnum(gcfRepRap)); + def->set_default_value(new ConfigOptionEnum(gcfRepRapSprinter)); def = this->add("gcode_label_objects", coBool); def->label = L("Label objects"); @@ -1065,6 +1129,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::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("All top surfaces"); + def->enum_labels.push_back("Topmost surface only"); + def->enum_labels.push_back("All solid surfaces"); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionEnum(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 " @@ -1092,7 +1205,21 @@ void PrintConfigDef::init_fff_params() def->mode = comExpert; def->set_default_value(new ConfigOptionBool(true)); - const int machine_limits_opt_width = 7; + 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::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::EmitToGCode)); + { struct AxisDefault { std::string name; @@ -1124,7 +1251,6 @@ void PrintConfigDef::init_fff_params() (void)L("Maximum feedrate of the E axis"); def->sidetext = L("mm/s"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats(axis.max_feedrate)); // Add the machine acceleration limits for XYZE axes (M201) @@ -1142,7 +1268,6 @@ void PrintConfigDef::init_fff_params() (void)L("Maximum acceleration of the E axis"); def->sidetext = L("mm/s²"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats(axis.max_acceleration)); // Add the machine jerk limits for XYZE axes (M205) @@ -1160,7 +1285,6 @@ void PrintConfigDef::init_fff_params() (void)L("Maximum jerk of the E axis"); def->sidetext = L("mm/s"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats(axis.max_jerk)); } @@ -1173,7 +1297,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Minimum feedrate when extruding (M205 S)"); def->sidetext = L("mm/s"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats{ 0., 0. }); @@ -1184,7 +1307,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Minimum travel feedrate (M205 T)"); def->sidetext = L("mm/s"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats{ 0., 0. }); @@ -1195,7 +1317,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Maximum acceleration when extruding (M204 S)"); def->sidetext = L("mm/s²"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats{ 1500., 1250. }); @@ -1206,7 +1327,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("Maximum acceleration when retracting (M204 T)"); def->sidetext = L("mm/s²"); def->min = 0; - def->width = machine_limits_opt_width; def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats{ 1500., 1250. }); @@ -1333,9 +1453,13 @@ void PrintConfigDef::init_fff_params() def->enum_values.push_back("octoprint"); def->enum_values.push_back("duet"); def->enum_values.push_back("flashair"); + def->enum_values.push_back("astrobox"); + def->enum_values.push_back("repetier"); def->enum_labels.push_back("OctoPrint"); def->enum_labels.push_back("Duet"); def->enum_labels.push_back("FlashAir"); + def->enum_labels.push_back("AstroBox"); + def->enum_labels.push_back("Repetier"); def->mode = comAdvanced; def->set_default_value(new ConfigOptionEnum(htOctoPrint)); @@ -1650,26 +1774,6 @@ void PrintConfigDef::init_fff_params() def->set_default_value(new ConfigOptionFloat(30)); #endif - def = this->add("serial_port", coString); - def->gui_type = "select_open"; - def->label = ""; - def->full_label = L("Serial port"); - def->tooltip = L("USB/serial port for printer connection."); - def->width = 20; - def->set_default_value(new ConfigOptionString("")); - - def = this->add("serial_speed", coInt); - def->gui_type = "i_enum_open"; - def->label = L("Speed"); - def->full_label = L("Serial port speed"); - def->tooltip = L("Speed (baud) of USB/serial port for printer connection."); - def->min = 1; - def->max = 300000; - def->enum_values.push_back("115200"); - def->enum_values.push_back("250000"); - def->mode = comAdvanced; - def->set_default_value(new ConfigOptionInt(250000)); - def = this->add("skirt_distance", coFloat); def->label = L("Distance from object"); def->tooltip = L("Distance between skirt and object(s). Set this to zero to attach the skirt " @@ -1686,6 +1790,13 @@ void PrintConfigDef::init_fff_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionInt(1)); + def = this->add("draft_shield", coBool); + def->label = L("Draft shield"); + def->tooltip = L("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."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("skirts", coInt); def->label = L("Loops (minimum)"); def->full_label = L("Skirt Loops"); @@ -1701,7 +1812,6 @@ void PrintConfigDef::init_fff_params() def->tooltip = L("If layer print time is estimated below this number of seconds, print moves " "speed will be scaled down to extend duration to this value."); def->sidetext = L("approximate seconds"); - def->width = 6; def->min = 0; def->max = 1000; def->mode = comExpert; @@ -1779,6 +1889,13 @@ void PrintConfigDef::init_fff_params() def->shortcut.push_back("bottom_solid_layers"); def->min = 0; + def = this->add("solid_min_thickness", coFloat); + def->label = L("Minimum thickness of a top / bottom shell"); + def->tooltip = L("Minimum thickness of a top / bottom shell"); + def->shortcut.push_back("top_solid_min_thickness"); + def->shortcut.push_back("bottom_solid_min_thickness"); + def->min = 0; + def = this->add("spiral_vase", coBool); def->label = L("Spiral vase"); def->tooltip = L("This feature will raise Z gradually while printing a single-walled object " @@ -1830,6 +1947,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."); @@ -2051,9 +2195,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 }); @@ -2125,6 +2270,18 @@ void PrintConfigDef::init_fff_params() def->min = 0; def->set_default_value(new ConfigOptionInt(3)); + def = this->add("top_solid_min_thickness", coFloat); + //TRN To be shown in Print Settings "Top solid layers" + def->label = L("Top"); + def->category = L("Layers and Perimeters"); + def->tooltip = L("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."); + def->full_label = L("Minimum top shell thickness"); + def->sidetext = L("mm"); + def->min = 0; + def->set_default_value(new ConfigOptionFloat(0.)); + def = this->add("travel_speed", coFloat); def->label = L("Travel"); def->tooltip = L("Speed for travel moves (jumps between distant extrusion points)."); @@ -2419,6 +2576,15 @@ void PrintConfigDef::init_sla_params() "to the sign of the correction."); def->mode = comExpert; def->set_default_value(new ConfigOptionFloat(0.0)); + + def = this->add("elefant_foot_min_width", coFloat); + def->label = L("Elephant foot minimum width"); + def->category = L("Advanced"); + def->tooltip = L("Minimum width of features to maintain when doing elephant foot compensation."); + def->sidetext = L("mm"); + def->min = 0; + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionFloat(0.2)); def = this->add("gamma_correction", coFloat); def->label = L("Printer gamma correction"); @@ -2585,7 +2751,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"); @@ -2594,7 +2760,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"); @@ -2603,7 +2769,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"); @@ -2613,7 +2779,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"); @@ -2622,8 +2788,29 @@ void PrintConfigDef::init_sla_params() 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"); + def->tooltip = L( + "Maximum number of bridges that can be placed on a pillar. Bridges " + "hold support point pinheads and connect to pillars as small branches."); + def->min = 0; + def->max = 50; + def->mode = comExpert; + 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" @@ -2817,7 +3004,7 @@ void PrintConfigDef::init_sla_params() def->min = 45; def->max = 90; def->mode = comAdvanced; - def->set_default_value(new ConfigOptionFloat(45.0)); + def->set_default_value(new ConfigOptionFloat(90.0)); def = this->add("pad_around_object", coBool); def->label = L("Pad around object"); @@ -2871,6 +3058,47 @@ void PrintConfigDef::init_sla_params() def->min = 0; def->mode = comExpert; def->set_default_value(new ConfigOptionFloat(0.3)); + + def = this->add("hollowing_enable", coBool); + def->label = L("Enable hollowing"); + def->category = L("Hollowing"); + def->tooltip = L("Hollow out a model to have an empty interior"); + def->mode = comSimple; + def->set_default_value(new ConfigOptionBool(false)); + + def = this->add("hollowing_min_thickness", coFloat); + def->label = L("Wall thickness"); + def->category = L("Hollowing"); + def->tooltip = L("Minimum wall thickness of a hollowed model."); + def->sidetext = L("mm"); + def->min = 1; + def->max = 10; + def->mode = comSimple; + def->set_default_value(new ConfigOptionFloat(3.)); + + def = this->add("hollowing_quality", coFloat); + def->label = L("Accuracy"); + def->category = L("Hollowing"); + def->tooltip = L("Performance vs accuracy of calculation. Lower values may produce unwanted artifacts."); + def->min = 0; + def->max = 1; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(0.5)); + + def = this->add("hollowing_closing_distance", coFloat); + def->label = L("Closing distance"); + def->category = L("Hollowing"); + def->tooltip = L( + "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."); + def->sidetext = L("mm"); + def->min = 0; + def->max = 10; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(2.0)); } void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &value) @@ -2915,6 +3143,11 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va } else if (opt_key == "support_material_pattern" && value == "pillars") { // Slic3r PE does not support the pillars. They never worked well. value = "rectilinear"; + } else if (opt_key == "skirt_height" && value == "-1") { + // PrusaSlicer no more accepts skirt_height == -1 to print a draft shield to the top of the highest object. + // A new "draft_shield" boolean config value is used instead. + opt_key = "draft_shield"; + value = "1"; } else if (opt_key == "octoprint_host") { opt_key = "print_host"; } else if (opt_key == "octoprint_cafile") { @@ -2932,10 +3165,15 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va "seal_position", "vibration_limit", "bed_size", "print_center", "g0", "threads", "pressure_advance", "wipe_tower_per_color_wipe" #ifndef HAS_PRESSURE_EQUALIZER - , "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative" + , "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative", #endif /* HAS_PRESSURE_EQUALIZER */ + "serial_port", "serial_speed" }; + // In PrusaSlicer 2.3.0-alpha0 the "monotonous" infill was introduced, which was later renamed to "monotonic". + if (value == "monotonous" && (opt_key == "top_fill_pattern" || opt_key == "bottom_fill_pattern" || opt_key == "fill_pattern")) + value = "monotonic"; + if (ignore.find(opt_key) != ignore.end()) { opt_key = ""; return; @@ -2965,7 +3203,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("extruder_clearance_radius"); + auto dd_opt = cfg.option("duplicate_distance"); + auto co_opt = cfg.option("complete_objects"); + + if (!ecr_opt || !dd_opt || !co_opt) ret = 0.; + 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 *opt = cfg.option>("printer_technology"); + + if (opt) return opt->value; + + const ConfigOptionBool *export_opt = cfg.option("export_sla"); + if (export_opt && export_opt->getBool()) return ptSLA; + + export_opt = cfg.option("export_gcode"); + if (export_opt && export_opt->getBool()) return ptFFF; + + return ptUnknown; +} + +void DynamicPrintConfig::normalize_fdm() { if (this->has("extruder")) { int extruder = this->option("extruder")->getInt(); @@ -3035,22 +3309,6 @@ std::string DynamicPrintConfig::validate() } } -double PrintConfig::min_object_distance() const -{ - return PrintConfig::min_object_distance(static_cast(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() { @@ -3086,11 +3344,12 @@ std::string FullPrintConfig::validate() if (this->use_firmware_retraction.value && this->gcode_flavor.value != gcfSmoothie && - this->gcode_flavor.value != gcfRepRap && + this->gcode_flavor.value != gcfRepRapSprinter && + this->gcode_flavor.value != gcfRepRapFirmware && this->gcode_flavor.value != gcfMarlin && this->gcode_flavor.value != gcfMachinekit && this->gcode_flavor.value != gcfRepetier) - return "--use-firmware-retraction is only supported by Marlin, Smoothie, Repetier and Machinekit firmware"; + return "--use-firmware-retraction is only supported by Marlin, Smoothie, RepRapFirmware, Repetier and Machinekit firmware"; if (this->use_firmware_retraction.value) for (unsigned char wipe : this->wipe.values) @@ -3123,7 +3382,7 @@ std::string FullPrintConfig::validate() return "Invalid value for --infill-every-layers"; // --skirt-height - if (this->skirt_height < -1) // -1 means as tall as the object + if (this->skirt_height < 0) return "Invalid value for --skirt-height"; // --bridge-flow-ratio @@ -3229,7 +3488,6 @@ StaticPrintConfig::StaticCache PrintRegionConfi StaticPrintConfig::StaticCache MachineEnvelopeConfig::s_cache_MachineEnvelopeConfig; StaticPrintConfig::StaticCache GCodeConfig::s_cache_GCodeConfig; StaticPrintConfig::StaticCache PrintConfig::s_cache_PrintConfig; -StaticPrintConfig::StaticCache HostConfig::s_cache_HostConfig; StaticPrintConfig::StaticCache FullPrintConfig::s_cache_FullPrintConfig; StaticPrintConfig::StaticCache SLAMaterialConfig::s_cache_SLAMaterialConfig; @@ -3282,6 +3540,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."); @@ -3421,6 +3685,12 @@ CLIMiscConfigDef::CLIMiscConfigDef() def->tooltip = L("The file where the output will be written (if not specified, it will be based on the input file)."); def->cli = "output|o"; + def = this->add("single_instance", coBool); + def->label = L("Single instance 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"); @@ -3433,7 +3703,8 @@ CLIMiscConfigDef::CLIMiscConfigDef() def = this->add("loglevel", coInt); def->label = L("Logging level"); - def->tooltip = L("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"); + def->tooltip = L("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."); def->min = 0; #if (defined(_MSC_VER) || defined(__MINGW32__)) && defined(SLIC3R_GUI) @@ -3459,8 +3730,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 &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("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("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_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 5f5a861da3..89c9c7a97f 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -11,7 +11,6 @@ // PrintRegionConfig // PrintConfig // GCodeConfig -// HostConfig // #ifndef slic3r_PrintConfig_hpp_ @@ -25,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 PrintHostType { - htOctoPrint, htDuet, htFlashAir +enum class MachineLimitsUsage { + EmitToGCode, + TimeEstimateOnly, + Ignore, + Count, }; -enum InfillPattern { - ipRectilinear, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb, - ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipCount, +enum PrintHostType { + htOctoPrint, htDuet, htFlashAir, htAstroBox, htRepetier +}; + +enum AuthorizationType { + atKeyPassword, atUserPassword +}; + +enum InfillPattern : int { + ipRectilinear, ipMonotonic, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb, + ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipAdaptiveCubic, ipSupportCubic, ipCount, +}; + +enum class IroningType { + TopSurfaces, + TopmostOnly, + AllSolid, + Count, }; enum SupportMaterialPattern { @@ -46,12 +63,6 @@ enum SeamPosition { spRandom, spNearest, spAligned, spRear }; -/* -enum FilamentType { - ftPLA, ftABS, ftPET, ftHIPS, ftFLEX, ftSCAFF, ftEDGE, ftNGEN, ftPVA -}; -*/ - enum SLAMaterial { slamTough, slamFlex, @@ -83,7 +94,8 @@ template<> inline const t_config_enum_values& ConfigOptionEnum inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { static t_config_enum_values keys_map; if (keys_map.empty()) { - keys_map["reprap"] = gcfRepRap; + keys_map["reprap"] = gcfRepRapSprinter; + keys_map["reprapfirmware"] = gcfRepRapFirmware; keys_map["repetier"] = gcfRepetier; keys_map["teacup"] = gcfTeacup; keys_map["makerware"] = gcfMakerWare; @@ -97,12 +109,33 @@ template<> inline const t_config_enum_values& ConfigOptionEnum::get return keys_map; } +template<> inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { + static t_config_enum_values keys_map; + if (keys_map.empty()) { + keys_map["emit_to_gcode"] = int(MachineLimitsUsage::EmitToGCode); + keys_map["time_estimate_only"] = int(MachineLimitsUsage::TimeEstimateOnly); + keys_map["ignore"] = int(MachineLimitsUsage::Ignore); + } + return keys_map; +} + template<> inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { static t_config_enum_values keys_map; if (keys_map.empty()) { keys_map["octoprint"] = htOctoPrint; 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::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; } @@ -111,6 +144,7 @@ template<> inline const t_config_enum_values& ConfigOptionEnum::g static t_config_enum_values keys_map; if (keys_map.empty()) { keys_map["rectilinear"] = ipRectilinear; + keys_map["monotonic"] = ipMonotonic; keys_map["grid"] = ipGrid; keys_map["triangles"] = ipTriangles; keys_map["stars"] = ipStars; @@ -123,6 +157,18 @@ template<> inline const t_config_enum_values& ConfigOptionEnum::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::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; } @@ -148,24 +194,6 @@ template<> inline const t_config_enum_values& ConfigOptionEnum::ge return keys_map; } -/* -template<> inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { - static t_config_enum_values keys_map; - if (keys_map.empty()) { - keys_map["PLA"] = ftPLA; - keys_map["ABS"] = ftABS; - keys_map["PET"] = ftPET; - keys_map["HIPS"] = ftHIPS; - keys_map["FLEX"] = ftFLEX; - keys_map["SCAFF"] = ftSCAFF; - keys_map["EDGE"] = ftEDGE; - keys_map["NGEN"] = ftNGEN; - keys_map["PVA"] = ftPVA; - } - return keys_map; -} -*/ - template<> inline const t_config_enum_values& ConfigOptionEnum::get_enum_values() { static const t_config_enum_values keys_map = { { "landscape", sladoLandscape}, @@ -217,6 +245,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, @@ -228,16 +259,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 &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); @@ -252,14 +287,6 @@ public: { PrintConfigDef::handle_legacy(opt_key, value); } }; -template -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: @@ -353,6 +380,9 @@ protected: #define STATIC_PRINT_CONFIG_CACHE_BASE(CLASS_NAME) \ public: \ /* Overrides ConfigBase::optptr(). Find ando/or create a ConfigOption instance for a given name. */ \ + const ConfigOption* optptr(const t_config_option_key &opt_key) const override \ + { return s_cache_##CLASS_NAME.optptr(opt_key, this); } \ + /* Overrides ConfigBase::optptr(). Find ando/or create a ConfigOption instance for a given name. */ \ ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) override \ { return s_cache_##CLASS_NAME.optptr(opt_key, this); } \ /* Overrides ConfigBase::keys(). Collect names of all configuration values maintained by this configuration store. */ \ @@ -486,6 +516,7 @@ class PrintRegionConfig : public StaticPrintConfig public: ConfigOptionFloat bridge_angle; ConfigOptionInt bottom_solid_layers; + ConfigOptionFloat bottom_solid_min_thickness; ConfigOptionFloat bridge_flow_ratio; ConfigOptionFloat bridge_speed; ConfigOptionBool ensure_vertical_shell_thickness; @@ -504,6 +535,12 @@ public: ConfigOptionInt infill_every_layers; ConfigOptionFloatOrPercent infill_overlap; ConfigOptionFloat infill_speed; + // Ironing options + ConfigOptionBool ironing; + ConfigOptionEnum ironing_type; + ConfigOptionPercent ironing_flowrate; + ConfigOptionFloat ironing_spacing; + ConfigOptionFloat ironing_speed; // Detect bridging perimeters ConfigOptionBool overhangs; ConfigOptionInt perimeter_extruder; @@ -521,6 +558,7 @@ public: ConfigOptionBool thin_walls; ConfigOptionFloatOrPercent top_infill_extrusion_width; ConfigOptionInt top_solid_layers; + ConfigOptionFloat top_solid_min_thickness; ConfigOptionFloatOrPercent top_solid_infill_speed; ConfigOptionBool wipe_into_infill; @@ -529,6 +567,7 @@ protected: { OPT_PTR(bridge_angle); OPT_PTR(bottom_solid_layers); + OPT_PTR(bottom_solid_min_thickness); OPT_PTR(bridge_flow_ratio); OPT_PTR(bridge_speed); OPT_PTR(ensure_vertical_shell_thickness); @@ -547,6 +586,11 @@ protected: 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); @@ -562,6 +606,7 @@ protected: OPT_PTR(top_infill_extrusion_width); OPT_PTR(top_solid_infill_speed); OPT_PTR(top_solid_layers); + OPT_PTR(top_solid_min_thickness); OPT_PTR(wipe_into_infill); } }; @@ -570,6 +615,8 @@ class MachineEnvelopeConfig : public StaticPrintConfig { STATIC_PRINT_CONFIG_CACHE(MachineEnvelopeConfig) public: + // Allowing the machine limits to be completely ignored or used just for time estimator. + ConfigOptionEnum machine_limits_usage; // M201 X... Y... Z... E... [mm/sec^2] ConfigOptionFloats machine_max_acceleration_x; ConfigOptionFloats machine_max_acceleration_y; @@ -597,6 +644,7 @@ public: protected: void initialize(StaticCacheBase &cache, const char *base_ptr) { + OPT_PTR(machine_limits_usage); OPT_PTR(machine_max_acceleration_x); OPT_PTR(machine_max_acceleration_y); OPT_PTR(machine_max_acceleration_z); @@ -683,6 +731,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 { @@ -756,6 +807,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); } }; @@ -765,8 +819,6 @@ 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; ConfigOptionPoints bed_shape; @@ -816,6 +868,7 @@ public: ConfigOptionBools retract_layer_change; ConfigOptionFloat skirt_distance; ConfigOptionInt skirt_height; + ConfigOptionBool draft_shield; ConfigOptionInt skirts; ConfigOptionInts slowdown_below_layer_time; ConfigOptionBool spiral_vase; @@ -888,6 +941,7 @@ protected: OPT_PTR(retract_layer_change); OPT_PTR(skirt_distance); OPT_PTR(skirt_height); + OPT_PTR(draft_shield); OPT_PTR(skirts); OPT_PTR(slowdown_below_layer_time); OPT_PTR(spiral_vase); @@ -908,38 +962,14 @@ protected: } }; -class HostConfig : public StaticPrintConfig -{ - STATIC_PRINT_CONFIG_CACHE(HostConfig) -public: - ConfigOptionEnum host_type; - ConfigOptionString print_host; - ConfigOptionString printhost_apikey; - ConfigOptionString printhost_cafile; - ConfigOptionString serial_port; - ConfigOptionInt serial_speed; - -protected: - void initialize(StaticCacheBase &cache, const char *base_ptr) - { - OPT_PTR(host_type); - OPT_PTR(print_host); - OPT_PTR(printhost_apikey); - OPT_PTR(printhost_cafile); - OPT_PTR(serial_port); - OPT_PTR(serial_speed); - } -}; - // This object is mapped to Perl as Slic3r::Config::Full. class FullPrintConfig : public PrintObjectConfig, public PrintRegionConfig, - public PrintConfig, - public HostConfig + public PrintConfig { STATIC_PRINT_CONFIG_CACHE_DERIVED(FullPrintConfig) - FullPrintConfig() : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0), HostConfig(0) { initialize_cache(); *this = s_cache_FullPrintConfig.defaults(); } + FullPrintConfig() : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0) { initialize_cache(); *this = s_cache_FullPrintConfig.defaults(); } public: // Validate the FullPrintConfig. Returns an empty string on success, otherwise an error message is returned. @@ -947,13 +977,12 @@ public: protected: // Protected constructor to be called to initialize ConfigCache::m_default. - FullPrintConfig(int) : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0), HostConfig(0) {} + FullPrintConfig(int) : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0) {} void initialize(StaticCacheBase &cache, const char *base_ptr) { this->PrintObjectConfig::initialize(cache, base_ptr); this->PrintRegionConfig::initialize(cache, base_ptr); this->PrintConfig ::initialize(cache, base_ptr); - this->HostConfig ::initialize(cache, base_ptr); } }; @@ -997,6 +1026,13 @@ 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; + // How the pillars are bridged together ConfigOptionEnum support_pillar_connection_mode; @@ -1016,7 +1052,7 @@ public: ConfigOptionFloat support_base_height /*= 1.0*/; // The minimum distance of the pillar base from the model in mm. - ConfigOptionFloat support_base_safety_distance; /*= 1.0*/; + ConfigOptionFloat support_base_safety_distance; /*= 1.0*/ // The default angle for connecting support sticks and junctions. ConfigOptionFloat support_critical_angle /*= 45*/; @@ -1061,7 +1097,7 @@ public: // ///////////////////////////////////////////////////////////////////////// // Zero elevation mode parameters: - // - The object pad will be derived from the the model geometry. + // - The object pad will be derived from the model geometry. // - There will be a gap between the object pad and the generated pad // according to the support_base_safety_distance parameter. // - The two pads will be connected with tiny connector sticks @@ -1083,6 +1119,28 @@ public: // How much should the tiny connectors penetrate into the model body ConfigOptionFloat pad_object_connector_penetration; + + // ///////////////////////////////////////////////////////////////////////// + // Model hollowing parameters: + // - Models can be hollowed out as part of the SLA print process + // - Thickness of the hollowed model walls can be adjusted + // - + // - Additional holes will be drilled into the hollow model to allow for + // - resin removal. + // ///////////////////////////////////////////////////////////////////////// + + ConfigOptionBool hollowing_enable; + + // The minimum thickness of the model walls to maintain. Note that the + // resulting walls may be thicker due to smoothing out fine cavities where + // resin could stuck. + ConfigOptionFloat hollowing_min_thickness; + + // Indirectly controls the voxel size (resolution) used by openvdb + ConfigOptionFloat hollowing_quality; + + // Indirectly controls the minimum size of created cavities. + ConfigOptionFloat hollowing_closing_distance; protected: void initialize(StaticCacheBase &cache, const char *base_ptr) @@ -1095,6 +1153,8 @@ 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); OPT_PTR(support_pillar_widening_factor); @@ -1120,6 +1180,10 @@ protected: OPT_PTR(pad_object_connector_stride); OPT_PTR(pad_object_connector_width); OPT_PTR(pad_object_connector_penetration); + OPT_PTR(hollowing_enable); + OPT_PTR(hollowing_min_thickness); + OPT_PTR(hollowing_quality); + OPT_PTR(hollowing_closing_distance); } }; @@ -1165,6 +1229,8 @@ public: ConfigOptionBool display_mirror_y; ConfigOptionFloats relative_correction; ConfigOptionFloat absolute_correction; + ConfigOptionFloat elefant_foot_compensation; + ConfigOptionFloat elefant_foot_min_width; ConfigOptionFloat gamma_correction; ConfigOptionFloat fast_tilt_time; ConfigOptionFloat slow_tilt_time; @@ -1188,6 +1254,8 @@ protected: OPT_PTR(display_orientation); OPT_PTR(relative_correction); OPT_PTR(absolute_correction); + OPT_PTR(elefant_foot_compensation); + OPT_PTR(elefant_foot_min_width); OPT_PTR(gamma_correction); OPT_PTR(fast_tilt_time); OPT_PTR(slow_tilt_time); @@ -1285,6 +1353,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 + 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 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 c4ca46a8c5..db654bb340 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -1,13 +1,19 @@ +#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 "AABBTreeIndirect.hpp" +#include "Fill/FillAdaptive.hpp" +#include "Format/STL.hpp" #include #include @@ -40,52 +46,54 @@ namespace Slic3r { -PrintObject::PrintObject(Print* print, ModelObject* model_object, bool add_instances) : +// Constructor is called from the main thread, therefore all Model / ModelObject / ModelIntance data are valid. +PrintObject::PrintObject(Print* print, ModelObject* model_object, const Transform3d& trafo, PrintInstances&& instances) : PrintObjectBaseWithState(print, model_object), - typed_slices(false), - size(Vec3crd::Zero()) + m_trafo(trafo) { - // Compute the translation to be applied to our meshes so that we work with smaller coordinates - { - // Translate meshes so that our toolpath generation algorithms work with smaller - // XY coordinates; this translation is an optimization and not strictly required. - // A cloned mesh will be aligned to 0 before slicing in slice_region() since we - // don't assume it's already aligned and we don't alter the original position in model. - // We store the XY translation so that we can place copies correctly in the output G-code - // (copies are expressed in G-code coordinates and this translation is not publicly exposed). - const BoundingBoxf3 modobj_bbox = model_object->raw_bounding_box(); - m_copies_shift = Point::new_scale(modobj_bbox.min(0), modobj_bbox.min(1)); - // Scale the object size and store it - this->size = (modobj_bbox.size() * (1. / SCALING_FACTOR)).cast(); - } - - if (add_instances) { - Points copies; - copies.reserve(m_model_object->instances.size()); - for (const ModelInstance *mi : m_model_object->instances) { - assert(mi->is_printable()); - const Vec3d& offset = mi->get_offset(); - copies.emplace_back(Point::new_scale(offset(0), offset(1))); - } - this->set_copies(copies); - } + // Compute centering offet to be applied to our meshes so that we work with smaller coordinates + // requiring less bits to represent Clipper coordinates. + + // Snug bounding box of a rotated and scaled object by the 1st instantion, without the instance translation applied. + // All the instances share the transformation matrix with the exception of translation in XY and rotation by Z, + // therefore a bounding box from 1st instance of a ModelObject is good enough for calculating the object center, + // snug height and an approximate bounding box in XY. + BoundingBoxf3 bbox = model_object->raw_bounding_box(); + Vec3d bbox_center = bbox.center(); + // We may need to rotate the bbox / bbox_center from the original instance to the current instance. + double z_diff = Geometry::rotation_diff_z(model_object->instances.front()->get_rotation(), instances.front().model_instance->get_rotation()); + if (std::abs(z_diff) > EPSILON) { + auto z_rot = Eigen::AngleAxisd(z_diff, Vec3d::UnitZ()); + bbox = bbox.transformed(Transform3d(z_rot)); + bbox_center = (z_rot * bbox_center).eval(); + } + + // Center of the transformed mesh (without translation). + m_center_offset = Point::new_scale(bbox_center.x(), bbox_center.y()); + // Size of the transformed mesh. This bounding may not be snug in XY plane, but it is snug in Z. + m_size = (bbox.size() * (1. / SCALING_FACTOR)).cast(); + + this->set_instances(std::move(instances)); } -PrintBase::ApplyStatus PrintObject::set_copies(const Points &points) +PrintBase::ApplyStatus PrintObject::set_instances(PrintInstances &&instances) { - // Order copies with a nearest-neighbor search. - std::vector copies; - copies.reserve(points.size()); - for (const Point &pt : points) - copies.emplace_back(pt + m_copies_shift); + for (PrintInstance &i : instances) + // Add the center offset, which will be subtracted from the mesh when slicing. + i.shift += m_center_offset; // Invalidate and set copies. PrintBase::ApplyStatus status = PrintBase::APPLY_STATUS_UNCHANGED; - if (copies != m_copies) { + bool equal_length = instances.size() == m_instances.size(); + bool equal = equal_length && std::equal(instances.begin(), instances.end(), m_instances.begin(), + [](const PrintInstance& lhs, const PrintInstance& rhs) { return lhs.model_instance == rhs.model_instance && lhs.shift == rhs.shift; }); + if (! equal) { status = PrintBase::APPLY_STATUS_CHANGED; if (m_print->invalidate_steps({ psSkirt, psBrim, psGCodeExport }) || - (copies.size() != m_copies.size() && m_print->invalidate_step(psWipeTower))) + (! equal_length && m_print->invalidate_step(psWipeTower))) status = PrintBase::APPLY_STATUS_INVALIDATED; - m_copies = copies; + m_instances = std::move(instances); + for (PrintInstance &i : m_instances) + i.print_object = this; } return status; } @@ -117,7 +125,7 @@ void PrintObject::slice() BOOST_LOG_TRIVIAL(info) << warning; // Simplify slices if required. if (m_print->config().resolution) - this->_simplify_slices(scale_(this->print()->config().resolution)); + this->simplify_slices(scale_(this->print()->config().resolution)); // Update bounding boxes tbb::parallel_for( tbb::blocked_range(0, m_layers.size()), @@ -125,14 +133,14 @@ void PrintObject::slice() for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) { m_print->throw_if_canceled(); Layer &layer = *m_layers[layer_idx]; - layer.slices_bboxes.clear(); - layer.slices_bboxes.reserve(layer.slices.size()); - for (const ExPolygon &expoly : layer.slices) - layer.slices_bboxes.emplace_back(get_extents(expoly)); + layer.lslices_bboxes.clear(); + layer.lslices_bboxes.reserve(layer.lslices.size()); + for (const ExPolygon &expoly : layer.lslices) + layer.lslices_bboxes.emplace_back(get_extents(expoly)); } }); 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); } @@ -151,12 +159,12 @@ void PrintObject::make_perimeters() BOOST_LOG_TRIVIAL(info) << "Generating perimeters..." << log_memory_info(); // merge slices if they were split into types - if (this->typed_slices) { + if (m_typed_slices) { for (Layer *layer : m_layers) { layer->merge_slices(); m_print->throw_if_canceled(); } - this->typed_slices = false; + m_typed_slices = false; } // compare each layer to the one below, and mark those slices needing @@ -242,13 +250,6 @@ void PrintObject::make_perimeters() m_print->throw_if_canceled(); BOOST_LOG_TRIVIAL(debug) << "Generating perimeters in parallel - end"; - /* - simplify slices (both layer and region slices), - we only need the max resolution for perimeters - ### This makes this method not-idempotent, so we keep it disabled for now. - ###$self->_simplify_slices(&Slic3r::SCALED_RESOLUTION); - */ - this->set_done(posPerimeters); } @@ -373,13 +374,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(0, m_layers.size()), - [this](const tbb::blocked_range& range) { + [this, &adaptive_fill_octree = adaptive_fill_octree, &support_fill_octree = support_fill_octree](const tbb::blocked_range& 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()); } } ); @@ -392,6 +395,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(1, m_layers.size()), + [this](const tbb::blocked_range& 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)) { @@ -406,13 +428,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 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(m_center_offset.x()), - unscale(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> overhangs(this->layers().size()); + tbb::parallel_for( + tbb::blocked_range(0, int(m_layers.size()) - 1), + [this, &to_octree, &overhangs](const tbb::blocked_range &range) { + std::vector &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) @@ -470,8 +533,7 @@ bool PrintObject::invalidate_state_by_config_options(const std::vectorinvalidate_steps({ posPrepareInfill, posInfill }); + invalidated |= this->invalidate_steps({ posPrepareInfill, posInfill, posIroning }); invalidated |= m_print->invalidate_steps({ psSkirt, psBrim }); } else if (step == posPrepareInfill) { - invalidated |= this->invalidate_step(posInfill); + invalidated |= this->invalidate_steps({ posInfill, posIroning }); } else if (step == posInfill) { invalidated |= m_print->invalidate_steps({ psSkirt, psBrim }); } else if (step == posSlice) { - invalidated |= this->invalidate_steps({ posPerimeters, posPrepareInfill, posInfill, posSupportMaterial }); + invalidated |= this->invalidate_steps({ posPerimeters, posPrepareInfill, posInfill, posIroning, posSupportMaterial }); invalidated |= m_print->invalidate_steps({ psSkirt, psBrim }); this->m_slicing_params.valid = false; } else if (step == posSupportMaterial) { @@ -627,6 +691,14 @@ bool PrintObject::has_support_material() const || m_config.support_material_enforce_layers > 0; } +static const PrintRegion* first_printing_region(const PrintObject &print_object) +{ + for (size_t idx_region = 0; idx_region < print_object.region_volumes.size(); ++ idx_region) + if (!print_object.region_volumes.empty()) + return print_object.print()->regions()[idx_region]; + return nullptr; +} + // This function analyzes slices of a region (SurfaceCollection slices). // Each region slice (instance of Surface) is analyzed, whether it is supported or whether it is the top surface. // Initially all slices are of type stInternal. @@ -645,7 +717,9 @@ void PrintObject::detect_surfaces_type() // are completely hidden inside a collective body of intersecting parts. // This is useful if one of the parts is to be dissolved, or if it is transparent and the internal shells // should be visible. - bool interface_shells = m_config.interface_shells.value; + 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(); 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"; @@ -658,10 +732,15 @@ void PrintObject::detect_surfaces_type() // Cache the result of the following parallel_loop. std::vector surfaces_new; if (interface_shells) - surfaces_new.assign(m_layers.size(), Surfaces()); + surfaces_new.assign(num_layers, Surfaces()); tbb::parallel_for( - tbb::blocked_range(0, m_layers.size()), + tbb::blocked_range(0, + spiral_vase ? + // In spiral vase mode, reserve the last layer for the top surface if more than 1 layer is planned for the vase bottom. + ((num_layers > 1) ? num_layers - 1 : num_layers) : + // In non-spiral vase mode, go over all layers. + m_layers.size()), [this, idx_region, interface_shells, &surfaces_new](const tbb::blocked_range& range) { // If we have raft layers, consider bottom layer as a bridge just like any other bottom surface lying on the void. SurfaceType surface_type_bottom_1st = @@ -676,7 +755,7 @@ void PrintObject::detect_surfaces_type() m_print->throw_if_canceled(); // BOOST_LOG_TRIVIAL(trace) << "Detecting solid surfaces for region " << idx_region << " and layer " << layer->print_z; Layer *layer = m_layers[idx_layer]; - LayerRegion *layerm = layer->get_region(idx_region); + LayerRegion *layerm = layer->m_regions[idx_region]; // comparison happens against the *full* slices (considering all regions) // unless internal shells are requested Layer *upper_layer = (idx_layer + 1 < this->layer_count()) ? m_layers[idx_layer + 1] : nullptr; @@ -691,8 +770,8 @@ void PrintObject::detect_surfaces_type() Surfaces top; if (upper_layer) { Polygons upper_slices = interface_shells ? - to_polygons(upper_layer->get_region(idx_region)->slices.surfaces) : - to_polygons(upper_layer->slices); + to_polygons(upper_layer->m_regions[idx_region]->slices.surfaces) : + to_polygons(upper_layer->lslices); surfaces_append(top, //FIXME implement offset2_ex working over ExPolygons, that should be a bit more efficient than calling offset_ex twice. offset_ex(offset_ex(diff_ex(layerm_slices_surfaces, upper_slices, true), -offset), offset), @@ -721,7 +800,7 @@ void PrintObject::detect_surfaces_type() surfaces_append( bottom, offset2_ex( - diff(layerm_slices_surfaces, to_polygons(lower_layer->slices), true), + diff(layerm_slices_surfaces, to_polygons(lower_layer->lslices), true), -offset, offset), surface_type_bottom_other); // if user requested internal shells, we need to identify surfaces @@ -733,8 +812,8 @@ void PrintObject::detect_surfaces_type() bottom, offset2_ex( diff( - intersection(layerm_slices_surfaces, to_polygons(lower_layer->slices)), // supported - to_polygons(lower_layer->get_region(idx_region)->slices.surfaces), + intersection(layerm_slices_surfaces, to_polygons(lower_layer->lslices)), // supported + to_polygons(lower_layer->m_regions[idx_region]->slices.surfaces), true), -offset, offset), stBottom); @@ -802,18 +881,26 @@ void PrintObject::detect_surfaces_type() if (interface_shells) { // Move surfaces_new to layerm->slices.surfaces - for (size_t idx_layer = 0; idx_layer < m_layers.size(); ++ idx_layer) - m_layers[idx_layer]->get_region(idx_region)->slices.surfaces = std::move(surfaces_new[idx_layer]); + for (size_t idx_layer = 0; idx_layer < num_layers; ++ idx_layer) + m_layers[idx_layer]->m_regions[idx_region]->slices.surfaces = std::move(surfaces_new[idx_layer]); + } + + if (spiral_vase) { + if (num_layers > 1) + // Turn the last bottom layer infill to a top infill, so it will be extruded with a proper pattern. + m_layers[num_layers - 1]->m_regions[idx_region]->slices.set_type(stTop); + for (size_t i = num_layers; i < m_layers.size(); ++ i) + m_layers[i]->m_regions[idx_region]->slices.set_type(stInternal); } BOOST_LOG_TRIVIAL(debug) << "Detecting solid surfaces for region " << idx_region << " - clipping in parallel - start"; // Fill in layerm->fill_surfaces by trimming the layerm->slices by the cummulative layerm->fill_surfaces. tbb::parallel_for( tbb::blocked_range(0, m_layers.size()), - [this, idx_region, interface_shells, &surfaces_new](const tbb::blocked_range& range) { + [this, idx_region, interface_shells](const tbb::blocked_range& range) { for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { m_print->throw_if_canceled(); - LayerRegion *layerm = m_layers[idx_layer]->get_region(idx_region); + LayerRegion *layerm = m_layers[idx_layer]->m_regions[idx_region]; layerm->slices_to_fill_surfaces_clipped(); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING layerm->export_region_fill_surfaces_to_svg_debug("1_detect_surfaces_type-final"); @@ -825,7 +912,7 @@ void PrintObject::detect_surfaces_type() } // for each this->print->region_count // Mark the object to have the region slices classified (typed, which also means they are split based on whether they are supported, bridging, top layers etc.) - this->typed_slices = true; + m_typed_slices = true; } void PrintObject::process_external_surfaces() @@ -879,7 +966,7 @@ void PrintObject::process_external_surfaces() // Shrink the holes, let the layer above expand slightly inside the unsupported areas. polygons_append(voids, offset(surface.expolygon, unsupported_width)); } - surfaces_covered[layer_idx] = diff(to_polygons(this->m_layers[layer_idx]->slices), voids); + surfaces_covered[layer_idx] = diff(to_polygons(this->m_layers[layer_idx]->lslices), voids); } } ); @@ -919,18 +1006,33 @@ void PrintObject::discover_vertical_shells() Polygons bottom_surfaces; Polygons holes; }; - std::vector cache_top_botom_regions(m_layers.size(), DiscoverVerticalShellsCacheEntry()); + 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(); + 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) { + auto num_extra_layers = [min_layer_height](int num_solid_layers, coordf_t min_shell_thickness) { + if (num_solid_layers == 0) + return 0; + int n = num_solid_layers - 1; + int n2 = int(ceil(min_shell_thickness / min_layer_height)); + return std::max(n, n2 - 1); + }; + return num_extra_layers(config.top_solid_layers, config.top_solid_min_thickness) + + num_extra_layers(config.bottom_solid_layers, config.bottom_solid_min_thickness) > 0; + }; + std::vector cache_top_botom_regions(num_layers, DiscoverVerticalShellsCacheEntry()); bool top_bottom_surfaces_all_regions = this->region_volumes.size() > 1 && ! m_config.interface_shells.value; if (top_bottom_surfaces_all_regions) { // This is a multi-material print and interface_shells are disabled, meaning that the vertical shell thickness // is calculated over all materials. // Is the "ensure vertical wall thickness" applicable to any region? bool has_extra_layers = false; - for (size_t idx_region = 0; idx_region < this->region_volumes.size(); ++ idx_region) { - const PrintRegion ®ion = *m_print->get_region(idx_region); - if (region.config().ensure_vertical_shell_thickness.value && - (region.config().top_solid_layers.value > 1 || region.config().bottom_solid_layers.value > 1)) { + for (size_t idx_region = 0; idx_region < this->region_volumes.size(); ++idx_region) { + const PrintRegionConfig &config = m_print->get_region(idx_region)->config(); + if (config.ensure_vertical_shell_thickness.value && has_extra_layers_fn(config)) { has_extra_layers = true; + break; } } if (! has_extra_layers) @@ -938,9 +1040,9 @@ void PrintObject::discover_vertical_shells() return; BOOST_LOG_TRIVIAL(debug) << "Discovering vertical shells in parallel - start : cache top / bottom"; //FIXME Improve the heuristics for a grain size. - size_t grain_size = std::max(m_layers.size() / 16, size_t(1)); + size_t grain_size = std::max(num_layers / 16, size_t(1)); tbb::parallel_for( - tbb::blocked_range(0, m_layers.size(), grain_size), + tbb::blocked_range(0, num_layers, grain_size), [this, &cache_top_botom_regions](const tbb::blocked_range& range) { const SurfaceType surfaces_bottom[2] = { stBottom, stBottomBridge }; const size_t num_regions = this->region_volumes.size(); @@ -985,12 +1087,12 @@ void PrintObject::discover_vertical_shells() cache.bottom_surfaces = union_(cache.bottom_surfaces, false); // For a multi-material print, simulate perimeter / infill split as if only a single extruder has been used for the whole print. if (perimeter_offset > 0.) { - // The layer.slices are forced to merge by expanding them first. - polygons_append(cache.holes, offset(offset_ex(layer.slices, 0.3f * perimeter_min_spacing), - perimeter_offset - 0.3f * perimeter_min_spacing)); + // The layer.lslices are forced to merge by expanding them first. + polygons_append(cache.holes, offset(offset_ex(layer.lslices, 0.3f * perimeter_min_spacing), - perimeter_offset - 0.3f * perimeter_min_spacing)); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING { - Slic3r::SVG svg(debug_out_path("discover_vertical_shells-extra-holes-%d.svg", debug_idx), get_extents(layer.slices)); - svg.draw(layer.slices, "blue"); + Slic3r::SVG svg(debug_out_path("discover_vertical_shells-extra-holes-%d.svg", debug_idx), get_extents(layer.lslices)); + svg.draw(layer.lslices, "blue"); svg.draw(union_ex(cache.holes), "red"); svg.draw_outline(union_ex(cache.holes), "black", "blue", scale_(0.05)); svg.Close(); @@ -1011,21 +1113,19 @@ void PrintObject::discover_vertical_shells() if (! region.config().ensure_vertical_shell_thickness.value) // This region will be handled by discover_horizontal_shells(). continue; - int n_extra_top_layers = std::max(0, region.config().top_solid_layers.value - 1); - int n_extra_bottom_layers = std::max(0, region.config().bottom_solid_layers.value - 1); - if (n_extra_top_layers + n_extra_bottom_layers == 0) + if (! has_extra_layers_fn(region.config())) // Zero or 1 layer, there is no additional vertical wall thickness enforced. continue; //FIXME Improve the heuristics for a grain size. - size_t grain_size = std::max(m_layers.size() / 16, size_t(1)); + size_t grain_size = std::max(num_layers / 16, size_t(1)); if (! top_bottom_surfaces_all_regions) { // This is either a single material print, or a multi-material print and interface_shells are enabled, meaning that the vertical shell thickness // is calculated over a single material. BOOST_LOG_TRIVIAL(debug) << "Discovering vertical shells for region " << idx_region << " in parallel - start : cache top / bottom"; tbb::parallel_for( - tbb::blocked_range(0, m_layers.size(), grain_size), + tbb::blocked_range(0, num_layers, grain_size), [this, idx_region, &cache_top_botom_regions](const tbb::blocked_range& range) { const SurfaceType surfaces_bottom[2] = { stBottom, stBottomBridge }; for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { @@ -1053,8 +1153,8 @@ void PrintObject::discover_vertical_shells() BOOST_LOG_TRIVIAL(debug) << "Discovering vertical shells for region " << idx_region << " in parallel - start : ensure vertical wall thickness"; tbb::parallel_for( - tbb::blocked_range(0, m_layers.size(), grain_size), - [this, idx_region, n_extra_top_layers, n_extra_bottom_layers, &cache_top_botom_regions] + tbb::blocked_range(0, num_layers, grain_size), + [this, idx_region, &cache_top_botom_regions] (const tbb::blocked_range& range) { // printf("discover_vertical_shells from %d to %d\n", range.begin(), range.end()); for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { @@ -1065,8 +1165,9 @@ void PrintObject::discover_vertical_shells() ++ debug_idx; #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ - Layer *layer = m_layers[idx_layer]; - LayerRegion *layerm = layer->m_regions[idx_region]; + Layer *layer = m_layers[idx_layer]; + LayerRegion *layerm = layer->m_regions[idx_region]; + const PrintRegionConfig ®ion_config = layerm->region()->config(); #ifdef SLIC3R_DEBUG_SLICE_PROCESSING layerm->export_region_slices_to_svg_debug("4_discover_vertical_shells-initial"); @@ -1106,30 +1207,45 @@ void PrintObject::discover_vertical_shells() } } #endif /* SLIC3R_DEBUG_SLICE_PROCESSING */ - // Reset the top / bottom inflated regions caches of entries, which are out of the moving window. - bool hole_first = true; - for (int n = (int)idx_layer - n_extra_bottom_layers; n <= (int)idx_layer + n_extra_top_layers; ++ n) - if (n >= 0 && n < (int)m_layers.size()) { - const DiscoverVerticalShellsCacheEntry &cache = cache_top_botom_regions[n]; - if (hole_first) { - hole_first = false; - polygons_append(holes, cache.holes); - } - else if (! holes.empty()) { - holes = intersection(holes, cache.holes); - } - size_t n_shell_old = shell.size(); - if (n > int(idx_layer)) - // Collect top surfaces. - polygons_append(shell, cache.top_surfaces); - else if (n < int(idx_layer)) - // Collect bottom and bottom bridge surfaces. - polygons_append(shell, cache.bottom_surfaces); - // Running the union_ using the Clipper library piece by piece is cheaper - // than running the union_ all at once. - if (n_shell_old < shell.size()) - shell = union_(shell, false); - } + polygons_append(holes, cache_top_botom_regions[idx_layer].holes); + if (int n_top_layers = region_config.top_solid_layers.value; n_top_layers > 0) { + // Gather top regions projected to this layer. + coordf_t print_z = layer->print_z; + for (int i = int(idx_layer) + 1; + i < int(cache_top_botom_regions.size()) && + (i < int(idx_layer) + n_top_layers || + m_layers[i]->print_z - print_z < region_config.top_solid_min_thickness - EPSILON); + ++ i) { + const DiscoverVerticalShellsCacheEntry &cache = cache_top_botom_regions[i]; + if (! holes.empty()) + holes = intersection(holes, cache.holes); + if (! cache.top_surfaces.empty()) { + polygons_append(shell, cache.top_surfaces); + // Running the union_ using the Clipper library piece by piece is cheaper + // than running the union_ all at once. + shell = union_(shell, false); + } + } + } + if (int n_bottom_layers = region_config.bottom_solid_layers.value; n_bottom_layers > 0) { + // Gather bottom regions projected to this layer. + coordf_t bottom_z = layer->bottom_z(); + for (int i = int(idx_layer) - 1; + i >= 0 && + (i > int(idx_layer) - n_bottom_layers || + bottom_z - m_layers[i]->bottom_z() < region_config.bottom_solid_min_thickness - EPSILON); + -- i) { + const DiscoverVerticalShellsCacheEntry &cache = cache_top_botom_regions[i]; + if (! holes.empty()) + holes = intersection(holes, cache.holes); + if (! cache.bottom_surfaces.empty()) { + polygons_append(shell, cache.bottom_surfaces); + // Running the union_ using the Clipper library piece by piece is cheaper + // than running the union_ all at once. + shell = union_(shell, false); + } + } + } #ifdef SLIC3R_DEBUG_SLICE_PROCESSING { Slic3r::SVG svg(debug_out_path("discover_vertical_shells-perimeters-before-union-%d.svg", debug_idx), get_extents(shell)); @@ -1363,7 +1479,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 @@ -1428,22 +1544,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(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); @@ -1455,7 +1597,7 @@ void PrintObject::update_slicing_parameters() { if (! m_slicing_params.valid) m_slicing_params = SlicingParameters::create_from_config( - this->print()->config(), m_config, unscale(this->size(2)), this->object_extruders()); + this->print()->config(), m_config, unscale(this->height()), this->object_extruders()); } SlicingParameters PrintObject::slicing_parameters(const DynamicPrintConfig& full_config, const ModelObject& model_object, float object_max_z) @@ -1476,13 +1618,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 &range_and_config : model_object.layer_config_ranges) + for (const std::pair &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); @@ -1509,7 +1651,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(model_object.layer_height_profile.get()); +// layer_height_profile = model_object.layer_height_profile; updated = true; } @@ -1522,9 +1666,9 @@ bool PrintObject::update_layer_height_profile(const ModelObject &model_object, c layer_height_profile.clear(); if (layer_height_profile.empty()) { - //layer_height_profile = layer_height_profile_adaptive(slicing_parameters, model_object.layer_config_ranges, model_object.volumes); - layer_height_profile = layer_height_profile_from_ranges(slicing_parameters, model_object.layer_config_ranges); - updated = true; + //layer_height_profile = layer_height_profile_adaptive(slicing_parameters, model_object.layer_config_ranges, model_object.volumes); + layer_height_profile = layer_height_profile_from_ranges(slicing_parameters, model_object.layer_config_ranges); + updated = true; } return updated; } @@ -1542,13 +1686,7 @@ void PrintObject::_slice(const std::vector &layer_height_profile) { BOOST_LOG_TRIVIAL(info) << "Slicing objects..." << log_memory_info(); - this->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 + m_typed_slices = false; // 1) Initialize layers and their slice heights. std::vector slice_zs; @@ -1609,13 +1747,14 @@ void PrintObject::_slice(const std::vector &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; 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_by_layer = this->slice_region(region_id, slice_zs); + std::vector expolygons_by_layer = this->slice_region(region_id, slice_zs, slicing_mode); 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) @@ -1653,7 +1792,7 @@ void PrintObject::_slice(const std::vector &layer_height_profile) else ranges.emplace_back(volumes_and_ranges[j].first); // slicing in parallel - sliced_volumes.emplace_back(volume_id, (int)region_id, this->slice_volume(slice_zs, ranges, *model_volume)); + sliced_volumes.emplace_back(volume_id, (int)region_id, this->slice_volume(slice_zs, ranges, slicing_mode, *model_volume)); i = j; } else ++ i; @@ -1762,84 +1901,107 @@ end: ; BOOST_LOG_TRIVIAL(debug) << "Slicing objects - make_slices in parallel - begin"; - tbb::parallel_for( - tbb::blocked_range(0, m_layers.size()), - [this, upscaled, clipped](const tbb::blocked_range& range) { - for (size_t layer_id = range.begin(); layer_id < range.end(); ++ layer_id) { - m_print->throw_if_canceled(); - Layer *layer = m_layers[layer_id]; - // Apply size compensation and perform clipping of multi-part objects. - float delta = float(scale_(m_config.xy_size_compensation.value)); - //FIXME only apply the compensation if no raft is enabled. - float elephant_foot_compensation = 0.f; - if (layer_id == 0 && m_config.raft_layers == 0) - // Only enable Elephant foot compensation if printing directly on the print bed. - elephant_foot_compensation = float(scale_(m_config.elefant_foot_compensation.value)); - if (layer->m_regions.size() == 1) { - // Optimized version for a single region layer. - if (layer_id == 0) { - if (delta > elephant_foot_compensation) { - delta -= elephant_foot_compensation; - elephant_foot_compensation = 0.f; - } else if (delta > 0) - elephant_foot_compensation -= delta; - } - if (delta != 0.f || elephant_foot_compensation > 0.f) { - // Single region, growing or shrinking. - LayerRegion *layerm = layer->m_regions.front(); - // Apply the XY compensation. - ExPolygons expolygons = (delta == 0.f) ? - to_expolygons(std::move(layerm->slices.surfaces)) : - offset_ex(to_expolygons(std::move(layerm->slices.surfaces)), delta); - // Apply the elephant foot compensation. - if (elephant_foot_compensation > 0) - expolygons = union_ex(Slic3r::elephant_foot_compensation(expolygons, layerm->flow(frExternalPerimeter), unscale(elephant_foot_compensation))); - layerm->slices.set(std::move(expolygons), stInternal); - } - } else { - bool upscale = ! upscaled && delta > 0.f; - bool clip = ! clipped && m_config.clip_multipart_objects.value; - if (upscale || clip) { - // Multiple regions, growing or just clipping one region by the other. - // When clipping the regions, priority is given to the first regions. - Polygons processed; - for (size_t region_id = 0; region_id < layer->m_regions.size(); ++ region_id) { - LayerRegion *layerm = layer->m_regions[region_id]; - ExPolygons slices = to_expolygons(std::move(layerm->slices.surfaces)); - if (upscale) - slices = offset_ex(std::move(slices), delta); - if (region_id > 0 && clip) - // Trim by the slices of already processed regions. - slices = diff_ex(to_polygons(std::move(slices)), processed); - if (clip && (region_id + 1 < layer->m_regions.size())) - // Collect the already processed regions to trim the to be processed regions. - polygons_append(processed, slices); - layerm->slices.set(std::move(slices), stInternal); - } - } - if (delta < 0.f || elephant_foot_compensation > 0.f) { - // Apply the negative XY compensation. - Polygons trimming; - static const float eps = float(scale_(m_config.slice_closing_radius.value) * 1.5); - if (elephant_foot_compensation > 0.f) { - trimming = to_polygons(Slic3r::elephant_foot_compensation(offset_ex(layer->merged(eps), std::min(delta, 0.f) - eps), - layer->m_regions.front()->flow(frExternalPerimeter), unscale(elephant_foot_compensation))); - } else - trimming = offset(layer->merged(float(SCALED_EPSILON)), delta - float(SCALED_EPSILON)); - for (size_t region_id = 0; region_id < layer->m_regions.size(); ++ region_id) - layer->m_regions[region_id]->trim_surfaces(trimming); - } - } - // Merge all regions' slices to get islands, chain them by a shortest path. - layer->make_slices(); - } - }); + { + // Compensation value, scaled. + const float xy_compensation_scaled = float(scale_(m_config.xy_size_compensation.value)); + const float elephant_foot_compensation_scaled = (m_config.raft_layers == 0) ? + // Only enable Elephant foot compensation if printing directly on the print bed. + float(scale_(m_config.elefant_foot_compensation.value)) : + 0.f; + // Uncompensated slices for the first layer in case the Elephant foot compensation is applied. + ExPolygons lslices_1st_layer; + tbb::parallel_for( + tbb::blocked_range(0, m_layers.size()), + [this, upscaled, clipped, xy_compensation_scaled, elephant_foot_compensation_scaled, &lslices_1st_layer] + (const tbb::blocked_range& range) { + for (size_t layer_id = range.begin(); layer_id < range.end(); ++ layer_id) { + m_print->throw_if_canceled(); + Layer *layer = m_layers[layer_id]; + // Apply size compensation and perform clipping of multi-part objects. + float elfoot = (layer_id == 0) ? elephant_foot_compensation_scaled : 0.f; + if (layer->m_regions.size() == 1) { + assert(! upscaled); + assert(! clipped); + // Optimized version for a single region layer. + // Single region, growing or shrinking. + LayerRegion *layerm = layer->m_regions.front(); + if (elfoot > 0) { + // Apply the elephant foot compensation and store the 1st layer slices without the Elephant foot compensation applied. + lslices_1st_layer = to_expolygons(std::move(layerm->slices.surfaces)); + float delta = xy_compensation_scaled; + if (delta > elfoot) { + delta -= elfoot; + elfoot = 0.f; + } else if (delta > 0) + elfoot -= delta; + layerm->slices.set( + union_ex( + Slic3r::elephant_foot_compensation( + (delta == 0.f) ? lslices_1st_layer : offset_ex(lslices_1st_layer, delta), + layerm->flow(frExternalPerimeter), unscale(elfoot))), + stInternal); + if (xy_compensation_scaled != 0.f) + lslices_1st_layer = offset_ex(std::move(lslices_1st_layer), xy_compensation_scaled); + } else if (xy_compensation_scaled != 0.f) { + // Apply the XY compensation. + layerm->slices.set( + offset_ex(to_expolygons(std::move(layerm->slices.surfaces)), xy_compensation_scaled), + stInternal); + } + } else { + bool upscale = ! upscaled && xy_compensation_scaled > 0.f; + bool clip = ! clipped && m_config.clip_multipart_objects.value; + if (upscale || clip) { + // Multiple regions, growing or just clipping one region by the other. + // When clipping the regions, priority is given to the first regions. + Polygons processed; + for (size_t region_id = 0; region_id < layer->m_regions.size(); ++ region_id) { + LayerRegion *layerm = layer->m_regions[region_id]; + ExPolygons slices = to_expolygons(std::move(layerm->slices.surfaces)); + if (upscale) + slices = offset_ex(std::move(slices), xy_compensation_scaled); + if (region_id > 0 && clip) + // Trim by the slices of already processed regions. + slices = diff_ex(to_polygons(std::move(slices)), processed); + if (clip && (region_id + 1 < layer->m_regions.size())) + // Collect the already processed regions to trim the to be processed regions. + polygons_append(processed, slices); + layerm->slices.set(std::move(slices), stInternal); + } + } + if (xy_compensation_scaled < 0.f || elfoot > 0.f) { + // Apply the negative XY compensation. + Polygons trimming; + static const float eps = float(scale_(m_config.slice_closing_radius.value) * 1.5); + if (elfoot > 0.f) { + lslices_1st_layer = offset_ex(layer->merged(eps), std::min(xy_compensation_scaled, 0.f) - eps); + trimming = to_polygons(Slic3r::elephant_foot_compensation(lslices_1st_layer, + layer->m_regions.front()->flow(frExternalPerimeter), unscale(elfoot))); + } else + trimming = offset(layer->merged(float(SCALED_EPSILON)), xy_compensation_scaled - float(SCALED_EPSILON)); + for (size_t region_id = 0; region_id < layer->m_regions.size(); ++ region_id) + layer->m_regions[region_id]->trim_surfaces(trimming); + } + } + // Merge all regions' slices to get islands, chain them by a shortest path. + layer->make_slices(); + } + }); + if (elephant_foot_compensation_scaled > 0.f) { + // 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); + } + } + m_print->throw_if_canceled(); BOOST_LOG_TRIVIAL(debug) << "Slicing objects - make_slices in parallel - 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 PrintObject::slice_region(size_t region_id, const std::vector &z) const +std::vector PrintObject::slice_region(size_t region_id, const std::vector &z, SlicingMode mode) const { std::vector volumes; if (region_id < this->region_volumes.size()) { @@ -1849,7 +2011,7 @@ std::vector PrintObject::slice_region(size_t region_id, const std::v volumes.emplace_back(volume); } } - return this->slice_volumes(z, volumes); + return this->slice_volumes(z, mode, volumes); } // Z ranges are not applicable to modifier meshes, therefore a sinle volume will be found in volume_and_range at most once. @@ -1899,7 +2061,7 @@ std::vector PrintObject::slice_modifiers(size_t region_id, const std if (volume->is_modifier()) volumes.emplace_back(volume); } - out = this->slice_volumes(slice_zs, volumes); + out = this->slice_volumes(slice_zs, SlicingMode::Regular, volumes); } else { // Some modifier in this region was split to layer spans. std::vector merge; @@ -1917,7 +2079,7 @@ std::vector PrintObject::slice_modifiers(size_t region_id, const std for (; j < volumes_and_ranges.size() && volume_id == volumes_and_ranges[j].second; ++ j) ranges.emplace_back(volumes_and_ranges[j].first); // slicing in parallel - std::vector this_slices = this->slice_volume(slice_zs, ranges, *model_volume); + std::vector this_slices = this->slice_volume(slice_zs, ranges, SlicingMode::Regular, *model_volume); if (out.empty()) { out = std::move(this_slices); merge.assign(out.size(), false); @@ -1956,10 +2118,10 @@ std::vector PrintObject::slice_support_volumes(const ModelVolumeType zs.reserve(this->layers().size()); for (const Layer *l : this->layers()) zs.emplace_back((float)l->slice_z); - return this->slice_volumes(zs, volumes); + return this->slice_volumes(zs, SlicingMode::Regular, volumes); } -std::vector PrintObject::slice_volumes(const std::vector &z, const std::vector &volumes) const +std::vector PrintObject::slice_volumes(const std::vector &z, SlicingMode mode, const std::vector &volumes) const { std::vector layers; if (! volumes.empty()) { @@ -1981,7 +2143,7 @@ std::vector PrintObject::slice_volumes(const std::vector &z, if (mesh.stl.stats.number_of_facets > 0) { mesh.transform(m_trafo, true); // apply XY shift - mesh.translate(- unscale(m_copies_shift(0)), - unscale(m_copies_shift(1)), 0); + mesh.translate(- unscale(m_center_offset.x()), - unscale(m_center_offset.y()), 0); // perform actual slicing const Print *print = this->print(); auto callback = TriangleMeshSlicer::throw_on_cancel_callback_type([print](){print->throw_if_canceled();}); @@ -1989,14 +2151,14 @@ std::vector PrintObject::slice_volumes(const std::vector &z, mesh.require_shared_vertices(); TriangleMeshSlicer mslicer; mslicer.init(&mesh, callback); - mslicer.slice(z, float(m_config.slice_closing_radius.value), &layers, callback); + mslicer.slice(z, mode, float(m_config.slice_closing_radius.value), &layers, callback); m_print->throw_if_canceled(); } } return layers; } -std::vector PrintObject::slice_volume(const std::vector &z, const ModelVolume &volume) const +std::vector PrintObject::slice_volume(const std::vector &z, SlicingMode mode, const ModelVolume &volume) const { std::vector layers; if (! z.empty()) { @@ -2011,7 +2173,7 @@ std::vector PrintObject::slice_volume(const std::vector &z, c if (mesh.stl.stats.number_of_facets > 0) { mesh.transform(m_trafo, true); // apply XY shift - mesh.translate(- unscale(m_copies_shift(0)), - unscale(m_copies_shift(1)), 0); + mesh.translate(- unscale(m_center_offset.x()), - unscale(m_center_offset.y()), 0); // perform actual slicing TriangleMeshSlicer mslicer; const Print *print = this->print(); @@ -2019,7 +2181,7 @@ std::vector PrintObject::slice_volume(const std::vector &z, c // TriangleMeshSlicer needs the shared vertices. mesh.require_shared_vertices(); mslicer.init(&mesh, callback); - mslicer.slice(z, float(m_config.slice_closing_radius.value), &layers, callback); + mslicer.slice(z, mode, float(m_config.slice_closing_radius.value), &layers, callback); m_print->throw_if_canceled(); } } @@ -2027,13 +2189,13 @@ std::vector PrintObject::slice_volume(const std::vector &z, c } // 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. -std::vector PrintObject::slice_volume(const std::vector &z, const std::vector &ranges, const ModelVolume &volume) const +std::vector PrintObject::slice_volume(const std::vector &z, const std::vector &ranges, SlicingMode mode, const ModelVolume &volume) const { std::vector out; if (! z.empty() && ! ranges.empty()) { if (ranges.size() == 1 && z.front() >= ranges.front().first && z.back() < ranges.front().second) { // All layers fit into a single range. - out = this->slice_volume(z, volume); + out = this->slice_volume(z, mode, volume); } else { std::vector z_filtered; std::vector> n_filtered; @@ -2049,7 +2211,7 @@ std::vector PrintObject::slice_volume(const std::vector &z, c n_filtered.emplace_back(std::make_pair(first, i)); } if (! n_filtered.empty()) { - std::vector layers = this->slice_volume(z_filtered, volume); + std::vector layers = this->slice_volume(z_filtered, mode, volume); out.assign(z.size(), ExPolygons()); i = 0; for (const std::pair &span : n_filtered) @@ -2131,7 +2293,7 @@ std::string PrintObject::_fix_slicing_errors() BOOST_LOG_TRIVIAL(debug) << "Slicing objects - fixing slicing errors in parallel - end"; // remove empty layers from bottom - while (! m_layers.empty() && m_layers.front()->slices.empty()) { + while (! m_layers.empty() && (m_layers.front()->lslices.empty() || m_layers.front()->empty())) { delete m_layers.front(); m_layers.erase(m_layers.begin()); m_layers.front()->lower_layer = nullptr; @@ -2147,7 +2309,7 @@ std::string PrintObject::_fix_slicing_errors() // Simplify the sliced model, if "resolution" configuration parameter > 0. // The simplification is problematic, because it simplifies the slices independent from each other, // which makes the simplified discretization visible on the object surface. -void PrintObject::_simplify_slices(double distance) +void PrintObject::simplify_slices(double distance) { BOOST_LOG_TRIVIAL(debug) << "Slicing objects - siplifying slices in parallel - begin"; tbb::parallel_for( @@ -2160,9 +2322,9 @@ void PrintObject::_simplify_slices(double distance) layer->m_regions[region_idx]->slices.simplify(distance); { ExPolygons simplified; - for (const ExPolygon& expoly : layer->slices) + for (const ExPolygon &expoly : layer->lslices) expoly.simplify(distance, &simplified); - layer->slices = std::move(simplified); + layer->lslices = std::move(simplified); } } }); @@ -2194,7 +2356,7 @@ void PrintObject::clip_fill_surfaces() // Detect things that we need to support. // Cummulative slices. Polygons slices; - polygons_append(slices, layer->slices); + polygons_append(slices, layer->lslices); // Cummulative fill surfaces. Polygons fill_surfaces; // Solid surfaces to be supported. @@ -2262,7 +2424,8 @@ void PrintObject::discover_horizontal_shells() for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) { for (size_t i = 0; i < m_layers.size(); ++ i) { m_print->throw_if_canceled(); - LayerRegion *layerm = m_layers[i]->regions()[region_id]; + Layer *layer = m_layers[i]; + LayerRegion *layerm = layer->regions()[region_id]; const PrintRegionConfig ®ion_config = layerm->region()->config(); if (region_config.solid_infill_every_layers.value > 0 && region_config.fill_density.value > 0 && (i % region_config.solid_infill_every_layers) == 0) { @@ -2277,9 +2440,14 @@ void PrintObject::discover_horizontal_shells() if (region_config.ensure_vertical_shell_thickness.value) continue; + coordf_t print_z = layer->print_z; + coordf_t bottom_z = layer->bottom_z(); for (size_t idx_surface_type = 0; idx_surface_type < 3; ++ idx_surface_type) { m_print->throw_if_canceled(); SurfaceType type = (idx_surface_type == 0) ? stTop : (idx_surface_type == 1) ? stBottom : stBottomBridge; + int num_solid_layers = (type == stTop) ? region_config.top_solid_layers.value : region_config.bottom_solid_layers.value; + if (num_solid_layers == 0) + continue; // Find slices of current type for current layer. // Use slices instead of fill_surfaces, because they also include the perimeter area, // which needs to be propagated in shells; we need to grow slices like we did for @@ -2305,10 +2473,15 @@ void PrintObject::discover_horizontal_shells() continue; // Slic3r::debugf "Layer %d has %s surfaces\n", $i, ($type == stTop) ? 'top' : 'bottom'; - size_t solid_layers = (type == stTop) ? region_config.top_solid_layers.value : region_config.bottom_solid_layers.value; - for (int n = (type == stTop) ? i-1 : i+1; std::abs(n - (int)i) < solid_layers; (type == stTop) ? -- n : ++ n) { - if (n < 0 || n >= int(m_layers.size())) - continue; + // Scatter top / bottom regions to other layers. Scattering process is inherently serial, it is difficult to parallelize without locking. + for (int n = (type == stTop) ? int(i) - 1 : int(i) + 1; + (type == stTop) ? + (n >= 0 && (int(i) - n < num_solid_layers || + print_z - m_layers[n]->print_z < region_config.top_solid_min_thickness.value - EPSILON)) : + (n < int(m_layers.size()) && (n - int(i) < num_solid_layers || + m_layers[n]->bottom_z() - bottom_z < region_config.bottom_solid_min_thickness.value - EPSILON)); + (type == stTop) ? -- n : ++ n) + { // Slic3r::debugf " looking for neighbors on layer %d...\n", $n; // Reference to the lower layer of a TOP surface, or an upper layer of a BOTTOM surface. LayerRegion *neighbor_layerm = m_layers[n]->regions()[region_id]; @@ -2396,7 +2569,8 @@ void PrintObject::discover_horizontal_shells() // is grown, and that little space is an internal solid shell so // it triggers this too_narrow logic.) internal)); - solid = new_internal_solid; + // see https://github.com/prusa3d/PrusaSlicer/pull/3426 + // solid = new_internal_solid; } } @@ -2526,6 +2700,7 @@ void PrintObject::combine_infill() // Because fill areas for rectilinear and honeycomb are grown // later to overlap perimeters, we need to counteract that too. ((region->config().fill_pattern == ipRectilinear || + region->config().fill_pattern == ipMonotonic || region->config().fill_pattern == ipGrid || region->config().fill_pattern == ipLine || region->config().fill_pattern == ipHoneycomb) ? 1.5f : 0.5f) * @@ -2561,4 +2736,196 @@ void PrintObject::_generate_support_material() support_material.generate(*this); } + +void PrintObject::project_and_append_custom_facets( + bool seam, EnforcerBlockerType type, std::vector& 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(); + const Transform3f& tr2 = this->trafo().cast(); + 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 polygons; + }; + + // Vector to collect resulting projections from each triangle. + std::vector projections_of_triangles(custom_facets.indices.size()); + + // Iterate over all triangles. + tbb::parallel_for( + tbb::blocked_range(0, custom_facets.indices.size()), + [&](const tbb::blocked_range& range) { + for (size_t idx = range.begin(); idx < range.end(); ++ idx) { + + std::array 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 trianglef; + for (int i=0; i<3; ++i) { + trianglef[i] = Vec2f(facet[i].x(), facet[i].y()); + trianglef[i] -= Vec2f(unscale(this->center_offset().x()), + unscale(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(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(std::as_const(*this).get_layer_at_printz(print_z, epsilon)); } + } // namespace Slic3r diff --git a/src/libslic3r/PrintRegion.cpp b/src/libslic3r/PrintRegion.cpp index b3ac6a4a5b..2a75cd621d 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 0000000000..917f718e98 --- /dev/null +++ b/src/libslic3r/SLA/AGGRaster.hpp @@ -0,0 +1,223 @@ +#ifndef AGGRASTER_HPP +#define AGGRASTER_HPP + +#include +#include "libslic3r/ExPolygon.hpp" +#include "libslic3r/MTUtils.hpp" +#include + +// For rasterizing +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +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 struct Colors { + static const Color White; + static const Color Black; +}; + +template const Color Colors::White = Color{255}; +template const Color Colors::Black = Color{0}; + +template*/> 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 m_buf; + agg::rendering_buffer m_rbuf; + + PixelRenderer m_pixrenderer; + + agg::renderer_base m_raw_renderer; + Renderer> 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 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 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 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 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 + 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(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; + +class RasterGrayscaleAA : public _RasterGrayscaleAA { + using Base = _RasterGrayscaleAA; + using typename Base::TColor; + using typename Base::TValue; +public: + template + RasterGrayscaleAA(const RasterBase::Resolution &res, + const RasterBase::PixelDim & pd, + const RasterBase::Trafo & trafo, + GammaFn && fn) + : Base(res, pd, trafo, Colors::White, Colors::Black, + std::forward(fn)) + {} + + uint8_t read_pixel(size_t col, size_t row) const + { + static_assert(std::is_same::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::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/SLABoostAdapter.hpp b/src/libslic3r/SLA/BoostAdapter.hpp similarity index 96% rename from src/libslic3r/SLA/SLABoostAdapter.hpp rename to src/libslic3r/SLA/BoostAdapter.hpp index 1e9daf4613..13e0465b14 100644 --- a/src/libslic3r/SLA/SLABoostAdapter.hpp +++ b/src/libslic3r/SLA/BoostAdapter.hpp @@ -1,7 +1,9 @@ -#ifndef SLABOOSTADAPTER_HPP -#define SLABOOSTADAPTER_HPP +#ifndef SLA_BOOSTADAPTER_HPP +#define SLA_BOOSTADAPTER_HPP + +#include +#include -#include "SLA/SLABoilerPlate.hpp" #include namespace boost { diff --git a/src/libslic3r/SLA/Clustering.cpp b/src/libslic3r/SLA/Clustering.cpp new file mode 100644 index 0000000000..41ff1d4f09 --- /dev/null +++ b/src/libslic3r/SLA/Clustering.cpp @@ -0,0 +1,152 @@ +#include "Clustering.hpp" +#include "boost/geometry/index/rtree.hpp" + +#include +#include + +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( + const Index3D &, const PointIndexEl &)> qfn) +{ + using Elems = std::vector; + + // Recursive function for visiting all the points in a given distance to + // each other + std::function group = + [&sindex, &group, max_points, qfn](Elems& pts, Elems& cluster) + { + for(auto& p : pts) { + std::vector 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 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 distance_queryfn(const Index3D& sindex, + const PointIndexEl& p, + double dist, + unsigned max_points) +{ + std::vector 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& indices, + std::function 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& indices, + std::function pointfn, + std::function 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 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 new file mode 100644 index 0000000000..269ec28822 --- /dev/null +++ b/src/libslic3r/SLA/Clustering.hpp @@ -0,0 +1,82 @@ +#ifndef SLA_CLUSTERING_HPP +#define SLA_CLUSTERING_HPP + +#include + +#include +#include + +namespace Slic3r { namespace sla { + +using ClusterEl = std::vector; +using ClusteredPoints = std::vector; + +// Clustering a set of points by the given distance. +ClusteredPoints cluster(const std::vector& indices, + std::function pointfn, + double dist, + unsigned max_points); + +ClusteredPoints cluster(const Eigen::MatrixXd& points, + double dist, + unsigned max_points); + +ClusteredPoints cluster( + const std::vector& indices, + std::function pointfn, + std::function predicate, + unsigned max_points); + +// This function returns the position of the centroid in the input 'clust' +// vector of point indices. +template +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 sel(clust.size(), false); // create full zero bitmask + std::fill(sel.end() - 2, sel.end(), true); // insert the two ones + std::vector avgs(clust.size(), 0.0); // store the average distances + + do { + std::array 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/ConcaveHull.cpp b/src/libslic3r/SLA/ConcaveHull.cpp index dff0617216..d3c0d10224 100644 --- a/src/libslic3r/SLA/ConcaveHull.cpp +++ b/src/libslic3r/SLA/ConcaveHull.cpp @@ -1,7 +1,9 @@ -#include "ConcaveHull.hpp" +#include +#include + #include #include -#include "SLASpatIndex.hpp" + #include namespace Slic3r { @@ -40,9 +42,9 @@ Point ConcaveHull::centroid(const Points &pp) // As it shows, the current offset_ex in ClipperUtils hangs if used in jtRound // mode -ClipperLib::Paths fast_offset(const ClipperLib::Paths &paths, - coord_t delta, - ClipperLib::JoinType jointype) +static ClipperLib::Paths fast_offset(const ClipperLib::Paths &paths, + coord_t delta, + ClipperLib::JoinType jointype) { using ClipperLib::ClipperOffset; using ClipperLib::etClosedPolygon; @@ -73,7 +75,7 @@ Points ConcaveHull::calculate_centroids() const Points centroids = reserve_vector(m_polys.size()); std::transform(m_polys.begin(), m_polys.end(), std::back_inserter(centroids), - [this](const Polygon &poly) { return centroid(poly); }); + [](const Polygon &poly) { return centroid(poly); }); return centroids; } diff --git a/src/libslic3r/SLA/ConcaveHull.hpp b/src/libslic3r/SLA/ConcaveHull.hpp index 94e16d77cc..dccdafd18c 100644 --- a/src/libslic3r/SLA/ConcaveHull.hpp +++ b/src/libslic3r/SLA/ConcaveHull.hpp @@ -1,5 +1,5 @@ -#ifndef CONCAVEHULL_HPP -#define CONCAVEHULL_HPP +#ifndef SLA_CONCAVEHULL_HPP +#define SLA_CONCAVEHULL_HPP #include diff --git a/src/libslic3r/SLA/Concurrency.hpp b/src/libslic3r/SLA/Concurrency.hpp new file mode 100644 index 0000000000..300024c76d --- /dev/null +++ b/src/libslic3r/SLA/Concurrency.hpp @@ -0,0 +1,144 @@ +#ifndef SLA_CONCURRENCY_H +#define SLA_CONCURRENCY_H + +#include +#include +#include +#include + +#include +#include + +#include + +namespace Slic3r { +namespace sla { + +// Set this to true to enable full parallelism in this module. +// Only the well tested parts will be concurrent if this is set to false. +const constexpr bool USE_FULL_CONCURRENCY = true; + +template struct _ccr {}; + +template<> struct _ccr +{ + using SpinningMutex = tbb::spin_mutex; + using BlockingMutex = tbb::mutex; + + template + static IteratorOnly loop_(const tbb::blocked_range &range, Fn &&fn) + { + for (auto &el : range) fn(el); + } + + template + static IntegerOnly loop_(const tbb::blocked_range &range, Fn &&fn) + { + for (I i = range.begin(); i < range.end(); ++i) fn(i); + } + + template + static void for_each(It from, It to, Fn &&fn, size_t granularity = 1) + { + tbb::parallel_for(tbb::blocked_range{from, to, granularity}, + [&fn, from](const auto &range) { + loop_(range, std::forward(fn)); + }); + } + + template + 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)); + } + + template + static IteratorOnly reduce(I from, + I to, + const T & init, + MergeFn &&mergefn, + size_t granularity = 1) + { + return reduce( + from, to, init, std::forward(mergefn), + [](typename I::value_type &i) { return i; }, granularity); + } +}; + +template<> struct _ccr +{ +private: + struct _Mtx { inline void lock() {} inline void unlock() {} }; + +public: + using SpinningMutex = _Mtx; + using BlockingMutex = _Mtx; + + template + static IteratorOnly loop_(It from, It to, Fn &&fn) + { + for (auto it = from; it != to; ++it) fn(*it); + } + + template + static IntegerOnly loop_(I from, I to, Fn &&fn) + { + for (I i = from; i < to; ++i) fn(i); + } + + template + static void for_each(It from, + It to, + Fn &&fn, + size_t /* ignore granularity */ = 1) + { + loop_(from, to, std::forward(fn)); + } + + template + 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 + static IteratorOnly reduce(I from, + I to, + const T &init, + MergeFn &&mergefn, + size_t /*granularity*/ = 1 + ) + { + return reduce(from, to, init, std::forward(mergefn), + [](typename I::value_type &i) { return i; }); + } +}; + +using ccr = _ccr; +using ccr_seq = _ccr; +using ccr_par = _ccr; + +}} // namespace Slic3r::sla + +#endif // SLACONCURRENCY_H diff --git a/src/libslic3r/SLA/Contour3D.cpp b/src/libslic3r/SLA/Contour3D.cpp new file mode 100644 index 0000000000..96d10af208 --- /dev/null +++ b/src/libslic3r/SLA/Contour3D.cpp @@ -0,0 +1,149 @@ +#include +#include + +#include + +namespace Slic3r { namespace sla { + +Contour3D::Contour3D(const TriangleMesh &trmesh) +{ + points.reserve(trmesh.its.vertices.size()); + faces3.reserve(trmesh.its.indices.size()); + + for (auto &v : trmesh.its.vertices) + points.emplace_back(v.cast()); + + std::copy(trmesh.its.indices.begin(), trmesh.its.indices.end(), + std::back_inserter(faces3)); +} + +Contour3D::Contour3D(TriangleMesh &&trmesh) +{ + points.reserve(trmesh.its.vertices.size()); + + for (auto &v : trmesh.its.vertices) + points.emplace_back(v.cast()); + + faces3.swap(trmesh.its.indices); +} + +Contour3D::Contour3D(const IndexedMesh &emesh) { + points.reserve(emesh.vertices().size()); + faces3.reserve(emesh.indices().size()); + + for (const Vec3f& vert : emesh.vertices()) + points.emplace_back(vert.cast()); + + for (const auto& ind : emesh.indices()) + faces3.emplace_back(ind); +} + +Contour3D &Contour3D::merge(const Contour3D &ctr) +{ + auto N = coord_t(points.size()); + auto N_f3 = faces3.size(); + auto N_f4 = faces4.size(); + + points.insert(points.end(), ctr.points.begin(), ctr.points.end()); + faces3.insert(faces3.end(), ctr.faces3.begin(), ctr.faces3.end()); + faces4.insert(faces4.end(), ctr.faces4.begin(), ctr.faces4.end()); + + for(size_t n = N_f3; n < faces3.size(); n++) { + auto& idx = faces3[n]; idx.x() += N; idx.y() += N; idx.z() += N; + } + + for(size_t n = N_f4; n < faces4.size(); n++) { + auto& idx = faces4[n]; for (int k = 0; k < 4; k++) idx(k) += N; + } + + return *this; +} + +Contour3D &Contour3D::merge(const Pointf3s &triangles) +{ + const size_t offs = points.size(); + points.insert(points.end(), triangles.begin(), triangles.end()); + faces3.reserve(faces3.size() + points.size() / 3); + + for(int i = int(offs); i < int(points.size()); i += 3) + faces3.emplace_back(i, i + 1, i + 2); + + return *this; +} + +void Contour3D::to_obj(std::ostream &stream) +{ + for(auto& p : points) + stream << "v " << p.transpose() << "\n"; + + for(auto& f : faces3) + stream << "f " << (f + Vec3i(1, 1, 1)).transpose() << "\n"; + + for(auto& f : faces4) + stream << "f " << (f + Vec4i(1, 1, 1, 1)).transpose() << "\n"; +} + +void Contour3D::from_obj(std::istream &stream) +{ + ObjParser::ObjData data; + ObjParser::objparse(stream, data); + + points.reserve(data.coordinates.size() / 4 + 1); + auto &coords = data.coordinates; + for (size_t i = 0; i < coords.size(); i += 4) + points.emplace_back(coords[i], coords[i + 1], coords[i + 2]); + + Vec3i triangle; + Vec4i quad; + size_t v = 0; + while(v < data.vertices.size()) { + size_t N = 0; + size_t i = v; + while (data.vertices[v++].coordIdx != -1) ++N; + + std::function setfn; + if (N < 3 || N > 4) continue; + else if (N == 3) setfn = [&triangle](int k, int f) { triangle(k) = f; }; + else setfn = [&quad](int k, int f) { quad(k) = f; }; + + for (size_t j = 0; j < N; ++j) + setfn(int(j), data.vertices[i + j].coordIdx); + } +} + +TriangleMesh to_triangle_mesh(const Contour3D &ctour) { + if (ctour.faces4.empty()) return {ctour.points, ctour.faces3}; + + std::vector triangles; + + triangles.reserve(ctour.faces3.size() + 2 * ctour.faces4.size()); + std::copy(ctour.faces3.begin(), ctour.faces3.end(), + std::back_inserter(triangles)); + + for (auto &quad : ctour.faces4) { + triangles.emplace_back(quad(0), quad(1), quad(2)); + triangles.emplace_back(quad(2), quad(3), quad(0)); + } + + return {ctour.points, std::move(triangles)}; +} + +TriangleMesh to_triangle_mesh(Contour3D &&ctour) { + if (ctour.faces4.empty()) + return {std::move(ctour.points), std::move(ctour.faces3)}; + + std::vector triangles; + + triangles.reserve(ctour.faces3.size() + 2 * ctour.faces4.size()); + std::copy(ctour.faces3.begin(), ctour.faces3.end(), + std::back_inserter(triangles)); + + for (auto &quad : ctour.faces4) { + triangles.emplace_back(quad(0), quad(1), quad(2)); + triangles.emplace_back(quad(2), quad(3), quad(0)); + } + + return {std::move(ctour.points), std::move(triangles)}; +} + +}} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/Contour3D.hpp b/src/libslic3r/SLA/Contour3D.hpp new file mode 100644 index 0000000000..3380cd6ab0 --- /dev/null +++ b/src/libslic3r/SLA/Contour3D.hpp @@ -0,0 +1,48 @@ +#ifndef SLA_CONTOUR3D_HPP +#define SLA_CONTOUR3D_HPP + +#include + +namespace Slic3r { + +// Used for quads (TODO: remove this, and convert quads to triangles in OpenVDBUtils) +using Vec4i = Eigen::Matrix; + +namespace sla { + +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. +struct Contour3D { + std::vector points; + std::vector faces3; + std::vector faces4; + + Contour3D() = default; + Contour3D(const TriangleMesh &trmesh); + Contour3D(TriangleMesh &&trmesh); + Contour3D(const IndexedMesh &emesh); + + Contour3D& merge(const Contour3D& ctr); + Contour3D& merge(const Pointf3s& triangles); + + // Write the index triangle structure to OBJ file for debugging purposes. + void to_obj(std::ostream& stream); + void from_obj(std::istream &stream); + + inline bool empty() const + { + return points.empty() || (faces4.empty() && faces3.empty()); + } +}; + +/// Mesh from an existing contour. +TriangleMesh to_triangle_mesh(const Contour3D& ctour); + +/// Mesh from an evaporating 3D contour +TriangleMesh to_triangle_mesh(Contour3D&& ctour); + +}} // namespace Slic3r::sla + +#endif // CONTOUR3D_HPP diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp new file mode 100644 index 0000000000..6df752fd36 --- /dev/null +++ b/src/libslic3r/SLA/Hollowing.cpp @@ -0,0 +1,285 @@ +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +//! macro used to mark string used at localization, +//! return same string +#define L(s) Slic3r::I18N::translate(s) + +namespace Slic3r { +namespace sla { + +template> +inline void _scale(S s, TriangleMesh &m) { m.scale(float(s)); } + +template> +inline void _scale(S s, Contour3D &m) { for (auto &p : m.points) p *= s; } + +static TriangleMesh _generate_interior(const TriangleMesh &mesh, + const JobController &ctl, + double min_thickness, + double voxel_scale, + double closing_dist) +{ + TriangleMesh imesh{mesh}; + + _scale(voxel_scale, imesh); + + double offset = voxel_scale * min_thickness; + double D = voxel_scale * closing_dist; + float out_range = 0.1f * float(offset); + float in_range = 1.1f * float(offset + D); + + if (ctl.stopcondition()) return {}; + else ctl.statuscb(0, L("Hollowing")); + + auto gridptr = mesh_to_grid(imesh, {}, out_range, in_range); + + assert(gridptr); + + if (!gridptr) { + BOOST_LOG_TRIVIAL(error) << "Returned OpenVDB grid is NULL"; + return {}; + } + + if (ctl.stopcondition()) return {}; + else ctl.statuscb(30, L("Hollowing")); + + if (closing_dist > .0) { + gridptr = redistance_grid(*gridptr, -(offset + D), double(in_range)); + } else { + D = -offset; + } + + if (ctl.stopcondition()) return {}; + else ctl.statuscb(70, L("Hollowing")); + + double iso_surface = D; + double adaptivity = 0.; + auto omesh = grid_to_mesh(*gridptr, iso_surface, adaptivity); + + _scale(1. / voxel_scale, omesh); + + if (ctl.stopcondition()) return {}; + else ctl.statuscb(100, L("Hollowing")); + + return omesh; +} + +std::unique_ptr generate_interior(const TriangleMesh & mesh, + const HollowingConfig &hc, + const JobController & ctl) +{ + static const double MIN_OVERSAMPL = 3.; + static const double MAX_OVERSAMPL = 8.; + + // I can't figure out how to increase the grid resolution through openvdb + // API so the model will be scaled up before conversion and the result + // scaled down. Voxels have a unit size. If I set voxelSize smaller, it + // scales the whole geometry down, and doesn't increase the number of + // voxels. + // + // max 8x upscale, min is native voxel size + auto voxel_scale = MIN_OVERSAMPL + (MAX_OVERSAMPL - MIN_OVERSAMPL) * hc.quality; + auto meshptr = std::make_unique( + _generate_interior(mesh, ctl, hc.min_thickness, voxel_scale, + hc.closing_distance)); + + if (meshptr && !meshptr->empty()) { + + // This flips the normals to be outward facing... + meshptr->require_shared_vertices(); + indexed_triangle_set its = std::move(meshptr->its); + + Slic3r::simplify_mesh(its); + + // flip normals back... + for (stl_triangle_vertex_indices &ind : its.indices) + std::swap(ind(0), ind(2)); + + *meshptr = Slic3r::TriangleMesh{its}; + } + + return meshptr; +} + +Contour3D DrainHole::to_mesh() const +{ + auto r = double(radius); + auto h = double(height); + sla::Contour3D hole = sla::cylinder(r, h, steps); + Eigen::Quaterniond q; + q.setFromTwoVectors(Vec3d{0., 0., 1.}, normal.cast()); + for(auto& p : hole.points) p = q * p + pos.cast(); + + return hole; +} + +bool DrainHole::operator==(const DrainHole &sp) const +{ + return (pos == sp.pos) && (normal == sp.normal) && + is_approx(radius, sp.radius) && + is_approx(height, sp.height); +} + +bool DrainHole::is_inside(const Vec3f& pt) const +{ + Eigen::Hyperplane plane(normal, pos); + float dist = plane.signedDistance(pt); + if (dist < float(EPSILON) || dist > height) + return false; + + Eigen::ParametrizedLine axis(pos, normal); + if ( axis.squaredDistance(pt) < pow(radius, 2.f)) + return true; + + return false; +} + + +// Given a line s+dir*t, find parameter t of intersections with the hole +// and the normal (points inside the hole). Outputs through out reference, +// returns true if two intersections were found. +bool DrainHole::get_intersections(const Vec3f& s, const Vec3f& dir, + std::array, 2>& out) + const +{ + assert(is_approx(normal.norm(), 1.f)); + const Eigen::ParametrizedLine ray(s, dir.normalized()); + + for (size_t i=0; i<2; ++i) + out[i] = std::make_pair(sla::IndexedMesh::hit_result::infty(), Vec3d::Zero()); + + const float sqr_radius = pow(radius, 2.f); + + // first check a bounding sphere of the hole: + Vec3f center = pos+normal*height/2.f; + float sqr_dist_limit = pow(height/2.f, 2.f) + sqr_radius ; + if (ray.squaredDistance(center) > sqr_dist_limit) + return false; + + // The line intersects the bounding sphere, look for intersections with + // bases of the cylinder. + + size_t found = 0; // counts how many intersections were found + Eigen::Hyperplane base; + if (! is_approx(ray.direction().dot(normal), 0.f)) { + for (size_t i=1; i<=1; --i) { + Vec3f cylinder_center = pos+i*height*normal; + if (i == 0) { + // The hole base can be identical to mesh surface if it is flat + // let's better move the base outward a bit + cylinder_center -= EPSILON*normal; + } + base = Eigen::Hyperplane(normal, cylinder_center); + Vec3f intersection = ray.intersectionPoint(base); + // Only accept the point if it is inside the cylinder base. + if ((cylinder_center-intersection).squaredNorm() < sqr_radius) { + out[found].first = ray.intersectionParameter(base); + out[found].second = (i==0 ? 1. : -1.) * normal.cast(); + ++found; + } + } + } + else + { + // In case the line was perpendicular to the cylinder axis, previous + // block was skipped, but base will later be assumed to be valid. + base = Eigen::Hyperplane(normal, pos-EPSILON*normal); + } + + // In case there is still an intersection to be found, check the wall + if (found != 2 && ! is_approx(std::abs(ray.direction().dot(normal)), 1.f)) { + // Project the ray onto the base plane + Vec3f proj_origin = base.projection(ray.origin()); + Vec3f proj_dir = base.projection(ray.origin()+ray.direction())-proj_origin; + // save how the parameter scales and normalize the projected direction + float par_scale = proj_dir.norm(); + proj_dir = proj_dir/par_scale; + Eigen::ParametrizedLine projected_ray(proj_origin, proj_dir); + // Calculate point on the secant that's closest to the center + // and its distance to the circle along the projected line + Vec3f closest = projected_ray.projection(pos); + float dist = sqrt((sqr_radius - (closest-pos).squaredNorm())); + // Unproject both intersections on the original line and check + // they are on the cylinder and not past it: + for (int i=-1; i<=1 && found !=2; i+=2) { + Vec3f isect = closest + i*dist * projected_ray.direction(); + Vec3f to_isect = isect-proj_origin; + float par = to_isect.norm() / par_scale; + if (to_isect.normalized().dot(proj_dir.normalized()) < 0.f) + par *= -1.f; + Vec3d hit_normal = (pos-isect).normalized().cast(); + isect = ray.pointAt(par); + // check that the intersection is between the base planes: + float vert_dist = base.signedDistance(isect); + if (vert_dist > 0.f && vert_dist < height) { + out[found].first = par; + out[found].second = hit_normal; + ++found; + } + } + } + + // If only one intersection was found, it is some corner case, + // no intersection will be returned: + if (found != 2) + return false; + + // Sort the intersections: + if (out[0].first > out[1].first) + std::swap(out[0], out[1]); + + return true; +} + +void cut_drainholes(std::vector & obj_slices, + const std::vector &slicegrid, + float closing_radius, + const sla::DrainHoles & holes, + std::function thr) +{ + TriangleMesh mesh; + for (const sla::DrainHole &holept : holes) + mesh.merge(sla::to_triangle_mesh(holept.to_mesh())); + + if (mesh.empty()) return; + + mesh.require_shared_vertices(); + + TriangleMeshSlicer slicer(&mesh); + + std::vector hole_slices; + slicer.slice(slicegrid, SlicingMode::Regular, closing_radius, &hole_slices, thr); + + if (obj_slices.size() != hole_slices.size()) + BOOST_LOG_TRIVIAL(warning) + << "Sliced object and drain-holes layer count does not match!"; + + size_t until = std::min(obj_slices.size(), hole_slices.size()); + + for (size_t i = 0; i < until; ++i) + obj_slices[i] = diff_ex(obj_slices[i], hole_slices[i]); +} + +void hollow_mesh(TriangleMesh &mesh, const HollowingConfig &cfg) +{ + std::unique_ptr 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 new file mode 100644 index 0000000000..949cc23935 --- /dev/null +++ b/src/libslic3r/SLA/Hollowing.hpp @@ -0,0 +1,78 @@ +#ifndef SLA_HOLLOWING_HPP +#define SLA_HOLLOWING_HPP + +#include +#include +#include + +namespace Slic3r { + +class TriangleMesh; + +namespace sla { + +struct HollowingConfig +{ + double min_thickness = 2.; + double quality = 0.5; + double closing_distance = 0.5; + bool enabled = true; +}; + +struct DrainHole +{ + Vec3f pos; + Vec3f normal; + float radius; + float height; + + DrainHole() + : pos(Vec3f::Zero()), normal(Vec3f::UnitZ()), radius(5.f), height(10.f) + {} + + DrainHole(Vec3f p, Vec3f n, float r, float h) + : pos(p), normal(n), radius(r), height(h) + {} + + DrainHole(const DrainHole& rhs) : + DrainHole(rhs.pos, rhs.normal, rhs.radius, rhs.height) {} + + bool operator==(const DrainHole &sp) const; + + bool operator!=(const DrainHole &sp) const { return !(sp == (*this)); } + + bool is_inside(const Vec3f& pt) const; + + bool get_intersections(const Vec3f& s, const Vec3f& dir, + std::array, 2>& out) const; + + Contour3D to_mesh() const; + + template inline void serialize(Archive &ar) + { + ar(pos, normal, radius, height); + } + + static constexpr size_t steps = 32; +}; + +using DrainHoles = std::vector; + +constexpr float HoleStickOutLength = 1.f; + +std::unique_ptr generate_interior(const TriangleMesh &mesh, + const HollowingConfig & = {}, + const JobController &ctl = {}); + +void hollow_mesh(TriangleMesh &mesh, const HollowingConfig &cfg); + +void cut_drainholes(std::vector & obj_slices, + const std::vector &slicegrid, + float closing_radius, + const sla::DrainHoles & holes, + std::function thr); + +} +} + +#endif // HOLLOWINGFILTER_H diff --git a/src/libslic3r/SLA/IndexedMesh.cpp b/src/libslic3r/SLA/IndexedMesh.cpp new file mode 100644 index 0000000000..efcf09873e --- /dev/null +++ b/src/libslic3r/SLA/IndexedMesh.cpp @@ -0,0 +1,433 @@ +#include "IndexedMesh.hpp" +#include "Concurrency.hpp" + +#include +#include + +#include + +#ifdef SLIC3R_HOLE_RAYCASTER +#include +#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& 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& 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& IndexedMesh::vertices() const +{ + return m_tm->its.vertices; +} + + + +const std::vector& 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(); +} + + +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::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::query_ray_hits(const Vec3d &s, const Vec3d &dir) const +{ + std::vector outs; + std::vector 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& 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 hole_isects; + hole_isects.reserve(m_holes.size()); + + auto sf = s.cast(); + auto dirf = dir.cast(); + + // Collect hits on all holes, preserve information about entry/exit + for (const sla::DrainHole& hole : m_holes) { + std::array, 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 pp = p; + Eigen::Matrix 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; + + 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 thr, // throw on cancel + const std::vector& pt_indices) +{ + if (points.rows() == 0 || mesh.vertices().empty() || mesh.indices().empty()) + return {}; + + std::vector 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(); + const Vec3d &p2 = mesh.vertices(trindex(1)).cast(); + const Vec3d &p3 = mesh.vertices(trindex(2)).cast(); + + // 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 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 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/IndexedMesh.hpp b/src/libslic3r/SLA/IndexedMesh.hpp new file mode 100644 index 0000000000..a72492b344 --- /dev/null +++ b/src/libslic3r/SLA/IndexedMesh.hpp @@ -0,0 +1,146 @@ +#ifndef SLA_INDEXEDMESH_H +#define SLA_INDEXEDMESH_H + +#include +#include + +#include + +// 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 { + +class TriangleMesh; + +namespace sla { + +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 IndexedMesh { + class AABBImpl; + + const TriangleMesh* m_tm; + double m_ground_level = 0, m_gnd_offset = 0; + + std::unique_ptr m_aabb; + +#ifdef SLIC3R_HOLE_RAYCASTER + // This holds a copy of holes in the mesh. Initialized externally + // by load_mesh setter. + std::vector m_holes; +#endif + +public: + + explicit IndexedMesh(const TriangleMesh&); + + IndexedMesh(const IndexedMesh& other); + IndexedMesh& operator=(const IndexedMesh&); + + IndexedMesh(IndexedMesh &&other); + IndexedMesh& operator=(IndexedMesh &&other); + + ~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; } + + const std::vector& vertices() const; + const std::vector& 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(); + int m_face_id = -1; + const IndexedMesh *m_mesh = nullptr; + Vec3d m_dir; + Vec3d m_source; + Vec3d m_normal; + friend class IndexedMesh; + + // A valid object of this class can only be obtained from + // 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::infinity(); } + + explicit inline hit_result(double val = infty()) : m_t(val) {} + + inline double distance() const { return m_t; } + 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 m_face_id >= 0 && !std::isinf(m_t); } + + inline const Vec3d& normal() const { + assert(is_valid()); + return m_normal; + } + + inline bool is_inside() const { + 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& 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& 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 query_ray_hits(const Vec3d &s, const Vec3d &dir) const; + + double squared_distance(const Vec3d& p, int& i, Vec3d& c) const; + inline double squared_distance(const Vec3d &p) const + { + int i; + Vec3d c; + return squared_distance(p, i, c); + } + + 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 IndexedMesh& convert_mesh, + double eps = 0.05, // min distance from edges + std::function throw_on_cancel = [](){}, + const std::vector& selected_points = {}); + +}} // namespace Slic3r::sla + +#endif // INDEXEDMESH_H diff --git a/src/libslic3r/SLA/JobController.hpp b/src/libslic3r/SLA/JobController.hpp new file mode 100644 index 0000000000..b815e4d6fc --- /dev/null +++ b/src/libslic3r/SLA/JobController.hpp @@ -0,0 +1,32 @@ +#ifndef SLA_JOBCONTROLLER_HPP +#define SLA_JOBCONTROLLER_HPP + +#include +#include + +namespace Slic3r { namespace sla { + +/// A Control structure for the support calculation. Consists of the status +/// indicator callback and the stop condition predicate. +struct JobController +{ + using StatusFn = std::function; + using StopCond = std::function; + using CancelFn = std::function; + + // This will signal the status of the calculation to the front-end + StatusFn statuscb = [](unsigned, const std::string&){}; + + // Returns true if the calculation should be aborted. + StopCond stopcondition = [](){ return false; }; + + // Similar to cancel callback. This should check the stop condition and + // if true, throw an appropriate exception. (TriangleMeshSlicer needs this) + // consider it a hard abort. stopcondition is permits the algorithm to + // terminate itself + CancelFn cancelfn = [](){}; +}; + +}} // namespace Slic3r::sla + +#endif // JOBCONTROLLER_HPP diff --git a/src/libslic3r/SLA/SLAPad.cpp b/src/libslic3r/SLA/Pad.cpp similarity index 65% rename from src/libslic3r/SLA/SLAPad.cpp rename to src/libslic3r/SLA/Pad.cpp index 7cd9eb4e42..f2b189cd11 100644 --- a/src/libslic3r/SLA/SLAPad.cpp +++ b/src/libslic3r/SLA/Pad.cpp @@ -1,14 +1,17 @@ -#include "SLAPad.hpp" -#include "SLABoilerPlate.hpp" -#include "SLASpatIndex.hpp" +#include +#include +#include +#include + #include "ConcaveHull.hpp" #include "boost/log/trivial.hpp" -#include "SLABoostAdapter.hpp" #include "ClipperUtils.hpp" #include "Tesselate.hpp" #include "MTUtils.hpp" +#include "TriangulateWall.hpp" + // For debugging: // #include // #include @@ -25,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) { + Wall w = triangulate_wall(lower, upper, lower_z_mm, 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.indices; - - // 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::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); - + 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 @@ -337,18 +181,15 @@ PadSkeleton divide_blueprint(const ExPolygons &bp) for (ClipperLib::PolyTree::PolyNode *node : ptree.Childs) { ExPolygon poly(ClipperPath_to_Slic3rPolygon(node->Contour)); for (ClipperLib::PolyTree::PolyNode *child : node->Childs) { - if (child->IsHole()) { - poly.holes.emplace_back( - ClipperPath_to_Slic3rPolygon(child->Contour)); + poly.holes.emplace_back( + ClipperPath_to_Slic3rPolygon(child->Contour)); - traverse_pt_unordered(child->Childs, &ret.inner); - } - else traverse_pt_unordered(child, &ret.inner); + traverse_pt(child->Childs, &ret.inner); } ret.outer.emplace_back(poly); } - + return ret; } @@ -430,9 +271,11 @@ public: ExPolygons fullpad = diff_ex(fullcvh, model_bp_sticks); - remove_redundant_parts(fullpad); - PadSkeleton divided = divide_blueprint(fullpad); + + remove_redundant_parts(divided.outer); + remove_redundant_parts(divided.inner); + outer = std::move(divided.outer); inner = std::move(divided.inner); } @@ -533,10 +376,8 @@ bool add_cavity(Contour3D &pad, ExPolygon &top_poly, const PadConfig3D &cfg, 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; @@ -554,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)); } @@ -580,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)); } @@ -637,7 +479,7 @@ void pad_blueprint(const TriangleMesh & mesh, TriangleMeshSlicer slicer(&mesh); auto out = reserve_vector(heights.size()); - slicer.slice(heights, 0.f, &out, thrfn); + slicer.slice(heights, SlicingMode::Regular, 0.f, &out, thrfn); size_t count = 0; for(auto& o : out) count += o.size(); @@ -677,7 +519,7 @@ void create_pad(const ExPolygons &sup_blueprint, ThrowOnCancel thr) { Contour3D t = create_pad_geometry(sup_blueprint, model_blueprint, cfg, thr); - out.merge(mesh(std::move(t))); + out.merge(to_triangle_mesh(std::move(t))); } std::string PadConfig::validate() const diff --git a/src/libslic3r/SLA/SLAPad.hpp b/src/libslic3r/SLA/Pad.hpp similarity index 98% rename from src/libslic3r/SLA/SLAPad.hpp rename to src/libslic3r/SLA/Pad.hpp index 4abcdd281e..61eec2dd1e 100644 --- a/src/libslic3r/SLA/SLAPad.hpp +++ b/src/libslic3r/SLA/Pad.hpp @@ -1,5 +1,5 @@ -#ifndef SLABASEPOOL_HPP -#define SLABASEPOOL_HPP +#ifndef SLA_PAD_HPP +#define SLA_PAD_HPP #include #include diff --git a/src/libslic3r/SLA/RasterBase.cpp b/src/libslic3r/SLA/RasterBase.cpp new file mode 100644 index 0000000000..581e84880b --- /dev/null +++ b/src/libslic3r/SLA/RasterBase.cpp @@ -0,0 +1,89 @@ +#ifndef SLARASTER_CPP +#define SLARASTER_CPP + +#include + +#include +#include + +// minz image write: +#include + +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 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(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(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 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(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 create_raster_grayscale_aa( + const RasterBase::Resolution &res, + const RasterBase::PixelDim & pxdim, + double gamma, + const RasterBase::Trafo & tr) +{ + std::unique_ptr rst; + + if (gamma > 0) + rst = std::make_unique(res, pxdim, tr, gamma); + else + rst = std::make_unique(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 0000000000..431c731a66 --- /dev/null +++ b/src/libslic3r/SLA/RasterBase.hpp @@ -0,0 +1,124 @@ +#ifndef SLA_RASTERBASE_HPP +#define SLA_RASTERBASE_HPP + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace ClipperLib { struct Polygon; } + +namespace Slic3r { + +template using uqptr = std::unique_ptr; +template using shptr = std::shared_ptr; +template using wkptr = std::weak_ptr; + +namespace sla { + +// Raw byte buffer paired with its size. Suitable for compressed image data. +class EncodedRaster { +protected: + std::vector m_buffer; + std::string m_ext; +public: + EncodedRaster() = default; + explicit EncodedRaster(std::vector &&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; + +class RasterBase { +public: + + enum Orientation { roLandscape, roPortrait }; + + using TMirroring = std::array; + static const TMirroring NoMirror; + static const TMirroring MirrorX; + static const TMirroring MirrorY; + static const TMirroring MirrorXY; + + 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 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 0000000000..cd84a3cb4a --- /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 { + 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 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 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 0000000000..c0e1f41145 --- /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/ReprojectPointsOnMesh.hpp b/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp new file mode 100644 index 0000000000..20804193e2 --- /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 + +namespace Slic3r { namespace sla { + +template Vec3d pos(const Pt &p) { return p.pos.template cast(); } +template void pos(Pt &p, const Vec3d &pp) { p.pos = pp.cast(); } + +template +void reproject_support_points(const IndexedMesh &mesh, std::vector &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 new file mode 100644 index 0000000000..9378977663 --- /dev/null +++ b/src/libslic3r/SLA/Rotfinder.cpp @@ -0,0 +1,322 @@ +#include + +#include +#include + +#include + +#include "libslic3r/SLAPrint.hpp" +#include "libslic3r/PrintConfig.hpp" + +#include +#include "Model.hpp" + +#include + +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()).z(); + }; + + double zmin = std::numeric_limits::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 get_triangle_vertices(const TriangleMesh &mesh, + size_t faceidx) +{ + const auto &face = mesh.its.indices[faceidx]; + return {Vec3d{mesh.its.vertices[face(0)].cast()}, + Vec3d{mesh.its.vertices[face(1)].cast()}, + Vec3d{mesh.its.vertices[face(2)].cast()}}; +} + +std::array 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 &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 +double sum_score(AccessFn &&accessfn, size_t facecount, size_t Nthreads) +{ + double initv = 0.; + auto mergefn = std::plus{}; + 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 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; + +// prepare the rotation transformation +Transform3d to_transform3d(const XYRotation &rot) +{ + 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 +std::array find_min_score(Fn &&fn, It from, It to, StopCond &&stopfn) +{ + std::array ret; + + double score = std::numeric_limits::max(); + + size_t Nthreads = std::thread::hardware_concurrency(); + size_t dist = std::distance(from, to); + std::vector 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); + + 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 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(1e3) * scaled(1.)); + + size_t facecount = chull.its.indices.size(); + + struct RotArea { XYRotation rot; double area; }; + + auto inputs = reserve_vector(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(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 statuscb, + std::function stopcond) +{ + static const unsigned MAX_TRIES = 1000; + + // return value + XYRotation rot; + + // We will use only one instance of this converted mesh to examine different + // rotations + TriangleMesh mesh = po.model_object()->raw_mesh(); + mesh.require_shared_vertices(); + + // To keep track of the number of iterations + unsigned status = 0; + + // The maximum number of iterations + auto max_tries = unsigned(accuracy * MAX_TRIES); + + // call status callback with zero, because we are at the start + statuscb(status); + + auto statusfn = [&statuscb, &status, &max_tries] { + // report status + statuscb(unsigned(++status * 100.0/max_tries) ); + }; + + // Different search methods have to be used depending on the model elevation + if (is_on_floor(po)) { + + std::vector inputs = get_chull_rotations(mesh, max_tries); + max_tries = inputs.size(); + + // If the model can be placed on the bed directly, we only need to + // check the 3D convex hull face rotations. + + auto objfn = [&mesh, &statusfn](const XYRotation &rot) { + statusfn(); + Transform3d tr = to_transform3d(rot); + return get_model_supportedness_onfloor(mesh, tr); + }; + + 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 solver(opt::StopCriteria{} + .max_iterations(max_tries) + .stop_condition(stopcond), + gridsize); + + // 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} }); + + 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); + + // Save the result and fck off + rot = result.optimum; + } + + return {rot[0], rot[1]}; +} + +double get_model_supportedness(const SLAPrintObject &po, const Transform3d &tr) +{ + TriangleMesh mesh = po.model_object()->raw_mesh(); + mesh.require_shared_vertices(); + + 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/SLARotfinder.hpp b/src/libslic3r/SLA/Rotfinder.hpp similarity index 76% rename from src/libslic3r/SLA/SLARotfinder.hpp rename to src/libslic3r/SLA/Rotfinder.hpp index b8cec859e2..96561a890f 100644 --- a/src/libslic3r/SLA/SLARotfinder.hpp +++ b/src/libslic3r/SLA/Rotfinder.hpp @@ -1,12 +1,14 @@ -#ifndef SLAROTFINDER_HPP -#define SLAROTFINDER_HPP +#ifndef SLA_ROTFINDER_HPP +#define SLA_ROTFINDER_HPP #include #include +#include + 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 find_best_rotation( - const ModelObject& modelobj, +Vec2d find_best_rotation( + const SLAPrintObject& modelobj, float accuracy = 1.0f, std::function statuscb = [] (unsigned) {}, std::function 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/SLABoilerPlate.hpp b/src/libslic3r/SLA/SLABoilerPlate.hpp deleted file mode 100644 index d7ce26bb2b..0000000000 --- a/src/libslic3r/SLA/SLABoilerPlate.hpp +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef SLABOILERPLATE_HPP -#define SLABOILERPLATE_HPP - -#include -#include -#include - -#include -#include - -#include "SLACommon.hpp" -#include "SLASpatIndex.hpp" - -namespace Slic3r { -namespace sla { - -/// Intermediate struct for a 3D mesh -struct Contour3D { - Pointf3s points; - std::vector indices; - - Contour3D& merge(const Contour3D& ctr) - { - auto s3 = coord_t(points.size()); - auto s = indices.size(); - - points.insert(points.end(), ctr.points.begin(), ctr.points.end()); - indices.insert(indices.end(), ctr.indices.begin(), ctr.indices.end()); - - for(size_t n = s; n < indices.size(); n++) { - auto& idx = indices[n]; idx.x() += s3; idx.y() += s3; idx.z() += s3; - } - - return *this; - } - - Contour3D& merge(const Pointf3s& triangles) - { - const size_t offs = points.size(); - points.insert(points.end(), triangles.begin(), triangles.end()); - indices.reserve(indices.size() + points.size() / 3); - - for(int i = int(offs); i < int(points.size()); i += 3) - indices.emplace_back(i, i + 1, i + 2); - - return *this; - } - - // Write the index triangle structure to OBJ file for debugging purposes. - void to_obj(std::ostream& stream) - { - for(auto& p : points) { - stream << "v " << p.transpose() << "\n"; - } - - for(auto& f : indices) { - stream << "f " << (f + Vec3i(1, 1, 1)).transpose() << "\n"; - } - } -}; - -using ClusterEl = std::vector; -using ClusteredPoints = std::vector; - -// Clustering a set of points by the given distance. -ClusteredPoints cluster(const std::vector& indices, - std::function pointfn, - double dist, - unsigned max_points); - -ClusteredPoints cluster(const PointSet& points, - double dist, - unsigned max_points); - -ClusteredPoints cluster( - const std::vector& indices, - std::function pointfn, - std::function predicate, - unsigned max_points); - - -// 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& mesh, - double eps = 0.05, // min distance from edges - std::function throw_on_cancel = [](){}, - const std::vector& selected_points = {}); - -/// Mesh from an existing contour. -inline TriangleMesh mesh(const Contour3D& ctour) { - return {ctour.points, ctour.indices}; -} - -/// Mesh from an evaporating 3D contour -inline TriangleMesh mesh(Contour3D&& ctour) { - return {std::move(ctour.points), std::move(ctour.indices)}; -} - -} -} - -#endif // SLABOILERPLATE_HPP diff --git a/src/libslic3r/SLA/SLACommon.hpp b/src/libslic3r/SLA/SLACommon.hpp deleted file mode 100644 index 97b4596761..0000000000 --- a/src/libslic3r/SLA/SLACommon.hpp +++ /dev/null @@ -1,187 +0,0 @@ -#ifndef SLACOMMON_HPP -#define SLACOMMON_HPP - -#include -#include -#include - -// #define SLIC3R_SLA_NEEDS_WINDTREE - -namespace Slic3r { - -// Typedefs from Point.hpp -typedef Eigen::Matrix Vec3f; -typedef Eigen::Matrix Vec3d; - -class TriangleMesh; - -namespace sla { - -// An enum to keep track of where the current points on the ModelObject came from. -enum class PointsStatus { - NoPoints, // No points were generated so far. - Generating, // The autogeneration algorithm triggered, but not yet finished. - AutoGenerated, // Points were autogenerated (i.e. copied from the backend). - UserModified // User has done some edits. -}; - -struct SupportPoint -{ - Vec3f pos; - float head_front_radius; - bool is_new_island; - - SupportPoint() - : pos(Vec3f::Zero()), head_front_radius(0.f), is_new_island(false) - {} - - SupportPoint(float pos_x, - float pos_y, - float pos_z, - float head_radius, - bool new_island) - : 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) - : pos(position) - , head_front_radius(head_radius) - , is_new_island(new_island) - {} - - SupportPoint(Eigen::Matrix data) - : pos(data(0), data(1), data(2)) - , head_front_radius(data(3)) - , is_new_island(data(4) != 0.f) - {} - - bool operator==(const SupportPoint &sp) const - { - return (pos == sp.pos) && head_front_radius == sp.head_front_radius && - is_new_island == sp.is_new_island; - } - bool operator!=(const SupportPoint &sp) const { return !(sp == (*this)); } - - template void serialize(Archive &ar) - { - ar(pos, head_front_radius, is_new_island); - } -}; - -using SupportPoints = std::vector; - -/// An index-triangle structure for libIGL functions. Also serves as an -/// alternative (raw) input format for the SLASupportTree -class EigenMesh3D { - class AABBImpl; - - Eigen::MatrixXd m_V; - Eigen::MatrixXi m_F; - double m_ground_level = 0, m_gnd_offset = 0; - - std::unique_ptr m_aabb; -public: - - EigenMesh3D(const TriangleMesh&); - EigenMesh3D(const EigenMesh3D& other); - EigenMesh3D& operator=(const EigenMesh3D&); - - ~EigenMesh3D(); - - 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; } - - // Result of a raycast - class hit_result { - double m_t = std::nan(""); - int m_face_id = -1; - const EigenMesh3D *m_mesh = nullptr; - Vec3d m_dir; - Vec3d m_source; - friend class EigenMesh3D; - - // 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) {} - public: - - // This can create a placeholder object which is invalid (not created - // by a query_ray_hit call) but the distance can be preset to - // a specific value for distinguishing the placeholder. - inline hit_result(double val = std::nan("")): m_t(val) {} - - inline double distance() const { return m_t; } - inline const Vec3d& direction() const { return m_dir; } - 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; } - - // Hit_result can decay into a double as the hit distance. - inline operator double() const { return distance(); } - - inline Vec3d normal() const { - if(m_face_id < 0 || !is_valid()) return {}; - auto trindex = m_mesh->m_F.row(m_face_id); - const Vec3d& p1 = m_mesh->V().row(trindex(0)); - const Vec3d& p2 = m_mesh->V().row(trindex(1)); - const Vec3d& p3 = m_mesh->V().row(trindex(2)); - Eigen::Vector3d U = p2 - p1; - Eigen::Vector3d V = p3 - p1; - return U.cross(V).normalized(); - } - - inline bool is_inside() { - return m_face_id >= 0 && normal().dot(m_dir) > 0; - } - }; - - // 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; - - 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 - { - int i; - Vec3d c; - return squared_distance(p, i, c); - } -}; - -using PointSet = Eigen::MatrixXd; - -} // namespace sla -} // namespace Slic3r - - -#endif // SLASUPPORTTREE_HPP diff --git a/src/libslic3r/SLA/SLAConcurrency.hpp b/src/libslic3r/SLA/SLAConcurrency.hpp deleted file mode 100644 index 4beb2aead1..0000000000 --- a/src/libslic3r/SLA/SLAConcurrency.hpp +++ /dev/null @@ -1,56 +0,0 @@ -#ifndef SLACONCURRENCY_H -#define SLACONCURRENCY_H - -#include -#include -#include - -namespace Slic3r { -namespace sla { - -// Set this to true to enable full parallelism in this module. -// Only the well tested parts will be concurrent if this is set to false. -const constexpr bool USE_FULL_CONCURRENCY = true; - -template struct _ccr {}; - -template<> struct _ccr -{ - using SpinningMutex = tbb::spin_mutex; - using BlockingMutex = tbb::mutex; - - template - static inline void enumerate(It from, It to, Fn fn) - { - 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); - }); - } -}; - -template<> struct _ccr -{ -private: - struct _Mtx { inline void lock() {} inline void unlock() {} }; - -public: - using SpinningMutex = _Mtx; - using BlockingMutex = _Mtx; - - template - static inline void enumerate(It from, It to, Fn fn) - { - for (auto it = from; it != to; ++it) fn(*it, size_t(it - from)); - } -}; - -using ccr = _ccr; -using ccr_seq = _ccr; -using ccr_par = _ccr; - -}} // namespace Slic3r::sla - -#endif // SLACONCURRENCY_H diff --git a/src/libslic3r/SLA/SLARaster.cpp b/src/libslic3r/SLA/SLARaster.cpp deleted file mode 100644 index 091cadd231..0000000000 --- a/src/libslic3r/SLA/SLARaster.cpp +++ /dev/null @@ -1,320 +0,0 @@ -#ifndef SLARASTER_CPP -#define SLARASTER_CPP - -#include - -#include "SLARaster.hpp" -#include "libslic3r/ExPolygon.hpp" -#include "libslic3r/MTUtils.hpp" -#include - -// For rasterizing -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -// Experimental minz image write: -#include - -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; -using TPixel = TPixelRenderer::color_type; -using TRawBuffer = agg::rendering_buffer; -using TBuffer = std::vector; - -using TRendererAA = agg::renderer_scanline_aa_solid; - -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 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(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 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 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 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 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(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(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(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/SLARaster.hpp b/src/libslic3r/SLA/SLARaster.hpp deleted file mode 100644 index b3d73536bb..0000000000 --- a/src/libslic3r/SLA/SLARaster.hpp +++ /dev/null @@ -1,157 +0,0 @@ -#ifndef SLARASTER_HPP -#define SLARASTER_HPP - -#include -#include -#include -#include -#include -#include - -#include - -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 m_impl; -public: - - // Raw byte buffer paired with its size. Suitable for compressed image data. - class RawData - { - protected: - std::vector m_buffer; - const Impl& get_internals(const Raster& raster); - public: - RawData() = default; - RawData(std::vector&& 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; - 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/SLARasterWriter.cpp b/src/libslic3r/SLA/SLARasterWriter.cpp deleted file mode 100644 index 6ac86827ef..0000000000 --- a/src/libslic3r/SLA/SLARasterWriter.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#include "SLARasterWriter.hpp" -#include "libslic3r/Zipper.hpp" -#include "libslic3r/Time.hpp" - -#include "ExPolygon.hpp" -#include - -#include -#include - -namespace Slic3r { namespace sla { - -std::string RasterWriter::createIniContent(const std::string& projectname) const -{ - std::string out("action = print\njobDir = "); - out += projectname + "\n"; - - for (auto ¶m : m_config) - out += param.first + " = " + param.second + "\n"; - - 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 << createIniContent(project); - - 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; -} - -} // 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; -} - -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/SLARasterWriter.hpp b/src/libslic3r/SLA/SLARasterWriter.hpp deleted file mode 100644 index 93a315c821..0000000000 --- a/src/libslic3r/SLA/SLARasterWriter.hpp +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef SLARASTERWRITER_HPP -#define SLARASTERWRITER_HPP - -// For png export of the sliced model -#include -#include -#include -#include -#include -#include - -#include "libslic3r/PrintConfig.hpp" - -#include "SLARaster.hpp" -#include "libslic3r/Zipper.hpp" - -namespace Slic3r { 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 m_layers_rst; - Raster::Resolution m_res; - Raster::PixelDim m_pxdim; - Raster::Trafo m_trafo; - double m_gamma; - - std::map m_config; - - std::string createIniContent(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 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/SLARotfinder.cpp b/src/libslic3r/SLA/SLARotfinder.cpp deleted file mode 100644 index 2e64059d68..0000000000 --- a/src/libslic3r/SLA/SLARotfinder.cpp +++ /dev/null @@ -1,125 +0,0 @@ -#include -#include - -#include -#include "SLABoilerPlate.hpp" -#include "SLARotfinder.hpp" -#include "SLASupportTree.hpp" -#include "Model.hpp" - -namespace Slic3r { -namespace sla { - -std::array find_best_rotation(const ModelObject& modelobj, - float accuracy, - std::function statuscb, - std::function stopcond) -{ - using libnest2d::opt::Method; - using libnest2d::opt::bound; - using libnest2d::opt::Optimizer; - using libnest2d::opt::TOptimizer; - using libnest2d::opt::StopCriteria; - - static const unsigned MAX_TRIES = 100000; - - // return value - std::array rot; - - // We will use only one instance of this converted mesh to examine different - // rotations - EigenMesh3D emesh(modelobj.raw_mesh()); - - // For current iteration number - unsigned status = 0; - - // The maximum number of iterations - auto max_tries = unsigned(accuracy * MAX_TRIES); - - // 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; - - // 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. - - // TODO: some applications optimize for minimum z-axis cross section - // area. The current function is only an example of how to optimize. - - // 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); - - Vec3d p1 = m.V().row(idx(0)); - Vec3d p2 = m.V().row(idx(1)); - Vec3d p3 = m.V().row(idx(2)); - - Eigen::Vector3d U = p2 - p1; - Eigen::Vector3d V = p3 - p1; - - // So this is the normal - auto n = U.cross(V).normalized(); - - // rotate the normal with the current rotation given by the solver - n = rt * n; - - // 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())); - } - - // report status - if(!stopcond()) statuscb( unsigned(++status * 100.0/max_tries) ); - - return score; - }; - - // 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 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; -} - -} -} diff --git a/src/libslic3r/SLA/SLASupportTreeBuilder.cpp b/src/libslic3r/SLA/SLASupportTreeBuilder.cpp deleted file mode 100644 index 2e0310ed8d..0000000000 --- a/src/libslic3r/SLA/SLASupportTreeBuilder.cpp +++ /dev/null @@ -1,525 +0,0 @@ -#include "SLASupportTreeBuilder.hpp" -#include "SLASupportTreeBuildsteps.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.indices; - - // 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 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.indices; - 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) - , 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.indices.emplace_back(i1s1, i2s1, i2s2); - mesh.indices.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.indices.emplace_back(i2s2, i2s1, i1s1); - mesh.indices.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.indices.swap(body.indices); - } -} - -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.indices; - 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; - 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, - const ExPolygons & model_contours, - double ground_level, - const PadConfig & pcfg, - ThrowOnCancel thr) - : cfg(pcfg) - , zlevel(ground_level + pcfg.full_height() - pcfg.required_elevation()) -{ - thr(); - - ExPolygons sup_contours; - - float zstart = float(zlevel); - float zend = zstart + float(pcfg.full_height() + EPSILON); - - pad_blueprint(support_mesh, sup_contours, grid(zstart, zend, 0.1f), thr); - create_pad(sup_contours, model_contours, tmesh, pcfg); - - tmesh.translate(0, 0, float(zlevel)); - if (!tmesh.empty()) tmesh.require_shared_vertices(); -} - -const TriangleMesh &SupportTreeBuilder::add_pad(const ExPolygons &modelbase, - const PadConfig & cfg) -{ - m_pad = Pad{merged_mesh(), modelbase, ground_level, cfg, ctl().cancelfn}; - return m_pad.tmesh; -} - -SupportTreeBuilder::SupportTreeBuilder(SupportTreeBuilder &&o) - : m_heads(std::move(o.m_heads)) - , m_head_indices{std::move(o.m_head_indices)} - , 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} - , m_model_height{o.m_model_height} - , ground_level{o.ground_level} -{} - -SupportTreeBuilder::SupportTreeBuilder(const SupportTreeBuilder &o) - : m_heads(o.m_heads) - , m_head_indices{o.m_head_indices} - , 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} - , m_model_height{o.m_model_height} - , ground_level{o.ground_level} -{} - -SupportTreeBuilder &SupportTreeBuilder::operator=(SupportTreeBuilder &&o) -{ - m_heads = std::move(o.m_heads); - m_head_indices = std::move(o.m_head_indices); - 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; - m_model_height = o.m_model_height; - ground_level = o.ground_level; - return *this; -} - -SupportTreeBuilder &SupportTreeBuilder::operator=(const SupportTreeBuilder &o) -{ - m_heads = o.m_heads; - m_head_indices = o.m_head_indices; - 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; - m_model_height = o.m_model_height; - ground_level = o.ground_level; - return *this; -} - -const TriangleMesh &SupportTreeBuilder::merged_mesh() const -{ - if (m_meshcache_valid) return m_meshcache; - - Contour3D merged; - - for (auto &head : m_heads) { - if (ctl().stopcondition()) break; - if (head.is_valid()) merged.merge(head.mesh); - } - - for (auto &stick : m_pillars) { - if (ctl().stopcondition()) break; - merged.merge(stick.mesh); - merged.merge(stick.base); - } - - for (auto &j : m_junctions) { - if (ctl().stopcondition()) break; - merged.merge(j.mesh); - } - - for (auto &cb : m_compact_bridges) { - if (ctl().stopcondition()) break; - merged.merge(cb.mesh); - } - - for (auto &bs : m_bridges) { - if (ctl().stopcondition()) break; - merged.merge(bs.mesh); - } - - for (auto &bs : m_crossbridges) { - if (ctl().stopcondition()) break; - merged.merge(bs.mesh); - } - - if (ctl().stopcondition()) { - // In case of failure we have to return an empty mesh - m_meshcache = TriangleMesh(); - return m_meshcache; - } - - m_meshcache = mesh(merged); - - // The mesh will be passed by const-pointer to TriangleMeshSlicer, - // which will need this. - if (!m_meshcache.empty()) m_meshcache.require_shared_vertices(); - - BoundingBoxf3 &&bb = m_meshcache.bounding_box(); - m_model_height = bb.max(Z) - bb.min(Z); - - m_meshcache_valid = true; - return m_meshcache; -} - -double SupportTreeBuilder::full_height() const -{ - if (merged_mesh().empty() && !pad().empty()) - return pad().cfg.full_height(); - - double h = mesh_height(); - if (!pad().empty()) h += pad().cfg.required_elevation(); - return h; -} - -const TriangleMesh &SupportTreeBuilder::merge_and_cleanup() -{ - // in case the mesh is not generated, it should be... - auto &ret = merged_mesh(); - - // Doing clear() does not garantee to release the memory. - m_heads = {}; - m_head_indices = {}; - m_pillars = {}; - m_junctions = {}; - m_bridges = {}; - m_compact_bridges = {}; - - return ret; -} - -const TriangleMesh &SupportTreeBuilder::retrieve_mesh(MeshType meshtype) const -{ - switch(meshtype) { - case MeshType::Support: return merged_mesh(); - case MeshType::Pad: return pad().tmesh; - } - - 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); -} - -} -} diff --git a/src/libslic3r/SLA/SLASupportTreeBuildsteps.cpp b/src/libslic3r/SLA/SLASupportTreeBuildsteps.cpp deleted file mode 100644 index 392a963e12..0000000000 --- a/src/libslic3r/SLA/SLASupportTreeBuildsteps.cpp +++ /dev/null @@ -1,1387 +0,0 @@ -#include "SLASupportTreeBuildsteps.hpp" - -#include -#include -#include - -namespace Slic3r { -namespace sla { - -SupportTreeBuildsteps::SupportTreeBuildsteps(SupportTreeBuilder & builder, - const SupportableMesh &sm) - : m_cfg(sm.cfg) - , m_mesh(sm.emesh) - , m_support_pts(sm.pts) - , m_support_nmls(sm.pts.size(), 3) - , m_builder(builder) - , m_points(sm.pts.size(), 3) - , m_thr(builder.ctl().cancelfn) -{ - // 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)); - m_points.row(i)(Y) = double(sp.pos(Y)); - m_points.row(i)(Z) = double(sp.pos(Z)); - ++i; - } -} - -bool SupportTreeBuildsteps::execute(SupportTreeBuilder & builder, - const SupportableMesh &sm) -{ - if(sm.pts.empty()) return false; - - 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 { - BEGIN, - FILTER, - PINHEADS, - CLASSIFY, - ROUTING_GROUND, - ROUTING_NONGROUND, - CASCADE_PILLARS, - HEADLESS, - MERGE_RESULT, - DONE, - ABORT, - NUM_STEPS - //... - }; - - // Collect the algorithm steps into a nice sequence - std::array, 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 stepstr { - "Starting", - "Filtering", - "Generate pinheads", - "Classification", - "Routing to ground", - "Routing supports to model surface", - "Interconnecting pillars", - "Processing small holes", - "Merging support mesh", - "Done", - "Abort" - }; - - static const std::array stepstate { - 0, - 10, - 30, - 50, - 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; - case PINHEADS: pc = CLASSIFY; break; - 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 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; -} - -EigenMesh3D::hit_result SupportTreeBuildsteps::pinhead_mesh_intersect( - const Vec3d &s, const Vec3d &dir, double r_pin, double r_back, double width) -{ - static const size_t SAMPLES = 8; - - // method based on: - // https://math.stackexchange.com/questions/73237/parametric-equation-of-a-circle-in-3d-space - - // 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. - - // Move away slightly from the touching point to avoid raycasting on the - // inner surface of the mesh. - Vec3d v = dir; // Our direction (axis) - Vec3d c = s + width * dir; - const double& sd = m_cfg.safety_distance_mm; - - // 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. - Vec3d a(0, 1, 0), b; - - // The portions of the circle (the head-back circle) for which we will - // shoot rays. - std::array phis; - for(size_t i = 0; i < phis.size(); ++i) phis[i] = i*2*PI/phis.size(); - - auto& m = m_mesh; - using HitResult = EigenMesh3D::hit_result; - - // Hit results - std::array hits; - - // 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' - auto chk1 = [] (double val) { - return std::abs(std::abs(val) - 1) < 1e-20; - }; - - if(chk1(v(X)) || chk1(v(Y)) || chk1(v(Z))) { - a = {v(Z), v(X), v(Y)}; - b = {v(Y), v(Z), v(X)}; - } - else { - a(Z) = -(v(Y)*a(Y)) / v(Z); a.normalize(); - b = a.cross(v); - } - - // Now a and b vectors are perpendicular to v and to each other. - // Together they define the plane where we have to iterate with the - // given angles in the 'phis' vector - ccr::enumerate( - phis.begin(), phis.end(), - [&hits, &m, sd, r_pin, r_back, s, a, b, c](double phi, size_t i) { - double sinphi = std::sin(phi); - double cosphi = std::cos(phi); - - // Let's have a safety coefficient for the radiuses. - double rpscos = (sd + r_pin) * cosphi; - double rpssin = (sd + r_pin) * sinphi; - double rpbcos = (sd + r_back) * cosphi; - double rpbsin = (sd + r_back) * sinphi; - - // Point on the circle on the pin sphere - Vec3d ps(s(X) + rpscos * a(X) + rpssin * b(X), - s(Y) + rpscos * a(Y) + rpssin * b(Y), - s(Z) + rpscos * a(Z) + rpssin * b(Z)); - - // 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). - - // This is the point on the circle on the back sphere - Vec3d p(c(X) + rpbcos * a(X) + rpbsin * b(X), - c(Y) + rpbcos * a(Y) + rpbsin * b(Y), - c(Z) + rpbcos * a(Z) + rpbsin * b(Z)); - - 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() > r_pin + sd) { - // If we are inside the model and the hit - // distance is bigger than our pin circle - // diameter, it probably indicates that the - // support point was already inside the - // model, or there is really no space - // around the point. We will assign a zero - // hit distance to these cases which will - // enforce the function return value to be - // an invalid ray with zero hit distance. - // (see min_element at the end) - hits[i] = HitResult(0.0); - } else { - // re-cast the ray from the outside of the - // object. The starting point has an offset - // of 2*safety_distance because the - // original ray has also had an offset - auto q2 = m.query_ray_hit( - ps + (q.distance() + 2 * sd) * n, n); - hits[i] = q2; - } - } else - hits[i] = q; - }); - - auto mit = std::min_element(hits.begin(), hits.end()); - - return *mit; -} - -EigenMesh3D::hit_result SupportTreeBuildsteps::bridge_mesh_intersect( - const Vec3d &s, const Vec3d &dir, double r, bool ins_check) -{ - static const size_t SAMPLES = 8; - - // helper vector calculations - Vec3d a(0, 1, 0), b; - const double& sd = m_cfg.safety_distance_mm; - - // INFO: for explanation of the method used here, see the previous - // method's comments. - - auto chk1 = [] (double val) { - return std::abs(std::abs(val) - 1) < 1e-20; - }; - - if(chk1(dir(X)) || chk1(dir(Y)) || chk1(dir(Z))) { - a = {dir(Z), dir(X), dir(Y)}; - b = {dir(Y), dir(Z), dir(X)}; - } - else { - a(Z) = -(dir(Y)*a(Y)) / dir(Z); a.normalize(); - b = a.cross(dir); - } - - // circle portions - std::array phis; - for(size_t i = 0; i < phis.size(); ++i) phis[i] = i*2*PI/phis.size(); - - auto& m = m_mesh; - using HitResult = EigenMesh3D::hit_result; - - // Hit results - std::array hits; - - ccr::enumerate( - phis.begin(), phis.end(), - [&m, a, b, sd, dir, r, s, ins_check, &hits] (double phi, size_t i) { - double sinphi = std::sin(phi); - double cosphi = std::cos(phi); - - // Let's have a safety coefficient for the radiuses. - double rcos = (sd + r) * cosphi; - double rsin = (sd + r) * sinphi; - - // Point on the circle on the pin sphere - Vec3d p (s(X) + rcos * a(X) + rsin * b(X), - s(Y) + rcos * a(Y) + rsin * b(Y), - s(Z) + rcos * a(Z) + rsin * b(Z)); - - auto hr = m.query_ray_hit(p + sd*dir, dir); - - if(ins_check && hr.is_inside()) { - if(hr.distance() > 2 * r + sd) hits[i] = HitResult(0.0); - else { - // re-cast the ray from the outside of the object - auto hr2 = - m.query_ray_hit(p + (hr.distance() + 2*sd)*dir, dir); - - hits[i] = hr2; - } - } else hits[i] = hr; - }); - - auto mit = std::min_element(hits.begin(), hits.end()); - - return *mit; -} - -bool SupportTreeBuildsteps::interconnect(const Pillar &pillar, - const Pillar &nextpillar) -{ - // We need to get the starting point of the zig-zag pattern. We have to - // be aware that the two head junctions are at different heights. We - // may start from the lowest junction and call it a day but this - // strategy would leave unconnected a lot of pillar duos where the - // 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_intersect(sj, dirv(sj, ej), pillar.r) >= bridge_distance) - { - m_builder.add_crossbridge(sj, ej, pillar.r); - was_connected = true; - } - - // double bridging: (crosses) - if(docrosses) { - Vec3d sjback(ej(X), ej(Y), sj(Z)); - Vec3d ejback(sj(X), sj(Y), ej(Z)); - if (sjback(Z) <= slower(Z) && ejback(Z) >= eupper(Z) && - bridge_mesh_intersect(sjback, dirv(sjback, ejback), - pillar.r) >= bridge_distance) { - // need to check collision for the cross stick - m_builder.add_crossbridge(sjback, ejback, pillar.r); - was_connected = true; - } - } - - sj.swap(ej); - ej(Z) = sj(Z) + zstep; - } - - return was_connected; -} - -bool SupportTreeBuildsteps::connect_to_nearpillar(const Head &head, - long nearpillar_id) -{ - auto nearpillar = [this, nearpillar_id]() -> const Pillar& { - return m_builder.pillar(nearpillar_id); - }; - - 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_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_intersect(headjp, {0,0,-1}, 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; - if(bridgeend(Z) < minz) return false; - - double t = bridge_mesh_intersect(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 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_junction(bridgestart, r); - m_builder.add_bridge(bridgestart, bridgeend, head.r_back_mm); - } 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; -} - -void SupportTreeBuildsteps::create_ground_pillar(const Vec3d &jp, - const Vec3d &sourcedir, - double radius, - long head_id) -{ - // People were killed for this number (seriously) - static const double SQR2 = std::sqrt(2.0); - static const Vec3d DOWN = {0.0, 0.0, -1.0}; - - 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 (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; - double mind = min_dist - dist; - double azimuth = std::atan2(sourcedir(Y), sourcedir(X)); - double sinpolar = std::sin(PI - m_cfg.bridge_slope); - double cospolar = std::cos(PI - m_cfg.bridge_slope); - double cosazm = std::cos(azimuth); - double sinazm = std::sin(azimuth); - - auto dir = Vec3d(cosazm * sinpolar, sinazm * sinpolar, cospolar) - .normalized(); - - using namespace libnest2d::opt; - StopCriteria scr; - scr.stop_score = min_dist; - SubplexOptimizer solver(scr); - - auto result = solver.optimize_max( - [this, dir, jp, gndlvl](double mv) { - Vec3d endpt = jp + SQR2 * mv * dir; - endpt(Z) = gndlvl; - return std::sqrt(m_mesh.squared_distance(endpt)); - }, - initvals(mind), bound(0.0, 2 * min_dist)); - - mind = std::get<0>(result.optimum); - endp = jp + SQR2 * mind * 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_intersect(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 - SQR2 * (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); - } - - 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); - } - } - - 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); - } - - if(pillar_id >= 0) // Save the pillar endpoint in the spatial index - m_pillar_index.guarded_insert(endp, unsigned(pillar_id)); -} - -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()); - m_iheadless.reserve(aliases.size()); - for(auto& a : aliases) { - // 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. - - using libnest2d::opt::bound; - using libnest2d::opt::initvals; - using libnest2d::opt::GeneticOptimizer; - using libnest2d::opt::StopCriteria; - - ccr::SpinningMutex mutex; - auto addfn = [&mutex](PtIndices &container, unsigned val) { - std::lock_guard lk(mutex); - container.emplace_back(val); - }; - - auto filterfn = [this, &nmls, addfn](unsigned fidx, size_t i) { - 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. - - double z = n(2); - double r = 1.0; // for normalized vector - double polar = std::acos(z / r); - double azimuth = std::atan2(n(1), n(0)); - - // 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 = Vec3d(std::cos(azimuth) * std::sin(polar), - std::sin(azimuth) * std::sin(polar), - std::cos(polar)).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 = Vec3d(std::cos(azm) * std::sin(plr), - std::sin(azm) * std::sin(plr), - std::cos(plr)).normalized(); - - double score = pinhead_mesh_intersect( - 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 = Vec3d(std::cos(azimuth) * std::sin(polar), - std::sin(azimuth) * std::sin(polar), - std::cos(polar)).normalized(); - t = 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); - } - } - }; - - ccr::enumerate(filtered_indices.begin(), filtered_indices.end(), filterfn); - - 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() // displacement - ); - } -} - -void SupportTreeBuildsteps::classify() -{ - // We should first get the heads that reach the ground directly - 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); - Vec3d n(0, 0, -1); - double r = head.r_back_mm; - Vec3d headjp = head.junction_point(); - - // collision check - auto hit = bridge_mesh_intersect(headjp, n, 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(std::make_pair(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)); - double d3d = distance(e1.first, e2.first); - return d2d < 2 * m_cfg.base_radius_mm - && d3d < m_cfg.max_bridge_length_mm; - }; - - m_pillar_clusters = cluster(ground_head_indices, pointfn, predicate, - m_cfg.max_bridges_on_pillar); -} - -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 - // for another head with a full pillar. Also when there are two - // 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; - long lcid = cluster_centroid( - cl, [&points](size_t idx) { return points.row(long(idx)); }, - [thr](const Vec3d &p1, const Vec3d &p2) { - thr(); - return distance(Vec2d(p1(X), p1(Y)), Vec2d(p2(X), p2(Y))); - }); - - 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); - } - - // 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); - } - } - } -} - -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. - - // First we want to index the available pillars. The best is to connect - // these points to the available pillars - - auto routedown = [this](Head& head, const Vec3d& dir, double dist) - { - head.transform(); - Vec3d endp = head.junction_point() + dist * 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); - }; - - std::vector modelpillars; - ccr::SpinningMutex mutex; - - auto onmodelfn = - [this, routedown, &modelpillars, &mutex] - (const std::pair &el, size_t) - { - m_thr(); - unsigned idx = el.first; - EigenMesh3D::hit_result hit = el.second; - - auto& head = m_builder.head(idx); - Vec3d hjp = head.junction_point(); - - // ///////////////////////////////////////////////////////////////// - // Search nearby pillar - // ///////////////////////////////////////////////////////////////// - - if(search_pillar_and_connect(head)) { head.transform(); return; } - - // ///////////////////////////////////////////////////////////////// - // Try straight path - // ///////////////////////////////////////////////////////////////// - - // Cannot connect to nearby pillar. We will try to search for - // a route to the ground. - - double t = bridge_mesh_intersect(hjp, head.dir, head.r_back_mm); - double d = 0, tdown = 0; - Vec3d dirdown(0.0, 0.0, -1.0); - - t = std::min(t, m_cfg.max_bridge_length_mm); - - while(d < t && !std::isinf(tdown = bridge_mesh_intersect( - hjp + d*head.dir, - dirdown, head.r_back_mm))) { - d += head.r_back_mm; - } - - if(std::isinf(tdown)) { // we heave found a route to the ground - routedown(head, head.dir, d); return; - } - - // ///////////////////////////////////////////////////////////////// - // Optimize bridge direction - // ///////////////////////////////////////////////////////////////// - - // Straight path failed so we will try to search for a suitable - // direction out of the cavity. - - // Get the spherical representation of the normal. its easier to - // work with. - double z = head.dir(Z); - double r = 1.0; // for normalized vector - double polar = std::acos(z / r); - double azimuth = std::atan2(head.dir(Y), head.dir(X)); - - using libnest2d::opt::bound; - using libnest2d::opt::initvals; - using libnest2d::opt::GeneticOptimizer; - using libnest2d::opt::StopCriteria; - - 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); - solver.seed(0); // we want deterministic behavior - - double r_back = head.r_back_mm; - - auto oresult = solver.optimize_max( - [this, hjp, r_back](double plr, double azm) - { - Vec3d n = Vec3d(std::cos(azm) * std::sin(plr), - std::sin(azm) * std::sin(plr), - std::cos(plr)).normalized(); - return bridge_mesh_intersect(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 - ); - - d = 0; t = oresult.score; - - polar = std::get<0>(oresult.optimum); - azimuth = std::get<1>(oresult.optimum); - Vec3d bridgedir = Vec3d(std::cos(azimuth) * std::sin(polar), - std::sin(azimuth) * std::sin(polar), - std::cos(polar)).normalized(); - - t = std::min(t, m_cfg.max_bridge_length_mm); - - while(d < t && !std::isinf(tdown = bridge_mesh_intersect( - hjp + d*bridgedir, - dirdown, - head.r_back_mm))) { - d += head.r_back_mm; - } - - if(std::isinf(tdown)) { // we heave found a route to the ground - routedown(head, bridgedir, d); return; - } - - // ///////////////////////////////////////////////////////////////// - // Route to model body - // ///////////////////////////////////////////////////////////////// - - double zangle = std::asin(hit.direction()(Z)); - zangle = std::max(zangle, PI/4); - double h = std::sin(zangle) * head.fullwidth(); - - // 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) { - Vec3d endp{hjp(X), hjp(Y), hjp(Z) - hit.distance() + h}; - auto center_hit = m_mesh.query_ray_hit(hjp, dirdown); - - double hitdiff = center_hit.distance() - hit.distance(); - 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); - Pillar &pill = m_builder.pillar(pillar_id); - - Vec3d taildir = endp - hitp; - double dist = distance(endp, hitp) + m_cfg.head_penetration_mm; - double w = dist - 2 * head.r_pin_mm - head.r_back_mm; - - if (w < 0.) { - BOOST_LOG_TRIVIAL(error) << "Pinhead width is negative!"; - w = 0.; - } - - Head tailhead(head.r_back_mm, - head.r_pin_mm, - w, - m_cfg.head_penetration_mm, - taildir, - hitp); - - tailhead.transform(); - pill.base = tailhead.mesh; - - // Experimental: add the pillar to the index for cascading - std::lock_guard lk(mutex); - modelpillars.emplace_back(unsigned(pill.id)); - return; - } - - // We have failed to route this head. - BOOST_LOG_TRIVIAL(warning) - << "Failed to route model facing support point." - << " ID: " << idx; - head.invalidate(); - }; - - ccr::enumerate(m_iheads_onmodel.begin(), m_iheads_onmodel.end(), onmodelfn); - - for(auto pillid : modelpillars) { - auto& pillar = m_builder.pillar(pillid); - m_pillar_index.insert(pillar.endpoint(), pillid); - } -} - -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 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 - // be connected multiple times this is ensured by the 'pairs' set which - // remembers the processed pillar pairs - auto cascadefn = - [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; - - // Query all remaining points within reach - auto qres = m_pillar_index.query([qp, d](const PointIndexEl& e){ - return distance(e.first, qp) < 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(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. - // - // 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; - else if (pillar().links < 2 && pillar().height > H2) { - // Not enough neighbors to support this pillar - needpillars = 2; - } else if (pillar().links < 1 && pillar().height > H1) { - // 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 canplace(needpillars, false); - std::vector 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]); - n++) - { - double a = alpha + n * PI / 3; - Vec3d s = sp; - s(X) += std::cos(a) * r; - s(Y) += std::sin(a) * r; - spts[n] = s; - - // Check the path vertically down - auto hr = bridge_mesh_intersect(s, {0, 0, -1}, 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 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); - - if (interconnect(pillar(), p)) { - Pillar &pp = m_builder.pillar(m_builder.add_pillar(p)); - m_pillar_index.insert(pp.endpoint(), unsigned(pp.id)); - - m_builder.add_junction(s, pillar().r); - double t = bridge_mesh_intersect(pillarsp, - dirv(pillarsp, s), - pillar().r); - 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); - - newpills.emplace_back(pp.id); - m_builder.increment_links(pillar()); - m_builder.increment_links(pp); - } - } - - if(!newpills.empty()) { - for(auto it = newpills.begin(), nx = std::next(it); - nx != newpills.end(); ++it, ++nx) { - const Pillar& itpll = m_builder.pillar(*it); - const Pillar& nxpll = m_builder.pillar(*nx); - if(interconnect(itpll, nxpll)) { - m_builder.increment_links(itpll); - 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(); - Vec3d n = m_support_nmls.row(i); // mesh outward normal - Vec3d sp = sph - n * HWIDTH_MM; // stick head start point - - Vec3d dir = {0, 0, -1}; - Vec3d sj = sp + R * n; // stick start point - - // This is only for checking - double idist = bridge_mesh_intersect(sph, dir, R, true); - double realdist = ray_mesh_intersect(sj, dir); - 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; - } - - bool use_endball = !std::isinf(realdist); - Vec3d ej = sj + (dist + HWIDTH_MM) * dir; - m_builder.add_compact_bridge(sp, ej, n, R, use_endball); - } -} - -} -} diff --git a/src/libslic3r/SLA/SLASupportTreeIGL.cpp b/src/libslic3r/SLA/SLASupportTreeIGL.cpp deleted file mode 100644 index 05f8b19842..0000000000 --- a/src/libslic3r/SLA/SLASupportTreeIGL.cpp +++ /dev/null @@ -1,576 +0,0 @@ -#include -#include "SLA/SLASupportTree.hpp" -#include "SLA/SLABoilerPlate.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 -#include -#include -#include -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include - -#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 -PointIndex::query(std::function fn) const -{ - namespace bgi = boost::geometry::index; - - std::vector ret; - m_impl->m_store.query(bgi::satisfies(fn), std::back_inserter(ret)); - return ret; -} - -std::vector PointIndex::nearest(const Vec3d &el, unsigned k = 1) const -{ - namespace bgi = boost::geometry::index; - std::vector 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 fn) -{ - for(auto& el : m_impl->m_store) fn(el); -} - -void PointIndex::foreach(std::function fn) const -{ - for(const auto &el : m_impl->m_store) fn(el); -} - -/* ************************************************************************** - * BoxIndex implementation - * ************************************************************************** */ - -class BoxIndex::Impl { -public: - using BoostIndex = boost::geometry::index:: - rtree /* ? */>; - - 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 BoxIndex::query(const BoundingBox &qrbb, - BoxIndex::QueryType qt) -{ - namespace bgi = boost::geometry::index; - - std::vector 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 fn) -{ - for(auto& el : m_impl->m_store) fn(el); -} - -/* **************************************************************************** - * EigenMesh3D implementation - * ****************************************************************************/ - -class EigenMesh3D::AABBImpl: public igl::AABB { -public: -#ifdef SLIC3R_SLA_NEEDS_WINDTREE - igl::WindingNumberAABB 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(); - V.block<1, 3>(3 * i + 1, 0) = facet.vertex[1].cast(); - V.block<1, 3>(3 * i + 2, 0) = facet.vertex[2].cast(); - 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::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::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; -} - -#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 pp = p; - Eigen::Matrix 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; - - auto line = Line3D::Through(e1, e2); - double d = line.distance(p); - return std::abs(d) < eps; -} - -template 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 thr, // throw on cancel - const std::vector& pt_indices) -{ - if(points.rows() == 0 || mesh.V().rows() == 0 || mesh.F().rows() == 0) - return {}; - - std::vector 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 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 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( - const Index3D &, const PointIndexEl &)> qfn) -{ - using Elems = std::vector; - - // Recursive function for visiting all the points in a given distance to - // each other - std::function group = - [&sindex, &group, max_points, qfn](Elems& pts, Elems& cluster) - { - for(auto& p : pts) { - std::vector 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 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 distance_queryfn(const Index3D& sindex, - const PointIndexEl& p, - double dist, - unsigned max_points) -{ - std::vector 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& indices, - std::function 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& indices, - std::function pointfn, - std::function 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 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/SpatIndex.cpp b/src/libslic3r/SLA/SpatIndex.cpp new file mode 100644 index 0000000000..d95ba55bee --- /dev/null +++ b/src/libslic3r/SLA/SpatIndex.cpp @@ -0,0 +1,161 @@ +#include "SpatIndex.hpp" + +// for concave hull merging decisions +#include + +#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 +PointIndex::query(std::function fn) const +{ + namespace bgi = boost::geometry::index; + + std::vector ret; + m_impl->m_store.query(bgi::satisfies(fn), std::back_inserter(ret)); + return ret; +} + +std::vector PointIndex::nearest(const Vec3d &el, unsigned k = 1) const +{ + namespace bgi = boost::geometry::index; + std::vector 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 fn) +{ + for(auto& el : m_impl->m_store) fn(el); +} + +void PointIndex::foreach(std::function fn) const +{ + for(const auto &el : m_impl->m_store) fn(el); +} + +/* ************************************************************************** + * BoxIndex implementation + * ************************************************************************** */ + +class BoxIndex::Impl { +public: + using BoostIndex = boost::geometry::index:: + rtree /* ? */>; + + 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 BoxIndex::query(const BoundingBox &qrbb, + BoxIndex::QueryType qt) +{ + namespace bgi = boost::geometry::index; + + std::vector 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 fn) +{ + for(auto& el : m_impl->m_store) fn(el); +} + +}} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/SLASpatIndex.hpp b/src/libslic3r/SLA/SpatIndex.hpp similarity index 95% rename from src/libslic3r/SLA/SLASpatIndex.hpp rename to src/libslic3r/SLA/SpatIndex.hpp index 20b6fcd589..ef059d3ae6 100644 --- a/src/libslic3r/SLA/SLASpatIndex.hpp +++ b/src/libslic3r/SLA/SpatIndex.hpp @@ -1,5 +1,5 @@ -#ifndef SPATINDEX_HPP -#define SPATINDEX_HPP +#ifndef SLA_SPATINDEX_HPP +#define SLA_SPATINDEX_HPP #include #include @@ -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 new file mode 100644 index 0000000000..71849a3643 --- /dev/null +++ b/src/libslic3r/SLA/SupportPoint.hpp @@ -0,0 +1,67 @@ +#ifndef SLA_SUPPORTPOINT_HPP +#define SLA_SUPPORTPOINT_HPP + +#include + +namespace Slic3r { namespace sla { + +// An enum to keep track of where the current points on the ModelObject came from. +enum class PointsStatus { + NoPoints, // No points were generated so far. + Generating, // The autogeneration algorithm triggered, but not yet finished. + AutoGenerated, // Points were autogenerated (i.e. copied from the backend). + UserModified // User has done some edits. +}; + +struct SupportPoint +{ + Vec3f pos; + float head_front_radius; + bool is_new_island; + + SupportPoint() + : pos(Vec3f::Zero()), head_front_radius(0.f), is_new_island(false) + {} + + SupportPoint(float pos_x, + float pos_y, + float pos_z, + float head_radius, + 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 = false) + : pos(position) + , head_front_radius(head_radius) + , is_new_island(new_island) + {} + + SupportPoint(Eigen::Matrix data) + : pos(data(0), data(1), data(2)) + , head_front_radius(data(3)) + , is_new_island(data(4) != 0.f) + {} + + bool operator==(const SupportPoint &sp) const + { + float rdiff = std::abs(head_front_radius - sp.head_front_radius); + return (pos == sp.pos) && rdiff < float(EPSILON) && + is_new_island == sp.is_new_island; + } + + bool operator!=(const SupportPoint &sp) const { return !(sp == (*this)); } + + template void serialize(Archive &ar) + { + ar(pos, head_front_radius, is_new_island); + } +}; + +using SupportPoints = std::vector; + +}} // namespace Slic3r::sla + +#endif // SUPPORTPOINT_HPP diff --git a/src/libslic3r/SLA/SLAAutoSupports.cpp b/src/libslic3r/SLA/SupportPointGenerator.cpp similarity index 55% rename from src/libslic3r/SLA/SLAAutoSupports.cpp rename to src/libslic3r/SLA/SupportPointGenerator.cpp index 65f5901431..8f720339ab 100644 --- a/src/libslic3r/SLA/SLAAutoSupports.cpp +++ b/src/libslic3r/SLA/SupportPointGenerator.cpp @@ -3,22 +3,27 @@ #include -#include "SLAAutoSupports.hpp" +#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 #include namespace Slic3r { namespace sla { -/*float SLAAutoSupports::approximate_geodesic_distance(const Vec3d& p1, const Vec3d& p2, Vec3d& n1, Vec3d& n2) +/*float SupportPointGenerator::approximate_geodesic_distance(const Vec3d& p1, const Vec3d& p2, Vec3d& n1, Vec3d& n2) { n1.normalize(); n2.normalize(); @@ -36,7 +41,7 @@ namespace sla { } -float SLAAutoSupports::get_required_density(float angle) const +float SupportPointGenerator::get_required_density(float angle) const { // calculation would be density_0 * cos(angle). To provide one more degree of freedom, we will scale the angle // to get the user-set density for 45 deg. So it ends up as density_0 * cos(K * angle). @@ -44,69 +49,81 @@ float SLAAutoSupports::get_required_density(float angle) const return std::max(0.f, float(m_config.density_at_horizontal * cos(K*angle))); } -float SLAAutoSupports::distance_limit(float angle) const +float SupportPointGenerator::distance_limit(float angle) const { return 1./(2.4*get_required_density(angle)); }*/ -SLAAutoSupports::SLAAutoSupports(const sla::EigenMesh3D & emesh, - const std::vector &slices, - const std::vector & heights, - const Config & config, - std::function throw_on_cancel, - std::function statusfn) +SupportPointGenerator::SupportPointGenerator( + const sla::IndexedMesh &emesh, + const std::vector &slices, + const std::vector & heights, + const Config & config, + std::function throw_on_cancel, + std::function statusfn) + : SupportPointGenerator(emesh, config, throw_on_cancel, statusfn) +{ + std::random_device rd; + m_rng.seed(rd()); + execute(slices, heights); +} + +SupportPointGenerator::SupportPointGenerator( + const IndexedMesh &emesh, + const SupportPointGenerator::Config &config, + std::function throw_on_cancel, + std::function statusfn) : m_config(config) , m_emesh(emesh) , m_throw_on_cancel(throw_on_cancel) , m_statusfn(statusfn) +{ +} + +void SupportPointGenerator::execute(const std::vector &slices, + const std::vector & heights) { process(slices, heights); project_onto_mesh(m_output); } -void SLAAutoSupports::project_onto_mesh(std::vector& points) const +void SupportPointGenerator::project_onto_mesh(std::vector& points) const { // 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(0, points.size(), 64), - [this, &points](const tbb::blocked_range& 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. - //bool up = igl::ray_mesh_intersect(p.cast(), Vec3f(0., 0., 1.), m_V, m_F, hit_up); - //bool down = igl::ray_mesh_intersect(p.cast(), Vec3f(0., 0., -1.), m_V, m_F, hit_down); + static constexpr size_t gransize = 64; - sla::EigenMesh3D::hit_result hit_up = m_emesh.query_ray_hit(p.cast(), Vec3d(0., 0., 1.)); - sla::EigenMesh3D::hit_result hit_down = m_emesh.query_ray_hit(p.cast(), Vec3d(0., 0., -1.)); + 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(); - bool up = hit_up.face() != -1; - bool down = hit_down.face() != -1; + 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(), Vec3d(0., 0., 1.)); + sla::IndexedMesh::hit_result hit_down = m_emesh.query_ray_hit(p.cast(), Vec3d(0., 0., -1.)); - if (!up && !down) - continue; + bool up = hit_up.is_hit(); + bool down = hit_down.is_hit(); - sla::EigenMesh3D::hit_result& hit = (!down || (hit_up.distance() < hit_down.distance())) ? hit_up : hit_down; - //int fid = hit.face(); - //Vec3f bc(1-hit.u-hit.v, hit.u, hit.v); - //p = (bc(0) * m_V.row(m_F(fid, 0)) + bc(1) * m_V.row(m_F(fid, 1)) + bc(2)*m_V.row(m_F(fid, 2))).cast(); + if (!up && !down) + return; - p = p + (hit.distance() * hit.direction()).cast(); - } - }); + sla::IndexedMesh::hit_result& hit = (!down || (hit_up.distance() < hit_down.distance())) ? hit_up : hit_down; + p = p + (hit.distance() * hit.direction()).cast(); + }, gransize); } -static std::vector make_layers( +static std::vector make_layers( const std::vector& slices, const std::vector& heights, std::function throw_on_cancel) { assert(slices.size() == heights.size()); // Allocate empty layers. - std::vector layers; + std::vector layers; layers.reserve(slices.size()); for (size_t i = 0; i < slices.size(); ++ i) layers.emplace_back(i, heights[i]); @@ -115,89 +132,108 @@ static std::vector make_layers( //const float pixel_area = pow(wxGetApp().preset_bundle->project_config.option("display_width") / wxGetApp().preset_bundle->project_config.option("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(0, layers.size(), 32), - [&layers, &slices, &heights, pixel_area, throw_on_cancel](const tbb::blocked_range& 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(); - SLAAutoSupports::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(), 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(island.contour.centroid()), area, height); + } + }, 32 /*gransize*/); // Calculate overlap of successive layers. Link overlapping islands. - tbb::parallel_for(tbb::blocked_range(1, layers.size(), 8), - [&layers, &heights, throw_on_cancel](const tbb::blocked_range& 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(); - SLAAutoSupports::MyLayer &layer_above = layers[layer_id]; - SLAAutoSupports::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 (SLAAutoSupports::Structure &top : layer_above.islands) { - for (SLAAutoSupports::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> 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(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(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> 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 &p1, const std::pair &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; } -void SLAAutoSupports::process(const std::vector& slices, const std::vector& heights) +void SupportPointGenerator::process(const std::vector& slices, const std::vector& heights) { -#ifdef SLA_AUTOSUPPORTS_DEBUG +#ifdef SLA_SUPPORTPOINTGEN_DEBUG std::vector> islands; -#endif /* SLA_AUTOSUPPORTS_DEBUG */ +#endif /* SLA_SUPPORTPOINTGEN_DEBUG */ - std::vector layers = make_layers(slices, heights, m_throw_on_cancel); + std::vector layers = make_layers(slices, heights, m_throw_on_cancel); PointGrid3D point_grid; point_grid.cell_size = Vec3f(10.f, 10.f, 10.f); @@ -206,8 +242,8 @@ void SLAAutoSupports::process(const std::vector& slices, const std:: double status = 0; for (unsigned int layer_id = 0; layer_id < layers.size(); ++ layer_id) { - SLAAutoSupports::MyLayer *layer_top = &layers[layer_id]; - SLAAutoSupports::MyLayer *layer_bottom = (layer_id > 0) ? &layers[layer_id - 1] : nullptr; + SupportPointGenerator::MyLayer *layer_top = &layers[layer_id]; + SupportPointGenerator::MyLayer *layer_bottom = (layer_id > 0) ? &layers[layer_id - 1] : nullptr; std::vector support_force_bottom; if (layer_bottom != nullptr) { support_force_bottom.assign(layer_bottom->islands.size(), 0.f); @@ -241,21 +277,9 @@ void SLAAutoSupports::process(const std::vector& slices, const std:: // 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(); @@ -263,13 +287,52 @@ void SLAAutoSupports::process(const std::vector& slices, const std:: status += increment; m_statusfn(int(std::round(status))); -#ifdef SLA_AUTOSUPPORTS_DEBUG +#ifdef SLA_SUPPORTPOINTGEN_DEBUG /*std::string layer_num_str = std::string((i<10 ? "0" : "")) + std::string((i<100 ? "0" : "")) + std::to_string(i); output_expolygons(expolys_top, "top" + layer_num_str + ".svg"); output_expolygons(diff, "diff" + layer_num_str + ".svg"); if (!islands.empty()) output_expolygons(islands, "islands" + layer_num_str + ".svg");*/ -#endif /* SLA_AUTOSUPPORTS_DEBUG */ +#endif /* SLA_SUPPORTPOINTGEN_DEBUG */ + } +} + +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); } } @@ -282,16 +345,16 @@ std::vector sample_expolygon(const ExPolygon &expoly, float samples_per_m if (! triangles.empty()) { // Calculate area of each triangle. - std::vector areas; - areas.reserve(triangles.size() / 3); + auto areas = reserve_vector(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)); @@ -301,28 +364,62 @@ std::vector sample_expolygon(const ExPolygon &expoly, float samples_per_m double r = random_triangle(rng); size_t idx_triangle = std::min(std::upper_bound(areas.begin(), areas.end(), (float)r) - areas.begin(), areas.size() - 1) * 3; // Select a random point on the triangle. - double u = float(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 sample_expolygon(const ExPolygons &expolys, float samples_per_mm2, std::mt19937 &rng) +{ + std::vector 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 &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); + for (size_t i = 0; i < pts.size(); ++ i) + out.emplace_back(unscale(pts[i].x()), + unscale(pts[i].y())); + } +} + std::vector sample_expolygon_with_boundary(const ExPolygon &expoly, float samples_per_mm2, float samples_per_mm_boundary, std::mt19937 &rng) { std::vector out = sample_expolygon(expoly, samples_per_mm2, rng); - double point_stepping_scaled = scale_(1.f) / samples_per_mm_boundary; - 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); - for (size_t i = 0; i < pts.size(); ++ i) - out.emplace_back(unscale(pts[i].x()), unscale(pts[i].y())); - } + sample_expolygon_boundary(expoly, samples_per_mm_boundary, out, rng); return out; } @@ -344,17 +441,17 @@ static inline std::vector poisson_disk_from_samples(const std::vector raw_samples_sorted; - RawSample sample; - for (const Vec2f &pt : raw_samples) { - sample.coord = pt; - sample.cell_id = ((pt - corner_min) / radius).cast(); - raw_samples_sorted.emplace_back(sample); - } + + auto raw_samples_sorted = reserve_vector(raw_samples.size()); + for (const Vec2f &pt : raw_samples) + raw_samples_sorted.emplace_back(pt, ((pt - corner_min) / radius).cast()); + 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()); }); @@ -449,11 +546,26 @@ static inline std::vector poisson_disk_from_samples(const std::vector 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; @@ -470,14 +582,18 @@ void SLAAutoSupports::uniformly_cover(const ExPolygons& islands, Structure& stru 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::random_device rd; - std::mt19937 rng(rd()); - std::vector raw_samples = sample_expolygon_with_boundary(islands, samples_per_mm2, 5.f / poisson_radius, rng); + + std::vector 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 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; @@ -488,7 +604,7 @@ void SLAAutoSupports::uniformly_cover(const ExPolygons& islands, Structure& stru min_spacing = std::max(m_config.minimal_distance, min_spacing * coeff); } -#ifdef SLA_AUTOSUPPORTS_DEBUG +#ifdef SLA_SUPPORTPOINTGEN_DEBUG { static int irun = 0; Slic3r::SVG svg(debug_out_path("SLA_supports-uniformly_cover-%d.svg", irun ++), get_extents(islands)); @@ -503,33 +619,31 @@ void SLAAutoSupports::uniformly_cover(const ExPolygons& islands, Structure& stru // assert(! poisson_samples.empty()); if (poisson_samples_target < poisson_samples.size()) { - std::shuffle(poisson_samples.begin(), poisson_samples.end(), rng); + std::shuffle(poisson_samples.begin(), poisson_samples.end(), m_rng); 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 &pts, double gnd_lvl, double tolerance) + +void remove_bottom_points(std::vector &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 pts.erase(endit, pts.end()); } -#ifdef SLA_AUTOSUPPORTS_DEBUG -void SLAAutoSupports::output_structures(const std::vector& structures) +#ifdef SLA_SUPPORTPOINTGEN_DEBUG +void SupportPointGenerator::output_structures(const std::vector& structures) { for (unsigned int i=0 ; i& structures } } -void SLAAutoSupports::output_expolygons(const ExPolygons& expolys, const std::string &filename) +void SupportPointGenerator::output_expolygons(const ExPolygons& expolys, const std::string &filename) { BoundingBox bb(Point(-30000000, -30000000), Point(30000000, 30000000)); Slic3r::SVG svg_cummulative(filename, bb); diff --git a/src/libslic3r/SLA/SLAAutoSupports.hpp b/src/libslic3r/SLA/SupportPointGenerator.hpp similarity index 58% rename from src/libslic3r/SLA/SLAAutoSupports.hpp rename to src/libslic3r/SLA/SupportPointGenerator.hpp index d2f50f0a46..ebb8cc373f 100644 --- a/src/libslic3r/SLA/SLAAutoSupports.hpp +++ b/src/libslic3r/SLA/SupportPointGenerator.hpp @@ -1,72 +1,79 @@ -#ifndef SLAAUTOSUPPORTS_HPP_ -#define SLAAUTOSUPPORTS_HPP_ +#ifndef SLA_SUPPORTPOINTGENERATOR_HPP +#define SLA_SUPPORTPOINTGENERATOR_HPP +#include + +#include +#include + +#include #include #include -#include -#include #include -// #define SLA_AUTOSUPPORTS_DEBUG +// #define SLA_SUPPORTPOINTGEN_DEBUG -namespace Slic3r { -namespace sla { +namespace Slic3r { namespace sla { -class SLAAutoSupports { +class SupportPointGenerator { public: struct Config { - 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) - inline float tear_pressure() const { return 1.f; } // pressure that the display exerts (the force unit per mm2) - }; + float density_relative {1.f}; + float minimal_distance {1.f}; + float head_diameter {0.4f}; - SLAAutoSupports(const sla::EigenMesh3D& emesh, const std::vector& slices, - const std::vector& heights, const Config& config, std::function throw_on_cancel, std::function statusfn); + // 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 IndexedMesh& emesh, const std::vector& slices, + const std::vector& heights, const Config& config, std::function throw_on_cancel, std::function statusfn); + + SupportPointGenerator(const IndexedMesh& emesh, const Config& config, std::function throw_on_cancel, std::function statusfn); + + const std::vector& output() const { return m_output; } + std::vector& output() { return m_output; } + + struct MyLayer; - const std::vector& output() { return m_output; } - - struct MyLayer; - struct Structure { - Structure(MyLayer &layer, const ExPolygon& poly, const BoundingBox &bbox, const Vec2f ¢roid, float area, float h) : - layer(&layer), polygon(&poly), bbox(bbox), centroid(centroid), area(area), height(h) -#ifdef SLA_AUTOSUPPORTS_DEBUG + Structure(MyLayer &layer, const ExPolygon& poly, const BoundingBox &bbox, const Vec2f ¢roid, 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::system_clock::now().time_since_epoch())) -#endif /* SLA_AUTOSUPPORTS_DEBUG */ - {} +#endif /* SLA_SUPPORTPOINTGEN_DEBUG */ + {} MyLayer *layer; const ExPolygon* polygon = nullptr; 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; float supports_force_inherited = 0.f; float supports_force_total() const { return this->supports_force_this_layer + this->supports_force_inherited; } -#ifdef SLA_AUTOSUPPORTS_DEBUG +#ifdef SLA_SUPPORTPOINTGEN_DEBUG std::chrono::milliseconds unique_id; -#endif /* SLA_AUTOSUPPORTS_DEBUG */ - +#endif /* SLA_SUPPORTPOINTGEN_DEBUG */ + struct Link { - Link(Structure *island, float overlap_area) : island(island), overlap_area(overlap_area) {} + Link(Structure *island, float overlap_area) : island(island), overlap_area(overlap_area) {} Structure *island; float overlap_area; }; #ifdef NDEBUG - // In release mode, use the optimized container. + // In release mode, use the optimized container. boost::container::small_vector islands_above; boost::container::small_vector islands_below; #else - // In debug mode, use the standard vector, which is well handled by debugger visualizer. - std::vector islands_above; - std::vector islands_below; + // In debug mode, use the standard vector, which is well handled by debugger visualizer. + std::vector islands_above; + std::vector islands_below; #endif // Overhangs, that are dangling considerably. ExPolygons dangling_areas; @@ -74,16 +81,16 @@ public: ExPolygons overhangs; // Overhangs, where the surface must slope. ExPolygons overhangs_slopes; - float overhangs_area; - + float overhangs_area = 0.f; + bool overlaps(const Structure &rhs) const { return this->bbox.overlap(rhs.bbox) && (this->polygon->overlaps(*rhs.polygon) || rhs.polygon->overlaps(*this->polygon)); } float overlap_area(const Structure &rhs) const { double out = 0.; if (this->bbox.overlap(rhs.bbox)) { - Polygons polys = intersection(to_polygons(*this->polygon), to_polygons(*rhs.polygon), false); - for (const Polygon &poly : polys) + Polygons polys = intersection(to_polygons(*this->polygon), to_polygons(*rhs.polygon), false); + for (const Polygon &poly : polys) out += poly.area(); } return float(out); @@ -96,13 +103,13 @@ public: } Polygons polygons_below() const { size_t cnt = 0; - for (const Link &below : this->islands_below) + for (const Link &below : this->islands_below) cnt += 1 + below.island->polygon->holes.size(); Polygons out; out.reserve(cnt); - for (const Link &below : this->islands_below) { + for (const Link &below : this->islands_below) { out.emplace_back(below.island->polygon->contour); - append(out, below.island->polygon->holes); + append(out, below.island->polygon->holes); } return out; } @@ -116,19 +123,19 @@ public: // Positive deficit of the supports. If negative, this area is well supported. If positive, more supports need to be added. float support_force_deficit(const float tear_pressure) const { return this->area * tear_pressure - this->supports_force_total(); } }; - + struct MyLayer { - MyLayer(const size_t layer_id, coordf_t print_z) : layer_id(layer_id), print_z(print_z) {} + MyLayer(const size_t layer_id, coordf_t print_z) : layer_id(layer_id), print_z(print_z) {} size_t layer_id; coordf_t print_z; std::vector islands; }; - + struct RichSupportPoint { Vec3f position; Structure *island; }; - + struct PointGrid3D { struct GridHash { std::size_t operator()(const Vec3i &cell_id) const { @@ -136,25 +143,25 @@ public: } }; typedef std::unordered_multimap Grid; - + Vec3f cell_size; Grid grid; - + Vec3i cell_id(const Vec3f &pos) { return Vec3i(int(floor(pos.x() / cell_size.x())), int(floor(pos.y() / cell_size.y())), int(floor(pos.z() / cell_size.z()))); } - + void insert(const Vec2f &pos, Structure *island) { RichSupportPoint pt; - pt.position = Vec3f(pos.x(), pos.y(), float(island->layer->print_z)); + pt.position = Vec3f(pos.x(), pos.y(), float(island->layer->print_z)); pt.island = island; 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 it_pair = grid.equal_range(cell); if (collides_with(pos3d, radius, it_pair.first, it_pair.second)) @@ -170,41 +177,57 @@ public: } return false; } - + private: bool collides_with(const Vec3f &pos, float radius, Grid::const_iterator it_begin, Grid::const_iterator it_end) { for (Grid::const_iterator it = it_begin; it != it_end; ++ it) { - float dist2 = (it->second.position - pos).squaredNorm(); + float dist2 = (it->second.position - pos).squaredNorm(); if (dist2 < radius * radius) return true; } return false; } }; + + void execute(const std::vector &slices, + const std::vector & heights); + + void seed(std::mt19937::result_type s) { m_rng.seed(s); } +private: + std::vector m_output; + + SupportPointGenerator::Config m_config; + + void process(const std::vector& slices, const std::vector& heights); + +public: + enum IslandCoverageFlags : uint8_t { icfNone = 0x0, icfIsNew = 0x1, icfWithBoundary = 0x2 }; private: - std::vector m_output; - SLAAutoSupports::Config m_config; + void uniformly_cover(const ExPolygons& islands, Structure& structure, float deficit, PointGrid3D &grid3d, IslandCoverageFlags flags = icfNone); - void process(const std::vector& slices, const std::vector& heights); - void uniformly_cover(const ExPolygons& islands, Structure& structure, PointGrid3D &grid3d, bool is_new_island = false, bool just_one = false); - void project_onto_mesh(std::vector& points) const; + void add_support_points(Structure& structure, PointGrid3D &grid3d); -#ifdef SLA_AUTOSUPPORTS_DEBUG + void project_onto_mesh(std::vector& points) const; + +#ifdef SLA_SUPPORTPOINTGEN_DEBUG static void output_expolygons(const ExPolygons& expolys, const std::string &filename); static void output_structures(const std::vector &structures); -#endif // SLA_AUTOSUPPORTS_DEBUG - - const sla::EigenMesh3D& m_emesh; +#endif // SLA_SUPPORTPOINTGEN_DEBUG + + const IndexedMesh& m_emesh; std::function m_throw_on_cancel; std::function m_statusfn; + + std::mt19937 m_rng; }; -void remove_bottom_points(std::vector &pts, double gnd_lvl, double tolerance); +void remove_bottom_points(std::vector &pts, float lvl); -} // namespace sla -} // namespace Slic3r +std::vector 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 &out, std::mt19937 &rng); +}} // namespace Slic3r::sla -#endif // SLAAUTOSUPPORTS_HPP_ +#endif // SUPPORTPOINTGENERATOR_HPP diff --git a/src/libslic3r/SLA/SLASupportTree.cpp b/src/libslic3r/SLA/SupportTree.cpp similarity index 73% rename from src/libslic3r/SLA/SLASupportTree.cpp rename to src/libslic3r/SLA/SupportTree.cpp index fea8bf731c..1bb4cfab76 100644 --- a/src/libslic3r/SLA/SLASupportTree.cpp +++ b/src/libslic3r/SLA/SupportTree.cpp @@ -4,10 +4,10 @@ */ #include -#include "SLASupportTree.hpp" -#include "SLABoilerPlate.hpp" -#include "SLASpatIndex.hpp" -#include "SLASupportTreeBuilder.hpp" +#include +#include +#include +#include #include #include @@ -28,21 +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; -const unsigned SupportConfig::max_bridges_on_pillar = 3; - void SupportTree::retrieve_full_mesh(TriangleMesh &outmesh) const { outmesh.merge(retrieve_mesh(MeshType::Support)); outmesh.merge(retrieve_mesh(MeshType::Pad)); @@ -61,7 +46,7 @@ std::vector SupportTree::slice( slices.emplace_back(); TriangleMeshSlicer sup_slicer(&sup_mesh); - sup_slicer.slice(grid, cr, &slices.back(), ctl().cancelfn); + sup_slicer.slice(grid, SlicingMode::Regular, cr, &slices.back(), ctl().cancelfn); } if (!pad_mesh.empty()) { @@ -75,7 +60,7 @@ std::vector SupportTree::slice( std::copy(grid.begin(), maxzit, std::back_inserter(padgrid)); TriangleMeshSlicer pad_slicer(&pad_mesh); - pad_slicer.slice(padgrid, cr, &slices.back(), ctl().cancelfn); + pad_slicer.slice(padgrid, SlicingMode::Regular, cr, &slices.back(), ctl().cancelfn); } size_t len = grid.size(); @@ -104,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/SLASupportTree.hpp b/src/libslic3r/SLA/SupportTree.hpp similarity index 72% rename from src/libslic3r/SLA/SLASupportTree.hpp rename to src/libslic3r/SLA/SupportTree.hpp index 322b29251e..4be90161d5 100644 --- a/src/libslic3r/SLA/SLASupportTree.hpp +++ b/src/libslic3r/SLA/SupportTree.hpp @@ -1,12 +1,14 @@ -#ifndef SLASUPPORTTREE_HPP -#define SLASUPPORTTREE_HPP +#ifndef SLA_SUPPORTTREE_HPP +#define SLA_SUPPORTTREE_HPP #include #include #include -#include "SLACommon.hpp" -#include "SLAPad.hpp" +#include +#include +#include +#include namespace Slic3r { @@ -29,7 +31,7 @@ enum class PillarConnectionMode dynamic }; -struct SupportConfig +struct SupportTreeConfig { bool enabled = true; @@ -42,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; @@ -80,6 +84,8 @@ struct SupportConfig // body. This is only useful when elevation is set to zero. double pillar_base_safety_distance_mm = 0.5; + unsigned max_bridges_on_pillar = 3; + double head_fullwidth() const { return 2 * head_front_radius_mm + head_width_mm + 2 * head_back_radius_mm - head_penetration_mm; @@ -90,57 +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 unsigned max_bridges_on_pillar; + 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 tree_cfg {std::in_place_t{}}; // fill up +// std::optional pad_cfg; +//}; + enum class MeshType { Support, Pad }; -/// A Control structure for the support calculation. Consists of the status -/// indicator callback and the stop condition predicate. -struct JobController -{ - using StatusFn = std::function; - using StopCond = std::function; - using CancelFn = std::function; - - // This will signal the status of the calculation to the front-end - StatusFn statuscb = [](unsigned, const std::string&){}; - - // Returns true if the calculation should be aborted. - StopCond stopcondition = [](){ return false; }; - - // Similar to cancel callback. This should check the stop condition and - // if true, throw an appropriate exception. (TriangleMeshSlicer needs this) - // consider it a hard abort. stopcondition is permits the algorithm to - // terminate itself - CancelFn cancelfn = [](){}; -}; - 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 new file mode 100644 index 0000000000..daa01ef24d --- /dev/null +++ b/src/libslic3r/SLA/SupportTreeBuilder.cpp @@ -0,0 +1,223 @@ +#define NOMINMAX + +#include +#include +#include +#include + +namespace Slic3r { +namespace sla { + +Head::Head(double r_big_mm, + double r_small_mm, + double length_mm, + double penetration, + const Vec3d &direction, + 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) +{ +} + +Pad::Pad(const TriangleMesh &support_mesh, + const ExPolygons & model_contours, + double ground_level, + const PadConfig & pcfg, + ThrowOnCancel thr) + : cfg(pcfg) + , zlevel(ground_level + pcfg.full_height() - pcfg.required_elevation()) +{ + thr(); + + ExPolygons sup_contours; + + float zstart = float(zlevel); + float zend = zstart + float(pcfg.full_height() + EPSILON); + + pad_blueprint(support_mesh, sup_contours, grid(zstart, zend, 0.1f), thr); + create_pad(sup_contours, model_contours, tmesh, pcfg); + + tmesh.translate(0, 0, float(zlevel)); + if (!tmesh.empty()) tmesh.require_shared_vertices(); +} + +const TriangleMesh &SupportTreeBuilder::add_pad(const ExPolygons &modelbase, + const PadConfig & cfg) +{ + m_pad = Pad{merged_mesh(), modelbase, ground_level, cfg, ctl().cancelfn}; + return m_pad.tmesh; +} + +SupportTreeBuilder::SupportTreeBuilder(SupportTreeBuilder &&o) + : m_heads(std::move(o.m_heads)) + , m_head_indices{std::move(o.m_head_indices)} + , m_pillars{std::move(o.m_pillars)} + , m_bridges{std::move(o.m_bridges)} + , m_crossbridges{std::move(o.m_crossbridges)} + , m_pad{std::move(o.m_pad)} + , m_meshcache{std::move(o.m_meshcache)} + , m_meshcache_valid{o.m_meshcache_valid} + , m_model_height{o.m_model_height} + , ground_level{o.ground_level} +{} + +SupportTreeBuilder::SupportTreeBuilder(const SupportTreeBuilder &o) + : m_heads(o.m_heads) + , m_head_indices{o.m_head_indices} + , m_pillars{o.m_pillars} + , m_bridges{o.m_bridges} + , m_crossbridges{o.m_crossbridges} + , m_pad{o.m_pad} + , m_meshcache{o.m_meshcache} + , m_meshcache_valid{o.m_meshcache_valid} + , m_model_height{o.m_model_height} + , ground_level{o.ground_level} +{} + +SupportTreeBuilder &SupportTreeBuilder::operator=(SupportTreeBuilder &&o) +{ + m_heads = std::move(o.m_heads); + m_head_indices = std::move(o.m_head_indices); + m_pillars = std::move(o.m_pillars); + m_bridges = std::move(o.m_bridges); + m_crossbridges = std::move(o.m_crossbridges); + m_pad = std::move(o.m_pad); + m_meshcache = std::move(o.m_meshcache); + m_meshcache_valid = o.m_meshcache_valid; + m_model_height = o.m_model_height; + ground_level = o.ground_level; + return *this; +} + +SupportTreeBuilder &SupportTreeBuilder::operator=(const SupportTreeBuilder &o) +{ + m_heads = o.m_heads; + m_head_indices = o.m_head_indices; + m_pillars = o.m_pillars; + m_bridges = o.m_bridges; + m_crossbridges = o.m_crossbridges; + m_pad = o.m_pad; + m_meshcache = o.m_meshcache; + m_meshcache_valid = o.m_meshcache_valid; + m_model_height = o.m_model_height; + ground_level = o.ground_level; + return *this; +} + +void SupportTreeBuilder::add_pillar_base(long pid, double baseheight, double radius) +{ + std::lock_guard 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; + + Contour3D merged; + + for (auto &head : m_heads) { + if (ctl().stopcondition()) break; + if (head.is_valid()) merged.merge(get_mesh(head, steps)); + } + + for (auto &pill : m_pillars) { + if (ctl().stopcondition()) break; + merged.merge(get_mesh(pill, steps)); + } + + for (auto &pedest : m_pedestals) { + if (ctl().stopcondition()) break; + merged.merge(get_mesh(pedest, steps)); + } + + for (auto &j : m_junctions) { + if (ctl().stopcondition()) break; + merged.merge(get_mesh(j, steps)); + } + + for (auto &bs : m_bridges) { + if (ctl().stopcondition()) break; + merged.merge(get_mesh(bs, steps)); + } + + for (auto &bs : m_crossbridges) { + if (ctl().stopcondition()) break; + 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(); + return m_meshcache; + } + + m_meshcache = to_triangle_mesh(merged); + + // The mesh will be passed by const-pointer to TriangleMeshSlicer, + // which will need this. + if (!m_meshcache.empty()) m_meshcache.require_shared_vertices(); + + BoundingBoxf3 &&bb = m_meshcache.bounding_box(); + m_model_height = bb.max(Z) - bb.min(Z); + + m_meshcache_valid = true; + return m_meshcache; +} + +double SupportTreeBuilder::full_height() const +{ + if (merged_mesh().empty() && !pad().empty()) + return pad().cfg.full_height(); + + double h = mesh_height(); + if (!pad().empty()) h += pad().cfg.required_elevation(); + return h; +} + +const TriangleMesh &SupportTreeBuilder::merge_and_cleanup() +{ + // in case the mesh is not generated, it should be... + auto &ret = merged_mesh(); + + // Doing clear() does not garantee to release the memory. + m_heads = {}; + m_head_indices = {}; + m_pillars = {}; + m_junctions = {}; + m_bridges = {}; + + return ret; +} + +const TriangleMesh &SupportTreeBuilder::retrieve_mesh(MeshType meshtype) const +{ + switch(meshtype) { + case MeshType::Support: return merged_mesh(); + case MeshType::Pad: return pad().tmesh; + } + + return m_meshcache; +} + +}} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/SLASupportTreeBuilder.hpp b/src/libslic3r/SLA/SupportTreeBuilder.hpp similarity index 67% rename from src/libslic3r/SLA/SLASupportTreeBuilder.hpp rename to src/libslic3r/SLA/SupportTreeBuilder.hpp index c0d9f04c0f..f29263ca3f 100644 --- a/src/libslic3r/SLA/SLASupportTreeBuilder.hpp +++ b/src/libslic3r/SLA/SupportTreeBuilder.hpp @@ -1,10 +1,10 @@ -#ifndef SUPPORTTREEBUILDER_HPP -#define SUPPORTTREEBUILDER_HPP +#ifndef SLA_SUPPORTTREEBUILDER_HPP +#define SLA_SUPPORTTREEBUILDER_HPP -#include "SLAConcurrency.hpp" -#include "SLABoilerPlate.hpp" -#include "SLASupportTree.hpp" -#include "SLAPad.hpp" +#include +#include +#include +#include #include namespace Slic3r { @@ -49,13 +49,6 @@ namespace sla { * nearby pillar. */ -using Coordf = double; -using Portion = std::tuple; - -inline Portion make_portion(double a, double b) { - return std::make_tuple(a, b); -} - template double distance(const Vec& p) { return std::sqrt(p.transpose() * p); } @@ -65,33 +58,25 @@ template 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, 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; @@ -105,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; - - // 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 @@ -139,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 @@ -174,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 @@ -257,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 m_heads; - std::vector m_head_indices; - std::vector m_pillars; - std::vector m_junctions; - std::vector m_bridges; - std::vector m_crossbridges; - std::vector m_compact_bridges; + std::vector m_heads; + std::vector m_head_indices; + std::vector m_pillars; + std::vector m_junctions; + std::vector m_bridges; + std::vector m_crossbridges; + std::vector m_diffbridges; + std::vector m_pedestals; + std::vector m_anchors; + Pad m_pad; using Mutex = ccr::SpinningMutex; @@ -273,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 - const Bridge& _add_bridge(std::vector &br, Args&&... args) + template + const BridgeT& _add_bridge(std::vector &br, Args&&... args) { std::lock_guard lk(m_mutex); br.emplace_back(std::forward(args)...); @@ -305,7 +269,7 @@ public: return m_heads.back(); } - template long add_pillar(long headid, Args&&... args) + template long add_pillar(long headid, double length) { std::lock_guard lk(m_mutex); if (m_pillars.capacity() < m_heads.size()) @@ -314,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)...); + 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; @@ -325,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 const Anchor& add_anchor(Args&&...args) { std::lock_guard 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)...); + m_anchors.back().id = long(m_junctions.size() - 1); + m_meshcache_valid = false; + return m_anchors.back(); } void increment_bridges(const Pillar& pillar) @@ -370,17 +340,6 @@ public: return pillar.id; } - const Pillar& head_pillar(unsigned headid) const - { - std::lock_guard 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 const Junction& add_junction(Args&&... args) { std::lock_guard lk(m_mutex); @@ -390,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 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; @@ -413,14 +372,10 @@ public: { return _add_bridge(m_crossbridges, std::forward(args)...); } - - template const CompactBridge& add_compact_bridge(Args&&...args) + + template const DiffBridge& add_diffbridge(Args&&... args) { - std::lock_guard lk(m_mutex); - m_compact_bridges.emplace_back(std::forward(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)...); } Head &head(unsigned id) @@ -438,7 +393,7 @@ public: } inline const std::vector &pillars() const { return m_pillars; } - inline const std::vector &heads() const { return m_heads; } + inline const std::vector &heads() const { return m_heads; } inline const std::vector &bridges() const { return m_bridges; } inline const std::vector &crossbridges() const { return m_crossbridges; } @@ -463,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; @@ -487,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 new file mode 100644 index 0000000000..3c39c64e6b --- /dev/null +++ b/src/libslic3r/SLA/SupportTreeBuildsteps.cpp @@ -0,0 +1,1277 @@ +#include + +#include +#include +#include + +namespace Slic3r { +namespace sla { + +using Slic3r::opt::initvals; +using Slic3r::opt::bounds; +using Slic3r::opt::StopCriteria; +using Slic3r::opt::Optimizer; +using Slic3r::opt::AlgNLoptSubplex; +using Slic3r::opt::AlgNLoptGenetic; + +StopCriteria get_criteria(const SupportTreeConfig &cfg) +{ + return StopCriteria{} + .rel_score_diff(cfg.optimizer_rel_score_diff) + .max_iterations(cfg.optimizer_max_iterations); +} + +template +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) + : m_cfg(sm.cfg) + , m_mesh(sm.emesh) + , m_support_pts(sm.pts) + , m_support_nmls(sm.pts.size(), 3) + , m_builder(builder) + , m_points(sm.pts.size(), 3) + , m_thr(builder.ctl().cancelfn) +{ + // 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)); + m_points.row(i)(Y) = double(sp.pos(Y)); + m_points.row(i)(Z) = double(sp.pos(Z)); + ++i; + } +} + +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 { + BEGIN, + FILTER, + PINHEADS, + CLASSIFY, + ROUTING_GROUND, + ROUTING_NONGROUND, + CASCADE_PILLARS, + MERGE_RESULT, + DONE, + ABORT, + NUM_STEPS + //... + }; + + // Collect the algorithm steps into a nice sequence + std::array, 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::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."; + }; + } + + // Let's define a simple automaton that will run our program. + auto progress = [&builder, &pc] () { + static const std::array stepstr { + "Starting", + "Filtering", + "Generate pinheads", + "Classification", + "Routing to ground", + "Routing supports to model surface", + "Interconnecting pillars", + "Merging support mesh", + "Done", + "Abort" + }; + + static const std::array stepstate { + 0, + 10, + 30, + 50, + 60, + 70, + 80, + 99, + 100, + 0 + }; + + if(builder.ctl().stopcondition()) pc = ABORT; + + switch(pc) { + case BEGIN: pc = FILTER; break; + case FILTER: pc = PINHEADS; break; + case PINHEADS: pc = CLASSIFY; break; + case CLASSIFY: pc = ROUTING_GROUND; break; + case ROUTING_GROUND: pc = ROUTING_NONGROUND; break; + case ROUTING_NONGROUND: pc = CASCADE_PILLARS; 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; +} + +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. + + auto& m = m_mesh; + using HitResult = IndexedMesh::hit_result; + + // Hit results + std::array hits; + + struct Rings { + double rpin; + double rback; + Vec3d spin; + Vec3d sback; + PointRing 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::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). + + 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 + // distance is bigger than our pin circle + // diameter, it probably indicates that the + // support point was already inside the + // model, or there is really no space + // around the point. We will assign a zero + // hit distance to these cases which will + // enforce the function return value to be + // an invalid ray with zero hit distance. + // (see min_element at the end) + hit = HitResult(0.0); + } else { + // re-cast the ray from the outside of the + // object. The starting point has an offset + // of 2*safety_distance because the + // original ray has also had an offset + auto q2 = m.query_ray_hit(ps + (q.distance() + 2 * sd) * n, n); + hit = q2; + } + } else + hit = q; + }); + + return min_hit(hits); +} + +IndexedMesh::hit_result SupportTreeBuildsteps::bridge_mesh_intersect( + const Vec3d &src, const Vec3d &dir, double r, double sd) +{ + static const size_t SAMPLES = 8; + PointRing ring{dir}; + + using Hit = IndexedMesh::hit_result; + + // Hit results + std::array hits; + + 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 + 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() + EPSILON) * dir, dir); + } + } else hit = hr; + }); + + return min_hit(hits); +} + +bool SupportTreeBuildsteps::interconnect(const Pillar &pillar, + const Pillar &nextpillar) +{ + // We need to get the starting point of the zig-zag pattern. We have to + // be aware that the two head junctions are at different heights. We + // may start from the lowest junction and call it a day but this + // strategy would leave unconnected a lot of pillar duos where the + // 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) + { + m_builder.add_crossbridge(sj, ej, pillar.r); + was_connected = true; + } + + // double bridging: (crosses) + if(docrosses) { + Vec3d sjback(ej(X), ej(Y), sj(Z)); + Vec3d ejback(sj(X), sj(Y), ej(Z)); + if (sjback(Z) <= slower(Z) && ejback(Z) >= eupper(Z) && + bridge_mesh_distance(sjback, dirv(sjback, ejback), + pillar.r) >= bridge_distance) { + // need to check collision for the cross stick + m_builder.add_crossbridge(sjback, ejback, pillar.r); + was_connected = true; + } + } + + sj.swap(ej); + ej(Z) = sj(Z) + zstep; + } + + return was_connected; +} + +bool SupportTreeBuildsteps::connect_to_nearpillar(const Head &head, + long nearpillar_id) +{ + auto nearpillar = [this, nearpillar_id]() -> const Pillar& { + return m_builder.pillar(nearpillar_id); + }; + + 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 = 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 + 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 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, headjp.z() - bridgestart.z()); + m_builder.add_junction(bridgestart, r); + 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::create_ground_pillar(const Vec3d &hjp, + const Vec3d &sourcedir, + double radius, + long head_id) +{ + 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 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(dir); + polar = PI - m_cfg.bridge_slope; + 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; + } + } + + // 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; + } + } + + 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(m_builder.pillar(pillar_id).endpt, + unsigned(pillar_id)); + + return true; +} + +std::optional 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 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() +{ + // 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()); + m_iheadless.reserve(aliases.size()); + for(auto& a : aliases) { + // 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. + + std::vector 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() // displacement + ); + } + + std::function 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) 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 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::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() +{ +} + +void SupportTreeBuildsteps::classify() +{ + // We should first get the heads that reach the ground directly + 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(); + + 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)); + double d3d = distance(e1.first, e2.first); + return d2d < 2 * m_cfg.base_radius_mm + && d3d < m_cfg.max_bridge_length_mm; + }; + + m_pillar_clusters = cluster(ground_head_indices, pointfn, predicate, + m_cfg.max_bridges_on_pillar); +} + +void SupportTreeBuildsteps::routing_to_ground() +{ + 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 + // for another head with a full pillar. Also when there are two + // 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; + + long lcid = cluster_centroid( + cl, [&points](size_t idx) { return points.row(long(idx)); }, + [thr](const Vec3d &p1, const Vec3d &p2) { + thr(); + return distance(Vec2d(p1(X), p1(Y)), Vec2d(p2(X), p2(Y))); + }); + + assert(lcid >= 0); + unsigned hid = cl[size_t(lcid)]; // Head ID + + cl_centroids.emplace_back(hid); + + Head &h = m_builder.head(hid); + + 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++]; + + 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); + } + } + } + } +} + +bool SupportTreeBuildsteps::connect_to_ground(Head &head, const Vec3d &dir) +{ + auto hjp = head.junction_point(); + 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 * 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; + 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); + + Optimizer 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.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 + 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 <= 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); + double h = std::sin(zangle) * head.fullwidth(); + + // The width of the tail head that we would like to have... + h = std::min(hit.distance() - head.r_back_mm, h); + + // 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); + + double hitdiff = center_hit.distance() - hit.distance(); + Vec3d hitp = std::abs(hitdiff) < 2*head.r_back_mm? + center_hit.position() : hit.position(); + + 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 = (hitp - endp).norm() + m_cfg.head_penetration_mm; + double w = dist - 2 * head.r_pin_mm - head.r_back_mm; + + if (w < 0.) { + BOOST_LOG_TRIVIAL(error) << "Pinhead width is negative!"; + w = 0.; + } + + m_builder.add_anchor(head.r_back_mm, head.r_pin_mm, w, + m_cfg.head_penetration_mm, taildir, hitp); + + 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::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)) { return; } + + // Cannot connect to nearby pillar. We will try to search for + // a route to the ground. + 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; + + head.invalidate(); + }); +} + +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 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 + // be connected multiple times this is ensured by the 'pairs' set which + // remembers the processed pillar pairs + auto cascadefn = + [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, 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.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. + // + // 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; + else if (pillar().links < 2 && pillar().height > H2) { + // Not enough neighbors to support this pillar + needpillars = 2; + } else if (pillar().links < 1 && pillar().height > H1) { + // 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 canplace(needpillars, false); + std::vector 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]); + n++) + { + double a = alpha + n * PI / 3; + Vec3d s = sp; + 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 newpills; + newpills.reserve(needpillars); + + if (found) + for (unsigned n = 0; n < needpillars; n++) { + 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); + double t = bridge_mesh_distance(pillarsp, dirv(pillarsp, s), + pillar().r); + if (distance(pillarsp, s) < t) + m_builder.add_bridge(pillarsp, s, 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()); + m_builder.increment_links(pp); + } + } + + if(!newpills.empty()) { + for(auto it = newpills.begin(), nx = std::next(it); + nx != newpills.end(); ++it, ++nx) { + const Pillar& itpll = m_builder.pillar(*it); + const Pillar& nxpll = m_builder.pillar(*nx); + if(interconnect(itpll, nxpll)) { + m_builder.increment_links(itpll); + m_builder.increment_links(nxpll); + } + } + + m_pillar_index.foreach(cascadefn); + } + } +} + +}} // namespace Slic3r::sla diff --git a/src/libslic3r/SLA/SLASupportTreeBuildsteps.hpp b/src/libslic3r/SLA/SupportTreeBuildsteps.hpp similarity index 58% rename from src/libslic3r/SLA/SLASupportTreeBuildsteps.hpp rename to src/libslic3r/SLA/SupportTreeBuildsteps.hpp index e953cc1361..013666f074 100644 --- a/src/libslic3r/SLA/SLASupportTreeBuildsteps.hpp +++ b/src/libslic3r/SLA/SupportTreeBuildsteps.hpp @@ -3,7 +3,9 @@ #include -#include "SLASupportTreeBuilder.hpp" +#include +#include +#include namespace Slic3r { namespace sla { @@ -15,59 +17,99 @@ 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 dir_to_spheric(const Vec3d &n, double norm = 1.) +{ + double z = n.z(); + double r = norm; + double polar = std::acos(z / r); + double azimuth = std::atan2(n(1), n(0)); + return {polar, azimuth}; } -// This function returns the position of the centroid in the input 'clust' -// vector of point indices. -template -long cluster_centroid(const ClusterEl& clust, - const std::function &pointfn, - DistFn df) +inline Vec3d spheric_to_dir(double polar, double azimuth) { - 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: ; + return {std::cos(azimuth) * std::sin(polar), + std::sin(azimuth) * std::sin(polar), std::cos(polar)}; +} + +inline Vec3d spheric_to_dir(const std::tuple &v) +{ + auto [plr, azm] = v; + return spheric_to_dir(plr, azm); +} + +inline Vec3d spheric_to_dir(const std::pair &v) +{ + return spheric_to_dir(v.first, v.second); +} + +inline Vec3d spheric_to_dir(const std::array &v) +{ + return spheric_to_dir(v[0], v[1]); +} + +// 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 +class PointRing { + std::array 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; } - // 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. +public: - // The complexity should be O(n^2) but we will mostly apply this function - // for small clusters only (cca 3 elements) + PointRing(const Vec3d &n) + { + m_phis = linspace_array(0., 2 * PI); - std::vector sel(clust.size(), false); // create full zero bitmask - std::fill(sel.end() - 2, sel.end(), true); // insert the two ones - std::vector avgs(clust.size(), 0.0); // store the average distances + // 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); + } + } - do { - std::array idx; - for(size_t i = 0, j = 0; i < clust.size(); i++) if(sel[i]) idx[j++] = i; + 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 d = df(pointfn(clust[idx[0]]), - pointfn(clust[idx[1]])); + double rpscos = r * cosphi; + double rpssin = r * sinphi; - // add the distance to the sums for both associated points - for(auto i : idx) avgs[i] += d; + // 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)}; + } +}; - // 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()); -} +//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(); @@ -143,17 +185,17 @@ IntegerOnly 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& m_support_pts; using PtIndices = std::vector; PtIndices m_iheads; // support points with pinhead + PtIndices m_iheads_onmodel; PtIndices m_iheadless; // headless support points - - // supp. pts. connecting to model: point index and the ray hit data - std::vector> m_iheads_onmodel; + + std::map m_head_to_ground_scans; // normals for support points from model faces. PointSet m_support_nmls; @@ -179,10 +221,10 @@ class SupportTreeBuildsteps { // When bridging heads to pillars... TODO: find a cleaner solution ccr::BlockingMutex m_bridge_mutex; - inline double ray_mesh_intersect(const Vec3d& s, - const Vec3d& dir) + inline IndexedMesh::hit_result ray_mesh_intersect(const Vec3d& s, + const Vec3d& dir) { - return m_mesh.query_ray_hit(s, dir).distance(); + return m_mesh.query_ray_hit(s, dir); } // This function will test if a future pinhead would not collide with the @@ -196,12 +238,25 @@ 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); + 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. // If the function is used for headless sticks, the ins_check parameter @@ -211,26 +266,64 @@ 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 + inline double bridge_mesh_distance(Args&&...args) { + return bridge_mesh_intersect(std::forward(args)...).distance(); + } // Helper function for interconnecting two pillars with zig-zag bridges. bool interconnect(const Pillar& pillar, const Pillar& nextpillar); // For connecting a head to a nearby pillar. bool connect_to_nearpillar(const Head& head, long nearpillar_id); + + // Find route for a head to the ground. Inserts additional bridge from the + // head to the pillar if cannot create pillar directly. + // The optional dir parameter is the direction of the bridge which is the + // direction of the pinhead if omitted. + bool connect_to_ground(Head& head, const Vec3d &dir); + 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. - void create_ground_pillar(const Vec3d &jp, + // 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. + 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 search_widening_path(const Vec3d &jp, + const Vec3d &dir, + double radius, + double new_radius); + public: SupportTreeBuildsteps(SupportTreeBuilder & builder, const SupportableMesh &sm); @@ -273,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/SupportTreeMesher.cpp b/src/libslic3r/SLA/SupportTreeMesher.cpp new file mode 100644 index 0000000000..15491775b4 --- /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 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 0000000000..63182745da --- /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; + +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; + + // 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; + 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; + + // 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 d9f8b7b6db..f36e48aa66 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -1,10 +1,10 @@ #include "SLAPrint.hpp" -#include "SLA/SLASupportTree.hpp" -#include "SLA/SLAPad.hpp" -#include "SLA/SLAAutoSupports.hpp" +#include "SLAPrintSteps.hpp" + #include "ClipperUtils.hpp" #include "Geometry.hpp" #include "MTUtils.hpp" +#include "Thread.hpp" #include #include @@ -13,9 +13,6 @@ #include #include -// For geometry algorithms with native Clipper types (no copies and conversions) -#include - // #define SLAPRINT_DO_BENCHMARK #ifdef SLAPRINT_DO_BENCHMARK @@ -32,65 +29,91 @@ namespace Slic3r { -class SLAPrintObject::SupportData : public sla::SupportableMesh + +bool is_zero_elevation(const SLAPrintObjectConfig &c) { -public: - sla::SupportTree::UPtr support_tree_ptr; // the supports - std::vector support_slices; // sliced supports + return c.pad_enable.getBool() && c.pad_around_object.getBool(); +} + +// Compile the argument for support creation from the static print config. +sla::SupportTreeConfig make_support_cfg(const SLAPrintObjectConfig& c) +{ + sla::SupportTreeConfig scfg; - inline SupportData(const TriangleMesh &t): sla::SupportableMesh{t, {}, {}} {} + scfg.enabled = c.supports_enable.getBool(); + scfg.head_front_radius_mm = 0.5*c.support_head_front_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) ? + 0. : c.support_object_elevation.getFloat(); + scfg.bridge_slope = c.support_critical_angle.getFloat() * PI / 180.0 ; + scfg.max_bridge_length_mm = c.support_max_bridge_length.getFloat(); + scfg.max_pillar_link_distance_mm = c.support_max_pillar_link_distance.getFloat(); + switch(c.support_pillar_connection_mode.getInt()) { + case slapcmZigZag: + scfg.pillar_connection_mode = sla::PillarConnectionMode::zigzag; break; + case slapcmCross: + scfg.pillar_connection_mode = sla::PillarConnectionMode::cross; break; + case slapcmDynamic: + scfg.pillar_connection_mode = sla::PillarConnectionMode::dynamic; break; + } + scfg.ground_facing_only = c.support_buildplate_only.getBool(); + scfg.pillar_widening_factor = c.support_pillar_widening_factor.getFloat(); + scfg.base_radius_mm = 0.5*c.support_base_diameter.getFloat(); + scfg.base_height_mm = c.support_base_height.getFloat(); + scfg.pillar_base_safety_distance_mm = + c.support_base_safety_distance.getFloat() < EPSILON ? + scfg.safety_distance_mm : c.support_base_safety_distance.getFloat(); - sla::SupportTree::UPtr &create_support_tree(const sla::JobController &ctl) - { - support_tree_ptr = sla::SupportTree::create(*this, ctl); - return support_tree_ptr; + scfg.max_bridges_on_pillar = unsigned(c.support_max_bridges_on_pillar.getInt()); + + return scfg; +} + +sla::PadConfig::EmbedObject builtin_pad_cfg(const SLAPrintObjectConfig& c) +{ + sla::PadConfig::EmbedObject ret; + + ret.enabled = is_zero_elevation(c); + + if(ret.enabled) { + ret.everywhere = c.pad_around_object_everywhere.getBool(); + ret.object_gap_mm = c.pad_object_gap.getFloat(); + ret.stick_width_mm = c.pad_object_connector_width.getFloat(); + ret.stick_stride_mm = c.pad_object_connector_stride.getFloat(); + ret.stick_penetration_mm = c.pad_object_connector_penetration + .getFloat(); } -}; + + return ret; +} -namespace { - -// should add up to 100 (%) -const std::array OBJ_STEP_LEVELS = +sla::PadConfig make_pad_cfg(const SLAPrintObjectConfig& c) { - 30, // slaposObjectSlice, - 20, // slaposSupportPoints, - 10, // slaposSupportTree, - 10, // slaposPad, - 30, // slaposSliceSupports, -}; + sla::PadConfig pcfg; + + pcfg.wall_thickness_mm = c.pad_wall_thickness.getFloat(); + pcfg.wall_slope = c.pad_wall_slope.getFloat() * PI / 180.0; + + pcfg.max_merge_dist_mm = c.pad_max_merge_distance.getFloat(); + pcfg.wall_height_mm = c.pad_wall_height.getFloat(); + pcfg.brim_size_mm = c.pad_brim_size.getFloat(); + + // set builtin pad implicitly ON + pcfg.embed_object = builtin_pad_cfg(c); + + return pcfg; +} -// Object step to status label. The labels are localized at the time of calling, thus supporting language switching. -std::string OBJ_STEP_LABELS(size_t idx) +bool validate_pad(const TriangleMesh &pad, const sla::PadConfig &pcfg) { - switch (idx) { - case slaposObjectSlice: return L("Slicing model"); - case slaposSupportPoints: return L("Generating support points"); - case slaposSupportTree: return L("Generating support tree"); - case slaposPad: return L("Generating pad"); - case slaposSliceSupports: return L("Slicing supports"); - default:; - } - assert(false); return "Out of bounds!"; -}; - -// Should also add up to 100 (%) -const std::array PRINT_STEP_LEVELS = -{ - 10, // slapsMergeSlicesAndEval - 90, // slapsRasterize -}; - -// Print step to status label. The labels are localized at the time of calling, thus supporting language switching. -std::string PRINT_STEP_LABELS(size_t idx) -{ - switch (idx) { - case slapsMergeSlicesAndEval: return L("Merging slices and calculating statistics"); - case slapsRasterize: return L("Rasterizing layers"); - default:; - } - assert(false); return "Out of bounds!"; -}; - + // An empty pad can only be created if embed_object mode is enabled + // and the pad is not forced everywhere + return !pad.empty() || (pcfg.embed_object.enabled && !pcfg.embed_object.everywhere); } void SLAPrint::clear() @@ -105,10 +128,10 @@ void SLAPrint::clear() } // Transformation without rotation around Z and without a shift by X and Y. -static Transform3d sla_trafo(const SLAPrint& p, const ModelObject &model_object) +Transform3d SLAPrint::sla_trafo(const ModelObject &model_object) const { - Vec3d corr = p.relative_correction(); + Vec3d corr = this->relative_correction(); ModelInstance &model_instance = *model_object.instances.front(); Vec3d offset = model_instance.get_offset(); @@ -153,6 +176,16 @@ static std::vector sla_instances(const ModelObject &mo return instances; } +std::vector SLAPrint::print_object_ids() const +{ + std::vector out; + // Reserve one more for the caller to append the ID of the Print itself. + out.reserve(m_objects.size() + 1); + for (const SLAPrintObject *print_object : m_objects) + out.emplace_back(print_object->id()); + return out; +} + SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig config) { #ifdef _DEBUG @@ -163,7 +196,6 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con config.option("sla_print_settings_id", true); config.option("sla_material_settings_id", true); config.option("printer_settings_id", true); - config.normalize(); // 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); @@ -208,6 +240,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 { @@ -359,7 +393,7 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con bool sla_trafo_differs = model_object.instances.empty() != model_object_new.instances.empty() || (! model_object.instances.empty() && - (! sla_trafo(*this, model_object).isApprox(sla_trafo(*this, model_object_new)) || + (! sla_trafo(model_object).isApprox(sla_trafo(model_object_new)) || model_object.instances.front()->is_left_handed() != model_object_new.instances.front()->is_left_handed())); if (model_parts_differ || sla_trafo_differs) { // The very first step (the slicing step) is invalidated. One may freely remove all associated PrintObjects. @@ -371,12 +405,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(model_object.config) = static_cast(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()) { @@ -397,6 +431,13 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con model_object.sla_support_points = model_object_new.sla_support_points; } model_object.sla_points_status = model_object_new.sla_points_status; + + // Invalidate hollowing if drain holes have changed + if (model_object.sla_drain_holes != model_object_new.sla_drain_holes) + { + model_object.sla_drain_holes = model_object_new.sla_drain_holes; + update_apply_status(it_print_object_status->print_object->invalidate_step(slaposDrillHoles)); + } // Copy the ModelObject name, input_file and instances. The instances will compared against PrintObject instances in the next step. model_object.name = model_object_new.name; @@ -429,13 +470,12 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con // FIXME: this invalidates the transformed mesh in SLAPrintObject // which is expensive to calculate (especially the raw_mesh() call) - print_object->set_trafo(sla_trafo(*this, model_object), model_object.instances.front()->is_left_handed()); + print_object->set_trafo(sla_trafo(model_object), model_object.instances.front()->is_left_handed()); 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; } @@ -456,7 +496,6 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con } if(m_objects.empty()) { - m_printer.reset(); m_printer_input = {}; m_print_statistics = {}; } @@ -576,87 +615,6 @@ std::string SLAPrint::output_filename(const std::string &filename_base) const return this->PrintBase::output_filename(m_print_config.output_filename_format.value, ".sl1", filename_base, &config); } -namespace { - -bool is_zero_elevation(const SLAPrintObjectConfig &c) { - return c.pad_enable.getBool() && c.pad_around_object.getBool(); -} - -// Compile the argument for support creation from the static print config. -sla::SupportConfig make_support_cfg(const SLAPrintObjectConfig& c) { - sla::SupportConfig 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(); - 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) ? - 0. : c.support_object_elevation.getFloat(); - scfg.bridge_slope = c.support_critical_angle.getFloat() * PI / 180.0 ; - scfg.max_bridge_length_mm = c.support_max_bridge_length.getFloat(); - scfg.max_pillar_link_distance_mm = c.support_max_pillar_link_distance.getFloat(); - switch(c.support_pillar_connection_mode.getInt()) { - case slapcmZigZag: - scfg.pillar_connection_mode = sla::PillarConnectionMode::zigzag; break; - case slapcmCross: - scfg.pillar_connection_mode = sla::PillarConnectionMode::cross; break; - case slapcmDynamic: - scfg.pillar_connection_mode = sla::PillarConnectionMode::dynamic; break; - } - scfg.ground_facing_only = c.support_buildplate_only.getBool(); - scfg.pillar_widening_factor = c.support_pillar_widening_factor.getFloat(); - scfg.base_radius_mm = 0.5*c.support_base_diameter.getFloat(); - scfg.base_height_mm = c.support_base_height.getFloat(); - scfg.pillar_base_safety_distance_mm = - c.support_base_safety_distance.getFloat() < EPSILON ? - scfg.safety_distance_mm : c.support_base_safety_distance.getFloat(); - - return scfg; -} - -sla::PadConfig::EmbedObject builtin_pad_cfg(const SLAPrintObjectConfig& c) { - sla::PadConfig::EmbedObject ret; - - ret.enabled = is_zero_elevation(c); - - if(ret.enabled) { - ret.everywhere = c.pad_around_object_everywhere.getBool(); - ret.object_gap_mm = c.pad_object_gap.getFloat(); - ret.stick_width_mm = c.pad_object_connector_width.getFloat(); - ret.stick_stride_mm = c.pad_object_connector_stride.getFloat(); - ret.stick_penetration_mm = c.pad_object_connector_penetration - .getFloat(); - } - - return ret; -} - -sla::PadConfig make_pad_cfg(const SLAPrintObjectConfig& c) { - sla::PadConfig pcfg; - - pcfg.wall_thickness_mm = c.pad_wall_thickness.getFloat(); - pcfg.wall_slope = c.pad_wall_slope.getFloat() * PI / 180.0; - - pcfg.max_merge_dist_mm = c.pad_max_merge_distance.getFloat(); - pcfg.wall_height_mm = c.pad_wall_height.getFloat(); - pcfg.brim_size_mm = c.pad_brim_size.getFloat(); - - // set builtin pad implicitly ON - pcfg.embed_object = builtin_pad_cfg(c); - - return pcfg; -} - -bool validate_pad(const TriangleMesh &pad, const sla::PadConfig &pcfg) -{ - // An empty pad can only be created if embed_object mode is enabled - // and the pad is not forced everywhere - return !pad.empty() || (pcfg.embed_object.enabled && !pcfg.embed_object.everywhere); -} - -} - std::string SLAPrint::validate() const { for(SLAPrintObject * po : m_objects) { @@ -670,7 +628,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; @@ -712,6 +670,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); @@ -726,751 +690,19 @@ bool SLAPrint::invalidate_step(SLAPrintStep step) void SLAPrint::process() { - using namespace sla; - using ExPolygon = Slic3r::ExPolygon; + 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 - - // shortcut to initial layer height - double ilhd = m_material_config.initial_layer_height.getFloat(); - auto ilh = float(ilhd); - - coord_t ilhs = scaled(ilhd); - const size_t objcount = m_objects.size(); - - static const unsigned min_objstatus = 0; // where the per object operations start - static const unsigned max_objstatus = 50; // where the per object operations end - - // the coefficient that multiplies the per object status values which - // are set up for <0, 100>. They need to be scaled into the whole process - const double ostepd = (max_objstatus - min_objstatus) / (objcount * 100.0); - - // The slicing will be performed on an imaginary 1D grid which starts from - // the bottom of the bounding box created around the supported model. So - // the first layer which is usually thicker will be part of the supports - // not the model geometry. Exception is when the model is not in the air - // (elevation is zero) and no pad creation was requested. In this case the - // model geometry starts on the ground level and the initial layer is part - // of it. In any case, the model and the supports have to be sliced in the - // same imaginary grid (the height vector argument to TriangleMeshSlicer). - - // Slicing the model object. This method is oversimplified and needs to - // be compared with the fff slicing algorithm for verification - auto slice_model = [this, ilhs, ilh](SLAPrintObject& po) { - const TriangleMesh& mesh = po.transformed_mesh(); - - // We need to prepare the slice index... - - double lhd = m_objects.front()->m_config.layer_height.getFloat(); - float lh = float(lhd); - coord_t lhs = scaled(lhd); - auto && bb3d = mesh.bounding_box(); - double minZ = bb3d.min(Z) - po.get_elevation(); - double maxZ = bb3d.max(Z); - auto minZf = float(minZ); - coord_t minZs = scaled(minZ); - coord_t maxZs = scaled(maxZ); - - po.m_slice_index.clear(); - - size_t cap = size_t(1 + (maxZs - minZs - ilhs) / lhs); - po.m_slice_index.reserve(cap); - - po.m_slice_index.emplace_back(minZs + ilhs, minZf + ilh / 2.f, ilh); - - for(coord_t h = minZs + ilhs + lhs; h <= maxZs; h += lhs) - po.m_slice_index.emplace_back(h, unscaled(h) - lh / 2.f, lh); - - // Just get the first record that is from the model: - auto slindex_it = - po.closest_slice_record(po.m_slice_index, float(bb3d.min(Z))); - - if(slindex_it == po.m_slice_index.end()) - //TRN To be shown at the status bar on SLA slicing error. - throw std::runtime_error( - L("Slicing had to be stopped due to an internal error: " - "Inconsistent slice index.")); - - po.m_model_height_levels.clear(); - po.m_model_height_levels.reserve(po.m_slice_index.size()); - for(auto it = slindex_it; it != po.m_slice_index.end(); ++it) - po.m_model_height_levels.emplace_back(it->slice_level()); - - TriangleMeshSlicer slicer(&mesh); - - po.m_model_slices.clear(); - slicer.slice(po.m_model_height_levels, - float(po.config().slice_closing_radius.value), - &po.m_model_slices, - [this](){ throw_if_canceled(); }); - - auto mit = slindex_it; - double doffs = m_printer_config.absolute_correction.getFloat(); - coord_t clpr_offs = scaled(doffs); - for(size_t id = 0; - id < po.m_model_slices.size() && mit != po.m_slice_index.end(); - id++) - { - // We apply the printer correction offset here. - if(clpr_offs != 0) - po.m_model_slices[id] = - offset_ex(po.m_model_slices[id], float(clpr_offs)); - - mit->set_model_slice_idx(po, id); ++mit; - } - - if(po.m_config.supports_enable.getBool() || - po.m_config.pad_enable.getBool()) - { - po.m_supportdata.reset( - new SLAPrintObject::SupportData(po.transformed_mesh()) ); - } - }; - - // In this step we check the slices, identify island and cover them with - // support points. Then we sprinkle the rest of the mesh. - auto support_points = [this, ostepd](SLAPrintObject& po) { - // If supports are disabled, we can skip the model scan. - if(!po.m_config.supports_enable.getBool()) return; - - if (!po.m_supportdata) - po.m_supportdata.reset( - new SLAPrintObject::SupportData(po.transformed_mesh())); - - const ModelObject& mo = *po.m_model_object; - - BOOST_LOG_TRIVIAL(debug) << "Support point count " - << mo.sla_support_points.size(); - - // Unless the user modified the points or we already did the calculation, we will do - // the autoplacement. Otherwise we will just blindly copy the frontend data - // into the backend cache. - if (mo.sla_points_status != sla::PointsStatus::UserModified) { - - // Hypothetical use of the slice index: - // auto bb = po.transformed_mesh().bounding_box(); - // auto range = po.get_slice_records(bb.min(Z)); - // std::vector heights; heights.reserve(range.size()); - // for(auto& record : range) heights.emplace_back(record.slice_level()); - - // calculate heights of slices (slices are calculated already) - const std::vector& heights = po.m_model_height_levels; - - this->throw_if_canceled(); - SLAAutoSupports::Config config; - const SLAPrintObjectConfig& cfg = po.config(); - - // the density config value is in percents: - config.density_relative = float(cfg.support_points_density_relative / 100.f); - config.minimal_distance = float(cfg.support_points_minimal_distance); - config.head_diameter = float(cfg.support_head_front_diameter); - - // scaling for the sub operations - double d = ostepd * OBJ_STEP_LEVELS[slaposSupportPoints] / 100.0; - double init = m_report_status.status(); - - auto statuscb = [this, d, init](unsigned st) - { - double current = init + st * d; - if(std::round(m_report_status.status()) < std::round(current)) - m_report_status(*this, current, - OBJ_STEP_LABELS(slaposSupportPoints)); - - }; - - // Construction of this object does the calculation. - this->throw_if_canceled(); - SLAAutoSupports auto_supports(po.m_supportdata->emesh, - po.get_model_slices(), - heights, - config, - [this]() { throw_if_canceled(); }, - statuscb); - - // Now let's extract the result. - const std::vector& points = auto_supports.output(); - this->throw_if_canceled(); - po.m_supportdata->pts = points; - - BOOST_LOG_TRIVIAL(debug) << "Automatic support points: " - << po.m_supportdata->pts.size(); - - // Using RELOAD_SLA_SUPPORT_POINTS to tell the Plater to pass - // the update status to GLGizmoSlaSupports - m_report_status(*this, - -1, - L("Generating support points"), - SlicingStatus::RELOAD_SLA_SUPPORT_POINTS); - } - else { - // There are either some points on the front-end, or the user - // 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); - } - }; - - // In this step we create the supports - auto support_tree = [this, ostepd](SLAPrintObject& po) - { - if(!po.m_supportdata) return; - - sla::PadConfig pcfg = make_pad_cfg(po.m_config); - - if (pcfg.embed_object) - po.m_supportdata->emesh.ground_level_offset(pcfg.wall_thickness_mm); - - po.m_supportdata->cfg = make_support_cfg(po.m_config); - - // scaling for the sub operations - double d = ostepd * OBJ_STEP_LEVELS[slaposSupportTree] / 100.0; - double init = m_report_status.status(); - JobController ctl; - - ctl.statuscb = [this, d, init](unsigned st, const std::string &logmsg) { - double current = init + st * d; - if (std::round(m_report_status.status()) < std::round(current)) - m_report_status(*this, current, - OBJ_STEP_LABELS(slaposSupportTree), - SlicingStatus::DEFAULT, logmsg); - }; - ctl.stopcondition = [this]() { return canceled(); }; - ctl.cancelfn = [this]() { throw_if_canceled(); }; - - po.m_supportdata->create_support_tree(ctl); - - if (!po.m_config.supports_enable.getBool()) return; - - throw_if_canceled(); - - // Create the unified mesh - auto rc = SlicingStatus::RELOAD_SCENE; - - // This is to prevent "Done." being displayed during merged_mesh() - m_report_status(*this, -1, L("Visualizing supports")); - - BOOST_LOG_TRIVIAL(debug) << "Processed support point count " - << po.m_supportdata->pts.size(); - - // Check the mesh for later troubleshooting. - if(po.support_mesh().empty()) - BOOST_LOG_TRIVIAL(warning) << "Support mesh is empty"; - - m_report_status(*this, -1, L("Visualizing supports"), rc); - }; - - // This step generates the sla base pad - auto generate_pad = [this](SLAPrintObject& po) { - // this step can only go after the support tree has been created - // and before the supports had been sliced. (or the slicing has to be - // repeated) - - if(po.m_config.pad_enable.getBool()) - { - // Get the distilled pad configuration from the config - sla::PadConfig pcfg = make_pad_cfg(po.m_config); - - ExPolygons bp; // This will store the base plate of the pad. - double pad_h = pcfg.full_height(); - const TriangleMesh &trmesh = po.transformed_mesh(); - - // This call can get pretty time consuming - auto thrfn = [this](){ throw_if_canceled(); }; - - if (!po.m_config.supports_enable.getBool() || pcfg.embed_object) { - // No support (thus no elevation) or zero elevation mode - // we sometimes call it "builtin pad" is enabled so we will - // get a sample from the bottom of the mesh and use it for pad - // creation. - sla::pad_blueprint(trmesh, bp, float(pad_h), - float(po.m_config.layer_height.getFloat()), - thrfn); - } - - po.m_supportdata->support_tree_ptr->add_pad(bp, pcfg); - auto &pad_mesh = po.m_supportdata->support_tree_ptr->retrieve_mesh(MeshType::Pad); - - if (!validate_pad(pad_mesh, pcfg)) - throw std::runtime_error( - L("No pad can be generated for this model with the " - "current configuration")); - - } else if(po.m_supportdata && po.m_supportdata->support_tree_ptr) { - po.m_supportdata->support_tree_ptr->remove_pad(); - } - - po.throw_if_canceled(); - auto rc = SlicingStatus::RELOAD_SCENE; - m_report_status(*this, -1, L("Visualizing supports"), rc); - }; - - // Slicing the support geometries similarly to the model slicing procedure. - // If the pad had been added previously (see step "base_pool" than it will - // be part of the slices) - auto slice_supports = [this](SLAPrintObject& po) { - auto& sd = po.m_supportdata; - - if(sd) sd->support_slices.clear(); - - // Don't bother if no supports and no pad is present. - if (!po.m_config.supports_enable.getBool() && - !po.m_config.pad_enable.getBool()) - return; - - if(sd && sd->support_tree_ptr) { - - std::vector heights; heights.reserve(po.m_slice_index.size()); - - for(auto& rec : po.m_slice_index) { - heights.emplace_back(rec.slice_level()); - } - - sd->support_slices = sd->support_tree_ptr->slice( - heights, float(po.config().slice_closing_radius.value)); - } - - double doffs = m_printer_config.absolute_correction.getFloat(); - coord_t clpr_offs = scaled(doffs); - for(size_t i = 0; - i < sd->support_slices.size() && i < po.m_slice_index.size(); - ++i) - { - // We apply the printer correction offset here. - if(clpr_offs != 0) - sd->support_slices[i] = - offset_ex(sd->support_slices[i], float(clpr_offs)); - - po.m_slice_index[i].set_support_slice_idx(po, i); - } - - // Using RELOAD_SLA_PREVIEW to tell the Plater to pass the update - // status to the 3D preview to load the SLA slices. - m_report_status(*this, -2, "", SlicingStatus::RELOAD_SLA_PREVIEW); - }; - - // Merging the slices from all the print objects into one slice grid and - // calculating print statistics from the merge result. - auto merge_slices_and_eval_stats = [this, ilhs]() { - - // clear the rasterizer input - m_printer_input.clear(); - - size_t mx = 0; - for(SLAPrintObject * o : m_objects) { - if(auto m = o->get_slice_index().size() > mx) mx = m; - } - - m_printer_input.reserve(mx); - - auto eps = coord_t(SCALED_EPSILON); - - for(SLAPrintObject * o : m_objects) { - coord_t gndlvl = o->get_slice_index().front().print_level() - ilhs; - - for(const SliceRecord& slicerecord : o->get_slice_index()) { - coord_t lvlid = slicerecord.print_level() - gndlvl; - - // Neat trick to round the layer levels to the grid. - lvlid = eps * (lvlid / eps); - - auto it = std::lower_bound(m_printer_input.begin(), - m_printer_input.end(), - PrintLayer(lvlid)); - - if(it == m_printer_input.end() || it->level() != lvlid) - it = m_printer_input.insert(it, PrintLayer(lvlid)); - - - it->add(slicerecord); - } - } - - m_print_statistics.clear(); - - using ClipperPoint = ClipperLib::IntPoint; - using ClipperPolygon = ClipperLib::Polygon; // see clipper_polygon.hpp in libnest2d - using ClipperPolygons = std::vector; - namespace sl = libnest2d::shapelike; // For algorithms - - // Set up custom union and diff functions for clipper polygons - auto polyunion = [] (const ClipperPolygons& subjects) - { - ClipperLib::Clipper clipper; - - bool closed = true; - - for(auto& path : subjects) { - clipper.AddPath(path.Contour, ClipperLib::ptSubject, closed); - clipper.AddPaths(path.Holes, ClipperLib::ptSubject, closed); - } - - auto mode = ClipperLib::pftPositive; - - return libnest2d::clipper_execute(clipper, ClipperLib::ctUnion, mode, mode); - }; - - auto polydiff = [](const ClipperPolygons& subjects, const ClipperPolygons& clips) - { - ClipperLib::Clipper clipper; - - bool closed = true; - - for(auto& path : subjects) { - clipper.AddPath(path.Contour, ClipperLib::ptSubject, closed); - clipper.AddPaths(path.Holes, ClipperLib::ptSubject, closed); - } - - for(auto& path : clips) { - clipper.AddPath(path.Contour, ClipperLib::ptClip, closed); - clipper.AddPaths(path.Holes, ClipperLib::ptClip, closed); - } - - auto mode = ClipperLib::pftPositive; - - return libnest2d::clipper_execute(clipper, ClipperLib::ctDifference, mode, mode); - }; - - // libnest calculates positive area for clockwise polygons, Slic3r is in counter-clockwise - auto areafn = [](const ClipperPolygon& poly) { return - sl::area(poly); }; - - const double area_fill = m_printer_config.area_fill.getFloat()*0.01;// 0.5 (50%); - const double fast_tilt = m_printer_config.fast_tilt_time.getFloat();// 5.0; - const double slow_tilt = m_printer_config.slow_tilt_time.getFloat();// 8.0; - - const double init_exp_time = m_material_config.initial_exposure_time.getFloat(); - const double exp_time = m_material_config.exposure_time.getFloat(); - - const int fade_layers_cnt = m_default_object_config.faded_layers.getInt();// 10 // [3;20] - - const auto width = scaled(m_printer_config.display_width.getFloat()); - const auto height = scaled(m_printer_config.display_height.getFloat()); - const double display_area = width*height; - - // get polygons for all instances in the object - auto get_all_polygons = - [](const ExPolygons& input_polygons, - const std::vector& instances, - bool is_lefthanded) - { - ClipperPolygons polygons; - polygons.reserve(input_polygons.size() * instances.size()); - - for (const ExPolygon& polygon : input_polygons) { - if(polygon.contour.empty()) continue; - - for (size_t i = 0; i < instances.size(); ++i) - { - ClipperPolygon poly; - - // We need to reverse if is_lefthanded is true but - bool needreverse = is_lefthanded; - - // should be a move - poly.Contour.reserve(polygon.contour.size() + 1); - - auto& cntr = polygon.contour.points; - if(needreverse) - for(auto it = cntr.rbegin(); it != cntr.rend(); ++it) - poly.Contour.emplace_back(it->x(), it->y()); - else - for(auto& p : cntr) - poly.Contour.emplace_back(p.x(), p.y()); - - for(auto& h : polygon.holes) { - poly.Holes.emplace_back(); - auto& hole = poly.Holes.back(); - hole.reserve(h.points.size() + 1); - - if(needreverse) - for(auto it = h.points.rbegin(); it != h.points.rend(); ++it) - hole.emplace_back(it->x(), it->y()); - else - for(auto& p : h.points) - hole.emplace_back(p.x(), p.y()); - } - - if(is_lefthanded) { - for(auto& p : poly.Contour) p.X = -p.X; - for(auto& h : poly.Holes) for(auto& p : h) p.X = -p.X; - } - - sl::rotate(poly, double(instances[i].rotation)); - sl::translate(poly, ClipperPoint{instances[i].shift(X), - instances[i].shift(Y)}); - - polygons.emplace_back(std::move(poly)); - } - } - return polygons; - }; - - double supports_volume(0.0); - double models_volume(0.0); - - double estim_time(0.0); - - size_t slow_layers = 0; - size_t fast_layers = 0; - - const double delta_fade_time = (init_exp_time - exp_time) / (fade_layers_cnt + 1); - double fade_layer_time = init_exp_time; - - SpinMutex mutex; - using Lock = std::lock_guard; - - // Going to parallel: - auto printlayerfn = [this, - // functions and read only vars - get_all_polygons, polyunion, polydiff, 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](size_t sliced_layer_cnt) - { - PrintLayer& layer = m_printer_input[sliced_layer_cnt]; - - // vector of slice record references - auto& slicerecord_references = layer.slices(); - - if(slicerecord_references.empty()) return; - - // Layer height should match for all object slices for a given level. - const auto l_height = double(slicerecord_references.front().get().layer_height()); - - // Calculation of the consumed material - - ClipperPolygons model_polygons; - ClipperPolygons supports_polygons; - - size_t c = std::accumulate(layer.slices().begin(), - layer.slices().end(), - size_t(0), - [](size_t a, const SliceRecord &sr) { - return a + sr.get_slice(soModel) - .size(); - }); - - model_polygons.reserve(c); - - c = std::accumulate(layer.slices().begin(), - layer.slices().end(), - size_t(0), - [](size_t a, const SliceRecord &sr) { - return a + sr.get_slice(soModel).size(); - }); - - supports_polygons.reserve(c); - - for(const SliceRecord& record : layer.slices()) { - const SLAPrintObject *po = record.print_obj(); - - const ExPolygons &modelslices = record.get_slice(soModel); - - bool is_lefth = record.print_obj()->is_left_handed(); - if (!modelslices.empty()) { - ClipperPolygons v = get_all_polygons(modelslices, po->instances(), is_lefth); - for(ClipperPolygon& p_tmp : v) model_polygons.emplace_back(std::move(p_tmp)); - } - - const ExPolygons &supportslices = record.get_slice(soSupport); - - if (!supportslices.empty()) { - ClipperPolygons v = get_all_polygons(supportslices, po->instances(), is_lefth); - for(ClipperPolygon& p_tmp : v) supports_polygons.emplace_back(std::move(p_tmp)); - } - } - - model_polygons = polyunion(model_polygons); - double layer_model_area = 0; - for (const ClipperPolygon& polygon : model_polygons) - layer_model_area += areafn(polygon); - - if (layer_model_area < 0 || layer_model_area > 0) { - Lock lck(mutex); models_volume += layer_model_area * l_height; - } - - if(!supports_polygons.empty()) { - if(model_polygons.empty()) supports_polygons = polyunion(supports_polygons); - else supports_polygons = polydiff(supports_polygons, model_polygons); - // allegedly, union of subject is done withing the diff according to the pftPositive polyFillType - } - - double layer_support_area = 0; - for (const ClipperPolygon& polygon : supports_polygons) - layer_support_area += areafn(polygon); - - if (layer_support_area < 0 || layer_support_area > 0) { - Lock lck(mutex); supports_volume += layer_support_area * l_height; - } - - // Here we can save the expensively calculated polygons for printing - ClipperPolygons trslices; - trslices.reserve(model_polygons.size() + supports_polygons.size()); - for(ClipperPolygon& poly : model_polygons) trslices.emplace_back(std::move(poly)); - for(ClipperPolygon& poly : supports_polygons) trslices.emplace_back(std::move(poly)); - - layer.transformed_slices(polyunion(trslices)); - - // Calculation of the slow and fast layers to the future controlling those values on FW - - const bool is_fast_layer = (layer_model_area + layer_support_area) <= display_area*area_fill; - const double tilt_time = is_fast_layer ? fast_tilt : slow_tilt; - - { Lock lck(mutex); - if (is_fast_layer) - fast_layers++; - else - slow_layers++; - - - // Calculation of the printing time - - if (sliced_layer_cnt < 3) - estim_time += init_exp_time; - else if (fade_layer_time > exp_time) - { - fade_layer_time -= delta_fade_time; - estim_time += fade_layer_time; - } - else - estim_time += exp_time; - - estim_time += tilt_time; - } - }; - - // sequential version for debugging: - // for(size_t i = 0; i < m_printer_input.size(); ++i) printlayerfn(i); - tbb::parallel_for(0, m_printer_input.size(), printlayerfn); - - auto SCALING2 = SCALING_FACTOR * SCALING_FACTOR; - m_print_statistics.support_used_material = supports_volume * SCALING2; - m_print_statistics.objects_used_material = models_volume * SCALING2; - - // Estimated printing time - // A layers count o the highest object - if (m_printer_input.size() == 0) - m_print_statistics.estimated_print_time = std::nan(""); - else - m_print_statistics.estimated_print_time = estim_time; - - m_print_statistics.fast_layers_count = fast_layers; - m_print_statistics.slow_layers_count = slow_layers; - -#if ENABLE_THUMBNAIL_GENERATOR - // second argument set to -3 to differentiate it from the same call made into slice_supports() - m_report_status(*this, -3, "", SlicingStatus::RELOAD_SLA_PREVIEW); -#else - m_report_status(*this, -2, "", SlicingStatus::RELOAD_SLA_PREVIEW); -#endif // ENABLE_THUMBNAIL_GENERATOR - }; - - // Rasterizing the model objects, and their supports - auto rasterize = [this]() { - if(canceled()) return; - - // Set up the printer, allocate space for all the layers - sla::RasterWriter &printer = init_printer(); - - auto lvlcnt = unsigned(m_printer_input.size()); - printer.layers(lvlcnt); - - // coefficient to map the rasterization state (0-99) to the allocated - // portion (slot) of the process state - double sd = (100 - max_objstatus) / 100.0; - - // slot is the portion of 100% that is realted to rasterization - unsigned slot = PRINT_STEP_LEVELS[slapsRasterize]; - - // pst: previous state - double pst = m_report_status.status(); - - double increment = (slot * sd) / m_printer_input.size(); - double dstatus = m_report_status.status(); - - SpinMutex slck; - - // procedure to process one height level. This will run in parallel - auto lvlfn = - [this, &slck, &printer, increment, &dstatus, &pst] - (unsigned level_id) - { - if(canceled()) return; - - PrintLayer& printlayer = m_printer_input[level_id]; - - // 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); - - // Status indication guarded with the spinlock - { - std::lock_guard lck(slck); - dstatus += increment; - double st = std::round(dstatus); - if(st > pst) { - m_report_status(*this, st, - PRINT_STEP_LABELS(slapsRasterize)); - pst = st; - } - } - }; - - // 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 - tbb::parallel_for(0, lvlcnt, lvlfn); - - // Set statistics values to the printer - sla::RasterWriter::PrintStatistics stats; - stats.used_material = (m_print_statistics.objects_used_material + - m_print_statistics.support_used_material) / - 1000; - - int num_fade = m_default_object_config.faded_layers.getInt(); - stats.num_fade = num_fade >= 0 ? size_t(num_fade) : size_t(0); - stats.num_fast = m_print_statistics.fast_layers_count; - stats.num_slow = m_print_statistics.slow_layers_count; - stats.estimated_print_time_s = m_print_statistics.estimated_print_time; - - m_printer->set_statistics(stats); - }; - - using slaposFn = std::function; - using slapsFn = std::function; - - slaposFn pobj_program[] = - { - slice_model, support_points, support_tree, generate_pad, slice_supports - }; + + Steps printsteps(this); // We want to first process all objects... std::vector level1_obj_steps = { - slaposObjectSlice, slaposSupportPoints, slaposSupportTree, slaposPad + slaposHollowing, slaposDrillHoles, slaposObjectSlice, slaposSupportPoints, slaposSupportTree, slaposPad }; // and then slice all supports to allow preview to be displayed ASAP @@ -1478,10 +710,9 @@ void SLAPrint::process() slaposSliceSupports }; - slapsFn print_program[] = { merge_slices_and_eval_stats, rasterize }; SLAPrintStep print_steps[] = { slapsMergeSlicesAndEval, slapsRasterize }; - - double st = min_objstatus; + + double st = Steps::min_objstatus; BOOST_LOG_TRIVIAL(info) << "Start slicing process."; @@ -1496,10 +727,10 @@ void SLAPrint::process() std::array step_times {}; auto apply_steps_on_objects = - [this, &st, ostepd, &pobj_program, &step_times, &bench] + [this, &st, &printsteps, &step_times, &bench] (const std::vector &steps) { - unsigned incr = 0; + double incr = 0; for (SLAPrintObject *po : m_objects) { for (SLAPrintObjectStep step : steps) { @@ -1509,19 +740,19 @@ void SLAPrint::process() // throws the canceled signal. throw_if_canceled(); - st += incr * ostepd; + st += incr; if (po->m_stepmask[step] && po->set_started(step)) { - m_report_status(*this, st, OBJ_STEP_LABELS(step)); + m_report_status(*this, st, printsteps.label(step)); bench.start(); - pobj_program[step](*po); + printsteps.execute(step, *po); bench.stop(); step_times[step] += bench.getElapsedSec(); throw_if_canceled(); po->set_done(step); } - - incr = OBJ_STEP_LEVELS[step]; + + incr = printsteps.progressrange(step); } } }; @@ -1531,23 +762,22 @@ void SLAPrint::process() // this would disable the rasterization step // std::fill(m_stepmask.begin(), m_stepmask.end(), false); - - double pstd = (100 - max_objstatus) / 100.0; - st = max_objstatus; + + st = Steps::max_objstatus; for(SLAPrintStep currentstep : print_steps) { throw_if_canceled(); if (m_stepmask[currentstep] && set_started(currentstep)) { - m_report_status(*this, st, PRINT_STEP_LABELS(currentstep)); + m_report_status(*this, st, printsteps.label(currentstep)); bench.start(); - print_program[currentstep](); + printsteps.execute(currentstep); bench.stop(); step_times[slaposCount + currentstep] += bench.getElapsedSec(); throw_if_canceled(); set_done(currentstep); } - - st += PRINT_STEP_LEVELS[currentstep] * pstd; + + st += printsteps.progressrange(currentstep); } // If everything vent well @@ -1556,10 +786,10 @@ void SLAPrint::process() #ifdef SLAPRINT_DO_BENCHMARK std::string csvbenchstr; for (size_t i = 0; i < size_t(slaposCount); ++i) - csvbenchstr += OBJ_STEP_LABELS(i) + ";"; + csvbenchstr += printsteps.label(SLAPrintObjectStep(i)) + ";"; for (size_t i = 0; i < size_t(slapsCount); ++i) - csvbenchstr += PRINT_STEP_LABELS(i) + ";"; + csvbenchstr += printsteps.label(SLAPrintStep(i)) + ";"; csvbenchstr += "\n"; for (double t : step_times) csvbenchstr += std::to_string(t) + ";"; @@ -1579,6 +809,8 @@ bool SLAPrint::invalidate_state_by_config_options(const std::vector 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 { @@ -1711,7 +913,14 @@ bool SLAPrintObject::invalidate_state_by_config_options(const std::vector steps; bool invalidated = false; for (const t_config_option_key &opt_key : opt_keys) { - if ( opt_key == "layer_height" + if ( opt_key == "hollowing_enable" + || opt_key == "hollowing_min_thickness" + || opt_key == "hollowing_quality" + || opt_key == "hollowing_closing_distance" + ) { + steps.emplace_back(slaposHollowing); + } else if ( + opt_key == "layer_height" || opt_key == "faded_layers" || opt_key == "pad_enable" || opt_key == "pad_wall_thickness" @@ -1731,6 +940,8 @@ bool SLAPrintObject::invalidate_state_by_config_options(const std::vectorinvalidate_all_steps(); + } else if (step == slaposDrillHoles) { + invalidated |= this->invalidate_steps({ slaposObjectSlice, slaposSupportPoints, slaposSupportTree, slaposPad, slaposSliceSupports }); + invalidated |= m_print->invalidate_step(slapsMergeSlicesAndEval); + } else if (step == slaposObjectSlice) { + invalidated |= this->invalidate_steps({ slaposSupportPoints, slaposSupportTree, slaposPad, slaposSliceSupports }); + invalidated |= m_print->invalidate_step(slapsMergeSlicesAndEval); } else if (step == slaposSupportPoints) { invalidated |= this->invalidate_steps({ slaposSupportTree, slaposPad, slaposSliceSupports }); invalidated |= m_print->invalidate_step(slapsMergeSlicesAndEval); @@ -1868,22 +1085,21 @@ const std::vector &SLAPrintObject::get_support_slices() const const ExPolygons &SliceRecord::get_slice(SliceOrigin o) const { - size_t idx = o == soModel ? m_model_slices_idx : - m_support_slices_idx; + size_t idx = o == soModel ? m_model_slices_idx : m_support_slices_idx; if(m_po == nullptr) return EMPTY_SLICE; const std::vector& v = o == soModel? m_po->get_model_slices() : m_po->get_support_slices(); - if(idx >= v.size()) return EMPTY_SLICE; - return idx >= v.size() ? EMPTY_SLICE : v[idx]; } bool SLAPrintObject::has_mesh(SLAPrintObjectStep step) const { switch (step) { + case slaposDrillHoles: + return m_hollowing_data && !m_hollowing_data->hollow_mesh_with_holes.empty(); case slaposSupportTree: return ! this->support_mesh().empty(); case slaposPad: @@ -1900,6 +1116,10 @@ TriangleMesh SLAPrintObject::get_mesh(SLAPrintObjectStep step) const return this->support_mesh(); case slaposPad: return this->pad_mesh(); + case slaposDrillHoles: + if (m_hollowing_data) + return m_hollowing_data->hollow_mesh_with_holes; + [[fallthrough]]; default: return TriangleMesh(); } @@ -1925,6 +1145,14 @@ const TriangleMesh& SLAPrintObject::pad_mesh() const return EMPTY_MESH; } +const TriangleMesh &SLAPrintObject::hollowed_interior_mesh() const +{ + if (m_hollowing_data && m_config.hollowing_enable.getBool()) + return m_hollowing_data->interior; + + return EMPTY_MESH; +} + const TriangleMesh &SLAPrintObject::transformed_mesh() const { // we need to transform the raw mesh... // currently all the instances share the same x and y rotation and scaling @@ -1938,21 +1166,42 @@ const TriangleMesh &SLAPrintObject::transformed_mesh() const { return m_transformed_rmesh.get(); } -std::vector SLAPrintObject::transformed_support_points() const +sla::SupportPoints SLAPrintObject::transformed_support_points() const { assert(m_model_object != nullptr); - std::vector& spts = m_model_object->sla_support_points; + auto spts = m_model_object->sla_support_points; + auto tr = trafo().cast(); + for (sla::SupportPoint& suppt : spts) { + suppt.pos = tr * suppt.pos; + } + + return spts; +} - // this could be cached as well - std::vector ret; - ret.reserve(spts.size()); +sla::DrainHoles SLAPrintObject::transformed_drainhole_points() const +{ + assert(m_model_object != nullptr); + auto pts = m_model_object->sla_drain_holes; + auto tr = trafo().cast(); + auto sc = m_model_object->instances.front()->get_scaling_factor().cast(); + for (sla::DrainHole &hl : pts) { + hl.pos = tr * hl.pos; + hl.normal = tr * hl.normal - tr.translation(); - for(sla::SupportPoint& sp : spts) { - Vec3f transformed_pos = trafo().cast() * sp.pos; - ret.emplace_back(transformed_pos, sp.head_front_radius, sp.is_new_island); + // The normal scales as a covector (and we must also + // undo the damage already done). + 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 ret; + return pts; } DynamicConfig SLAPrintStatistics::config() const diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp index 8f386d407f..a4305e0c31 100644 --- a/src/libslic3r/SLAPrint.hpp +++ b/src/libslic3r/SLAPrint.hpp @@ -3,8 +3,8 @@ #include #include "PrintBase.hpp" -//#include "PrintExport.hpp" -#include "SLA/SLARasterWriter.hpp" +#include "SLA/RasterBase.hpp" +#include "SLA/SupportTree.hpp" #include "Point.hpp" #include "MTUtils.hpp" #include "Zipper.hpp" @@ -19,6 +19,8 @@ enum SLAPrintStep : unsigned int { }; enum SLAPrintObjectStep : unsigned int { + slaposHollowing, + slaposDrillHoles, slaposObjectSlice, slaposSupportPoints, slaposSupportTree, @@ -73,13 +75,23 @@ public: // Support mesh is only valid if this->is_step_done(slaposSupportTree) is true. const TriangleMesh& support_mesh() const; // Get a pad mesh centered around origin in XY, and with zero rotation around Z applied. - // Support mesh is only valid if this->is_step_done(slaposBasePool) is true. + // Support mesh is only valid if this->is_step_done(slaposPad) is true. const TriangleMesh& pad_mesh() const; + + // Ready after this->is_step_done(slaposDrillHoles) is true + const TriangleMesh& hollowed_interior_mesh() const; + + // Get the mesh that is going to be printed with all the modifications + // like hollowing and drilled holes. + const TriangleMesh & get_mesh_to_print() const { + return (m_hollowing_data && is_step_done(slaposDrillHoles)) ? m_hollowing_data->hollow_mesh_with_holes : transformed_mesh(); + } // This will return the transformed mesh which is cached const TriangleMesh& transformed_mesh() const; - std::vector transformed_support_points() const; + sla::SupportPoints transformed_support_points() const; + sla::DrainHoles transformed_drainhole_points() const; // Get the needed Z elevation for the model geometry if supports should be // displayed. This Z offset should also be applied to the support @@ -126,9 +138,9 @@ public: // Returns the current layer height float layer_height() const { return m_height; } - bool is_valid() const { return ! std::isnan(m_slice_z); } + bool is_valid() const { return m_po && ! std::isnan(m_slice_z); } - const SLAPrintObject* print_obj() const { assert(m_po); return m_po; } + const SLAPrintObject* print_obj() const { return m_po; } // Methods for setting the indices into the slice vectors. void set_model_slice_idx(const SLAPrintObject &po, size_t id) { @@ -140,6 +152,10 @@ public: } const ExPolygons& get_slice(SliceOrigin o) const; + size_t get_slice_idx(SliceOrigin o) const + { + return o == soModel ? m_model_slices_idx : m_support_slices_idx; + } }; private: @@ -245,7 +261,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); } @@ -287,9 +303,35 @@ private: // Caching the transformed (m_trafo) raw mesh of the object mutable CachedObject m_transformed_rmesh; - - class SupportData; + + class SupportData : public sla::SupportableMesh + { + public: + sla::SupportTree::UPtr support_tree_ptr; // the supports + std::vector support_slices; // sliced supports + + inline SupportData(const TriangleMesh &t) + : sla::SupportableMesh{t, {}, {}} + {} + + sla::SupportTree::UPtr &create_support_tree(const sla::JobController &ctl) + { + support_tree_ptr = sla::SupportTree::create(*this, ctl); + return support_tree_ptr; + } + }; + std::unique_ptr m_supportdata; + + class HollowingData + { + public: + + TriangleMesh interior; + mutable TriangleMesh hollow_mesh_with_holes; // caching the complete hollowed mesh + }; + + std::unique_ptr m_hollowing_data; }; using PrintObjects = std::vector; @@ -327,6 +369,32 @@ struct SLAPrintStatistics } }; +class SLAPrinter { +protected: + std::vector m_layers; + + virtual uqptr 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 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()); + }); + } +}; + /** * @brief This class is the high level FSM for the SLA printing process. * @@ -339,7 +407,9 @@ class SLAPrint : public PrintBaseWithState { private: // Prevents erroneous use by other classes. typedef PrintBaseWithState Inherited; - + + class Steps; // See SLAPrintSteps.cpp + public: SLAPrint(): m_stepmask(slapsCount, true) {} @@ -350,6 +420,8 @@ public: void clear() override; bool empty() const override { return m_objects.empty(); } + // List of existing PrintObject IDs, to remove notifications for non-existent IDs. + std::vector print_object_ids() const; ApplyStatus apply(const Model &model, DynamicPrintConfig config) override; void set_task(const TaskParams ¶ms) override; void process() override; @@ -359,19 +431,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; } @@ -381,6 +448,9 @@ public: // Extracted value from the configuration objects Vec3d relative_correction() const; + // Return sla tansformation for a given model_object + Transform3d sla_trafo(const ModelObject &model_object) const; + std::string output_filename(const std::string &filename_base = std::string()) const override; const SLAPrintStatistics& print_statistics() const { return m_print_statistics; } @@ -398,14 +468,15 @@ public: std::vector m_transformed_slices; - template void transformed_slices(Container&& c) { + template void transformed_slices(Container&& c) + { m_transformed_slices = std::forward(c); } - - friend void SLAPrint::process(); + + friend class SLAPrint::Steps; public: - + explicit PrintLayer(coord_t lvl) : m_level(lvl) {} // for being sorted in their container (see m_printer_input) @@ -427,8 +498,11 @@ public: // The aggregated and leveled print records from various objects. // TODO: use this structure for the preview in the future. const std::vector& print_layers() const { return m_printer_input; } - + + void set_printer(SLAPrinter *archiver); + private: + // Implement same logic as in SLAPrintObject bool invalidate_step(SLAPrintStep st); @@ -444,13 +518,13 @@ private: std::vector m_stepmask; // Ready-made data for rasterization. - std::vector m_printer_input; - - // The printer itself - std::unique_ptr m_printer; - + std::vector 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 { @@ -465,19 +539,23 @@ 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; }; +// Helper functions: + +bool is_zero_elevation(const SLAPrintObjectConfig &c); + +sla::SupportTreeConfig make_support_cfg(const SLAPrintObjectConfig& c); + +sla::PadConfig::EmbedObject builtin_pad_cfg(const SLAPrintObjectConfig& c); + +sla::PadConfig make_pad_cfg(const SLAPrintObjectConfig& c); + +bool validate_pad(const TriangleMesh &pad, const sla::PadConfig &pcfg); + + } // namespace Slic3r #endif /* slic3r_SLAPrint_hpp_ */ diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp new file mode 100644 index 0000000000..11c8c6f4e6 --- /dev/null +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -0,0 +1,910 @@ +#include +#include +#include + +// Need the cylinder method for the the drainholes in hollowing step +#include + +#include +#include +#include + +#include + +#include + +// For geometry algorithms with native Clipper types (no copies and conversions) +#include + +#include + +#include "I18N.hpp" + +//! macro used to mark string used at localization, +//! return same string +#define L(s) Slic3r::I18N::translate(s) + +namespace Slic3r { + +namespace { + +const std::array OBJ_STEP_LEVELS = { + 10, // slaposHollowing, + 10, // slaposDrillHoles + 10, // slaposObjectSlice, + 20, // slaposSupportPoints, + 10, // slaposSupportTree, + 10, // slaposPad, + 30, // slaposSliceSupports, +}; + +std::string OBJ_STEP_LABELS(size_t idx) +{ + switch (idx) { + case slaposHollowing: return L("Hollowing model"); + case slaposDrillHoles: return L("Drilling holes into model."); + case slaposObjectSlice: return L("Slicing model"); + case slaposSupportPoints: return L("Generating support points"); + case slaposSupportTree: return L("Generating support tree"); + case slaposPad: return L("Generating pad"); + case slaposSliceSupports: return L("Slicing supports"); + default:; + } + assert(false); + return "Out of bounds!"; +} + +const std::array PRINT_STEP_LEVELS = { + 10, // slapsMergeSlicesAndEval + 90, // slapsRasterize +}; + +std::string PRINT_STEP_LABELS(size_t idx) +{ + switch (idx) { + case slapsMergeSlicesAndEval: return L("Merging slices and calculating statistics"); + case slapsRasterize: return L("Rasterizing layers"); + default:; + } + assert(false); return "Out of bounds!"; +} + +} + +SLAPrint::Steps::Steps(SLAPrint *print) + : m_print{print} + , m_rng{std::random_device{}()} + , objcount{m_print->m_objects.size()} + , ilhd{m_print->m_material_config.initial_layer_height.getFloat()} + , ilh{float(ilhd)} + , ilhs{scaled(ilhd)} + , objectstep_scale{(max_objstatus - min_objstatus) / (objcount * 100.0)} +{} + +void SLAPrint::Steps::apply_printer_corrections(SLAPrintObject &po, SliceOrigin o) +{ + if (o == soSupport && !po.m_supportdata) return; + + auto faded_lyrs = size_t(po.m_config.faded_layers.getInt()); + double min_w = m_print->m_printer_config.elefant_foot_min_width.getFloat() / 2.; + double start_efc = m_print->m_printer_config.elefant_foot_compensation.getFloat(); + + double doffs = m_print->m_printer_config.absolute_correction.getFloat(); + 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_efc](size_t pos) { + return (faded_lyrs_efc - pos) * start_efc / faded_lyrs_efc; + }; + + std::vector &slices = o == soModel ? + po.m_model_slices : + po.m_supportdata->support_slices; + + if (clpr_offs != 0) for (size_t i = 0; i < po.m_slice_index.size(); ++i) { + size_t idx = po.m_slice_index[i].get_slice_idx(o); + if (idx < slices.size()) + slices[idx] = offset_ex(slices[idx], float(clpr_offs)); + } + + if (start_efc > 0.) for (size_t i = 0; i < faded_lyrs; ++i) { + size_t idx = po.m_slice_index[i].get_slice_idx(o); + if (idx < slices.size()) + slices[idx] = elephant_foot_compensation(slices[idx], min_w, efc(i)); + } +} + +void SLAPrint::Steps::hollow_model(SLAPrintObject &po) +{ + po.m_hollowing_data.reset(); + + if (! po.m_config.hollowing_enable.getBool()) { + BOOST_LOG_TRIVIAL(info) << "Skipping hollowing step!"; + return; + } + + BOOST_LOG_TRIVIAL(info) << "Performing hollowing step!"; + + double thickness = po.m_config.hollowing_min_thickness.getFloat(); + double quality = po.m_config.hollowing_quality.getFloat(); + double closing_d = po.m_config.hollowing_closing_distance.getFloat(); + sla::HollowingConfig hlwcfg{thickness, quality, closing_d}; + auto meshptr = generate_interior(po.transformed_mesh(), hlwcfg); + + if (meshptr->empty()) + BOOST_LOG_TRIVIAL(warning) << "Hollowed interior is empty!"; + else { + po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); + po.m_hollowing_data->interior = *meshptr; + } +} + +// Drill holes into the hollowed/original mesh. +void SLAPrint::Steps::drill_holes(SLAPrintObject &po) +{ + bool needs_drilling = ! po.m_model_object->sla_drain_holes.empty(); + bool is_hollowed = (po.m_hollowing_data && ! po.m_hollowing_data->interior.empty()); + + if (! is_hollowed && ! needs_drilling) { + // In this case we can dump any data that might have been + // generated on previous runs. + po.m_hollowing_data.reset(); + return; + } + + if (! po.m_hollowing_data) + po.m_hollowing_data.reset(new SLAPrintObject::HollowingData()); + + // Hollowing and/or drilling is active, m_hollowing_data is valid. + + // Regenerate hollowed mesh, even if it was there already. It may contain + // holes that are no longer on the frontend. + TriangleMesh &hollowed_mesh = po.m_hollowing_data->hollow_mesh_with_holes; + hollowed_mesh = po.transformed_mesh(); + if (! po.m_hollowing_data->interior.empty()) { + hollowed_mesh.merge(po.m_hollowing_data->interior); + hollowed_mesh.require_shared_vertices(); + } + + if (! needs_drilling) { + BOOST_LOG_TRIVIAL(info) << "Drilling skipped (no holes)."; + return; + } + + BOOST_LOG_TRIVIAL(info) << "Drilling drainage holes."; + sla::DrainHoles drainholes = po.transformed_drainhole_points(); + + std::uniform_real_distribution dist(0., float(EPSILON)); + auto holes_mesh_cgal = MeshBoolean::cgal::triangle_mesh_to_cgal({}); + for (sla::DrainHole holept : drainholes) { + holept.normal += Vec3f{dist(m_rng), dist(m_rng), dist(m_rng)}; + holept.normal.normalize(); + holept.pos += Vec3f{dist(m_rng), dist(m_rng), dist(m_rng)}; + TriangleMesh m = sla::to_triangle_mesh(holept.to_mesh()); + m.require_shared_vertices(); + auto cgal_m = MeshBoolean::cgal::triangle_mesh_to_cgal(m); + MeshBoolean::cgal::plus(*holes_mesh_cgal, *cgal_m); + } + + if (MeshBoolean::cgal::does_self_intersect(*holes_mesh_cgal)) + throw Slic3r::SlicingError(L("Too many overlapping holes.")); + + auto hollowed_mesh_cgal = MeshBoolean::cgal::triangle_mesh_to_cgal(hollowed_mesh); + + try { + 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 Slic3r::SlicingError(L( + "Drilling holes into the mesh failed. " + "This is usually caused by broken model. Try to fix it first.")); + } +} + +// The slicing will be performed on an imaginary 1D grid which starts from +// the bottom of the bounding box created around the supported model. So +// the first layer which is usually thicker will be part of the supports +// not the model geometry. Exception is when the model is not in the air +// (elevation is zero) and no pad creation was requested. In this case the +// model geometry starts on the ground level and the initial layer is part +// of it. In any case, the model and the supports have to be sliced in the +// same imaginary grid (the height vector argument to TriangleMeshSlicer). +void SLAPrint::Steps::slice_model(SLAPrintObject &po) +{ + const TriangleMesh &mesh = po.get_mesh_to_print(); + + // We need to prepare the slice index... + + double lhd = m_print->m_objects.front()->m_config.layer_height.getFloat(); + float lh = float(lhd); + coord_t lhs = scaled(lhd); + auto && bb3d = mesh.bounding_box(); + double minZ = bb3d.min(Z) - po.get_elevation(); + double maxZ = bb3d.max(Z); + auto minZf = float(minZ); + coord_t minZs = scaled(minZ); + coord_t maxZs = scaled(maxZ); + + po.m_slice_index.clear(); + + size_t cap = size_t(1 + (maxZs - minZs - ilhs) / lhs); + po.m_slice_index.reserve(cap); + + po.m_slice_index.emplace_back(minZs + ilhs, minZf + ilh / 2.f, ilh); + + for(coord_t h = minZs + ilhs + lhs; h <= maxZs; h += lhs) + po.m_slice_index.emplace_back(h, unscaled(h) - lh / 2.f, lh); + + // Just get the first record that is from the model: + auto slindex_it = + po.closest_slice_record(po.m_slice_index, float(bb3d.min(Z))); + + if(slindex_it == po.m_slice_index.end()) + //TRN To be shown at the status bar on SLA slicing error. + throw Slic3r::RuntimeError( + L("Slicing had to be stopped due to an internal error: " + "Inconsistent slice index.")); + + po.m_model_height_levels.clear(); + po.m_model_height_levels.reserve(po.m_slice_index.size()); + for(auto it = slindex_it; it != po.m_slice_index.end(); ++it) + po.m_model_height_levels.emplace_back(it->slice_level()); + + TriangleMeshSlicer slicer(&mesh); + + po.m_model_slices.clear(); + float closing_r = float(po.config().slice_closing_radius.value); + auto thr = [this]() { m_print->throw_if_canceled(); }; + auto &slice_grid = po.m_model_height_levels; + slicer.slice(slice_grid, SlicingMode::Regular, closing_r, &po.m_model_slices, thr); + + if (po.m_hollowing_data && ! po.m_hollowing_data->interior.empty()) { + po.m_hollowing_data->interior.repair(true); + TriangleMeshSlicer interior_slicer(&po.m_hollowing_data->interior); + std::vector interior_slices; + interior_slicer.slice(slice_grid, SlicingMode::Regular, closing_r, &interior_slices, thr); + + 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; + for (size_t id = 0; + id < po.m_model_slices.size() && mit != po.m_slice_index.end(); + id++) { + mit->set_model_slice_idx(po, id); ++mit; + } + + // We apply the printer correction offset here. + apply_printer_corrections(po, soModel); + + if(po.m_config.supports_enable.getBool() || po.m_config.pad_enable.getBool()) + { + po.m_supportdata.reset(new SLAPrintObject::SupportData(mesh)); + } +} + +// In this step we check the slices, identify island and cover them with +// support points. Then we sprinkle the rest of the mesh. +void SLAPrint::Steps::support_points(SLAPrintObject &po) +{ + // If supports are disabled, we can skip the model scan. + if(!po.m_config.supports_enable.getBool()) return; + + const TriangleMesh &mesh = po.get_mesh_to_print(); + + if (!po.m_supportdata) + po.m_supportdata.reset(new SLAPrintObject::SupportData(mesh)); + + const ModelObject& mo = *po.m_model_object; + + BOOST_LOG_TRIVIAL(debug) << "Support point count " + << mo.sla_support_points.size(); + + // Unless the user modified the points or we already did the calculation, + // we will do the autoplacement. Otherwise we will just blindly copy the + // frontend data into the backend cache. + if (mo.sla_points_status != sla::PointsStatus::UserModified) { + + // calculate heights of slices (slices are calculated already) + const std::vector& heights = po.m_model_height_levels; + + // Tell the mesh where drain holes are. Although the points are + // calculated on slices, the algorithm then raycasts the points + // so they actually lie on the mesh. +// po.m_supportdata->emesh.load_holes(po.transformed_drainhole_points()); + + throw_if_canceled(); + sla::SupportPointGenerator::Config config; + const SLAPrintObjectConfig& cfg = po.config(); + + // the density config value is in percents: + config.density_relative = float(cfg.support_points_density_relative / 100.f); + config.minimal_distance = float(cfg.support_points_minimal_distance); + config.head_diameter = float(cfg.support_head_front_diameter); + + // scaling for the sub operations + double d = objectstep_scale * OBJ_STEP_LEVELS[slaposSupportPoints] / 100.0; + double init = current_status(); + + auto statuscb = [this, d, init](unsigned st) + { + double current = init + st * d; + if(std::round(current_status()) < std::round(current)) + report_status(current, OBJ_STEP_LABELS(slaposSupportPoints)); + }; + + // Construction of this object does the calculation. + throw_if_canceled(); + sla::SupportPointGenerator auto_supports( + po.m_supportdata->emesh, po.get_model_slices(), heights, config, + [this]() { throw_if_canceled(); }, statuscb); + + // Now let's extract the result. + const std::vector& points = auto_supports.output(); + throw_if_canceled(); + po.m_supportdata->pts = points; + + BOOST_LOG_TRIVIAL(debug) << "Automatic support points: " + << po.m_supportdata->pts.size(); + + // Using RELOAD_SLA_SUPPORT_POINTS to tell the Plater to pass + // the update status to GLGizmoSlaSupports + report_status(-1, L("Generating support points"), + SlicingStatus::RELOAD_SLA_SUPPORT_POINTS); + } else { + // There are either some points on the front-end, or the user + // removed them on purpose. No calculation will be done. + po.m_supportdata->pts = po.transformed_support_points(); + } +} + +void SLAPrint::Steps::support_tree(SLAPrintObject &po) +{ + if(!po.m_supportdata) return; + + sla::PadConfig pcfg = make_pad_cfg(po.m_config); + + 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()); + + // scaling for the sub operations + double d = objectstep_scale * OBJ_STEP_LEVELS[slaposSupportTree] / 100.0; + double init = current_status(); + sla::JobController ctl; + + ctl.statuscb = [this, d, init](unsigned st, const std::string &logmsg) { + double current = init + st * d; + if (std::round(current_status()) < std::round(current)) + report_status(current, OBJ_STEP_LABELS(slaposSupportTree), + SlicingStatus::DEFAULT, logmsg); + }; + ctl.stopcondition = [this]() { return canceled(); }; + ctl.cancelfn = [this]() { throw_if_canceled(); }; + + po.m_supportdata->create_support_tree(ctl); + + if (!po.m_config.supports_enable.getBool()) return; + + throw_if_canceled(); + + // Create the unified mesh + auto rc = SlicingStatus::RELOAD_SCENE; + + // This is to prevent "Done." being displayed during merged_mesh() + report_status(-1, L("Visualizing supports")); + + BOOST_LOG_TRIVIAL(debug) << "Processed support point count " + << po.m_supportdata->pts.size(); + + // Check the mesh for later troubleshooting. + if(po.support_mesh().empty()) + BOOST_LOG_TRIVIAL(warning) << "Support mesh is empty"; + + report_status(-1, L("Visualizing supports"), rc); +} + +void SLAPrint::Steps::generate_pad(SLAPrintObject &po) { + // this step can only go after the support tree has been created + // and before the supports had been sliced. (or the slicing has to be + // repeated) + + if(po.m_config.pad_enable.getBool()) { + // Get the distilled pad configuration from the config + sla::PadConfig pcfg = make_pad_cfg(po.m_config); + + ExPolygons bp; // This will store the base plate of the pad. + double pad_h = pcfg.full_height(); + const TriangleMesh &trmesh = po.transformed_mesh(); + + if (!po.m_config.supports_enable.getBool() || pcfg.embed_object) { + // No support (thus no elevation) or zero elevation mode + // we sometimes call it "builtin pad" is enabled so we will + // get a sample from the bottom of the mesh and use it for pad + // creation. + sla::pad_blueprint(trmesh, bp, float(pad_h), + float(po.m_config.layer_height.getFloat()), + [this](){ throw_if_canceled(); }); + } + + po.m_supportdata->support_tree_ptr->add_pad(bp, pcfg); + auto &pad_mesh = po.m_supportdata->support_tree_ptr->retrieve_mesh(sla::MeshType::Pad); + + if (!validate_pad(pad_mesh, pcfg)) + throw Slic3r::SlicingError( + L("No pad can be generated for this model with the " + "current configuration")); + + } else if(po.m_supportdata && po.m_supportdata->support_tree_ptr) { + po.m_supportdata->support_tree_ptr->remove_pad(); + } + + throw_if_canceled(); + report_status(-1, L("Visualizing supports"), SlicingStatus::RELOAD_SCENE); +} + +// Slicing the support geometries similarly to the model slicing procedure. +// If the pad had been added previously (see step "base_pool" than it will +// be part of the slices) +void SLAPrint::Steps::slice_supports(SLAPrintObject &po) { + auto& sd = po.m_supportdata; + + if(sd) sd->support_slices.clear(); + + // Don't bother if no supports and no pad is present. + if (!po.m_config.supports_enable.getBool() && !po.m_config.pad_enable.getBool()) + return; + + if(sd && sd->support_tree_ptr) { + auto heights = reserve_vector(po.m_slice_index.size()); + + for(auto& rec : po.m_slice_index) heights.emplace_back(rec.slice_level()); + + sd->support_slices = sd->support_tree_ptr->slice( + heights, float(po.config().slice_closing_radius.value)); + } + + for (size_t i = 0; i < sd->support_slices.size() && i < po.m_slice_index.size(); ++i) + po.m_slice_index[i].set_support_slice_idx(po, i); + + apply_printer_corrections(po, soSupport); + + // Using RELOAD_SLA_PREVIEW to tell the Plater to pass the update + // status to the 3D preview to load the SLA slices. + report_status(-2, "", SlicingStatus::RELOAD_SLA_PREVIEW); +} + +using ClipperPoint = ClipperLib::IntPoint; +using ClipperPolygon = ClipperLib::Polygon; // see clipper_polygon.hpp in libnest2d +using ClipperPolygons = std::vector; + +static ClipperPolygons polyunion(const ClipperPolygons &subjects) +{ + ClipperLib::Clipper clipper; + + bool closed = true; + + for(auto& path : subjects) { + clipper.AddPath(path.Contour, ClipperLib::ptSubject, closed); + clipper.AddPaths(path.Holes, ClipperLib::ptSubject, closed); + } + + auto mode = ClipperLib::pftPositive; + + return libnest2d::clipper_execute(clipper, ClipperLib::ctUnion, mode, mode); +} + +static ClipperPolygons polydiff(const ClipperPolygons &subjects, const ClipperPolygons& clips) +{ + ClipperLib::Clipper clipper; + + bool closed = true; + + for(auto& path : subjects) { + clipper.AddPath(path.Contour, ClipperLib::ptSubject, closed); + clipper.AddPaths(path.Holes, ClipperLib::ptSubject, closed); + } + + for(auto& path : clips) { + clipper.AddPath(path.Contour, ClipperLib::ptClip, closed); + clipper.AddPaths(path.Holes, ClipperLib::ptClip, closed); + } + + auto mode = ClipperLib::pftPositive; + + return libnest2d::clipper_execute(clipper, ClipperLib::ctDifference, mode, mode); +} + +// get polygons for all instances in the object +static ClipperPolygons get_all_polygons(const SliceRecord& record, SliceOrigin o) +{ + namespace sl = libnest2d::sl; + + if (!record.print_obj()) return {}; + + ClipperPolygons polygons; + auto &input_polygons = record.get_slice(o); + auto &instances = record.print_obj()->instances(); + bool is_lefthanded = record.print_obj()->is_left_handed(); + polygons.reserve(input_polygons.size() * instances.size()); + + for (const ExPolygon& polygon : input_polygons) { + if(polygon.contour.empty()) continue; + + for (size_t i = 0; i < instances.size(); ++i) + { + ClipperPolygon poly; + + // We need to reverse if is_lefthanded is true but + bool needreverse = is_lefthanded; + + // should be a move + poly.Contour.reserve(polygon.contour.size() + 1); + + auto& cntr = polygon.contour.points; + if(needreverse) + for(auto it = cntr.rbegin(); it != cntr.rend(); ++it) + poly.Contour.emplace_back(it->x(), it->y()); + else + for(auto& p : cntr) + poly.Contour.emplace_back(p.x(), p.y()); + + for(auto& h : polygon.holes) { + poly.Holes.emplace_back(); + auto& hole = poly.Holes.back(); + hole.reserve(h.points.size() + 1); + + if(needreverse) + for(auto it = h.points.rbegin(); it != h.points.rend(); ++it) + hole.emplace_back(it->x(), it->y()); + else + for(auto& p : h.points) + hole.emplace_back(p.x(), p.y()); + } + + if(is_lefthanded) { + for(auto& p : poly.Contour) p.X = -p.X; + for(auto& h : poly.Holes) for(auto& p : h) p.X = -p.X; + } + + sl::rotate(poly, double(instances[i].rotation)); + sl::translate(poly, ClipperPoint{instances[i].shift.x(), + instances[i].shift.y()}); + + polygons.emplace_back(std::move(poly)); + } + } + + return polygons; +} + +void SLAPrint::Steps::initialize_printer_input() +{ + auto &printer_input = m_print->m_printer_input; + + // clear the rasterizer input + printer_input.clear(); + + size_t mx = 0; + for(SLAPrintObject * o : m_print->m_objects) { + if(auto m = o->get_slice_index().size() > mx) mx = m; + } + + printer_input.reserve(mx); + + auto eps = coord_t(SCALED_EPSILON); + + for(SLAPrintObject * o : m_print->m_objects) { + coord_t gndlvl = o->get_slice_index().front().print_level() - ilhs; + + for(const SliceRecord& slicerecord : o->get_slice_index()) { + if (!slicerecord.is_valid()) + throw Slic3r::SlicingError( + L("There are unprintable objects. Try to " + "adjust support settings to make the " + "objects printable.")); + + coord_t lvlid = slicerecord.print_level() - gndlvl; + + // Neat trick to round the layer levels to the grid. + lvlid = eps * (lvlid / eps); + + auto it = std::lower_bound(printer_input.begin(), + printer_input.end(), + PrintLayer(lvlid)); + + if(it == printer_input.end() || it->level() != lvlid) + it = printer_input.insert(it, PrintLayer(lvlid)); + + + it->add(slicerecord); + } + } +} + +// Merging the slices from all the print objects into one slice grid and +// calculating print statistics from the merge result. +void SLAPrint::Steps::merge_slices_and_eval_stats() { + + initialize_printer_input(); + + auto &print_statistics = m_print->m_print_statistics; + auto &printer_config = m_print->m_printer_config; + auto &material_config = m_print->m_material_config; + auto &printer_input = m_print->m_printer_input; + + print_statistics.clear(); + + // libnest calculates positive area for clockwise polygons, Slic3r is in counter-clockwise + auto areafn = [](const ClipperPolygon& poly) { return - libnest2d::sl::area(poly); }; + + const double area_fill = printer_config.area_fill.getFloat()*0.01;// 0.5 (50%); + const double fast_tilt = printer_config.fast_tilt_time.getFloat();// 5.0; + const double slow_tilt = printer_config.slow_tilt_time.getFloat();// 8.0; + + const double init_exp_time = material_config.initial_exposure_time.getFloat(); + const double exp_time = material_config.exposure_time.getFloat(); + + const int fade_layers_cnt = m_print->m_default_object_config.faded_layers.getInt();// 10 // [3;20] + + const auto width = scaled(printer_config.display_width.getFloat()); + const auto height = scaled(printer_config.display_height.getFloat()); + const double display_area = width*height; + + double supports_volume(0.0); + double models_volume(0.0); + + double estim_time(0.0); + + size_t slow_layers = 0; + size_t fast_layers = 0; + + const double delta_fade_time = (init_exp_time - exp_time) / (fade_layers_cnt + 1); + double fade_layer_time = init_exp_time; + + sla::ccr::SpinningMutex mutex; + using Lock = std::lock_guard; + + // Going to parallel: + 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](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(); + + if(slicerecord_references.empty()) return; + + // Layer height should match for all object slices for a given level. + const auto l_height = double(slicerecord_references.front().get().layer_height()); + + // Calculation of the consumed material + + ClipperPolygons model_polygons; + ClipperPolygons supports_polygons; + + size_t c = std::accumulate(layer.slices().begin(), + layer.slices().end(), + size_t(0), + [](size_t a, const SliceRecord &sr) { + return a + sr.get_slice(soModel).size(); + }); + + model_polygons.reserve(c); + + c = std::accumulate(layer.slices().begin(), + layer.slices().end(), + size_t(0), + [](size_t a, const SliceRecord &sr) { + return a + sr.get_slice(soModel).size(); + }); + + supports_polygons.reserve(c); + + for(const SliceRecord& record : layer.slices()) { + + ClipperPolygons modelslices = get_all_polygons(record, soModel); + for(ClipperPolygon& p_tmp : modelslices) model_polygons.emplace_back(std::move(p_tmp)); + + ClipperPolygons supportslices = get_all_polygons(record, soSupport); + for(ClipperPolygon& p_tmp : supportslices) supports_polygons.emplace_back(std::move(p_tmp)); + + } + + model_polygons = polyunion(model_polygons); + double layer_model_area = 0; + for (const ClipperPolygon& polygon : model_polygons) + layer_model_area += areafn(polygon); + + if (layer_model_area < 0 || layer_model_area > 0) { + Lock lck(mutex); models_volume += layer_model_area * l_height; + } + + if(!supports_polygons.empty()) { + if(model_polygons.empty()) supports_polygons = polyunion(supports_polygons); + else supports_polygons = polydiff(supports_polygons, model_polygons); + // allegedly, union of subject is done withing the diff according to the pftPositive polyFillType + } + + double layer_support_area = 0; + for (const ClipperPolygon& polygon : supports_polygons) + layer_support_area += areafn(polygon); + + if (layer_support_area < 0 || layer_support_area > 0) { + Lock lck(mutex); supports_volume += layer_support_area * l_height; + } + + // Here we can save the expensively calculated polygons for printing + ClipperPolygons trslices; + trslices.reserve(model_polygons.size() + supports_polygons.size()); + for(ClipperPolygon& poly : model_polygons) trslices.emplace_back(std::move(poly)); + for(ClipperPolygon& poly : supports_polygons) trslices.emplace_back(std::move(poly)); + + layer.transformed_slices(polyunion(trslices)); + + // Calculation of the slow and fast layers to the future controlling those values on FW + + const bool is_fast_layer = (layer_model_area + layer_support_area) <= display_area*area_fill; + const double tilt_time = is_fast_layer ? fast_tilt : slow_tilt; + + { Lock lck(mutex); + if (is_fast_layer) + fast_layers++; + else + slow_layers++; + + + // Calculation of the printing time + + if (sliced_layer_cnt < 3) + estim_time += init_exp_time; + else if (fade_layer_time > exp_time) + { + fade_layer_time -= delta_fade_time; + estim_time += fade_layer_time; + } + else + estim_time += exp_time; + + estim_time += tilt_time; + } + }; + + // sequential version for debugging: + // for(size_t i = 0; i < m_printer_input.size(); ++i) printlayerfn(i); + 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; + print_statistics.objects_used_material = models_volume * SCALING2; + + // Estimated printing time + // A layers count o the highest object + if (printer_input.size() == 0) + print_statistics.estimated_print_time = std::nan(""); + else + print_statistics.estimated_print_time = estim_time; + + print_statistics.fast_layers_count = fast_layers; + print_statistics.slow_layers_count = slow_layers; + + report_status(-2, "", SlicingStatus::RELOAD_SLA_PREVIEW); +} + +// Rasterizing the model objects, and their supports +void SLAPrint::Steps::rasterize() +{ + if(canceled() || !m_print->m_printer) return; + + // coefficient to map the rasterization state (0-99) to the allocated + // portion (slot) of the process state + double sd = (100 - max_objstatus) / 100.0; + + // slot is the portion of 100% that is realted to rasterization + unsigned slot = PRINT_STEP_LEVELS[slapsRasterize]; + + // pst: previous state + double pst = current_status(); + + double increment = (slot * sd) / m_print->m_printer_input.size(); + double dstatus = current_status(); + + sla::ccr::SpinningMutex slck; + using Lock = std::lock_guard; + + // procedure to process one height level. This will run in parallel + auto lvlfn = + [this, &slck, increment, &dstatus, &pst] + (sla::RasterBase& raster, size_t idx) + { + PrintLayer& printlayer = m_print->m_printer_input[idx]; + if(canceled()) return; + + for (const ClipperLib::Polygon& poly : printlayer.transformed_slices()) + raster.draw(poly); + + // Status indication guarded with the spinlock + { + Lock lck(slck); + dstatus += increment; + double st = std::round(dstatus); + if(st > pst) { + report_status(st, PRINT_STEP_LABELS(slapsRasterize)); + pst = st; + } + } + }; + + // last minute escape + if(canceled()) return; + + // Print all the layers in parallel + m_print->m_printer->draw_layers(m_print->m_printer_input.size(), lvlfn); +} + +std::string SLAPrint::Steps::label(SLAPrintObjectStep step) +{ + return OBJ_STEP_LABELS(step); +} + +std::string SLAPrint::Steps::label(SLAPrintStep step) +{ + return PRINT_STEP_LABELS(step); +} + +double SLAPrint::Steps::progressrange(SLAPrintObjectStep step) const +{ + return OBJ_STEP_LEVELS[step] * objectstep_scale; +} + +double SLAPrint::Steps::progressrange(SLAPrintStep step) const +{ + return PRINT_STEP_LEVELS[step] * (100 - max_objstatus) / 100.0; +} + +void SLAPrint::Steps::execute(SLAPrintObjectStep step, SLAPrintObject &obj) +{ + switch(step) { + case slaposHollowing: hollow_model(obj); break; + case slaposDrillHoles: drill_holes(obj); break; + case slaposObjectSlice: slice_model(obj); break; + case slaposSupportPoints: support_points(obj); break; + case slaposSupportTree: support_tree(obj); break; + case slaposPad: generate_pad(obj); break; + case slaposSliceSupports: slice_supports(obj); break; + case slaposCount: assert(false); + } +} + +void SLAPrint::Steps::execute(SLAPrintStep step) +{ + switch (step) { + case slapsMergeSlicesAndEval: merge_slices_and_eval_stats(); break; + case slapsRasterize: rasterize(); break; + case slapsCount: assert(false); + } +} + +} diff --git a/src/libslic3r/SLAPrintSteps.hpp b/src/libslic3r/SLAPrintSteps.hpp new file mode 100644 index 0000000000..19b64d4a98 --- /dev/null +++ b/src/libslic3r/SLAPrintSteps.hpp @@ -0,0 +1,74 @@ +#ifndef SLAPRINTSTEPS_HPP +#define SLAPRINTSTEPS_HPP + +#include + +#include + +#include +#include + +namespace Slic3r { + +class SLAPrint::Steps +{ +private: + SLAPrint *m_print = nullptr; + std::mt19937 m_rng; + +public: + // where the per object operations start and end + static const constexpr unsigned min_objstatus = 0; + static const constexpr unsigned max_objstatus = 50; + +private: + const size_t objcount; + + // shortcut to initial layer height + const double ilhd; + const float ilh; + const coord_t ilhs; + + // the coefficient that multiplies the per object status values which + // are set up for <0, 100>. They need to be scaled into the whole process + const double objectstep_scale; + + template void report_status(Args&&...args) + { + m_print->m_report_status(*m_print, std::forward(args)...); + } + + double current_status() const { return m_print->m_report_status.status(); } + void throw_if_canceled() const { m_print->throw_if_canceled(); } + bool canceled() const { return m_print->canceled(); } + void initialize_printer_input(); + + void apply_printer_corrections(SLAPrintObject &po, SliceOrigin o); + +public: + explicit Steps(SLAPrint *print); + + void hollow_model(SLAPrintObject &po); + void drill_holes (SLAPrintObject &po); + void slice_model(SLAPrintObject& po); + void support_points(SLAPrintObject& po); + void support_tree(SLAPrintObject& po); + void generate_pad(SLAPrintObject& po); + void slice_supports(SLAPrintObject& po); + + void merge_slices_and_eval_stats(); + void rasterize(); + + void execute(SLAPrintObjectStep step, SLAPrintObject &obj); + void execute(SLAPrintStep step); + + static std::string label(SLAPrintObjectStep step); + static std::string label(SLAPrintStep step); + + double progressrange(SLAPrintObjectStep step) const; + double progressrange(SLAPrintStep step) const; +}; + +} + +#endif // SLAPRINTSTEPS_HPP diff --git a/src/libslic3r/SVG.cpp b/src/libslic3r/SVG.cpp index 6e4b973eac..1c1c906c9f 100644 --- a/src/libslic3r/SVG.cpp +++ b/src/libslic3r/SVG.cpp @@ -21,6 +21,7 @@ bool SVG::open(const char* afilename) " \n" " \n" ); + fprintf(this->f, "\n", 2000.f, 2000.f); return true; } @@ -42,6 +43,7 @@ bool SVG::open(const char* afilename, const BoundingBox &bbox, const coord_t bbo " \n" " \n", h, w); + fprintf(this->f, "\n", w, h); return true; } diff --git a/src/libslic3r/Semver.hpp b/src/libslic3r/Semver.hpp index a755becaa5..f55fa9f9f4 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(); @@ -114,6 +116,7 @@ public: bool operator&(const Semver &b) const { return ::semver_satisfies_patch(ver, b.ver) != 0; } bool operator^(const Semver &b) const { return ::semver_satisfies_caret(ver, b.ver) != 0; } bool in_range(const Semver &low, const Semver &high) const { return low <= *this && *this <= high; } + bool valid() const { return *this != zero() && *this != inf() && *this != invalid(); } // Conversion std::string to_string() const { @@ -148,7 +151,7 @@ private: Semver(semver_t ver) : ver(ver) {} static semver_t semver_zero() { return { 0, 0, 0, nullptr, nullptr }; } - static char * strdup(const std::string &str) { return ::semver_strdup(const_cast(str.c_str())); } + static char * strdup(const std::string &str) { return ::semver_strdup(str.data()); } }; diff --git a/src/libslic3r/ShortestPath.cpp b/src/libslic3r/ShortestPath.cpp index b38655e68a..3d5903df13 100644 --- a/src/libslic3r/ShortestPath.cpp +++ b/src/libslic3r/ShortestPath.cpp @@ -38,11 +38,13 @@ std::vector> chain_segments_closest_point(std::vector 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; } #ifndef NDEBUG @@ -72,7 +74,7 @@ std::vector> chain_segments_greedy_constrained_reversals else if (num_segments == 1) { // Just sort the end points so that the first point visited is closest to start_near. - out.emplace_back(0, start_near != nullptr && + out.emplace_back(0, could_reverse_func(0) && start_near != nullptr && (end_point_func(0, true) - *start_near).template cast().squaredNorm() < (end_point_func(0, false) - *start_near).template cast().squaredNorm()); } else @@ -164,7 +166,9 @@ std::vector> chain_segments_greedy_constrained_reversals EndPoint *first_point = nullptr; size_t first_point_idx = std::numeric_limits::max(); if (start_near != nullptr) { - size_t idx = find_closest_point(kdtree, start_near->template cast()); + size_t idx = find_closest_point(kdtree, start_near->template cast(), + // 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.; @@ -191,7 +195,7 @@ std::vector> chain_segments_greedy_constrained_reversals } // Initialize a heap of end points sorted by the lowest distance to the next valid point of a path. - auto queue = make_mutable_priority_queue( + auto queue = make_mutable_priority_queue( [](EndPoint *ep, size_t idx){ ep->heap_idx = idx; }, [](EndPoint *l, EndPoint *r){ return l->distance_out < r->distance_out; }); queue.reserve(end_points.size() * 2 - 1); @@ -389,6 +393,585 @@ std::vector> chain_segments_greedy_constrained_reversals return out; } +template +void update_end_point_in_queue(QueueType &queue, const KDTreeType &kdtree, ChainsType &chains, std::vector &end_points, EndPointType &end_point, size_t first_point_idx, const EndPointType *first_point) +{ + // Updating an end point or a 2nd from an end point. + size_t this_idx = end_point.index(end_points); + // If this segment is not the starting segment, then this end point or the opposite is unconnected. + assert(first_point_idx == this_idx || first_point_idx == (this_idx ^ 1) || end_point.chain_id == 0 || end_point.opposite(end_points).chain_id == 0); + end_point.edge_candidate = nullptr; + if (first_point_idx == this_idx || (end_point.chain_id > 0 && first_point_idx == (this_idx ^ 1))) + { + // One may never flip the 1st edge, don't try it again. + if (! end_point.heap_idx_invalid()) + queue.remove(end_point.heap_idx); + } + else + { + // Update edge_candidate and distance. + size_t chain1a = end_point.chain_id; + size_t chain1b = end_points[this_idx ^ 1].chain_id; + size_t this_chain = chains.equivalent(std::max(chain1a, chain1b)); + // Find the closest point to this end_point, which lies on a different extrusion path (filtered by the filter lambda). + size_t next_idx = find_closest_point(kdtree, end_point.pos, [&end_points, &chains, this_idx, first_point_idx, first_point, this_chain](size_t idx) { + assert(end_points[this_idx].edge_candidate == nullptr); + // Either this end of the edge or the other end of the edge is not yet connected. + assert((end_points[this_idx ].chain_id == 0 && end_points[this_idx ].edge_out == nullptr) || + (end_points[this_idx ^ 1].chain_id == 0 && end_points[this_idx ^ 1].edge_out == nullptr)); + if ((idx ^ this_idx) <= 1 || idx == first_point_idx) + // Points of the same segment shall not be connected. + // Don't connect to the first point, we must not flip the 1st edge. + return false; + size_t chain2a = end_points[idx].chain_id; + size_t chain2b = end_points[idx ^ 1].chain_id; + if (chain2a > 0 && chain2b > 0) + // Only unconnected end point or a point next to an unconnected end point may be connected to. + // Ideally those would be removed from the KD tree, but the update is difficult. + return false; + assert(chain2a == 0 || chain2b == 0); + size_t chain2 = chains.equivalent(std::max(chain2a, chain2b)); + if (this_chain == chain2) + // Don't connect back to the same chain, don't create a loop. + return this_chain == 0; + // Don't connect to a segment requiring flipping if the segment starts or ends with the first point. + if (chain2a > 0) { + // Chain requires flipping. + assert(chain2b == 0); + auto &chain = chains.chain(chain2); + if (chain.begin == first_point || chain.end == first_point) + return false; + } + // Everything is all right, try to connect. + return true; + }); + assert(next_idx < end_points.size()); + assert(chains.equivalent(end_points[next_idx].chain_id) != chains.equivalent(end_points[next_idx ^ 1].chain_id) || end_points[next_idx].chain_id == 0); + end_point.edge_candidate = &end_points[next_idx]; + end_point.distance_out = (end_points[next_idx].pos - end_point.pos).norm(); + if (end_point.chain_id > 0) + end_point.distance_out += chains.chain_flip_penalty(this_chain); + if (end_points[next_idx].chain_id > 0) + // The candidate chain is flipped. + end_point.distance_out += chains.chain_flip_penalty(end_points[next_idx].chain_id); + // Update position of this end point in the queue based on the distance calculated at the line above. + if (end_point.heap_idx_invalid()) + queue.push(&end_point); + else + queue.update(end_point.heap_idx); + } +} + +template +std::vector> chain_segments_greedy_constrained_reversals2_(SegmentEndPointFunc end_point_func, CouldReverseFunc could_reverse_func, size_t num_segments, const PointType *start_near) +{ + std::vector> out; + + if (num_segments == 0) { + // Nothing to do. + } + else if (num_segments == 1) + { + // Just sort the end points so that the first point visited is closest to start_near. + out.emplace_back(0, start_near != nullptr && + (end_point_func(0, true) - *start_near).template cast().squaredNorm() < (end_point_func(0, false) - *start_near).template cast().squaredNorm()); + } + else + { + // End points of segments for the KD tree closest point search. + // A single end point is inserted into the search structure for loops, two end points are entered for open paths. + struct EndPoint { + EndPoint(const Vec2d &pos) : pos(pos) {} + Vec2d pos; + + // Candidate for a new connection link. + EndPoint *edge_candidate = nullptr; + // Distance to the next end point following the link. + // Zero value -> start of the final path. + double distance_out = std::numeric_limits::max(); + + size_t heap_idx = std::numeric_limits::max(); + bool heap_idx_invalid() const { return this->heap_idx == std::numeric_limits::max(); } + + // Identifier of the chain, to which this end point belongs. Zero means unassigned. + size_t chain_id = 0; + // Double linked chain of segment end points in current path. + EndPoint *edge_out = nullptr; + + size_t index(std::vector &endpoints) const { return this - endpoints.data(); } + // Opposite end point of the same segment. + EndPoint& opposite(std::vector &endpoints) { return endpoints[(this - endpoints.data()) ^ 1]; } + const EndPoint& opposite(const std::vector &endpoints) const { return endpoints[(this - endpoints.data()) ^ 1]; } + }; + + std::vector end_points; + end_points.reserve(num_segments * 2); + for (size_t i = 0; i < num_segments; ++ i) { + end_points.emplace_back(end_point_func(i, true ).template cast()); + end_points.emplace_back(end_point_func(i, false).template cast()); + } + + // Construct the closest point KD tree over end points of segments. + auto coordinate_fn = [&end_points](size_t idx, size_t dimension) -> double { return end_points[idx].pos[dimension]; }; + KDTreeIndirect<2, double, decltype(coordinate_fn)> kdtree(coordinate_fn, end_points.size()); + + // Chained segments with their sum of connection lengths. + // The chain supports flipping all the segments, connecting the segments at the opposite ends. + // (this is a very useful path optimization for infill lines). + struct Chain { + size_t num_segments = 0; + double cost = 0.; + double cost_flipped = 0.; + EndPoint *begin = nullptr; + EndPoint *end = nullptr; + size_t equivalent_with = 0; + + // Flipping the chain has a time complexity of O(n). + void flip(std::vector &endpoints) + { + assert(this->num_segments > 1); + assert(this->begin->edge_out == nullptr); + assert(this->end ->edge_out == nullptr); + assert(this->begin->opposite(endpoints).edge_out != nullptr); + assert(this->end ->opposite(endpoints).edge_out != nullptr); + // Start of the current segment processed. + EndPoint *ept = this->begin; + // Previous end point to connect the other side of ept to. + EndPoint *ept_prev = nullptr; + do { + EndPoint *ept_end = &ept->opposite(endpoints); + EndPoint *ept_next = ept_end->edge_out; + assert(ept_next == nullptr || ept_next->edge_out == ept_end); + // Connect to the preceding segment. + ept_end->edge_out = ept_prev; + if (ept_prev != nullptr) + ept_prev->edge_out = ept_end; + ept_prev = ept; + ept = ept_next; + } while (ept != nullptr); + ept_prev->edge_out = nullptr; + // Swap the costs. + std::swap(this->cost, this->cost_flipped); + // Swap the ends. + EndPoint *new_begin = &this->begin->opposite(endpoints); + EndPoint *new_end = &this->end->opposite(endpoints); + std::swap(this->begin->chain_id, new_begin->chain_id); + std::swap(this->end ->chain_id, new_end ->chain_id); + this->begin = new_begin; + this->end = new_end; + assert(this->begin->edge_out == nullptr); + assert(this->end ->edge_out == nullptr); + assert(this->begin->opposite(endpoints).edge_out != nullptr); + assert(this->end ->opposite(endpoints).edge_out != nullptr); + } + + double flip_penalty() const { return this->cost_flipped - this->cost; } + }; + + // Helper to detect loops in already connected paths and to accomodate flipping of chains. + // + // Unique chain IDs are assigned to paths. If paths are connected, end points will not have their chain IDs updated, but the chain IDs + // will remember an "equivalent" chain ID, which is the lowest ID of all the IDs in the path, and the lowest ID is equivalent to itself. + // Chain IDs are indexed starting with 1. + // + // Chains remember their lengths and their lengths when each segment of the chain is flipped. + class Chains { + public: + // Zero'th chain ID is invalid. + Chains(size_t reserve) { + m_chains.reserve(reserve / 2); + // Indexing starts with 1. + m_chains.emplace_back(); + } + + // Generate next equivalence class. + size_t next_id() { + m_chains.emplace_back(); + m_chains.back().equivalent_with = ++ m_last_chain_id; + return m_last_chain_id; + } + + // Get equivalence class for chain ID, update the "equivalent_with" along the equivalence path. + size_t equivalent(size_t chain_id) { + if (chain_id != 0) { + for (size_t last = chain_id;;) { + size_t lower = m_chains[last].equivalent_with; + if (lower == last) { + m_chains[chain_id].equivalent_with = lower; + chain_id = lower; + break; + } + last = lower; + } + } + return chain_id; + } + + // Return a lowest chain ID of the two input chains. + // Produce a new chain ID of both chain IDs are zero. + size_t merge(size_t chain_id1, size_t chain_id2) { + if (chain_id1 == 0) + return (chain_id2 == 0) ? this->next_id() : chain_id2; + if (chain_id2 == 0) + return chain_id1; + assert(m_chains[chain_id1].equivalent_with == chain_id1); + assert(m_chains[chain_id2].equivalent_with == chain_id2); + size_t chain_id = std::min(chain_id1, chain_id2); + m_chains[chain_id1].equivalent_with = chain_id; + m_chains[chain_id2].equivalent_with = chain_id; + return chain_id; + } + + Chain& chain(size_t chain_id) { return m_chains[chain_id]; } + const Chain& chain(size_t chain_id) const { return m_chains[chain_id]; } + + double chain_flip_penalty(size_t chain_id) { + chain_id = this->equivalent(chain_id); + return m_chains[chain_id].flip_penalty(); + } + +#ifndef NDEBUG + bool validate() + { + // Validate that the segments merged chain IDs make up a directed acyclic graph + // with edges oriented towards the lower chain ID, therefore all ending up + // in the lowest chain ID of all of them. + assert(m_last_chain_id >= 0); + assert(m_last_chain_id + 1 == m_chains.size()); + for (size_t i = 0; i < m_chains.size(); ++ i) { + for (size_t last = i;;) { + size_t lower = m_chains[last].equivalent_with; + assert(lower <= last); + if (lower == last) + break; + last = lower; + } + } + return true; + } +#endif /* NDEBUG */ + + private: + std::vector m_chains; + // Unique chain ID assigned to chains of end points of segments. + size_t m_last_chain_id = 0; + } chains(num_segments); + + // Find the first end point closest to start_near. + EndPoint *first_point = nullptr; + size_t first_point_idx = std::numeric_limits::max(); + if (start_near != nullptr) { + size_t idx = find_closest_point(kdtree, start_near->template cast()); + assert(idx < end_points.size()); + first_point = &end_points[idx]; + first_point->distance_out = 0.; + first_point->chain_id = chains.next_id(); + Chain &chain = chains.chain(first_point->chain_id); + chain.begin = first_point; + chain.end = &first_point->opposite(end_points); + first_point_idx = idx; + } + EndPoint *initial_point = first_point; + EndPoint *last_point = nullptr; + + // Assign the closest point and distance to the end points. + for (EndPoint &end_point : end_points) { + assert(end_point.edge_candidate == nullptr); + if (&end_point != first_point) { + size_t this_idx = end_point.index(end_points); + // Find the closest point to this end_point, which lies on a different extrusion path (filtered by the lambda). + // 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, end_point.pos, + [this_idx, first_point_idx](size_t idx){ return idx != first_point_idx && (idx ^ this_idx) > 1; }); + assert(next_idx < end_points.size()); + EndPoint &end_point2 = end_points[next_idx]; + end_point.edge_candidate = &end_point2; + end_point.distance_out = (end_point2.pos - end_point.pos).norm(); + } + } + + // Initialize a heap of end points sorted by the lowest distance to the next valid point of a path. + auto queue = make_mutable_priority_queue( + [](EndPoint *ep, size_t idx){ ep->heap_idx = idx; }, + [](EndPoint *l, EndPoint *r){ return l->distance_out < r->distance_out; }); + queue.reserve(end_points.size() * 2); + for (EndPoint &ep : end_points) + if (first_point != &ep) + queue.push(&ep); + +#ifndef NDEBUG + auto validate_graph_and_queue = [&chains, &end_points, &queue, first_point]() -> bool { + assert(chains.validate()); + for (EndPoint &ep : end_points) { + if (ep.heap_idx < queue.size()) { + // End point is on the heap. + assert(*(queue.cbegin() + ep.heap_idx) == &ep); + // One side or the other of the segment is not yet connected. + assert(ep.chain_id == 0 || ep.opposite(end_points).chain_id == 0); + } else { + // End point is NOT on the heap, therefore it must part of the output path. + assert(ep.heap_idx_invalid()); + assert(ep.chain_id != 0); + if (&ep == first_point) { + assert(ep.edge_out == nullptr); + } else { + assert(ep.edge_out != nullptr); + // Detect loops. + for (EndPoint *pt = &ep; pt != nullptr;) { + // Out of queue. It is a final point. + EndPoint *pt_other = &pt->opposite(end_points); + if (pt_other->heap_idx < queue.size()) { + // The other side of this segment is undecided yet. + // assert(pt_other->edge_out == nullptr); + break; + } + pt = pt_other->edge_out; + } + } + } + } + for (EndPoint *ep : queue) + // Points in the queue or the opposites of the same segment are not connected yet. + assert(ep->chain_id == 0 || ep->opposite(end_points).chain_id == 0); + return true; + }; +#endif /* NDEBUG */ + + // Chain the end points: find (num_segments - 1) shortest links not forming bifurcations or loops. + assert(num_segments >= 2); +#ifndef NDEBUG + double distance_taken_last = 0.; +#endif /* NDEBUG */ + // Some links stored onto the priority queue are being invalidated during the calculation and they are not + // updated immediately. If such a situation is detected for an end point pulled from the priority queue, + // the end point is being updated and re-inserted into the priority queue. Therefore the number of iterations + // required is higher than expected (it would be the number of links, num_segments - 1). + // The limit here may not be necessary, but it guards us against an endless loop if something goes wrong. + size_t num_iter = num_segments * 16; + for (size_t num_connections_to_end = num_segments - 1; num_iter > 0; -- num_iter) { + assert(validate_graph_and_queue()); + // Take the first end point, for which the link points to the currently closest valid neighbor. + EndPoint *end_point1 = queue.top(); + assert(end_point1 != first_point); + EndPoint *end_point1_other = &end_point1->opposite(end_points); + // true if end_point1 is not the end of its chain, but the 2nd point. When connecting to the 2nd point, this chain needs + // to be flipped first. + bool chain1_flip = end_point1->chain_id > 0; + // Either this point at the queue is not connected, or it is the 2nd point of a chain. + // If connecting to a 2nd point of a chain, the 1st point shall not yet be connected and this chain will need + // to be flipped. + assert( chain1_flip || (end_point1->chain_id == 0 && end_point1->edge_out == nullptr)); + assert(! chain1_flip || (end_point1_other->chain_id == 0 && end_point1_other->edge_out == nullptr)); + assert(end_point1->edge_candidate != nullptr); +#ifndef NDEBUG + // Each edge added shall be longer than the previous one taken. + //assert(end_point1->distance_out > distance_taken_last - SCALED_EPSILON); + if (end_point1->distance_out < distance_taken_last - SCALED_EPSILON) { +// printf("Warning: taking shorter length than previously is suspicious\n"); + } + distance_taken_last = end_point1->distance_out; +#endif /* NDEBUG */ + // Take the closest end point to the first end point, + EndPoint *end_point2 = end_point1->edge_candidate; + EndPoint *end_point2_other = &end_point2->opposite(end_points); + bool chain2_flip = end_point2->chain_id > 0; + // Is the link from end_point1 to end_point2 still valid? If yes, the link may be taken. Otherwise the link needs to be refreshed. + bool valid = true; + size_t end_point1_chain_id = 0; + size_t end_point2_chain_id = 0; + if (end_point2->chain_id > 0 && end_point2_other->chain_id > 0) { + // The other side is part of the output path. Don't connect to end_point2, update end_point1 and try another one. + valid = false; + } else { + // End points of the opposite ends of the segments. + end_point1_chain_id = chains.equivalent((chain1_flip ? end_point1 : end_point1_other)->chain_id); + end_point2_chain_id = chains.equivalent((chain2_flip ? end_point2 : end_point2_other)->chain_id); + if (end_point1_chain_id == end_point2_chain_id && end_point1_chain_id != 0) + // This edge forms a loop. Update end_point1 and try another one. + valid = false; + else { + // Verify whether end_point1.distance_out still matches the current state of the two end points to be connected and their chains. + // Namely, the other chain may have been flipped in the meantime. + double dist = (end_point2->pos - end_point1->pos).norm(); + if (chain1_flip) + dist += chains.chain_flip_penalty(end_point1_chain_id); + if (chain2_flip) + dist += chains.chain_flip_penalty(end_point2_chain_id); + if (std::abs(dist - end_point1->distance_out) > SCALED_EPSILON) + // The distance changed due to flipping of one of the chains. Refresh this end point in the queue. + valid = false; + } + if (valid && first_point != nullptr) { + // Verify that a chain starting or ending with the first_point does not get flipped. + if (chain1_flip) { + Chain &chain = chains.chain(end_point1_chain_id); + if (chain.begin == first_point || chain.end == first_point) + valid = false; + } + if (valid && chain2_flip) { + Chain &chain = chains.chain(end_point2_chain_id); + if (chain.begin == first_point || chain.end == first_point) + valid = false; + } + } + } + if (valid) { + // Remove the first and second point from the queue. + queue.pop(); + queue.remove(end_point2->heap_idx); + assert(end_point1->edge_candidate == end_point2); + end_point1->edge_candidate = nullptr; + Chain *chain1 = (end_point1_chain_id == 0) ? nullptr : &chains.chain(end_point1_chain_id); + Chain *chain2 = (end_point2_chain_id == 0) ? nullptr : &chains.chain(end_point2_chain_id); + assert(chain1 == nullptr || (chain1_flip ? (chain1->begin == end_point1_other || chain1->end == end_point1_other) : (chain1->begin == end_point1 || chain1->end == end_point1))); + assert(chain2 == nullptr || (chain2_flip ? (chain2->begin == end_point2_other || chain2->end == end_point2_other) : (chain2->begin == end_point2 || chain2->end == end_point2))); + if (chain1_flip) + chain1->flip(end_points); + if (chain2_flip) + chain2->flip(end_points); + assert(chain1 == nullptr || chain1->begin == end_point1 || chain1->end == end_point1); + assert(chain2 == nullptr || chain2->begin == end_point2 || chain2->end == end_point2); + size_t chain_id = chains.merge(end_point1_chain_id, end_point2_chain_id); + Chain &chain = chains.chain(chain_id); + { + Chain chain_dst; + chain_dst.begin = (chain1 == nullptr) ? end_point1_other : (chain1->begin == end_point1) ? chain1->end : chain1->begin; + chain_dst.end = (chain2 == nullptr) ? end_point2_other : (chain2->begin == end_point2) ? chain2->end : chain2->begin; + chain_dst.cost = (chain1 == 0 ? 0. : chain1->cost) + (chain2 == 0 ? 0. : chain2->cost) + (end_point2->pos - end_point1->pos).norm(); + chain_dst.cost_flipped = (chain1 == 0 ? 0. : chain1->cost_flipped) + (chain2 == 0 ? 0. : chain2->cost_flipped) + (end_point2_other->pos - end_point1_other->pos).norm(); + chain_dst.num_segments = (chain1 == 0 ? 1 : chain1->num_segments) + (chain2 == 0 ? 1 : chain2->num_segments); + chain_dst.equivalent_with = chain_id; + chain = chain_dst; + } + if (chain.begin != end_point1_other && ! end_point1_other->heap_idx_invalid()) + queue.remove(end_point1_other->heap_idx); + if (chain.end != end_point2_other && ! end_point2_other->heap_idx_invalid()) + queue.remove(end_point2_other->heap_idx); + end_point1->edge_out = end_point2; + end_point2->edge_out = end_point1; + end_point1->chain_id = chain_id; + end_point2->chain_id = chain_id; + end_point1_other->chain_id = chain_id; + end_point2_other->chain_id = chain_id; + if (chain.begin != first_point) + chain.begin->chain_id = 0; + if (chain.end != first_point) + chain.end->chain_id = 0; + if (-- num_connections_to_end == 0) { + assert(validate_graph_and_queue()); + // Last iteration. There shall be exactly one or two end points waiting to be connected. + assert(queue.size() <= ((first_point == nullptr) ? 4 : 2)); + if (first_point == nullptr) { + // Find the first remaining end point. + do { + first_point = queue.top(); + queue.pop(); + } while (first_point->edge_out != nullptr); + assert(first_point->edge_out == nullptr); + } + // Find the first remaining end point. + do { + last_point = queue.top(); + queue.pop(); + } while (last_point->edge_out != nullptr); + assert(last_point->edge_out == nullptr); +#ifndef NDEBUG + while (! queue.empty()) { + assert(queue.top()->edge_out != nullptr && queue.top()->chain_id > 0); + queue.pop(); + } +#endif /* NDEBUG */ + break; + } else { + //FIXME update the 2nd end points on the queue. + // Update end points of the flipped segments. + update_end_point_in_queue(queue, kdtree, chains, end_points, chain.begin->opposite(end_points), first_point_idx, first_point); + update_end_point_in_queue(queue, kdtree, chains, end_points, chain.end->opposite(end_points), first_point_idx, first_point); + if (chain1_flip) + update_end_point_in_queue(queue, kdtree, chains, end_points, *chain.begin, first_point_idx, first_point); + if (chain2_flip) + update_end_point_in_queue(queue, kdtree, chains, end_points, *chain.end, first_point_idx, first_point); + // End points of chains shall certainly stay in the queue. + assert(chain.begin == first_point || chain.begin->heap_idx < queue.size()); + assert(chain.end == first_point || chain.end ->heap_idx < queue.size()); + assert(&chain.begin->opposite(end_points) != first_point && + (chain.begin == first_point ? chain.begin->opposite(end_points).heap_idx_invalid() : chain.begin->opposite(end_points).heap_idx < queue.size())); + assert(&chain.end ->opposite(end_points) != first_point && + (chain.end == first_point ? chain.end ->opposite(end_points).heap_idx_invalid() : chain.end ->opposite(end_points).heap_idx < queue.size())); + + } + } else { + // This edge forms a loop. Update end_point1 and try another one. + update_end_point_in_queue(queue, kdtree, chains, end_points, *end_point1, first_point_idx, first_point); +#ifndef NDEBUG + // Each edge shall be longer than the last one removed from the queue. + //assert(end_point1->distance_out > distance_taken_last - SCALED_EPSILON); + if (end_point1->distance_out < distance_taken_last - SCALED_EPSILON) { +// printf("Warning: taking shorter length than previously is suspicious\n"); + } +#endif /* NDEBUG */ + //FIXME Remove the other end point from the KD tree. + // As the KD tree update is expensive, do it only after some larger number of points is removed from the queue. + } + assert(validate_graph_and_queue()); + } + assert(queue.empty()); + + // Now interconnect pairs of segments into a chain. + assert(first_point != nullptr); + out.reserve(num_segments); + bool failed = false; + do { + assert(out.size() < num_segments); + size_t first_point_id = first_point - &end_points.front(); + size_t segment_id = first_point_id >> 1; + bool reverse = (first_point_id & 1) != 0; + EndPoint *second_point = &end_points[first_point_id ^ 1]; + if (REVERSE_COULD_FAIL) { + if (reverse && ! could_reverse_func(segment_id)) { + failed = true; + break; + } + } else { + assert(! reverse || could_reverse_func(segment_id)); + } + out.emplace_back(segment_id, reverse); + first_point = second_point->edge_out; + } while (first_point != nullptr); + if (REVERSE_COULD_FAIL) { + if (failed) { + if (start_near == nullptr) { + // We may try the reverse order. + out.clear(); + first_point = last_point; + failed = false; + do { + assert(out.size() < num_segments); + size_t first_point_id = first_point - &end_points.front(); + size_t segment_id = first_point_id >> 1; + bool reverse = (first_point_id & 1) != 0; + EndPoint *second_point = &end_points[first_point_id ^ 1]; + if (reverse && ! could_reverse_func(segment_id)) { + failed = true; + break; + } + out.emplace_back(segment_id, reverse); + first_point = second_point->edge_out; + } while (first_point != nullptr); + } + } + if (failed) + // As a last resort, try a dumb algorithm, which is not sensitive to edge reversal constraints. + out = chain_segments_closest_point(end_points, kdtree, could_reverse_func, (initial_point != nullptr) ? *initial_point : end_points.front()); + } else { + assert(! failed); + } + } + + assert(out.size() == num_segments); + return out; +} + template std::vector> chain_segments_greedy_constrained_reversals(SegmentEndPointFunc end_point_func, CouldReverseFunc could_reverse_func, size_t num_segments, const PointType *start_near) { @@ -402,18 +985,31 @@ std::vector> chain_segments_greedy(SegmentEndPointFunc e return chain_segments_greedy_constrained_reversals_(end_point_func, could_reverse_func, num_segments, start_near); } +template +std::vector> chain_segments_greedy_constrained_reversals2(SegmentEndPointFunc end_point_func, CouldReverseFunc could_reverse_func, size_t num_segments, const PointType *start_near) +{ + return chain_segments_greedy_constrained_reversals2_(end_point_func, could_reverse_func, num_segments, start_near); +} + +template +std::vector> chain_segments_greedy2(SegmentEndPointFunc end_point_func, size_t num_segments, const PointType *start_near) +{ + auto could_reverse_func = [](size_t /* idx */) -> bool { return true; }; + return chain_segments_greedy_constrained_reversals2_(end_point_func, could_reverse_func, num_segments, start_near); +} + std::vector> chain_extrusion_entities(std::vector &entities, const Point *start_near) { auto segment_end_point = [&entities](size_t idx, bool first_point) -> const Point& { return first_point ? entities[idx]->first_point() : entities[idx]->last_point(); }; auto could_reverse = [&entities](size_t idx) { const ExtrusionEntity *ee = entities[idx]; return ee->is_loop() || ee->can_reverse(); }; std::vector> out = chain_segments_greedy_constrained_reversals(segment_end_point, could_reverse, entities.size(), start_near); - for (size_t i = 0; i < entities.size(); ++ i) { - ExtrusionEntity *ee = entities[i]; + for (std::pair &segment : out) { + ExtrusionEntity *ee = entities[segment.first]; if (ee->is_loop()) // Ignore reversals for loops, as the start point equals the end point. - out[i].second = false; + segment.second = false; // Is can_reverse() respected by the reversals? - assert(entities[i]->can_reverse() || ! out[i].second); + assert(ee->can_reverse() || ! segment.second); } return out; } @@ -472,8 +1068,22 @@ std::vector chain_points(const Points &points, Point *start_near) return out; } +#ifndef NDEBUG + // #define DEBUG_SVG_OUTPUT +#endif /* NDEBUG */ + +#ifdef DEBUG_SVG_OUTPUT +void svg_draw_polyline_chain(const char *name, size_t idx, const Polylines &polylines) +{ + BoundingBox bbox = get_extents(polylines); + SVG svg(debug_out_path("%s-%d.svg", name, idx).c_str(), bbox); + svg.draw(polylines); + for (size_t i = 1; i < polylines.size(); ++i) + svg.draw(Line(polylines[i - 1].last_point(), polylines[i].first_point()), "red"); +} +#endif /* DEBUG_SVG_OUTPUT */ + // Flip the sequences of polylines to lower the total length of connecting lines. -// #define DEBUG_SVG_OUTPUT static inline void improve_ordering_by_segment_flipping(Polylines &polylines, bool fixed_start) { #ifndef NDEBUG @@ -487,14 +1097,8 @@ static inline void improve_ordering_by_segment_flipping(Polylines &polylines, bo static int iRun = 0; ++ iRun; - BoundingBox bbox = get_extents(polylines); #ifdef DEBUG_SVG_OUTPUT - { - SVG svg(debug_out_path("improve_ordering_by_segment_flipping-initial-%d.svg", iRun).c_str(), bbox); - svg.draw(polylines); - for (size_t i = 1; i < polylines.size(); ++ i) - svg.draw(Line(polylines[i - 1].last_point(), polylines[i].first_point()), "red"); - } + svg_draw_polyline_chain("improve_ordering_by_segment_flipping-initial", iRun, polylines); #endif /* DEBUG_SVG_OUTPUT */ #endif /* NDEBUG */ @@ -550,7 +1154,7 @@ static inline void improve_ordering_by_segment_flipping(Polylines &polylines, bo #endif /* NDEBUG */ // Initialize a MutablePriorityHeap of connections between polylines. - auto queue = make_mutable_priority_queue( + auto queue = make_mutable_priority_queue( [](Connection *connection, size_t idx){ connection->heap_idx = idx; }, // Sort by decreasing connection distance. [&polylines, &connections](Connection *l, Connection *r){ return l->squaredNorm(polylines, connections) > r->squaredNorm(polylines, connections); }); @@ -643,34 +1247,689 @@ static inline void improve_ordering_by_segment_flipping(Polylines &polylines, bo #ifndef NDEBUG double cost_final = cost(); #ifdef DEBUG_SVG_OUTPUT + svg_draw_polyline_chain("improve_ordering_by_segment_flipping-final", iRun, polylines); +#endif /* DEBUG_SVG_OUTPUT */ + assert(cost_final <= cost_prev); + assert(cost_final <= cost_initial); +#endif /* NDEBUG */ +} + +struct FlipEdge { + FlipEdge(const Vec2d &p1, const Vec2d &p2, size_t source_index) : p1(p1), p2(p2), source_index(source_index) {} + void flip() { std::swap(this->p1, this->p2); } + Vec2d p1; + Vec2d p2; + size_t source_index; +}; + +struct ConnectionCost { + ConnectionCost(double cost, double cost_flipped) : cost(cost), cost_flipped(cost_flipped) {} + ConnectionCost() : cost(0.), cost_flipped(0.) {} + void flip() { std::swap(this->cost, this->cost_flipped); } + double cost = 0; + double cost_flipped = 0; +}; +static inline ConnectionCost operator-(const ConnectionCost &lhs, const ConnectionCost& rhs) { return ConnectionCost(lhs.cost - rhs.cost, lhs.cost_flipped - rhs.cost_flipped); } + +static inline std::pair minimum_crossover_cost( + const std::vector &edges, + const std::pair &span1, const ConnectionCost &cost1, + const std::pair &span2, const ConnectionCost &cost2, + const std::pair &span3, const ConnectionCost &cost3, + const double cost_current) +{ + auto connection_cost = [&edges]( + const std::pair &span1, const ConnectionCost &cost1, bool reversed1, bool flipped1, + const std::pair &span2, const ConnectionCost &cost2, bool reversed2, bool flipped2, + const std::pair &span3, const ConnectionCost &cost3, bool reversed3, bool flipped3) { + auto first_point = [&edges](const std::pair &span, bool flipped) { return flipped ? edges[span.first].p2 : edges[span.first].p1; }; + auto last_point = [&edges](const std::pair &span, bool flipped) { return flipped ? edges[span.second - 1].p1 : edges[span.second - 1].p2; }; + auto point = [first_point, last_point](const std::pair &span, bool start, bool flipped) { return start ? first_point(span, flipped) : last_point(span, flipped); }; + auto cost = [](const ConnectionCost &acost, bool flipped) { + assert(acost.cost >= 0. && acost.cost_flipped >= 0.); + return flipped ? acost.cost_flipped : acost.cost; + }; + // Ignore reversed single segment spans. + auto simple_span_ignore = [](const std::pair& span, bool reversed) { + return span.first + 1 == span.second && reversed; + }; + assert(span1.first < span1.second); + assert(span2.first < span2.second); + assert(span3.first < span3.second); + return + simple_span_ignore(span1, reversed1) || simple_span_ignore(span2, reversed2) || simple_span_ignore(span3, reversed3) ? + // Don't perform unnecessary calculations simulating reversion of single segment spans. + std::numeric_limits::max() : + // Calculate the cost of reverting chains and / or flipping segment orientations. + cost(cost1, flipped1) + cost(cost2, flipped2) + cost(cost3, flipped3) + + (point(span2, ! reversed2, flipped2) - point(span1, reversed1, flipped1)).norm() + + (point(span3, ! reversed3, flipped3) - point(span2, reversed2, flipped2)).norm(); + }; + +#ifndef NDEBUG { - SVG svg(debug_out_path("improve_ordering_by_segment_flipping-final-%d.svg", iRun).c_str(), bbox); - svg.draw(polylines); - for (size_t i = 1; i < polylines.size(); ++ i) - svg.draw(Line(polylines[i - 1].last_point(), polylines[i].first_point()), "red"); + double c = connection_cost(span1, cost1, false, false, span2, cost2, false, false, span3, cost3, false, false); + assert(std::abs(c - cost_current) < SCALED_EPSILON); } +#endif /* NDEBUG */ + + double cost_min = cost_current; + size_t flip_min = 0; // no flip, no improvement + for (size_t i = 0; i < (1 << 6); ++ i) { + // From the three combinations of 1,2,3 ordering, the other three are reversals of the first three. + double c1 = (i == 0) ? cost_current : + connection_cost(span1, cost1, (i & 1) != 0, (i & (1 << 1)) != 0, span2, cost2, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span3, cost3, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0); + double c2 = connection_cost(span1, cost1, (i & 1) != 0, (i & (1 << 1)) != 0, span3, cost3, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span2, cost2, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0); + double c3 = connection_cost(span2, cost2, (i & 1) != 0, (i & (1 << 1)) != 0, span1, cost1, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span3, cost3, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0); + if (c1 < cost_min) { + cost_min = c1; + flip_min = i; + } + if (c2 < cost_min) { + cost_min = c2; + flip_min = i + (1 << 6); + } + if (c3 < cost_min) { + cost_min = c3; + flip_min = i + (2 << 6); + } + } + return std::make_pair(cost_min, flip_min); +} + +static inline std::pair minimum_crossover_cost( + const std::vector &edges, + const std::pair &span1, const ConnectionCost &cost1, + const std::pair &span2, const ConnectionCost &cost2, + const std::pair &span3, const ConnectionCost &cost3, + const std::pair &span4, const ConnectionCost &cost4, + const double cost_current) +{ + auto connection_cost = [&edges]( + const std::pair &span1, const ConnectionCost &cost1, bool reversed1, bool flipped1, + const std::pair &span2, const ConnectionCost &cost2, bool reversed2, bool flipped2, + const std::pair &span3, const ConnectionCost &cost3, bool reversed3, bool flipped3, + const std::pair &span4, const ConnectionCost &cost4, bool reversed4, bool flipped4) { + auto first_point = [&edges](const std::pair &span, bool flipped) { return flipped ? edges[span.first].p2 : edges[span.first].p1; }; + auto last_point = [&edges](const std::pair &span, bool flipped) { return flipped ? edges[span.second - 1].p1 : edges[span.second - 1].p2; }; + auto point = [first_point, last_point](const std::pair &span, bool start, bool flipped) { return start ? first_point(span, flipped) : last_point(span, flipped); }; + auto cost = [](const ConnectionCost &acost, bool flipped) { + assert(acost.cost >= 0. && acost.cost_flipped >= 0.); + return flipped ? acost.cost_flipped : acost.cost; + }; + // Ignore reversed single segment spans. + auto simple_span_ignore = [](const std::pair& span, bool reversed) { + return span.first + 1 == span.second && reversed; + }; + assert(span1.first < span1.second); + assert(span2.first < span2.second); + assert(span3.first < span3.second); + assert(span4.first < span4.second); + return + simple_span_ignore(span1, reversed1) || simple_span_ignore(span2, reversed2) || simple_span_ignore(span3, reversed3) || simple_span_ignore(span4, reversed4) ? + // Don't perform unnecessary calculations simulating reversion of single segment spans. + std::numeric_limits::max() : + // Calculate the cost of reverting chains and / or flipping segment orientations. + cost(cost1, flipped1) + cost(cost2, flipped2) + cost(cost3, flipped3) + cost(cost4, flipped4) + + (point(span2, ! reversed2, flipped2) - point(span1, reversed1, flipped1)).norm() + + (point(span3, ! reversed3, flipped3) - point(span2, reversed2, flipped2)).norm() + + (point(span4, ! reversed4, flipped4) - point(span3, reversed3, flipped3)).norm(); + }; + +#ifndef NDEBUG + { + double c = connection_cost(span1, cost1, false, false, span2, cost2, false, false, span3, cost3, false, false, span4, cost4, false, false); + assert(std::abs(c - cost_current) < SCALED_EPSILON); + } +#endif /* NDEBUG */ + + double cost_min = cost_current; + size_t flip_min = 0; // no flip, no improvement + for (size_t i = 0; i < (1 << 8); ++ i) { + // From the three combinations of 1,2,3 ordering, the other three are reversals of the first three. + size_t permutation = 0; + for (double c : { + (i == 0) ? cost_current : + connection_cost(span1, cost1, (i & 1) != 0, (i & (1 << 1)) != 0, span2, cost2, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span3, cost3, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span4, cost4, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(span1, cost1, (i & 1) != 0, (i & (1 << 1)) != 0, span2, cost2, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span4, cost4, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span3, cost3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(span1, cost1, (i & 1) != 0, (i & (1 << 1)) != 0, span3, cost3, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span2, cost2, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span4, cost4, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(span1, cost1, (i & 1) != 0, (i & (1 << 1)) != 0, span3, cost3, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span4, cost4, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span2, cost2, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(span1, cost1, (i & 1) != 0, (i & (1 << 1)) != 0, span4, cost4, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span2, cost2, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span3, cost3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(span1, cost1, (i & 1) != 0, (i & (1 << 1)) != 0, span4, cost4, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span3, cost3, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span2, cost2, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(span2, cost2, (i & 1) != 0, (i & (1 << 1)) != 0, span1, cost1, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span3, cost3, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span4, cost4, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(span2, cost2, (i & 1) != 0, (i & (1 << 1)) != 0, span1, cost1, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span4, cost4, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span3, cost3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(span2, cost2, (i & 1) != 0, (i & (1 << 1)) != 0, span3, cost3, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span1, cost1, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span4, cost4, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(span2, cost2, (i & 1) != 0, (i & (1 << 1)) != 0, span4, cost4, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span1, cost1, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span3, cost3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(span3, cost3, (i & 1) != 0, (i & (1 << 1)) != 0, span1, cost1, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span2, cost2, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span4, cost4, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(span3, cost3, (i & 1) != 0, (i & (1 << 1)) != 0, span2, cost2, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span1, cost1, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span4, cost4, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0) + }) { + if (c < cost_min) { + cost_min = c; + flip_min = i + (permutation << 8); + } + ++ permutation; + } + } + return std::make_pair(cost_min, flip_min); +} + +static inline void do_crossover(const std::vector &edges_in, std::vector &edges_out, + const std::pair &span1, const std::pair &span2, const std::pair &span3, + size_t i) +{ + assert(edges_in.size() == edges_out.size()); + auto do_it = [&edges_in, &edges_out]( + const std::pair &span1, bool reversed1, bool flipped1, + const std::pair &span2, bool reversed2, bool flipped2, + const std::pair &span3, bool reversed3, bool flipped3) { + auto it_edges_out = edges_out.begin(); + auto copy_span = [&edges_in, &edges_out, &it_edges_out](std::pair span, bool reversed, bool flipped) { + assert(span.first < span.second); + auto it = it_edges_out; + if (reversed) + std::reverse_copy(edges_in.begin() + span.first, edges_in.begin() + span.second, it_edges_out); + else + std::copy (edges_in.begin() + span.first, edges_in.begin() + span.second, it_edges_out); + it_edges_out += span.second - span.first; + if (reversed != flipped) { + for (; it != it_edges_out; ++ it) + it->flip(); + } + }; + copy_span(span1, reversed1, flipped1); + copy_span(span2, reversed2, flipped2); + copy_span(span3, reversed3, flipped3); + }; + switch (i >> 6) { + case 0: + do_it(span1, (i & 1) != 0, (i & (1 << 1)) != 0, span2, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span3, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0); + break; + case 1: + do_it(span1, (i & 1) != 0, (i & (1 << 1)) != 0, span3, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span2, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0); + break; + default: + assert((i >> 6) == 2); + do_it(span2, (i & 1) != 0, (i & (1 << 1)) != 0, span1, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span3, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0); + } + assert(edges_in.size() == edges_out.size()); +} + + +static inline void do_crossover(const std::vector &edges_in, std::vector &edges_out, + const std::pair &span1, const std::pair &span2, const std::pair &span3, const std::pair &span4, + size_t i) +{ + assert(edges_in.size() == edges_out.size()); + auto do_it = [&edges_in, &edges_out]( + const std::pair &span1, bool reversed1, bool flipped1, + const std::pair &span2, bool reversed2, bool flipped2, + const std::pair &span3, bool reversed3, bool flipped3, + const std::pair &span4, bool reversed4, bool flipped4) { + auto it_edges_out = edges_out.begin(); + auto copy_span = [&edges_in, &edges_out, &it_edges_out](std::pair span, bool reversed, bool flipped) { + assert(span.first < span.second); + auto it = it_edges_out; + if (reversed) + std::reverse_copy(edges_in.begin() + span.first, edges_in.begin() + span.second, it_edges_out); + else + std::copy (edges_in.begin() + span.first, edges_in.begin() + span.second, it_edges_out); + it_edges_out += span.second - span.first; + if (reversed != flipped) { + for (; it != it_edges_out; ++ it) + it->flip(); + } + }; + copy_span(span1, reversed1, flipped1); + copy_span(span2, reversed2, flipped2); + copy_span(span3, reversed3, flipped3); + copy_span(span4, reversed4, flipped4); + }; + switch (i >> 8) { + case 0: + assert(i != 0); // otherwise it would be a no-op + do_it(span1, (i & 1) != 0, (i & (1 << 1)) != 0, span2, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span3, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span4, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0); + break; + case 1: + do_it(span1, (i & 1) != 0, (i & (1 << 1)) != 0, span2, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span4, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0); + break; + case 2: + do_it(span1, (i & 1) != 0, (i & (1 << 1)) != 0, span3, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span2, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span4, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0); + break; + case 3: + do_it(span1, (i & 1) != 0, (i & (1 << 1)) != 0, span3, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span4, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span2, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0); + break; + case 4: + do_it(span1, (i & 1) != 0, (i & (1 << 1)) != 0, span4, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span2, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0); + break; + case 5: + do_it(span1, (i & 1) != 0, (i & (1 << 1)) != 0, span4, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span3, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span2, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0); + break; + case 6: + do_it(span2, (i & 1) != 0, (i & (1 << 1)) != 0, span1, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span3, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span4, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0); + break; + case 7: + do_it(span2, (i & 1) != 0, (i & (1 << 1)) != 0, span1, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span4, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0); + break; + case 8: + do_it(span2, (i & 1) != 0, (i & (1 << 1)) != 0, span3, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span1, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span4, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0); + break; + case 9: + do_it(span2, (i & 1) != 0, (i & (1 << 1)) != 0, span4, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span1, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0); + break; + case 10: + do_it(span3, (i & 1) != 0, (i & (1 << 1)) != 0, span1, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span2, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span4, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0); + break; + default: + assert((i >> 8) == 11); + do_it(span3, (i & 1) != 0, (i & (1 << 1)) != 0, span2, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, span1, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, span4, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0); + break; + } + assert(edges_in.size() == edges_out.size()); +} + +static inline void reorder_by_two_exchanges_with_segment_flipping(std::vector &edges) +{ + if (edges.size() < 2) + return; + + std::vector connections(edges.size()); + std::vector edges_tmp(edges); + std::vector> connection_lengths(edges.size() - 1, std::pair(0., 0)); + std::vector connection_tried(edges.size(), false); + for (size_t iter = 0; iter < edges.size(); ++ iter) { + // Initialize connection costs and connection lengths. + for (size_t i = 1; i < edges.size(); ++ i) { + const FlipEdge &e1 = edges[i - 1]; + const FlipEdge &e2 = edges[i]; + ConnectionCost &c = connections[i]; + c = connections[i - 1]; + double l = (e2.p1 - e1.p2).norm(); + c.cost += l; + c.cost_flipped += (e2.p2 - e1.p1).norm(); + connection_lengths[i - 1] = std::make_pair(l, i); + } + std::sort(connection_lengths.begin(), connection_lengths.end(), [](const std::pair &l, const std::pair &r) { return l.first > r.first; }); + std::fill(connection_tried.begin(), connection_tried.end(), false); + size_t crossover1_pos_final = std::numeric_limits::max(); + size_t crossover2_pos_final = std::numeric_limits::max(); + size_t crossover_flip_final = 0; + for (const std::pair &first_crossover_candidate : connection_lengths) { + double longest_connection_length = first_crossover_candidate.first; + size_t longest_connection_idx = first_crossover_candidate.second; + connection_tried[longest_connection_idx] = true; + // Find the second crossover connection with the lowest total chain cost. + size_t crossover_pos_min = std::numeric_limits::max(); + double crossover_cost_min = connections.back().cost; + size_t crossover_flip_min = 0; + for (size_t j = 1; j < connections.size(); ++ j) + if (! connection_tried[j]) { + size_t a = j; + size_t b = longest_connection_idx; + if (a > b) + std::swap(a, b); + std::pair cost_and_flip = minimum_crossover_cost(edges, + std::make_pair(size_t(0), a), connections[a - 1], std::make_pair(a, b), connections[b - 1] - connections[a], std::make_pair(b, edges.size()), connections.back() - connections[b], + connections.back().cost); + if (cost_and_flip.second > 0 && cost_and_flip.first < crossover_cost_min) { + crossover_pos_min = j; + crossover_cost_min = cost_and_flip.first; + crossover_flip_min = cost_and_flip.second; + assert(crossover_cost_min < connections.back().cost + EPSILON); + } + } + if (crossover_cost_min < connections.back().cost) { + // The cost of the chain with the proposed two crossovers has a lower total cost than the current chain. Apply the crossover. + crossover1_pos_final = longest_connection_idx; + crossover2_pos_final = crossover_pos_min; + crossover_flip_final = crossover_flip_min; + break; + } else { + // Continue with another long candidate edge. + } + } + if (crossover_flip_final > 0) { + // Pair of cross over positions and flip / reverse constellation has been found, which improves the total cost of the connection. + // Perform a crossover. + if (crossover1_pos_final > crossover2_pos_final) + std::swap(crossover1_pos_final, crossover2_pos_final); + do_crossover(edges, edges_tmp, std::make_pair(size_t(0), crossover1_pos_final), std::make_pair(crossover1_pos_final, crossover2_pos_final), std::make_pair(crossover2_pos_final, edges.size()), crossover_flip_final); + edges.swap(edges_tmp); + } else { + // No valid pair of cross over positions was found improving the total cost. Giving up. + break; + } + } +} + +static inline void reorder_by_three_exchanges_with_segment_flipping(std::vector &edges) +{ + if (edges.size() < 3) { + reorder_by_two_exchanges_with_segment_flipping(edges); + return; + } + + std::vector connections(edges.size()); + std::vector edges_tmp(edges); + std::vector> connection_lengths(edges.size() - 1, std::pair(0., 0)); + std::vector connection_tried(edges.size(), false); + for (size_t iter = 0; iter < edges.size(); ++ iter) { + // Initialize connection costs and connection lengths. + for (size_t i = 1; i < edges.size(); ++ i) { + const FlipEdge &e1 = edges[i - 1]; + const FlipEdge &e2 = edges[i]; + ConnectionCost &c = connections[i]; + c = connections[i - 1]; + double l = (e2.p1 - e1.p2).norm(); + c.cost += l; + c.cost_flipped += (e2.p2 - e1.p1).norm(); + connection_lengths[i - 1] = std::make_pair(l, i); + } + std::sort(connection_lengths.begin(), connection_lengths.end(), [](const std::pair &l, const std::pair &r) { return l.first > r.first; }); + std::fill(connection_tried.begin(), connection_tried.end(), false); + size_t crossover1_pos_final = std::numeric_limits::max(); + size_t crossover2_pos_final = std::numeric_limits::max(); + size_t crossover3_pos_final = std::numeric_limits::max(); + size_t crossover_flip_final = 0; + for (const std::pair &first_crossover_candidate : connection_lengths) { + double longest_connection_length = first_crossover_candidate.first; + size_t longest_connection_idx = first_crossover_candidate.second; + connection_tried[longest_connection_idx] = true; + // Find the second crossover connection with the lowest total chain cost. + size_t crossover_pos_min = std::numeric_limits::max(); + double crossover_cost_min = connections.back().cost; + for (size_t j = 1; j < connections.size(); ++ j) + if (! connection_tried[j]) { + for (size_t k = j + 1; k < connections.size(); ++ k) + if (! connection_tried[k]) { + size_t a = longest_connection_idx; + size_t b = j; + size_t c = k; + if (a > c) + std::swap(a, c); + if (a > b) + std::swap(a, b); + if (b > c) + std::swap(b, c); + std::pair cost_and_flip = minimum_crossover_cost(edges, + std::make_pair(size_t(0), a), connections[a - 1], std::make_pair(a, b), connections[b - 1] - connections[a], + std::make_pair(b, c), connections[c - 1] - connections[b], std::make_pair(c, edges.size()), connections.back() - connections[c], + connections.back().cost); + if (cost_and_flip.second > 0 && cost_and_flip.first < crossover_cost_min) { + crossover_cost_min = cost_and_flip.first; + crossover1_pos_final = a; + crossover2_pos_final = b; + crossover3_pos_final = c; + crossover_flip_final = cost_and_flip.second; + assert(crossover_cost_min < connections.back().cost + EPSILON); + } + } + } + if (crossover_flip_final > 0) { + // The cost of the chain with the proposed two crossovers has a lower total cost than the current chain. Apply the crossover. + break; + } else { + // Continue with another long candidate edge. + } + } + if (crossover_flip_final > 0) { + // Pair of cross over positions and flip / reverse constellation has been found, which improves the total cost of the connection. + // Perform a crossover. + do_crossover(edges, edges_tmp, std::make_pair(size_t(0), crossover1_pos_final), std::make_pair(crossover1_pos_final, crossover2_pos_final), + std::make_pair(crossover2_pos_final, crossover3_pos_final), std::make_pair(crossover3_pos_final, edges.size()), crossover_flip_final); + edges.swap(edges_tmp); + } else { + // No valid pair of cross over positions was found improving the total cost. Giving up. + break; + } + } +} + +typedef Eigen::Matrix Matrixd; + +class FourOptCosts { +public: + FourOptCosts(const ConnectionCost &c1, const ConnectionCost &c2, const ConnectionCost &c3, const ConnectionCost &c4) : costs { &c1, &c2, &c3, &c4 } {} + + double operator()(size_t piece_idx, bool flipped) const { return flipped ? costs[piece_idx]->cost_flipped : costs[piece_idx]->cost; } + +private: + const ConnectionCost* costs[4]; +}; + +static inline std::pair minimum_crossover_cost( + const FourOptCosts &segment_costs, + const Matrixd &segment_end_point_distance_matrix, + const double cost_current) +{ + // Distance from the end of span1 to the start of span2. + auto end_point_distance = [&segment_end_point_distance_matrix](size_t span1, bool reversed1, bool flipped1, size_t span2, bool reversed2, bool flipped2) { + return segment_end_point_distance_matrix(span1 * 4 + (! reversed1) * 2 + flipped1, span2 * 4 + reversed2 * 2 + flipped2); + }; + auto connection_cost = [&segment_costs, end_point_distance]( + const size_t span1, bool reversed1, bool flipped1, + const size_t span2, bool reversed2, bool flipped2, + const size_t span3, bool reversed3, bool flipped3, + const size_t span4, bool reversed4, bool flipped4) { + // Calculate the cost of reverting chains and / or flipping segment orientations. + return segment_costs(span1, flipped1) + segment_costs(span2, flipped2) + segment_costs(span3, flipped3) + segment_costs(span4, flipped4) + + end_point_distance(span1, reversed1, flipped1, span2, reversed2, flipped2) + + end_point_distance(span2, reversed2, flipped2, span3, reversed3, flipped3) + + end_point_distance(span3, reversed3, flipped3, span4, reversed4, flipped4); + }; + +#ifndef NDEBUG + { + double c = connection_cost(0, false, false, 1, false, false, 2, false, false, 3, false, false); + assert(std::abs(c - cost_current) < SCALED_EPSILON); + } +#endif /* NDEBUG */ + + double cost_min = cost_current; + size_t flip_min = 0; // no flip, no improvement + for (size_t i = 0; i < (1 << 8); ++ i) { + // From the three combinations of 1,2,3 ordering, the other three are reversals of the first three. + size_t permutation = 0; + for (double c : { + (i == 0) ? cost_current : + connection_cost(0, (i & 1) != 0, (i & (1 << 1)) != 0, 1, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, 2, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, 3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(0, (i & 1) != 0, (i & (1 << 1)) != 0, 1, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, 3, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, 2, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(0, (i & 1) != 0, (i & (1 << 1)) != 0, 2, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, 1, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, 3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(0, (i & 1) != 0, (i & (1 << 1)) != 0, 2, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, 3, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, 1, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(0, (i & 1) != 0, (i & (1 << 1)) != 0, 3, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, 1, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, 2, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(0, (i & 1) != 0, (i & (1 << 1)) != 0, 3, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, 2, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, 1, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(1, (i & 1) != 0, (i & (1 << 1)) != 0, 0, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, 2, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, 3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(1, (i & 1) != 0, (i & (1 << 1)) != 0, 0, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, 3, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, 2, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(1, (i & 1) != 0, (i & (1 << 1)) != 0, 2, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, 0, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, 3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(1, (i & 1) != 0, (i & (1 << 1)) != 0, 3, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, 0, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, 2, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(2, (i & 1) != 0, (i & (1 << 1)) != 0, 0, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, 1, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, 3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0), + connection_cost(2, (i & 1) != 0, (i & (1 << 1)) != 0, 1, (i & (1 << 2)) != 0, (i & (1 << 3)) != 0, 0, (i & (1 << 4)) != 0, (i & (1 << 5)) != 0, 3, (i & (1 << 6)) != 0, (i & (1 << 7)) != 0) + }) { + if (c < cost_min) { + cost_min = c; + flip_min = i + (permutation << 8); + } + ++ permutation; + } + } + return std::make_pair(cost_min, flip_min); +} + +static inline void reorder_by_three_exchanges_with_segment_flipping2(std::vector &edges) +{ + if (edges.size() < 3) { + reorder_by_two_exchanges_with_segment_flipping(edges); + return; + } + + std::vector connections(edges.size()); + std::vector edges_tmp(edges); + std::vector> connection_lengths(edges.size() - 1, std::pair(0., 0)); + std::vector connection_tried(edges.size(), false); + for (size_t iter = 0; iter < edges.size(); ++ iter) { + // Initialize connection costs and connection lengths. + for (size_t i = 1; i < edges.size(); ++ i) { + const FlipEdge &e1 = edges[i - 1]; + const FlipEdge &e2 = edges[i]; + ConnectionCost &c = connections[i]; + c = connections[i - 1]; + double l = (e2.p1 - e1.p2).norm(); + c.cost += l; + c.cost_flipped += (e2.p2 - e1.p1).norm(); + connection_lengths[i - 1] = std::make_pair(l, i); + } + std::sort(connection_lengths.begin(), connection_lengths.end(), [](const std::pair &l, const std::pair &r) { return l.first > r.first; }); + std::fill(connection_tried.begin(), connection_tried.end(), false); + size_t crossover1_pos_final = std::numeric_limits::max(); + size_t crossover2_pos_final = std::numeric_limits::max(); + size_t crossover3_pos_final = std::numeric_limits::max(); + size_t crossover_flip_final = 0; + // Distances between the end points of the four pieces of the current segment sequence. +#ifdef NDEBUG + Matrixd segment_end_point_distance_matrix(4 * 4, 4 * 4); +#else /* NDEBUG */ + Matrixd segment_end_point_distance_matrix = Matrixd::Constant(4 * 4, 4 * 4, std::numeric_limits::max()); +#endif /* NDEBUG */ + for (const std::pair &first_crossover_candidate : connection_lengths) { + double longest_connection_length = first_crossover_candidate.first; + size_t longest_connection_idx = first_crossover_candidate.second; + connection_tried[longest_connection_idx] = true; + // Find the second crossover connection with the lowest total chain cost. + size_t crossover_pos_min = std::numeric_limits::max(); + double crossover_cost_min = connections.back().cost; + for (size_t j = 1; j < connections.size(); ++ j) + if (! connection_tried[j]) { + for (size_t k = j + 1; k < connections.size(); ++ k) + if (! connection_tried[k]) { + size_t a = longest_connection_idx; + size_t b = j; + size_t c = k; + if (a > c) + std::swap(a, c); + if (a > b) + std::swap(a, b); + if (b > c) + std::swap(b, c); + const Vec2d* endpts[16] = { + &edges[0].p1, &edges[0].p2, &edges[a - 1].p2, &edges[a - 1].p1, + &edges[a].p1, &edges[a].p2, &edges[b - 1].p2, &edges[b - 1].p1, + &edges[b].p1, &edges[b].p2, &edges[c - 1].p2, &edges[c - 1].p1, + &edges[c].p1, &edges[c].p2, &edges.back().p2, &edges.back().p1 }; + for (size_t v = 0; v < 16; ++ v) { + const Vec2d &p1 = *endpts[v]; + for (size_t u = (v & (~3)) + 4; u < 16; ++ u) + segment_end_point_distance_matrix(u, v) = segment_end_point_distance_matrix(v, u) = (*endpts[u] - p1).norm(); + } + FourOptCosts segment_costs(connections[a - 1], connections[b - 1] - connections[a], connections[c - 1] - connections[b], connections.back() - connections[c]); + std::pair cost_and_flip = minimum_crossover_cost(segment_costs, segment_end_point_distance_matrix, connections.back().cost); + if (cost_and_flip.second > 0 && cost_and_flip.first < crossover_cost_min) { + crossover_cost_min = cost_and_flip.first; + crossover1_pos_final = a; + crossover2_pos_final = b; + crossover3_pos_final = c; + crossover_flip_final = cost_and_flip.second; + assert(crossover_cost_min < connections.back().cost + EPSILON); + } + } + } + if (crossover_flip_final > 0) { + // The cost of the chain with the proposed two crossovers has a lower total cost than the current chain. Apply the crossover. + break; + } else { + // Continue with another long candidate edge. + } + } + if (crossover_flip_final > 0) { + // Pair of cross over positions and flip / reverse constellation has been found, which improves the total cost of the connection. + // Perform a crossover. + do_crossover(edges, edges_tmp, std::make_pair(size_t(0), crossover1_pos_final), std::make_pair(crossover1_pos_final, crossover2_pos_final), + std::make_pair(crossover2_pos_final, crossover3_pos_final), std::make_pair(crossover3_pos_final, edges.size()), crossover_flip_final); + edges.swap(edges_tmp); + } else { + // No valid pair of cross over positions was found improving the total cost. Giving up. + break; + } + } +} + +// Flip the sequences of polylines to lower the total length of connecting lines. +static inline void improve_ordering_by_two_exchanges_with_segment_flipping(Polylines &polylines, bool fixed_start) +{ +#ifndef NDEBUG + auto cost = [&polylines]() { + double sum = 0.; + for (size_t i = 1; i < polylines.size(); ++i) + sum += (polylines[i].first_point() - polylines[i - 1].last_point()).cast().norm(); + return sum; + }; + double cost_initial = cost(); + + static int iRun = 0; + ++ iRun; +#ifdef DEBUG_SVG_OUTPUT + svg_draw_polyline_chain("improve_ordering_by_two_exchanges_with_segment_flipping-initial", iRun, polylines); #endif /* DEBUG_SVG_OUTPUT */ #endif /* NDEBUG */ - assert(cost_final <= cost_prev); + std::vector edges; + edges.reserve(polylines.size()); + std::transform(polylines.begin(), polylines.end(), std::back_inserter(edges), + [&polylines](const Polyline &pl){ return FlipEdge(pl.first_point().cast(), pl.last_point().cast(), &pl - polylines.data()); }); +#if 1 + reorder_by_two_exchanges_with_segment_flipping(edges); +#else + // reorder_by_three_exchanges_with_segment_flipping(edges); + reorder_by_three_exchanges_with_segment_flipping2(edges); +#endif + Polylines out; + out.reserve(polylines.size()); + for (const FlipEdge &edge : edges) { + Polyline &pl = polylines[edge.source_index]; + out.emplace_back(std::move(pl)); + if (edge.p2 == pl.first_point().cast()) { + // Polyline is flipped. + out.back().reverse(); + } else { + // Polyline is not flipped. + assert(edge.p1 == pl.first_point().cast()); + } + } + +#ifndef NDEBUG + double cost_final = cost(); +#ifdef DEBUG_SVG_OUTPUT + svg_draw_polyline_chain("improve_ordering_by_two_exchanges_with_segment_flipping-final", iRun, out); +#endif /* DEBUG_SVG_OUTPUT */ assert(cost_final <= cost_initial); +#endif /* NDEBUG */ } Polylines chain_polylines(Polylines &&polylines, const Point *start_near) { +#ifdef DEBUG_SVG_OUTPUT + static int iRun = 0; + ++ iRun; + svg_draw_polyline_chain("chain_polylines-initial", iRun, polylines); +#endif /* DEBUG_SVG_OUTPUT */ + Polylines out; if (! polylines.empty()) { auto segment_end_point = [&polylines](size_t idx, bool first_point) -> const Point& { return first_point ? polylines[idx].first_point() : polylines[idx].last_point(); }; - std::vector> ordered = chain_segments_greedy(segment_end_point, polylines.size(), start_near); + std::vector> ordered = chain_segments_greedy2(segment_end_point, polylines.size(), start_near); out.reserve(polylines.size()); for (auto &segment_and_reversal : ordered) { out.emplace_back(std::move(polylines[segment_and_reversal.first])); if (segment_and_reversal.second) out.back().reverse(); } - if (out.size() > 1) - improve_ordering_by_segment_flipping(out, start_near != nullptr); + if (out.size() > 1 && start_near == nullptr) { + improve_ordering_by_two_exchanges_with_segment_flipping(out, start_near != nullptr); + //improve_ordering_by_segment_flipping(out, start_near != nullptr); + } } + +#ifdef DEBUG_SVG_OUTPUT + svg_draw_polyline_chain("chain_polylines-final", iRun, out); +#endif /* DEBUG_SVG_OUTPUT */ return out; } @@ -690,25 +1949,83 @@ ClipperLib::PolyNodes chain_clipper_polynodes(const Points &points, const Clippe return chain_path_items(points, items); } -std::vector> chain_print_object_instances(const Print &print) +std::vector chain_print_object_instances(const Print &print) { // Order objects using a nearest neighbor search. Points object_reference_points; std::vector> instances; for (size_t i = 0; i < print.objects().size(); ++ i) { const PrintObject &object = *print.objects()[i]; - for (size_t j = 0; j < object.copies().size(); ++ j) { - object_reference_points.emplace_back(object.copy_center(j)); + for (size_t j = 0; j < object.instances().size(); ++ j) { + // Sliced PrintObjects are centered, object.instances()[j].shift is the center of the PrintObject in G-code coordinates. + object_reference_points.emplace_back(object.instances()[j].shift); instances.emplace_back(i, j); } } auto segment_end_point = [&object_reference_points](size_t idx, bool /* first_point */) -> const Point& { return object_reference_points[idx]; }; std::vector> ordered = chain_segments_greedy(segment_end_point, instances.size(), nullptr); - std::vector> out; + std::vector out; out.reserve(instances.size()); - for (auto &segment_and_reversal : ordered) - out.emplace_back(instances[segment_and_reversal.first]); + for (auto &segment_and_reversal : ordered) { + const std::pair &inst = instances[segment_and_reversal.first]; + out.emplace_back(&print.objects()[inst.first]->instances()[inst.second]); + } return out; } +Polylines chain_lines(const std::vector &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 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 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() + line_end->point().cast())).cast(); + // 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 cd342015d7..14912ee857 100644 --- a/src/libslic3r/ShortestPath.hpp +++ b/src/libslic3r/ShortestPath.hpp @@ -30,8 +30,11 @@ std::vector chain_clipper_polynodes(const Points &points // Chain instances of print objects by an approximate shortest path. // Returns pairs of PrintObject idx and instance of that PrintObject. class Print; -std::vector> chain_print_object_instances(const Print &print); +struct PrintInstance; +std::vector chain_print_object_instances(const Print &print); +// Chain lines into polylines. +Polylines chain_lines(const std::vector &lines, const double point_distance_epsilon); } // namespace Slic3r diff --git a/src/libslic3r/SimplifyMesh.cpp b/src/libslic3r/SimplifyMesh.cpp new file mode 100644 index 0000000000..d30ecfec57 --- /dev/null +++ b/src/libslic3r/SimplifyMesh.cpp @@ -0,0 +1,66 @@ +#include "SimplifyMesh.hpp" +#include "SimplifyMeshImpl.hpp" + +namespace SimplifyMesh { + +template<> struct vertex_traits { + using coord_type = float; + using compute_type = double; + + static inline float x(const stl_vertex &v) { return v.x(); } + static inline float& x(stl_vertex &v) { return v.x(); } + + static inline float y(const stl_vertex &v) { return v.y(); } + static inline float& y(stl_vertex &v) { return v.y(); } + + static inline float z(const stl_vertex &v) { return v.z(); } + static inline float& z(stl_vertex &v) { return v.z(); } +}; + +template<> struct mesh_traits { + using vertex_t = stl_vertex; + static size_t face_count(const indexed_triangle_set &m) + { + return m.indices.size(); + } + static size_t vertex_count(const indexed_triangle_set &m) + { + return m.vertices.size(); + } + static vertex_t vertex(const indexed_triangle_set &m, size_t idx) + { + return m.vertices[idx]; + } + static void vertex(indexed_triangle_set &m, size_t idx, const vertex_t &v) + { + m.vertices[idx] = v; + } + static Index3 triangle(const indexed_triangle_set &m, size_t idx) + { + std::array t; + for (size_t i = 0; i < 3; ++i) t[i] = size_t(m.indices[idx](int(i))); + return t; + } + static void triangle(indexed_triangle_set &m, size_t fidx, const Index3 &t) + { + auto &face = m.indices[fidx]; + face(0) = int(t[0]); face(1) = int(t[1]); face(2) = int(t[2]); + } + static void update(indexed_triangle_set &m, size_t vc, size_t fc) + { + m.vertices.resize(vc); + m.indices.resize(fc); + } +}; + +} // namespace SimplifyMesh + +namespace Slic3r { + +void simplify_mesh(indexed_triangle_set &m) +{ + SimplifyMesh::implementation::SimplifiableMesh sm{&m}; + sm.simplify_mesh_lossless(); +} + +} diff --git a/src/libslic3r/SimplifyMesh.hpp b/src/libslic3r/SimplifyMesh.hpp new file mode 100644 index 0000000000..fb3e73d049 --- /dev/null +++ b/src/libslic3r/SimplifyMesh.hpp @@ -0,0 +1,25 @@ +#ifndef MESHSIMPLIFY_HPP +#define MESHSIMPLIFY_HPP + +#include + +#include + +namespace Slic3r { + +void simplify_mesh(indexed_triangle_set &); + +// TODO: (but this can be done with IGL as well) +// void simplify_mesh(indexed_triangle_set &, int face_count, float agressiveness = 0.5f); + +template void simplify_mesh(TriangleMesh &m, Args &&...a) +{ + m.require_shared_vertices(); + simplify_mesh(m.its, std::forward(a)...); + m = TriangleMesh{m.its}; + m.require_shared_vertices(); +} + +} // namespace Slic3r + +#endif // MESHSIMPLIFY_H diff --git a/src/libslic3r/SimplifyMeshImpl.hpp b/src/libslic3r/SimplifyMeshImpl.hpp new file mode 100644 index 0000000000..4b6b0f5cbc --- /dev/null +++ b/src/libslic3r/SimplifyMeshImpl.hpp @@ -0,0 +1,670 @@ +// /////////////////////////////////////////// +// +// Mesh Simplification Tutorial +// +// (C) by Sven Forstmann in 2014 +// +// License : MIT +// http://opensource.org/licenses/MIT +// +// https://github.com/sp4cerat/Fast-Quadric-Mesh-Simplification +// +// 5/2016: Chris Rorden created minimal version for OSX/Linux/Windows compile +// https://github.com/sp4cerat/Fast-Quadric-Mesh-Simplification/ +// +// libslic3r refactor by tamasmeszaros + +#ifndef SIMPLIFYMESHIMPL_HPP +#define SIMPLIFYMESHIMPL_HPP + +#include +#include +#include +#include +#include + +#ifndef NDEBUG +#include +#include +#endif + +namespace SimplifyMesh { + +using Bary = std::array; +using Index3 = std::array; + +template struct vertex_traits { + using coord_type = typename Vertex::coord_type; + using compute_type = coord_type; + + static coord_type x(const Vertex &v); + static coord_type& x(Vertex &v); + + static coord_type y(const Vertex &v); + static coord_type& y(Vertex &v); + + static coord_type z(const Vertex &v); + static coord_type& z(Vertex &v); +}; + +template struct mesh_traits { + using vertex_t = typename Mesh::vertex_t; + + static size_t face_count(const Mesh &m); + static size_t vertex_count(const Mesh &m); + static vertex_t vertex(const Mesh &m, size_t vertex_idx); + static void vertex(Mesh &m, size_t vertex_idx, const vertex_t &v); + static Index3 triangle(const Mesh &m, size_t face_idx); + static void triangle(Mesh &m, size_t face_idx, const Index3 &t); + static void update(Mesh &m, size_t vertex_count, size_t face_count); +}; + +namespace implementation { + +// A shorter C++14 style form of the enable_if metafunction +template +using enable_if_t = typename std::enable_if::type; + +// Meta predicates for floating, integer and generic arithmetic types +template +using FloatingOnly = enable_if_t::value, O>; + +template +using IntegerOnly = enable_if_t::value, O>; + +template +using ArithmeticOnly = enable_if_t::value, O>; + +template< class T > +struct remove_cvref { + using type = typename std::remove_cv< + typename std::remove_reference::type>::type; +}; + +template< class T > +using remove_cvref_t = typename remove_cvref::type; + +template FloatingOnly is_approx(T val, T ref) { return std::abs(val - ref) < 1e-8; } +template IntegerOnly is_approx(T val, T ref) { val == ref; } + +template class SymetricMatrix { + static const constexpr size_t N = 10; +public: + + explicit SymetricMatrix(ArithmeticOnly c = T()) { std::fill(m, m + N, c); } + + // Make plane + SymetricMatrix(T a, T b, T c, T d) + { + m[0] = a * a; m[1] = a * b; m[2] = a * c; m[3] = a * d; + m[4] = b * b; m[5] = b * c; m[6] = b * d; + m[7] = c * c; m[8] = c * d; + m[9] = d * d; + } + + T operator[](int c) const { return m[c]; } + + // Determinant + T det(int a11, int a12, int a13, + int a21, int a22, int a23, + int a31, int a32, int a33) + { + T det = m[a11] * m[a22] * m[a33] + m[a13] * m[a21] * m[a32] + + m[a12] * m[a23] * m[a31] - m[a13] * m[a22] * m[a31] - + m[a11] * m[a23] * m[a32] - m[a12] * m[a21] * m[a33]; + + return det; + } + + const SymetricMatrix& operator+=(const SymetricMatrix& n) + { + for (size_t i = 0; i < N; ++i) m[i] += n[i]; + return *this; + } + + SymetricMatrix operator+(const SymetricMatrix& n) + { + SymetricMatrix self = *this; + return self += n; + } + + T m[N]; +}; + +template using TCoord = typename vertex_traits>::coord_type; +template using TCompute = typename vertex_traits>::compute_type; +template inline TCoord x(const V &v) { return vertex_traits>::x(v); } +template inline TCoord y(const V &v) { return vertex_traits>::y(v); } +template inline TCoord z(const V &v) { return vertex_traits>::z(v); } +template inline TCoord& x(V &v) { return vertex_traits>::x(v); } +template inline TCoord& y(V &v) { return vertex_traits>::y(v); } +template inline TCoord& z(V &v) { return vertex_traits>::z(v); } +template using TVertex = typename mesh_traits>::vertex_t; +template using TMeshCoord = TCoord>; + +template TCompute dot(const Vertex &v1, const Vertex &v2) +{ + return TCompute(x(v1)) * x(v2) + + TCompute(y(v1)) * y(v2) + + TCompute(z(v1)) * z(v2); +} + +template Vertex cross(const Vertex &a, const Vertex &b) +{ + return Vertex{y(a) * z(b) - z(a) * y(b), + z(a) * x(b) - x(a) * z(b), + x(a) * y(b) - y(a) * x(b)}; +} + +template TCompute lengthsq(const Vertex &v) +{ + return TCompute(x(v)) * x(v) + TCompute(y(v)) * y(v) + + TCompute(z(v)) * z(v); +} + +template void normalize(Vertex &v) +{ + double square = std::sqrt(lengthsq(v)); + x(v) /= square; y(v) /= square; z(v) /= square; +} + +using Bary = std::array; + +template +Bary barycentric(const Vertex &p, const Vertex &a, const Vertex &b, const Vertex &c) +{ + Vertex v0 = (b - a); + Vertex v1 = (c - a); + Vertex v2 = (p - a); + + double d00 = dot(v0, v0); + double d01 = dot(v0, v1); + double d11 = dot(v1, v1); + double d20 = dot(v2, v0); + double d21 = dot(v2, v1); + double denom = d00 * d11 - d01 * d01; + double v = (d11 * d20 - d01 * d21) / denom; + double w = (d00 * d21 - d01 * d20) / denom; + double u = 1.0 - v - w; + + return {u, v, w}; +} + +template class SimplifiableMesh { + Mesh *m_mesh; + + using Vertex = TVertex; + using Coord = TMeshCoord; + using HiPrecison = TCompute>; + using SymMat = SymetricMatrix; + + struct FaceInfo { + size_t idx; + double err[4] = {0.}; + bool deleted = false, dirty = false; + Vertex n; + explicit FaceInfo(size_t id): idx(id) {} + }; + + struct VertexInfo { + size_t idx; + size_t tstart = 0, tcount = 0; + bool border = false; + SymMat q; + explicit VertexInfo(size_t id): idx(id) {} + }; + + struct Ref { size_t face; size_t vertex; }; + + std::vector m_refs; + std::vector m_faceinfo; + std::vector m_vertexinfo; + + void compact_faces(); + void compact(); + + size_t mesh_vcount() const { return mesh_traits::vertex_count(*m_mesh); } + size_t mesh_facecount() const { return mesh_traits::face_count(*m_mesh); } + + size_t vcount() const { return m_vertexinfo.size(); } + + inline Vertex read_vertex(size_t vi) const + { + return mesh_traits::vertex(*m_mesh, vi); + } + + inline Vertex read_vertex(const VertexInfo &vinf) const + { + return read_vertex(vinf.idx); + } + + inline void write_vertex(size_t idx, const Vertex &v) const + { + mesh_traits::vertex(*m_mesh, idx, v); + } + + inline void write_vertex(const VertexInfo &vinf, const Vertex &v) const + { + write_vertex(vinf.idx, v); + } + + inline Index3 read_triangle(size_t fi) const + { + return mesh_traits::triangle(*m_mesh, fi); + } + + inline Index3 read_triangle(const FaceInfo &finf) const + { + return read_triangle(finf.idx); + } + + inline void write_triangle(size_t idx, const Index3 &t) + { + return mesh_traits::triangle(*m_mesh, idx, t); + } + + inline void write_triangle(const FaceInfo &finf, const Index3 &t) + { + return write_triangle(finf.idx, t); + } + + inline std::array triangle_vertices(const Index3 &f) const + { + std::array p; + for (size_t i = 0; i < 3; ++i) p[i] = read_vertex(f[i]); + return p; + } + + // Error between vertex and Quadric + static double vertex_error(const SymMat &q, const Vertex &v) + { + Coord _x = x(v) , _y = y(v), _z = z(v); + return q[0] * _x * _x + 2 * q[1] * _x * _y + 2 * q[2] * _x * _z + + 2 * q[3] * _x + q[4] * _y * _y + 2 * q[5] * _y * _z + + 2 * q[6] * _y + q[7] * _z * _z + 2 * q[8] * _z + q[9]; + } + + // Error for one edge + double calculate_error(size_t id_v1, size_t id_v2, Vertex &p_result); + + void calculate_error(FaceInfo &fi) + { + Vertex p; + Index3 t = read_triangle(fi); + for (size_t j = 0; j < 3; ++j) + fi.err[j] = calculate_error(t[j], t[(j + 1) % 3], p); + + fi.err[3] = std::min(fi.err[0], std::min(fi.err[1], fi.err[2])); + } + + void update_mesh(int iteration); + + // Update triangle connections and edge error after a edge is collapsed + void update_triangles(size_t i, VertexInfo &vi, std::vector &deleted, int &deleted_triangles); + + // Check if a triangle flips when this edge is removed + bool flipped(const Vertex &p, size_t i0, size_t i1, VertexInfo &v0, VertexInfo &v1, std::vector &deleted); + +public: + + explicit SimplifiableMesh(Mesh *m) : m_mesh{m} + { + static_assert( + std::is_arithmetic::value, + "Coordinate type of mesh has to be an arithmetic type!"); + + m_faceinfo.reserve(mesh_traits::face_count(*m)); + m_vertexinfo.reserve(mesh_traits::vertex_count(*m)); + for (size_t i = 0; i < mesh_facecount(); ++i) m_faceinfo.emplace_back(i); + for (size_t i = 0; i < mesh_vcount(); ++i) m_vertexinfo.emplace_back(i); + + } + + template void simplify_mesh_lossless(ProgressFn &&fn); + void simplify_mesh_lossless() { simplify_mesh_lossless([](int){}); } +}; + +template void SimplifiableMesh::compact_faces() +{ + auto it = std::remove_if(m_faceinfo.begin(), m_faceinfo.end(), + [](const FaceInfo &inf) { return inf.deleted; }); + + m_faceinfo.erase(it, m_faceinfo.end()); +} + +template void SimplifiableMesh::compact() +{ + for (auto &vi : m_vertexinfo) vi.tcount = 0; + + compact_faces(); + + for (FaceInfo &fi : m_faceinfo) + for (size_t vidx : read_triangle(fi)) m_vertexinfo[vidx].tcount = 1; + + size_t dst = 0; + for (VertexInfo &vi : m_vertexinfo) { + if (vi.tcount) { + vi.tstart = dst; + write_vertex(dst++, read_vertex(vi)); + } + } + + size_t vertex_count = dst; + + dst = 0; + for (const FaceInfo &fi : m_faceinfo) { + Index3 t = read_triangle(fi); + for (size_t &idx : t) idx = m_vertexinfo[idx].tstart; + write_triangle(dst++, t); + } + + mesh_traits::update(*m_mesh, vertex_count, m_faceinfo.size()); +} + +template +double SimplifiableMesh::calculate_error(size_t id_v1, size_t id_v2, Vertex &p_result) +{ + // compute interpolated vertex + + SymMat q = m_vertexinfo[id_v1].q + m_vertexinfo[id_v2].q; + + bool border = m_vertexinfo[id_v1].border & m_vertexinfo[id_v2].border; + double error = 0; + HiPrecison det = q.det(0, 1, 2, 1, 4, 5, 2, 5, 7); + + if (!is_approx(det, HiPrecison(0)) && !border) + { + // q_delta is invertible + x(p_result) = Coord(-1) / det * q.det(1, 2, 3, 4, 5, 6, 5, 7, 8); // vx = A41/det(q_delta) + y(p_result) = Coord( 1) / det * q.det(0, 2, 3, 1, 5, 6, 2, 7, 8); // vy = A42/det(q_delta) + z(p_result) = Coord(-1) / det * q.det(0, 1, 3, 1, 4, 6, 2, 5, 8); // vz = A43/det(q_delta) + + error = vertex_error(q, p_result); + } else { + // det = 0 -> try to find best result + Vertex p1 = read_vertex(id_v1); + Vertex p2 = read_vertex(id_v2); + Vertex p3 = (p1 + p2) / 2; + double error1 = vertex_error(q, p1); + double error2 = vertex_error(q, p2); + double error3 = vertex_error(q, p3); + error = std::min(error1, std::min(error2, error3)); + + if (is_approx(error1, error)) p_result = p1; + if (is_approx(error2, error)) p_result = p2; + if (is_approx(error3, error)) p_result = p3; + } + + return error; +} + +template void SimplifiableMesh::update_mesh(int iteration) +{ + if (iteration > 0) compact_faces(); + + assert(mesh_vcount() == m_vertexinfo.size()); + + // + // Init Quadrics by Plane & Edge Errors + // + // required at the beginning ( iteration == 0 ) + // recomputing during the simplification is not required, + // but mostly improves the result for closed meshes + // + if (iteration == 0) { + + for (VertexInfo &vinf : m_vertexinfo) vinf.q = SymMat{}; + for (FaceInfo &finf : m_faceinfo) { + Index3 t = read_triangle(finf); + std::array p = triangle_vertices(t); + Vertex n = cross(Vertex(p[1] - p[0]), Vertex(p[2] - p[0])); + normalize(n); + finf.n = n; + + for (size_t fi : t) + m_vertexinfo[fi].q += SymMat(x(n), y(n), z(n), -dot(n, p[0])); + + calculate_error(finf); + } + } + + // Init Reference ID list + for (VertexInfo &vi : m_vertexinfo) { vi.tstart = 0; vi.tcount = 0; } + + for (FaceInfo &fi : m_faceinfo) + for (size_t vidx : read_triangle(fi)) + m_vertexinfo[vidx].tcount++; + + size_t tstart = 0; + for (VertexInfo &vi : m_vertexinfo) { + vi.tstart = tstart; + tstart += vi.tcount; + vi.tcount = 0; + } + + // Write References + m_refs.resize(m_faceinfo.size() * 3); + for (size_t i = 0; i < m_faceinfo.size(); ++i) { + const FaceInfo &fi = m_faceinfo[i]; + Index3 t = read_triangle(fi); + for (size_t j = 0; j < 3; ++j) { + VertexInfo &vi = m_vertexinfo[t[j]]; + + assert(vi.tstart + vi.tcount < m_refs.size()); + + Ref &ref = m_refs[vi.tstart + vi.tcount]; + ref.face = i; + ref.vertex = j; + vi.tcount++; + } + } + + // Identify boundary : vertices[].border=0,1 + if (iteration == 0) { + for (VertexInfo &vi: m_vertexinfo) vi.border = false; + + std::vector vcount, vids; + + for (VertexInfo &vi: m_vertexinfo) { + vcount.clear(); + vids.clear(); + + for(size_t j = 0; j < vi.tcount; ++j) { + assert(vi.tstart + j < m_refs.size()); + FaceInfo &fi = m_faceinfo[m_refs[vi.tstart + j].face]; + Index3 t = read_triangle(fi); + + for (size_t fid : t) { + size_t ofs=0; + while (ofs < vcount.size()) + { + if (vids[ofs] == fid) break; + ofs++; + } + if (ofs == vcount.size()) + { + vcount.emplace_back(1); + vids.emplace_back(fid); + } + else + vcount[ofs]++; + } + } + + for (size_t j = 0; j < vcount.size(); ++j) + if(vcount[j] == 1) m_vertexinfo[vids[j]].border = true; + } + } +} + +template +void SimplifiableMesh::update_triangles(size_t i0, + VertexInfo & vi, + std::vector &deleted, + int &deleted_triangles) +{ + Vertex p; + for (size_t k = 0; k < vi.tcount; ++k) { + assert(vi.tstart + k < m_refs.size()); + + Ref &r = m_refs[vi.tstart + k]; + FaceInfo &fi = m_faceinfo[r.face]; + + if (fi.deleted) continue; + + if (deleted[k]) { + fi.deleted = true; + deleted_triangles++; + continue; + } + + Index3 t = read_triangle(fi); + t[r.vertex] = i0; + write_triangle(fi, t); + + fi.dirty = true; + fi.err[0] = calculate_error(t[0], t[1], p); + fi.err[1] = calculate_error(t[1], t[2], p); + fi.err[2] = calculate_error(t[2], t[0], p); + fi.err[3] = std::min(fi.err[0], std::min(fi.err[1], fi.err[2])); + m_refs.emplace_back(r); + } +} + +template +bool SimplifiableMesh::flipped(const Vertex & p, + size_t /*i0*/, + size_t i1, + VertexInfo & v0, + VertexInfo & /*v1*/, + std::vector &deleted) +{ + for (size_t k = 0; k < v0.tcount; ++k) { + size_t ridx = v0.tstart + k; + assert(ridx < m_refs.size()); + + FaceInfo &fi = m_faceinfo[m_refs[ridx].face]; + if (fi.deleted) continue; + + Index3 t = read_triangle(fi); + int s = m_refs[ridx].vertex; + size_t id1 = t[(s+1) % 3]; + size_t id2 = t[(s+2) % 3]; + + if(id1 == i1 || id2 == i1) // delete ? + { + deleted[k] = true; + continue; + } + + Vertex d1 = read_vertex(id1) - p; + normalize(d1); + Vertex d2 = read_vertex(id2) - p; + normalize(d2); + + if (std::abs(dot(d1, d2)) > 0.999) return true; + + Vertex n = cross(d1, d2); + normalize(n); + + deleted[k] = false; + if (dot(n, fi.n) < 0.2) return true; + } + + return false; +} + +template +template void SimplifiableMesh::simplify_mesh_lossless(Fn &&fn) +{ + // init + for (FaceInfo &fi : m_faceinfo) fi.deleted = false; + + // main iteration loop + int deleted_triangles=0; + std::vector deleted0, deleted1; + + for (int iteration = 0; iteration < 9999; iteration ++) { + // update mesh constantly + update_mesh(iteration); + + // clear dirty flag + for (FaceInfo &fi : m_faceinfo) fi.dirty = false; + + // + // All triangles with edges below the threshold will be removed + // + // The following numbers works well for most models. + // If it does not, try to adjust the 3 parameters + // + double threshold = std::numeric_limits::epsilon(); //1.0E-3 EPS; // Really? (tm) + + fn(iteration); + + for (FaceInfo &fi : m_faceinfo) { + if (fi.err[3] > threshold || fi.deleted || fi.dirty) continue; + + for (size_t j = 0; j < 3; ++j) { + if (fi.err[j] > threshold) continue; + + Index3 t = read_triangle(fi); + size_t i0 = t[j]; + VertexInfo &v0 = m_vertexinfo[i0]; + + size_t i1 = t[(j + 1) % 3]; + VertexInfo &v1 = m_vertexinfo[i1]; + + // Border check + if(v0.border != v1.border) continue; + + // Compute vertex to collapse to + Vertex p; + calculate_error(i0, i1, p); + + deleted0.resize(v0.tcount); // normals temporarily + deleted1.resize(v1.tcount); // normals temporarily + + // don't remove if flipped + if (flipped(p, i0, i1, v0, v1, deleted0)) continue; + if (flipped(p, i1, i0, v1, v0, deleted1)) continue; + + // not flipped, so remove edge + write_vertex(v0, p); + v0.q = v1.q + v0.q; + size_t tstart = m_refs.size(); + + update_triangles(i0, v0, deleted0, deleted_triangles); + update_triangles(i0, v1, deleted1, deleted_triangles); + + assert(m_refs.size() >= tstart); + + size_t tcount = m_refs.size() - tstart; + + if(tcount <= v0.tcount) + { + // save ram + if (tcount) { + auto from = m_refs.begin() + tstart, to = from + tcount; + std::copy(from, to, m_refs.begin() + v0.tstart); + } + } + else + // append + v0.tstart = tstart; + + v0.tcount = tcount; + break; + } + } + + if (deleted_triangles <= 0) break; + deleted_triangles = 0; + } + + compact(); +} + +} // namespace implementation +} // namespace SimplifyMesh + +#endif // SIMPLIFYMESHIMPL_HPP diff --git a/src/libslic3r/SlicesToTriangleMesh.cpp b/src/libslic3r/SlicesToTriangleMesh.cpp new file mode 100644 index 0000000000..d6a5469619 --- /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 +#include + +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 &slices, + double zmin, + const std::vector & grid) +{ + assert(slices.size() == grid.size()); + + using Layers = std::vector; + std::vector 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& 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 &slices, + double zmin, + double lh, + double ilh) +{ + std::vector wall_meshes(slices.size()); + std::vector 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 0000000000..133312d569 --- /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 &slices, + double zmin, + double lh, + double ilh); + +inline TriangleMesh slices_to_triangle_mesh( + const std::vector &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 c62736ffeb..16068dde44 100644 --- a/src/libslic3r/Slicing.cpp +++ b/src/libslic3r/Slicing.cpp @@ -41,6 +41,23 @@ inline coordf_t max_layer_height_from_nozzle(const PrintConfig &print_config, in return std::max(min_layer_height, (max_layer_height == 0.) ? (0.75 * nozzle_dmr) : max_layer_height); } +// Minimum layer height for the variable layer height algorithm. +coordf_t Slicing::min_layer_height_from_nozzle(const DynamicPrintConfig &print_config, int idx_nozzle) +{ + coordf_t min_layer_height = print_config.opt_float("min_layer_height", idx_nozzle - 1); + return (min_layer_height == 0.) ? MIN_LAYER_HEIGHT_DEFAULT : std::max(MIN_LAYER_HEIGHT, min_layer_height); +} + +// Maximum layer height for the variable layer height algorithm, 3/4 of a nozzle dimaeter by default, +// it should not be smaller than the minimum layer height. +coordf_t Slicing::max_layer_height_from_nozzle(const DynamicPrintConfig &print_config, int idx_nozzle) +{ + coordf_t min_layer_height = min_layer_height_from_nozzle(print_config, idx_nozzle); + coordf_t max_layer_height = print_config.opt_float("max_layer_height", idx_nozzle - 1); + coordf_t nozzle_dmr = print_config.opt_float("nozzle_diameter", idx_nozzle - 1); + return std::max(min_layer_height, (max_layer_height == 0.) ? (0.75 * nozzle_dmr) : max_layer_height); +} + SlicingParameters SlicingParameters::create_from_config( const PrintConfig &print_config, const PrintObjectConfig &object_config, @@ -153,24 +170,15 @@ SlicingParameters SlicingParameters::create_from_config( return params; } -std::vector> layer_height_ranges(const t_layer_config_ranges &config_ranges) -{ - std::vector> 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 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> 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(0., slicing_params.first_object_layer_height), @@ -224,59 +232,56 @@ std::vector layer_height_profile_from_ranges( // Based on the work of @platsch // Fill layer_height_profile by heights ensuring a prescribed maximum cusp height. -std::vector layer_height_profile_adaptive( - const SlicingParameters &slicing_params, - const t_layer_config_ranges & /* layer_config_ranges */, - const ModelVolumePtrs &volumes) +std::vector layer_height_profile_adaptive(const SlicingParameters& slicing_params, const ModelObject& object, float quality_factor) { // 1) Initialize the SlicingAdaptive class with the object meshes. SlicingAdaptive as; as.set_slicing_parameters(slicing_params); - for (const ModelVolume *volume : volumes) - if (volume->is_model_part()) - as.add_mesh(&volume->mesh()); - as.prepare(); + as.prepare(object); // 2) Generate layers using the algorithm of @platsch - // loop until we have at least one layer and the max slice_z reaches the object height - //FIXME make it configurable - // Cusp value: A maximum allowed distance from a corner of a rectangular extrusion to a chrodal line, in mm. - const coordf_t cusp_value = 0.2; // $self->config->get_value('cusp_value'); - - std::vector layer_height_profile; - layer_height_profile.push_back(0.); + std::vector layer_height_profile; + layer_height_profile.push_back(0.0); layer_height_profile.push_back(slicing_params.first_object_layer_height); if (slicing_params.first_object_layer_height_fixed()) { layer_height_profile.push_back(slicing_params.first_object_layer_height); layer_height_profile.push_back(slicing_params.first_object_layer_height); } - coordf_t slice_z = slicing_params.first_object_layer_height; - coordf_t height = slicing_params.first_object_layer_height; - int current_facet = 0; - while ((slice_z - height) <= slicing_params.object_print_z_height()) { - height = 999; + double print_z = slicing_params.first_object_layer_height; + // last facet visited by the as.next_layer_height() function, where the facets are sorted by their increasing Z span. + size_t current_facet = 0; + // loop until we have at least one layer and the max slice_z reaches the object height + while (print_z + EPSILON < slicing_params.object_print_z_height()) { + float height = slicing_params.max_layer_height; // Slic3r::debugf "\n Slice layer: %d\n", $id; // determine next layer height - coordf_t cusp_height = as.cusp_height(slice_z, cusp_value, current_facet); + float cusp_height = as.next_layer_height(float(print_z), quality_factor, current_facet); + +#if 0 // check for horizontal features and object size - /* - if($self->config->get_value('match_horizontal_surfaces')) { - my $horizontal_dist = $adaptive_slicing[$region_id]->horizontal_facet_distance(scale $slice_z+$cusp_height, $min_height); - if(($horizontal_dist < $min_height) && ($horizontal_dist > 0)) { - Slic3r::debugf "Horizontal feature ahead, distance: %f\n", $horizontal_dist; - # can we shrink the current layer a bit? - if($cusp_height-($min_height-$horizontal_dist) > $min_height) { - # yes we can - $cusp_height = $cusp_height-($min_height-$horizontal_dist); - Slic3r::debugf "Shrink layer height to %f\n", $cusp_height; - }else{ - # no, current layer would become too thin - $cusp_height = $cusp_height+$horizontal_dist; - Slic3r::debugf "Widen layer height to %f\n", $cusp_height; + if (this->config.match_horizontal_surfaces.value) { + coordf_t horizontal_dist = as.horizontal_facet_distance(print_z + height, min_layer_height); + if ((horizontal_dist < min_layer_height) && (horizontal_dist > 0)) { + #ifdef SLIC3R_DEBUG + std::cout << "Horizontal feature ahead, distance: " << horizontal_dist << std::endl; + #endif + // can we shrink the current layer a bit? + if (height-(min_layer_height - horizontal_dist) > min_layer_height) { + // yes we can + height -= (min_layer_height - horizontal_dist); + #ifdef SLIC3R_DEBUG + std::cout << "Shrink layer height to " << height << std::endl; + #endif + } else { + // no, current layer would become too thin + height += horizontal_dist; + #ifdef SLIC3R_DEBUG + std::cout << "Widen layer height to " << height << std::endl; + #endif } } } - */ +#endif height = std::min(cusp_height, height); // apply z-gradation @@ -289,33 +294,115 @@ std::vector layer_height_profile_adaptive( // look for an applicable custom range /* - if (my $range = first { $_->[0] <= $slice_z && $_->[1] > $slice_z } @{$self->layer_height_ranges}) { + if (my $range = first { $_->[0] <= $print_z && $_->[1] > $print_z } @{$self->layer_height_ranges}) { $height = $range->[2]; # if user set custom height to zero we should just skip the range and resume slicing over it if ($height == 0) { - $slice_z += $range->[1] - $range->[0]; + $print_z += $range->[1] - $range->[0]; next; } } */ - layer_height_profile.push_back(slice_z); - layer_height_profile.push_back(height); - slice_z += height; - layer_height_profile.push_back(slice_z); + layer_height_profile.push_back(print_z); layer_height_profile.push_back(height); + print_z += height; } - coordf_t last = std::max(slicing_params.first_object_layer_height, layer_height_profile[layer_height_profile.size() - 2]); - layer_height_profile.push_back(last); - layer_height_profile.push_back(slicing_params.first_object_layer_height); - layer_height_profile.push_back(slicing_params.object_print_z_height()); - layer_height_profile.push_back(slicing_params.first_object_layer_height); + double z_gap = slicing_params.object_print_z_height() - layer_height_profile[layer_height_profile.size() - 2]; + if (z_gap > 0.0) + { + layer_height_profile.push_back(slicing_params.object_print_z_height()); + layer_height_profile.push_back(clamp(slicing_params.min_layer_height, slicing_params.max_layer_height, z_gap)); + } return layer_height_profile; } +std::vector smooth_height_profile(const std::vector& profile, const SlicingParameters& slicing_params, const HeightProfileSmoothingParams& smoothing_params) +{ + auto gauss_blur = [&slicing_params](const std::vector& profile, const HeightProfileSmoothingParams& smoothing_params) -> std::vector { + auto gauss_kernel = [] (unsigned int radius) -> std::vector { + unsigned int size = 2 * radius + 1; + std::vector ret; + ret.reserve(size); + + // Reworked from static inline int getGaussianKernelSize(float sigma) taken from opencv-4.1.2\modules\features2d\src\kaze\AKAZEFeatures.cpp + double sigma = 0.3 * (double)(radius - 1) + 0.8; + double two_sq_sigma = 2.0 * sigma * sigma; + double inv_root_two_pi_sq_sigma = 1.0 / ::sqrt(M_PI * two_sq_sigma); + + for (unsigned int i = 0; i < size; ++i) + { + double x = (double)i - (double)radius; + ret.push_back(inv_root_two_pi_sq_sigma * ::exp(-x * x / two_sq_sigma)); + } + + return ret; + }; + + // skip first layer ? + size_t skip_count = slicing_params.first_object_layer_height_fixed() ? 4 : 0; + + // not enough data to smmoth + if ((int)profile.size() - (int)skip_count < 6) + return profile; + + unsigned int radius = std::max(smoothing_params.radius, (unsigned int)1); + std::vector kernel = gauss_kernel(radius); + int two_radius = 2 * (int)radius; + + std::vector ret; + size_t size = profile.size(); + ret.reserve(size); + + // leave first layer untouched + for (size_t i = 0; i < skip_count; ++i) + { + ret.push_back(profile[i]); + } + + // smooth the rest of the profile by biasing a gaussian blur + // the bias moves the smoothed profile closer to the min_layer_height + double delta_h = slicing_params.max_layer_height - slicing_params.min_layer_height; + double inv_delta_h = (delta_h != 0.0) ? 1.0 / delta_h : 1.0; + + double max_dz_band = (double)radius * slicing_params.layer_height; + for (size_t i = skip_count; i < size; i += 2) + { + double zi = profile[i]; + double hi = profile[i + 1]; + ret.push_back(zi); + ret.push_back(0.0); + double& height = ret.back(); + int begin = std::max((int)i - two_radius, (int)skip_count); + int end = std::min((int)i + two_radius, (int)size - 2); + double weight_total = 0.0; + for (int j = begin; j <= end; j += 2) + { + int kernel_id = radius + (j - (int)i) / 2; + double dz = std::abs(zi - profile[j]); + if (dz * slicing_params.layer_height <= max_dz_band) + { + double dh = std::abs(slicing_params.max_layer_height - profile[j + 1]); + double weight = kernel[kernel_id] * sqrt(dh * inv_delta_h); + height += weight * profile[j + 1]; + weight_total += weight; + } + } + + height = clamp(slicing_params.min_layer_height, slicing_params.max_layer_height, (weight_total != 0.0) ? height /= weight_total : hi); + if (smoothing_params.keep_min) + height = std::min(height, hi); + } + + return ret; + }; + + return gauss_blur(profile, smoothing_params); +} + void adjust_layer_height_profile( const SlicingParameters &slicing_params, std::vector &layer_height_profile, @@ -609,7 +696,7 @@ int generate_layer_height_texture( const Vec3crd &color1 = palette_raw[idx1]; const Vec3crd &color2 = palette_raw[idx2]; coordf_t z = cell_to_z * coordf_t(cell); - assert(z >= lo && z <= hi); + assert(lo - EPSILON <= z && z <= hi + EPSILON); // Intensity profile to visualize the layers. coordf_t intensity = cos(M_PI * 0.7 * (mid - z) / h); // Color mapping from layer height to RGB. diff --git a/src/libslic3r/Slicing.hpp b/src/libslic3r/Slicing.hpp index 064363ec26..e151b208f4 100644 --- a/src/libslic3r/Slicing.hpp +++ b/src/libslic3r/Slicing.hpp @@ -11,15 +11,15 @@ #include "libslic3r.h" #include "Utils.hpp" -#include "PrintConfig.hpp" namespace Slic3r { class PrintConfig; class PrintObjectConfig; -class ModelVolume; -typedef std::vector ModelVolumePtrs; +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 @@ -100,7 +100,6 @@ struct SlicingParameters }; static_assert(IsTriviallyCopyable::value, "SlicingParameters class is not POD (and it should be - see constructor)."); - // The two slicing parameters lead to the same layering as long as the variable layer thickness is not in action. inline bool equal_layering(const SlicingParameters &sp1, const SlicingParameters &sp2) { @@ -130,19 +129,28 @@ inline bool equal_layering(const SlicingParameters &sp1, const SlicingParameters } typedef std::pair t_layer_height_range; -typedef std::map t_layer_config_ranges; - -extern std::vector> layer_height_ranges(const t_layer_config_ranges &config_ranges); +typedef std::map t_layer_config_ranges; extern std::vector layer_height_profile_from_ranges( const SlicingParameters &slicing_params, const t_layer_config_ranges &layer_config_ranges); -extern std::vector layer_height_profile_adaptive( - const SlicingParameters &slicing_params, - const t_layer_config_ranges &layer_config_ranges, - const ModelVolumePtrs &volumes); +extern std::vector layer_height_profile_adaptive( + const SlicingParameters& slicing_params, + const ModelObject& object, float quality_factor); +struct HeightProfileSmoothingParams +{ + unsigned int radius; + bool keep_min; + + HeightProfileSmoothingParams() : radius(5), keep_min(false) {} + HeightProfileSmoothingParams(unsigned int radius, bool keep_min) : radius(radius), keep_min(keep_min) {} +}; + +extern std::vector smooth_height_profile( + const std::vector& profile, const SlicingParameters& slicing_params, + const HeightProfileSmoothingParams& smoothing_params); enum LayerHeightEditActionType : unsigned int { LAYER_HEIGHT_EDIT_ACTION_INCREASE = 0, @@ -173,7 +181,17 @@ extern int generate_layer_height_texture( const std::vector &layers, void *data, int rows, int cols, bool level_of_detail_2nd_level); -}; // namespace Slic3r +namespace Slicing { + // Minimum layer height for the variable layer height algorithm. Nozzle index is 1 based. + coordf_t min_layer_height_from_nozzle(const DynamicPrintConfig &print_config, int idx_nozzle); + + // Maximum layer height for the variable layer height algorithm, 3/4 of a nozzle dimaeter by default, + // it should not be smaller than the minimum layer height. + // Nozzle index is 1 based. + coordf_t max_layer_height_from_nozzle(const DynamicPrintConfig &print_config, int idx_nozzle); +} // namespace Slicing + +} // namespace Slic3r namespace cereal { diff --git a/src/libslic3r/SlicingAdaptive.cpp b/src/libslic3r/SlicingAdaptive.cpp index ad03b550b9..7ab0c47b27 100644 --- a/src/libslic3r/SlicingAdaptive.cpp +++ b/src/libslic3r/SlicingAdaptive.cpp @@ -1,73 +1,151 @@ #include "libslic3r.h" +#include "Model.hpp" #include "TriangleMesh.hpp" #include "SlicingAdaptive.hpp" +#include + +// Based on the work of Florens Waserfall (@platch on github) +// and his paper +// Florens Wasserfall, Norman Hendrich, Jianwei Zhang: +// Adaptive Slicing for the FDM Process Revisited +// 13th IEEE Conference on Automation Science and Engineering (CASE-2017), August 20-23, Xi'an, China. DOI: 10.1109/COASE.2017.8256074 +// https://tams.informatik.uni-hamburg.de/publications/2017/Adaptive%20Slicing%20for%20the%20FDM%20Process%20Revisited.pdf + +// Vojtech believes that there is a bug in @platch's derivation of the triangle area error metric. +// Following Octave code paints graphs of recommended layer height versus surface slope angle. +#if 0 +adeg=0:1:85; +a=adeg*pi/180; +t=tan(a); +tsqr=sqrt(tan(a)); +lerr=1./cos(a); +lerr2=1./(0.3+cos(a)); +plot(adeg, t, 'b', adeg, sqrt(t), 'g', adeg, 0.5 * lerr, 'm', adeg, 0.5 * lerr2, 'r') +xlabel("angle(deg), 0 - horizontal wall, 90 - vertical wall"); +ylabel("layer height"); +legend("tan(a) as cura - topographic lines distance limit", "sqrt(tan(a)) as PrusaSlicer - error triangle area limit", "old slic3r - max distance metric", "new slic3r - Waserfall paper"); +#endif + +#ifndef NDEBUG + #define ADAPTIVE_LAYER_HEIGHT_DEBUG +#endif /* NDEBUG */ + namespace Slic3r { -void SlicingAdaptive::clear() -{ - m_meshes.clear(); - m_faces.clear(); - m_face_normal_z.clear(); -} - -std::pair face_z_span(const stl_facet *f) +static inline std::pair face_z_span(const stl_facet &f) { return std::pair( - std::min(std::min(f->vertex[0](2), f->vertex[1](2)), f->vertex[2](2)), - std::max(std::max(f->vertex[0](2), f->vertex[1](2)), f->vertex[2](2))); + std::min(std::min(f.vertex[0](2), f.vertex[1](2)), f.vertex[2](2)), + std::max(std::max(f.vertex[0](2), f.vertex[1](2)), f.vertex[2](2))); } -void SlicingAdaptive::prepare() +// By Florens Waserfall aka @platch: +// This constant essentially describes the volumetric error at the surface which is induced +// by stacking "elliptic" extrusion threads. It is empirically determined by +// 1. measuring the surface profile of printed parts to find +// the ratio between layer height and profile height and then +// 2. computing the geometric difference between the model-surface and the elliptic profile. +// +// The definition of the roughness formula is in +// https://tams.informatik.uni-hamburg.de/publications/2017/Adaptive%20Slicing%20for%20the%20FDM%20Process%20Revisited.pdf +// (page 51, formula (8)) +// Currenty @platch's error metric formula is not used. +static constexpr double SURFACE_CONST = 0.18403; + +// for a given facet, compute maximum height within the allowed surface roughness / stairstepping deviation +static inline float layer_height_from_slope(const SlicingAdaptive::FaceZ &face, float max_surface_deviation) { - // 1) Collect faces of all meshes. - int nfaces_total = 0; - for (std::vector::const_iterator it_mesh = m_meshes.begin(); it_mesh != m_meshes.end(); ++ it_mesh) - nfaces_total += (*it_mesh)->stl.stats.number_of_facets; - m_faces.reserve(nfaces_total); - for (std::vector::const_iterator it_mesh = m_meshes.begin(); it_mesh != m_meshes.end(); ++ it_mesh) - for (const stl_facet &face : (*it_mesh)->stl.facet_start) - m_faces.emplace_back(&face); +// @platch's formula, see his paper "Adaptive Slicing for the FDM Process Revisited". +// return float(max_surface_deviation / (SURFACE_CONST + 0.5 * std::abs(normal_z))); + +// Constant stepping in horizontal direction, as used by Cura. +// return (face.n_cos > 1e-5) ? float(max_surface_deviation * face.n_sin / face.n_cos) : FLT_MAX; + +// Constant error measured as an area of the surface error triangle, Vojtech's formula. +// return (face.n_cos > 1e-5) ? float(1.44 * max_surface_deviation * sqrt(face.n_sin / face.n_cos)) : FLT_MAX; + +// Constant error measured as an area of the surface error triangle, Vojtech's formula with clamping to roughness at 90 degrees. + return std::min(max_surface_deviation / 0.184f, (face.n_cos > 1e-5) ? float(1.44 * max_surface_deviation * sqrt(face.n_sin / face.n_cos)) : FLT_MAX); + +// Constant stepping along the surface, equivalent to the "surface roughness" metric by Perez and later Pandey et all, see @platch's paper for references. +// return float(max_surface_deviation * face.n_sin); +} + +void SlicingAdaptive::clear() +{ + m_faces.clear(); +} + +void SlicingAdaptive::prepare(const ModelObject &object) +{ + this->clear(); + + TriangleMesh mesh = object.raw_mesh(); + const ModelInstance &first_instance = *object.instances.front(); + mesh.transform(first_instance.get_matrix(), first_instance.is_left_handed()); + + // 1) Collect faces from mesh. + m_faces.reserve(mesh.stl.stats.number_of_facets); + for (const stl_facet &face : mesh.stl.facet_start) { + Vec3f n = face.normal.normalized(); + m_faces.emplace_back(FaceZ({ face_z_span(face), std::abs(n.z()), std::sqrt(n.x() * n.x() + n.y() * n.y()) })); + } // 2) Sort faces lexicographically by their Z span. - std::sort(m_faces.begin(), m_faces.end(), [](const stl_facet *f1, const stl_facet *f2) { - std::pair span1 = face_z_span(f1); - std::pair span2 = face_z_span(f2); - return span1 < span2; - }); - - // 3) Generate Z components of the facet normals. - m_face_normal_z.assign(m_faces.size(), 0.f); - for (size_t iface = 0; iface < m_faces.size(); ++ iface) - m_face_normal_z[iface] = m_faces[iface]->normal(2); + std::sort(m_faces.begin(), m_faces.end(), [](const FaceZ &f1, const FaceZ &f2) { return f1.z_span < f2.z_span; }); } -float SlicingAdaptive::cusp_height(float z, float cusp_value, int ¤t_facet) +// current_facet is in/out parameter, rememebers the index of the last face of m_faces visited, +// where this function will start from. +// print_z - the top print surface of the previous layer. +// returns height of the next layer. +float SlicingAdaptive::next_layer_height(const float print_z, float quality_factor, size_t ¤t_facet) { - float height = m_slicing_params.max_layer_height; - bool first_hit = false; + float height = (float)m_slicing_params.max_layer_height; + + float max_surface_deviation; + + { +#if 0 +// @platch's formula for quality: + double delta_min = SURFACE_CONST * m_slicing_params.min_layer_height; + double delta_mid = (SURFACE_CONST + 0.5) * m_slicing_params.layer_height; + double delta_max = (SURFACE_CONST + 0.5) * m_slicing_params.max_layer_height; +#else +// Vojtech's formula for triangle area error metric. + double delta_min = m_slicing_params.min_layer_height; + double delta_mid = m_slicing_params.layer_height; + double delta_max = m_slicing_params.max_layer_height; +#endif + max_surface_deviation = (quality_factor < 0.5f) ? + lerp(delta_min, delta_mid, 2. * quality_factor) : + lerp(delta_max, delta_mid, 2. * (1. - quality_factor)); + } // find all facets intersecting the slice-layer - int ordered_id = current_facet; - for (; ordered_id < int(m_faces.size()); ++ ordered_id) { - std::pair zspan = face_z_span(m_faces[ordered_id]); - // facet's minimum is higher than slice_z -> end loop - if (zspan.first >= z) - break; - // facet's maximum is higher than slice_z -> store the first event for next cusp_height call to begin at this point - if (zspan.second > z) { - // first event? - if (! first_hit) { - first_hit = true; - current_facet = ordered_id; - } - // skip touching facets which could otherwise cause small cusp values - if (zspan.second <= z + EPSILON) - continue; - // compute cusp-height for this facet and store minimum of all heights - float normal_z = m_face_normal_z[ordered_id]; - height = std::min(height, (normal_z == 0.f) ? 9999.f : std::abs(cusp_value / normal_z)); + size_t ordered_id = current_facet; + { + bool first_hit = false; + for (; ordered_id < m_faces.size(); ++ ordered_id) { + const std::pair &zspan = m_faces[ordered_id].z_span; + // facet's minimum is higher than slice_z -> end loop + if (zspan.first >= print_z) + break; + // facet's maximum is higher than slice_z -> store the first event for next cusp_height call to begin at this point + if (zspan.second > print_z) { + // first event? + if (! first_hit) { + first_hit = true; + current_facet = ordered_id; + } + // skip touching facets which could otherwise cause small cusp values + if (zspan.second < print_z + EPSILON) + continue; + // compute cusp-height for this facet and store minimum of all heights + height = std::min(height, layer_height_from_slope(m_faces[ordered_id], max_surface_deviation)); + } } } @@ -75,45 +153,45 @@ float SlicingAdaptive::cusp_height(float z, float cusp_value, int ¤t_facet height = std::max(height, float(m_slicing_params.min_layer_height)); // check for sloped facets inside the determined layer and correct height if necessary - if (height > m_slicing_params.min_layer_height) { - for (; ordered_id < int(m_faces.size()); ++ ordered_id) { - std::pair zspan = face_z_span(m_faces[ordered_id]); - // facet's minimum is higher than slice_z + height -> end loop - if (zspan.first >= z + height) + if (height > float(m_slicing_params.min_layer_height)) { + for (; ordered_id < m_faces.size(); ++ ordered_id) { + const std::pair &zspan = m_faces[ordered_id].z_span; + // facet's minimum is higher than slice_z + height -> end loop + if (zspan.first >= print_z + height) break; // skip touching facets which could otherwise cause small cusp values - if (zspan.second <= z + EPSILON) + if (zspan.second < print_z + EPSILON) continue; // Compute cusp-height for this facet and check against height. - float normal_z = m_face_normal_z[ordered_id]; - float cusp = (normal_z == 0) ? 9999 : abs(cusp_value / normal_z); - - float z_diff = zspan.first - z; + float reduced_height = layer_height_from_slope(m_faces[ordered_id], max_surface_deviation); - // handle horizontal facets - if (m_face_normal_z[ordered_id] > 0.999) { - // Slic3r::debugf "cusp computation, height is reduced from %f", $height; + float z_diff = zspan.first - print_z; + if (reduced_height < z_diff) { + assert(z_diff < height + EPSILON); + // The currently visited triangle's slope limits the next layer height so much, that + // the lowest point of the currently visible triangle is already above the newly proposed layer height. + // This means, that we need to limit the layer height so that the offending newly visited triangle + // is just above of the new layer. +#ifdef ADAPTIVE_LAYER_HEIGHT_DEBUG + BOOST_LOG_TRIVIAL(trace) << "cusp computation, height is reduced from " << height << "to " << z_diff << " due to z-diff"; +#endif /* ADAPTIVE_LAYER_HEIGHT_DEBUG */ height = z_diff; - // Slic3r::debugf "to %f due to near horizontal facet\n", $height; - } else if (cusp > z_diff) { - if (cusp < height) { - // Slic3r::debugf "cusp computation, height is reduced from %f", $height; - height = cusp; - // Slic3r::debugf "to %f due to new cusp height\n", $height; - } - } else { - // Slic3r::debugf "cusp computation, height is reduced from %f", $height; - height = z_diff; - // Slic3r::debugf "to z-diff: %f\n", $height; + } else if (reduced_height < height) { +#ifdef ADAPTIVE_LAYER_HEIGHT_DEBUG + BOOST_LOG_TRIVIAL(trace) << "adaptive layer computation: height is reduced from " << height << "to " << reduced_height << " due to higher facet"; +#endif /* ADAPTIVE_LAYER_HEIGHT_DEBUG */ + height = reduced_height; } } // lower height limit due to printer capabilities again height = std::max(height, float(m_slicing_params.min_layer_height)); } - -// Slic3r::debugf "cusp computation, layer-bottom at z:%f, cusp_value:%f, resulting layer height:%f\n", unscale $z, $cusp_value, $height; + +#ifdef ADAPTIVE_LAYER_HEIGHT_DEBUG + BOOST_LOG_TRIVIAL(trace) << "adaptive layer computation, layer-bottom at z:" << print_z << ", quality_factor:" << quality_factor << ", resulting layer height:" << height; +#endif /* ADAPTIVE_LAYER_HEIGHT_DEBUG */ return height; } @@ -122,8 +200,8 @@ float SlicingAdaptive::cusp_height(float z, float cusp_value, int ¤t_facet float SlicingAdaptive::horizontal_facet_distance(float z) { for (size_t i = 0; i < m_faces.size(); ++ i) { - std::pair zspan = face_z_span(m_faces[i]); - // facet's minimum is higher than max forward distance -> end loop + std::pair zspan = m_faces[i].z_span; + // facet's minimum is higher than max forward distance -> end loop if (zspan.first > z + m_slicing_params.max_layer_height) break; // min_z == max_z -> horizontal facet @@ -132,9 +210,8 @@ float SlicingAdaptive::horizontal_facet_distance(float z) } // objects maximum? - return (z + m_slicing_params.max_layer_height > m_slicing_params.object_print_z_height()) ? - std::max(m_slicing_params.object_print_z_height() - z, 0.f) : - m_slicing_params.max_layer_height; + return (z + (float)m_slicing_params.max_layer_height > (float)m_slicing_params.object_print_z_height()) ? + std::max((float)m_slicing_params.object_print_z_height() - z, 0.f) : (float)m_slicing_params.max_layer_height; } }; // namespace Slic3r diff --git a/src/libslic3r/SlicingAdaptive.hpp b/src/libslic3r/SlicingAdaptive.hpp index bfd081d813..a296553d62 100644 --- a/src/libslic3r/SlicingAdaptive.hpp +++ b/src/libslic3r/SlicingAdaptive.hpp @@ -9,26 +9,32 @@ namespace Slic3r { -class TriangleMesh; +class ModelVolume; class SlicingAdaptive { public: - void clear(); - void set_slicing_parameters(SlicingParameters params) { m_slicing_params = params; } - void add_mesh(const TriangleMesh *mesh) { m_meshes.push_back(mesh); } - void prepare(); - float cusp_height(float z, float cusp_value, int ¤t_facet); - float horizontal_facet_distance(float z); + void clear(); + void set_slicing_parameters(SlicingParameters params) { m_slicing_params = params; } + void prepare(const ModelObject &object); + // Return next layer height starting from the last print_z, using a quality measure + // (quality in range from 0 to 1, 0 - highest quality at low layer heights, 1 - lowest print quality at high layer heights). + // The layer height curve shall be centered roughly around the default profile's layer height for quality 0.5. + float next_layer_height(const float print_z, float quality, size_t ¤t_facet); + float horizontal_facet_distance(float z); + + struct FaceZ { + std::pair z_span; + // Cosine of the normal vector towards the Z axis. + float n_cos; + // Sine of the normal vector towards the Z axis. + float n_sin; + }; protected: - SlicingParameters m_slicing_params; + SlicingParameters m_slicing_params; - std::vector m_meshes; - // Collected faces of all meshes, sorted by raising Z of the bottom most face. - std::vector m_faces; - // Z component of face normals, normalized. - std::vector m_face_normal_z; + std::vector m_faces; }; }; // namespace Slic3r diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp index 179b35f59e..1669f60d21 100644 --- a/src/libslic3r/SupportMaterial.cpp +++ b/src/libslic3r/SupportMaterial.cpp @@ -1,6 +1,5 @@ #include "ClipperUtils.hpp" #include "ExtrusionEntityCollection.hpp" -#include "PerimeterGenerator.hpp" #include "Layer.hpp" #include "Print.hpp" #include "SupportMaterial.hpp" @@ -410,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; @@ -445,8 +444,8 @@ Polygons collect_region_slices_by_type(const Layer &layer, SurfaceType surface_t Polygons collect_slices_outer(const Layer &layer) { Polygons out; - out.reserve(out.size() + layer.slices.size()); - for (const ExPolygon &expoly : layer.slices) + out.reserve(out.size() + layer.lslices.size()); + for (const ExPolygon &expoly : layer.lslices) out.emplace_back(expoly.contour); return out; } @@ -598,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(); @@ -610,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); @@ -907,9 +906,9 @@ 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.slices.size(); ++ i) - if (lower_layer.slices_bboxes[i].contains(polyline.first_point()) && lower_layer.slices_bboxes[i].contains(polyline.last_point()) && - lower_layer.slices[i].contains(polyline.first_point()) && lower_layer.slices[i].contains(polyline.last_point())) { + 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; @@ -972,6 +971,10 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_ std::vector enforcers = object.slice_support_enforcers(); std::vector 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; @@ -998,7 +1001,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_ // inflate the polygons over and over. Polygons &covered = buildplate_covered[layer_id]; covered = buildplate_covered[layer_id - 1]; - polygons_append(covered, offset(lower_layer.slices, scale_(0.01))); + polygons_append(covered, offset(lower_layer.lslices, scale_(0.01))); covered = union_(covered, false); // don't apply the safety offset. } } @@ -1027,7 +1030,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_ Polygons contact_polygons; Polygons slices_margin_cached; float slices_margin_cached_offset = -1.; - Polygons lower_layer_polygons = (layer_id == 0) ? Polygons() : to_polygons(object.layers()[layer_id-1]->slices); + Polygons lower_layer_polygons = (layer_id == 0) ? Polygons() : to_polygons(object.layers()[layer_id-1]->lslices); // Offset of the lower layer, to trim the support polygons with to calculate dense supports. float no_interface_offset = 0.f; if (layer_id == 0) { @@ -1098,10 +1101,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()) @@ -1112,19 +1115,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); @@ -1142,7 +1152,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 */ @@ -1166,7 +1176,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_ slices_margin_cached_offset = slices_margin_offset; slices_margin_cached = (slices_margin_offset == 0.f) ? lower_layer_polygons : - offset2(to_polygons(lower_layer.slices), - no_interface_offset * 0.5f, slices_margin_offset + no_interface_offset * 0.5f, SUPPORT_SURFACES_OFFSET_PARAMETERS); + offset2(to_polygons(lower_layer.lslices), - no_interface_offset * 0.5f, slices_margin_offset + no_interface_offset * 0.5f, SUPPORT_SURFACES_OFFSET_PARAMETERS); if (! buildplate_covered.empty()) { // Trim the inflated contact surfaces by the top surfaces as well. polygons_append(slices_margin_cached, buildplate_covered[layer_id]); @@ -1472,7 +1482,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 */ @@ -1573,7 +1583,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta task_group.run([this, &projection, &projection_raw, &layer, &layer_support_area, layer_id] { // Remove the areas that touched from the projection that will continue on next, lower, top surfaces. // Polygons trimming = union_(to_polygons(layer.slices), touching, true); - Polygons trimming = offset(layer.slices, float(SCALED_EPSILON)); + Polygons trimming = offset(layer.lslices, float(SCALED_EPSILON)); projection = diff(projection_raw, trimming, false); #ifdef SLIC3R_DEBUG { @@ -2105,7 +2115,7 @@ void PrintObjectSupportMaterial::trim_support_layers_by_object( const Layer &object_layer = *object.layers()[i]; if (object_layer.print_z - object_layer.height > support_layer.print_z + gap_extra_above - EPSILON) break; - polygons_append(polygons_trimming, offset(object_layer.slices, gap_xy_scaled, SUPPORT_SURFACES_OFFSET_PARAMETERS)); + polygons_append(polygons_trimming, offset(object_layer.lslices, gap_xy_scaled, SUPPORT_SURFACES_OFFSET_PARAMETERS)); } if (! m_slicing_params.soluble_interface) { // Collect all bottom surfaces, which will be extruded with a bridging flow. @@ -2218,7 +2228,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::generate_raf // Expand the bases of the support columns in the 1st layer. columns_base->polygons = diff( offset(columns_base->polygons, inflate_factor_1st_layer), - offset(m_object->layers().front()->slices, (float)scale_(m_gap_xy), SUPPORT_SURFACES_OFFSET_PARAMETERS)); + offset(m_object->layers().front()->lslices, (float)scale_(m_gap_xy), SUPPORT_SURFACES_OFFSET_PARAMETERS)); if (contacts != nullptr) columns_base->polygons = diff(columns_base->polygons, interface_polygons); } @@ -2318,10 +2328,15 @@ static inline void fill_expolygons_generate_paths( 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); } } @@ -2340,9 +2355,14 @@ static inline void fill_expolygons_generate_paths( 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); } diff --git a/src/libslic3r/SurfaceCollection.hpp b/src/libslic3r/SurfaceCollection.hpp index b60105eb30..9f0324d20a 100644 --- a/src/libslic3r/SurfaceCollection.hpp +++ b/src/libslic3r/SurfaceCollection.hpp @@ -34,6 +34,10 @@ public: void remove_type(const SurfaceType type); void remove_types(const SurfaceType *types, int ntypes); void filter_by_type(SurfaceType type, Polygons* polygons); + void set_type(SurfaceType type) { + for (Surface &surface : this->surfaces) + surface.surface_type = type; + } void clear() { surfaces.clear(); } bool empty() const { return surfaces.empty(); } diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp index 5d0a7592cd..66258fe62e 100644 --- a/src/libslic3r/Technologies.hpp +++ b/src/libslic3r/Technologies.hpp @@ -1,5 +1,5 @@ -#ifndef _technologies_h_ -#define _technologies_h_ +#ifndef _prusaslicer_technologies_h_ +#define _prusaslicer_technologies_h_ //============ // debug techs @@ -15,31 +15,63 @@ #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 - - -//==================== -// 1.42.0.alpha1 techs -//==================== -#define ENABLE_1_42_0_ALPHA1 1 - +// 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 && ENABLE_1_42_0_ALPHA1) -// Disable imgui dialog for move, rotate and scale gizmos -#define DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI (1 && ENABLE_1_42_0_ALPHA1) +#define DISABLE_INSTANCES_SYNCH 0 // Use wxDataViewRender instead of wxDataViewCustomRenderer -#define ENABLE_NONCUSTOM_DATA_VIEW_RENDERING (0 && ENABLE_1_42_0_ALPHA1) +#define ENABLE_NONCUSTOM_DATA_VIEW_RENDERING 0 -//==================== -// 2.2.0.alpha1 techs -//==================== -#define ENABLE_2_2_0_ALPHA1 1 +//================ +// 2.2.0.rc1 techs +//================ +#define ENABLE_2_2_0_RC1 1 -// Enable thumbnail generator -#define ENABLE_THUMBNAIL_GENERATOR (1 && ENABLE_2_2_0_ALPHA1) -#define ENABLE_THUMBNAIL_GENERATOR_DEBUG (0 && ENABLE_THUMBNAIL_GENERATOR) -#define ENABLE_THUMBNAIL_GENERATOR_PNG_TO_GCODE (1 && ENABLE_THUMBNAIL_GENERATOR) +// 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) -#endif // _technologies_h_ + +//=================== +// 2.3.0.alpha1 techs +//=================== +#define ENABLE_2_3_0_ALPHA1 1 + +// 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) + +// Enable G-Code viewer +#define ENABLE_GCODE_VIEWER (1 && ENABLE_2_3_0_ALPHA1) +#define ENABLE_GCODE_VIEWER_STATISTICS (0 && ENABLE_GCODE_VIEWER) +#define ENABLE_GCODE_VIEWER_DATA_CHECKING (0 && ENABLE_GCODE_VIEWER) + + +//=================== +// 2.3.0.alpha3 techs +//=================== +#define ENABLE_2_3_0_ALPHA3 1 + +#define ENABLE_CTRL_M_ON_WINDOWS (0 && ENABLE_2_3_0_ALPHA3) + + +//=================== +// 2.3.0.alpha4 techs +//=================== +#define ENABLE_2_3_0_ALPHA4 1 + +#define ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS (1 && ENABLE_GCODE_VIEWER && ENABLE_2_3_0_ALPHA4) +#define ENABLE_SHOW_OPTION_POINT_LAYERS (1 && ENABLE_GCODE_VIEWER && ENABLE_2_3_0_ALPHA4) + + +#endif // _prusaslicer_technologies_h_ diff --git a/src/libslic3r/Thread.cpp b/src/libslic3r/Thread.cpp new file mode 100644 index 0000000000..4e915f0c99 --- /dev/null +++ b/src/libslic3r/Thread.cpp @@ -0,0 +1,238 @@ +#ifdef _WIN32 + #include + #include +#else + // any posix system + #include +#endif + +#include +#include +#include +#include +#include + + +#include "Thread.hpp" + +namespace Slic3r { + +#ifdef _WIN32 +// The new API is better than the old SEH style thread naming since the names also show up in crash dumpsand ETW traces. +// Because the new API is only available on newer Windows 10, look it up dynamically. + +typedef HRESULT(__stdcall* SetThreadDescriptionType)(HANDLE, PCWSTR); +typedef HRESULT(__stdcall* GetThreadDescriptionType)(HANDLE, PWSTR*); + +static bool s_SetGetThreadDescriptionInitialized = false; +static HMODULE s_hKernel32 = nullptr; +static SetThreadDescriptionType s_fnSetThreadDescription = nullptr; +static GetThreadDescriptionType s_fnGetThreadDescription = nullptr; + +static bool WindowsGetSetThreadNameAPIInitialize() +{ + if (! s_SetGetThreadDescriptionInitialized) { + // Not thread safe! It is therefore a good idea to name the main thread before spawning worker threads + // to initialize + s_hKernel32 = LoadLibraryW(L"Kernel32.dll"); + if (s_hKernel32) { + s_fnSetThreadDescription = (SetThreadDescriptionType)::GetProcAddress(s_hKernel32, "SetThreadDescription"); + s_fnGetThreadDescription = (GetThreadDescriptionType)::GetProcAddress(s_hKernel32, "GetThreadDescription"); + } + s_SetGetThreadDescriptionInitialized = true; + } + return s_fnSetThreadDescription && s_fnGetThreadDescription; +} + +#ifndef NDEBUG + // Use the old way by throwing an exception, so at least in Debug mode the thread names are shown by the debugger. + static constexpr DWORD MSVC_SEH_EXCEPTION_NAME_THREAD = 0x406D1388; + +#pragma pack(push,8) + typedef struct tagTHREADNAME_INFO + { + DWORD dwType; // Must be 0x1000. + LPCSTR szName; // Pointer to name (in user addr space). + DWORD dwThreadID; // Thread ID (-1=caller thread). + DWORD dwFlags; // Reserved for future use, must be zero. + } THREADNAME_INFO; +#pragma pack(pop) + + static void WindowsSetThreadNameSEH(HANDLE hThread, const char* thread_name) + { + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = thread_name; + info.dwThreadID = ::GetThreadId(hThread); + info.dwFlags = 0; + __try { + RaiseException(MSVC_SEH_EXCEPTION_NAME_THREAD, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info); + } __except (EXCEPTION_EXECUTE_HANDLER) { + } + } +#endif // NDEBUG + +static bool WindowsSetThreadName(HANDLE hThread, const char *thread_name) +{ + if (! WindowsGetSetThreadNameAPIInitialize()) { +#ifdef NDEBUG + return false; +#else // NDEBUG + // Running on Windows 7 or old Windows 7 in debug mode, + // inform the debugger about the thread name by throwing an SEH. + WindowsSetThreadNameSEH(hThread, thread_name); + return true; +#endif // NDEBUG + } + + size_t len = strlen(thread_name); + if (len < 1024) { + // Allocate the temp string on stack. + wchar_t buf[1024]; + s_fnSetThreadDescription(hThread, boost::nowide::widen(buf, 1024, thread_name)); + } else { + // Allocate dynamically. + s_fnSetThreadDescription(hThread, boost::nowide::widen(thread_name).c_str()); + } + return true; +} + +bool set_thread_name(std::thread &thread, const char *thread_name) +{ + return WindowsSetThreadName(static_cast(thread.native_handle()), thread_name); +} + +bool set_thread_name(boost::thread &thread, const char *thread_name) +{ + return WindowsSetThreadName(static_cast(thread.native_handle()), thread_name); +} + +bool set_current_thread_name(const char *thread_name) +{ + return WindowsSetThreadName(::GetCurrentThread(), thread_name); +} + +std::optional get_current_thread_name() +{ + if (! WindowsGetSetThreadNameAPIInitialize()) + return std::nullopt; + + wchar_t *ptr = nullptr; + s_fnGetThreadDescription(::GetCurrentThread(), &ptr); + return (ptr == nullptr) ? std::string() : boost::nowide::narrow(ptr); +} + +#else // _WIN32 + +#ifdef __APPLE__ + +// Appe screwed the Posix norm. +bool set_thread_name(std::thread &thread, const char *thread_name) +{ +// not supported +// pthread_setname_np(thread.native_handle(), thread_name); + return false; +} + +bool set_thread_name(boost::thread &thread, const char *thread_name) +{ +// not supported +// pthread_setname_np(thread.native_handle(), thread_name); + return false; +} + +bool set_current_thread_name(const char *thread_name) +{ + pthread_setname_np(thread_name); + return true; +} + +std::optional get_current_thread_name() +{ +// not supported +// char buf[16]; +// return std::string(thread_getname_np(buf, 16) == 0 ? buf : ""); + return std::nullopt; +} + +#else + +// posix +bool set_thread_name(std::thread &thread, const char *thread_name) +{ + pthread_setname_np(thread.native_handle(), thread_name); + return true; +} + +bool set_thread_name(boost::thread &thread, const char *thread_name) +{ + pthread_setname_np(thread.native_handle(), thread_name); + return true; +} + +bool set_current_thread_name(const char *thread_name) +{ + pthread_setname_np(pthread_self(), thread_name); + return true; +} + +std::optional get_current_thread_name() +{ + char buf[16]; + return std::string(pthread_getname_np(pthread_self(), buf, 16) == 0 ? buf : ""); +} + +#endif + +#endif // _WIN32 + +// Spawn (n - 1) worker threads on Intel TBB thread pool and name them by an index and a system thread ID. +void name_tbb_thread_pool_threads() +{ + static bool initialized = false; + if (initialized) + return; + initialized = true; + + const size_t nthreads_hw = std::thread::hardware_concurrency(); + size_t nthreads = nthreads_hw; + +#ifdef SLIC3R_PROFILE + // Shiny profiler is not thread safe, thus disable parallelization. + nthreads = 1; +#endif + + if (nthreads != nthreads_hw) + new tbb::task_scheduler_init(int(nthreads)); + + std::atomic nthreads_running(0); + std::condition_variable cv; + std::mutex cv_m; + auto master_thread_id = tbb::this_tbb_thread::get_id(); + tbb::parallel_for( + tbb::blocked_range(0, nthreads, 1), + [&nthreads_running, nthreads, &master_thread_id, &cv, &cv_m](const tbb::blocked_range &range) { + assert(range.begin() + 1 == range.end()); + if (nthreads_running.fetch_add(1) + 1 == nthreads) { + // All threads are spinning. + // Wake them up. + cv.notify_all(); + } else { + // Wait for the last thread to wake the others. + std::unique_lock lk(cv_m); + cv.wait(lk, [&nthreads_running, nthreads]{return nthreads_running == nthreads;}); + } + auto thread_id = tbb::this_tbb_thread::get_id(); + if (thread_id == master_thread_id) { + // The calling thread runs the 0'th task. + assert(range.begin() == 0); + } else { + assert(range.begin() > 0); + std::ostringstream name; + name << "slic3r_tbb_" << range.begin(); + set_current_thread_name(name.str().c_str()); + } + }); +} + +} diff --git a/src/libslic3r/Thread.hpp b/src/libslic3r/Thread.hpp new file mode 100644 index 0000000000..a861237962 --- /dev/null +++ b/src/libslic3r/Thread.hpp @@ -0,0 +1,57 @@ +#ifndef GUI_THREAD_HPP +#define GUI_THREAD_HPP + +#include +#include +#include +#include + +namespace Slic3r { + +// Set / get thread name. +// Returns false if the API is not supported. +// +// It is a good idea to name the main thread before spawning children threads, because dynamic linking is used on Windows 10 +// to initialize Get/SetThreadDescription functions, which is not thread safe. +// +// pthread_setname_np supports maximum 15 character thread names! (16th character is the null terminator) +// +// Methods taking the thread as an argument are not supported by OSX. +// Naming threads is only supported on newer Windows 10. + +bool set_thread_name(std::thread &thread, const char *thread_name); +inline bool set_thread_name(std::thread &thread, const std::string &thread_name) { return set_thread_name(thread, thread_name.c_str()); } +bool set_thread_name(boost::thread &thread, const char *thread_name); +inline bool set_thread_name(boost::thread &thread, const std::string &thread_name) { return set_thread_name(thread, thread_name.c_str()); } +bool set_current_thread_name(const char *thread_name); +inline bool set_current_thread_name(const std::string &thread_name) { return set_current_thread_name(thread_name.c_str()); } + +// Returns nullopt if not supported. +// Not supported by OSX. +// Naming threads is only supported on newer Windows 10. +std::optional get_current_thread_name(); + +// To be called somewhere before the TBB threads are spinned for the first time, to +// give them names recognizible in the debugger. +void name_tbb_thread_pool_threads(); + +template +inline boost::thread create_thread(boost::thread::attributes &attrs, Fn &&fn) +{ + // Duplicating the stack allocation size of Thread Building Block worker + // threads of the thread pool: allocate 4MB on a 64bit system, allocate 2MB + // on a 32bit system by default. + + attrs.set_stack_size((sizeof(void*) == 4) ? (2048 * 1024) : (4096 * 1024)); + return boost::thread{attrs, std::forward(fn)}; +} + +template inline boost::thread create_thread(Fn &&fn) +{ + boost::thread::attributes attrs; + return create_thread(attrs, std::forward(fn)); +} + +} + +#endif // GUI_THREAD_HPP diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp index 5cd97522d9..8ba34e5160 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& facets) : repaired(false) +TriangleMesh::TriangleMesh(const Pointf3s &points, const std::vector &facets) : repaired(false) { stl_file &stl = this->stl; stl.stats.type = inmemory; @@ -70,6 +71,34 @@ TriangleMesh::TriangleMesh(const Pointf3s &points, const std::vector& f stl_get_size(&stl); } +TriangleMesh::TriangleMesh(const indexed_triangle_set &M) : repaired(false) +{ + stl.stats.type = inmemory; + + // count facets and allocate memory + stl.stats.number_of_facets = uint32_t(M.indices.size()); + stl.stats.original_num_facets = int(stl.stats.number_of_facets); + stl_allocate(&stl); + + for (uint32_t i = 0; i < stl.stats.number_of_facets; ++ i) { + stl_facet facet; + facet.vertex[0] = M.vertices[size_t(M.indices[i](0))]; + facet.vertex[1] = M.vertices[size_t(M.indices[i](1))]; + facet.vertex[2] = M.vertices[size_t(M.indices[i](2))]; + facet.extra[0] = 0; + facet.extra[1] = 0; + + stl_normal normal; + stl_calculate_normal(normal, &facet); + stl_normalize_vector(normal); + facet.normal = normal; + + stl.facet_start[i] = facet; + } + + stl_get_size(&stl); +} + // #define SLIC3R_TRACE_REPAIR void TriangleMesh::repair(bool update_shared_vertices) @@ -392,7 +421,7 @@ std::deque TriangleMesh::find_unvisited_neighbors(std::vectorrepaired) - 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()) @@ -572,7 +601,7 @@ TriangleMesh TriangleMesh::convex_hull_3d() const // Let's collect results: Pointf3s dst_vertices; - std::vector facets; + std::vector facets; auto facet_list = qhull.facetList().toStdVector(); for (const orgQhull::QhullFacet& facet : facet_list) { // iterate through facets @@ -599,7 +628,7 @@ std::vector TriangleMesh::slice(const std::vector &z) std::vector z_f(z.begin(), z.end()); TriangleMeshSlicer mslicer(this); std::vector layers; - mslicer.slice(z_f, 0.0004f, &layers, [](){}); + mslicer.slice(z_f, SlicingMode::Regular, 0.0004f, &layers, [](){}); return layers; } @@ -655,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); @@ -748,7 +777,7 @@ void TriangleMeshSlicer::set_up_direction(const Vec3f& up) -void TriangleMeshSlicer::slice(const std::vector &z, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const +void TriangleMeshSlicer::slice(const std::vector &z, SlicingMode mode, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const { BOOST_LOG_TRIVIAL(debug) << "TriangleMeshSlicer::slice"; @@ -803,11 +832,38 @@ void TriangleMeshSlicer::slice(const std::vector &z, std::vectorresize(z.size()); tbb::parallel_for( tbb::blocked_range(0, z.size()), - [&lines, &layers, throw_on_cancel, this](const tbb::blocked_range& range) { + [&lines, &layers, mode, throw_on_cancel, this](const tbb::blocked_range& range) { for (size_t line_idx = range.begin(); line_idx < range.end(); ++ line_idx) { if ((line_idx & 0x0ffff) == 0) throw_on_cancel(); - this->make_loops(lines[line_idx], &(*layers)[line_idx]); + + Polygons &polygons = (*layers)[line_idx]; + this->make_loops(lines[line_idx], &polygons); + + if (! polygons.empty()) { + if (mode == SlicingMode::Positive) { + // Reorient all loops to be CCW. + for (Polygon& p : polygons) + p.make_counter_clockwise(); + } else if (mode == SlicingMode::PositiveLargestContour) { + // Keep just the largest polygon, make it CCW. + double max_area = 0.; + Polygon* max_area_polygon = nullptr; + for (Polygon& p : polygons) { + double a = p.area(); + if (std::abs(a) > std::abs(max_area)) { + max_area = a; + max_area_polygon = &p; + } + } + assert(max_area_polygon != nullptr); + if (max_area < 0.) + max_area_polygon->reverse(); + Polygon p(std::move(*max_area_polygon)); + polygons.clear(); + polygons.emplace_back(std::move(p)); + } + } } } ); @@ -885,22 +941,25 @@ void TriangleMeshSlicer::_slice_do(size_t facet_idx, std::vector &z, const float closing_radius, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const +void TriangleMeshSlicer::slice(const std::vector &z, SlicingMode mode, const float closing_radius, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const { std::vector layers_p; - this->slice(z, &layers_p, throw_on_cancel); + this->slice(z, (mode == SlicingMode::PositiveLargestContour) ? SlicingMode::Positive : 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(0, z.size()), - [&layers_p, closing_radius, layers, throw_on_cancel, this](const tbb::blocked_range& range) { + [&layers_p, mode, closing_radius, layers, throw_on_cancel, this](const tbb::blocked_range& 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(); - this->make_expolygons(layers_p[layer_id], closing_radius, &(*layers)[layer_id]); + ExPolygons &expolygons = (*layers)[layer_id]; + this->make_expolygons(layers_p[layer_id], closing_radius, &expolygons); + if (mode == SlicingMode::PositiveLargestContour) + keep_largest_contour_only(expolygons); } }); BOOST_LOG_TRIVIAL(debug) << "TriangleMeshSlicer::make_expolygons in parallel - end"; @@ -1721,7 +1780,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 @@ -1873,22 +1932,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 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; } @@ -1901,8 +1956,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 facets; + Pointf3s vertices; + std::vector facets; vertices.reserve(2 * n_steps + 2); facets.reserve(4 * n_steps); @@ -1922,17 +1977,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(); @@ -1967,7 +2022,7 @@ TriangleMesh make_sphere(double radius, double fa) } } - std::vector facets; + std::vector facets; facets.reserve(2 * (stackCount - 1) * sectorCount); for (int i = 0; i < stackCount; ++ i) { // Beginning of current stack. @@ -1982,11 +2037,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 9c9f82040d..723125aaa7 100644 --- a/src/libslic3r/TriangleMesh.hpp +++ b/src/libslic3r/TriangleMesh.hpp @@ -22,7 +22,8 @@ class TriangleMesh { public: TriangleMesh() : repaired(false) {} - TriangleMesh(const Pointf3s &points, const std::vector &facets); + TriangleMesh(const Pointf3s &points, const std::vector &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); } bool write_ascii(const char* output_file) { return stl_write_ascii(&this->stl, output_file, ""); } @@ -161,6 +162,16 @@ public: typedef std::vector IntersectionLines; typedef std::vector IntersectionLinePtrs; +enum class SlicingMode : uint32_t { + // Regular slicing, maintain all contours and their orientation. + Regular, + // Maintain all contours, orient all contours CCW, therefore all holes are being closed. + Positive, + // Orient all contours CCW and keep only the contour with the largest area. + // This mode is useful for slicing complex objects in vase mode. + PositiveLargestContour, +}; + class TriangleMeshSlicer { public: @@ -168,8 +179,8 @@ 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 &z, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const; - void slice(const std::vector &z, const float closing_radius, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const; + void slice(const std::vector &z, SlicingMode mode, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const; + void slice(const std::vector &z, SlicingMode mode, const float closing_radius, std::vector* layers, throw_on_cancel_callback_type throw_on_cancel) const; enum FacetSliceType { NoSlice = 0, Slicing = 1, @@ -198,6 +209,29 @@ private: void make_expolygons(std::vector &lines, const float closing_radius, ExPolygons* slices) const; }; +inline void slice_mesh( + const TriangleMesh & mesh, + const std::vector & z, + std::vector & layers, + TriangleMeshSlicer::throw_on_cancel_callback_type thr = nullptr) +{ + if (mesh.empty()) return; + TriangleMeshSlicer slicer(&mesh); + slicer.slice(z, SlicingMode::Regular, &layers, thr); +} + +inline void slice_mesh( + const TriangleMesh & mesh, + const std::vector & z, + std::vector & layers, + float closing_radius, + TriangleMeshSlicer::throw_on_cancel_callback_type thr = nullptr) +{ + if (mesh.empty()) return; + TriangleMeshSlicer slicer(&mesh); + slicer.slice(z, SlicingMode::Regular, closing_radius, &layers, thr); +} + TriangleMesh make_cube(double x, double y, double z); // Generate a TriangleMesh of a cylinder diff --git a/src/libslic3r/TriangleSelector.cpp b/src/libslic3r/TriangleSelector.cpp new file mode 100644 index 0000000000..c69ab6d9af --- /dev/null +++ b/src/libslic3r/TriangleSelector.cpp @@ -0,0 +1,766 @@ +#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. + if (m_old_cursor_radius != radius) { + set_edge_limit(radius / 5.f); + m_old_cursor_radius = radius; + } + + // Now start with the facet the pointer points to and check all adjacent facets. + std::vector facets_to_check{facet_start}; + std::vector 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; ichildren.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& facet = tr->verts_idxs; + std::array pts = { &m_vertices[facet[0]].v, + &m_vertices[facet[1]].v, + &m_vertices[facet[2]].v}; + std::array pts_transformed; // must stay in scope of pts !!! + + // In case the object is non-uniformly scaled, transform the + // points to world coords. + if (! m_cursor.uniform_scaling) { + for (size_t i=0; i sides; + sides = { (*pts[2]-*pts[1]).squaredNorm(), + (*pts[0]-*pts[2]).squaredNorm(), + (*pts[1]-*pts[0]).squaredNorm() }; + + std::vector sides_to_split; + int side_to_keep = -1; + 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 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 new_triangle_indices(m_triangles.size(), -1); + for (int i = m_orig_size_indices; i new_vertices_indices(m_vertices.size(), -1); + for (int i=m_orig_size_vertices; i= 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 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> 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> out; + for (int i=0; i data; // complete encoding of this mesh triangle + int stored_triangles = 0; // how many have been already encoded + + std::function 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> 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 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()} +{ + 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 0000000000..6f4ca29ac4 --- /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> serialize() const; + + // Load serialized data. Assumes that correct mesh is loaded. + void deserialize(const std::map> 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 verts_idxs; + + // Is this triangle valid or marked to be removed? + bool valid{true}; + + // Children triangles. + std::array 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 m_vertices; + std::vector 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; + + // 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 0000000000..ec2945b10b --- /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 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 &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 *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 &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 &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 *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 0000000000..68bf4b0ac6 --- /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>; + +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 e5fae485a7..28976064be 100644 --- a/src/libslic3r/Utils.hpp +++ b/src/libslic3r/Utils.hpp @@ -7,6 +7,8 @@ #include #include +#include + #include "libslic3r.h" namespace boost { namespace filesystem { class directory_entry; }} @@ -64,8 +66,24 @@ extern std::string normalize_utf8_nfc(const char *src); // for a short while, so the file may not be movable. Retry while we see recoverable errors. extern std::error_code rename_file(const std::string &from, const std::string &to); +enum CopyFileResult { + SUCCESS = 0, + FAIL_COPY_FILE, + FAIL_FILES_DIFFERENT, + FAIL_RENAMING, + FAIL_CHECK_ORIGIN_NOT_OPENED, + FAIL_CHECK_TARGET_NOT_OPENED +}; // Copy a file, adjust the access attributes, so that the target is writable. -extern int copy_file(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. +// 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); // Ignore system and hidden files, which may be created by the DropBox synchronisation process. // https://github.com/prusa3d/PrusaSlicer/issues/1298 @@ -92,23 +110,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 -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) @@ -217,14 +225,6 @@ inline typename CONTAINER_TYPE::value_type& next_value_modulo(typename CONTAINER return container[next_idx_modulo(idx, container.size())]; } -template -inline T exchange(T& obj, U&& new_value) -{ - T old_value = std::move(obj); - obj = std::forward(new_value); - return old_value; -} - extern std::string xml_escape(std::string text); @@ -330,6 +330,25 @@ 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 diff --git a/src/libslic3r/VoronoiOffset.cpp b/src/libslic3r/VoronoiOffset.cpp new file mode 100644 index 0000000000..c0541bd9f9 --- /dev/null +++ b/src/libslic3r/VoronoiOffset.cpp @@ -0,0 +1,855 @@ +// Polygon offsetting using Voronoi diagram prodiced by boost::polygon. + +#include "VoronoiOffset.hpp" + +#include + +// #define VORONOI_DEBUG_OUT + +#ifdef VORONOI_DEBUG_OUT +#include +#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 ¢er, 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> 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(); + out.pts[1] += pt2.cast(); + + assert(std::abs((out.pts[0] - pt1.cast()).norm() - d) < SCALED_EPSILON); + assert(std::abs((out.pts[1] - pt1.cast()).norm() - d) < SCALED_EPSILON); + assert(std::abs((out.pts[0] - pt2.cast()).norm() - d) < SCALED_EPSILON); + assert(std::abs((out.pts[1] - pt2.cast()).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(); + Vec2d lv = (line.b - line.a).cast(); + double l2 = lv.squaredNorm(); + Vec2d lpv = (line.a - ipt).cast(); + 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(line.a.cast(), (line.b - line.a).cast(), out.pts[0]) - d) < SCALED_EPSILON); + assert(std::abs(Geometry::ray_point_distance(line.a.cast(), (line.b - line.a).cast(), out.pts[1]) - d) < SCALED_EPSILON); + assert(std::abs((out.pts[0] - ipt.cast()).norm() - d) < SCALED_EPSILON); + assert(std::abs((out.pts[1] - ipt.cast()).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 edge_state(vd.num_edges(), EdgeState::Unknown); + std::vector cell_state(vd.num_cells(), CellState::Unknown); + const VD::edge_type *front_edge = &vd.edges().front(); + const VD::cell_type *front_cell = &vd.cells().front(); + auto set_edge_state_initial = [&edge_state, front_edge](const VD::edge_type *edge, EdgeState new_edge_type) { + EdgeState &edge_type = edge_state[edge - front_edge]; + assert(edge_type == EdgeState::Unknown || edge_type == new_edge_type); + assert(new_edge_type == EdgeState::Possible || new_edge_type == EdgeState::Inactive); + edge_type = new_edge_type; + }; + 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()); + Vec2d lv((line->b - line->a).cast()); + double side = cross2(lv, Vec2d(v1->x(), v1->y()) - l0); + bool edge_active = outside ? (side < 0.) : (side > 0.); + set_edge_state_initial(&edge, edge_active ? EdgeState::Possible : EdgeState::Inactive); + assert(cell->contains_segment()); + set_cell_state(cell, + pt_on_contour ? CellState::Boundary : + edge_active ? CellState::Active : CellState::Inactive); + set_cell_state(cell2, + (pt_on_contour && cell2->contains_segment()) ? + CellState::Boundary : + edge_active ? CellState::Active : CellState::Inactive); + } + } + { + // Perform one round of expansion marking Voronoi edges and cells next to boundary cells as active / inactive. + std::vector cell_queue; + for (const VD::edge_type &edge : vd.edges()) + if (edge_state[&edge - front_edge] == EdgeState::Unknown) { + assert(edge.cell()->contains_point() && edge.twin()->cell()->contains_point()); + // Edge separating two point sources, not yet classified as inside / outside. + CellState cs = cell_state[edge.cell() - front_cell]; + CellState cs2 = cell_state[edge.twin()->cell() - front_cell]; + if (cs != CellState::Unknown || cs2 != CellState::Unknown) { + if (cs == CellState::Unknown) { + cs = cs2; + if (set_cell_state(edge.cell(), cs)) + cell_queue.emplace_back(edge.cell()); + } else if (set_cell_state(edge.twin()->cell(), cs)) + cell_queue.emplace_back(edge.twin()->cell()); + EdgeState es = (cs == CellState::Active) ? EdgeState::Possible : EdgeState::Inactive; + set_edge_state_initial(&edge, es); + set_edge_state_initial(edge.twin(), es); + } else { + const VD::edge_type *e = edge.twin()->rot_prev(); + do { + EdgeState es = edge_state[e->twin() - front_edge]; + if (es != EdgeState::Unknown) { + assert(es == EdgeState::Possible || es == EdgeState::Inactive); + set_edge_state_initial(&edge, es); + CellState cs = (es == EdgeState::Possible) ? CellState::Active : CellState::Inactive; + if (set_cell_state(edge.cell(), cs)) + cell_queue.emplace_back(edge.cell()); + if (set_cell_state(edge.twin()->cell(), cs)) + cell_queue.emplace_back(edge.twin()->cell()); + break; + } + e = e->rot_prev(); + } while (e != edge.twin()); + } + } + // 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()).cast(); + bbox.max += (0.01 * bbox.size().cast()).cast(); + } + 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() + 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(), bbox.max.cast())); + } + helper_lines.emplace_back(Line(Point(pt1.cast()), Point(((pt1 + pt2) * 0.5).cast()))); + } + 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 edge_offset_point(vd.num_edges(), Vec2d()); + const double offset_distance2 = offset_distance * offset_distance; + for (const VD::edge_type &edge : vd.edges()) { + assert(edge_state[&edge - front_edge] != EdgeState::Unknown); + size_t edge_idx = &edge - front_edge; + if (edge_state[edge_idx] == EdgeState::Possible) { + // Edge candidate, intersection points were not calculated yet. + const VD::vertex_type *v0 = edge.vertex0(); + const VD::vertex_type *v1 = edge.vertex1(); + assert(v0 != nullptr); + const VD::cell_type *cell = edge.cell(); + const VD::cell_type *cell2 = edge.twin()->cell(); + const Line &line0 = lines[cell->source_index()]; + const Line &line1 = lines[cell2->source_index()]; + size_t edge_idx2 = edge.twin() - front_edge; + if (v1 == nullptr) { + assert(edge.is_infinite()); + assert(edge.is_linear()); + assert(edge_state[edge_idx2] == EdgeState::Inactive); + if (cell->contains_point() && cell2->contains_point()) { + assert(! edge.is_secondary()); + const Point &pt0 = (cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b; + const Point &pt1 = (cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b; + double dmin2 = (Vec2d(v0->x(), v0->y()) - pt0.cast()).squaredNorm(); + assert(dmin2 >= SCALED_EPSILON * SCALED_EPSILON); + if (dmin2 <= offset_distance2) { + // There shall be an intersection of this unconstrained edge with the offset curve. + // Direction vector of this unconstrained Voronoi edge. + Vec2d dir(double(pt0.y() - pt1.y()), double(pt1.x() - pt0.x())); + Vec2d pt(v0->x(), v0->y()); + double t = detail::first_circle_segment_intersection_parameter(Vec2d(pt0.x(), pt0.y()), offset_distance, pt, dir); + edge_offset_point[edge_idx] = pt + t * dir; + set_edge_state_final(edge_idx, EdgeState::Active); + } else + set_edge_state_final(edge_idx, EdgeState::Inactive); + } else { + // Infinite edges could not be created by two segment sites. + assert(cell->contains_point() != cell2->contains_point()); + // Linear edge goes through the endpoint of a segment. + assert(edge.is_secondary()); + const Point &ipt = cell->contains_segment() ? + ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b) : + ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b); + #ifndef NDEBUG + if (cell->contains_segment()) { + const Point &pt1 = (cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b; + assert((pt1.x() == line0.a.x() && pt1.y() == line0.a.y()) || + (pt1.x() == line0.b.x() && pt1.y() == line0.b.y())); + } else { + const Point &pt0 = (cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b; + assert((pt0.x() == line1.a.x() && pt0.y() == line1.a.y()) || + (pt0.x() == line1.b.x() && pt0.y() == line1.b.y())); + } + assert((Vec2d(v0->x(), v0->y()) - ipt.cast()).norm() < SCALED_EPSILON); + #endif /* NDEBUG */ + // Infinite edge starts at an input contour, therefore there is always an intersection with an offset curve. + const Line &line = cell->contains_segment() ? line0 : line1; + assert(line.a == ipt || line.b == ipt); + edge_offset_point[edge_idx] = ipt.cast() + offset_distance * Vec2d(line.b.y() - line.a.y(), line.a.x() - line.b.x()).normalized(); + set_edge_state_final(edge_idx, EdgeState::Active); + } + // The other edge of an unconstrained edge starting with null vertex shall never be intersected. + set_edge_state_final(edge_idx2, EdgeState::Inactive); + } else if (edge.is_secondary()) { + assert(edge.is_linear()); + assert(cell->contains_point() != cell2->contains_point()); + const Line &line0 = lines[edge.cell()->source_index()]; + const Line &line1 = lines[edge.twin()->cell()->source_index()]; + const Point &pt = cell->contains_point() ? + ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b) : + ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b); + const Line &line = cell->contains_segment() ? line0 : line1; + assert(pt == line.a || pt == line.b); + assert((pt.cast() - Vec2d(v0->x(), v0->y())).norm() < SCALED_EPSILON); + Vec2d dir(v1->x() - v0->x(), v1->y() - v0->y()); + double l2 = dir.squaredNorm(); + if (offset_distance2 <= l2) { + edge_offset_point[edge_idx] = pt.cast() + (offset_distance / sqrt(l2)) * dir; + set_edge_state_final(edge_idx, EdgeState::Active); + } else { + set_edge_state_final(edge_idx, EdgeState::Inactive); + } + set_edge_state_final(edge_idx2, EdgeState::Inactive); + } else { + // Finite edge has valid points at both sides. + bool done = false; + if (cell->contains_segment() && cell2->contains_segment()) { + // This edge is a bisector of two line segments. Project v0, v1 onto one of the line segments. + Vec2d pt(line0.a.cast()); + Vec2d dir(line0.b.cast() - pt); + Vec2d vec0 = Vec2d(v0->x(), v0->y()) - pt; + Vec2d vec1 = Vec2d(v1->x(), v1->y()) - pt; + double l2 = dir.squaredNorm(); + assert(l2 > 0.); + double dmin = (dir * (vec0.dot(dir) / l2) - vec0).squaredNorm(); + double dmax = (dir * (vec1.dot(dir) / l2) - vec1).squaredNorm(); + bool flip = dmin > dmax; + if (flip) + std::swap(dmin, dmax); + if (offset_distance2 >= dmin && offset_distance2 <= dmax) { + // Intersect. Maximum one intersection will be found. + // This edge is a bisector of two line segments. Distance to the input polygon increases/decreases monotonically. + dmin = sqrt(dmin); + dmax = sqrt(dmax); + assert(offset_distance > dmin - EPSILON && offset_distance < dmax + EPSILON); + double ddif = dmax - dmin; + if (ddif == 0.) { + // line, line2 are exactly parallel. This is a singular case, the offset curve should miss it. + } else { + if (flip) { + std::swap(edge_idx, edge_idx2); + std::swap(v0, v1); + } + double t = clamp(0., 1., (offset_distance - dmin) / ddif); + edge_offset_point[edge_idx] = Vec2d(lerp(v0->x(), v1->x(), t), lerp(v0->y(), v1->y(), t)); + set_edge_state_final(edge_idx, EdgeState::Active); + set_edge_state_final(edge_idx2, EdgeState::Inactive); + done = true; + } + } + } else { + assert(cell->contains_point() || cell2->contains_point()); + bool point_vs_segment = cell->contains_point() != cell2->contains_point(); + const Point &pt0 = cell->contains_point() ? + ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b) : + ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b); + // Project p0 to line segment . + Vec2d p0(v0->x(), v0->y()); + Vec2d p1(v1->x(), v1->y()); + Vec2d px(pt0.x(), pt0.y()); + double d0 = (p0 - px).squaredNorm(); + double d1 = (p1 - px).squaredNorm(); + double dmin = std::min(d0, d1); + double dmax = std::max(d0, d1); + bool has_intersection = false; + bool possibly_two_points = false; + if (offset_distance2 <= dmax) { + if (offset_distance2 >= dmin) { + has_intersection = true; + } else { + double dmin_new = dmin; + if (point_vs_segment) { + // Project on the source segment. + const Line &line = cell->contains_segment() ? line0 : line1; + const Vec2d pt_line = line.a.cast(); + const Vec2d v_line = (line.b - line.a).cast(); + double t0 = (p0 - pt_line).dot(v_line); + double t1 = (p1 - pt_line).dot(v_line); + double tx = (px - pt_line).dot(v_line); + if ((tx >= t0 && tx <= t1) || (tx >= t1 && tx <= t0)) { + // Projection of the Point site falls between the projections of the Voronoi edge end points + // onto the Line site. + Vec2d ft = pt_line + (tx / v_line.squaredNorm()) * v_line; + dmin_new = (ft - px).squaredNorm() * 0.25; + } + } else { + // Point-Point Voronoi sites. Project point site onto the current Voronoi edge. + Vec2d v = p1 - p0; + auto l2 = v.squaredNorm(); + assert(l2 > 0); + auto t = v.dot(px - p0); + if (t >= 0. && t <= l2) { + // Projection falls onto the Voronoi edge. Calculate foot point and distance. + Vec2d ft = p0 + (t / l2) * v; + dmin_new = (ft - px).squaredNorm(); + } + } + assert(dmin_new < dmax + SCALED_EPSILON); + assert(dmin_new < dmin + SCALED_EPSILON); + if (dmin_new < dmin) { + dmin = dmin_new; + has_intersection = possibly_two_points = offset_distance2 >= dmin; + } + } + } + if (has_intersection) { + detail::Intersections intersections; + if (point_vs_segment) { + assert(cell->contains_point() || cell2->contains_point()); + intersections = detail::line_point_equal_distance_points(cell->contains_segment() ? line0 : line1, pt0, offset_distance); + } else { + const Point &pt1 = (cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b; + intersections = detail::point_point_equal_distance_points(pt0, pt1, offset_distance); + } + // If the span of distances of start / end point / foot point to the point site indicate an intersection, + // we should find one. + assert(intersections.count > 0); + if (intersections.count == 2) { + // Now decide which points fall on this Voronoi edge. + // Tangential points (single intersection) are ignored. + if (possibly_two_points) { + Vec2d v = p1 - p0; + double l2 = v.squaredNorm(); + double t0 = v.dot(intersections.pts[0] - p0); + double t1 = v.dot(intersections.pts[1] - p0); + if (t0 > t1) { + std::swap(t0, t1); + std::swap(intersections.pts[0], intersections.pts[1]); + } + // Remove points outside of the line range. + if (t0 < 0. || t0 > l2) { + if (t1 < 0. || t1 > l2) + intersections.count = 0; + else { + -- intersections.count; + t0 = t1; + intersections.pts[0] = intersections.pts[1]; + } + } else if (t1 < 0. || t1 > l2) + -- intersections.count; + } else { + // Take the point furthest from the end points of the Voronoi edge or a Voronoi parabolic arc. + double d0 = std::max((intersections.pts[0] - p0).squaredNorm(), (intersections.pts[0] - p1).squaredNorm()); + double d1 = std::max((intersections.pts[1] - p0).squaredNorm(), (intersections.pts[1] - p1).squaredNorm()); + if (d0 > d1) + intersections.pts[0] = intersections.pts[1]; + -- intersections.count; + } + assert(intersections.count > 0); + if (intersections.count == 2) { + set_edge_state_final(edge_idx, EdgeState::Active); + set_edge_state_final(edge_idx2, EdgeState::Active); + edge_offset_point[edge_idx] = intersections.pts[1]; + edge_offset_point[edge_idx2] = intersections.pts[0]; + done = true; + } else if (intersections.count == 1) { + if (d1 < d0) + std::swap(edge_idx, edge_idx2); + set_edge_state_final(edge_idx, EdgeState::Active); + set_edge_state_final(edge_idx2, EdgeState::Inactive); + edge_offset_point[edge_idx] = intersections.pts[0]; + done = true; + } + } + } + } + if (! done) { + set_edge_state_final(edge_idx, EdgeState::Inactive); + set_edge_state_final(edge_idx2, EdgeState::Inactive); + } + } + } + } + +#ifndef NDEBUG + for (const VD::edge_type &edge : vd.edges()) { + assert(edge_state[&edge - front_edge] == EdgeState::Inactive || edge_state[&edge - front_edge] == EdgeState::Active); + // None of a new edge candidate may start with null vertex. + assert(edge_state[&edge - front_edge] == EdgeState::Inactive || edge.vertex0() != nullptr); + assert(edge_state[edge.twin() - front_edge] == EdgeState::Inactive || edge.twin()->vertex0() != nullptr); + } +#endif // NDEBUG + +#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()))); + 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() - point).norm() : + (Geometry::foot_pt(line.a.cast(), (line.b - line.a).cast(), 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 ¢er = ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b).cast(); + 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 0000000000..a21b44f93e --- /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 0000000000..fa6a342418 --- /dev/null +++ b/src/libslic3r/VoronoiVisualUtils.hpp @@ -0,0 +1,415 @@ +#include + +#include +#include +#include +#include + +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 +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 Point, + template class Segment> + static + typename enable_if< + typename gtl_and< + typename gtl_if< + typename is_point_concept< + typename geometry_concept< Point >::type + >::type + >::type, + typename gtl_if< + typename is_segment_concept< + typename geometry_concept< Segment >::type + >::type + >::type + >::type, + void + >::type discretize( + const Point& point, + const Segment& segment, + const CT max_dist, + std::vector< Point >* 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 last_point = (*discretization)[1]; + discretization->pop_back(); + + // Use stack to avoid recursion. + std::stack 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(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 Point, + template class Segment> + static + typename enable_if< + typename gtl_and< + typename gtl_if< + typename is_point_concept< + typename geometry_concept< Point >::type + >::type + >::type, + typename gtl_if< + typename is_segment_concept< + typename geometry_concept< Segment >::type + >::type + >::type + >::type, + CT + >::type get_point_projection( + const Point& point, const Segment& 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 + static CT cast(const InCT& value) { + return static_cast(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 point_type; + typedef boost::polygon::segment_data segment_type; + typedef boost::polygon::rectangle_data 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 &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 &segments, const edge_type& edge, coordinate_type bbox_max_size, std::vector* 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 &segments, const edge_type& edge, std::vector &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::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()).cast(); + bbox.max += (0.01 * bbox.size().cast()).cast(); + + 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 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::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::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::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 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 a5b53584d7..cebafa6333 100644 --- a/src/libslic3r/Zipper.cpp +++ b/src/libslic3r/Zipper.cpp @@ -1,5 +1,6 @@ #include +#include "Exception.hpp" #include "Zipper.hpp" #include "miniz_extension.hpp" #include @@ -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 be1e69b5c3..bbaf2f05e7 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 0000000000..c3747677b0 --- /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 + +namespace Slic3r { + +// https://gist.github.com/gchudnov/6a90d51af004d97337ec +namespace internal { + namespace format { + // Default "cook" function - just forward. + template + inline T&& cook(T&& arg) { + return std::forward(arg); + } + + // End of the recursive chain. + inline std::string format_recursive(boost::format& message) { + return message.str(); + } + + template + std::string format_recursive(boost::format& message, TValue&& arg, TArgs&&... args) { + // Format, possibly convert the argument by the "cook" function. + message % cook(std::forward(arg)); + return format_recursive(message, std::forward(args)...); + } + } +}; + +template +inline std::string format(const char* fmt, TArgs&&... args) { + boost::format message(fmt); + return internal::format::format_recursive(message, std::forward(args)...); +} + +template +inline std::string format(const std::string& fmt, TArgs&&... args) { + boost::format message(fmt); + return internal::format::format_recursive(message, std::forward(args)...); +} + +} // namespace Slic3r + +#endif // slic3r_format_hpp_ diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h index afbf94fa39..a404d230dd 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 +#include #include #include #include @@ -17,35 +21,44 @@ #include #include #include +#include #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 @@ -98,7 +91,17 @@ extern Semver SEMVER; template inline T unscale(Q v) { return T(v) * T(SCALING_FACTOR); } -enum Axis { X=0, Y, Z, E, F, NUM_AXES }; +enum Axis { + X=0, + Y, + Z, + E, + F, + NUM_AXES, + // For the GCodeReader to mark a parsed axis, which is not in "XYZEF", it was parsed correctly. + UNKNOWN_AXIS = NUM_AXES, + NUM_AXES_WITH_UNKNOWN, +}; template inline void append_to(std::vector &dst, const std::vector &src) @@ -158,6 +161,53 @@ inline std::unique_ptr make_unique(Args&&... args) { return std::unique_ptr(new T(std::forward(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 +ForwardIt lower_bound_by_predicate(ForwardIt first, ForwardIt last, LowerThanKeyPredicate lower_thank_key) +{ + ForwardIt it; + typename std::iterator_traits::difference_type count, step; + count = std::distance(first, last); + + while (count > 0) { + it = first; + step = count / 2; + std::advance(it, step); + if (lower_thank_key(*it)) { + first = ++it; + count -= step + 1; + } + else + count = step; + } + return first; +} + +// from https://en.cppreference.com/w/cpp/algorithm/lower_bound +template> +ForwardIt binary_find(ForwardIt first, ForwardIt last, const T& value, Compare comp={}) +{ + // Note: BOTH type T and the type after ForwardIt is dereferenced + // must be implicitly convertible to BOTH Type1 and Type2, used in Compare. + // This is stricter than lower_bound requirement (see above) + + first = std::lower_bound(first, last, value, comp); + return first != last && !comp(value, *first) ? first : last; +} + +// from https://en.cppreference.com/w/cpp/algorithm/lower_bound +template +ForwardIt binary_find_by_predicate(ForwardIt first, ForwardIt last, LowerThanKeyPredicate lower_thank_key, EqualToKeyPredicate equal_to_key) +{ + // Note: BOTH type T and the type after ForwardIt is dereferenced + // must be implicitly convertible to BOTH Type1 and Type2, used in Compare. + // This is stricter than lower_bound requirement (see above) + + first = lower_bound_by_predicate(first, last, lower_thank_key); + return first != last && equal_to_key(*first) ? first : last; +} + template static inline T sqr(T x) { @@ -183,6 +233,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 struct is_scaled_coord +{ + static const constexpr bool value = + std::is_integral::value && + std::numeric_limits::digits >= + std::numeric_limits::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 FloatingOnly 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 +using FloatingOnly = std::enable_if_t::value, O>; + +template +using ScaledCoordOnly = std::enable_if_t::value, O>; + +template +using IntegerOnly = std::enable_if_t::value, O>; + +template +using ArithmeticOnly = std::enable_if_t::value, O>; + +template +using IteratorOnly = std::enable_if_t< + !std::is_same_v::value_type, void>, O +>; + +template // Arbitrary allocator can be used +IntegerOnly> reserve_vector(I capacity) +{ + std::vector 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 e87b1a552e..76b4cb4e55 100644 --- a/src/libslic3r/miniz_extension.cpp +++ b/src/libslic3r/miniz_extension.cpp @@ -1,9 +1,17 @@ +#include + #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 { @@ -26,8 +34,20 @@ bool open_zip(mz_zip_archive *zip, const char *fname, bool isread) return false; } - return isread ? mz_zip_reader_init_cfile(zip, f, 0, 0) - : mz_zip_writer_init_cfile(zip, f, 0); + bool res = false; + if (isread) + { + res = mz_zip_reader_init_cfile(zip, f, 0, 0); + if (!res) + // if we get here it means we tried to open a non-zip file + // we need to close the file here because the call to mz_zip_get_cfile() made into close_zip() returns a null pointer + // see: https://github.com/prusa3d/PrusaSlicer/issues/3536 + fclose(f); + } + else + res = mz_zip_writer_init_cfile(zip, f, 0); + + return res; } bool close_zip(mz_zip_archive *zip, bool isread) @@ -56,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 8d0967cbcc..006226bf24 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 67b3d3a214..a1d6da5fe3 100644 --- a/src/libslic3r/pchheader.hpp +++ b/src/libslic3r/pchheader.hpp @@ -63,6 +63,7 @@ #include #include #include +#include #include #include #include @@ -110,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 678ad9ed28..d5555f27a0 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -417,27 +417,85 @@ std::error_code rename_file(const std::string &from, const std::string &to) #endif } -int copy_file(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); - static const auto perms = boost::filesystem::owner_read | boost::filesystem::owner_write | boost::filesystem::group_read | boost::filesystem::others_read; // aka 644 + const boost::filesystem::path source(from); + const boost::filesystem::path target(to); + static const auto perms = boost::filesystem::owner_read | boost::filesystem::owner_write | boost::filesystem::group_read | boost::filesystem::others_read; // aka 644 - // Make sure the file has correct permission both before and after we copy over it. - // NOTE: error_code variants are used here to supress expception throwing. - // Error code of permission() calls is ignored on purpose - if they fail, - // the copy_file() function will fail appropriately and we don't want the permission() - // calls to cause needless failures on permissionless filesystems (ie. FATs on SD cards etc.) - // or when the target file doesn't exist. - boost::system::error_code ec; - boost::filesystem::permissions(target, perms, ec); - boost::filesystem::copy_file(source, target, boost::filesystem::copy_option::overwrite_if_exists, ec); - if (ec) { - return -1; - } - boost::filesystem::permissions(target, perms, ec); + // Make sure the file has correct permission both before and after we copy over it. + // NOTE: error_code variants are used here to supress expception throwing. + // Error code of permission() calls is ignored on purpose - if they fail, + // the copy_file() function will fail appropriately and we don't want the permission() + // calls to cause needless failures on permissionless filesystems (ie. FATs on SD cards etc.) + // or when the target file doesn't exist. + boost::system::error_code ec; + boost::filesystem::permissions(target, perms, ec); + if (ec) + BOOST_LOG_TRIVIAL(error) << "boost::filesystem::permisions before copy error message (this could be irrelevant message based on file system): " << ec.message(); + ec.clear(); + boost::filesystem::copy_file(source, target, boost::filesystem::copy_option::overwrite_if_exists, ec); + if (ec) { + error_message = ec.message(); + return FAIL_COPY_FILE; + } + ec.clear(); + boost::filesystem::permissions(target, perms, ec); + if (ec) + BOOST_LOG_TRIVIAL(error) << "boost::filesystem::permisions after copy error message (this could be irrelevant message based on file system): " << ec.message(); + return SUCCESS; +} - return 0; +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, error_message); + if(ret_val == SUCCESS) + { + if (with_check) + ret_val = check_copy(from, to_temp); + + if (ret_val == 0 && rename_file(to_temp, to)) + ret_val = FAIL_RENAMING; + } + return ret_val; +} + +CopyFileResult check_copy(const std::string &origin, const std::string ©) +{ + boost::nowide::ifstream f1(origin, std::ifstream::in | std::ifstream::binary | std::ifstream::ate); + boost::nowide::ifstream f2(copy, std::ifstream::in | std::ifstream::binary | std::ifstream::ate); + + if (f1.fail()) + return FAIL_CHECK_ORIGIN_NOT_OPENED; + if (f2.fail()) + return FAIL_CHECK_TARGET_NOT_OPENED; + + std::streampos fsize = f1.tellg(); + if (fsize != f2.tellg()) + return FAIL_FILES_DIFFERENT; + + f1.seekg(0, std::ifstream::beg); + f2.seekg(0, std::ifstream::beg); + + // Compare by reading 8 MiB buffers one at a time. + size_t buffer_size = 8 * 1024 * 1024; + std::vector buffer_origin(buffer_size, 0); + std::vector buffer_copy(buffer_size, 0); + do { + f1.read(buffer_origin.data(), buffer_size); + f2.read(buffer_copy.data(), buffer_size); + std::streampos origin_cnt = f1.gcount(); + std::streampos copy_cnt = f2.gcount(); + if (origin_cnt != copy_cnt || + (origin_cnt > 0 && std::memcmp(buffer_origin.data(), buffer_copy.data(), origin_cnt) != 0)) + // Files are different. + return FAIL_FILES_DIFFERENT; + fsize -= origin_cnt; + } while (f1.good() && f2.good()); + + // All data has been read and compared equal. + return (f1.eof() && f2.eof() && fsize == 0) ? SUCCESS : FAIL_FILES_DIFFERENT; } // Ignore system and hidden files, which may be created by the DropBox synchronisation process. @@ -486,7 +544,7 @@ std::string encode_path(const char *src) // Convert a wide string to a local code page. int size_needed = ::WideCharToMultiByte(0, 0, wstr_src.data(), (int)wstr_src.size(), nullptr, 0, nullptr, nullptr); std::string str_dst(size_needed, 0); - ::WideCharToMultiByte(0, 0, wstr_src.data(), (int)wstr_src.size(), const_cast(str_dst.data()), size_needed, nullptr, nullptr); + ::WideCharToMultiByte(0, 0, wstr_src.data(), (int)wstr_src.size(), str_dst.data(), size_needed, nullptr, nullptr); return str_dst; #else /* WIN32 */ return src; @@ -503,7 +561,7 @@ std::string decode_path(const char *src) // Convert the string encoded using the local code page to a wide string. int size_needed = ::MultiByteToWideChar(0, 0, src, len, nullptr, 0); std::wstring wstr_dst(size_needed, 0); - ::MultiByteToWideChar(0, 0, src, len, const_cast(wstr_dst.data()), size_needed); + ::MultiByteToWideChar(0, 0, src, len, wstr_dst.data(), size_needed); // Convert a wide string to utf8. return boost::nowide::narrow(wstr_dst.c_str()); #else /* WIN32 */ @@ -535,20 +593,30 @@ std::string string_printf(const char *format, ...) va_start(args1, format); va_list args2; va_copy(args2, args1); - - size_t needed_size = ::vsnprintf(nullptr, 0, format, args1) + 1; - va_end(args1); - - std::string res(needed_size, '\0'); - ::vsnprintf(&res.front(), res.size(), format, args2); - va_end(args2); - - return res; + + static const size_t INITIAL_LEN = 200; + std::string buffer(INITIAL_LEN, '\0'); + + int bufflen = ::vsnprintf(buffer.data(), INITIAL_LEN - 1, format, args1); + + if (bufflen >= int(INITIAL_LEN)) { + buffer.resize(size_t(bufflen) + 1); + ::vsnprintf(buffer.data(), buffer.size(), format, args2); + } + + buffer.resize(bufflen); + + return buffer; } 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 0000000000..eed737cb77 --- /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 2d4186a5d3..a4520c6d73 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-2019 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 d09f015b9c..e922b23f56 100644 --- a/src/platform/osx/Info.plist.in +++ b/src/platform/osx/Info.plist.in @@ -5,7 +5,7 @@ CFBundleExecutable @SLIC3R_APP_KEY@ CFBundleGetInfoString - @SLIC3R_APP_NAME@ Copyright (C) 2011-2019 Alessandro Ranellucci, (C) 2016-2019 Prusa Reseach + @SLIC3R_APP_NAME@ Copyright (C) 2011-2019 Alessandro Ranellucci, (C) 2016-2020 Prusa Reseach CFBundleIconFile PrusaSlicer.icns CFBundleName @@ -103,7 +103,7 @@ CFBundleTypeName GCODE CFBundleTypeRole - Editor + Viewer LISsAppleDefaultForType LSHandlerRank @@ -116,7 +116,5 @@ NSApplication NSHighResolutionCapable - NSRequiresAquaSystemAppearance - diff --git a/src/platform/osx/entitlements.plist b/src/platform/osx/entitlements.plist new file mode 100644 index 0000000000..59274f955f --- /dev/null +++ b/src/platform/osx/entitlements.plist @@ -0,0 +1,9 @@ + + + + + + com.apple.security.cs.disable-library-validation + + + diff --git a/src/platform/unix/PrusaGcodeviewer.desktop b/src/platform/unix/PrusaGcodeviewer.desktop new file mode 100644 index 0000000000..b6c419b0f3 --- /dev/null +++ b/src/platform/unix/PrusaGcodeviewer.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Prusa GCode viewer +Exec=prusa-slicer --gcodeviewer %F +Icon=PrusaSlicer # TODO: change when the new icon is ready +Terminal=false +Type=Application +MimeType=text/x.gcode; +Categories=Graphics;3DGraphics; +Keywords=3D;Printing;Slicer; \ No newline at end of file diff --git a/src/platform/unix/PrusaSlicer.desktop b/src/platform/unix/PrusaSlicer.desktop new file mode 100644 index 0000000000..dae507b54a --- /dev/null +++ b/src/platform/unix/PrusaSlicer.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=PrusaSlicer +GenericName=3D Printing Software +Icon=PrusaSlicer +Exec=prusa-slicer %F +Terminal=false +Type=Application +MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;application/x-amf; +Categories=Graphics;3DGraphics;Engineering; +Keywords=3D;Printing;Slicer;slice;3D;printer;convert;gcode;stl;obj;amf;SLA +StartupNotify=false +StartupWMClass=prusa-slicer \ No newline at end of file diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 9ed7424c05..c44b76970c 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -1,5 +1,5 @@ +cmake_minimum_required(VERSION 3.13) project(libslic3r_gui) -cmake_minimum_required(VERSION 2.6) 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,26 +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 @@ -75,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 @@ -83,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 @@ -95,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 @@ -105,10 +123,14 @@ set(SLIC3R_GUI_SOURCES GUI/Camera.hpp GUI/wxExtensions.cpp GUI/wxExtensions.hpp + GUI/ExtruderSequenceDialog.cpp + GUI/ExtruderSequenceDialog.hpp GUI/WipeTowerDialog.cpp GUI/WipeTowerDialog.hpp GUI/RammingChart.cpp GUI/RammingChart.hpp + GUI/RemovableDriveManager.cpp + GUI/RemovableDriveManager.hpp GUI/BonjourDialog.cpp GUI/BonjourDialog.hpp GUI/ButtonsDescription.cpp @@ -125,17 +147,42 @@ set(SLIC3R_GUI_SOURCES Utils/Serial.hpp GUI/ConfigWizard.cpp GUI/ConfigWizard.hpp + GUI/ConfigWizard_private.hpp GUI/MsgDialog.cpp GUI/MsgDialog.hpp GUI/UpdateDialogs.cpp 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/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/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 @@ -146,31 +193,63 @@ set(SLIC3R_GUI_SOURCES Utils/Duet.hpp Utils/FlashAir.cpp 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) list(APPEND SLIC3R_GUI_SOURCES Utils/RetinaHelperImpl.mm Utils/MacDarkMode.mm + GUI/RemovableDriveManagerMM.mm + GUI/RemovableDriveManagerMM.h + GUI/Mouse3DHandlerMac.mm + GUI/InstanceCheckMac.mm + GUI/InstanceCheckMac.h ) + FIND_LIBRARY(DISKARBITRATION_LIBRARY DiskArbitration) + endif () add_library(libslic3r_gui STATIC ${SLIC3R_GUI_SOURCES}) encoding_check(libslic3r_gui) -target_link_libraries(libslic3r_gui libslic3r avrdude cereal imgui ${GLEW_LIBRARIES}) +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 () diff --git a/src/slic3r/Config/Snapshot.cpp b/src/slic3r/Config/Snapshot.cpp index fa756f49da..54d1dea577 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 #include -#include #include #include #include -#include +#include +#include +#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,7 +260,7 @@ bool Snapshot::equal_to_active(const AppConfig &app_config) const // 2) Check, whether this snapshot references the same set of ini files as the current state. boost::filesystem::path data_dir = boost::filesystem::path(Slic3r::data_dir()); boost::filesystem::path snapshot_dir = boost::filesystem::path(Slic3r::data_dir()) / SLIC3R_SNAPSHOTS_DIR / this->id; - for (const char *subdir : { "print", "filament", "printer", "vendor" }) { + for (const char *subdir : snapshot_subdirs) { boost::filesystem::path path1 = data_dir / subdir; boost::filesystem::path path2 = snapshot_dir / subdir; std::vector files1, files2; @@ -316,7 +332,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 +356,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 +386,12 @@ const Snapshot& SnapshotDB::take_snapshot(const AppConfig &app_config, Snapshot: snapshot.comment = comment; snapshot.reason = reason; // Active presets at the time of the snapshot. - snapshot.print = app_config.get("presets", "print"); + snapshot.print = app_config.get("presets", "print"); + snapshot.sla_print = app_config.get("presets", "sla_print"); snapshot.filaments.emplace_back(app_config.get("presets", "filament")); - snapshot.printer = app_config.get("presets", "printer"); + snapshot.sla_material = app_config.get("presets", "sla_material"); + snapshot.printer = app_config.get("presets", "printer"); + snapshot.physical_printer = app_config.get("presets", "physical_printer"); for (unsigned i = 1; i < 1000; ++ i) { char name[64]; sprintf(name, "filament_%u", i); @@ -415,7 +434,7 @@ const Snapshot& SnapshotDB::take_snapshot(const AppConfig &app_config, Snapshot: boost::filesystem::create_directory(snapshot_dir); // Backup the presets. - for (const char *subdir : { "print", "filament", "printer", "vendor" }) + for (const char *subdir : snapshot_subdirs) copy_config_dir_single_level(data_dir / subdir, snapshot_dir / subdir); snapshot.save_ini((snapshot_dir / "snapshot.ini").string()); assert(m_snapshots.empty() || m_snapshots.back().time_captured <= snapshot.time_captured); @@ -430,7 +449,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 +458,11 @@ void SnapshotDB::restore_snapshot(const Snapshot &snapshot, AppConfig &app_confi boost::filesystem::path snapshot_db_dir = SnapshotDB::create_db_dir(); boost::filesystem::path snapshot_dir = snapshot_db_dir / snapshot.id; // Remove existing ini files and restore the ini files from the snapshot. - for (const char *subdir : { "print", "filament", "printer", "vendor" }) { + for (const char *subdir : snapshot_subdirs) { delete_existing_ini_files(data_dir / subdir); copy_config_dir_single_level(snapshot_dir / subdir, data_dir / subdir); } - // Update AppConfig with the selections of the print / filament / printer profiles + // Update AppConfig with the selections of the print / sla_print / filament / sla_material / printer profiles // and about the installed printer types and variants. snapshot.export_selections(app_config); snapshot.export_vendor_configs(app_config); @@ -502,7 +521,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 9a73916916..48add8a1ad 100644 --- a/src/slic3r/Config/Snapshot.hpp +++ b/src/slic3r/Config/Snapshot.hpp @@ -6,7 +6,7 @@ #include #include -#include +#include #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 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_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 da522dd5e5..04ce05ab5b 100644 --- a/src/slic3r/Config/Version.cpp +++ b/src/slic3r/Config/Version.cpp @@ -2,8 +2,7 @@ #include -#include -#include +#include #include #include "libslic3r/libslic3r.h" @@ -66,6 +65,10 @@ bool Version::is_current_slic3r_supported() const return this->is_slic3r_supported(Slic3r::SEMVER); } +bool Version::is_current_slic3r_downgrade() const +{ + return Slic3r::SEMVER < min_slic3r_version; +} #if 0 //TODO: This test should be moved to a unit test, once we have C++ unit tests in place. static int version_test() @@ -205,7 +208,7 @@ size_t Index::load(const boost::filesystem::path &path) #endif ++ idx_line; // Skip the initial white spaces. - char *key = left_trim(const_cast(line.data())); + char *key = left_trim(line.data()); if (*key == '#') // Skip a comment line. continue; @@ -286,16 +289,21 @@ Index::const_iterator Index::find(const Semver &ver) const return (it == m_configs.end() || it->config_version == ver) ? it : m_configs.end(); } -Index::const_iterator Index::recommended() const +Index::const_iterator Index::recommended(const Semver &slic3r_version) const { const_iterator highest = this->end(); for (const_iterator it = this->begin(); it != this->end(); ++ it) - if (it->is_current_slic3r_supported() && + if (it->is_slic3r_supported(slic3r_version) && (highest == this->end() || highest->config_version < it->config_version)) highest = it; return highest; } +Index::const_iterator Index::recommended() const +{ + return this->recommended(Slic3r::SEMVER); +} + std::vector Index::load_db() { boost::filesystem::path cache_dir = boost::filesystem::path(Slic3r::data_dir()) / "cache"; @@ -316,7 +324,7 @@ std::vector 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 19c565ffb4..8249573dec 100644 --- a/src/slic3r/Config/Version.hpp +++ b/src/slic3r/Config/Version.hpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include "libslic3r/FileParserError.hpp" #include "libslic3r/Semver.hpp" @@ -29,6 +29,7 @@ struct Version bool is_slic3r_supported(const Semver &slicer_version) const; bool is_current_slic3r_supported() const; + bool is_current_slic3r_downgrade() const; }; // Index of vendor specific config bundle versions and Slic3r compatibilities. @@ -53,7 +54,7 @@ struct Version class Index { public: - typedef std::vector::const_iterator const_iterator; + typedef std::vector::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); @@ -71,6 +72,8 @@ public: // Returns configs().end() if such version does not exist in the index. This shall never happen // if the index is valid. const_iterator recommended() const; + // Recommended config for a provided slic3r version. Used when checking for slic3r update (slic3r_version is the old one read out from PrusaSlicer.ini) + const_iterator recommended(const Semver &slic3r_version) const; // Returns the filesystem path from which this index has originally been loaded const boost::filesystem::path& path() const { return m_path; } diff --git a/src/slic3r/GUI/2DBed.cpp b/src/slic3r/GUI/2DBed.cpp index d2075f673d..debd104ef6 100644 --- a/src/slic3r/GUI/2DBed.cpp +++ b/src/slic3r/GUI/2DBed.cpp @@ -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 d0bab50c6c..244f9eae0e 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 #include #include +#include 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(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(l.a(0)); v1.position[1] = unscale(l.a(1)); @@ -120,118 +115,106 @@ 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; +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() -: origin(Vec3d::Zero()) -, length(25.0 * Vec3d::Ones()) +void Bed3D::Axes::set_stem_length(float length) { - m_quadric = ::gluNewQuadric(); - if (m_quadric != nullptr) - ::gluQuadricDrawStyle(m_quadric, GLU_FILL); -} - -Bed3D::Axes::~Axes() -{ - 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 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()); // 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()); // 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()); - glsafe(::glDisable(GL_LIGHTING)); -} + 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() : m_type(Custom) - , m_custom_texture("") - , m_custom_model("") - , m_requires_canvas_update(false) , m_vbo_id(0) , m_scale_factor(1.0f) { } -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) { - EType new_type = detect_type(shape); + 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); + }; - // check that the passed custom texture filename is valid - std::string cst_texture(custom_texture); - if (!cst_texture.empty()) - { - std::replace(cst_texture.begin(), cst_texture.end(), '\\', '/'); - if ((!boost::algorithm::iends_with(custom_texture, ".png") && !boost::algorithm::iends_with(custom_texture, ".svg")) || !boost::filesystem::exists(custom_texture)) - cst_texture = ""; + auto check_model = [](const std::string& model) { + return !model.empty() && boost::algorithm::iends_with(model, ".stl") && boost::filesystem::exists(model); + }; + + 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; } - // check that the passed custom texture filename is valid - std::string cst_model(custom_model); - if (!cst_model.empty()) - { - std::replace(cst_model.begin(), cst_model.end(), '\\', '/'); - if (!boost::algorithm::iends_with(custom_model, ".stl") || !boost::filesystem::exists(custom_model)) - cst_model = ""; - } + std::string texture_filename = custom_texture.empty() ? texture : custom_texture; + if (!check_texture(texture_filename)) + texture_filename.clear(); - if ((m_shape == shape) && (m_type == new_type) && (m_custom_texture == cst_texture) && (m_custom_model == cst_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 == 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_custom_texture = cst_texture; - m_custom_model = cst_model; - m_type = new_type; + m_texture_filename = texture_filename; + m_model_filename = model_filename; + 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)))); } @@ -246,9 +229,9 @@ bool Bed3D::set_shape(const Pointfs& shape, const std::string& custom_texture, c m_texture.reset(); m_model.reset(); - // Set the origin and size for painting of 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(); + // Set the origin and size for rendering the coordinate system axes. + m_axes.set_origin({ 0.0, 0.0, static_cast(GROUND_Z) }); + m_axes.set_stem_length(0.1f * static_cast(m_bounding_box.max_size())); // Let the calee to update the UI. return true; @@ -264,46 +247,51 @@ Point Bed3D::point_projection(const Point& point) const return m_polygon.point_projection(point); } -void Bed3D::render(GLCanvas3D& canvas, float theta, float scale_factor) const +void Bed3D::render(GLCanvas3D& canvas, bool bottom, float scale_factor, + bool show_axes, bool show_texture) const { m_scale_factor = scale_factor; - render_axes(); + if (show_axes) + render_axes(); + + glsafe(::glEnable(GL_DEPTH_TEST)); switch (m_type) { - case MK2: { render_prusa(canvas, "mk2", theta > 90.0f); break; } - case MK3: { render_prusa(canvas, "mk3", theta > 90.0f); break; } - case SL1: { render_prusa(canvas, "sl1", theta > 90.0f); break; } - case MINI: { render_prusa(canvas, "mini", theta > 90.0f); break; } - case ENDER3: { render_prusa(canvas, "ender3", theta > 90.0f); break; } + case System: { render_system(canvas, bottom, show_texture); break; } default: - case Custom: { render_custom(canvas, theta > 90.0f); break; } + case Custom: { render_custom(canvas, bottom, show_texture); break; } } + + glsafe(::glDisable(GL_DEPTH_TEST)); } 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"); @@ -312,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)); @@ -338,51 +324,18 @@ void Bed3D::calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox) printf("Unable to create bed grid lines\n"); } -Bed3D::EType Bed3D::detect_type(const Pointfs& shape) const +std::tuple Bed3D::detect_type(const Pointfs& shape) const { - EType type = Custom; - 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 (curr->vendor != nullptr) - { - if ((curr->vendor->name == "Prusa Research") && (shape == dynamic_cast(curr->config.option("bed_shape"))->values)) - { - if (boost::contains(curr->name, "SL1")) - { - type = SL1; - break; - } - else if (boost::contains(curr->name, "MK3") || boost::contains(curr->name, "MK2.5")) - { - type = MK3; - break; - } - else if (boost::contains(curr->name, "MK2")) - { - type = MK2; - break; - } - else if (boost::contains(curr->name, "MINI")) - { - type = MINI; - break; - } - } - else if ((curr->vendor->name == "Creality") && (shape == dynamic_cast(curr->config.option("bed_shape"))->values)) - { - if (boost::contains(curr->name, "ENDER-3")) - { - type = ENDER3; - break; - } - } + while (curr != nullptr) { + if (curr->config.has("bed_shape")) { + if (shape == dynamic_cast(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 { System, model_filename, texture_filename }; } } @@ -390,7 +343,7 @@ Bed3D::EType Bed3D::detect_type(const Pointfs& shape) const } } - return type; + return { Custom, "", "" }; } void Bed3D::render_axes() const @@ -399,75 +352,66 @@ void Bed3D::render_axes() const m_axes.render(); } -void Bed3D::render_prusa(GLCanvas3D& canvas, const std::string& key, bool bottom) const +void Bed3D::render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) const { if (!bottom) - render_model(m_custom_model.empty() ? resources_dir() + "/models/" + key + "_bed.stl" : m_custom_model); + render_model(); - render_texture(m_custom_texture.empty() ? resources_dir() + "/icons/bed/" + key + ".svg" : m_custom_texture, bottom, canvas); + if (show_texture) + render_texture(bottom, canvas); } -void Bed3D::render_texture(const std::string& filename, bool bottom, GLCanvas3D& canvas) const +void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const { - if (filename.empty()) - { + if (m_texture_filename.empty()) { m_texture.reset(); render_default(bottom); return; } - if ((m_texture.get_id() == 0) || (m_texture.get_source() != filename)) - { + if ((m_texture.get_id() == 0) || (m_texture.get_source() != m_texture_filename)) { m_texture.reset(); - if (boost::algorithm::iends_with(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() != 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(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; } + canvas.request_extra_frame(); } // starts generating the main texture, compression will run asynchronously - if (!m_texture.load_from_svg_file(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(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() != filename)) - { - if (!m_temp_texture.load_from_file(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; } + canvas.request_extra_frame(); } // starts generating the main texture, compression will run asynchronously - if (!m_texture.load_from_file(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(); @@ -475,27 +419,18 @@ void Bed3D::render_texture(const std::string& filename, bool bottom, GLCanvas3D& if (m_temp_texture.get_id() != 0) m_temp_texture.reset(); - m_requires_canvas_update = true; + canvas.request_extra_frame(); + } - else if (m_requires_canvas_update && m_texture.all_compressed_data_sent_to_gpu()) - m_requires_canvas_update = false; - if (m_texture.all_compressed_data_sent_to_gpu() && canvas.is_keeping_dirty()) - canvas.stop_keeping_dirty(); + 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_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_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)); @@ -513,8 +448,8 @@ void Bed3D::render_texture(const std::string& filename, bool bottom, GLCanvas3D& 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(); @@ -524,13 +459,11 @@ void Bed3D::render_texture(const std::string& filename, bool bottom, GLCanvas3D& 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())); } @@ -552,47 +485,52 @@ void Bed3D::render_texture(const std::string& filename, bool bottom, GLCanvas3D& glsafe(::glDisable(GL_BLEND)); glsafe(::glDepthMask(GL_TRUE)); - m_shader.stop_using(); + shader->stop_using(); } } } -void Bed3D::render_model(const std::string& filename) const +void Bed3D::render_model() const { - if (filename.empty()) + if (m_model_filename.empty()) return; - if ((m_model.get_filename() != filename) && m_model.init_from_file(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_custom_texture.empty() && m_custom_model.empty()) - { + if (m_texture_filename.empty() && m_model_filename.empty()) { render_default(bottom); return; } if (!bottom) - render_model(m_custom_model); + render_model(); - render_texture(m_custom_texture, bottom, canvas); + if (show_texture) + render_texture(bottom, canvas); } void Bed3D::render_default(bool bottom) const @@ -600,8 +538,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)); @@ -610,11 +547,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)); @@ -622,11 +558,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())); @@ -638,12 +574,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 132836711e..b5b063e6f9 100644 --- a/src/slic3r/GUI/3DBed.hpp +++ b/src/slic3r/GUI/3DBed.hpp @@ -3,10 +3,10 @@ #include "GLTexture.hpp" #include "3DScene.hpp" -#include "GLShader.hpp" +#include "GLModel.hpp" -class GLUquadric; -typedef class GLUquadric GLUquadricObj; +#include +#include namespace Slic3r { namespace GUI { @@ -43,32 +43,31 @@ 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: enum EType : unsigned char { - MK2, - MK3, - SL1, - MINI, - ENDER3, + System, Custom, Num_Types }; @@ -76,21 +75,20 @@ public: private: EType m_type; Pointfs m_shape; - std::string m_custom_texture; - std::string m_custom_model; + std::string m_texture_filename; + std::string m_model_filename; mutable BoundingBoxf3 m_bounding_box; mutable BoundingBoxf3 m_extended_bounding_box; Polygon m_polygon; GeometryBuffer m_triangles; GeometryBuffer m_gridlines; mutable GLTexture m_texture; + mutable GLModel m_model; + mutable Vec3d m_model_offset{ Vec3d::Zero() }; + std::array 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; - // used to trigger 3D scene update once all compressed textures have been sent to GPU - mutable bool m_requires_canvas_update; - mutable Shader m_shader; mutable unsigned int m_vbo_id; - mutable GLBed m_model; Axes m_axes; mutable float m_scale_factor; @@ -101,29 +99,32 @@ public: EType get_type() const { return m_type; } - bool is_prusa() const { return (m_type == MK2) || (m_type == MK3) || (m_type == SL1); } bool is_custom() const { return m_type == Custom; } 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, float theta, float scale_factor) const; + void render(GLCanvas3D& canvas, bool bottom, float scale_factor, + bool show_axes, bool show_texture) const; private: void calc_bounding_boxes() const; void calc_triangles(const ExPolygon& poly); void calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox); - EType detect_type(const Pointfs& shape) const; + std::tuple detect_type(const Pointfs& shape) const; void render_axes() const; - void render_prusa(GLCanvas3D& canvas, const std::string& key, bool bottom) const; - void render_texture(const std::string& filename, bool bottom, GLCanvas3D& canvas) const; - void render_model(const std::string& filename) const; - void render_custom(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, 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 bbfcabd36f..e97ba07648 100644 --- a/src/slic3r/GUI/3DScene.cpp +++ b/src/slic3r/GUI/3DScene.cpp @@ -1,46 +1,57 @@ #include +#if ENABLE_SMOOTH_NORMALS +#include +#include +#include +#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/PresetBundle.hpp" +#include "slic3r/GUI/BitmapCache.hpp" #include "libslic3r/Format/STL.hpp" #include "libslic3r/Utils.hpp" +#include "libslic3r/AppConfig.hpp" #include #include #include -#include #include #include #include -#include +#include #include -#include -#include - #include -#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& normals) +{ + mesh.repair(); + + using MapMatrixXfUnaligned = Eigen::Map>; + using MapMatrixXiUnaligned = Eigen::Map>; + + std::vector 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(); + 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(); + Eigen::MatrixXd out_normals; + + igl::per_corner_normals(vertices, indices, in_normals, 1.0, out_normals); + + normals = std::vector(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(); + } + } +} + +static void smooth_normals_vertex(TriangleMesh& mesh, std::vector& normals) +{ + mesh.repair(); + + using MapMatrixXfUnaligned = Eigen::Map>; + using MapMatrixXiUnaligned = Eigen::Map>; + + Eigen::MatrixXd vertices = MapMatrixXfUnaligned(mesh.its.vertices.front().data(), + Eigen::Index(mesh.its.vertices.size()), 3).cast(); + 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(mesh.its.vertices.size()); + for (size_t i = 0; i < static_cast(out_normals.rows()); ++i) { + normals[i] = out_normals.row(i).cast(); + } +} +#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 normals; + smooth_normals_corner(new_mesh, normals); +// smooth_normals_vertex(new_mesh, normals); - 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->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)); + } - this->push_triangle(vertices_count, vertices_count + 1, vertices_count + 2); - vertices_count += 3; + 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)); + + 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().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(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 facets; + std::vector 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 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, ¤t_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(volume.first->world_matrix().matrix().block(0, 0, 3, 3).inverse().transpose().cast())); + + 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; @@ -706,7 +805,7 @@ bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, M // Allow the objects to protrude below the print bed print_volume.min(2) = -1e10; - ModelInstance::EPrintVolumeState state = ModelInstance::PVS_Inside; + ModelInstanceEPrintVolumeState state = ModelInstancePVS_Inside; bool contained_min_one = false; @@ -725,11 +824,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) @@ -792,14 +891,14 @@ void GLVolumeCollection::update_colors_by_extruder(const DynamicPrintConfig* con for (unsigned int i = 0; i < colors_count; ++i) { const std::string& txt_color = config->opt_string("extruder_colour", i); - if (PresetBundle::parse_color(txt_color, rgb)) + if (Slic3r::GUI::BitmapCache::parse_color(txt_color, rgb)) { colors[i].set(txt_color, rgb); } else { const std::string& txt_color = config->opt_string("filament_colour", i); - if (PresetBundle::parse_color(txt_color, rgb)) + if (Slic3r::GUI::BitmapCache::parse_color(txt_color, rgb)) colors[i].set(txt_color, rgb); } } @@ -877,13 +976,10 @@ bool can_export_to_obj(const GLVolume& volume) if (!volume.is_active || !volume.is_extrusion_path) return false; - if (volume.indexed_vertex_array.triangle_indices.empty() && (std::min(volume.indexed_vertex_array.triangle_indices_size, volume.tverts_range.second - volume.tverts_range.first) == 0)) - return false; + bool has_triangles = !volume.indexed_vertex_array.triangle_indices.empty() || (std::min(volume.indexed_vertex_array.triangle_indices_size, volume.tverts_range.second - volume.tverts_range.first) > 0); + bool has_quads = !volume.indexed_vertex_array.quad_indices.empty() || (std::min(volume.indexed_vertex_array.quad_indices_size, volume.qverts_range.second - volume.qverts_range.first) > 0); - if (volume.indexed_vertex_array.quad_indices.empty() && (std::min(volume.indexed_vertex_array.quad_indices_size, volume.qverts_range.second - volume.qverts_range.first) == 0)) - return false; - - return true; + return has_triangles || has_quads; } bool GLVolumeCollection::has_toolpaths_to_export() const @@ -897,288 +993,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 Color; - std::set 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 src_vertices_and_normals_interleaved; - std::vector src_triangle_indices; - std::vector 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(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::const_iterator it_begin = volume->indexed_vertex_array.triangle_indices.begin() + volume->tverts_range.first; - std::vector::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(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::const_iterator it_begin = volume->indexed_vertex_array.quad_indices.begin() + volume->qverts_range.first; - std::vector::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(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 vector; - - explicit Vector(float* ptr) - { - vector[0] = scale_(*(ptr + 0)); - vector[1] = scale_(*(ptr + 1)); - vector[2] = scale_(*(ptr + 2)); - } - }; - typedef std::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 Indices; - - unsigned int src_vertices_count = (unsigned int)src_vertices_and_normals_interleaved.size() / 6; - std::vector src_dst_vertex_indices_map(src_vertices_count, -1); - std::vector 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(v.vector[0]), unscale(v.vector[1]), unscale(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(n.vector[0]), unscale(n.vector[1]), unscale(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, @@ -1804,7 +1618,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()"); } } } @@ -1825,322 +1639,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, ¤t_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 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 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 8c5040eee2..930f63c8e1 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 -#include -#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 { @@ -303,6 +299,8 @@ public: int instance_id; bool operator==(const CompositeID &rhs) const { return object_id == rhs.object_id && volume_id == rhs.volume_id && instance_id == rhs.instance_id; } bool operator!=(const CompositeID &rhs) const { return ! (*this == rhs); } + bool operator< (const CompositeID &rhs) const + { return object_id < rhs.object_id || (object_id == rhs.object_id && (volume_id < rhs.volume_id || (volume_id == rhs.volume_id && instance_id < rhs.instance_id))); } }; CompositeID composite_id; // Fingerprint of the source geometry. For ModelVolumes, it is the ModelVolume::ID and ModelInstanceID, @@ -311,33 +309,40 @@ public: // Valid geometry_id should always be positive. std::pair geometry_id; // An ID containing the extruder ID (used to select color). - int extruder_id; - // Is this object selected? - bool selected; - // Is this object disabled from selection? - bool disabled; - // Is this object printable? - bool printable; - // Whether or not this volume is active for rendering - bool is_active; - // Whether or not to use this volume when applying zoom_to_volumes() - bool zoom_to_volumes; - // Wheter or not this volume is enabled for outside print volume detection in shader. - bool shader_outside_printer_detection_enabled; - // Wheter or not this volume is outside print volume. - bool is_outside; + int extruder_id; + + // Various boolean flags. + struct { + // Is this object selected? + bool selected : 1; + // Is this object disabled from selection? + bool disabled : 1; + // Is this object printable? + bool printable : 1; + // Whether or not this volume is active for rendering + bool is_active : 1; + // Whether or not to use this volume when applying zoom_to_volumes() + bool zoom_to_volumes : 1; + // Wheter or not this volume is enabled for outside print volume detection in shader. + bool shader_outside_printer_detection_enabled : 1; + // Wheter or not this volume is outside print volume. + bool is_outside : 1; + // Wheter or not this volume has been generated from a modifier + bool is_modifier : 1; + // Wheter or not this volume has been generated from the wipe tower + bool is_wipe_tower : 1; + // Wheter or not this volume has been generated from an extrusion path + bool is_extrusion_path : 1; + // Wheter or not to always render this volume using its own alpha + 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 ? - EHoverState hover; - // Wheter or not this volume has been generated from a modifier - bool is_modifier; - // Wheter or not this volume has been generated from the wipe tower - bool is_wipe_tower; - // Wheter or not this volume has been generated from an extrusion path - bool is_extrusion_path; - // Wheter or not to always render this volume using its own alpha - bool force_transparent; - // Whether or not always use the volume's own color (not using SELECTED/HOVER/DISABLED/OUTSIDE) - bool force_native_color; + EHoverState hover; // Interleaved triangles & normals with indexed triangles & quads. GLIndexedVertexArray indexed_vertex_array; @@ -442,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(); } @@ -478,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 load_object( const ModelObject *model_object, @@ -542,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); @@ -568,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); @@ -578,82 +596,8 @@ private: GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCollection::ERenderType type, const Transform3d& view_matrix, std::function filter_func = nullptr); -class GLModel +struct _3DScene { -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 -{ -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& widths, const std::vector& heights, bool closed, double top_z, GLVolume& volume); static void thick_lines_to_verts(const Lines3& lines, const std::vector& widths, const std::vector& heights, bool closed, GLVolume& volume); static void extrusionentity_to_verts(const Polyline &polyline, float width, float height, float print_z, GLVolume& volume); diff --git a/src/slic3r/GUI/AboutDialog.cpp b/src/slic3r/GUI/AboutDialog.cpp index a4453c73ea..6e3f8ecc82 100644 --- a/src/slic3r/GUI/AboutDialog.cpp +++ b/src/slic3r/GUI/AboutDialog.cpp @@ -2,8 +2,9 @@ #include "I18N.hpp" #include "libslic3r/Utils.hpp" +#include "GUI.hpp" #include "GUI_App.hpp" -#include "wxExtensions.hpp" + namespace Slic3r { namespace GUI { @@ -36,8 +37,10 @@ void AboutDialogLogo::onRepaint(wxEvent &event) // CopyrightsDialog // ----------------------------------------- CopyrightsDialog::CopyrightsDialog() - : DPIDialog(NULL, wxID_ANY, wxString::Format("%s - %s", SLIC3R_APP_NAME, _(L("Portions copyright"))), - wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + : DPIDialog((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)); @@ -49,7 +52,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(1.2f*fs); int size[] = { fs, fs, fs, fs, fs2, fs2, fs2 }; @@ -112,7 +115,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/" } }; } @@ -196,8 +201,8 @@ void CopyrightsDialog::onCloseDialog(wxEvent &) } AboutDialog::AboutDialog() - : DPIDialog(NULL, wxID_ANY, wxString::Format(_(L("About %s")), SLIC3R_APP_NAME), wxDefaultPosition, - wxDefaultSize, /*wxCAPTION*/wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + : DPIDialog((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()); @@ -209,7 +214,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); @@ -218,7 +223,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); @@ -228,7 +233,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__ @@ -244,7 +249,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()); @@ -253,32 +258,33 @@ AboutDialog::AboutDialog() int size[] = {fs,fs,fs,fs,fs,fs,fs}; m_html->SetFonts(font.GetFaceName(), font.GetFaceName(), size); m_html->SetBorders(2); - const wxString copyright_str = _(L("Copyright")); + const std::string copyright_str = _utf8(L("Copyright")); // TRN "Slic3r _is licensed under the_ License" - const wxString is_lecensed_str = _(L("is licensed under the")); - const wxString license_str = _(L("GNU Affero General Public License, version 3")); - const wxString based_on_str = _(L("PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community.")); - const wxString contributors_str = _(L("Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others.")); - const auto text = wxString::Format( + const std::string is_lecensed_str = _utf8(L("is licensed under the")); + const std::string license_str = _utf8(L("GNU Affero General Public License, version 3")); + const std::string based_on_str = _utf8(L("PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community.")); + const std::string contributors_str = _utf8(L("Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others.")); + const auto text = from_u8( + (boost::format( "" - "" - "" - "%s © 2016-2019 Prusa Research.
" - "%s © 2011-2018 Alessandro Ranellucci.
" - "
Slic3r %s " - "%s." + "" + "" + "%4% © 2016-2020 Prusa Research.
" + "%5% © 2011-2018 Alessandro Ranellucci.
" + "Slic3r %6% " + "%7%." "

" - "%s" + "%8%" "

" - "%s" + "%9%" "
" "" - "", bgr_clr_str, text_clr_str, text_clr_str, - copyright_str, copyright_str, - is_lecensed_str, - license_str, - based_on_str, - contributors_str); + "") % bgr_clr_str % text_clr_str % text_clr_str + % copyright_str % copyright_str + % is_lecensed_str + % license_str + % based_on_str + % contributors_str).str()); m_html->SetPage(text); vsizer->Add(m_html, 1, wxEXPAND | wxBOTTOM, 10); m_html->Bind(wxEVT_HTML_LINK_CLICKED, &AboutDialog::onLinkClicked, this); @@ -288,7 +294,7 @@ 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); diff --git a/src/slic3r/GUI/AboutDialog.hpp b/src/slic3r/GUI/AboutDialog.hpp index 5fec214959..f1e26fde41 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 #include #include diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp index 5ab65f340b..66d1f551f9 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp @@ -1,5 +1,7 @@ #include "BackgroundSlicingProcess.hpp" #include "GUI_App.hpp" +#include "GUI.hpp" +#include "MainFrame.hpp" #include #include @@ -10,35 +12,80 @@ #include #include -#if ENABLE_THUMBNAIL_GENERATOR #include -#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" -#if ENABLE_THUMBNAIL_GENERATOR -#include "libslic3r/GCode/ThumbnailData.hpp" -#endif // ENABLE_THUMBNAIL_GENERATOR +#include "libslic3r/Format/SL1.hpp" +#include "libslic3r/Thread.hpp" #include "libslic3r/libslic3r.h" #include #include #include -#include -#include -#include -#include +#include +#include #include #include #include "I18N.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::string SlicingProcessCompletedEvent::format_error_message() const +{ + std::string error; + 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 (std::exception &ex) { + error = ex.what(); + } catch (...) { + error = "Unknown C++ exception."; + } + return error; +} + BackgroundSlicingProcess::BackgroundSlicingProcess() { boost::filesystem::path temp_path(wxStandardPaths::Get().GetTempDir().utf8_str().data()); @@ -89,32 +136,56 @@ 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_data); -#else - m_fff_print->export_gcode(m_temp_output_path, m_gcode_preview_data); -#endif // ENABLE_THUMBNAIL_GENERATOR - if (this->set_step_started(bspsGCodeFinalize)) { + 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); - if (copy_file(m_temp_output_path, export_path) != 0) - 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?"))); + std::string error_message; + int copy_ret_val = copy_file(m_temp_output_path, export_path, error_message, m_export_path_on_removable_media); + switch (copy_ret_val) { + case SUCCESS: break; // no error + case FAIL_COPY_FILE: + throw Slic3r::ExportError((boost::format(_utf8(L("Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?\nError message: %1%"))) % error_message).str()); + break; + case FAIL_FILES_DIFFERENT: + throw Slic3r::ExportError((boost::format(_utf8(L("Copying of the temporary G-code to the output G-code failed. There might be problem with target device, please try exporting again or using different device. The corrupted output G-code is at %1%.tmp."))) % export_path).str()); + break; + case FAIL_RENAMING: + throw Slic3r::ExportError((boost::format(_utf8(L("Renaming of the G-code after copying to the selected destination folder has failed. Current path is %1%.tmp. Please try exporting again."))) % export_path).str()); + break; + case FAIL_CHECK_ORIGIN_NOT_OPENED: + throw Slic3r::ExportError((boost::format(_utf8(L("Copying of the temporary G-code has finished but the original code at %1% couldn't be opened during copy check. The output G-code is at %2%.tmp."))) % m_temp_output_path % export_path).str()); + break; + case FAIL_CHECK_TARGET_NOT_OPENED: + throw Slic3r::ExportError((boost::format(_utf8(L("Copying of the temporary G-code has finished but the exported code couldn't be opened during copy check. The output G-code is at %1%.tmp."))) % export_path).str()); + break; + default: + throw Slic3r::RuntimeError(_utf8(L("Unknown error occured during exporting G-code."))); + 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()); 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"))); } this->set_step_done(bspsGCodeFinalize); - } + } } -#if ENABLE_THUMBNAIL_GENERATOR static void write_thumbnail(Zipper& zipper, const ThumbnailData& data) { size_t png_size = 0; @@ -125,7 +196,6 @@ static void write_thumbnail(Zipper& zipper, const ThumbnailData& data) mz_free(png_data); } } -#endif // ENABLE_THUMBNAIL_GENERATOR void BackgroundSlicingProcess::process_sla() { @@ -133,26 +203,30 @@ 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_data != nullptr) + if (m_thumbnail_cb != nullptr) { - for (const ThumbnailData& data : *m_thumbnail_data) + ThumbnailsList thumbnails; + m_thumbnail_cb(thumbnails, current_print()->full_print_config().option("thumbnails")->values, true, true, true, true); +// m_thumbnail_cb(thumbnails, current_print()->full_print_config().option("thumbnails")->values, true, false, true, true); // renders also supports and pad + for (const ThumbnailData& data : thumbnails) { if (data.is_valid()) 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"))); @@ -163,6 +237,9 @@ void BackgroundSlicingProcess::process_sla() void BackgroundSlicingProcess::thread_proc() { + set_current_thread_name("slic3r_BgSlcPcs"); + name_tbb_thread_pool_threads(); + assert(m_print != nullptr); assert(m_print == m_fff_print || m_print == m_sla_print); std::unique_lock lck(m_mutex); @@ -181,7 +258,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()) { @@ -192,15 +269,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 = 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.")), SLIC3R_APP_NAME); - error = errmsg.ToStdString() + "\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(); @@ -208,9 +278,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(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(); @@ -270,7 +340,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(); @@ -360,11 +430,12 @@ Print::ApplyStatus BackgroundSlicingProcess::apply(const Model &model, const Dyn assert(config.opt_enum("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; } @@ -376,7 +447,7 @@ void BackgroundSlicingProcess::set_task(const PrintBase::TaskParams ¶ms) } // Set the output path of the G-code. -void BackgroundSlicingProcess::schedule_export(const std::string &path) +void BackgroundSlicingProcess::schedule_export(const std::string &path, bool export_path_on_removable_media) { assert(m_export_path.empty()); if (! m_export_path.empty()) @@ -386,6 +457,7 @@ void BackgroundSlicingProcess::schedule_export(const std::string &path) tbb::mutex::scoped_lock lock(m_print->state_mutex()); this->invalidate_step(bspsGCodeFinalize); m_export_path = path; + m_export_path_on_removable_media = export_path_on_removable_media; } void BackgroundSlicingProcess::schedule_upload(Slic3r::PrintHostJob upload_job) @@ -406,6 +478,7 @@ void BackgroundSlicingProcess::reset_export() assert(! this->running()); if (! this->running()) { m_export_path.clear(); + m_export_path_on_removable_media = false; // invalidate_step expects the mutex to be locked. tbb::mutex::scoped_lock lock(m_print->state_mutex()); this->invalidate_step(bspsGCodeFinalize); @@ -450,26 +523,28 @@ 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()) != 0) { - 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()); 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 - if (m_thumbnail_data != nullptr) + m_sla_archive.export_print(zipper, *m_sla_print, m_upload_job.upload_data.upload_path.string()); + if (m_thumbnail_cb != nullptr) { - for (const ThumbnailData& data : *m_thumbnail_data) + ThumbnailsList thumbnails; + m_thumbnail_cb(thumbnails, current_print()->full_print_config().option("thumbnails")->values, true, true, true, true); +// m_thumbnail_cb(thumbnails, current_print()->full_print_config().option("thumbnails")->values, true, false, true, true); // renders also supports and pad + for (const ThumbnailData& data : thumbnails) { if (data.is_valid()) 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 a603d52acc..d4fc3ddcc4 100644 --- a/src/slic3r/GUI/BackgroundSlicingProcess.hpp +++ b/src/slic3r/GUI/BackgroundSlicingProcess.hpp @@ -5,21 +5,20 @@ #include #include -#include - #include -#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; -#if ENABLE_THUMBNAIL_GENERATOR -struct ThumbnailData; -#endif // ENABLE_THUMBNAIL_GENERATOR class Model; class SLAPrint; @@ -33,6 +32,38 @@ 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. + std::string 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. @@ -50,19 +81,21 @@ 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_data(const std::vector* data) { m_thumbnail_data = data; } -#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 / Platter window, when the slicing is finished + // 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. // The wxCommandEvent is sent to the UI thread asynchronously without waiting for the event to be processed. void set_slicing_completed_event(int event_id) { m_event_slicing_completed_id = event_id; } - // The following wxCommandEvent will be sent to the UI thread / Platter window, when the G-code export is finished. + // 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. @@ -89,7 +122,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 ¶ms); @@ -101,7 +134,7 @@ public: // Set the export path of the G-code. // Once the path is set, the G-code - void schedule_export(const std::string &path); + void schedule_export(const std::string &path, bool export_path_on_removable_media); // Set print host upload job data to be enqueued to the PrintHostJobQueue // after current print slicing is complete void schedule_upload(Slic3r::PrintHostJob upload_job); @@ -157,16 +190,16 @@ 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 - // Data structures, used to write thumbnails into gcode. - const std::vector* m_thumbnail_data = 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. std::string m_export_path; + bool m_export_path_on_removable_media = false; // Print host upload job to schedule after slicing is complete, used by schedule_upload(), // empty by default (ie. no upload to schedule) PrintHostJob m_upload_job; @@ -189,10 +222,13 @@ private: void throw_if_canceled() const { if (m_print->canceled()) throw CanceledException(); } void prepare_upload(); - // wxWidgets command ID to be sent to the platter to inform that the slicing is finished, and the G-code export will continue. + // wxWidgets command ID to be sent to the plater to inform that the slicing is finished, and the G-code export will continue. int m_event_slicing_completed_id = 0; - // wxWidgets command ID to be sent to the platter to inform that the task finished. + // 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 96a0a59cd5..7818382331 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 #include @@ -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 vertex_distances; + double avg_dist = 0; + for (auto pt : polygon.points) + { + double distance = (pt - center).cast().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(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(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()); @@ -61,9 +217,7 @@ void BedShapePanel::build_panel(const ConfigOptionPoints& default_pt, const Conf { m_shape = default_pt.values; m_custom_texture = custom_texture.value.empty() ? NONE : custom_texture.value; - std::replace(m_custom_texture.begin(), m_custom_texture.end(), '\\', '/'); m_custom_model = custom_model.value.empty() ? NONE : custom_model.value; - std::replace(m_custom_model.begin(), m_custom_model.end(), '\\', '/'); auto sbsizer = new wxStaticBoxSizer(wxVERTICAL, this, _(L("Shape"))); sbsizer->GetStaticBox()->SetFont(wxGetApp().bold_font()); @@ -72,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); + 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); - 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(BedShape::get_name(BedShape::Type::Circular)); + BedShape::append_option_line(optgroup, BedShape::Parameter::Diameter); + activate_options_page(optgroup); - 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(BedShape::get_name(BedShape::Type::Custom)); - optgroup = init_shape_options_page(_(L("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(); @@ -145,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) @@ -162,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); @@ -222,7 +363,7 @@ wxPanel* BedShapePanel::init_texture_panel() if (m_custom_texture != NONE) { if (!exists) - tooltip_text += _(L("Not found: ")); + tooltip_text += _(L("Not found:")) + " "; tooltip_text += _(m_custom_texture); } @@ -241,6 +382,7 @@ wxPanel* BedShapePanel::init_texture_panel() return sizer; }; optgroup->append_line(line); + optgroup->activate(); panel->SetSizerAndFit(optgroup->sizer); @@ -301,7 +443,7 @@ wxPanel* BedShapePanel::init_model_panel() if (m_custom_model != NONE) { if (!exists) - tooltip_text += _(L("Not found: ")); + tooltip_text += _(L("Not found:")) + " "; tooltip_text += _(m_custom_model); } @@ -320,6 +462,7 @@ wxPanel* BedShapePanel::init_model_panel() return sizer; }; optgroup->append_line(line); + optgroup->activate(); panel->SetSizerAndFit(optgroup->sizer); @@ -333,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); + BedShape shape(points); - // 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_shape_options_book->SetSelection(shape.get_type()); + shape.apply_optgroup_values(m_optgroups[shape.get_type()]); - auto origin = new ConfigOptionPoints{ Vec2d(-x_min, -y_min) }; + // 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; - 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 vertex_distances; - double avg_dist = 0; - for (auto pt: polygon.points) - { - double distance = (pt - center).cast().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_shape_options_book->SetSelection(SHAPE_CIRCULAR); - auto optgroup = m_optgroups[SHAPE_CIRCULAR]; - boost::any ret = wxNumberFormatter::ToString(unscale(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() @@ -422,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(page_idx); + + if (page_type == BedShape::Type::Rectangular) { Vec2d rect_size(Vec2d::Zero()); Vec2d rect_origin(Vec2d::Zero()); - try{ - rect_size = boost::any_cast(m_optgroups[SHAPE_RECTANGULAR]->get_value("rect_size")); } - catch (const std::exception & /* e */) { - return; - } - try { - rect_origin = boost::any_cast(m_optgroups[SHAPE_RECTANGULAR]->get_value("rect_origin")); - } - catch (const std::exception & /* e */) { - return; - } - + + try { rect_size = boost::any_cast(opt_group->get_value("rect_size")); } + catch (const std::exception& /* e */) { return; } + + try { rect_origin = boost::any_cast(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 @@ -458,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(m_optgroups[SHAPE_CIRCULAR]->get_value("diameter")); - } - catch (const std::exception & /* e */) { - return; - } + try { diameter = boost::any_cast(opt_group->get_value("diameter")); } + catch (const std::exception & /* e */) { return; } + if (diameter == 0.0) return ; auto r = diameter / 2; auto twopi = 2 * PI; @@ -477,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(); @@ -546,8 +620,6 @@ void BedShapePanel::load_texture() return; } - std::replace(file_name.begin(), file_name.end(), '\\', '/'); - wxBusyCursor wait; m_custom_texture = file_name; @@ -571,8 +643,6 @@ void BedShapePanel::load_model() return; } - std::replace(file_name.begin(), file_name.end(), '\\', '/'); - wxBusyCursor wait; m_custom_model = file_name; diff --git a/src/slic3r/GUI/BedShapeDialog.hpp b/src/slic3r/GUI/BedShapeDialog.hpp index bf12cc8934..370129f2ed 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; + +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 f7cefe72b2..41609954e8 100644 --- a/src/slic3r/GUI/BitmapCache.cpp +++ b/src/slic3r/GUI/BitmapCache.cpp @@ -1,6 +1,11 @@ #include "BitmapCache.hpp" #include "libslic3r/Utils.hpp" +#include "../Utils/MacDarkMode.hpp" +#include "GUI.hpp" +#include "GUI_Utils.hpp" + +#include #if ! defined(WIN32) && ! defined(__APPLE__) #define BROKEN_ALPHA @@ -15,10 +20,20 @@ #include "nanosvg/nanosvg.h" #define NANOSVGRAST_IMPLEMENTATION #include "nanosvg/nanosvgrast.h" -#include "GUI_App.hpp" +//#include "GUI_App.hpp" namespace Slic3r { namespace GUI { +BitmapCache::BitmapCache() +{ +#ifdef __APPLE__ + // Note: win->GetContentScaleFactor() is not used anymore here because it tends to + // return bogus results quite often (such as 1.0 on Retina or even 0.0). + // We're using the max scaling factor across all screens because it's very likely to be good enough. + m_scale = mac_max_scaling_factor(); +#endif +} + void BitmapCache::clear() { for (std::pair &bitmap : m_map) @@ -54,6 +69,14 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_ auto it = m_map.find(bitmap_key); if (it == m_map.end()) { bitmap = new wxBitmap(width, height); +#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". + // So, We need to let the Mac OS wxBitmap implementation + // know that the image may already be scaled appropriately for Retina, + // and thereby that it's not supposed to upscale it. + bitmap->CreateScaled(width, height, -1, m_scale); +#endif m_map[bitmap_key] = bitmap; } else { bitmap = it->second; @@ -99,8 +122,13 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *beg size_t width = 0; size_t height = 0; for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { +#ifdef __APPLE__ + width += bmp->GetScaledWidth(); + height = std::max(height, bmp->GetScaledHeight()); +#else width += bmp->GetWidth(); height = std::max(height, bmp->GetHeight()); +#endif } #ifdef BROKEN_ALPHA @@ -166,7 +194,12 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *beg for (const wxBitmap *bmp = begin; bmp != end; ++ bmp) { if (bmp->GetWidth() > 0) memDC.DrawBitmap(*bmp, x, 0, true); +#ifdef __APPLE__ + // we should "move" with step equal to non-scaled width + x += bmp->GetScaledWidth(); +#else x += bmp->GetWidth(); +#endif } memDC.SelectObject(wxNullBitmap); return bitmap; @@ -174,7 +207,7 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *beg #endif } -wxBitmap* BitmapCache::insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, float scale /* = 1.0f */, const bool grayscale/* = false*/) +wxBitmap* BitmapCache::insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, const bool grayscale/* = false*/) { wxImage image(width, height); image.InitAlpha(); @@ -191,7 +224,7 @@ wxBitmap* BitmapCache::insert_raw_rgba(const std::string &bitmap_key, unsigned w if (grayscale) image = image.ConvertToGreyscale(m_gs, m_gs, m_gs); - return this->insert(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image), scale)); + return this->insert(bitmap_key, wxImage_to_wxBitmap_with_alpha(std::move(image), m_scale)); } wxBitmap* BitmapCache::load_png(const std::string &bitmap_name, unsigned width, unsigned height, @@ -226,24 +259,56 @@ wxBitmap* BitmapCache::load_png(const std::string &bitmap_name, unsigned width, } wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_width, unsigned target_height, - float scale /* = 1.0f */, const bool grayscale/* = false*/) + const bool grayscale/* = false*/, const bool dark_mode/* = false*/) { std::string bitmap_key = bitmap_name + ( target_height !=0 ? "-h" + std::to_string(target_height) : "-w" + std::to_string(target_width)) - + (scale != 1.0f ? "-s" + std::to_string(scale) : "") + + (m_scale != 1.0f ? "-s" + std::to_string(m_scale) : "") + (grayscale ? "-gs" : ""); - target_height != 0 ? target_height *= scale : target_width *= scale; + /* For the Dark mode of any platform, we should draw icons in respect to OS background + * Note: All standard(regular) icons are collected in "icons" folder, + * SVG-icons, which have "Dark mode" variant, are collected in "icons/white" folder + */ + std::string folder; + if (dark_mode) + { +#ifdef __WXMSW__ + folder = "white\\"; +#else + folder = "white/"; +#endif + auto it = m_map.find(folder + bitmap_key); + if (it != m_map.end()) + return it->second; + // 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; + } - auto it = m_map.find(bitmap_key); - if (it != m_map.end()) - return it->second; + bitmap_key = folder + bitmap_key; + } + else + { + auto it = m_map.find(bitmap_key); + if (it != m_map.end()) + return it->second; + } - NSVGimage *image = ::nsvgParseFromFile(Slic3r::var(bitmap_name + ".svg").c_str(), "px", 96.0f); + NSVGimage *image = ::nsvgParseFromFile(Slic3r::var(folder + bitmap_name + ".svg").c_str(), "px", 96.0f); if (image == nullptr) return nullptr; + target_height != 0 ? target_height *= m_scale : target_width *= m_scale; + float svg_scale = target_height != 0 ? (float)target_height / image->height : target_width != 0 ? (float)target_width / image->width : 1; @@ -267,11 +332,16 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_ ::nsvgDeleteRasterizer(rast); ::nsvgDelete(image); - return this->insert_raw_rgba(bitmap_key, width, height, data.data(), scale, grayscale); + return this->insert_raw_rgba(bitmap_key, width, height, data.data(), grayscale); } -wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency) +//we make scaled solid bitmaps only for the cases, when its will be used with scaled SVG icon in one output bitmap +wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling/* = false*/) { + double scale = suppress_scaling ? 1.0f : m_scale; + width *= scale; + height *= scale; + wxImage image(width, height); image.InitAlpha(); unsigned char* imgdata = image.GetData(); @@ -282,7 +352,23 @@ wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsi *imgdata ++ = b; *imgalpha ++ = transparency; } - return wxImage_to_wxBitmap_with_alpha(std::move(image)); + return wxImage_to_wxBitmap_with_alpha(std::move(image), scale); +} + +bool BitmapCache::parse_color(const std::string& scolor, unsigned char* rgb_out) +{ + rgb_out[0] = rgb_out[1] = rgb_out[2] = 0; + if (scolor.size() != 7 || scolor.front() != '#') + return false; + const char* c = scolor.data() + 1; + for (size_t i = 0; i < 3; ++i) { + int digit1 = hex_digit_to_int(*c++); + int digit2 = hex_digit_to_int(*c++); + if (digit1 == -1 || digit2 == -1) + return false; + rgb_out[i] = (unsigned char)(digit1 * 16 + digit2); + } + return true; } } // namespace GUI diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp index ce77057c82..3f29c2fd62 100644 --- a/src/slic3r/GUI/BitmapCache.hpp +++ b/src/slic3r/GUI/BitmapCache.hpp @@ -1,24 +1,23 @@ #ifndef SLIC3R_GUI_BITMAP_CACHE_HPP #define SLIC3R_GUI_BITMAP_CACHE_HPP +#include +#include + #include #ifndef WX_PRECOMP #include #endif -#include "libslic3r/libslic3r.h" -#include "libslic3r/Config.hpp" - -#include "GUI.hpp" - namespace Slic3r { namespace GUI { class BitmapCache { public: - BitmapCache() {} + BitmapCache(); ~BitmapCache() { clear(); } void clear(); + double scale() { return m_scale; } wxBitmap* find(const std::string &name) { auto it = m_map.find(name); return (it == m_map.end()) ? nullptr : it->second; } const wxBitmap* find(const std::string &name) const { return const_cast(this)->find(name); } @@ -29,20 +28,23 @@ public: wxBitmap* insert(const std::string &name, const wxBitmap &bmp, const wxBitmap &bmp2, const wxBitmap &bmp3); wxBitmap* insert(const std::string &name, const std::vector &bmps) { return this->insert(name, &bmps.front(), &bmps.front() + bmps.size()); } wxBitmap* insert(const std::string &name, const wxBitmap *begin, const wxBitmap *end); - wxBitmap* insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, float scale = 1.0f, const bool grayscale = false); + wxBitmap* insert_raw_rgba(const std::string &bitmap_key, unsigned width, unsigned height, const unsigned char *raw_data, const bool grayscale = false); // Load png from resources/icons. bitmap_key is given without the .png suffix. Bitmap will be rescaled to provided height/width if nonzero. wxBitmap* load_png(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, const bool grayscale = false); // 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, float scale = 1.0f, const bool grayscale = false); + 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); - static wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3]) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE); } - static wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT); } + /*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); } + + static bool parse_color(const std::string& scolor, unsigned char* rgb_out); private: std::map m_map; - double m_gs = 0.2; // value, used for image.ConvertToGreyscale(m_gs, m_gs, m_gs) + double m_gs = 0.2; // value, used for image.ConvertToGreyscale(m_gs, m_gs, m_gs) + double m_scale = 1.0; // value, used for correct scaling of SVG icons on Retina display }; } // GUI diff --git a/src/slic3r/GUI/BonjourDialog.cpp b/src/slic3r/GUI/BonjourDialog.cpp index 0e05a517c6..8ee01c9493 100644 --- a/src/slic3r/GUI/BonjourDialog.cpp +++ b/src/slic3r/GUI/BonjourDialog.cpp @@ -215,14 +215,14 @@ void BonjourDialog::on_reply(BonjourReplyEvent &e) void BonjourDialog::on_timer(wxTimerEvent &) { - const auto search_str = _(L("Searching for devices")); + const auto search_str = _utf8(L("Searching for devices")); if (timer_state > 0) { const std::string dots(timer_state, '.'); - label->SetLabel(wxString::Format("%s %s", search_str, dots)); + label->SetLabel(GUI::from_u8((boost::format("%1% %2%") % search_str % dots).str())); timer_state = (timer_state) % 3 + 1; } else { - label->SetLabel(wxString::Format("%s: %s", search_str, _(L("Finished"))+".")); + label->SetLabel(GUI::from_u8((boost::format("%1%: %2%") % search_str % (_utf8(L("Finished"))+".")).str())); timer->Stop(); } } diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp index 9fbabe930d..1e589f1a15 100644 --- a/src/slic3r/GUI/Camera.cpp +++ b/src/slic3r/GUI/Camera.cpp @@ -1,16 +1,15 @@ #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 -static const float GIMBALL_LOCK_THETA_MAX = 180.0f; - // phi / theta angles to orient the camera. static const float VIEW_DEFAULT[2] = { 45.0f, 45.0f }; static const float VIEW_LEFT[2] = { 90.0f, 90.0f }; @@ -24,60 +23,44 @@ 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; double Camera::MaxFovDeg = 60.0; Camera::Camera() - : phi(45.0f) - , requires_zoom_to_bed(false) - , inverted_phi(false) - , m_type(Perspective) - , m_target(Vec3d::Zero()) - , m_theta(45.0f) - , m_zoom(1.0) - , m_distance(DefaultDistance) - , m_gui_scale(1.0) - , m_view_matrix(Transform3d::Identity()) - , m_projection_matrix(Transform3d::Identity()) + : requires_zoom_to_bed(false) { + set_default_orientation(); } std::string Camera::get_type_as_string() const { switch (m_type) { - case Unknown: - return "unknown"; - case Perspective: - return "perspective"; + case Unknown: return "unknown"; + case Perspective: return "perspective"; default: - case Ortho: - return "orthographic"; + case Ortho: return "orthographic"; }; } 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(); + } } } void Camera::set_type(const std::string& type) { - if (type == "1") - set_type(Perspective); - else - set_type(Ortho); + set_type((type == "1") ? Perspective : Ortho); } void Camera::select_next_type() @@ -91,67 +74,47 @@ void Camera::select_next_type() void Camera::set_target(const Vec3d& target) { - m_target = target; - m_target(0) = clamp(m_scene_box.min(0), m_scene_box.max(0), m_target(0)); - m_target(1) = clamp(m_scene_box.min(1), m_scene_box.max(1), m_target(1)); - m_target(2) = clamp(m_scene_box.min(2), m_scene_box.max(2), m_target(2)); -} - -void Camera::set_theta(float theta, bool apply_limit) -{ - if (apply_limit) - m_theta = clamp(0.0f, GIMBALL_LOCK_THETA_MAX, theta); - else + Vec3d new_target = validate_target(target); + Vec3d new_displacement = new_target - m_target; + if (!new_displacement.isApprox(Vec3d::Zero())) { - m_theta = fmod(theta, 360.0f); - if (m_theta < 0.0f) - m_theta += 360.0f; + m_target = new_target; + m_view_matrix.translate(-new_displacement); } } -void Camera::set_zoom(double zoom, const BoundingBoxf3& max_box, int canvas_w, int canvas_h) +void Camera::update_zoom(double delta_zoom) { - zoom = std::max(std::min(zoom, 4.0), -4.0) / 10.0; - zoom = m_zoom / (1.0 - zoom); + set_zoom(m_zoom / (1.0 - std::max(std::min(delta_zoom, 4.0), -4.0) * 0.1)); +} +void Camera::set_zoom(double zoom) +{ // Don't allow to zoom too far outside the scene. - double zoom_min = calc_zoom_to_bounding_box_factor(max_box, canvas_w, canvas_h); + double zoom_min = min_zoom(); if (zoom_min > 0.0) - zoom = std::max(zoom, zoom_min * 0.7); + zoom = std::max(zoom, zoom_min); // Don't allow to zoom too close to the scene. - zoom = std::min(zoom, 100.0); - - m_zoom = zoom; + m_zoom = std::min(zoom, max_zoom()); } -bool Camera::select_view(const std::string& direction) +void Camera::select_view(const std::string& direction) { - const float* dir_vec = nullptr; - if (direction == "iso") - dir_vec = VIEW_DEFAULT; + set_default_orientation(); else if (direction == "left") - dir_vec = VIEW_LEFT; + look_at(m_target - m_distance * Vec3d::UnitX(), m_target, Vec3d::UnitZ()); else if (direction == "right") - dir_vec = VIEW_RIGHT; + look_at(m_target + m_distance * Vec3d::UnitX(), m_target, Vec3d::UnitZ()); else if (direction == "top") - dir_vec = VIEW_TOP; + look_at(m_target + m_distance * Vec3d::UnitZ(), m_target, Vec3d::UnitY()); else if (direction == "bottom") - dir_vec = VIEW_BOTTOM; + look_at(m_target - m_distance * Vec3d::UnitZ(), m_target, -Vec3d::UnitY()); else if (direction == "front") - dir_vec = VIEW_FRONT; + look_at(m_target - m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ()); else if (direction == "rear") - dir_vec = VIEW_REAR; - - if (dir_vec != nullptr) - { - phi = dir_vec[0]; - set_theta(dir_vec[1], false); - return true; - } - else - return false; + look_at(m_target + m_distance * Vec3d::UnitY(), m_target, Vec3d::UnitZ()); } double Camera::get_fov() const @@ -174,80 +137,52 @@ void Camera::apply_viewport(int x, int y, unsigned int w, unsigned int h) const void Camera::apply_view_matrix() const { - double theta_rad = Geometry::deg2rad(-(double)m_theta); - double phi_rad = Geometry::deg2rad((double)phi); - double sin_theta = ::sin(theta_rad); - Vec3d camera_pos = m_target + m_distance * Vec3d(sin_theta * ::sin(phi_rad), sin_theta * ::cos(phi_rad), ::cos(theta_rad)); - glsafe(::glMatrixMode(GL_MODELVIEW)); glsafe(::glLoadIdentity()); - - glsafe(::glRotatef(-m_theta, 1.0f, 0.0f, 0.0f)); // pitch - glsafe(::glRotatef(phi, 0.0f, 0.0f, 1.0f)); // yaw - - glsafe(::glTranslated(-camera_pos(0), -camera_pos(1), -camera_pos(2))); - - glsafe(::glGetDoublev(GL_MODELVIEW_MATRIX, m_view_matrix.data())); + glsafe(::glMultMatrixd(m_view_matrix.data())); } -void Camera::apply_projection(const BoundingBoxf3& box) const +void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double far_z) const { - set_distance(DefaultDistance); - double w = 0.0; double h = 0.0; - while (true) + double old_distance = m_distance; + m_frustrum_zs = calc_tight_frustrum_zs_around(box); + if (m_distance != old_distance) + // the camera has been moved re-apply view matrix + apply_view_matrix(); + + if (near_z > 0.0) + m_frustrum_zs.first = std::max(std::min(m_frustrum_zs.first, near_z), FrustrumMinNearZ); + + if (far_z > 0.0) + m_frustrum_zs.second = std::max(m_frustrum_zs.second, far_z); + + w = 0.5 * (double)m_viewport[2]; + h = 0.5 * (double)m_viewport[3]; + + double inv_zoom = get_inv_zoom(); + w *= inv_zoom; + h *= inv_zoom; + + switch (m_type) { - m_frustrum_zs = calc_tight_frustrum_zs_around(box); - - w = 0.5 * (double)m_viewport[2]; - h = 0.5 * (double)m_viewport[3]; - - if (m_zoom != 0.0) - { - double inv_zoom = 1.0 / m_zoom; - w *= inv_zoom; - h *= inv_zoom; - } - - switch (m_type) - { - default: - case Ortho: - { - m_gui_scale = 1.0; - break; - } - case Perspective: - { - // scale near plane to keep w and h constant on the plane at z = m_distance - double scale = m_frustrum_zs.first / m_distance; - w *= scale; - h *= scale; - m_gui_scale = scale; - break; - } - } - - if (m_type == Perspective) - { - double fov_deg = Geometry::rad2deg(2.0 * std::atan(h / m_frustrum_zs.first)); - - // adjust camera distance to keep fov in a limited range - if (fov_deg > MaxFovDeg) - { - double delta_z = h / ::tan(0.5 * Geometry::deg2rad(MaxFovDeg)) - m_frustrum_zs.first; - if (delta_z > 0.001) - set_distance(m_distance + delta_z); - else - break; - } - else - break; - } - else - break; + default: + case Ortho: + { + m_gui_scale = 1.0; + break; + } + case Perspective: + { + // scale near plane to keep w and h constant on the plane at z = m_distance + double scale = m_frustrum_zs.first / m_distance; + w *= scale; + h *= scale; + m_gui_scale = scale; + break; + } } glsafe(::glMatrixMode(GL_PROJECTION)); @@ -272,51 +207,46 @@ void Camera::apply_projection(const BoundingBoxf3& box) const glsafe(::glMatrixMode(GL_MODELVIEW)); } -#if ENABLE_THUMBNAIL_GENERATOR -void Camera::zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h, double margin_factor) -#else -void Camera::zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h) -#endif // ENABLE_THUMBNAIL_GENERATOR +void Camera::zoom_to_box(const BoundingBoxf3& box, double margin_factor) { // 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, canvas_w, canvas_h, margin_factor); -#else - double zoom = calc_zoom_to_bounding_box_factor(box, canvas_w, canvas_h); -#endif // ENABLE_THUMBNAIL_GENERATOR + double zoom = calc_zoom_to_bounding_box_factor(box, margin_factor); if (zoom > 0.0) { m_zoom = zoom; // center view around box center - m_target = box.center(); + set_target(box.center()); } } -#if ENABLE_THUMBNAIL_GENERATOR -void Camera::zoom_to_volumes(const GLVolumePtrs& volumes, int canvas_w, int canvas_h, double margin_factor) +void Camera::zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor) { Vec3d center; - double zoom = calc_zoom_to_volumes_factor(volumes, canvas_w, canvas_h, center, margin_factor); + double zoom = calc_zoom_to_volumes_factor(volumes, center, margin_factor); if (zoom > 0.0) { m_zoom = zoom; // center view around the calculated center - m_target = center; + set_target(center); } } -#endif // ENABLE_THUMBNAIL_GENERATOR #if ENABLE_CAMERA_STATISTICS void Camera::debug_render() const { ImGuiWrapper& imgui = *wxGetApp().imgui(); - imgui.set_next_window_bg_alpha(0.5f); imgui.begin(std::string("Camera statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); std::string type = get_type_as_string(); + if (wxGetApp().plater()->get_mouse3d_controller().connected() || (wxGetApp().app_config->get("use_free_camera") == "1")) + type += "/free"; + else + type += "/constrained"; + Vec3f position = get_position().cast(); Vec3f target = m_target.cast(); float distance = (float)get_distance(); + float zenit = (float)m_zenit; Vec3f forward = get_dir_forward().cast(); Vec3f right = get_dir_right().cast(); Vec3f up = get_dir_up().cast(); @@ -325,14 +255,17 @@ void Camera::debug_render() const float deltaZ = farZ - nearZ; float zoom = (float)m_zoom; float fov = (float)get_fov(); + std::arrayviewport = get_viewport(); float gui_scale = (float)get_gui_scale(); - ImGui::InputText("Type", const_cast(type.data()), type.length(), ImGuiInputTextFlags_ReadOnly); + ImGui::InputText("Type", type.data(), type.length(), ImGuiInputTextFlags_ReadOnly); ImGui::Separator(); ImGui::InputFloat3("Position", position.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::InputFloat3("Target", target.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::InputFloat("Distance", &distance, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::Separator(); + ImGui::InputFloat("Zenit", &zenit, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly); + ImGui::Separator(); ImGui::InputFloat3("Forward", forward.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::InputFloat3("Right", right.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::InputFloat3("Up", up.data(), "%.6f", ImGuiInputTextFlags_ReadOnly); @@ -344,67 +277,95 @@ void Camera::debug_render() const ImGui::InputFloat("Zoom", &zoom, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::InputFloat("Fov", &fov, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly); ImGui::Separator(); + ImGui::InputInt4("Viewport", viewport.data(), ImGuiInputTextFlags_ReadOnly); + ImGui::Separator(); ImGui::InputFloat("GUI scale", &gui_scale, 0.0f, 0.0f, "%.6f", ImGuiInputTextFlags_ReadOnly); imgui.end(); } #endif // ENABLE_CAMERA_STATISTICS +void Camera::rotate_on_sphere(double delta_azimut_rad, double delta_zenit_rad, bool apply_limits) +{ + m_zenit += Geometry::rad2deg(delta_zenit_rad); + if (apply_limits) { + if (m_zenit > 90.0f) { + delta_zenit_rad -= Geometry::deg2rad(m_zenit - 90.0f); + m_zenit = 90.0f; + } + else if (m_zenit < -90.0f) { + delta_zenit_rad -= Geometry::deg2rad(m_zenit + 90.0f); + m_zenit = -90.0f; + } + } + + Vec3d translation = m_view_matrix.translation() + m_view_rotation * m_target; + auto rot_z = Eigen::AngleAxisd(delta_azimut_rad, Vec3d::UnitZ()); + m_view_rotation *= rot_z * Eigen::AngleAxisd(delta_zenit_rad, rot_z.inverse() * get_dir_right()); + m_view_rotation.normalize(); + m_view_matrix.fromPositionOrientationScale(m_view_rotation * (- m_target) + translation, m_view_rotation, Vec3d(1., 1., 1.)); +} + +// Virtual trackball, rotate around an axis, where the eucledian norm of the axis gives the rotation angle in radians. +void Camera::rotate_local_around_target(const Vec3d& rotation_rad) +{ + double angle = rotation_rad.norm(); + if (std::abs(angle) > EPSILON) { + Vec3d translation = m_view_matrix.translation() + m_view_rotation * m_target; + Vec3d axis = m_view_rotation.conjugate() * rotation_rad.normalized(); + m_view_rotation *= Eigen::Quaterniond(Eigen::AngleAxisd(angle, axis)); + m_view_rotation.normalize(); + m_view_matrix.fromPositionOrientationScale(m_view_rotation * (-m_target) + translation, m_view_rotation, Vec3d(1., 1., 1.)); + update_zenit(); + } +} + +double Camera::min_zoom() const +{ + return 0.7 * calc_zoom_to_bounding_box_factor(m_scene_box); +} + std::pair Camera::calc_tight_frustrum_zs_around(const BoundingBoxf3& box) const { std::pair ret; + auto& [near_z, far_z] = ret; - while (true) + // box in eye space + BoundingBoxf3 eye_box = box.transformed(m_view_matrix); + near_z = -eye_box.max(2); + far_z = -eye_box.min(2); + + // apply margin + near_z -= FrustrumZMargin; + far_z += FrustrumZMargin; + + // ensure min size + if (far_z - near_z < FrustrumMinZRange) { - ret = std::make_pair(DBL_MAX, -DBL_MAX); + double mid_z = 0.5 * (near_z + far_z); + double half_size = 0.5 * FrustrumMinZRange; + near_z = mid_z - half_size; + far_z = mid_z + half_size; + } - // box vertices in world space - std::vector vertices; - vertices.reserve(8); - vertices.push_back(box.min); - vertices.emplace_back(box.max(0), box.min(1), box.min(2)); - vertices.emplace_back(box.max(0), box.max(1), box.min(2)); - vertices.emplace_back(box.min(0), box.max(1), box.min(2)); - vertices.emplace_back(box.min(0), box.min(1), box.max(2)); - vertices.emplace_back(box.max(0), box.min(1), box.max(2)); - vertices.push_back(box.max); - vertices.emplace_back(box.min(0), box.max(1), box.max(2)); - - // set the Z range in eye coordinates (negative Zs are in front of the camera) - for (const Vec3d& v : vertices) - { - double z = -(m_view_matrix * v)(2); - ret.first = std::min(ret.first, z); - ret.second = std::max(ret.second, z); - } - - // apply margin - ret.first -= FrustrumZMargin; - ret.second += FrustrumZMargin; - - // ensure min size - if (ret.second - ret.first < FrustrumMinZRange) - { - double mid_z = 0.5 * (ret.first + ret.second); - double half_size = 0.5 * FrustrumMinZRange; - ret.first = mid_z - half_size; - ret.second = mid_z + half_size; - } - - if (ret.first >= FrustrumMinNearZ) - break; - - // ensure min Near Z - set_distance(m_distance + FrustrumMinNearZ - ret.first); + if (near_z < FrustrumMinNearZ) + { + float delta = FrustrumMinNearZ - near_z; + set_distance(m_distance + delta); + near_z += delta; + far_z += delta; + } + else if ((near_z > 2.0 * FrustrumMinNearZ) && (m_distance > DefaultDistance)) + { + float delta = m_distance - DefaultDistance; + set_distance(DefaultDistance); + near_z -= delta; + far_z -= delta; } return ret; } -#if ENABLE_THUMBNAIL_GENERATOR -double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int canvas_w, int canvas_h, 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 Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, double margin_factor) const { double max_bb_size = box.max_size(); if (max_bb_size == 0.0) @@ -413,9 +374,6 @@ double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int ca // project the box vertices on a plane perpendicular to the camera forward axis // then calculates the vertices coordinate on this plane along the camera xy axes - // ensure that the view matrix is updated - apply_view_matrix(); - Vec3d right = get_dir_right(); Vec3d up = get_dir_up(); Vec3d forward = get_dir_forward(); @@ -434,13 +392,10 @@ double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int ca vertices.push_back(box.max); vertices.emplace_back(box.min(0), box.max(1), box.max(2)); - double max_x = 0.0; - double max_y = 0.0; - -#if !ENABLE_THUMBNAIL_GENERATOR - // margin factor to give some empty space around the box - double margin_factor = 1.25; -#endif // !ENABLE_THUMBNAIL_GENERATOR + double min_x = DBL_MAX; + double min_y = DBL_MAX; + double max_x = -DBL_MAX; + double max_y = -DBL_MAX; for (const Vec3d& v : vertices) { @@ -452,21 +407,24 @@ double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int ca double x_on_plane = proj_on_plane.dot(right); double y_on_plane = proj_on_plane.dot(up); - max_x = std::max(max_x, std::abs(x_on_plane)); - max_y = std::max(max_y, std::abs(y_on_plane)); + min_x = std::min(min_x, x_on_plane); + min_y = std::min(min_y, y_on_plane); + max_x = std::max(max_x, x_on_plane); + max_y = std::max(max_y, y_on_plane); } - if ((max_x == 0.0) || (max_y == 0.0)) + double dx = max_x - min_x; + double dy = max_y - min_y; + if ((dx <= 0.0) || (dy <= 0.0)) return -1.0f; - max_x *= margin_factor; - max_y *= margin_factor; + dx *= margin_factor; + dy *= margin_factor; - return std::min((double)canvas_w / (2.0 * max_x), (double)canvas_h / (2.0 * max_y)); + 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, int canvas_w, int canvas_h, Vec3d& center, double margin_factor) const +double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& center, double margin_factor) const { if (volumes.empty()) return -1.0; @@ -474,9 +432,6 @@ double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, int canv // project the volumes vertices on a plane perpendicular to the camera forward axis // then calculates the vertices coordinate on this plane along the camera xy axes - // ensure that the view matrix is updated - apply_view_matrix(); - Vec3d right = get_dir_right(); Vec3d up = get_dir_up(); Vec3d forward = get_dir_forward(); @@ -524,17 +479,87 @@ double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, int canv double dx = margin_factor * (max_x - min_x); double dy = margin_factor * (max_y - min_y); - if ((dx == 0.0) || (dy == 0.0)) + if ((dx <= 0.0) || (dy <= 0.0)) return -1.0f; - return std::min((double)canvas_w / dx, (double)canvas_h / dy); + return std::min((double)m_viewport[2] / dx, (double)m_viewport[3] / dy); } -#endif // ENABLE_THUMBNAIL_GENERATOR void Camera::set_distance(double distance) const { - m_distance = distance; - apply_view_matrix(); + if (m_distance != distance) + { + m_view_matrix.translate((distance - m_distance) * get_dir_forward()); + m_distance = distance; + } +} + +void Camera::look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up) +{ + Vec3d unit_z = (position - target).normalized(); + Vec3d unit_x = up.cross(unit_z).normalized(); + Vec3d unit_y = unit_z.cross(unit_x).normalized(); + + m_target = target; + m_distance = (position - target).norm(); + Vec3d new_position = m_target + m_distance * unit_z; + + m_view_matrix(0, 0) = unit_x(0); + m_view_matrix(0, 1) = unit_x(1); + m_view_matrix(0, 2) = unit_x(2); + m_view_matrix(0, 3) = -unit_x.dot(new_position); + + m_view_matrix(1, 0) = unit_y(0); + m_view_matrix(1, 1) = unit_y(1); + m_view_matrix(1, 2) = unit_y(2); + m_view_matrix(1, 3) = -unit_y.dot(new_position); + + m_view_matrix(2, 0) = unit_z(0); + m_view_matrix(2, 1) = unit_z(1); + m_view_matrix(2, 2) = unit_z(2); + m_view_matrix(2, 3) = -unit_z.dot(new_position); + + m_view_matrix(3, 0) = 0.0; + m_view_matrix(3, 1) = 0.0; + m_view_matrix(3, 2) = 0.0; + m_view_matrix(3, 3) = 1.0; + + // Initialize the rotation quaternion from the rotation submatrix of of m_view_matrix. + m_view_rotation = Eigen::Quaterniond(m_view_matrix.matrix().template block<3, 3>(0, 0)); + m_view_rotation.normalize(); + + update_zenit(); +} + +void Camera::set_default_orientation() +{ + m_zenit = 45.0f; + double theta_rad = Geometry::deg2rad(-(double)m_zenit); + double phi_rad = Geometry::deg2rad(45.0); + double sin_theta = ::sin(theta_rad); + Vec3d camera_pos = m_target + m_distance * Vec3d(sin_theta * ::sin(phi_rad), sin_theta * ::cos(phi_rad), ::cos(theta_rad)); + m_view_rotation = Eigen::AngleAxisd(theta_rad, Vec3d::UnitX()) * Eigen::AngleAxisd(phi_rad, Vec3d::UnitZ()); + m_view_rotation.normalize(); + m_view_matrix.fromPositionOrientationScale(m_view_rotation * (- camera_pos), m_view_rotation, Vec3d(1., 1., 1.)); +} + +Vec3d Camera::validate_target(const Vec3d& target) const +{ + BoundingBoxf3 test_box = m_scene_box; + test_box.translate(-m_scene_box.center()); + // We may let this factor be customizable + static const double ScaleFactor = 1.5; + test_box.scale(ScaleFactor); + test_box.translate(m_scene_box.center()); + + return Vec3d(std::clamp(target(0), test_box.min(0), test_box.max(0)), + std::clamp(target(1), test_box.min(1), test_box.max(1)), + std::clamp(target(2), test_box.min(2), test_box.max(2))); +} + +void Camera::update_zenit() +{ + m_zenit = Geometry::rad2deg(0.5 * M_PI - std::acos(std::clamp(-get_dir_forward().dot(Vec3d::UnitZ()), -1.0, 1.0))); } } // GUI diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp index cb634138f2..91f4661b46 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 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; @@ -30,22 +26,23 @@ struct Camera Num_types }; - float phi; bool requires_zoom_to_bed; - bool inverted_phi; private: - EType m_type; - Vec3d m_target; - float m_theta; - double m_zoom; + EType m_type{ Perspective }; + bool m_update_config_on_type_change_enabled{ false }; + Vec3d m_target{ Vec3d::Zero() }; + float m_zenit{ 45.0f }; + double m_zoom{ 1.0 }; // Distance between camera position and camera target measured along the camera Z axis - mutable double m_distance; - mutable double m_gui_scale; + mutable double m_distance{ DefaultDistance }; + mutable double m_gui_scale{ 1.0 }; mutable std::array m_viewport; - mutable Transform3d m_view_matrix; - mutable Transform3d m_projection_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{ 1.0, 0.0, 0.0, 0.0 }; + mutable Transform3d m_projection_matrix{ Transform3d::Identity() }; mutable std::pair m_frustrum_zs; BoundingBoxf3 m_scene_box; @@ -60,23 +57,23 @@ 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); - double get_distance() const { return m_distance; } + double get_distance() const { return (get_position() - m_target).norm(); } double get_gui_scale() const { return m_gui_scale; } - float get_theta() const { return m_theta; } - void set_theta(float theta, bool apply_limit); - double get_zoom() const { return m_zoom; } - void set_zoom(double zoom, const BoundingBoxf3& max_box, int canvas_w, int canvas_h); - void set_zoom(double zoom) { m_zoom = zoom; } + double get_inv_zoom() const { assert(m_zoom != 0.0); return 1.0 / m_zoom; } + void update_zoom(double delta_zoom); + void set_zoom(double zoom); const BoundingBoxf3& get_scene_box() const { return m_scene_box; } void set_scene_box(const BoundingBoxf3& box) { m_scene_box = box; } - bool select_view(const std::string& direction); + void select_view(const std::string& direction); const std::array& get_viewport() const { return m_viewport; } const Transform3d& get_view_matrix() const { return m_view_matrix; } @@ -90,35 +87,60 @@ public: double get_near_z() const { return m_frustrum_zs.first; } double get_far_z() const { return m_frustrum_zs.second; } + const std::pair& get_z_range() const { return m_frustrum_zs; } double get_fov() const; void apply_viewport(int x, int y, unsigned int w, unsigned int h) const; void apply_view_matrix() const; - void apply_projection(const BoundingBoxf3& box) const; + // Calculates and applies the projection matrix tighting the frustrum z range around the given box. + // 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, int canvas_w, int canvas_h, double margin_factor = DefaultZoomToBoxMarginFactor); - void zoom_to_volumes(const GLVolumePtrs& volumes, int canvas_w, int canvas_h, double margin_factor = DefaultZoomToVolumesMarginFactor); -#else - void zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h); -#endif // 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); #if ENABLE_CAMERA_STATISTICS void debug_render() const; #endif // ENABLE_CAMERA_STATISTICS + // translate the camera in world space + void translate_world(const Vec3d& displacement) { this->set_target(m_target + displacement); } + + // rotate the camera on a sphere having center == m_target and radius == m_distance + // using the given variations of spherical coordinates + // if apply_limits == true the camera stops rotating when its forward vector is parallel to the world Z axis + void rotate_on_sphere(double delta_azimut_rad, double delta_zenit_rad, bool apply_limits); + + // rotate the camera around three axes parallel to the camera local axes and passing through m_target + void rotate_local_around_target(const Vec3d& rotation_rad); + + // returns true if the camera z axis (forward) is pointing in the negative direction of the world z axis + bool is_looking_downward() const { return get_dir_forward().dot(Vec3d::UnitZ()) < 0.0; } + + // forces camera right vector to be parallel to XY plane + void recover_from_free_camera() + { + if (std::abs(get_dir_right()(2)) > EPSILON) + look_at(get_position(), m_target, Vec3d::UnitZ()); + } + + void look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up); + + 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 calc_tight_frustrum_zs_around(const BoundingBoxf3& box) const; -#if ENABLE_THUMBNAIL_GENERATOR - double calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int canvas_w, int canvas_h, double margin_factor = DefaultZoomToBoxMarginFactor) const; - double calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, int canvas_w, int canvas_h, 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 + 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; void set_distance(double distance) const; + + void set_default_orientation(); + Vec3d validate_target(const Vec3d& target) const; + void update_zenit(); }; } // GUI diff --git a/src/slic3r/GUI/ConfigExceptions.hpp b/src/slic3r/GUI/ConfigExceptions.hpp index 9038d3445e..181442d4e3 100644 --- a/src/slic3r/GUI/ConfigExceptions.hpp +++ b/src/slic3r/GUI/ConfigExceptions.hpp @@ -1,15 +1,15 @@ #include 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 f76f752f0e..845dc1c0bd 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -2,7 +2,8 @@ #include "ConfigManipulation.hpp" #include "I18N.hpp" #include "GUI_App.hpp" -#include "PresetBundle.hpp" +#include "libslic3r/Model.hpp" +#include "libslic3r/PresetBundle.hpp" #include @@ -27,9 +28,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) @@ -70,14 +69,21 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con double fill_density = config->option("fill_density")->value; if (config->opt_bool("spiral_vase") && - !(config->opt_int("perimeters") == 1 && config->opt_int("top_solid_layers") == 0 && - fill_density == 0)) { + ! (config->opt_int("perimeters") == 1 && + config->opt_int("top_solid_layers") == 0 && + fill_density == 0 && + ! config->opt_bool("support_material") && + config->opt_int("support_material_enforce_layers") == 0 && + config->opt_bool("ensure_vertical_shell_thickness") && + ! config->opt_bool("thin_walls"))) + { wxString msg_text = _(L("The Spiral Vase mode requires:\n" "- one perimeter\n" "- no top solid layers\n" "- 0% fill density\n" "- no support material\n" - "- no ensure_vertical_shell_thickness")); + "- Ensure vertical shell thickness enabled\n" + "- Detect thin walls disabled")); if (is_global_config) msg_text += "\n\n" + _(L("Shall I adjust those settings in order to enable Spiral Vase?")); wxMessageDialog dialog(nullptr, msg_text, _(L("Spiral Vase")), @@ -90,7 +96,8 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con new_conf.set_key_value("fill_density", new ConfigOptionPercent(0)); new_conf.set_key_value("support_material", new ConfigOptionBool(false)); new_conf.set_key_value("support_material_enforce_layers", new ConfigOptionInt(0)); - new_conf.set_key_value("ensure_vertical_shell_thickness", new ConfigOptionBool(false)); + new_conf.set_key_value("ensure_vertical_shell_thickness", new ConfigOptionBool(true)); + new_conf.set_key_value("thin_walls", new ConfigOptionBool(false)); fill_density = 0; } else { @@ -233,30 +240,36 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config) "solid_infill_every_layers", "solid_infill_below_area", "infill_extruder" }) toggle_field(el, have_infill); - bool have_solid_infill = config->opt_int("top_solid_layers") > 0 || config->opt_int("bottom_solid_layers") > 0; + bool has_spiral_vase = config->opt_bool("spiral_vase"); + bool has_top_solid_infill = config->opt_int("top_solid_layers") > 0; + bool has_bottom_solid_infill = config->opt_int("bottom_solid_layers") > 0; + bool has_solid_infill = has_top_solid_infill || has_bottom_solid_infill; // solid_infill_extruder uses the same logic as in Print::extruders() for (auto el : { "top_fill_pattern", "bottom_fill_pattern", "infill_first", "solid_infill_extruder", "solid_infill_extrusion_width", "solid_infill_speed" }) - toggle_field(el, have_solid_infill); + toggle_field(el, has_solid_infill); for (auto el : { "fill_angle", "bridge_angle", "infill_extrusion_width", "infill_speed", "bridge_speed" }) - toggle_field(el, have_infill || have_solid_infill); + toggle_field(el, have_infill || has_solid_infill); + + toggle_field("top_solid_min_thickness", ! has_spiral_vase && has_top_solid_infill); + toggle_field("bottom_solid_min_thickness", ! has_spiral_vase && has_bottom_solid_infill); // Gap fill is newly allowed in between perimeter lines even for empty infill (see GH #1476). toggle_field("gap_fill_speed", have_perimeters); - bool have_top_solid_infill = config->opt_int("top_solid_layers") > 0; for (auto el : { "top_infill_extrusion_width", "top_solid_infill_speed" }) - toggle_field(el, have_top_solid_infill); + toggle_field(el, has_top_solid_infill); bool have_default_acceleration = config->opt_float("default_acceleration") > 0; for (auto el : { "perimeter_acceleration", "infill_acceleration", "bridge_acceleration", "first_layer_acceleration" }) toggle_field(el, have_default_acceleration); - bool have_skirt = config->opt_int("skirts") > 0 || config->opt_float("min_skirt_length") > 0; - for (auto el : { "skirt_distance", "skirt_height" }) + bool have_skirt = config->opt_int("skirts") > 0; + toggle_field("skirt_height", have_skirt && !config->opt_bool("draft_shield")); + for (auto el : { "skirt_distance", "draft_shield", "min_skirt_length" }) toggle_field(el, have_skirt); bool have_brim = config->opt_float("brim_width") > 0; @@ -284,6 +297,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); @@ -292,7 +309,8 @@ 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); } @@ -334,6 +352,8 @@ 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); toggle_field("support_base_diameter", supports_en); diff --git a/src/slic3r/GUI/ConfigManipulation.hpp b/src/slic3r/GUI/ConfigManipulation.hpp index 7344f758be..1e91dbec2b 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 namespace Slic3r { + +class ModelConfig; + namespace GUI { class ConfigManipulation @@ -21,25 +23,25 @@ class ConfigManipulation // function to loading of changed configuration std::function load_config = nullptr; - std::function get_field = nullptr; + std::function cb_toggle_field = nullptr; // callback to propagation of changed value, if needed std::function cb_value_change = nullptr; - DynamicPrintConfig* local_config = nullptr; + ModelConfig* local_config = nullptr; public: ConfigManipulation(std::function load_config, - std::function get_field, + std::function cb_toggle_field, std::function 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 d48dfccc98..fb171a1771 100644 --- a/src/slic3r/GUI/ConfigSnapshotDialog.cpp +++ b/src/slic3r/GUI/ConfigSnapshotDialog.cpp @@ -48,9 +48,17 @@ static wxString generate_html_row(const Config::Snapshot &snapshot, bool row_eve text += "

"; // End of row header. text += _(L("PrusaSlicer version")) + ": " + snapshot.slic3r_version_captured.to_string() + "
"; - text += _(L("print")) + ": " + snapshot.print + "
"; - text += _(L("filaments")) + ": " + snapshot.filaments.front() + "
"; - text += _(L("printer")) + ": " + snapshot.printer + "
"; + bool has_fff = ! snapshot.print.empty() || ! snapshot.filaments.empty(); + bool has_sla = ! snapshot.sla_print.empty() || ! snapshot.sla_material.empty(); + if (has_fff || ! has_sla) { + text += _(L("print")) + ": " + snapshot.print + "
"; + text += _(L("filaments")) + ": " + snapshot.filaments.front() + "
"; + } + if (has_sla) { + text += _(L("SLA print")) + ": " + snapshot.sla_print + "
"; + text += _(L("SLA material")) + ": " + snapshot.sla_material + "
"; + } + text += _(L("printer")) + ": " + (snapshot.physical_printer.empty() ? snapshot.printer : snapshot.physical_printer) + "
"; bool compatible = true; for (const Config::Snapshot::VendorConfig &vc : snapshot.vendor_configs) { @@ -72,7 +80,7 @@ static wxString generate_html_row(const Config::Snapshot &snapshot, bool row_eve } if (! compatible) { - text += "

" + wxString::Format(_(L("Incompatible with this %s")), SLIC3R_APP_NAME) + "

"; + text += "

" + from_u8((boost::format(_utf8(L("Incompatible with this %s"))) % SLIC3R_APP_NAME).str()) + "

"; } else if (! snapshot_active) text += "

" + _(L("Activate")) + "

"; @@ -101,7 +109,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((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 +122,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(0.8f*fs); @@ -140,7 +148,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(0.8f*fs); const int fs2 = static_cast(1.1f*fs); @@ -162,7 +170,7 @@ void ConfigSnapshotDialog::on_dpi_changed(const wxRect &suggested_rect) void ConfigSnapshotDialog::onLinkClicked(wxHtmlLinkEvent &event) { - m_snapshot_to_activate = event.GetLinkInfo().GetHref(); + m_snapshot_to_activate = event.GetLinkInfo().GetHref().ToUTF8(); this->EndModal(wxID_CLOSE); } diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 393d973b7e..6b509a86db 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -26,8 +27,11 @@ #include #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" @@ -42,16 +46,27 @@ using Config::SnapshotDB; // Configuration data structures extensions needed for the wizard -Bundle::Bundle(fs::path source_path, bool is_in_resources, bool is_prusa_bundle) - : preset_bundle(new PresetBundle) - , vendor_profile(nullptr) - , is_in_resources(is_in_resources) - , is_prusa_bundle(is_prusa_bundle) +bool Bundle::load(fs::path source_path, bool ais_in_resources, bool ais_prusa_bundle) { - preset_bundle->load_configbundle(source_path.string(), PresetBundle::LOAD_CFGBNDLE_SYSTEM); + this->preset_bundle = std::make_unique(); + this->is_in_resources = ais_in_resources; + this->is_prusa_bundle = ais_prusa_bundle; + + std::string path_string = source_path.string(); + size_t presets_loaded = preset_bundle->load_configbundle(path_string, PresetBundle::LOAD_CFGBNDLE_SYSTEM); auto first_vendor = preset_bundle->vendors.begin(); - wxCHECK_RET(first_vendor != preset_bundle->vendors.end(), "Failed to load preset bundle"); - vendor_profile = &first_vendor->second; + if (first_vendor == preset_bundle->vendors.end()) { + BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No vendor information defined, cannot install.") % path_string; + return false; + } + if (presets_loaded == 0) { + BOOST_LOG_TRIVIAL(error) << boost::format("Vendor bundle: `%1%`: No profile loaded.") % path_string; + return false; + } + + BOOST_LOG_TRIVIAL(trace) << boost::format("Vendor bundle: `%1%`: %2% profiles loaded.") % path_string % presets_loaded; + this->vendor_profile = &first_vendor->second; + return true; } Bundle::Bundle(Bundle &&other) @@ -76,8 +91,11 @@ BundleMap BundleMap::load() prusa_bundle_path = (rsrc_vendor_dir / PresetBundle::PRUSA_BUNDLE).replace_extension(".ini"); prusa_bundle_rsrc = true; } - Bundle prusa_bundle(std::move(prusa_bundle_path), prusa_bundle_rsrc, true); - res.emplace(PresetBundle::PRUSA_BUNDLE, std::move(prusa_bundle)); + { + Bundle prusa_bundle; + if (prusa_bundle.load(std::move(prusa_bundle_path), prusa_bundle_rsrc, true)) + res.emplace(PresetBundle::PRUSA_BUNDLE, std::move(prusa_bundle)); + } // Load the other bundles in the datadir/vendor directory // and then additionally from resources/profiles. @@ -90,8 +108,9 @@ BundleMap BundleMap::load() // Don't load this bundle if we've already loaded it. if (res.find(id) != res.end()) { continue; } - Bundle bundle(dir_entry.path(), is_in_resources); - res.emplace(std::move(id), std::move(bundle)); + Bundle bundle; + if (bundle.load(dir_entry.path(), is_in_resources)) + res.emplace(std::move(id), std::move(bundle)); } } @@ -105,7 +124,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; @@ -173,10 +192,12 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt wxBitmap bitmap; int bitmap_width = 0; - const wxString bitmap_file = GUI::from_u8(Slic3r::var((boost::format("printers/%1%_%2%.png") % vendor.id % model.id).str())); + int bitmap_height = 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(); + bitmap_height = bitmap.GetHeight(); } else { BOOST_LOG_TRIVIAL(warning) << boost::format("Can't find bitmap file `%1%` for vendor `%2%`, printer `%3%`, using placeholder icon instead") % bitmap_file @@ -187,6 +208,7 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt if (wxFileExists(placeholder_file)) { bitmap.LoadFile(placeholder_file, wxBITMAP_TYPE_PNG); bitmap_width = bitmap.GetWidth(); + bitmap_height = bitmap.GetHeight(); } } @@ -215,7 +237,7 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt const auto &variant = model.variants[i]; const auto label = model.technology == ptFFF - ? wxString::Format("%s %s %s", variant.name, _(L("mm")), _(L("nozzle"))) + ? from_u8((boost::format("%1% %2% %3%") % variant.name % _utf8(L("mm")) % _utf8(L("nozzle"))).str()) : from_u8(model.name); if (i == 1) { @@ -252,25 +274,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]); } } } @@ -350,6 +369,21 @@ bool PrinterPicker::any_selected() const return false; } +std::set PrinterPicker::get_selected_models() const +{ + std::set ret_set; + + for (const auto& cb : cboxes) + if (cb->GetValue()) + ret_set.emplace(cb->model); + + for (const auto& cb : cboxes_alt) + if (cb->GetValue()) + ret_set.emplace(cb->model); + + return ret_set; +} + void PrinterPicker::on_checkbox(const Checkbox *cbox, bool checked) { PrinterPickerEvent evt(EVT_PRINTER_PICK, GetId(), vendor_id, cbox->model, cbox->variant, checked); @@ -374,7 +408,7 @@ ConfigWizardPage::ConfigWizardPage(ConfigWizard *parent, wxString title, wxStrin sizer->AddSpacer(10); content = new wxBoxSizer(wxVERTICAL); - sizer->Add(content, 1); + sizer->Add(content, 1, wxEXPAND); SetSizer(sizer); @@ -407,20 +441,20 @@ void ConfigWizardPage::append_spacer(int space) // Wizard pages PageWelcome::PageWelcome(ConfigWizard *parent) - : ConfigWizardPage(parent, wxString::Format( + : ConfigWizardPage(parent, from_u8((boost::format( #ifdef __APPLE__ - _(L("Welcome to the %s Configuration Assistant")) + _utf8(L("Welcome to the %s Configuration Assistant")) #else - _(L("Welcome to the %s Configuration Wizard")) + _utf8(L("Welcome to the %s Configuration Wizard")) #endif - , SLIC3R_APP_NAME), _(L("Welcome"))) - , welcome_text(append_text(wxString::Format( - _(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, - ConfigWizard::name()) + ) % 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 - install from scratch (a snapshot will be taken beforehand)"))) + new wxCheckBox(this, wxID_ANY, _(L("Remove user profiles (a snapshot will be taken beforehand)"))) )) { welcome_text->Hide(); @@ -463,7 +497,7 @@ PagePrinters::PagePrinters(ConfigWizard *parent, continue; } - const auto picker_title = family.empty() ? wxString() : wxString::Format(_(L("%s Family")), family); + const auto picker_title = family.empty() ? wxString() : from_u8((boost::format(_utf8(L("%s Family"))) % family).str()); auto *picker = new PrinterPicker(this, vendor, picker_title, MAX_COLS, *appconfig, filter); picker->Bind(EVT_PRINTER_PICK, [this, appconfig](const PrinterPickerEvent &evt) { @@ -500,11 +534,25 @@ bool PagePrinters::any_selected() const return false; } +std::set PagePrinters::get_selected_models() +{ + std::set ret_set; + + for (const auto *picker : printer_pickers) + { + std::set tmp_models = picker->get_selected_models(); + ret_set.insert(tmp_models.begin(), tmp_models.end()); + } + + return ret_set; +} + void PagePrinters::set_run_reason(ConfigWizard::RunReason run_reason) { if (technology == T_FFF && (run_reason == ConfigWizard::RR_DATA_EMPTY || run_reason == ConfigWizard::RR_DATA_LEGACY) - && printer_pickers.size() > 0) { + && printer_pickers.size() > 0 + && printer_pickers[0]->vendor_id == PresetBundle::PRUSA_BUNDLE) { printer_pickers[0]->select_one(0, true); } } @@ -515,28 +563,37 @@ 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, 0, em); + 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(list_l1); - grid->Add(list_l2); - grid->Add(list_l3); + 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"))); @@ -544,108 +601,461 @@ PageMaterials::PageMaterials(ConfigWizard *parent, Materials *materials, wxStrin 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); + 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(), 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("bald"); + 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& printer_names, bool all_printers) { - wxWindowUpdateLocker freeze_guard(this); - (void)freeze_guard; - - if (sel1 != sel1_prev) { - // Refresh the second 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_l2->Clear(); - list_l2->append(_(L("(All)")), &EMPTY); - if (sel1 != wxNOT_FOUND) { - const std::string &type = list_l1->get_data(sel1); - - 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); - } - }); + 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 * are not compatible with some installed printers.")); + wxString text; + if (all_printers) { + wxString second_line = _(L("All installed printers are compatible with the selected filament.")); + text = wxString::Format( + "" + "" + "" + "" + "" + "%s

%s" + "
" + "
" + "" + "" + , 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( + "" + "" + "" + "" + "" + "%s

%s" + "" + "" + , bgr_clr_str + , text_clr_str + , first_line + , second_line); + for (int i = 0; i < printer_names.size(); ++i) + { + text += wxString::Format("", boost::nowide::widen(printer_names[i])); + if (i % 3 == 2) { + text += wxString::Format( + "" + ""); + } } - - sel1_prev = sel1; - sel2 = 0; - sel2_prev = wxNOT_FOUND; - list_l2->SetSelection(sel2); - list_l3->Clear(); + text += wxString::Format( + "" + "
%s
" + "
" + "
" + "" + "" + ); } + + 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); +} - if (sel2 != sel2_prev) { - // Refresh the third list +void PageMaterials::clear_compatible_printers_label() +{ + set_compatible_printers_html_window(std::vector(), false); +} - 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); +void PageMaterials::on_material_hovered(int sel_material) +{ - materials->filter_presets(type, vendor, [this](const Preset *p) { - const int i = list_l3->append(p->name, p); - const bool checked = wizard_p()->appconfig_new.has(materials->appconfig_section(), p->name); - list_l3->Check(i, checked); - }); +} + +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 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 matching_materials = materials->get_presets_by_alias(material_name); + if (matching_materials.empty()) + { + clear_compatible_printers_label(); + return; + } + //find matching printers + std::vector 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; + } } + } + set_compatible_printers_html_window(names, names.size() == materials->printers.size()); +} - sel2_prev = sel2; +void PageMaterials::update_lists(int sel_printer, int sel_type, int sel_vendor) +{ + wxWindowUpdateLocker freeze_guard(this); + (void)freeze_guard; + + wxArrayInt sel_printers; + int sel_printers_count = list_printer->GetSelections(sel_printers); + + 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); + } + + 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); + } + + 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 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); + } + + sel_vendor_prev = sel_vendor; + } +} + +void PageMaterials::sort_list_data(StringList* list, bool add_All_item, bool material_type_ordering) +{ +// get data from list +// sort data +// first should be +// then prusa profiles +// then the rest +// in alphabetical order + + std::vector> prusa_profiles; + std::vector> other_profiles; + for (int i = 0 ; i < list->size(); ++i) { + const std::string& data = list->get_data(i); + if (data == EMPTY) // do not sort 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::vectorenum_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 aux = other_profiles[end_of_sorted]; + other_profiles[end_of_sorted] = other_profiles[profs]; + other_profiles[profs] = aux; + } + end_of_sorted++; + break; + } + } + } + } else { + std::sort(prusa_profiles.begin(), prusa_profiles.end(), [](std::reference_wrapper a, std::reference_wrapper b) { + return a.get() < b.get(); + }); + std::sort(other_profiles.begin(), other_profiles.end(), [](std::reference_wrapper a, std::reference_wrapper 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(item.get())); + for (const auto& item : other_profiles) + list->append(item, &const_cast(item.get())); +} + +void PageMaterials::sort_list_data(PresetList* list, const std::vector& data) +{ + // sort data + // then prusa profiles + // then the rest + // in alphabetical order + std::vector prusa_profiles; + std::vector 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(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(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 Preset &preset = list_l3->get_data(i); + const bool checked = list_profile->IsChecked(i); - if (checked) { - wizard_p()->appconfig_new.set(materials->appconfig_section(), preset.name, "1"); - } else { - wizard_p()->appconfig_new.erase(materials->appconfig_section(), preset.name); - } + const std::string& alias_key = list_profile->get_data(i); + wizard_p()->update_presets_in_config(materials->appconfig_section(), alias_key, checked); } void PageMaterials::select_all(bool select) @@ -653,10 +1063,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); } } @@ -664,11 +1074,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; } @@ -678,6 +1091,7 @@ void PageMaterials::on_activate() wizard_p()->update_materials(materials->technology); reload_presets(); } + first_paint = true; } @@ -703,7 +1117,8 @@ PageCustom::PageCustom(ConfigWizard *parent) cb_custom->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &event) { tc_profile_name->Enable(custom_wanted()); - wizard_p()->on_custom_setup(); + wizard_p()->on_custom_setup(custom_wanted()); + }); append(cb_custom); @@ -748,13 +1163,28 @@ PageUpdate::PageUpdate(ConfigWizard *parent) 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"))) + , 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"))); + box_pathnames->SetValue(wxGetApp().app_config->get("export_sources_full_pathnames") == "1"); + append(box_pathnames); + 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(); }); +} + PageMode::PageMode(ConfigWizard *parent) : ConfigWizardPage(parent, _(L("View mode")), _(L("View mode"))) { 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 progressivly more sophisticated fine-tuning, " - "they are suitable for advanced and expert usiser, respectively."))); + "The other two offer progressively more sophisticated fine-tuning, " + "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"))); @@ -763,6 +1193,10 @@ PageMode::PageMode(ConfigWizard *parent) 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() @@ -773,16 +1207,25 @@ 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 { - const char *mode = "simple"; + std::string mode = ""; + if (radio_simple->GetValue()) { mode = "simple"; } if (radio_advanced->GetValue()) { mode = "advanced"; } if (radio_expert->GetValue()) { mode = "expert"; } + // If "Mode" page wasn't selected (no one radiobutton is checked), + // we shouldn't to update a view_mode value in app_config + if (mode.empty()) + return; + app_config->set("view_mode", mode); + app_config->set("use_inches", check_inch->GetValue() ? "1" : "0"); } PageVendors::PageVendors(ConfigWizard *parent) @@ -790,7 +1233,7 @@ PageVendors::PageVendors(ConfigWizard *parent) { const AppConfig &appconfig = this->wizard_p()->appconfig_new; - append_text(wxString::Format(_(L("Pick another vendor supported by %s: (FIXME: this text)")), 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); @@ -809,9 +1252,11 @@ PageVendors::PageVendors(ConfigWizard *parent) if (enabled) { cbox->SetValue(true); - auto pair = wizard_p()->pages_3rdparty.find(vendor->id); - wxCHECK_RET(pair != wizard_p()->pages_3rdparty.end(), "Internal error: 3rd party vendor printers page not created"); - pair->second->install = true; + auto pages = wizard_p()->pages_3rdparty.find(vendor->id); + wxCHECK_RET(pages != wizard_p()->pages_3rdparty.end(), "Internal error: 3rd party vendor printers page not created"); + + for (PagePrinters* page : { pages->second.first, pages->second.second }) + if (page) page->install = true; } append(cbox); @@ -945,7 +1390,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)) { @@ -1221,16 +1666,23 @@ const std::string Materials::UNKNOWN = "(Unknown)"; void Materials::push(const Preset *preset) { - presets.insert(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 @@ -1280,7 +1732,6 @@ const std::string& Materials::get_material_vendor(const Preset *preset) return opt != nullptr ? opt->value : UNKNOWN; } - // priv static const std::unordered_map> legacy_preset_map {{ @@ -1309,9 +1760,10 @@ void ConfigWizard::priv::load_pages() index->add_page(page_fff); index->add_page(page_msla); index->add_page(page_vendors); - for (const auto &pair : pages_3rdparty) { - PagePrinters *page = pair.second; - if (page->install) { index->add_page(page); } + for (const auto &pages : pages_3rdparty) { + for ( PagePrinters* page : { pages.second.first, pages.second.second }) + if (page && page->install) + index->add_page(page); } index->add_page(page_custom); @@ -1326,7 +1778,11 @@ void ConfigWizard::priv::load_pages() if (any_fff_selected) { index->add_page(page_filaments); } if (any_sla_selected) { index->add_page(page_sla_materials); } + // there should to be selected at least one printer + btn_finish->Enable(any_fff_selected || any_sla_selected || custom_printer_selected); + index->add_page(page_update); + index->add_page(page_reload_from_disk); index->add_page(page_mode); index->go_to(former_active); // Will restore the active item/page if possible @@ -1384,19 +1840,47 @@ void ConfigWizard::priv::load_vendors() pair.second.preset_bundle->load_installed_printers(appconfig_new); } - update_materials(T_ANY); - - if (app_config->has_section(AppConfig::SECTION_FILAMENTS)) { - appconfig_new.set_section(AppConfig::SECTION_FILAMENTS, app_config->get_section(AppConfig::SECTION_FILAMENTS)); - } - if (app_config->has_section(AppConfig::SECTION_MATERIALS)) { - appconfig_new.set_section(AppConfig::SECTION_MATERIALS, app_config->get_section(AppConfig::SECTION_MATERIALS)); - } + // Copy installed filaments and SLA material names from app_config to appconfig_new + // while resolving current names of profiles, which were renamed in the meantime. + for (PrinterTechnology technology : { ptFFF, ptSLA }) { + const std::string §ion_name = (technology == ptFFF) ? AppConfig::SECTION_FILAMENTS : AppConfig::SECTION_MATERIALS; + std::map section_new; + if (app_config->has_section(section_name)) { + const std::map §ion_old = app_config->get_section(section_name); + for (const std::pair &material_name_and_installed : section_old) + if (material_name_and_installed.second == "1") { + // Material is installed. Resolve it in bundles. + size_t num_found = 0; + const std::string &material_name = material_name_and_installed.first; + for (auto &bundle : bundles) { + const PresetCollection &materials = bundle.second.preset_bundle->materials(technology); + const Preset *preset = materials.find_preset(material_name); + if (preset == nullptr) { + // Not found. Maybe the material preset is there, bu it was was renamed? + const std::string *new_name = materials.get_preset_name_renamed(material_name); + if (new_name != nullptr) + preset = materials.find_preset(*new_name); + } + if (preset != nullptr) { + // Materal preset was found, mark it as installed. + section_new[preset->name] = "1"; + ++ num_found; + } + } + if (num_found == 0) + BOOST_LOG_TRIVIAL(error) << boost::format("Profile %1% was not found in installed vendor Preset Bundles.") % material_name; + else if (num_found > 1) + BOOST_LOG_TRIVIAL(error) << boost::format("Profile %1% was found in %2% vendor Preset Bundles.") % material_name % num_found; + } + } + appconfig_new.set_section(section_name, section_new); + }; } void ConfigWizard::priv::add_page(ConfigWizardPage *page) { - hscroll_sizer->Add(page, 0, wxEXPAND); + 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); } @@ -1409,10 +1893,22 @@ void ConfigWizard::priv::enable_next(bool enable) void ConfigWizard::priv::set_start_page(ConfigWizard::StartPage start_page) { switch (start_page) { - case ConfigWizard::SP_PRINTERS: index->go_to(page_fff); break; - case ConfigWizard::SP_FILAMENTS: index->go_to(page_filaments); break; - case ConfigWizard::SP_MATERIALS: index->go_to(page_sla_materials); break; - default: index->go_to(page_welcome); break; + case ConfigWizard::SP_PRINTERS: + index->go_to(page_fff); + btn_next->SetFocus(); + break; + case ConfigWizard::SP_FILAMENTS: + index->go_to(page_filaments); + btn_finish->SetFocus(); + break; + case ConfigWizard::SP_MATERIALS: + index->go_to(page_sla_materials); + btn_finish->SetFocus(); + break; + default: + index->go_to(page_welcome); + btn_next->SetFocus(); + break; } } @@ -1422,10 +1918,31 @@ void ConfigWizard::priv::create_3rdparty_pages() const VendorProfile *vendor = pair.second.vendor_profile; if (vendor->id == PresetBundle::PRUSA_BUNDLE) { continue; } - auto *page = new PagePrinters(q, vendor->name, vendor->name, *vendor, 1, T_ANY); - add_page(page); + bool is_fff_technology = false; + bool is_sla_technology = false; - pages_3rdparty.insert({vendor->id, page}); + for (auto& model: vendor->models) + { + if (!is_fff_technology && model.technology == ptFFF) + is_fff_technology = true; + if (!is_sla_technology && model.technology == ptSLA) + is_sla_technology = true; + } + + PagePrinters* pageFFF = nullptr; + PagePrinters* pageSLA = nullptr; + + if (is_fff_technology) { + 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); + add_page(pageSLA); + } + + pages_3rdparty.insert({vendor->id, {pageFFF, pageSLA}}); } } @@ -1441,68 +1958,141 @@ 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 (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) { - continue; - } + 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) { - if (filament.is_compatible_with_printer(printer)) { - filaments.push(&filament); - } + const auto filter = [preset](const std::pair 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 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)) { sla_materials.clear(); + aliases_sla.clear(); // Iterate SLA materials in all bundles for (const auto &pair : bundles) { for (const auto &material : pair.second.preset_bundle->sla_materials) { // Check if material is already added - if (sla_materials.containts(&material)) { continue; } - + if (sla_materials.containts(&material)) + continue; // Iterate printers in all bundles - 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) { - continue; - } - - if (material.is_compatible_with_printer(printer)) { + // For now, we only allow the profiles to be compatible with another profiles inside the same bundle. + 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 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 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); + } } } -void ConfigWizard::priv::on_custom_setup() +void ConfigWizard::priv::on_custom_setup(const bool custom_wanted) { + custom_printer_selected = custom_wanted; load_pages(); } void ConfigWizard::priv::on_printer_pick(PagePrinters *page, const PrinterPickerEvent &evt) { - if (page_msla->any_selected() != any_sla_selected || - page_fff->any_selected() != any_fff_selected) { - any_fff_selected = page_fff->any_selected(); - any_sla_selected = page_msla->any_selected(); + if (check_sla_selected() != any_sla_selected || + check_fff_selected() != any_fff_selected) { + any_fff_selected = check_fff_selected(); + any_sla_selected = check_sla_selected(); load_pages(); } @@ -1517,30 +2107,197 @@ void ConfigWizard::priv::on_printer_pick(PagePrinters *page, const PrinterPicker preset.is_visible = evt.enable; } } + + // When a printer model is picked, but there is no material installed compatible with this printer model, + // install default materials for selected printer model silently. + check_and_install_missing_materials(page->technology, evt.model_id); } - if (page == page_fff) { + if (page->technology & T_FFF) { page_filaments->clear(); - } else if (page == page_msla) { + } else if (page->technology & T_SLA) { page_sla_materials->clear(); } } +void ConfigWizard::priv::select_default_materials_for_printer_model(const VendorProfile::PrinterModel &printer_model, Technology technology) +{ + PageMaterials* page_materials = technology & T_FFF ? page_filaments : page_sla_materials; + for (const std::string& material : printer_model.default_materials) + appconfig_new.set(page_materials->materials->appconfig_section(), material, "1"); +} + +void ConfigWizard::priv::select_default_materials_for_printer_models(Technology technology, const std::set &printer_models) +{ + PageMaterials *page_materials = technology & T_FFF ? page_filaments : page_sla_materials; + const std::string &appconfig_section = page_materials->materials->appconfig_section(); + + auto select_default_materials_for_printer_page = [this, appconfig_section, printer_models](PagePrinters *page_printers, Technology technology) + { + const std::string vendor_id = page_printers->get_vendor_id(); + for (auto& pair : bundles) + if (pair.first == vendor_id) + for (const VendorProfile::PrinterModel *printer_model : printer_models) + for (const std::string &material : printer_model->default_materials) + appconfig_new.set(appconfig_section, material, "1"); + }; + + PagePrinters* page_printers = technology & T_FFF ? page_fff : page_msla; + select_default_materials_for_printer_page(page_printers, technology); + + for (const auto& printer : pages_3rdparty) + { + page_printers = technology & T_FFF ? printer.second.first : printer.second.second; + if (page_printers) + select_default_materials_for_printer_page(page_printers, technology); + } + + update_materials(technology); + ((technology & T_FFF) ? page_filaments : page_sla_materials)->reload_presets(); +} + void ConfigWizard::priv::on_3rdparty_install(const VendorProfile *vendor, bool install) { auto it = pages_3rdparty.find(vendor->id); wxCHECK_RET(it != pages_3rdparty.end(), "Internal error: GUI page not found for 3rd party vendor profile"); - PagePrinters *page = it->second; - if (page->install && !install) { - page->select_all(false); - } - page->install = install; - page->Layout(); + for (PagePrinters* page : { it->second.first, it->second.second }) + if (page) { + if (page->install && !install) + page->select_all(false); + page->install = install; + // if some 3rd vendor is selected, select first printer for them + if (install) + page->printer_pickers[0]->select_one(0, true); + page->Layout(); + } load_pages(); } +bool ConfigWizard::priv::on_bnt_finish() +{ + /* When Filaments or Sla Materials pages are activated, + * materials for this pages are automaticaly updated and presets are reloaded. + * + * But, if _Finish_ button was clicked without activation of those pages + * (for example, just some printers were added/deleted), + * than last changes wouldn't be updated for filaments/materials. + * SO, do that before close of Wizard + */ + update_materials(T_ANY); + if (any_fff_selected) + page_filaments->reload_presets(); + if (any_sla_selected) + 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; + // check, that there is selected at least one filament/material + return check_and_install_missing_materials(T_ANY); +} + +// This allmighty method verifies, whether there is at least a single compatible filament or SLA material installed +// for each Printer preset of each Printer Model installed. +// +// In case only_for_model_id is set, then the test is done for that particular printer model only, and the default materials are installed silently. +// Otherwise the user is quieried whether to install the missing default materials or not. +// +// Return true if the tested Printer Models already had materials installed. +// Return false if there were some Printer Models with missing materials, independent from whether the defaults were installed for these +// respective Printer Models or not. +bool ConfigWizard::priv::check_and_install_missing_materials(Technology technology, const std::string &only_for_model_id) +{ + // Walk over all installed Printer presets and verify whether there is a filament or SLA material profile installed at the same PresetBundle, + // which is compatible with it. + const auto printer_models_missing_materials = [this, only_for_model_id](PrinterTechnology technology, const std::string §ion) + { + const std::map &appconfig_presets = appconfig_new.has_section(section) ? appconfig_new.get_section(section) : std::map(); + std::set printer_models_without_material; + for (const auto &pair : bundles) { + const PresetCollection &materials = pair.second.preset_bundle->materials(technology); + for (const auto &printer : pair.second.preset_bundle->printers) { + if (printer.is_visible && printer.printer_technology() == technology) { + const VendorProfile::PrinterModel *printer_model = PresetUtils::system_printer_model(printer); + assert(printer_model != nullptr); + if ((only_for_model_id.empty() || only_for_model_id == printer_model->id) && + printer_models_without_material.find(printer_model) == printer_models_without_material.end()) { + bool has_material = false; + for (const std::pair &preset : appconfig_presets) { + if (preset.second == "1") { + const Preset *material = materials.find_preset(preset.first, false); + if (material != nullptr && is_compatible_with_printer(PresetWithVendorProfile(*material, nullptr), PresetWithVendorProfile(printer, nullptr))) { + has_material = true; + break; + } + } + } + if (! has_material) + printer_models_without_material.insert(printer_model); + } + } + } + } + assert(printer_models_without_material.empty() || only_for_model_id.empty() || only_for_model_id == (*printer_models_without_material.begin())->id); + return printer_models_without_material; + }; + + const auto ask_and_select_default_materials = [this](const wxString &message, const std::set &printer_models, Technology technology) + { + wxMessageDialog msg(q, message, _(L("Notice")), wxYES_NO); + if (msg.ShowModal() == wxID_YES) + select_default_materials_for_printer_models(technology, printer_models); + }; + + const auto printer_model_list = [](const std::set &printer_models) -> wxString { + wxString out; + for (const VendorProfile::PrinterModel *printer_model : printer_models) { + out += "\t\t"; + out += from_u8(printer_model->name); + out += "\n"; + } + return out; + }; + + if (any_fff_selected && (technology & T_FFF)) { + std::set printer_models_without_material = printer_models_missing_materials(ptFFF, AppConfig::SECTION_FILAMENTS); + if (! printer_models_without_material.empty()) { + if (only_for_model_id.empty()) + ask_and_select_default_materials( + _L("The following FFF printer models have no filament selected:") + + "\n\n\t" + + printer_model_list(printer_models_without_material) + + "\n\n\t" + + _L("Do you want to select default filaments for these FFF printer models?"), + printer_models_without_material, + T_FFF); + else + select_default_materials_for_printer_model(**printer_models_without_material.begin(), T_FFF); + return false; + } + } + + if (any_sla_selected && (technology & T_SLA)) { + std::set printer_models_without_material = printer_models_missing_materials(ptSLA, AppConfig::SECTION_MATERIALS); + if (! printer_models_without_material.empty()) { + if (only_for_model_id.empty()) + ask_and_select_default_materials( + _L("The following SLA printer models have no materials selected:") + + "\n\n\t" + + printer_model_list(printer_models_without_material) + + "\n\n\t" + + _L("Do you want to select default SLA materials for these printer models?"), + printer_models_without_material, + T_SLA); + else + select_default_materials_for_printer_model(**printer_models_without_material.begin(), T_SLA); + return false; + } + } + + return true; +} + void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *preset_bundle, const PresetUpdater *updater) { const auto enabled_vendors = appconfig_new.vendors(); @@ -1616,6 +2373,8 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese } app_config->set("version_check", page_update->version_check ? "1" : "0"); 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"); + page_mode->serialize_mode(app_config); std::string preferred_model; @@ -1640,6 +2399,7 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese if (bundle.second.is_prusa_bundle) { continue; } const auto config = enabled_vendors.find(bundle.first); + if (config == enabled_vendors.end()) { continue; } for (const auto &model : bundle.second.vendor_profile->models) { const auto model_it = config->second.find(model.id); if (model_it != config->second.end() && model_it->second.size() > 0) { @@ -1666,11 +2426,48 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese preset_bundle->export_selections(*app_config); } +void ConfigWizard::priv::update_presets_in_config(const std::string& section, const std::string& alias_key, bool add) +{ + const PresetAliases& aliases = section == AppConfig::SECTION_FILAMENTS ? aliases_fff : aliases_sla; + + auto update = [this, add](const std::string& s, const std::string& key) { + assert(! s.empty()); + if (add) + appconfig_new.set(s, key, "1"); + else + appconfig_new.erase(s, key); + }; + + // add or delete presets had a same alias + auto it = aliases.find(alias_key); + if (it != aliases.end()) + for (const std::string& name : it->second) + update(section, name); +} + +bool ConfigWizard::priv::check_fff_selected() +{ + bool ret = page_fff->any_selected(); + for (const auto& printer: pages_3rdparty) + if (printer.second.first) // FFF page + ret |= printer.second.first->any_selected(); + return ret; +} + +bool ConfigWizard::priv::check_sla_selected() +{ + bool ret = page_msla->any_selected(); + for (const auto& printer: pages_3rdparty) + if (printer.second.second) // SLA page + ret |= printer.second.second->any_selected(); + return ret; +} + // Public ConfigWizard::ConfigWizard(wxWindow *parent) - : DPIDialog(parent, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + name(), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + : DPIDialog(parent, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(name()), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) , p(new priv(this)) { this->SetFont(wxGetApp().normal_font()); @@ -1722,26 +2519,31 @@ ConfigWizard::ConfigWizard(wxWindow *parent) 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 + p->create_3rdparty_pages(); // Needs to be done _before_ creating PageVendors + p->add_page(p->page_vendors = new PageVendors(this)); + p->add_page(p->page_custom = new PageCustom(this)); + p->custom_printer_selected = p->page_custom->custom_wanted(); + + p->any_sla_selected = p->check_sla_selected(); + p->any_fff_selected = p->check_fff_selected(); + + p->update_materials(T_ANY); + p->add_page(p->page_filaments = new PageMaterials(this, &p->filaments, _(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_custom = new PageCustom(this)); + p->add_page(p->page_update = new PageUpdate(this)); + p->add_page(p->page_reload_from_disk = new PageReloadFromDisk(this)); 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)); p->add_page(p->page_diams = new PageDiameters(this)); p->add_page(p->page_temps = new PageTemperatures(this)); - // Pages for 3rd party vendors - p->create_3rdparty_pages(); // Needs to ne done _before_ creating PageVendors - p->add_page(p->page_vendors = new PageVendors(this)); - - p->any_sla_selected = p->page_msla->any_selected(); - p->any_fff_selected = p->page_fff->any_selected(); - p->load_pages(); p->index->go_to(size_t{0}); @@ -1760,9 +2562,25 @@ ConfigWizard::ConfigWizard(wxWindow *parent) }); p->btn_prev->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { this->p->index->go_prev(); }); - p->btn_next->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { this->p->index->go_next(); }); - p->btn_finish->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { this->EndModal(wxID_OK); }); - p->btn_finish->Hide(); + + p->btn_next->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) + { + // check, that there is selected at least one filament/material + ConfigWizardPage* active_page = this->p->index->active_page(); + if (// Leaving the filaments or SLA materials page and + (active_page == p->page_filaments || active_page == p->page_sla_materials) && + // some Printer models had no filament or SLA material selected. + ! p->check_and_install_missing_materials(dynamic_cast(active_page)->materials->technology)) + // In that case don't leave the page and the function above queried the user whether to install default materials. + return; + this->p->index->go_next(); + }); + + p->btn_finish->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) + { + if (p->on_bnt_finish()) + this->EndModal(wxID_OK); + }); p->btn_sel_all->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &) { p->any_sla_selected = true; @@ -1775,7 +2593,8 @@ ConfigWizard::ConfigWizard(wxWindow *parent) p->index->Bind(EVT_INDEX_PAGE, [this](const wxCommandEvent &) { const bool is_last = p->index->active_is_last(); p->btn_next->Show(! is_last); - p->btn_finish->Show(is_last); + if (is_last) + p->btn_finish->SetFocus(); Layout(); }); @@ -1796,6 +2615,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 995957816f..9fcc9267d5 100644 --- a/src/slic3r/GUI/ConfigWizard_private.hpp +++ b/src/slic3r/GUI/ConfigWizard_private.hpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -18,12 +19,15 @@ #include #include #include +#include #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,31 +59,91 @@ enum Technology { T_ANY = ~0, }; +struct Bundle +{ + std::unique_ptr 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 +{ + static BundleMap load(); + + Bundle& prusa_bundle(); + const Bundle& prusa_bundle() const; +}; + struct Materials { Technology technology; - std::set presets; + // use vector for the presets to purpose of save of presets sorting in the bundle + std::vector presets; + // String is alias of material, size_t number of compatible counters + std::vector> compatibility_counter; std::set types; + std::set printers; Materials(Technology technology) : technology(technology) {} void push(const Preset *preset); + void add_printer(const Preset* preset); void clear(); - bool containts(const Preset *preset) { - return presets.find(preset) != presets.end(); + bool containts(const Preset *preset) const { + //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 get_presets_by_alias(const std::string name) { + std::vector 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 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)) { - template 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); - } - } - } + cb(preset); + } + } + } static const std::string UNKNOWN; static const std::string& get_filament_type(const Preset *preset); @@ -88,30 +152,9 @@ struct Materials static const std::string& get_material_vendor(const Preset *preset); }; -struct Bundle -{ - std::unique_ptr preset_bundle; - VendorProfile *vendor_profile; - const bool is_in_resources; - const bool is_prusa_bundle; - - Bundle(fs::path source_path, bool is_in_resources, bool is_prusa_bundle = false); - Bundle(Bundle &&other); - - const std::string& vendor_id() const { return vendor_profile->id; } -}; - -struct BundleMap: std::unordered_map -{ - static BundleMap load(); - - Bundle& prusa_bundle(); - const Bundle& prusa_bundle() const; -}; struct PrinterPickerEvent; - // GUI elements typedef std::function ModelFilter; @@ -140,6 +183,7 @@ struct PrinterPicker: wxPanel void select_all(bool select, bool alternates = false); void select_one(size_t i, bool select); bool any_selected() const; + std::set get_selected_models() const ; int get_width() const { return width; } const std::vector& get_button_indexes() { return m_button_indexes; } @@ -206,6 +250,9 @@ struct PagePrinters: ConfigWizardPage void select_all(bool select, bool alternates = false); int get_width() const; bool any_selected() const; + std::set get_selected_models(); + + std::string get_vendor_id() const { return printer_pickers.empty() ? "" : printer_pickers[0]->vendor_id; } virtual void set_run_reason(ConfigWizard::RunReason run_reason) override; }; @@ -215,6 +262,7 @@ struct PagePrinters: ConfigWizardPage template 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)" @@ -240,29 +288,76 @@ template struct DataList : public T return wxNOT_FOUND; } + + 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 StringList; -typedef DataList PresetList; +typedef DataList PresetList; + +struct ProfilePrintData +{ + std::reference_wrapper 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& 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& 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; }; @@ -290,12 +385,21 @@ struct PageUpdate: ConfigWizardPage PageUpdate(ConfigWizard *parent); }; +struct PageReloadFromDisk : ConfigWizardPage +{ + bool full_pathnames; + + PageReloadFromDisk(ConfigWizard* parent); +}; + 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; @@ -343,7 +447,10 @@ struct PageTemperatures: ConfigWizardPage virtual void apply_custom_config(DynamicPrintConfig &config); }; -typedef std::map Pages3rdparty; +// hypothetically, each vendor can has printers both of technologies (FFF and SLA) +typedef std::map> Pages3rdparty; class ConfigWizardIndex: public wxPanel @@ -404,6 +511,8 @@ wxDEFINE_EVENT(EVT_INDEX_PAGE, wxCommandEvent); // ConfigWizard private data +typedef std::map> PresetAliases; + struct ConfigWizard::priv { ConfigWizard *q; @@ -415,9 +524,12 @@ struct ConfigWizard::priv // PrinterPickers state. Materials filaments; // Holds available filament presets and their types & vendors Materials sla_materials; // Ditto for SLA materials + PresetAliases aliases_fff; // Map of aliase to preset names + PresetAliases aliases_sla; // Map of aliase to preset names std::unique_ptr custom_config; // Backing for custom printer definition bool any_fff_selected; // Used to decide whether to display Filaments page bool any_sla_selected; // Used to decide whether to display SLA Materials page + bool custom_printer_selected; wxScrolledWindow *hscroll = nullptr; wxBoxSizer *hscroll_sizer = nullptr; @@ -437,6 +549,7 @@ struct ConfigWizard::priv PageMaterials *page_sla_materials = nullptr; PageCustom *page_custom = nullptr; PageUpdate *page_update = nullptr; + PageReloadFromDisk *page_reload_from_disk = nullptr; PageMode *page_mode = nullptr; PageVendors *page_vendors = nullptr; Pages3rdparty pages_3rdparty; @@ -452,9 +565,9 @@ struct ConfigWizard::priv priv(ConfigWizard *q) : q(q) + , appconfig_new(AppConfig::EAppMode::Editor) , filaments(T_FFF) , sla_materials(T_SLA) - , any_sla_selected(false) {} void load_pages(); @@ -468,17 +581,24 @@ struct ConfigWizard::priv void set_run_reason(RunReason run_reason); void update_materials(Technology technology); - void on_custom_setup(); + void on_custom_setup(const bool custom_wanted); void on_printer_pick(PagePrinters *page, const PrinterPickerEvent &evt); + void select_default_materials_for_printer_model(const VendorProfile::PrinterModel &printer_model, Technology technology); + void select_default_materials_for_printer_models(Technology technology, const std::set &printer_models); void on_3rdparty_install(const VendorProfile *vendor, bool install); + bool on_bnt_finish(); + bool check_and_install_missing_materials(Technology technology, const std::string &only_for_model_id = std::string()); void apply_config(AppConfig *app_config, PresetBundle *preset_bundle, const PresetUpdater *updater); + // #ys_FIXME_alise + void update_presets_in_config(const std::string& section, const std::string& alias_key, bool add); + + bool check_fff_selected(); // Used to decide whether to display Filaments page + bool check_sla_selected(); // Used to decide whether to display SLA Materials page int em() const { return index->em(); } }; - - } } diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp new file mode 100644 index 0000000000..6e1b6a8cd7 --- /dev/null +++ b/src/slic3r/GUI/DoubleSlider.cpp @@ -0,0 +1,2378 @@ +#include "libslic3r/libslic3r.h" +#if ENABLE_GCODE_VIEWER +#include "DoubleSlider.hpp" +#include "libslic3r/GCode.hpp" +#else +#include "wxExtensions.hpp" +#endif // ENABLE_GCODE_VIEWER +#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 +#include +#include +#include +#include +#include +#include +#include +#if !ENABLE_GCODE_VIEWER +#include +#endif // !ENABLE_GCODE_VIEWER +#include + +#include +#include +#include "Field.hpp" +#include "format.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, + int higherValue, + int minValue, + int maxValue, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& val, + const wxString& name) : + wxControl(parent, id, pos, size, wxWANTS_CHARS | wxBORDER_NONE), + m_lower_value(lowerValue), + m_higher_value (higherValue), + m_min_value(minValue), + m_max_value(maxValue), + m_style(style == wxSL_HORIZONTAL || style == wxSL_VERTICAL ? style: wxSL_HORIZONTAL) +{ +#ifdef __WXOSX__ + is_osx = true; +#endif //__WXOSX__ + if (!is_osx) + SetDoubleBuffered(true);// SetDoubleBuffered exists on Win and Linux/GTK, but is missing on OSX + +#if ENABLE_GCODE_VIEWER + 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")); +#else + 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")); +#endif // ENABLE_GCODE_VIEWER + m_thumb_size = m_bmp_thumb_lower.GetBmpSize(); + + m_bmp_add_tick_on = ScalableBitmap(this, "colorchange_add"); + m_bmp_add_tick_off = ScalableBitmap(this, "colorchange_add_f"); + m_bmp_del_tick_on = ScalableBitmap(this, "colorchange_del"); + m_bmp_del_tick_off = ScalableBitmap(this, "colorchange_del_f"); + m_tick_icon_dim = m_bmp_add_tick_on.GetBmpWidth(); + + m_bmp_one_layer_lock_on = ScalableBitmap(this, "lock_closed"); + m_bmp_one_layer_lock_off = ScalableBitmap(this, "lock_closed_f"); + m_bmp_one_layer_unlock_on = ScalableBitmap(this, "lock_open"); + m_bmp_one_layer_unlock_off = ScalableBitmap(this, "lock_open_f"); + m_lock_icon_dim = m_bmp_one_layer_lock_on.GetBmpWidth(); + + m_bmp_revert = ScalableBitmap(this, "undo"); + m_revert_icon_dim = m_bmp_revert.GetBmpWidth(); + m_bmp_cog = ScalableBitmap(this, "cog"); + m_cog_icon_dim = m_bmp_cog.GetBmpWidth(); + + m_selection = ssUndef; + m_ticks.set_pause_print_msg(_utf8(L("Place bearings in slots and resume printing"))); + m_ticks.set_extruder_colors(&m_extruder_colors); + + // slider events + this->Bind(wxEVT_PAINT, &Control::OnPaint, this); + this->Bind(wxEVT_CHAR, &Control::OnChar, this); + this->Bind(wxEVT_LEFT_DOWN, &Control::OnLeftDown, this); + this->Bind(wxEVT_MOTION, &Control::OnMotion, this); + this->Bind(wxEVT_LEFT_UP, &Control::OnLeftUp, this); + this->Bind(wxEVT_MOUSEWHEEL, &Control::OnWheel, this); + this->Bind(wxEVT_ENTER_WINDOW,&Control::OnEnterWin, this); + this->Bind(wxEVT_LEAVE_WINDOW,&Control::OnLeaveWin, this); + this->Bind(wxEVT_KEY_DOWN, &Control::OnKeyDown, this); + this->Bind(wxEVT_KEY_UP, &Control::OnKeyUp, this); + this->Bind(wxEVT_RIGHT_DOWN, &Control::OnRightDown,this); + this->Bind(wxEVT_RIGHT_UP, &Control::OnRightUp, this); + + // control's view variables + SLIDER_MARGIN = 4 + GUI::wxGetApp().em_unit(); + + DARK_ORANGE_PEN = wxPen(wxColour(237, 107, 33)); + ORANGE_PEN = wxPen(wxColour(253, 126, 66)); + LIGHT_ORANGE_PEN = wxPen(wxColour(254, 177, 139)); + + DARK_GREY_PEN = wxPen(wxColour(128, 128, 128)); + GREY_PEN = wxPen(wxColour(164, 164, 164)); + LIGHT_GREY_PEN = wxPen(wxColour(204, 204, 204)); + + 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(); +} + +void Control::msw_rescale() +{ + const wxFont& font = GUI::wxGetApp().normal_font(); + m_font = is_osx ? font.Smaller().Smaller() : font.Smaller(); + + m_bmp_thumb_higher.msw_rescale(); + m_bmp_thumb_lower .msw_rescale(); + m_thumb_size = m_bmp_thumb_lower.bmp().GetSize(); + + m_bmp_add_tick_on .msw_rescale(); + m_bmp_add_tick_off.msw_rescale(); + m_bmp_del_tick_on .msw_rescale(); + m_bmp_del_tick_off.msw_rescale(); + m_tick_icon_dim = m_bmp_add_tick_on.bmp().GetSize().x; + + m_bmp_one_layer_lock_on .msw_rescale(); + m_bmp_one_layer_lock_off .msw_rescale(); + m_bmp_one_layer_unlock_on .msw_rescale(); + m_bmp_one_layer_unlock_off.msw_rescale(); + m_lock_icon_dim = m_bmp_one_layer_lock_on.bmp().GetSize().x; + + m_bmp_revert.msw_rescale(); + m_revert_icon_dim = m_bmp_revert.bmp().GetSize().x; + m_bmp_cog.msw_rescale(); + m_cog_icon_dim = m_bmp_cog.bmp().GetSize().x; + + SLIDER_MARGIN = 4 + GUI::wxGetApp().em_unit(); + + SetMinSize(get_min_size()); + GetParent()->Layout(); +} + +int Control::GetActiveValue() const +{ + return m_selection == ssLower ? + m_lower_value : m_selection == ssHigher ? + m_higher_value : -1; +} + +wxSize Control::get_min_size() const +{ + const int min_side = GUI::wxGetApp().em_unit() * ( is_horizontal() ? (is_osx ? 8 : 6) : 10 ); + + return wxSize(min_side, min_side); +} + +wxSize Control::DoGetBestSize() const +{ + const wxSize size = wxControl::DoGetBestSize(); + if (size.x > 1 && size.y > 1) + return size; + return get_min_size(); +} + +void Control::SetLowerValue(const int lower_val) +{ + m_selection = ssLower; + m_lower_value = lower_val; + correct_lower_value(); + Refresh(); + Update(); + + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + ProcessWindowEvent(e); +} + +void Control::SetHigherValue(const int higher_val) +{ + m_selection = ssHigher; + m_higher_value = higher_val; + correct_higher_value(); + Refresh(); + Update(); + + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + ProcessWindowEvent(e); +} + +void Control::SetSelectionSpan(const int lower_val, const int higher_val) +{ + m_lower_value = std::max(lower_val, m_min_value); + m_higher_value = std::max(std::min(higher_val, m_max_value), m_lower_value); + if (m_lower_value < m_higher_value) + m_is_one_layer = false; + + Refresh(); + Update(); + + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + ProcessWindowEvent(e); +} + +void Control::SetMaxValue(const int max_value) +{ + m_max_value = max_value; + Refresh(); + Update(); +} + +void Control::draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos) +{ + int width; + int height; + get_size(&width, &height); + + wxCoord line_beg_x = is_horizontal() ? SLIDER_MARGIN : width*0.5 - 1; + wxCoord line_beg_y = is_horizontal() ? height*0.5 - 1 : SLIDER_MARGIN; + wxCoord line_end_x = is_horizontal() ? width - SLIDER_MARGIN + 1 : width*0.5 - 1; + wxCoord line_end_y = is_horizontal() ? height*0.5 - 1 : height - SLIDER_MARGIN + 1; + + wxCoord segm_beg_x = is_horizontal() ? lower_pos : width*0.5 - 1; + wxCoord segm_beg_y = is_horizontal() ? height*0.5 - 1 : lower_pos/*-1*/; + 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++) { + 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]); + dc.DrawLine(segm_beg_x, segm_beg_y, segm_end_x, segm_end_y); + if (is_horizontal()) + line_beg_y = line_end_y = segm_beg_y = segm_end_y += 1; + else + line_beg_x = line_end_x = segm_beg_x = segm_end_x += 1; + } +} + +double Control::get_scroll_step() +{ + const wxSize sz = get_size(); + const int& slider_len = m_style == wxSL_HORIZONTAL ? sz.x : sz.y; + return double(slider_len - SLIDER_MARGIN * 2) / (m_max_value - m_min_value); +} + +// get position on the slider line from entered value +wxCoord Control::get_position_from_value(const int value) +{ + const double step = get_scroll_step(); + const int val = is_horizontal() ? value : m_max_value - value; + return wxCoord(SLIDER_MARGIN + int(val*step + 0.5)); +} + +wxSize Control::get_size() const +{ + int w, h; + get_size(&w, &h); + return wxSize(w, 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; +} + +double Control::get_double_value(const SelectedSlider& selection) +{ + if (m_values.empty() || m_lower_value<0) + return 0.0; + if (m_values.size() <= m_higher_value) { + correct_higher_value(); + return m_values.back(); + } + return m_values[selection == ssLower ? m_lower_value : m_higher_value]; +} + +Info Control::GetTicksValues() const +{ + Info custom_gcode_per_print_z; +#if ENABLE_GCODE_VIEWER + std::vector& values = custom_gcode_per_print_z.gcodes; +#else + std::vector& values = custom_gcode_per_print_z.gcodes; +#endif // ENABLE_GCODE_VIEWER + + const int val_size = m_values.size(); + if (!m_values.empty()) + for (const TickCode& tick : m_ticks.ticks) { + if (tick.tick > val_size) + break; +#if ENABLE_GCODE_VIEWER + values.emplace_back(CustomGCode::Item{ m_values[tick.tick], tick.type, tick.extruder, tick.color, tick.extra }); +#else + values.emplace_back(Item{m_values[tick.tick], tick.type, tick.extruder, tick.color, tick.extra}); +#endif // ENABLE_GCODE_VIEWER + } + + if (m_force_mode_apply) + custom_gcode_per_print_z.mode = m_mode; + + return custom_gcode_per_print_z; +} + +void Control::SetTicksValues(const Info& custom_gcode_per_print_z) +{ + if (m_values.empty()) { + m_ticks.mode = m_mode; + return; + } + + const bool was_empty = m_ticks.empty(); + + m_ticks.ticks.clear(); +#if ENABLE_GCODE_VIEWER + const std::vector& heights = custom_gcode_per_print_z.gcodes; +#else + const std::vector& heights = custom_gcode_per_print_z.gcodes; +#endif // ENABLE_GCODE_VIEWER + 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.type, h.extruder, h.color, h.extra}); + } + + if (!was_empty && m_ticks.empty()) + // Switch to the "Feature type"/"Tool" from the very beginning of a new object slicing after deleting of the old one + post_ticks_changed_event(); + + if (custom_gcode_per_print_z.mode) + m_ticks.mode = custom_gcode_per_print_z.mode; + + Refresh(); + Update(); +} + +void Control::SetDrawMode(bool is_sla_print, bool is_sequential_print) +{ + m_draw_mode = is_sla_print ? dmSlaPrint : + is_sequential_print ? dmSequentialFffPrint : + dmRegular; +} + +void Control::SetModeAndOnlyExtruder(const bool is_one_extruder_printed_model, const int only_extruder) +{ + 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 == SingleExtruder); +} + +void Control::SetExtruderColors( const std::vector& extruder_colors) +{ + m_extruder_colors = extruder_colors; +} + +void Control::get_lower_and_higher_position(int& lower_pos, int& higher_pos) +{ + const double step = get_scroll_step(); + if (is_horizontal()) { + lower_pos = SLIDER_MARGIN + int(m_lower_value*step + 0.5); + higher_pos = SLIDER_MARGIN + int(m_higher_value*step + 0.5); + } + else { + lower_pos = SLIDER_MARGIN + int((m_max_value - m_lower_value)*step + 0.5); + higher_pos = SLIDER_MARGIN + int((m_max_value - m_higher_value)*step + 0.5); + } +} + +void Control::draw_focus_rect() +{ + if (!m_is_focused) + return; + const wxSize sz = GetSize(); + wxPaintDC dc(this); + const wxPen pen = wxPen(wxColour(128, 128, 10), 1, wxPENSTYLE_DOT); + dc.SetPen(pen); + dc.SetBrush(wxBrush(wxColour(0, 0, 0), wxBRUSHSTYLE_TRANSPARENT)); + dc.DrawRectangle(1, 1, sz.x - 2, sz.y - 2); +} + +void Control::render() +{ +#if ENABLE_GCODE_VIEWER +#ifdef _WIN32 + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); +#else + SetBackgroundColour(GetParent()->GetBackgroundColour()); +#endif // _WIN32 +#else + SetBackgroundColour(GetParent()->GetBackgroundColour()); +#endif // ENABLE_GCODE_VIEWER + draw_focus_rect(); + + wxPaintDC dc(this); + dc.SetFont(m_font); + + const wxCoord lower_pos = get_position_from_value(m_lower_value); + const wxCoord higher_pos = get_position_from_value(m_higher_value); + + // draw colored band on the background of a scroll line + // and only in a case of no-empty m_values + draw_colored_band(dc); + + if (!m_render_as_disabled) { + // draw line + draw_scroll_line(dc, lower_pos, higher_pos); + + // draw color print ticks + draw_ticks(dc); + + // draw both sliders + draw_thumbs(dc, lower_pos, higher_pos); + + // draw lock/unlock + draw_one_layer_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 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 ENABLE_GCODE_VIEWER + if (!m_enable_action_icon) + return; +#endif // ENABLE_GCODE_VIEWER + + // suppress add tick on first layer + if (tick == 0) + return; + + wxBitmap* icon = m_focus == fiActionIcon ? &m_bmp_add_tick_off.bmp() : &m_bmp_add_tick_on.bmp(); + if (m_ticks.ticks.find(TickCode{tick}) != m_ticks.ticks.end()) + icon = m_focus == fiActionIcon ? &m_bmp_del_tick_off.bmp() : &m_bmp_del_tick_on.bmp(); + + wxCoord x_draw, y_draw; + is_horizontal() ? x_draw = pt_beg.x - 0.5*m_tick_icon_dim : y_draw = pt_beg.y - 0.5*m_tick_icon_dim; + if (m_selection == ssLower) + is_horizontal() ? y_draw = pt_end.y + 3 : x_draw = pt_beg.x - m_tick_icon_dim-2; + else + is_horizontal() ? y_draw = pt_beg.y - m_tick_icon_dim-2 : x_draw = pt_end.x + 3; + + dc.DrawBitmap(*icon, x_draw, y_draw); + + //update rect of the tick action icon + m_rect_tick_action = wxRect(x_draw, y_draw, m_tick_icon_dim, m_tick_icon_dim); +} + +void Control::draw_info_line_with_icon(wxDC& dc, const wxPoint& pos, const SelectedSlider selection) +{ + if (m_selection == selection) { + //draw info line + dc.SetPen(DARK_ORANGE_PEN); + const wxPoint pt_beg = is_horizontal() ? wxPoint(pos.x, pos.y - m_thumb_size.y) : wxPoint(pos.x - m_thumb_size.x, pos.y/* - 1*/); + const wxPoint pt_end = is_horizontal() ? wxPoint(pos.x, pos.y + m_thumb_size.y) : wxPoint(pos.x + m_thumb_size.x, pos.y/* - 1*/); + dc.DrawLine(pt_beg, pt_end); + + //draw action icon + if (m_draw_mode == dmRegular) + draw_action_icon(dc, pt_beg, pt_end); + } +} + +void Control::draw_tick_on_mouse_position(wxDC& dc) +{ + if (!m_is_focused || m_moving_pos == wxDefaultPosition) + return; + + //calculate thumb position on slider line + int width, height; + get_size(&width, &height); + + int tick = get_tick_near_point(m_moving_pos); + if (tick == m_higher_value || tick == m_lower_value) + return ; + + auto draw_ticks = [this](wxDC& dc, wxPoint pos, int margin=0 ) + { + wxPoint pt_beg = is_horizontal() ? wxPoint(pos.x+margin, pos.y - m_thumb_size.y) : wxPoint(pos.x - m_thumb_size.x , pos.y+margin); + wxPoint pt_end = is_horizontal() ? wxPoint(pos.x+margin, pos.y + m_thumb_size.y) : wxPoint(pos.x - 0.5 * m_thumb_size.x + 1, pos.y+margin); + dc.DrawLine(pt_beg, pt_end); + + pt_beg = is_horizontal() ? wxPoint(pos.x + margin, pos.y - m_thumb_size.y) : wxPoint(pos.x + 0.5 * m_thumb_size.x, pos.y+margin); + pt_end = is_horizontal() ? wxPoint(pos.x + margin, pos.y + m_thumb_size.y) : wxPoint(pos.x + m_thumb_size.x + 1, pos.y+margin); + dc.DrawLine(pt_beg, pt_end); + }; + + auto draw_touch = [this](wxDC& dc, wxPoint pos, int margin, bool right_side ) + { + int mult = right_side ? 1 : -1; + wxPoint pt_beg = is_horizontal() ? wxPoint(pos.x - margin, pos.y + mult * m_thumb_size.y) : wxPoint(pos.x + mult * m_thumb_size.x, pos.y - margin); + wxPoint pt_end = is_horizontal() ? wxPoint(pos.x + margin, pos.y + mult * m_thumb_size.y) : wxPoint(pos.x + mult * m_thumb_size.x, pos.y + margin); + dc.DrawLine(pt_beg, pt_end); + }; + + if (tick > 0) // this tick exists and should be marked as a focused + { + wxCoord new_pos = get_position_from_value(tick); + const wxPoint pos = is_horizontal() ? wxPoint(new_pos, height * 0.5) : wxPoint(0.5 * width, new_pos); + + dc.SetPen(DARK_ORANGE_PEN); + + draw_ticks(dc, pos, -2); + draw_ticks(dc, pos, 2 ); + draw_touch(dc, pos, 2, true); + draw_touch(dc, pos, 2, false); + + return; + } + + 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) + return; + + wxCoord new_pos = get_position_from_value(tick); + const wxPoint pos = is_horizontal() ? wxPoint(new_pos, height * 0.5) : wxPoint(0.5 * width, new_pos); + + //draw info line + dc.SetPen(LIGHT_GREY_PEN); + draw_ticks(dc, pos); +} + +wxString Control::get_label(int tick) const +{ + const int value = tick; + + if (m_label_koef == 1.0 && m_values.empty()) + return wxString::Format("%d", value); + if (value >= m_values.size()) + return "ErrVal"; + +#if ENABLE_GCODE_VIEWER + if (m_draw_mode == dmSequentialGCodeView) + return wxString::Format("%d", static_cast(m_values[value])); + else { + const wxString str = m_values.empty() ? + wxString::Format("%.*f", 2, m_label_koef * value) : + wxString::Format("%.*f", 2, m_values[value]); + return format_wxstr("%1%\n(%2%)", str, m_values.empty() ? value : value + 1); + } +#else + 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 format_wxstr("%1%\n(%2%)", str, m_values.empty() ? value : value + 1); +#endif // ENABLE_GCODE_VIEWER +} + +void Control::draw_tick_text(wxDC& dc, const wxPoint& pos, int tick, bool right_side/*=true*/) const +{ + wxCoord text_width, text_height; + const wxString label = get_label(tick); + dc.GetMultiLineTextExtent(label, &text_width, &text_height); + wxPoint text_pos; + 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); + + // update text rectangle + m_rect_lower_thumb_text = wxRect(text_pos, wxSize(text_width, text_height)); + } + 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(pos.x - text_width - 1 - m_thumb_size.x, pos.y - 0.5 * text_height + 1); + + // update text rectangle + m_rect_higher_thumb_text = wxRect(text_pos, wxSize(text_width, text_height)); + } + + 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); +} + +void Control::draw_thumb_item(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) +{ +#if ENABLE_GCODE_VIEWER + wxCoord x_draw = pos.x - int(0.5 * m_thumb_size.x); + wxCoord y_draw = pos.y - int(0.5 * m_thumb_size.y); +#else + 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); + } + } +#endif // ENABLE_GCODE_VIEWER + dc.DrawBitmap(selection == ssLower ? m_bmp_thumb_lower.bmp() : m_bmp_thumb_higher.bmp(), x_draw, y_draw); + + // Update thumb rect + update_thumb_rect(x_draw, y_draw, selection); +} + +void Control::draw_thumb(wxDC& dc, const wxCoord& pos_coord, const SelectedSlider& selection) +{ + //calculate thumb position on slider line + int width, height; + get_size(&width, &height); + const wxPoint pos = is_horizontal() ? wxPoint(pos_coord, height*0.5) : wxPoint(0.5*width, pos_coord); + + // Draw thumb + draw_thumb_item(dc, pos, selection); + + // Draw info_line + draw_info_line_with_icon(dc, pos, selection); + + // Draw thumb text + draw_thumb_text(dc, pos, selection); +} + +void Control::draw_thumbs(wxDC& dc, const wxCoord& lower_pos, const wxCoord& higher_pos) +{ + //calculate thumb position on slider line + int width, height; + get_size(&width, &height); + const wxPoint pos_l = is_horizontal() ? wxPoint(lower_pos, height*0.5) : wxPoint(0.5*width, lower_pos); + const wxPoint pos_h = is_horizontal() ? wxPoint(higher_pos, height*0.5) : wxPoint(0.5*width, higher_pos); + + // Draw lower thumb + draw_thumb_item(dc, pos_l, ssLower); + // Draw lower info_line + draw_info_line_with_icon(dc, pos_l, ssLower); + + // Draw higher thumb + draw_thumb_item(dc, pos_h, ssHigher); + // Draw higher info_line + draw_info_line_with_icon(dc, pos_h, ssHigher); + // Draw higher thumb text + draw_thumb_text(dc, pos_h, ssHigher); + + // Draw lower thumb text + draw_thumb_text(dc, pos_l, ssLower); +} + +void Control::draw_ticks(wxDC& dc) +{ + if (m_draw_mode == dmSlaPrint) + return; + + dc.SetPen(m_draw_mode == dmRegular ? DARK_GREY_PEN : LIGHT_GREY_PEN ); + 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); + + 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*/); + + // 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); + + // get icon name if it is + std::string icon_name; + + // 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.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.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()) { + 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; + is_horizontal() ? y_draw = mid + 22 : x_draw = mid + m_thumb_size.x + 3; + + dc.DrawBitmap(icon, x_draw, y_draw); + } + } +} + +std::string Control::get_color_for_tool_change_tick(std::set::const_iterator it) const +{ + const int current_extruder = it->extruder == 0 ? std::max(m_only_extruder, 1) : it->extruder; + + auto it_n = it; + while (it_n != m_ticks.ticks.begin()) { + --it_n; + if (it_n->type == ColorChange && it_n->extruder == current_extruder) + return it_n->color; + } + + return m_extruder_colors[current_extruder-1]; // return a color for a specific extruder from the colors list +} + +std::string Control::get_color_for_color_change_tick(std::set::const_iterator it) const +{ + const int def_extruder = std::max(1, m_only_extruder); + auto it_n = it; + bool is_tool_change = false; + while (it_n != m_ticks.ticks.begin()) { + --it_n; + if (it_n->type == ToolChange) { + is_tool_change = true; + if (it_n->extruder == it->extruder) + return it->color; + break; + } + if (it_n->type == ColorChange && it_n->extruder == it->extruder) + return it->color; + } + if (!is_tool_change && it->extruder == def_extruder) + return it->color; + + return ""; +} + +wxRect Control::get_colored_band_rect() +{ + int height, width; + get_size(&width, &height); + + const wxCoord mid = is_horizontal() ? 0.5 * height : 0.5 * width; + + return is_horizontal() ? + wxRect(SLIDER_MARGIN, lround(mid - 0.375 * m_thumb_size.y), + width - 2 * SLIDER_MARGIN + 1, lround(0.75 * m_thumb_size.y)) : + wxRect(lround(mid - 0.375 * m_thumb_size.x), SLIDER_MARGIN, + lround(0.75 * m_thumb_size.x), height - 2 * SLIDER_MARGIN + 1); +} + +void Control::draw_colored_band(wxDC& dc) +{ + if (m_draw_mode != dmRegular) + return; + + auto draw_band = [](wxDC& dc, const wxColour& clr, const wxRect& band_rc) + { + dc.SetPen(clr); + dc.SetBrush(clr); + dc.DrawRectangle(band_rc); + }; + + wxRect main_band = get_colored_band_rect(); + + // don't color a band for MultiExtruder mode + if (m_ticks.empty() || m_mode == MultiExtruder) { +#if ENABLE_GCODE_VIEWER +#ifdef _WIN32 + draw_band(dc, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW), main_band); +#else + draw_band(dc, GetParent()->GetBackgroundColour(), main_band); +#endif // _WIN32 +#else + draw_band(dc, GetParent()->GetBackgroundColour(), main_band); +#endif // ENABLE_GCODE_VIEWER + return; + } + + const int default_color_idx = m_mode==MultiAsSingle ? std::max(m_only_extruder - 1, 0) : 0; + draw_band(dc, wxColour(m_extruder_colors[default_color_idx]), main_band); + + std::set::const_iterator tick_it = m_ticks.ticks.begin(); + + while (tick_it != m_ticks.ticks.end()) + { + 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 == SingleExtruder ? tick_it->color : + tick_it->type == ToolChange ? + get_color_for_tool_change_tick(tick_it) : + get_color_for_color_change_tick(tick_it); + + if (!clr_str.empty()) + draw_band(dc, wxColour(clr_str), main_band); + } + ++tick_it; + } +} + +void Control::draw_one_layer_icon(wxDC& dc) +{ +#if ENABLE_GCODE_VIEWER + if (m_draw_mode == dmSequentialGCodeView) + return; +#endif // ENABLE_GCODE_VIEWER + + 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(); + + int width, height; + get_size(&width, &height); + + wxCoord x_draw, y_draw; + is_horizontal() ? x_draw = width-2 : x_draw = 0.5*width - 0.5*m_lock_icon_dim; + is_horizontal() ? y_draw = 0.5*height - 0.5*m_lock_icon_dim : y_draw = height-2; + + dc.DrawBitmap(icon, x_draw, y_draw); + + //update rect of the lock/unlock icon + m_rect_one_layer_icon = wxRect(x_draw, y_draw, m_lock_icon_dim, m_lock_icon_dim); +} + +void Control::draw_revert_icon(wxDC& dc) +{ + if (m_ticks.empty() || m_draw_mode != dmRegular) + return; + + int width, height; + get_size(&width, &height); + + wxCoord x_draw, y_draw; + is_horizontal() ? x_draw = width-2 : x_draw = 0.25*SLIDER_MARGIN; + is_horizontal() ? y_draw = 0.25*SLIDER_MARGIN: y_draw = height-2; + + dc.DrawBitmap(m_bmp_revert.bmp(), x_draw, y_draw); + + //update rect of the lock/unlock icon + m_rect_revert_icon = wxRect(x_draw, y_draw, m_revert_icon_dim, m_revert_icon_dim); +} + +void Control::draw_cog_icon(wxDC& dc) +{ +#if ENABLE_GCODE_VIEWER + if (m_draw_mode == dmSequentialGCodeView) + return; +#endif // ENABLE_GCODE_VIEWER + int width, height; + get_size(&width, &height); + + wxCoord x_draw, y_draw; +#if ENABLE_GCODE_VIEWER + 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 { +#endif // ENABLE_GCODE_VIEWER + 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 ENABLE_GCODE_VIEWER + } +#endif // ENABLE_GCODE_VIEWER + + dc.DrawBitmap(m_bmp_cog.bmp(), x_draw, y_draw); + + //update rect of the lock/unlock icon + 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) +{ + 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 + m_rect_higher_thumb = rect; +} + +int Control::get_value_from_position(const wxCoord x, const wxCoord y) +{ + const int height = get_size().y; + const double step = get_scroll_step(); + + if (is_horizontal()) + return int(double(x - SLIDER_MARGIN) / step + 0.5); + + 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 = is_lower_thumb_editable() ? ssLower : ssUndef; + else if(is_point_in_rect(pt, m_rect_higher_thumb)) + m_selection = ssHigher; + else + return false; // pt doesn't referenced to any thumb + return true; +} + +bool Control::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(); +} + +int Control::get_tick_near_point(const wxPoint& pt) +{ + for (auto tick : m_ticks.ticks) { + const wxCoord pos = get_position_from_value(tick.tick); + + if (is_horizontal()) { + if (pos - 4 <= pt.x && pt.x <= pos + 4) + return tick.tick; + } + else { + if (pos - 4 <= pt.y && pt.y <= pos + 4) + return tick.tick; + } + } + return -1; +} + +void Control::ChangeOneLayerLock() +{ + m_is_one_layer = !m_is_one_layer; + m_selection == ssLower ? correct_lower_value() : correct_higher_value(); + if (!m_selection) m_selection = ssHigher; + + Refresh(); + Update(); + + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + ProcessWindowEvent(e); +} + +void Control::OnLeftDown(wxMouseEvent& event) +{ + if (HasCapture()) + return; + this->CaptureMouse(); + + m_is_left_down = true; + m_mouse = maNone; + + wxPoint pos = event.GetLogicalPosition(wxClientDC(this)); + + if (is_point_in_rect(pos, m_rect_one_layer_icon)) + m_mouse = maOneLayerIconClick; + else if (is_point_in_rect(pos, m_rect_cog_icon)) + m_mouse = maCogIconClick; + 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; + } + else if (is_point_in_rect(pos, m_rect_revert_icon)) + m_mouse = maRevertIconClick; + } + + if (m_mouse == maNone) + detect_selected_slider(pos); + + event.Skip(); +} + +void Control::correct_lower_value() +{ + if (m_lower_value < m_min_value) + m_lower_value = m_min_value; + else if (m_lower_value > m_max_value) + m_lower_value = m_max_value; + + if ((m_lower_value >= m_higher_value && m_lower_value <= m_max_value) || m_is_one_layer) + m_higher_value = m_lower_value; +} + +void Control::correct_higher_value() +{ + if (m_higher_value > m_max_value) + m_higher_value = m_max_value; + else if (m_higher_value < m_min_value) + m_higher_value = m_min_value; + + if ((m_higher_value <= m_lower_value && m_higher_value >= m_min_value) || m_is_one_layer) + m_lower_value = m_higher_value; +} + +wxString Control::get_tooltip(int tick/*=-1*/) +{ + if (m_focus == fiNone) + return ""; + if (m_focus == fiOneLayerIcon) + return _L("One layer mode"); + if (m_focus == fiRevertIcon) + return _L("Discard all custom changes"); + if (m_focus == fiCogIcon) +#if ENABLE_GCODE_VIEWER + { + if (m_draw_mode == dmSequentialGCodeView) + return _L("Jump to move") + " (Shift + G)"; + else +#endif // ENABLE_GCODE_VIEWER + return m_mode == MultiAsSingle ? + GUI::from_u8((boost::format(_u8L("Jump to height %s or " + "Set extruder sequence for the entire print")) % " (Shift + G)\n").str()) : + _L("Jump to height") + " (Shift + G)"; +#if ENABLE_GCODE_VIEWER + } +#endif // ENABLE_GCODE_VIEWER + if (m_focus == fiColorBand) + 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 + + wxString tooltip; + const auto tick_code_it = m_ticks.ticks.find(TickCode{tick}); + + 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 == SingleExtruder ? SingleExtruderMode : + m_mode == MultiAsSingle ? MultiAsSingleMode : + MultiExtruderMode ); + tooltip += "\n\n"; + + /* Note: just on OSX!!! + * Right click event causes a little scrolling. + * So, as a workaround we use Ctrl+LeftMouseClick instead of RightMouseClick + * Show this information in tooltip + * */ + + // Show list of actions with new tick + 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" + "It's impossible to apply any custom G-code for objects printing sequentually.\n" + "This code won't be processed during G-code generation."); + + // Show custom Gcode as a first string of tooltop + tooltip = " "; + 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") + "! "; + 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."); + 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."); + 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."); + 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."); + + // Show list of actions with existing tick + if (m_focus == fiActionIcon) + 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") ); + } + return tooltip; + +} + +int Control::get_edited_tick_for_position(const wxPoint pos, Type type /*= ColorChange*/) +{ + if (m_ticks.empty()) + return -1; + + int tick = get_value_from_position(pos); + auto it = std::lower_bound(m_ticks.ticks.begin(), m_ticks.ticks.end(), TickCode{ tick }); + + while (it != m_ticks.ticks.begin()) { + --it; + if (it->type == type) + return it->tick; + } + + return -1; +} + +void Control::OnMotion(wxMouseEvent& event) +{ + bool action = false; + + const wxPoint pos = event.GetLogicalPosition(wxClientDC(this)); + int tick = -1; + + 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)) { + m_focus = fiActionIcon; + tick = m_selection == ssLower ? m_lower_value : m_higher_value; + } + else if (!m_ticks.empty() && is_point_in_rect(pos, m_rect_revert_icon)) + m_focus = fiRevertIcon; + else if (is_point_in_rect(pos, m_rect_cog_icon)) + m_focus = fiCogIcon; + 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 if (is_point_in_rect(pos, m_rect_lower_thumb_text)) + m_focus = fiLowerThumbText; + else if (is_point_in_rect(pos, m_rect_higher_thumb_text)) + m_focus = fiHigherThumbText; + else { + m_focus = fiTick; + tick = get_tick_near_point(pos); + } + m_moving_pos = pos; + } + else if (m_is_left_down || m_is_right_down) { + if (m_selection == ssLower) { + int current_value = m_lower_value; + m_lower_value = get_value_from_position(pos.x, pos.y); + correct_lower_value(); + action = (current_value != m_lower_value); + } + else if (m_selection == ssHigher) { + int current_value = m_higher_value; + m_higher_value = get_value_from_position(pos.x, pos.y); + correct_higher_value(); + action = (current_value != m_higher_value); + } + m_moving_pos = wxDefaultPosition; + } + Refresh(); + Update(); + event.Skip(); + + // Set tooltips with information for each icon + this->SetToolTip(get_tooltip(tick)); + + if (action) { + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + e.SetString("moving"); + ProcessWindowEvent(e); + } +} + +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) { + std::array active_extruders = get_active_extruders_for_tick(m_selection == ssLower ? m_lower_value : m_higher_value); + + std::vector icons = get_extruder_color_icons(true); + + wxMenu* change_extruder_menu = new wxMenu(); + + 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") + ")" : ""); + + if (m_mode == MultiAsSingle) + append_menu_item(change_extruder_menu, wxID_ANY, item_name, "", + [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 == 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")); + 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 == MultiAsSingle; }, change_extruder_menu_item, this); }, + change_extruder_menu_item->GetId()); + } +} + +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) { + int tick = m_selection == ssLower ? m_lower_value : m_higher_value; + std::set 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++) { + 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") + ")" : ""); + + append_menu_item(add_color_change_menu, wxID_ANY, item_name, "", + [this, i](wxCommandEvent&) { add_code_as_tick(ColorChange, i); }, "", menu, + []() { return true; }, GUI::wxGetApp().plater()); + } + + const wxString menu_name = switch_current_code ? + 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")); + } +} + +void Control::OnLeftUp(wxMouseEvent& event) +{ + if (!HasCapture()) + return; + this->ReleaseMouse(); + m_is_left_down = false; + + switch (m_mouse) { + case maNone : + move_current_thumb_to_pos(event.GetLogicalPosition(wxClientDC(this))); + break; + case maDeleteTick : + delete_current_tick(); + break; + case maAddTick : + add_current_tick(); + break; + case maCogIconClick : + if (m_mode == MultiAsSingle && m_draw_mode == dmRegular) + show_cog_icon_context_menu(); + else +#if ENABLE_GCODE_VIEWER + jump_to_value(); +#else + jump_to_print_z(); +#endif // ENABLE_GCODE_VIEWER + break; + case maOneLayerIconClick: + switch_one_layer_mode(); + break; + case maRevertIconClick: + discard_all_thicks(); + break; + default : + break; + } + + Refresh(); + Update(); + event.Skip(); + + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + ProcessWindowEvent(e); +} + +void Control::enter_window(wxMouseEvent& event, const bool enter) +{ + m_is_focused = enter; + Refresh(); + Update(); + event.Skip(); +} + +// "condition" have to be true for: +// - value increase (if wxSL_VERTICAL) +// - value decrease (if wxSL_HORIZONTAL) +void Control::move_current_thumb(const bool condition) +{ +// m_is_one_layer = wxGetKeyState(WXK_CONTROL); + int delta = condition ? -1 : 1; + 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 (m_selection == ssLower) { + m_lower_value -= delta; + correct_lower_value(); + } + else if (m_selection == ssHigher) { + m_higher_value -= delta; + correct_higher_value(); + } + Refresh(); + Update(); + + wxCommandEvent e(wxEVT_SCROLL_CHANGED); + e.SetEventObject(this); + ProcessWindowEvent(e); +} + +void Control::OnWheel(wxMouseEvent& event) +{ + // Set nearest to the mouse thumb as a selected, if there is not selected thumb + if (m_selection == ssUndef) { + const wxPoint& pt = event.GetLogicalPosition(wxClientDC(this)); + + if (is_horizontal()) + m_selection = abs(pt.x - m_rect_lower_thumb.GetRight()) <= + abs(pt.x - m_rect_higher_thumb.GetLeft()) ? + ssLower : ssHigher; + else + m_selection = abs(pt.y - m_rect_lower_thumb.GetTop()) <= + abs(pt.y - m_rect_higher_thumb.GetBottom()) ? + ssLower : ssHigher; + } + + if (m_selection == ssLower && !is_lower_thumb_editable()) + m_selection = ssUndef; + +#if ENABLE_GCODE_VIEWER + move_current_thumb((m_draw_mode == dmSequentialGCodeView) ? event.GetWheelRotation() < 0 : event.GetWheelRotation() > 0); +#else + move_current_thumb(event.GetWheelRotation() > 0); +#endif // ENABLE_GCODE_VIEWER +} + +void Control::OnKeyDown(wxKeyEvent &event) +{ + const int key = event.GetKeyCode(); +#if ENABLE_GCODE_VIEWER + 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 (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 (m_draw_mode != dmSequentialGCodeView && event.GetKeyCode() == WXK_SHIFT) + UseDefaultColors(false); +#else + if (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) { + // 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) + UseDefaultColors(false); +#endif // ENABLE_GCODE_VIEWER + else if (is_horizontal()) { +#if ENABLE_GCODE_VIEWER + if (m_is_focused) { +#endif // ENABLE_GCODE_VIEWER + if (key == WXK_LEFT || key == WXK_RIGHT) + move_current_thumb(key == WXK_LEFT); + else if (key == WXK_UP || key == WXK_DOWN) { + if (key == WXK_UP) + m_selection = ssHigher; + else if (key == WXK_DOWN && is_lower_thumb_editable()) + m_selection = ssLower; + Refresh(); + } +#if ENABLE_GCODE_VIEWER + } +#endif // ENABLE_GCODE_VIEWER + } + else { +#if ENABLE_GCODE_VIEWER + if (m_is_focused) { +#endif // ENABLE_GCODE_VIEWER + 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_GCODE_VIEWER + } +#endif // ENABLE_GCODE_VIEWER + } + + event.Skip(); // !Needed to have EVT_CHAR generated as well +} + +void Control::OnKeyUp(wxKeyEvent &event) +{ + if (event.GetKeyCode() == WXK_CONTROL) + m_is_one_layer = false; + else if (event.GetKeyCode() == WXK_SHIFT) + UseDefaultColors(true); + + Refresh(); + Update(); + event.Skip(); +} + +void Control::OnChar(wxKeyEvent& event) +{ + const int key = event.GetKeyCode(); +#if ENABLE_GCODE_VIEWER + if (m_draw_mode != dmSequentialGCodeView) + { +#endif // ENABLE_GCODE_VIEWER + 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 ENABLE_GCODE_VIEWER + } +#endif // ENABLE_GCODE_VIEWER + if (key == 'G') +#if ENABLE_GCODE_VIEWER + jump_to_value(); +#else + jump_to_print_z(); +#endif // ENABLE_GCODE_VIEWER +} + +void Control::OnRightDown(wxMouseEvent& event) +{ + if (HasCapture()) return; + this->CaptureMouse(); + + const wxPoint pos = event.GetLogicalPosition(wxClientDC(this)); + + m_mouse = maNone; + if (m_draw_mode == dmRegular) { + 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 == SingleExtruder && !detect_selected_slider(pos) && is_point_in_rect(pos, get_colored_band_rect())) + m_mouse = maForceColorEdit; + 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)) + return; + + if (m_selection == ssLower) + m_higher_value = m_lower_value; + else + m_lower_value = m_higher_value; + + // set slider to "one layer" mode + m_is_right_down = m_is_one_layer = true; + + Refresh(); + Update(); + event.Skip(); +} + +// Get active extruders for tick. +// Means one current extruder for not existing tick OR +// 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 Control::get_active_extruders_for_tick(int tick) const +{ + int default_initial_extruder = m_mode == MultiAsSingle ? std::max(1, m_only_extruder) : 1; + std::array extruders = { default_initial_extruder, -1 }; + if (m_ticks.empty()) + return extruders; + + auto it = m_ticks.ticks.lower_bound(TickCode{tick}); + + if (it != m_ticks.ticks.end() && it->tick == tick) // current tick exists + extruders[1] = it->extruder; + + while (it != m_ticks.ticks.begin()) { + --it; + if(it->type == ToolChange) { + extruders[0] = it->extruder; + break; + } + } + + return extruders; +} + +// Get used extruders for tick. +// Means all extruders(tools) which will be used during printing from current tick to the end +std::set TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extruder, double print_z, Mode force_mode/* = Undef*/) const +{ + Mode e_mode = !force_mode ? mode : force_mode; + + if (e_mode == MultiExtruder) { + // #ys_FIXME: get tool ordering from _correct_ place + const ToolOrdering& tool_ordering = GUI::wxGetApp().plater()->fff_print().get_tool_ordering(); + + if (tool_ordering.empty()) + return {}; + + std::set 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) { + const std::vector& extruders = it_layer_tools->extruders; + for (const auto& extruder : extruders) + used_extruders.emplace(extruder+1); + } + + return used_extruders; + } + + 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 used_extruders; + + auto it_start = ticks.lower_bound(TickCode{tick}); + auto it = it_start; + 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 + { + used_extruders.emplace(it->extruder); + if (tick < it->tick) + used_extruders.emplace(default_initial_extruder); + } + + while (it != ticks.begin()) { + --it; + if (it->type == ToolChange && tick != it->tick) { + used_extruders.emplace(it->extruder); + break; + } + } + + if (it == ticks.begin() && used_extruders.empty()) + used_extruders.emplace(default_initial_extruder); + + for (it = it_start; it != ticks.end(); ++it) + if (it->type == ToolChange && tick != it->tick) + used_extruders.emplace(it->extruder); + + return used_extruders; +} + +void Control::show_add_context_menu() +{ + wxMenu 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); + } + else { + append_change_extruder_menu_item(&menu); + append_add_color_change_menu_item(&menu); + } + + append_menu_item(&menu, wxID_ANY, _L("Add pause print") + " (" + gcode(PausePrint) + ")", "", + [this](wxCommandEvent&) { add_code_as_tick(PausePrint); }, "pause_print", &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); +} + +void Control::show_edit_context_menu() +{ + wxMenu menu; + + std::set::iterator it = m_ticks.ticks.find(TickCode{ m_selection == ssLower ? m_lower_value : m_higher_value }); + + 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->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->type == ColorChange && m_mode == MultiAsSingle) + append_change_extruder_menu_item(&menu, true); + + 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); +} + +void Control::show_cog_icon_context_menu() +{ + wxMenu menu; + + append_menu_item(&menu, wxID_ANY, _L("Jump to height") + " (Shift+G)", "", +#if ENABLE_GCODE_VIEWER + [this](wxCommandEvent&) { jump_to_value(); }, "", & menu); +#else + [this](wxCommandEvent&) { jump_to_print_z(); }, "", &menu); +#endif // ENABLE_GCODE_VIEWER + + 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); +} + +void Control::OnRightUp(wxMouseEvent& event) +{ + if (!HasCapture()) + return; + this->ReleaseMouse(); + m_is_right_down = m_is_one_layer = false; + + if (m_mouse == maForceColorEdit) { + wxPoint pos = event.GetLogicalPosition(wxClientDC(this)); + int edited_tick = get_edited_tick_for_position(pos); + if (edited_tick >= 0) + edit_tick(edited_tick); + } + else if (m_mouse == maAddMenu) + show_add_context_menu(); + else if (m_mouse == maEditMenu) + show_edit_context_menu(); + else if (m_mouse == maCogIconMenu) + show_cog_icon_context_menu(); + + Refresh(); + Update(); + event.Skip(); +} + +static std::string get_new_color(const std::string& color) +{ + wxColour clr(color); + 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(nullptr, data); + dialog.CenterOnParent(); + if (dialog.ShowModal() == wxID_OK) + return dialog.GetColourData().GetColour().GetAsString(wxC2S_HTML_SYNTAX).ToStdString(); + return ""; +} + +/* To avoid get an empty string from wxTextEntryDialog + * Let disable OK button, if TextCtrl is empty + * OR input value is our of range (min..max), when min a nd max are positive + * */ +static void upgrade_text_entry_dialog(wxTextEntryDialog* dlg, double min = -1.0, double max = -1.0) +{ + // detect TextCtrl and OK button + wxTextCtrl* textctrl {nullptr}; + wxWindowList& dlg_items = dlg->GetChildren(); + for (auto item : dlg_items) { + textctrl = dynamic_cast(item); + if (textctrl) + break; + } + + if (!textctrl) + return; + + textctrl->SetInsertionPointEnd(); + + wxButton* btn_OK = static_cast(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) { + double value = -1.0; + if (!textctrl->GetValue().ToCDouble(&value)) // input value couldn't be converted to double + disable = true; + else + disable = value < min - epsilon() || value > max + epsilon(); // is input value is out of valid range ? + } + + evt.Enable(!disable); + }, btn_OK->GetId()); +} + +static std::string get_custom_code(const std::string& code_in, double height) +{ + 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, + wxTextEntryDialogStyle | wxTE_MULTILINE); + upgrade_text_entry_dialog(&dlg); + + if (dlg.ShowModal() != wxID_OK) + return ""; + + return dlg.GetValue().ToStdString(); +} + +static std::string get_pause_print_msg(const std::string& msg_in, double height) +{ + 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), + wxTextEntryDialogStyle); + upgrade_text_entry_dialog(&dlg); + + if (dlg.ShowModal() != wxID_OK || dlg.GetValue().IsEmpty()) + return ""; + + return into_u8(dlg.GetValue()); +} + +#if ENABLE_GCODE_VIEWER +static double get_value_to_jump(double active_value, double min_z, double max_z, DrawMode mode) +#else +static double get_print_z_to_jump(double active_print_z, double min_z, double max_z) +#endif // ENABLE_GCODE_VIEWER +{ +#if ENABLE_GCODE_VIEWER + 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); +#else + 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); +#endif // ENABLE_GCODE_VIEWER + + // get custom gcode + wxTextEntryDialog dlg(nullptr, msg_text, msg_header, msg_in, wxTextEntryDialogStyle); + upgrade_text_entry_dialog(&dlg, min_z, max_z); + + if (dlg.ShowModal() != wxID_OK || dlg.GetValue().IsEmpty()) + return -1.0; + + double value = -1.0; + return dlg.GetValue().ToCDouble(&value) ? value : -1.0; +} + +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(type) ) + return; + + const int extruder = selected_extruder > 0 ? selected_extruder : std::max(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, type, extruder, m_values[tick])) + return; + } + 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(type); +} + +void Control::add_current_tick(bool call_from_keyboard /*= false*/) +{ + if (m_selection == ssUndef) + return; + const int tick = m_selection == ssLower ? m_lower_value : m_higher_value; + 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 == MultiAsSingle ? ToolChange : ColorChange)) + return; + + if (m_mode == SingleExtruder) + add_code_as_tick(ColorChange); + else + { + wxMenu menu; + + if (m_mode == MultiAsSingle) + append_change_extruder_menu_item(&menu); + else + append_add_color_change_menu_item(&menu); + + wxPoint pos = wxDefaultPosition; + /* 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) { + int width, height; + get_size(&width, &height); + + const wxCoord coord = 0.75 * (is_horizontal() ? height : width); + this->GetPosition(&width, &height); + + pos = is_horizontal() ? + wxPoint(get_position_from_value(tick), height + coord) : + wxPoint(width + coord, get_position_from_value(tick)); + } + + GUI::wxGetApp().plater()->PopupMenu(&menu, pos); + } +} + +void Control::delete_current_tick() +{ + if (m_selection == ssUndef) + return; + + 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->type)) + return; + + Type type = it->type; + m_ticks.ticks.erase(it); + post_ticks_changed_event(type); +} + +void Control::edit_tick(int tick/* = -1*/) +{ + if (tick < 0) + tick = m_selection == ssLower ? m_lower_value : m_higher_value; + const std::set::iterator it = m_ticks.ticks.find(TickCode{ tick }); + + if (it == m_ticks.ticks.end() || + !check_ticks_changed_event(it->type)) + return; + + Type type = it->type; + if (m_ticks.edit_tick(it, m_values[it->tick])) + post_ticks_changed_event(type); +} + +// switch on/off one layer mode +void Control::switch_one_layer_mode() +{ + m_is_one_layer = !m_is_one_layer; + if (!m_is_one_layer) { + SetLowerValue(m_min_value); + SetHigherValue(m_max_value); + } + m_selection == ssLower ? correct_lower_value() : correct_higher_value(); + if (m_selection == ssUndef) m_selection = ssHigher; +} + +// discard all custom changes on DoubleSlider +void Control::discard_all_thicks() +{ + SetLowerValue(m_min_value); + SetHigherValue(m_max_value); + + m_selection == ssLower ? correct_lower_value() : correct_higher_value(); + if (m_selection == ssUndef) m_selection = ssHigher; + + m_ticks.ticks.clear(); + post_ticks_changed_event(); + +} + +// Set current thumb position to the nearest tick (if it is) +// OR to a value corresponding to the mouse click (pos) +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 (m_selection == ssLower) { + SetLowerValue(mouse_val); + correct_lower_value(); + } + else { // even m_selection is ssUndef, upper thumb should be selected + SetHigherValue(mouse_val); + correct_higher_value(); + } + } +} + +void Control::edit_extruder_sequence() +{ + if (!check_ticks_changed_event(ToolChange)) + return; + + GUI::ExtruderSequenceDialog dlg(m_extruders_sequence); + if (dlg.ShowModal() != wxID_OK) + return; + m_extruders_sequence = dlg.GetValue(); + + m_ticks.erase_all_ticks_with_code(ToolChange); + + int tick = 0; + double value = 0.0; + int extruder = 0; + const int extr_cnt = m_extruders_sequence.extruders.size(); + + while (tick <= m_max_value) + { + const int cur_extruder = m_extruders_sequence.extruders[extruder]; + + bool meaningless_tick = tick == 0.0 && cur_extruder == extruder; + if (!meaningless_tick) + 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) { + value += m_extruders_sequence.interval_by_mm; + auto val_it = std::lower_bound(m_values.begin(), m_values.end(), value - epsilon()); + + if (val_it == m_values.end()) + break; + + tick = val_it - m_values.begin(); + } + else + tick += m_extruders_sequence.interval_by_layers; + } + + post_ticks_changed_event(ToolChange); +} + +#if ENABLE_GCODE_VIEWER +void Control::jump_to_value() +{ + 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(), value - epsilon()); + int tick_value = it - m_values.begin(); + + if (m_selection == ssLower) + SetLowerValue(tick_value); + else + SetHigherValue(tick_value); +} +#else +void Control::jump_to_print_z() +{ + 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) + return; + + auto it = std::lower_bound(m_values.begin(), m_values.end(), print_z - epsilon()); + int tick_value = it - m_values.begin(); + + if (m_selection == ssLower) + SetLowerValue(tick_value); + else + SetHigherValue(tick_value); +} +#endif // ENABLE_GCODE_VIEWER + +void Control::post_ticks_changed_event(Type type /*= Custom*/) +{ +// 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(Type type) +{ + if ( m_ticks.mode == m_mode || + (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 == SingleExtruder && m_mode == MultiExtruder ) || + (m_ticks.mode == MultiExtruder && m_mode == SingleExtruder) ) + { + if (!m_ticks.has_tick_with_code(ColorChange)) + return true; + + 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?"); + + wxMessageDialog msg(this, message, _L("Notice"), wxYES_NO); + if (msg.ShowModal() == wxID_YES) { + m_ticks.erase_all_ticks_with_code(ColorChange); + post_ticks_changed_event(ColorChange); + } + return false; + } + // 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(ToolChange); + post_ticks_changed_event(ToolChange); + } + else if (m_mode == SingleExtruder && answer == wxID_NO) { + m_ticks.switch_code(ToolChange, ColorChange); + post_ticks_changed_event(ColorChange); + } + return false; + } + + return true; +} + +std::string TickCodeInfo::get_color_for_tick(TickCode tick, Type type, const int extruder) +{ + if (mode == SingleExtruder && type == ColorChange && m_use_default_colors) { +#if ENABLE_GCODE_VIEWER + const std::vector& colors = ColorPrintColors::get(); +#else + const std::vector& colors = GCodePreviewData::ColorPrintColors(); +#endif // ENABLE_GCODE_VIEWER + if (ticks.empty()) + return colors[0]; + m_default_color_idx++; + + return colors[m_default_color_idx % colors.size()]; + } + + std::string color = (*m_colors)[extruder - 1]; + + 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->type == ColorChange && before_tick_it->extruder == extruder) { + color = before_tick_it->color; + break; + } + } + } + + color = get_new_color(color); + } + return color; +} + +bool TickCodeInfo::add_tick(const int tick, Type type, const int extruder, double print_z) +{ + std::string color; + std::string extra; + if (type == Custom) // custom Gcode + { + extra = get_custom_code(custom_gcode, print_z); + if (extra.empty()) + return false; + custom_gcode = extra; + } + else if (type == PausePrint) { + extra = get_pause_print_msg(pause_print_msg, print_z); + if (extra.empty()) + return false; + pause_print_msg = extra; + } + else { + color = get_color_for_tick(TickCode{ tick }, type, extruder); + if (color.empty()) + return false; + } + + if (mode == SingleExtruder) + m_use_default_colors = true; + + ticks.emplace(TickCode{ tick, type, extruder, color, extra }); + return true; +} + +bool TickCodeInfo::edit_tick(std::set::iterator it, double print_z) +{ + std::string edited_value; + if (it->type == ColorChange) + edited_value = get_new_color(it->color); + else if (it->type == PausePrint) + edited_value = get_pause_print_msg(it->extra, print_z); + else + 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->type == ColorChange) { + if (it->color == edited_value) + return false; + changed_tick.color = edited_value; + } + else if (it->type == Template) { + if (gcode(Template) == edited_value) + return false; + 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); + ticks.emplace(changed_tick); + + return true; +} + +void TickCodeInfo::switch_code(Type type_from, Type type_to) +{ + for (auto it{ ticks.begin() }, end{ ticks.end() }; it != end; ) + if (it->type == type_from) { + TickCode tick = *it; + tick.type = type_to; + tick.extruder = 1; + ticks.erase(it); + it = ticks.emplace(tick).first; + } + else + ++it; +} + +bool TickCodeInfo::switch_code_for_tick(std::set::iterator it, Type type_to, const int extruder) +{ + const std::string color = get_color_for_tick(*it, type_to, extruder); + if (color.empty()) + return false; + + TickCode changed_tick = *it; + changed_tick.type = type_to; + changed_tick.extruder = extruder; + changed_tick.color = color; + + ticks.erase(it); + ticks.emplace(changed_tick); + + return true; +} + +void TickCodeInfo::erase_all_ticks_with_code(Type type) +{ + for (auto it{ ticks.begin() }, end{ ticks.end() }; it != end; ) { + if (it->type == type) + it = ticks.erase(it); + else + ++it; + } +} + +bool TickCodeInfo::has_tick_with_code(Type type) +{ + for (const TickCode& tick : ticks) + if (tick.type == type) + return true; + + return false; +} + +ConflictType TickCodeInfo::is_conflict_tick(const TickCode& tick, Mode out_mode, int only_extruder, double print_z) +{ + 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.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 used_extruders_for_tick = get_used_extruders_for_tick(tick.tick, only_extruder, print_z, out_mode); + + if (used_extruders_for_tick.find(tick.extruder) == used_extruders_for_tick.end()) + return ctMeaninglessColorChange; + + // We should mark a tick as a "Redundant", + // if it has a ColorChange for extruder that has not been used before + if (mode == MultiAsSingle && tick.extruder != std::max(only_extruder, 1) ) + { + auto it = ticks.lower_bound( tick ); + if (it == ticks.begin() && it->type == ToolChange && tick.extruder == it->extruder) + return ctNone; + + while (it != ticks.begin()) { + --it; + if (it->type == ToolChange && tick.extruder == it->extruder) + return ctNone; + } + + return ctRedundant; + } + } + + // check ToolChange tick + 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); + if (it == ticks.begin()) + return tick.extruder == std::max(only_extruder, 1) ? ctMeaninglessToolChange : ctNone; + + while (it != ticks.begin()) { + --it; + if (it->type == ToolChange) + return tick.extruder == it->extruder ? ctMeaninglessToolChange : ctNone; + } + } + + return ctNone; +} + +} // DoubleSlider + +} // Slic3r + + diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp new file mode 100644 index 0000000000..511858dd59 --- /dev/null +++ b/src/slic3r/GUI/DoubleSlider.hpp @@ -0,0 +1,418 @@ +#ifndef slic3r_GUI_DoubleSlider_hpp_ +#define slic3r_GUI_DoubleSlider_hpp_ + +#include "libslic3r/CustomGCode.hpp" +#include "wxExtensions.hpp" + +#if !ENABLE_GCODE_VIEWER +#include +#endif // !ENABLE_GCODE_VIEWER +#include +#include +#include +#include + +#include +#include + +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. + */ +constexpr double epsilon() { return 0.0011; } + +// custom message the slider sends to its parent to notify a tick-change: +wxDECLARE_EVENT(wxCUSTOMEVT_TICKSCHANGED, wxEvent); + +enum SelectedSlider { + ssUndef, + ssLower, + ssHigher +}; + +enum FocusedItem { + fiNone, + fiRevertIcon, + fiOneLayerIcon, + fiCogIcon, + fiColorBand, + fiActionIcon, + fiLowerThumb, + fiHigherThumb, + fiLowerThumbText, + fiHigherThumbText, + fiTick +}; + +enum ConflictType +{ + ctNone, + ctModeConflict, + ctMeaninglessColorChange, + ctMeaninglessToolChange, + ctRedundant +}; + +enum MouseAction +{ + maNone, + maAddMenu, // show "Add" context menu for NOTexist active tick + maEditMenu, // show "Edit" context menu for exist active tick + maCogIconMenu, // show context for "cog" icon + maForceColorEdit, // force color editing from colored band + maAddTick, // force tick adding + maDeleteTick, // force tick deleting + maCogIconClick, // LeftMouseClick on "cog" icon + maOneLayerIconClick, // LeftMouseClick on "one_layer" icon + maRevertIconClick, // LeftMouseClick on "revert" icon +}; + +enum DrawMode +{ + dmRegular, + dmSlaPrint, + dmSequentialFffPrint, +#if ENABLE_GCODE_VIEWER + dmSequentialGCodeView, +#endif // ENABLE_GCODE_VIEWER +}; + +struct TickCode +{ + bool operator<(const TickCode& other) const { return other.tick > this->tick; } + bool operator>(const TickCode& other) const { return other.tick < this->tick; } + + int tick = 0; + Type type = ColorChange; + int extruder = 0; + std::string color; + std::string extra; +}; + +class TickCodeInfo +{ + std::string custom_gcode; + std::string pause_print_msg; + bool m_suppress_plus = false; + bool m_suppress_minus = false; + bool m_use_default_colors= false; + int m_default_color_idx = 0; + + std::vector* m_colors {nullptr}; + + std::string get_color_for_tick(TickCode tick, Type type, const int extruder); + +public: + std::set ticks {}; + 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, Type type, int extruder, double print_z); + bool edit_tick(std::set::iterator it, double print_z); + void switch_code(Type type_from, Type type_to); + bool switch_code_for_tick(std::set::iterator it, Type type_to, const int extruder); + void erase_all_ticks_with_code(Type type); + + 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 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; } + bool suppressed_plus () { return m_suppress_plus; } + bool suppressed_minus() { return m_suppress_minus; } + void set_default_colors(bool default_colors_on) { m_use_default_colors = default_colors_on; } + + void set_extruder_colors(std::vector* extruder_colors) { m_colors = extruder_colors; } +}; + + +struct ExtrudersSequence +{ + bool is_mm_intervals = true; + double interval_by_mm = 3.0; + int interval_by_layers = 10; + std::vector extruders = { 0 }; + + bool operator==(const ExtrudersSequence& other) const + { + return (other.is_mm_intervals == this->is_mm_intervals ) && + (other.interval_by_mm == this->interval_by_mm ) && + (other.interval_by_layers == this->interval_by_layers ) && + (other.extruders == this->extruders ) ; + } + bool operator!=(const ExtrudersSequence& other) const + { + return (other.is_mm_intervals != this->is_mm_intervals ) && + (other.interval_by_mm != this->interval_by_mm ) && + (other.interval_by_layers != this->interval_by_layers ) && + (other.extruders != this->extruders ) ; + } + + void add_extruder(size_t pos) + { + extruders.insert(extruders.begin() + pos+1, size_t(0)); + } + + void delete_extruder(size_t pos) + { + if (extruders.size() == 1) + return;// last item can't be deleted + extruders.erase(extruders.begin() + pos); + } +}; + +class Control : public wxControl +{ +public: + Control( + wxWindow *parent, + wxWindowID id, + int lowerValue, + int higherValue, + int minValue, + int maxValue, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSL_VERTICAL, + const wxValidator& val = wxDefaultValidator, + const wxString& name = wxEmptyString); + ~Control() {} + + void msw_rescale(); + + int GetMinValue() const { return m_min_value; } + int GetMaxValue() const { return m_max_value; } + double GetMinValueD() { return m_values.empty() ? 0. : m_values[m_min_value]; } + double GetMaxValueD() { return m_values.empty() ? 0. : m_values[m_max_value]; } + int GetLowerValue() const { return m_lower_value; } + int GetHigherValue() const { return m_higher_value; } + int GetActiveValue() const; + double GetLowerValueD() { return get_double_value(ssLower); } + double GetHigherValueD() { return get_double_value(ssHigher); } + wxSize DoGetBestSize() const override; + wxSize get_min_size() const ; + + // Set low and high slider position. If the span is non-empty, disable the "one layer" mode. + void SetLowerValue (const int lower_val); + void SetHigherValue(const int higher_val); + void SetSelectionSpan(const int lower_val, const int higher_val); + + void SetMaxValue(const int max_value); + void SetKoefForLabels(const double koef) { m_label_koef = koef; } + void SetSliderValues(const std::vector& values) { m_values = values; } + void ChangeOneLayerLock(); + + Info GetTicksValues() const; + void SetTicksValues(const Info &custom_gcode_per_print_z); + + void SetDrawMode(bool is_sla_print, bool is_sequential_print); +#if ENABLE_GCODE_VIEWER + void SetDrawMode(DrawMode mode) { m_draw_mode = mode; } +#endif // ENABLE_GCODE_VIEWER + + 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& 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 OnLeftDown(wxMouseEvent& event); + void OnMotion(wxMouseEvent& event); + void OnLeftUp(wxMouseEvent& event); + void OnEnterWin(wxMouseEvent& event) { enter_window(event, true); } + void OnLeaveWin(wxMouseEvent& event) { enter_window(event, false); } + void UseDefaultColors(bool def_colors_on) { m_ticks.set_default_colors(def_colors_on); } + void OnWheel(wxMouseEvent& event); + void OnKeyDown(wxKeyEvent &event); + void OnKeyUp(wxKeyEvent &event); + void OnChar(wxKeyEvent &event); + void OnRightDown(wxMouseEvent& event); + void OnRightUp(wxMouseEvent& event); + + 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 "-" + void delete_current_tick(); + void edit_tick(int tick = -1); + void switch_one_layer_mode(); + void discard_all_thicks(); + void move_current_thumb_to_pos(wxPoint pos); + void edit_extruder_sequence(); +#if ENABLE_GCODE_VIEWER + void jump_to_value(); + void enable_action_icon(bool enable) { m_enable_action_icon = enable; } +#else + void jump_to_print_z(); +#endif // ENABLE_GCODE_VIEWER + void show_add_context_menu(); + void show_edit_context_menu(); + void show_cog_icon_context_menu(); + + ExtrudersSequence m_extruders_sequence; + +protected: + + void render(); + void draw_focus_rect(); + void draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_end); + 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(wxDC& dc); + void draw_colored_band(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_thumb_text(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) const; + + void update_thumb_rect(const wxCoord begin_x, const wxCoord begin_y, const SelectedSlider& selection); + bool is_lower_thumb_editable(); + bool detect_selected_slider(const wxPoint& pt); + void correct_lower_value(); + void correct_higher_value(); + void move_current_thumb(const bool condition); + void enter_window(wxMouseEvent& event, const bool enter); + +private: + + bool is_point_in_rect(const wxPoint& pt, const wxRect& rect); + int get_tick_near_point(const wxPoint& pt); + + double get_scroll_step(); + wxString get_label(int tick) 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() 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, Type type = ColorChange); + + std::string get_color_for_tool_change_tick(std::set::const_iterator it) const; + std::string get_color_for_color_change_tick(std::set::const_iterator it) const; + wxRect get_colored_band_rect(); + + // 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) + // Use those values to disable selection of active extruders + std::array get_active_extruders_for_tick(int tick) const; + + 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); + + bool is_osx { false }; + wxFont m_font; + int m_min_value; + 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; + ScalableBitmap m_bmp_add_tick_off; + ScalableBitmap m_bmp_del_tick_on; + ScalableBitmap m_bmp_del_tick_off; + ScalableBitmap m_bmp_one_layer_lock_on; + ScalableBitmap m_bmp_one_layer_lock_off; + ScalableBitmap m_bmp_one_layer_unlock_on; + ScalableBitmap m_bmp_one_layer_unlock_off; + ScalableBitmap m_bmp_revert; + ScalableBitmap m_bmp_cog; + SelectedSlider m_selection; + bool m_is_left_down = false; + bool m_is_right_down = false; + bool m_is_one_layer = false; + bool m_is_focused = false; + bool m_force_mode_apply = true; +#if ENABLE_GCODE_VIEWER + bool m_enable_action_icon = true; +#endif // ENABLE_GCODE_VIEWER + + DrawMode m_draw_mode = dmRegular; + + Mode m_mode = SingleExtruder; + int m_only_extruder = -1; + + MouseAction m_mouse = maNone; + FocusedItem m_focus = fiNone; + wxPoint m_moving_pos = wxDefaultPosition; + + wxRect m_rect_lower_thumb; + wxRect m_rect_higher_thumb; + mutable wxRect m_rect_lower_thumb_text; + mutable wxRect m_rect_higher_thumb_text; + wxRect m_rect_tick_action; + wxRect m_rect_one_layer_icon; + wxRect m_rect_revert_icon; + wxRect m_rect_cog_icon; + wxSize m_thumb_size; + int m_tick_icon_dim; + int m_lock_icon_dim; + int m_revert_icon_dim; + int m_cog_icon_dim; + long m_style; + float m_label_koef = 1.0; + + std::vector m_values; + TickCodeInfo m_ticks; + + std::vector m_extruder_colors; + +// control's view variables + wxCoord SLIDER_MARGIN; // margin around slider + + wxPen DARK_ORANGE_PEN; + wxPen ORANGE_PEN; + wxPen LIGHT_ORANGE_PEN; + + wxPen DARK_GREY_PEN; + wxPen GREY_PEN; + wxPen LIGHT_GREY_PEN; + + std::vector m_line_pens; + std::vector m_segm_pens; +}; + +} // DoubleSlider; + +} // Slic3r + + + +#endif // slic3r_GUI_DoubleSlider_hpp_ diff --git a/src/slic3r/GUI/Event.hpp b/src/slic3r/GUI/Event.hpp index 429ef99b02..b9816a747e 100644 --- a/src/slic3r/GUI/Event.hpp +++ b/src/slic3r/GUI/Event.hpp @@ -40,11 +40,19 @@ template struct ArrayEvent : public wxEvent return new ArrayEvent(GetEventType(), data, GetEventObject()); } }; -template struct ArrayEvent : public wxEvent + +template struct Event : public wxEvent { T data; - ArrayEvent(wxEventType type, T data, wxObject* origin = nullptr) + Event(wxEventType type, const T &data, wxObject* origin = nullptr) + : wxEvent(0, type), data(std::move(data)) + { + m_propagationLevel = wxEVENT_PROPAGATE_MAX; + SetEventObject(origin); + } + + Event(wxEventType type, T&& data, wxObject* origin = nullptr) : wxEvent(0, type), data(std::move(data)) { m_propagationLevel = wxEVENT_PROPAGATE_MAX; @@ -53,13 +61,10 @@ template struct ArrayEvent : public wxEvent virtual wxEvent* Clone() const { - return new ArrayEvent(GetEventType(), data, GetEventObject()); + return new Event(GetEventType(), data, GetEventObject()); } }; -template using Event = ArrayEvent; - - } } diff --git a/src/slic3r/GUI/ExtraRenderers.cpp b/src/slic3r/GUI/ExtraRenderers.cpp new file mode 100644 index 0000000000..2915d498c0 --- /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 +#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 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; +} + + diff --git a/src/slic3r/GUI/ExtraRenderers.hpp b/src/slic3r/GUI/ExtraRenderers.hpp new file mode 100644 index 0000000000..6593963b78 --- /dev/null +++ b/src/slic3r/GUI/ExtraRenderers.hpp @@ -0,0 +1,162 @@ +#ifndef slic3r_GUI_ExtraRenderers_hpp_ +#define slic3r_GUI_ExtraRenderers_hpp_ + +#include + +#include + +#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 can_create_fn) { can_create_editor_ctrl = can_create_fn; } + +private: + DataViewBitmapText m_value; + bool m_was_unusable_symbol{ false }; + + std::function 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 can_create_fn) { can_create_editor_ctrl = can_create_fn; } + +private: + DataViewBitmapText m_value; + std::function can_create_editor_ctrl { nullptr }; +}; + + +#endif // slic3r_GUI_ExtraRenderers_hpp_ diff --git a/src/slic3r/GUI/ExtruderSequenceDialog.cpp b/src/slic3r/GUI/ExtruderSequenceDialog.cpp new file mode 100644 index 0000000000..d009648c22 --- /dev/null +++ b/src/slic3r/GUI/ExtruderSequenceDialog.cpp @@ -0,0 +1,235 @@ +#include "ExtruderSequenceDialog.hpp" + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "GUI.hpp" +#include "GUI_App.hpp" +#include "I18N.hpp" +#include "OptionsGroup.hpp" + + +namespace Slic3r { +namespace GUI { + +ExtruderSequenceDialog::ExtruderSequenceDialog(const DoubleSlider::ExtrudersSequence& sequence) + : DPIDialog((wxWindow*)wxGetApp().mainframe, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Set extruder sequence")), + wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER), + m_sequence(sequence) +{ + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); + SetDoubleBuffered(true); + SetFont(wxGetApp().normal_font()); + + auto main_sizer = new wxBoxSizer(wxVERTICAL); + const int em = wxGetApp().em_unit(); + + m_bmp_del = ScalableBitmap(this, "remove_copies"); + m_bmp_add = ScalableBitmap(this, "add_copies"); + + auto option_sizer = new wxBoxSizer(wxVERTICAL); + + 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); + + auto editor_sz = wxSize(4*em, wxDefaultCoord); + + auto ID_RADIO_BUTTON = wxWindow::NewControlId(1); + + wxRadioButton* rb_by_layers = new wxRadioButton(this, ID_RADIO_BUTTON, "", wxDefaultPosition, wxDefaultSize, wxRB_GROUP); + rb_by_layers->Bind(wxEVT_RADIOBUTTON, [this](wxCommandEvent& event) { m_sequence.is_mm_intervals = false; }); + rb_by_layers->SetValue(!m_sequence.is_mm_intervals); + + wxStaticText* st_by_layers = new wxStaticText(this, wxID_ANY, _(L("layers"))); + m_interval_by_layers = new wxTextCtrl(this, wxID_ANY, + wxString::Format("%d", m_sequence.interval_by_layers), + wxDefaultPosition, editor_sz); + m_interval_by_layers->Bind(wxEVT_TEXT, [this, rb_by_layers](wxEvent&) + { + wxString str = m_interval_by_layers->GetValue(); + if (str.IsEmpty()) { + m_interval_by_layers->SetValue(wxString::Format("%d", m_sequence.interval_by_layers)); + return; + } + + int val = wxAtoi(str); + if (val < 1) { + m_interval_by_layers->SetValue("1"); + val = 1; + } + + if (m_sequence.interval_by_layers == val) + return; + + m_sequence.interval_by_layers = val; + + m_sequence.is_mm_intervals = false; + rb_by_layers->SetValue(true); + }); + + m_intervals_grid_sizer->Add(rb_by_layers, 0, wxALIGN_CENTER_VERTICAL); + m_intervals_grid_sizer->Add(m_interval_by_layers,0, wxALIGN_CENTER_VERTICAL); + m_intervals_grid_sizer->Add(st_by_layers,0, wxALIGN_CENTER_VERTICAL); + + wxRadioButton* rb_by_mm = new wxRadioButton(this, ID_RADIO_BUTTON, ""); + rb_by_mm->Bind(wxEVT_RADIOBUTTON, [this](wxEvent&) { m_sequence.is_mm_intervals = true; }); + rb_by_mm->SetValue(m_sequence.is_mm_intervals); + + wxStaticText* st_by_mm = new wxStaticText(this, wxID_ANY, _(L("mm"))); + m_interval_by_mm = new wxTextCtrl(this, wxID_ANY, + double_to_string(sequence.interval_by_mm), + wxDefaultPosition, editor_sz, wxTE_PROCESS_ENTER); + + auto change_value = [this]() + { + wxString str = m_interval_by_mm->GetValue(); + if (str.IsEmpty()) { + m_interval_by_mm->SetValue(wxString::Format("%d", m_sequence.interval_by_mm)); + return; + } + + str.Replace(",", ".", false); + double val; + if (str == "." || !str.ToCDouble(&val) || val <= 0.0) + val = 3.0; // default value + + if (fabs(m_sequence.interval_by_layers - val) < 0.001) + return; + + m_sequence.interval_by_mm = val; + }; + + m_interval_by_mm->Bind(wxEVT_TEXT, [this, rb_by_mm](wxEvent&) + { + m_sequence.is_mm_intervals = true; + rb_by_mm->SetValue(true); + }); + + m_interval_by_mm->Bind(wxEVT_KILL_FOCUS, [change_value](wxFocusEvent& event) + { + change_value(); + event.Skip(); + }); + + 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(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_sizer = new wxStaticBoxSizer(extruders_box, wxVERTICAL); + + m_extruders_grid_sizer = new wxFlexGridSizer(3, 5, em); + + apply_extruder_sequence(); + + extruders_box_sizer->Add(m_extruders_grid_sizer, 0, wxALL, em); + option_sizer->Add(extruders_box_sizer, 0, wxEXPAND | wxTOP, em); + + main_sizer->Add(option_sizer, 0, wxEXPAND | wxALL, em); + + wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxOK | wxCANCEL); + main_sizer->Add(buttons, 0, wxEXPAND | wxRIGHT | wxBOTTOM, em); + + SetSizer(main_sizer); + main_sizer->SetSizeHints(this); + + /* For this moment min sizes for dialog and its sizer are calculated. + * If we left them, it can cause a problem with layouts during deleting of extruders + */ + if (m_sequence.extruders.size()>1) + { + wxSize sz = wxSize(-1, 10 * em); + SetMinSize(sz); + GetSizer()->SetMinSize(sz); + } +} + +void ExtruderSequenceDialog::apply_extruder_sequence() +{ + m_extruders_grid_sizer->Clear(true); + + for (size_t extruder=0; extruder < m_sequence.extruders.size(); ++extruder) + { + wxBitmapComboBox* extruder_selector = nullptr; + apply_extruder_selector(&extruder_selector, this, "", wxDefaultPosition, wxSize(15*wxGetApp().em_unit(), -1)); + extruder_selector->SetSelection(m_sequence.extruders[extruder]); + + extruder_selector->Bind(wxEVT_COMBOBOX, [this, extruder_selector, extruder](wxCommandEvent& evt) + { + m_sequence.extruders[extruder] = extruder_selector->GetSelection(); + evt.StopPropagation(); + }); + + auto del_btn = new ScalableButton(this, wxID_ANY, m_bmp_del); + del_btn->SetToolTip(_(L("Remove extruder from sequence"))); + if (m_sequence.extruders.size()==1) + del_btn->Disable(); + + del_btn->Bind(wxEVT_BUTTON, [this, extruder](wxEvent&) { + m_sequence.delete_extruder(extruder); + apply_extruder_sequence(); + }); + + auto add_btn = new ScalableButton(this, wxID_ANY, m_bmp_add); + add_btn->SetToolTip(_(L("Add extruder to sequence"))); + + add_btn->Bind(wxEVT_BUTTON, [this, extruder](wxEvent&) { + m_sequence.add_extruder(extruder); + apply_extruder_sequence(); + }); + + m_extruders_grid_sizer->Add(extruder_selector, 0, wxALIGN_CENTER_VERTICAL); + m_extruders_grid_sizer->Add(del_btn, 0, wxALIGN_CENTER_VERTICAL); + m_extruders_grid_sizer->Add(add_btn, 0, wxALIGN_CENTER_VERTICAL); + } + m_extruders_grid_sizer->ShowItems(true); // show items hidden in apply_extruder_selector() + + Fit(); + Refresh(); +} + +void ExtruderSequenceDialog::on_dpi_changed(const wxRect& suggested_rect) +{ + SetFont(wxGetApp().normal_font()); + + m_bmp_add.msw_rescale(); + m_bmp_del.msw_rescale(); + + const int em = em_unit(); + + m_intervals_grid_sizer->SetHGap(em); + m_intervals_grid_sizer->SetVGap(em); + m_extruders_grid_sizer->SetHGap(em); + m_extruders_grid_sizer->SetVGap(em); + + msw_buttons_rescale(this, em, { wxID_OK, wxID_CANCEL }); + + // wxSize size = get_size(); + // SetMinSize(size); + + Fit(); + Refresh(); +} + +} +} + + diff --git a/src/slic3r/GUI/ExtruderSequenceDialog.hpp b/src/slic3r/GUI/ExtruderSequenceDialog.hpp new file mode 100644 index 0000000000..97d57ef120 --- /dev/null +++ b/src/slic3r/GUI/ExtruderSequenceDialog.hpp @@ -0,0 +1,45 @@ +#ifndef slic3r_GUI_ExtruderSequenceDialog_hpp_ +#define slic3r_GUI_ExtruderSequenceDialog_hpp_ + +#include "GUI_Utils.hpp" +#include "DoubleSlider.hpp" + +class wxTextCtrl; +class wxFlexGridSizer; + +namespace Slic3r { +namespace GUI { + +// ---------------------------------------------------------------------------- +// ExtruderSequenceDialog: a node inside ObjectDataViewModel +// ---------------------------------------------------------------------------- + +class ExtruderSequenceDialog: public DPIDialog +{ + ScalableBitmap m_bmp_del; + ScalableBitmap m_bmp_add; + DoubleSlider::ExtrudersSequence m_sequence; + + wxTextCtrl* m_interval_by_layers {nullptr}; + wxTextCtrl* m_interval_by_mm {nullptr}; + + wxFlexGridSizer* m_intervals_grid_sizer {nullptr}; + wxFlexGridSizer* m_extruders_grid_sizer {nullptr}; +public: + ExtruderSequenceDialog(const DoubleSlider::ExtrudersSequence& sequence); + + ~ExtruderSequenceDialog() {} + + DoubleSlider::ExtrudersSequence GetValue() { return m_sequence; } + +protected: + void apply_extruder_sequence(); + void on_dpi_changed(const wxRect& suggested_rect) override; + +}; + +} +} + + +#endif // slic3r_GUI_ExtruderSequenceDialog_hpp_ diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp index a8953f166e..bc6124b80a 100644 --- a/src/slic3r/GUI/Field.cpp +++ b/src/slic3r/GUI/Field.cpp @@ -3,13 +3,17 @@ #include "I18N.hpp" #include "Field.hpp" #include "wxExtensions.hpp" +#include "Plater.hpp" +#include "MainFrame.hpp" #include "libslic3r/PrintConfig.hpp" #include #include #include +#include #include +#include "OG_CustomCtrl.hpp" #ifdef __WXOSX__ #define wxOSX true @@ -48,14 +52,28 @@ wxString double_to_string(double const value, const int max_precision /*= 4*/) return s; } +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,10 +93,45 @@ void Field::PostInitialize() // initialize m_unit_value m_em_unit = em_unit(m_parent); + parent_is_custom_ctrl = dynamic_cast(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_thinner() { return 4; } + void Field::on_kill_focus() { // call the registered function if it is available @@ -163,11 +216,8 @@ 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(); - show_error(m_parent, wxString::Format(_(L("%s doesn't support percentage")), label)); + 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); break; @@ -232,14 +282,16 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true 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 = wxString::Format(_(L("Do you mean %s%% instead of %s %s?\n" + 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); + "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) { - set_value(wxString::Format("%s%%", stVal), false/*true*/); + set_value(from_u8((boost::format("%s%%") % stVal).str()), false/*true*/); str += "%%"; } + else + set_value(stVal, false); // it's no needed but can be helpful, when inputted value contained "," instead of "." } } @@ -250,16 +302,26 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true } } +void Field::msw_rescale() +{ + // update em_unit value + m_em_unit = em_unit(m_parent); +} + +void Field::sys_color_changed() +{ +} + template bool is_defined_input_value(wxWindow* win, const ConfigOptionType& type) { - if (static_cast(win)->GetValue().empty() && type != coString && type != coStrings) + if (!win || (static_cast(win)->GetValue().empty() && type != coString && type != coStrings)) return false; return true; } void TextCtrl::BUILD() { - auto size = wxSize(wxDefaultSize); + 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.width >= 0) size.SetWidth(m_opt.width*m_em_unit); @@ -308,7 +370,11 @@ void TextCtrl::BUILD() { const long style = m_opt.multiline ? wxTE_MULTILINE : wxTE_PROCESS_ENTER/*0*/; auto temp = new wxTextCtrl(m_parent, wxID_ANY, text_value, wxDefaultPosition, size, style); - 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. @@ -350,16 +416,28 @@ void TextCtrl::BUILD() { temp->Bind(wxEVT_KILL_FOCUS, ([this, temp](wxEvent& e) { e.Skip(); +#ifdef __WXOSX__ + // OSX issue: For some unknown reason wxEVT_KILL_FOCUS is emitted twice in a row in some cases + // (like when information dialog is shown during an update of the option value) + // Thus, suppress its second call + if (bKilledFocus) + return; + bKilledFocus = true; +#endif // __WXOSX__ + #if !defined(__WXGTK__) temp->GetToolTip()->Enable(true); #endif // __WXGTK__ - if (bEnterPressed) { + if (bEnterPressed) bEnterPressed = false; - return; - } - propagate_value(); + else + propagate_value(); +#ifdef __WXOSX__ + // After processing of KILL_FOCUS event we should to invalidate a bKilledFocus flag + bKilledFocus = false; +#endif // __WXOSX__ }), temp->GetId()); - +/* // select all text using Ctrl+A temp->Bind(wxEVT_CHAR, ([temp](wxKeyEvent& event) { @@ -367,7 +445,7 @@ void TextCtrl::BUILD() { temp->SetSelection(-1, -1); //select all event.Skip(); })); - +*/ // recast as a wxWindow to fit the calling convention window = dynamic_cast(temp); } @@ -406,10 +484,12 @@ bool TextCtrl::value_was_changed() void TextCtrl::propagate_value() { - if (is_defined_input_value(window, m_opt.type) && value_was_changed()) - on_change_field(); - else + if (!is_defined_input_value(window, m_opt.type) ) + // on_kill_focus() cause a call of OptionsGroup::reload_config(), + // Thus, do it only when it's really needed (when undefined value was input) on_kill_focus(); + else if (value_was_changed()) + on_change_field(); } void TextCtrl::set_value(const boost::any& value, bool change_event/* = false*/) { @@ -458,14 +538,21 @@ boost::any& TextCtrl::get_value() void TextCtrl::msw_rescale() { Field::msw_rescale(); - auto size = wxSize(wxDefaultSize); - if (m_opt.height >= 0) size.SetHeight(m_opt.height*m_em_unit); + auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord); + + if (m_opt.height >= 0) + size.SetHeight(m_opt.height*m_em_unit); + else if (parent_is_custom_ctrl && opt_height > 0) + size.SetHeight(lround(opt_height*m_em_unit)); if (m_opt.width >= 0) size.SetWidth(m_opt.width*m_em_unit); if (size != wxDefaultSize) { wxTextCtrl* field = dynamic_cast(window); - field->SetMinSize(size); + if (parent_is_custom_ctrl) + field->SetSize(size); + else + field->SetMinSize(size); } } @@ -476,7 +563,7 @@ void TextCtrl::disable() { dynamic_cast(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(); }; @@ -565,7 +652,7 @@ void CheckBox::msw_rescale() void SpinCtrl::BUILD() { - auto size = wxSize(wxDefaultSize); + 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.width >= 0) size.SetWidth(m_opt.width*m_em_unit); @@ -606,9 +693,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.) @@ -695,18 +790,27 @@ void SpinCtrl::msw_rescale() Field::msw_rescale(); wxSpinCtrl* field = dynamic_cast(window); - field->SetMinSize(wxSize(-1, 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(m_width * m_em_unit, -1); + 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__ @@ -714,11 +818,11 @@ void Choice::BUILD() { * so ToolTip doesn't shown. * Next workaround helps to solve this problem */ - temp = new wxBitmapComboBox(); + temp = new choice_ctrl(); temp->SetTextCtrlStyle(wxTE_READONLY); temp->Create(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr); #else - temp = new wxBitmapComboBox(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxCB_READONLY); + temp = new choice_ctrl(m_parent, wxID_ANY, wxString(""), wxDefaultPosition, size, 0, nullptr, wxCB_READONLY); #endif //__WXOSX__ } @@ -741,7 +845,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, @@ -768,7 +873,7 @@ void Choice::BUILD() { } double old_val = !m_value.empty() ? boost::any_cast(m_value) : -99999; - if (is_defined_input_value(window, m_opt.type)) { + if (is_defined_input_value(window, m_opt.type)) { if (fabs(old_val - boost::any_cast(get_value())) <= 0.0001) return; else @@ -791,7 +896,7 @@ void Choice::set_selection() wxString text_value = wxString(""); - wxBitmapComboBox* field = dynamic_cast(window); + choice_ctrl* field = dynamic_cast(window); switch (m_opt.type) { case coFloat: case coPercent: { @@ -861,7 +966,7 @@ void Choice::set_value(const std::string& value, bool change_event) //! Redunda ++idx; } - wxBitmapComboBox* field = dynamic_cast(window); + choice_ctrl* field = dynamic_cast(window); idx == m_opt.enum_values.size() ? field->SetValue(value) : field->SetSelection(idx); @@ -873,7 +978,7 @@ void Choice::set_value(const boost::any& value, bool change_event) { m_disable_change_event = !change_event; - wxBitmapComboBox* field = dynamic_cast(window); + choice_ctrl* field = dynamic_cast(window); switch (m_opt.type) { case coInt: @@ -905,7 +1010,7 @@ void Choice::set_value(const boost::any& value, bool change_event) } case coEnum: { int val = boost::any_cast(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; @@ -949,12 +1054,32 @@ void Choice::set_values(const std::vector& values) // # it looks that Clear() also clears the text field in recent wxWidgets versions, // # but we want to preserve it + auto ww = dynamic_cast(window); + auto value = ww->GetValue(); + ww->Clear(); + ww->Append(""); + 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(window); auto value = ww->GetValue(); ww->Clear(); ww->Append(""); - for (auto el : values) - ww->Append(wxString(el)); + for (const auto &el : values) + ww->Append(el); ww->SetValue(value); m_disable_change_event = false; @@ -962,7 +1087,7 @@ void Choice::set_values(const std::vector& values) boost::any& Choice::get_value() { - wxBitmapComboBox* field = dynamic_cast(window); + choice_ctrl* field = dynamic_cast(window); wxString ret_str = field->GetValue(); @@ -975,7 +1100,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]; @@ -987,10 +1112,12 @@ boost::any& Choice::get_value() else m_value = static_cast(0); } - if (m_opt_id.compare("fill_pattern") == 0) - m_value = static_cast(ret_enum); + else if (m_opt_id.compare("ironing_type") == 0) + m_value = static_cast(ret_enum); else if (m_opt_id.compare("gcode_flavor") == 0) m_value = static_cast(ret_enum); + else if (m_opt_id.compare("machine_limits_usage") == 0) + m_value = static_cast(ret_enum); else if (m_opt_id.compare("support_material_pattern") == 0) m_value = static_cast(ret_enum); else if (m_opt_id.compare("seam_position") == 0) @@ -1001,6 +1128,8 @@ boost::any& Choice::get_value() m_value = static_cast(ret_enum); else if (m_opt_id.compare("support_pillar_connection_mode") == 0) m_value = static_cast(ret_enum); + else if (m_opt_id == "printhost_authorization_type") + m_value = static_cast(ret_enum); } else if (m_opt.gui_type == "f_enum_open") { const int ret_enum = field->GetSelection(); @@ -1018,23 +1147,26 @@ boost::any& Choice::get_value() return m_value; } +void Choice::enable() { dynamic_cast(window)->Enable(); }; +void Choice::disable() { dynamic_cast(window)->Disable(); }; + void Choice::msw_rescale() { Field::msw_rescale(); - wxBitmapComboBox* field = dynamic_cast(window); - - const wxString selection = field->GetString(field->GetSelection()); + choice_ctrl* field = dynamic_cast(window); +#ifdef __WXOSX__ + const wxString selection = field->GetValue();// field->GetString(index); /* To correct scaling (set new controll size) of a wxBitmapCombobox * we need to refill control with new bitmaps. So, in our case : - * 1. clear conrol + * 1. clear control * 2. add content * 3. add scaled "empty" bitmap to the at least one item */ field->Clear(); wxSize size(wxDefaultSize); - size.SetWidth((m_opt.width > 0 ? m_opt.width : m_width) * m_em_unit); + size.SetWidth((m_opt.width > 0 ? m_opt.width : def_width_wider()) * m_em_unit); // Set rescaled min height to correct layout field->SetMinSize(wxSize(-1, int(1.5f*field->GetFont().GetPixelSize().y + 0.5f))); @@ -1061,11 +1193,21 @@ void Choice::msw_rescale() 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() { - auto size = wxSize(wxDefaultSize); + 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.width >= 0) size.SetWidth(m_opt.width*m_em_unit); @@ -1077,6 +1219,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); @@ -1137,7 +1281,18 @@ void ColourPicker::msw_rescale() { Field::msw_rescale(); - wxColourPickerCtrl* field = dynamic_cast(window); + wxColourPickerCtrl* field = dynamic_cast(window); + auto size = wxSize(def_width() * m_em_unit, wxDefaultCoord); + if (m_opt.height >= 0) + size.SetHeight(m_opt.height * m_em_unit); + else if (parent_is_custom_ctrl && opt_height > 0) + size.SetHeight(lround(opt_height * m_em_unit)); + if (m_opt.width >= 0) size.SetWidth(m_opt.width * m_em_unit); + if (parent_is_custom_ctrl) + field->SetSize(size); + else + field->SetMinSize(size); + if (field->GetColour() == wxTransparentColour) set_undef_value(field); } @@ -1156,6 +1311,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()); @@ -1173,9 +1331,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()); @@ -1193,18 +1348,37 @@ void PointCtrl::msw_rescale() { Field::msw_rescale(); - const wxSize field_size(4 * m_em_unit, -1); + wxSize field_size(4 * m_em_unit, -1); - x_textctrl->SetMinSize(field_size); - y_textctrl->SetMinSize(field_size); + 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(); + + return boost::any_cast(m_value) != boost::any_cast(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) @@ -1236,8 +1410,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); } diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index b3cbf573f6..b4bcf9f33b 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -87,6 +87,8 @@ protected: void on_set_focus(wxEvent& event); /// Call the attached on_change method. void on_change_field(); + +public: /// Call the attached m_back_to_initial_value method. void on_back_to_initial_value(); /// Call the attached m_back_to_sys_value method. @@ -119,6 +121,9 @@ public: const t_config_option_key m_opt_id;//! {""}; int m_opt_idx = 0; + double opt_height{ 0.0 }; + bool parent_is_custom_ctrl{ false }; + /// Sets a value for this control. /// subclasses should overload with a specific version /// Postcondition: Method does not fire the on_change event. @@ -140,12 +145,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 +168,6 @@ public: bool set_undo_bitmap(const ScalableBitmap *bmp) { if (m_undo_bitmap != bmp) { m_undo_bitmap = bmp; - m_Undo_btn->SetBitmap_(*bmp); return true; } return false; @@ -175,33 +176,21 @@ public: bool set_undo_to_sys_bitmap(const ScalableBitmap *bmp) { if (m_undo_to_sys_bitmap != bmp) { m_undo_to_sys_bitmap = bmp; - m_Undo_to_sys_btn->SetBitmap_(*bmp); return true; } return false; } bool set_label_colour(const wxColour *clr) { - if (m_Label == nullptr) return false; if (m_label_color != clr) { m_label_color = clr; - m_Label->SetForegroundColour(*clr); - m_Label->Refresh(true); } return false; } - bool set_label_colour_force(const wxColour *clr) { - if (m_Label == nullptr) return false; - m_Label->SetForegroundColour(*clr); - m_Label->Refresh(true); - return false; - } - bool set_undo_tooltip(const wxString *tip) { if (m_undo_tooltip != tip) { m_undo_tooltip = tip; - m_Undo_btn->SetToolTip(*tip); return true; } return false; @@ -210,43 +199,46 @@ 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() { - m_Undo_to_sys_btn->msw_rescale(); - m_Undo_btn->msw_rescale(); - - // update em_unit value - m_em_unit = em_unit(m_parent); - } + virtual void msw_rescale(); + void sys_color_changed(); bool get_enter_pressed() const { return bEnterPressed; } void set_enter_pressed(bool pressed) { bEnterPressed = pressed; } + // Values of width to alignments of fields + static int def_width() ; + 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 @@ -275,12 +267,17 @@ class TextCtrl : public Field { bool bChangedValueEvent = true; void change_field_value(wxEvent& event); #endif //__WXGTK__ + +#ifdef __WXOSX__ + bool bKilledFocus = false; +#endif // __WXOSX__ + public: TextCtrl(const ConfigOptionDef& opt, const t_config_option_key& id) : Field(opt, id) {} TextCtrl(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : Field(parent, opt, id) {} ~TextCtrl() {} - void BUILD(); + void BUILD() override; bool value_was_changed(); // Propagate value from field to the OptionGroupe and Config after kill_focus/ENTER void propagate_value(); @@ -299,9 +296,9 @@ public: void msw_rescale() override; - virtual void enable(); - virtual void disable(); - virtual wxWindow* getWindow() { return window; } + void enable() override; + void disable() override; + wxWindow* getWindow() override { return window; } }; class CheckBox : public Field { @@ -377,7 +374,6 @@ public: class Choice : public Field { using Field::Field; - int m_width{ 15 }; public: Choice(const ConfigOptionDef& opt, const t_config_option_key& id) : Field(opt, id) {} Choice(wxWindow* parent, const ConfigOptionDef& opt, const t_config_option_key& id) : Field(parent, opt, id) {} @@ -395,12 +391,13 @@ public: void set_value(const std::string& value, bool change_event = false); void set_value(const boost::any& value, bool change_event = false); void set_values(const std::vector &values); + void set_values(const wxArrayString &values); boost::any& get_value() override; void msw_rescale() override; - void enable() override { dynamic_cast(window)->Enable(); }; - void disable() override{ dynamic_cast(window)->Disable(); }; + void enable() override ;//{ dynamic_cast(window)->Enable(); }; + void disable() override;//{ dynamic_cast(window)->Disable(); }; wxWindow* getWindow() override { return window; } }; @@ -442,6 +439,7 @@ 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); @@ -457,6 +455,7 @@ public: x_textctrl->Disable(); y_textctrl->Disable(); } wxSizer* getSizer() override { return sizer; } + wxWindow* getWindow() override { return dynamic_cast(x_textctrl); } }; class StaticText : public Field { diff --git a/src/slic3r/GUI/FirmwareDialog.cpp b/src/slic3r/GUI/FirmwareDialog.cpp index fe7ff4e5de..879e7fe34e 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 0000000000..4be9f5fbd2 --- /dev/null +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -0,0 +1,2864 @@ +#include "libslic3r/libslic3r.h" +#include "GCodeViewer.hpp" + +#if ENABLE_GCODE_VIEWER +#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 + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace Slic3r { +namespace GUI { + +static unsigned char buffer_id(EMoveType type) { + return static_cast(type) - static_cast(EMoveType::Retract); +} + +static EMoveType buffer_type(unsigned char id) { + return static_cast(static_cast(EMoveType::Retract) + id); +} + +static std::array decode_color(const std::string& color) { + static const float INV_255 = 1.0f / 255.0f; + + std::array 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> decode_colors(const std::vector& colors) { + std::vector> 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 +{ + 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 + 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; + } + 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 = std::vector(); + paths = std::vector(); + render_paths = std::vector(); +} + +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 + 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 }); +} + +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(static_cast(global_t), 0, color_max_idx); + const size_t color_high_idx = std::clamp(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(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()) * Geometry::assemble_transform(m_model.get_bounding_box().size()[2] * Vec3d::UnitZ(), { M_PI, 0.0, 0.0 })).cast(); +} + +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(cnv_size.get_width()), static_cast(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::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::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::Travel_Colors {{ + { 0.219f, 0.282f, 0.609f }, // Move + { 0.112f, 0.422f, 0.103f }, // Extrude + { 0.505f, 0.064f, 0.028f } // Retract +}}; + +const std::vector 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; +} + +void GCodeViewer::refresh(const GCodeProcessor::Result& gcode_result, const std::vector& 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); + + // 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::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + // update buffers' render paths + refresh_render_paths(false, false); + + log_memory_used("Refreshed G-code extrusion paths, "); +} + +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(); + m_extruders_count = 0; + m_extruder_ids = std::vector(); + 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(); + m_time_statistics.reset(); + m_time_estimate_mode = PrintEstimatedTimeStatistics::ETimeMode::Normal; + +#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::Extrude: { + buffer.shader = "gouraud_light"; + break; + } + case EMoveType::Travel: { + buffer.shader = "toolpaths_lines"; + break; + } + } + } + + // initializes tool marker + m_sequential_view.marker.init(); + + // initializes point sizes + std::array point_sizes; + ::glGetIntegerv(GL_ALIASED_POINT_SIZE_RANGE, point_sizes.data()); + m_detected_point_sizes = { static_cast(point_sizes[0]), static_cast(point_sizes[1]) }; + 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(first) - static_cast(m_sequential_view.last_current.first); + int last_diff = static_cast(last) - static_cast(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(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(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(Preview::OptionType::Travel), is_toolpath_move_type_visible(EMoveType::Travel)); + flags = set_flag(flags, static_cast(Preview::OptionType::Retractions), is_toolpath_move_type_visible(EMoveType::Retract)); + flags = set_flag(flags, static_cast(Preview::OptionType::Unretractions), is_toolpath_move_type_visible(EMoveType::Unretract)); + flags = set_flag(flags, static_cast(Preview::OptionType::ToolChanges), is_toolpath_move_type_visible(EMoveType::Tool_change)); + flags = set_flag(flags, static_cast(Preview::OptionType::ColorChanges), is_toolpath_move_type_visible(EMoveType::Color_change)); + flags = set_flag(flags, static_cast(Preview::OptionType::PausePrints), is_toolpath_move_type_visible(EMoveType::Pause_Print)); + flags = set_flag(flags, static_cast(Preview::OptionType::CustomGCodes), is_toolpath_move_type_visible(EMoveType::Custom_GCode)); + flags = set_flag(flags, static_cast(Preview::OptionType::Shells), m_shells.visible); + flags = set_flag(flags, static_cast(Preview::OptionType::ToolMarker), m_sequential_view.marker.is_visible()); + flags = set_flag(flags, static_cast(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(Preview::OptionType::Travel))); + set_toolpath_move_type_visible(EMoveType::Retract, is_flag_set(static_cast(Preview::OptionType::Retractions))); + set_toolpath_move_type_visible(EMoveType::Unretract, is_flag_set(static_cast(Preview::OptionType::Unretractions))); + set_toolpath_move_type_visible(EMoveType::Tool_change, is_flag_set(static_cast(Preview::OptionType::ToolChanges))); + set_toolpath_move_type_visible(EMoveType::Color_change, is_flag_set(static_cast(Preview::OptionType::ColorChanges))); + set_toolpath_move_type_visible(EMoveType::Pause_Print, is_flag_set(static_cast(Preview::OptionType::PausePrints))); + set_toolpath_move_type_visible(EMoveType::Custom_GCode, is_flag_set(static_cast(Preview::OptionType::CustomGCodes))); + m_shells.visible = is_flag_set(static_cast(Preview::OptionType::Shells)); + m_sequential_view.marker.set_visible(is_flag_set(static_cast(Preview::OptionType::ToolMarker))); + enable_legend(is_flag_set(static_cast(Preview::OptionType::Legend))); +} + +void GCodeViewer::set_layers_z_range(const std::array& 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 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 vertices = std::vector(buffer.vertices.count * floats_per_vertex); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, buffer.vertices.id)); + glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, 0, buffer.vertices.data_size_bytes(), vertices.data())); + 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(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 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(); + + for (size_t i = 0; i < buffer.render_paths.size(); ++i) { + // get paths segments from buffer paths + const RenderPath& render_path = buffer.render_paths[i]; + 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 out_vertices; + std::vector out_normals; + using Triangle = std::array; + std::vector out_triangles; + for (size_t j = 0; j < render_path.offsets.size(); ++j) { + unsigned int start = static_cast(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(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(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]); + } + } + + 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::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()); + else { + if (move.type == EMoveType::Extrude && move.width != 0.0f && move.height != 0.0f) + m_paths_bounding_box.merge(move.position.cast()); + } + } + + // max bounding box (account for tool marker) + m_max_bounding_box = m_paths_bounding_box; + m_max_bounding_box.merge(m_paths_bounding_box.max + m_sequential_view.marker.get_bounding_box().size()[2] * Vec3d::UnitZ()); + + auto log_memory_usage = [this](const std::string& label, const std::vector>& vertices, const std::vector& indices) { + long long vertices_size = 0; + for (size_t i = 0; i < vertices.size(); ++i) { + vertices_size += SLIC3R_STDVEC_MEMSIZE(vertices[i], float); + } + long long 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& 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(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& 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(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(buffer_indices.size())); + } + + // add current index + buffer_indices.push_back(static_cast(buffer_indices.size())); + last_path.last = { index_buffer_id, buffer_indices.size() - 1, move_id, curr.position }; + }; + + // format data into the buffers to be rendered as solid + auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer, + std::vector& buffer_vertices, size_t move_id) { + static Vec3f prev_dir; + static Vec3f prev_up; + static float prev_length; + auto store_vertex = [](std::vector& buffer_vertices, const Vec3f& position, const Vec3f& normal) { + // append position + for (int j = 0; j < 3; ++j) { + buffer_vertices.push_back(position[j]); + } + // append normal + for (int j = 0; j < 3; ++j) { + buffer_vertices.push_back(normal[j]); + } + }; + auto extract_position_at = [](const std::vector& vertices, size_t id) { + return Vec3f(vertices[id + 0], vertices[id + 1], vertices[id + 2]); + }; + auto update_position_at = [](std::vector& vertices, size_t id, const Vec3f& position) { + vertices[id + 0] = position[0]; + vertices[id + 1] = position[1]; + vertices[id + 2] = position[2]; + }; + + if (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(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(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> vertices(m_buffers.size()); + std::vector indices(m_buffers.size()); +#if ENABLE_SHOW_OPTION_POINT_LAYERS + std::vector options_zs; +#endif // ENABLE_SHOW_OPTION_POINT_LAYERS + + // 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& 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; + } + } + +#if ENABLE_SHOW_OPTION_POINT_LAYERS + EMoveType type = buffer_type(id); + if (type == EMoveType::Pause_Print || type == EMoveType::Custom_GCode) { + const float* const last_z = options_zs.empty() ? nullptr : &options_zs.back(); + float z = static_cast(curr.position[2]); + if (last_z == nullptr || z < *last_z - EPSILON || *last_z + EPSILON < z) + options_zs.emplace_back(curr.position[2]); + } +#endif // ENABLE_SHOW_OPTION_POINT_LAYERS + } + + 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& buffer_vertices = vertices[i]; + buffer.vertices.count = buffer_vertices.size() / buffer.vertices.vertex_size_floats(); +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.vertices_gpu_size += buffer_vertices.size() * sizeof(float); + m_statistics.max_vertices_in_vertex_buffer = std::max(m_statistics.max_vertices_in_vertex_buffer, static_cast(buffer.vertices.count)); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + glsafe(::glGenBuffers(1, &buffer.vertices.id)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, buffer.vertices.id)); + glsafe(::glBufferData(GL_ARRAY_BUFFER, buffer_vertices.size() * sizeof(float), buffer_vertices.data(), GL_STATIC_DRAW)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + } + + // dismiss vertices data, no more needed + std::vector>().swap(vertices); + + // toolpaths data -> extract indices from result + // ensure that at least one index buffer is defined for each multibuffer + for (auto i : indices) { + i.push_back(IndexBuffer()); + } + // 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(); + } + // variable used to keep track of the current size (in vertices) of the vertex buffer + size_t curr_buffer_vertices_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()); + + static const size_t THRESHOLD = 1024 * 1024 * 128; + // 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() >= THRESHOLD - static_cast(buffer.indices_per_segment())) { + buffer_indices.push_back(IndexBuffer()); + if (curr.type == EMoveType::Extrude || curr.type == EMoveType::Travel) { + if (!(prev.type != curr.type || !buffer.paths.back().matches(curr))) { + Path& last_path = buffer.paths.back(); + size_t delta_id = last_path.last.i_id - last_path.first.i_id; + + // move indices of the last path from the previous into the new index buffer + IndexBuffer& src_buffer = buffer_indices[buffer_indices.size() - 2]; + IndexBuffer& dst_buffer = buffer_indices[buffer_indices.size() - 1]; + std::move(src_buffer.begin() + last_path.first.i_id, src_buffer.end(), std::back_inserter(dst_buffer)); + src_buffer.erase(src_buffer.begin() + last_path.first.i_id, src_buffer.end()); + + // updates path indices + last_path.first.b_id = buffer_indices.size() - 1; + last_path.first.i_id = 0; + last_path.last.b_id = buffer_indices.size() - 1; + last_path.last.i_id = delta_id; + } + } + } + + switch (buffer.render_primitive_type) + { + case TBuffer::ERenderPrimitiveType::Point: { + add_indices_as_point(curr, buffer, static_cast(buffer_indices.size()) - 1, buffer_indices.back(), i); + break; + } + case TBuffer::ERenderPrimitiveType::Line: { + add_indices_as_line(prev, curr, buffer, static_cast(buffer_indices.size()) - 1, buffer_indices.back(), i); + break; + } + case TBuffer::ERenderPrimitiveType::Triangle: { + add_indices_as_solid(prev, curr, buffer, curr_buffer_vertices_size, static_cast(buffer_indices.size()) - 1, buffer_indices.back(), i); + break; + } + } + } + + if (progress_dialog != nullptr) { + progress_dialog->Update(100, ""); + progress_dialog->Fit(); + } + + log_memory_usage("Loaded G-code generated indices buffers, ", vertices, indices); + + // toolpaths data -> send indices data to gpu + for (size_t i = 0; i < m_buffers.size(); ++i) { + TBuffer& buffer = m_buffers[i]; + + for (size_t j = 0; j < indices[i].size(); ++j) { + const IndexBuffer& buffer_indices = indices[i][j]; + buffer.indices.push_back(IBuffer()); + IBuffer& ibuffer = buffer.indices.back(); + ibuffer.count = buffer_indices.size(); +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.indices_gpu_size += ibuffer.count * sizeof(unsigned int); + m_statistics.max_indices_in_index_buffer = std::max(m_statistics.max_indices_in_index_buffer, static_cast(ibuffer.count)); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (ibuffer.count > 0) { + 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 extrude_buffer_id = buffer_id(EMoveType::Extrude); + const MultiIndexBuffer& extrude_buffer_indices = indices[extrude_buffer_id]; + for (size_t i = 0; i < extrude_buffer_indices.size(); ++i) { + m_statistics.extrude_segments_count = extrude_buffer_indices[i].size() / m_buffers[extrude_buffer_id].indices_per_segment(); + } +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + // dismiss indices data, no more needed + std::vector().swap(indices); + + // layers zs / roles / extruder ids / cp color ids -> extract from result + size_t last_travel_s_id = 0; + for (size_t i = 0; i < m_moves_count; ++i) { + const GCodeProcessor::MoveVertex& move = gcode_result.moves[i]; + if (move.type == EMoveType::Extrude) { + // layers zs + const double* const last_z = m_layers.empty() ? nullptr : &m_layers.get_zs().back(); + double z = static_cast(move.position[2]); + if (last_z == nullptr || z < *last_z - EPSILON || *last_z + EPSILON < z) + m_layers.append(z, { last_travel_s_id, i }); + else + m_layers.get_endpoints().back().last = i; + // extruder ids + m_extruder_ids.emplace_back(move.extruder_id); + // roles + if (i > 0) + m_roles.emplace_back(move.extrusion_role); + } + else if (move.type == EMoveType::Travel) { + if (i - last_travel_s_id > 1 && !m_layers.empty()) + m_layers.get_endpoints().back().last = i; + + last_travel_s_id = i; + } + } + + // set layers z range + if (!m_layers.empty()) + m_layers_z_range = { 0, static_cast(m_layers.size() - 1) }; + +#if ENABLE_SHOW_OPTION_POINT_LAYERS + // 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; + } + } +#endif // ENABLE_SHOW_OPTION_POINT_LAYERS + + // roles -> remove duplicates + std::sort(m_roles.begin(), m_roles.end()); + m_roles.erase(std::unique(m_roles.begin(), m_roles.end()), m_roles.end()); + m_roles.shrink_to_fit(); + + // extruder ids -> remove duplicates + std::sort(m_extruder_ids.begin(), m_extruder_ids.end()); + m_extruder_ids.erase(std::unique(m_extruder_ids.begin(), m_extruder_ids.end()), m_extruder_ids.end()); + m_extruder_ids.shrink_to_fit(); + + log_memory_usage("Loaded G-code generated extrusion paths, ", vertices, indices); + +#if ENABLE_GCODE_VIEWER_STATISTICS + m_statistics.load_time = std::chrono::duration_cast(std::chrono::high_resolution_clock::now() - start_time).count(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + if (progress_dialog != nullptr) + progress_dialog->Destroy(); +} + +void GCodeViewer::load_shells(const Print& print, bool initialized) +{ + if (print.objects().empty()) + // no shells, return + return; + + // adds objects' volumes + int object_id = 0; + for (const PrintObject* obj : print.objects()) { + const ModelObject* model_obj = obj->model_object(); + + std::vector instance_ids(model_obj->instances.size()); + for (int i = 0; i < (int)model_obj->instances.size(); ++i) { + instance_ids[i] = i; + } + + m_shells.volumes.load_object(model_obj, object_id, instance_ids, "object", initialized); + + ++object_id; + } + + if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptFFF) { + // adds wipe tower's volume + double max_z = print.objects()[0]->model_object()->get_model()->bounding_box().max(2); + const PrintConfig& config = print.config(); + size_t extruders_count = config.nozzle_diameter.size(); + if ((extruders_count > 1) && config.wipe_tower && !config.complete_objects) { + const DynamicPrintConfig& print_config = wxGetApp().preset_bundle->prints.get_edited_preset().config; + double layer_height = print_config.opt_float("layer_height"); + double first_layer_height = print_config.get_abs_value("first_layer_height", layer_height); + double nozzle_diameter = print.config().nozzle_diameter.values[0]; + float depth = print.wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).depth; + float brim_width = print.wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).brim_width; + + m_shells.volumes.load_wipe_tower_preview(1000, config.wipe_tower_x, config.wipe_tower_y, config.wipe_tower_width, depth, max_z, config.wipe_tower_rotation_angle, + !print.is_step_done(psWipeTower), brim_width, initialized); + } + } + + // remove modifiers + while (true) { + GLVolumePtrs::iterator it = std::find_if(m_shells.volumes.volumes.begin(), m_shells.volumes.volumes.end(), [](GLVolume* volume) { return volume->is_modifier; }); + if (it != m_shells.volumes.volumes.end()) { + delete (*it); + m_shells.volumes.volumes.erase(it); + } + else + break; + } + + for (GLVolume* volume : m_shells.volumes.volumes) { + volume->zoom_to_volumes = false; + volume->color[3] = 0.25f; + volume->force_native_color = true; + volume->set_render_color(); + } +} + +void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const +{ +#if ENABLE_GCODE_VIEWER_STATISTICS + auto start_time = std::chrono::high_resolution_clock::now(); +#endif // ENABLE_GCODE_VIEWER_STATISTICS + + auto extrusion_color = [this](const Path& path) { + Color color; + switch (m_view_type) + { + case EViewType::FeatureType: { color = Extrusion_Role_Colors[static_cast(path.role)]; break; } + case EViewType::Height: { color = m_extrusions.ranges.height.get_color_at(path.height); break; } + case EViewType::Width: { color = m_extrusions.ranges.width.get_color_at(path.width); break; } + case EViewType::Feedrate: { color = m_extrusions.ranges.feedrate.get_color_at(path.feedrate); break; } + case EViewType::FanSpeed: { color = m_extrusions.ranges.fan_speed.get_color_at(path.fan_speed); break; } + case EViewType::VolumetricRate: { color = m_extrusions.ranges.volumetric_rate.get_color_at(path.volumetric_rate); break; } + case EViewType::Tool: { color = m_tool_colors[path.extruder_id]; break; } +#if ENABLE_SHOW_OPTION_POINT_LAYERS + case EViewType::ColorPrint: { + if (path.cp_color_id >= static_cast(m_tool_colors.size())) { + color = { 0.5f, 0.5f, 0.5f }; +// // complementary color +// color = m_tool_colors[255 - path.cp_color_id]; +// color = { 1.0f - color[0], 1.0f - color[1], 1.0f - color[2] }; + } + else + color = m_tool_colors[path.cp_color_id]; + + break; + } +#else + case EViewType::ColorPrint: { color = m_tool_colors[path.cp_color_id]; break; } +#endif // ENABLE_SHOW_OPTION_POINT_LAYERS + 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> 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(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(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(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(offset * sizeof(unsigned int)), static_cast(sizeof(unsigned int)), static_cast(&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(index * buffer.vertices.vertex_size_bytes()), static_cast(3 * sizeof(float)), static_cast(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 + 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; + } + default: { color = { 0.0f, 0.0f, 0.0f }; break; } + } + + unsigned int ibuffer_id = index_buffer_id; + auto it = std::find_if(buffer->render_paths.begin(), buffer->render_paths.end(), + [color, ibuffer_id](const RenderPath& path) { return path.index_buffer_id == ibuffer_id && path.color == color; }); + if (it == buffer->render_paths.end()) { + it = buffer->render_paths.insert(buffer->render_paths.end(), RenderPath()); + it->color = color; + it->path_id = path_id; + it->index_buffer_id = index_buffer_id; + } + + 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; } + } + it->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(); + + it->offsets.push_back(static_cast((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::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 light_intensity = { 0.25f, 0.70f, 0.75f, 0.75f }; + const Camera& camera = wxGetApp().plater()->get_camera(); + double zoom = camera.get_zoom(); + const std::array& viewport = camera.get_viewport(); + float near_plane_height = camera.get_type() == Camera::Perspective ? static_cast(viewport[3]) / (2.0f * static_cast(2.0 * std::tan(0.5 * Geometry::deg2rad(camera.get_fov())))) : + static_cast(viewport[3]) * 0.0005; + + auto set_uniform_color = [](const std::array& color, GLShaderProgram& shader) { + std::array color4 = { color[0], color[1], color[2], 1.0f }; + shader.set_uniform("uniform_color", color4); + }; + + auto render_as_points = [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(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(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(j), color, *shader); + break; + } + case TBuffer::ERenderPrimitiveType::Line: + { + render_as_lines(buffer, static_cast(j), *shader); + break; + } + case TBuffer::ERenderPrimitiveType::Triangle: + { + render_as_triangles(buffer, static_cast(j), *shader); + break; + } + } + + glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)); + } + + if (has_normals) + glsafe(::glDisableClientState(GL_NORMAL_ARRAY)); + + glsafe(::glDisableClientState(GL_VERTEX_ARRAY)); + glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0)); + + shader->stop_using(); + } + } +} + +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(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& offsets = { 0.0f, 0.0f }, + std::function 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(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(Range_Colors.size()) - 1; i >= 0; --i) { + append_range_item(i, range.min + static_cast(i) * step_size, decimals); + } + } + }; + + auto append_headers = [&imgui](const std::array& texts, const std::array& 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& 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& labels, const std::vector& times, + const std::array& titles, float extra_size = 0.0f) { + const ImGuiStyle& style = ImGui::GetStyle(); + std::array 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& custom_gcode_per_print_z) { + std::vector>> ret; + ret.reserve(custom_gcode_per_print_z.size()); + + for (const auto& item : custom_gcode_per_print_z) { + if (extruder_id + 1 != static_cast(item.extruder)) + continue; + + if (item.type != ColorChange) + continue; + + const std::vector 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& 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 offsets = { 0.0f, 0.0f }; + std::vector labels; + std::vector times; + std::vector 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(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& 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>> cp_values = color_print_ranges(0, custom_gcode_per_print_z); + const int items_cnt = static_cast(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>> cp_values = color_print_ranges(i, custom_gcode_per_print_z); + const int items_cnt = static_cast(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; + using TimesList = std::vector>; + + // 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; + + auto generate_partial_times = [this](const TimesList& times) { + PartialTimes items; + + std::vector custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes; + int extruders_count = wxGetApp().extruders_edited_cnt(); + std::vector 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& 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& 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; + } + } + } + + 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(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) { + imgui.text(_u8L("Filament") + " " + std::to_string(i + 1) + ":"); + 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 std::string& label, PrintEstimatedTimeStatistics::ETimeMode mode) { + bool show = false; + for (size_t i = 0; i < m_time_statistics.modes.size(); ++i) { + if (i != static_cast(mode) && + short_time(get_time_dhms(m_time_statistics.modes[static_cast(mode)].time)) != short_time(get_time_dhms(m_time_statistics.modes[i].time))) { + show = true; + break; + } + } + if (show && m_time_statistics.modes[static_cast(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(_u8L("Show stealth mode"), PrintEstimatedTimeStatistics::ETimeMode::Stealth); + break; + } + case PrintEstimatedTimeStatistics::ETimeMode::Stealth: { + show_mode_button(_u8L("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 = 250.0f; + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + + auto add_time = [this, &imgui](const std::string& label, long long time) { + char buf[1024]; + sprintf(buf, "%lld ms (%s)", time, get_time_dhms(static_cast(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, long long memory) { + static const float mb = 1024.0f * 1024.0f; + static const float inv_mb = 1.0f / mb; + static const float gb = 1024.0f * mb; + static const float inv_gb = 1.0f / gb; + char buf[1024]; + if (static_cast(memory) < gb) + sprintf(buf, "%lld bytes (%.3f MB)", memory, static_cast(memory) * inv_mb); + else + sprintf(buf, "%lld bytes (%.3f GB)", memory, static_cast(memory) * inv_gb); + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label); + ImGui::SameLine(offset); + imgui.text(buf); + }; + + auto add_counter = [this, &imgui](const std::string& label, long long 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, -1 }, { 600, -1 }); + 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.vertices_gpu_size); + add_memory(std::string("Indices:"), m_statistics.indices_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("Extrude segments count:"), m_statistics.extrude_segments_count); + add_counter(std::string("Max vertices in vertex buffer:"), m_statistics.max_vertices_in_vertex_buffer); + add_counter(std::string("Max indices in index buffer:"), 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, long long additional) const +{ + if (Slic3r::get_logging_level() >= 5) { + long long paths_size = 0; + long long render_paths_size = 0; + for (const TBuffer& buffer : m_buffers) { + paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.paths, Path); + render_paths_size += SLIC3R_STDVEC_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); + } + } + long long 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 + +#endif // ENABLE_GCODE_VIEWER diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp new file mode 100644 index 0000000000..639a5b430a --- /dev/null +++ b/src/slic3r/GUI/GCodeViewer.hpp @@ -0,0 +1,519 @@ +#ifndef slic3r_GCodeViewer_hpp_ +#define slic3r_GCodeViewer_hpp_ + +#if ENABLE_GCODE_VIEWER +#include "3DScene.hpp" +#include "libslic3r/GCode/GCodeProcessor.hpp" +#include "GLModel.hpp" + +#include + +namespace Slic3r { + +class Print; +class TriangleMesh; + +namespace GUI { + +class GCodeViewer +{ + using Color = std::array; + using IndexBuffer = std::vector; + using MultiIndexBuffer = std::vector; + + static const std::vector Extrusion_Role_Colors; + static const std::vector Options_Colors; + static const std::vector Travel_Colors; + static const std::vector 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 + { + Color color; + unsigned int path_id; + unsigned int index_buffer_id; + std::vector sizes; + std::vector offsets; // use size_t because we need an unsigned int whose size matches pointer's size (used in the call glMultiDrawElements()) + }; + + // 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 indices; + + std::string shader; + std::vector paths; + std::vector 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(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 m_zs; + std::vector 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(); + m_endpoints = std::vector(); + } + + size_t size() const { return m_zs.size(); } + bool empty() const { return m_zs.empty(); } + const std::vector& get_zs() const { return m_zs; } + const std::vector& get_endpoints() const { return m_endpoints; } + std::vector& get_endpoints() { return m_endpoints; } + double get_z_at(unsigned int id) const { return (id < m_zs.size()) ? m_zs[id] : 0.0; } + Endpoints get_endpoints_at(unsigned int id) const { return (id < m_endpoints.size()) ? m_endpoints[id] : Endpoints(); } + }; + +#if ENABLE_GCODE_VIEWER_STATISTICS + struct Statistics + { + // time + long long results_time{ 0 }; + long long load_time{ 0 }; + long long refresh_time{ 0 }; + long long refresh_paths_time{ 0 }; + // opengl calls + long long gl_multi_points_calls_count{ 0 }; + long long gl_multi_lines_calls_count{ 0 }; + long long gl_multi_triangles_calls_count{ 0 }; + // memory + long long results_size{ 0 }; + long long vertices_gpu_size{ 0 }; + long long indices_gpu_size{ 0 }; + long long paths_size{ 0 }; + long long render_paths_size{ 0 }; + // other + long long travel_segments_count{ 0 }; + long long extrude_segments_count{ 0 }; + long long max_vertices_in_vertex_buffer{ 0 }; + long long 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; + vertices_gpu_size = 0; + indices_gpu_size = 0; + paths_size = 0; + render_paths_size = 0; + } + + void reset_others() { + travel_segments_count = 0; + extrude_segments_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 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& 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 m_buffers{ static_cast(EMoveType::Extrude) }; + // bounding box of toolpaths + BoundingBoxf3 m_paths_bounding_box; + // bounding box of toolpaths + marker tools + BoundingBoxf3 m_max_bounding_box; + std::vector m_tool_colors; + Layers m_layers; + std::array m_layers_z_range; + std::vector m_roles; + size_t m_extruders_count; + std::vector 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 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& str_tool_colors); + + 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& 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& 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, long long additional = 0) const; +}; + +} // namespace GUI +} // namespace Slic3r + +#endif // ENABLE_GCODE_VIEWER + +#endif // slic3r_GCodeViewer_hpp_ + diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index e4a5f590d8..495c165b56 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1,31 +1,36 @@ #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" #if ENABLE_RETINA_GL #include "slic3r/Utils/RetinaHelper.hpp" @@ -58,9 +63,9 @@ #include #include #include -#if ENABLE_RENDER_STATISTICS -#include -#endif // ENABLE_RENDER_STATISTICS +#include "DoubleSlider.hpp" + +#include static const float TRACKBALLSIZE = 0.8f; @@ -130,6 +135,7 @@ GLCanvas3D::LayersEditing::LayersEditing() , m_object_max_z(0.f) , m_slicing_parameters(nullptr) , m_layer_height_profile_modified(false) + , m_adaptive_quality(0.5f) , state(Unknown) , band_width(2.0f) , strength(0.005f) @@ -150,13 +156,9 @@ GLCanvas3D::LayersEditing::~LayersEditing() } const float GLCanvas3D::LayersEditing::THICKNESS_BAR_WIDTH = 70.0f; -const float GLCanvas3D::LayersEditing::THICKNESS_RESET_BUTTON_HEIGHT = 22.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)); @@ -165,8 +167,6 @@ 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) @@ -199,7 +199,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 @@ -212,18 +212,96 @@ 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; - const Rect& bar_rect = get_bar_rect_viewport(canvas); - const Rect& reset_rect = get_reset_rect_viewport(canvas); + const Size& cnv_size = canvas.get_canvas_size(); - _render_tooltip_texture(canvas, bar_rect, reset_rect); - _render_reset_texture(reset_rect); - _render_active_object_annotations(canvas, bar_rect); - _render_profile(bar_rect); + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.set_next_window_pos(static_cast(cnv_size.get_width()) - imgui.get_style_scaling() * THICKNESS_BAR_WIDTH, + static_cast(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.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Left mouse button:")); + ImGui::SameLine(); + imgui.text(_L("Add detail")); + + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Right mouse button:")); + ImGui::SameLine(); + imgui.text(_L("Remove detail")); + + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Shift + Left mouse button:")); + ImGui::SameLine(); + imgui.text(_L("Reset to base")); + + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Shift + Right mouse button:")); + ImGui::SameLine(); + imgui.text(_L("Smoothing")); + + imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Mouse wheel:")); + ImGui::SameLine(); + imgui.text(_L("Increase/decrease edit area")); + + ImGui::Separator(); + if (imgui.button(_L("Adaptive"))) + wxPostEvent((wxEvtHandler*)canvas.get_wxglcanvas(), Event(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::BeginTooltip(); + ImGui::TextUnformatted(_L("Higher print quality versus higher print speed.").ToUTF8()); + ImGui::EndTooltip(); + } + + ImGui::SameLine(); + float widget_align = ImGui::GetCursorPosX(); + ImGui::PushItemWidth(imgui.get_style_scaling() * 120.0f); + m_adaptive_quality = clamp(0.0f, 1.f, m_adaptive_quality); + ImGui::SliderFloat("", &m_adaptive_quality, 0.0f, 1.f, "%.2f"); + + ImGui::Separator(); + 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::SameLine(); + ImGui::SetCursorPosX(widget_align); + ImGui::PushItemWidth(imgui.get_style_scaling() * 120.0f); + int radius = (int)m_smooth_params.radius; + if (ImGui::SliderInt("##1", &radius, 1, 10)) + m_smooth_params.radius = (unsigned int)radius; + + ImGui::SetCursorPosX(text_align); + ImGui::AlignTextToFramePadding(); + imgui.text(_L("Keep min")); + ImGui::SameLine(); + if (ImGui::GetCursorPosX() < widget_align) // because of line lenght after localization + ImGui::SetCursorPosX(widget_align); + + ImGui::PushItemWidth(imgui.get_style_scaling() * 120.0f); + imgui.checkbox("##2", m_smooth_params.keep_min); + + ImGui::Separator(); + 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); + render_active_object_annotations(canvas, bar_rect); + render_profile(bar_rect); } float GLCanvas3D::LayersEditing::get_cursor_z_relative(const GLCanvas3D& canvas) @@ -248,28 +326,13 @@ bool GLCanvas3D::LayersEditing::bar_rect_contains(const GLCanvas3D& canvas, floa return (rect.get_left() <= x) && (x <= rect.get_right()) && (rect.get_top() <= y) && (y <= rect.get_bottom()); } -bool GLCanvas3D::LayersEditing::reset_rect_contains(const GLCanvas3D& canvas, float x, float y) -{ - const Rect& rect = get_reset_rect_screen(canvas); - return (rect.get_left() <= x) && (x <= rect.get_right()) && (rect.get_top() <= y) && (y <= rect.get_bottom()); -} - Rect GLCanvas3D::LayersEditing::get_bar_rect_screen(const GLCanvas3D& canvas) { const Size& cnv_size = canvas.get_canvas_size(); float w = (float)cnv_size.get_width(); float h = (float)cnv_size.get_height(); - return Rect(w - thickness_bar_width(canvas), 0.0f, w, h - reset_button_height(canvas)); -} - -Rect GLCanvas3D::LayersEditing::get_reset_rect_screen(const GLCanvas3D& canvas) -{ - const Size& cnv_size = canvas.get_canvas_size(); - float w = (float)cnv_size.get_width(); - float h = (float)cnv_size.get_height(); - - return Rect(w - thickness_bar_width(canvas), h - reset_button_height(canvas), w, h); + return Rect(w - thickness_bar_width(canvas), 0.0f, w, h); } Rect GLCanvas3D::LayersEditing::get_bar_rect_viewport(const GLCanvas3D& canvas) @@ -277,86 +340,57 @@ 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 zoom = (float)canvas.get_camera().get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; - - return Rect((half_w - thickness_bar_width(canvas)) * inv_zoom, half_h * inv_zoom, half_w * inv_zoom, (-half_h + reset_button_height(canvas)) * 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); } -Rect GLCanvas3D::LayersEditing::get_reset_rect_viewport(const GLCanvas3D& canvas) +bool GLCanvas3D::LayersEditing::is_initialized() const { - 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 zoom = (float)canvas.get_camera().get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; - - return Rect((half_w - thickness_bar_width(canvas)) * inv_zoom, (-half_h + reset_button_height(canvas)) * inv_zoom, half_w * inv_zoom, -half_h * inv_zoom); + return wxGetApp().get_shader("variable_layer_height") != nullptr; } - -bool GLCanvas3D::LayersEditing::_is_initialized() const +std::string GLCanvas3D::LayersEditing::get_tooltip(const GLCanvas3D& canvas) const { - return m_shader.is_initialized(); -} - -void GLCanvas3D::LayersEditing::_render_tooltip_texture(const GLCanvas3D& canvas, const Rect& bar_rect, const Rect& reset_rect) const -{ - // TODO: do this with ImGui - - if (m_tooltip_texture.get_id() == 0) + std::string ret; + if (m_enabled && (m_layer_height_profile.size() >= 4)) { - std::string filename = resources_dir() + "/icons/variable_layer_height_tooltip.png"; - if (!m_tooltip_texture.load_from_file(filename, false, GLTexture::SingleThreaded, false)) - return; + float z = get_cursor_z_relative(canvas); + 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) + { + float zi = m_layer_height_profile[i]; + float zi_1 = m_layer_height_profile[i - 2]; + 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; + } + } + if (h > 0.0f) + ret = std::to_string(h); + } } - -#if ENABLE_RETINA_GL - const float scale = canvas.get_canvas_size().get_scale_factor(); -#else - const float scale = canvas.get_wxglcanvas()->GetContentScaleFactor(); -#endif - const float width = (float)m_tooltip_texture.get_width() * scale; - const float height = (float)m_tooltip_texture.get_height() * scale; - - float zoom = (float)canvas.get_camera().get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; - float gap = 10.0f * inv_zoom; - - float bar_left = bar_rect.get_left(); - float reset_bottom = reset_rect.get_bottom(); - - float l = bar_left - width * inv_zoom - gap; - float r = bar_left - gap; - float t = reset_bottom + height * inv_zoom + gap; - float b = reset_bottom + gap; - - GLTexture::render_texture(m_tooltip_texture.get_id(), l, r, b, t); + return ret; } -void GLCanvas3D::LayersEditing::_render_reset_texture(const Rect& reset_rect) const +void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) const { - if (m_reset_texture.get_id() == 0) - { - std::string filename = resources_dir() + "/icons/variable_layer_height_reset.png"; - if (!m_reset_texture.load_from_file(filename, false, GLTexture::SingleThreaded, false)) - return; - } + GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height"); + if (shader == nullptr) + return; - GLTexture::render_texture(m_reset_texture.get_id(), reset_rect.get_left(), reset_rect.get_right(), reset_rect.get_bottom(), reset_rect.get_top()); -} + shader->start_using(); -void GLCanvas3D::LayersEditing::_render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) const -{ - m_shader.start_using(); - - 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->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)); @@ -376,10 +410,10 @@ void GLCanvas3D::LayersEditing::_render_active_object_annotations(const GLCanvas 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 +void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) const { //FIXME show some kind of legend. @@ -410,73 +444,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, ¤t_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(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(this)->generate_layer_height_texture(); + // 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)); - // 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().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().data())); - glvolume->render(); - } - } + // 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() @@ -496,6 +507,24 @@ void GLCanvas3D::LayersEditing::reset_layer_height_profile(GLCanvas3D& canvas) canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); } +void GLCanvas3D::LayersEditing::adaptive_layer_height_profile(GLCanvas3D& canvas, float quality_factor) +{ + this->update_slicing_parameters(); + m_layer_height_profile = layer_height_profile_adaptive(*m_slicing_parameters, *m_model_object, quality_factor); + const_cast(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)); +} + +void GLCanvas3D::LayersEditing::smooth_layer_height_profile(GLCanvas3D& canvas, const HeightProfileSmoothingParams& smoothing_params) +{ + this->update_slicing_parameters(); + m_layer_height_profile = smooth_height_profile(m_layer_height_profile, *m_slicing_parameters, smoothing_params); + const_cast(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)); +} + void GLCanvas3D::LayersEditing::generate_layer_height_texture() { this->update_slicing_parameters(); @@ -530,8 +559,8 @@ void GLCanvas3D::LayersEditing::accept_changes(GLCanvas3D& canvas) { if (last_object_id >= 0) { if (m_layer_height_profile_modified) { - wxGetApp().plater()->take_snapshot(_(L("Layers heights"))); - const_cast(m_model_object)->layer_height_profile = m_layer_height_profile; + wxGetApp().plater()->take_snapshot(_(L("Variable layer height - Manual edit"))); + const_cast(m_model_object)->layer_height_profile.set(m_layer_height_profile); canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS)); } } @@ -557,17 +586,6 @@ float GLCanvas3D::LayersEditing::thickness_bar_width(const GLCanvas3D &canvas) * THICKNESS_BAR_WIDTH; } -float GLCanvas3D::LayersEditing::reset_button_height(const GLCanvas3D &canvas) -{ - return -#if ENABLE_RETINA_GL - canvas.get_canvas_size().get_scale_factor() -#else - canvas.get_wxglcanvas()->GetContentScaleFactor() -#endif - * THICKNESS_RESET_BUTTON_HEIGHT; -} - const Point GLCanvas3D::Mouse::Drag::Invalid_2D_Point(INT_MAX, INT_MAX); const Vec3d GLCanvas3D::Mouse::Drag::Invalid_3D_Point(DBL_MAX, DBL_MAX, DBL_MAX); @@ -602,6 +620,37 @@ 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 ¬ification_manager = *wxGetApp().plater()->get_notification_manager(); + if (state) { + if(error) + notification_manager.push_plater_error_notification(text,*(wxGetApp().plater()->get_current_canvas3D())); + else + notification_manager.push_plater_warning_notification(text, *(wxGetApp().plater()->get_current_canvas3D())); + } 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) { @@ -644,6 +693,7 @@ void GLCanvas3D::WarningTexture::activate(WarningTexture::Warning warning, bool // save information for rescaling m_msg_text = text; m_is_colored_red = red_colored; + */ } @@ -679,7 +729,7 @@ static void msw_disable_cleartype(wxFont &font) ++ startpos_weight; size_t endpos_weight = font_desc.find(sep, startpos_weight); // Parse the weight field. - unsigned int weight = atoi(font_desc(startpos_weight, endpos_weight - startpos_weight)); + unsigned int weight = wxAtoi(font_desc(startpos_weight, endpos_weight - startpos_weight)); size_t startpos = endpos_weight; for (size_t i = 0; i < 6; ++ i) startpos = font_desc.find(sep, startpos + 1); @@ -717,6 +767,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 @@ -794,8 +851,7 @@ void GLCanvas3D::WarningTexture::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 zoom = (float)canvas.get_camera().get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + 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; @@ -824,6 +880,7 @@ void GLCanvas3D::WarningTexture::msw_rescale(const GLCanvas3D& canvas) generate(m_msg_text, canvas, true, m_is_colored_red); } +#if !ENABLE_GCODE_VIEWER 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) }; @@ -836,47 +893,131 @@ GLCanvas3D::LegendTexture::LegendTexture() { } -void GLCanvas3D::LegendTexture::fill_color_print_legend_values(const GCodePreviewData& preview_data, const GLCanvas3D& canvas, - std::vector>& cp_legend_values) +void GLCanvas3D::LegendTexture::fill_color_print_legend_items( const GLCanvas3D& canvas, + const std::vector& colors_in, + std::vector& colors, + std::vector& cp_legend_items) { - if (preview_data.extrusion.view_type == GCodePreviewData::Extrusion::ColorPrint && - wxGetApp().extruders_edited_cnt() == 1) // show color change legend only for single-material presets + std::vector 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) { - auto& config = wxGetApp().preset_bundle->project_config; - const std::vector& color_print_values = config.option("colorprint_heights")->values; - - if (!color_print_values.empty()) { - std::vector print_zs = canvas.get_current_print_zs(true); - for (auto cp_value : color_print_values) - { - auto lower_b = std::lower_bound(print_zs.begin(), print_zs.end(), cp_value - 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_legend_values.empty() || - !(cp_legend_values.back().first == previous_z && cp_legend_values.back().second == current_z) ) - cp_legend_values.push_back(std::pair(previous_z, current_z)); - } + 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> cp_values; + cp_values.reserve(custom_gcode_per_print_z.size()); + + std::vector print_zs = canvas.get_current_print_zs(true); + for (auto custom_code : custom_gcode_per_print_z) + { + if (custom_code.type != CustomGCode::ColorChange) + 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(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].type == CustomGCode::ColorChange) { + ::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& tool_colors, const GLCanvas3D& canvas, bool compress) +bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, const std::vector& tool_colors_in, const GLCanvas3D& canvas, bool compress) { reset(); // collects items to render auto title = _(preview_data.get_legend_title()); - std::vector> cp_legend_values; - fill_color_print_legend_values(preview_data, canvas, cp_legend_values); + std::vector cp_legend_items; + std::vector cp_colors; - const GCodePreviewData::LegendItemsList& items = preview_data.get_legend_items(tool_colors, cp_legend_values); + 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& 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) @@ -888,6 +1029,12 @@ bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, c // 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; @@ -1072,8 +1219,7 @@ 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 zoom = (float)canvas.get_camera().get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + float inv_zoom = (float)wxGetApp().plater()->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; @@ -1093,8 +1239,195 @@ void GLCanvas3D::LegendTexture::render(const GLCanvas3D& canvas) const GLTexture::render_sub_texture(m_id, left, right, bottom, top, uvs); } } +#endif // !ENABLE_GCODE_VIEWER + +void GLCanvas3D::Labels::render(const std::vector& sorted_instances) const +{ + if (!m_enabled || !is_shown()) + return; + + const Camera& camera = wxGetApp().plater()->get_camera(); + const Model* model = m_canvas.get_model(); + if (model == nullptr) + return; + + Transform3d world_to_eye = camera.get_view_matrix(); + Transform3d world_to_screen = camera.get_projection_matrix() * world_to_eye; + const std::array& viewport = camera.get_viewport(); + + struct Owner + { + int obj_idx; + int inst_idx; + size_t model_instance_id; + BoundingBoxf3 world_box; + double eye_center_z; + std::string title; + std::string label; + std::string print_order; + bool selected; + }; + + // collect owners world bounding boxes and data from volumes + std::vector owners; + const GLVolumeCollection& volumes = m_canvas.get_volumes(); + for (const GLVolume* volume : volumes.volumes) { + int obj_idx = volume->object_idx(); + if (0 <= obj_idx && obj_idx < (int)model->objects.size()) { + int inst_idx = volume->instance_idx(); + std::vector::iterator it = std::find_if(owners.begin(), owners.end(), [obj_idx, inst_idx](const Owner& owner) { + return (owner.obj_idx == obj_idx) && (owner.inst_idx == inst_idx); + }); + if (it != owners.end()) { + it->world_box.merge(volume->transformed_bounding_box()); + it->selected &= volume->selected; + } else { + const ModelObject* model_object = model->objects[obj_idx]; + Owner owner; + owner.obj_idx = obj_idx; + owner.inst_idx = inst_idx; + owner.model_instance_id = model_object->instances[inst_idx]->id().id; + owner.world_box = volume->transformed_bounding_box(); + owner.title = "object" + std::to_string(obj_idx) + "_inst##" + std::to_string(inst_idx); + owner.label = model_object->name; + if (model_object->instances.size() > 1) + owner.label += " (" + std::to_string(inst_idx + 1) + ")"; + owner.selected = volume->selected; + owners.emplace_back(owner); + } + } + } + + // updates print order strings + if (sorted_instances.size() > 1) { + for (size_t i = 0; i < sorted_instances.size(); ++i) { + size_t id = sorted_instances[i]->id().id; + std::vector::iterator it = std::find_if(owners.begin(), owners.end(), [id](const Owner& owner) { + return owner.model_instance_id == id; + }); + if (it != owners.end()) + it->print_order = std::string((_(L("Seq."))).ToUTF8()) + "#: " + std::to_string(i + 1); + } + } + + // calculate eye bounding boxes center zs + for (Owner& owner : owners) { + owner.eye_center_z = (world_to_eye * owner.world_box.center())(2); + } + + // sort owners by center eye zs and selection + std::sort(owners.begin(), owners.end(), [](const Owner& owner1, const Owner& owner2) { + if (!owner1.selected && owner2.selected) + return true; + else if (owner1.selected && !owner2.selected) + return false; + else + return (owner1.eye_center_z < owner2.eye_center_z); + }); + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + + // render info windows + for (const Owner& owner : owners) { + Vec3d screen_box_center = world_to_screen * owner.world_box.center(); + float x = 0.0f; + float y = 0.0f; + if (camera.get_type() == Camera::Perspective) { + x = (0.5f + 0.001f * 0.5f * (float)screen_box_center(0)) * viewport[2]; + y = (0.5f - 0.001f * 0.5f * (float)screen_box_center(1)) * viewport[3]; + } else { + x = (0.5f + 0.5f * (float)screen_box_center(0)) * viewport[2]; + y = (0.5f - 0.5f * (float)screen_box_center(1)) * viewport[3]; + } + + if (x < 0.0f || viewport[2] < x || y < 0.0f || viewport[3] < y) + continue; + + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, owner.selected ? 3.0f : 1.5f); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleColor(ImGuiCol_Border, owner.selected ? ImVec4(0.757f, 0.404f, 0.216f, 1.0f) : ImVec4(0.75f, 0.75f, 0.75f, 1.0f)); + imgui.set_next_window_pos(x, y, ImGuiCond_Always, 0.5f, 0.5f); + imgui.begin(owner.title, ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove); + ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow()); + float win_w = ImGui::GetWindowWidth(); + float label_len = imgui.calc_text_size(owner.label).x; + ImGui::SetCursorPosX(0.5f * (win_w - label_len)); + ImGui::AlignTextToFramePadding(); + imgui.text(owner.label); + + 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)); + ImGui::AlignTextToFramePadding(); + imgui.text(owner.print_order); + } + + // force re-render while the windows gets to its final size (it takes several frames) + if (ImGui::GetWindowContentRegionWidth() + 2.0f * ImGui::GetStyle().WindowPadding.x != ImGui::CalcWindowExpectedSize(ImGui::GetCurrentWindow()).x) + m_canvas.request_extra_frame(); + + imgui.end(); + ImGui::PopStyleColor(); + ImGui::PopStyleVar(2); + } +} + +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.empty()) + m_start_time = std::chrono::steady_clock::now(); + + m_text = new_text; + } +} + +void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position, GLCanvas3D& canvas) const +{ + static ImVec2 size(0.0f, 0.0f); + + auto validate_position = [](const Vec2d& position, const GLCanvas3D& canvas, const ImVec2& wnd_size) { + Size cnv_size = canvas.get_canvas_size(); + float x = std::clamp((float)position(0), 0.0f, (float)cnv_size.get_width() - wnd_size.x); + float y = std::clamp((float)position(1) + 16, 0.0f, (float)cnv_size.get_height() - wnd_size.y); + return Vec2f(x, y); + }; + + if (m_text.empty()) + return; + + // draw the tooltip as hidden until the delay is expired + // 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::steady_clock::now() - m_start_time).count() < 500) ? 0.01f : 1.0f; + + Vec2f position = validate_position(mouse_position, canvas, size); + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_Alpha, alpha); + imgui.set_next_window_pos(position(0), position(1), ImGuiCond_Always, 0.0f, 0.0f); + + 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()); + + // force re-render while the windows gets to its final size (it may take several frames) or while hidden + if (alpha < 1.0f || ImGui::GetWindowContentRegionWidth() + 2.0f * ImGui::GetStyle().WindowPadding.x != ImGui::CalcWindowExpectedSize(ImGui::GetCurrentWindow()).x) + canvas.request_extra_frame(); + + size = ImGui::GetWindowSize(); + + imgui.end(); + ImGui::PopStyleVar(2); +} + +float GLCanvas3D::Slope::s_window_width; -wxDEFINE_EVENT(EVT_GLCANVAS_INIT, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, RBtnEvent); @@ -1106,6 +1439,7 @@ wxDEFINE_EVENT(EVT_GLCANVAS_INCREASE_INSTANCES, Event); wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_MOVED, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_ROTATED, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_INSTANCE_SCALED, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_FORCE_UPDATE, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_WIPETOWER_MOVED, Vec3dEvent); wxDEFINE_EVENT(EVT_GLCANVAS_WIPETOWER_ROTATED, Vec3dEvent); wxDEFINE_EVENT(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, Event); @@ -1114,39 +1448,45 @@ 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); +#if ENABLE_GCODE_VIEWER +wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_LAYERS_SLIDER, wxKeyEvent); +#else wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, wxKeyEvent); +#endif // ENABLE_GCODE_VIEWER wxDEFINE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_JUMP_TO, wxKeyEvent); wxDEFINE_EVENT(EVT_GLCANVAS_UNDO, SimpleEvent); wxDEFINE_EVENT(EVT_GLCANVAS_REDO, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_COLLAPSE_SIDEBAR, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, SimpleEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, Event); +wxDEFINE_EVENT(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, HeightProfileSmoothEvent); +wxDEFINE_EVENT(EVT_GLCANVAS_RELOAD_FROM_DISK, SimpleEvent); -#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) +GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) : m_canvas(canvas) , m_context(nullptr) #if ENABLE_RETINA_GL , m_retina_helper(nullptr) #endif , m_in_render(false) - , m_render_enabled(true) - , 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("") - , m_keep_dirty(false) + , m_extra_frame_requested(false) , m_config(nullptr) , m_process(nullptr) , m_model(nullptr) , m_dirty(true) , m_initialized(false) , m_apply_zoom_to_volumes_filter(false) +#if !ENABLE_GCODE_VIEWER , m_legend_texture_enabled(false) +#endif // !ENABLE_GCODE_VIEWER , m_picking_enabled(false) , m_moving_enabled(false) , m_dynamic_background_enabled(false) @@ -1160,14 +1500,14 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar , m_show_picking_texture(false) #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); #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 } m_selection.set_volumes(&m_volumes.volumes); @@ -1189,7 +1529,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)); @@ -1235,17 +1575,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() @@ -1260,8 +1591,6 @@ bool GLCanvas3D::init() if (m_selection.is_enabled() && !m_selection.init()) return false; - post_event(SimpleEvent(EVT_GLCANVAS_INIT)); - m_initialized = true; return true; @@ -1282,44 +1611,64 @@ 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; } void GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo, int instance_idx) { + 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) vol->is_active = visible; } - - m_render_sla_auxiliaries = visible; } 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) @@ -1372,11 +1721,9 @@ void GLCanvas3D::set_model(Model* model) void GLCanvas3D::bed_shape_changed() { - m_camera.set_scene_box(scene_bounding_box()); - m_camera.requires_zoom_to_bed = true; + refresh_camera_scene_box(); + wxGetApp().plater()->get_camera().requires_zoom_to_bed = true; m_dirty = true; - if (m_bed.is_prusa()) - start_keeping_dirty(); } void GLCanvas3D::set_color_by(const std::string& value) @@ -1384,6 +1731,11 @@ 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; @@ -1398,8 +1750,7 @@ BoundingBoxf3 GLCanvas3D::volumes_bounding_box() const BoundingBoxf3 GLCanvas3D::scene_bounding_box() const { BoundingBoxf3 bb = volumes_bounding_box(); - bb.merge(m_bed.get_bounding_box(false)); - + bb.merge(wxGetApp().plater()->get_bed().get_bounding_box(true)); if (m_config != nullptr) { double h = m_config->opt_float("max_print_height"); @@ -1420,6 +1771,30 @@ bool GLCanvas3D::is_layers_editing_allowed() const return m_layers_editing.is_allowed(); } +void GLCanvas3D::reset_layer_height_profile() +{ + 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; +} + +void GLCanvas3D::adaptive_layer_height_profile(float quality_factor) +{ + 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; +} + +void GLCanvas3D::smooth_layer_height_profile(const HeightProfileSmoothingParams& smoothing_params) +{ + 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; +} + bool GLCanvas3D::is_reload_delayed() const { return m_reload_delayed; @@ -1441,7 +1816,11 @@ void GLCanvas3D::enable_layers_editing(bool enable) void GLCanvas3D::enable_legend_texture(bool enable) { +#if ENABLE_GCODE_VIEWER + m_gcode_viewer.enable_legend(enable); +#else m_legend_texture_enabled = enable; +#endif // ENABLE_GCODE_VIEWER } void GLCanvas3D::enable_picking(bool enable) @@ -1487,7 +1866,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() @@ -1503,9 +1882,17 @@ void GLCanvas3D::zoom_to_selection() _zoom_to_box(m_selection.get_bounding_box()); } +#if ENABLE_GCODE_VIEWER +void GLCanvas3D::zoom_to_gcode() +{ + _zoom_to_box(m_gcode_viewer.get_paths_bounding_box(), 1.05); +} +#endif // ENABLE_GCODE_VIEWER + void GLCanvas3D::select_view(const std::string& direction) { - if (m_camera.select_view(direction) && (m_canvas != nullptr)) + wxGetApp().plater()->get_camera().select_view(direction); + if (m_canvas != nullptr) m_canvas->Refresh(); } @@ -1517,7 +1904,7 @@ void GLCanvas3D::update_volumes_colors_by_extruder() void GLCanvas3D::render() { - if (!m_render_enabled || m_in_render) + if (m_in_render) { // if called recursively, return m_dirty = true; @@ -1532,41 +1919,53 @@ 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 (m_camera.requires_zoom_to_bed) +#if ENABLE_ENVIRONMENT_MAP +#if ENABLE_GCODE_VIEWER + if (wxGetApp().is_editor()) +#endif // ENABLE_GCODE_VIEWER + wxGetApp().plater()->init_environment_texture(); +#endif // ENABLE_ENVIRONMENT_MAP + + 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. + 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 (camera.requires_zoom_to_bed) { zoom_to_bed(); - const Size& cnv_size = get_canvas_size(); _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)); GLfloat position_top[4] = { -0.5f, -0.5f, 1.0f, 0.0f }; glsafe(::glLightfv(GL_LIGHT0, GL_POSITION, position_top)); - float theta = m_camera.get_theta(); - if (theta > 180.f) - // absolute value of the rotation - theta = 360.f - theta; - wxGetApp().imgui()->new_frame(); if (m_picking_enabled) @@ -1588,9 +1987,13 @@ void GLCanvas3D::render() _render_background(); _render_objects(); +#if ENABLE_GCODE_VIEWER + if (!m_main_toolbar.is_enabled()) + _render_gcode(); +#endif // ENABLE_GCODE_VIEWER _render_sla_slices(); _render_selection(); - _render_bed(theta); + _render_bed(!camera.is_looking_downward(), true); #if ENABLE_RENDER_SELECTION_CENTER _render_selection_center(); @@ -1599,7 +2002,10 @@ 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()); +#if ENABLE_GCODE_VIEWER + if (m_picking_enabled) +#endif // ENABLE_GCODE_VIEWER + m_mouse.scene_position = _mouse_to_3d(m_mouse.position.cast()); _render_current_gizmo(); _render_selection_sidebar_hints(); @@ -1619,7 +2025,6 @@ void GLCanvas3D::render() #if ENABLE_RENDER_STATISTICS ImGuiWrapper& imgui = *wxGetApp().imgui(); - imgui.set_next_window_bg_alpha(0.5f); imgui.begin(std::string("Render statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); imgui.text("Last frame: "); ImGui::SameLine(); @@ -1629,17 +2034,53 @@ void GLCanvas3D::render() ImGui::Separator(); imgui.text("Compressed textures: "); ImGui::SameLine(); - imgui.text(GLCanvas3DManager::are_compressed_textures_supported() ? "supported" : "not supported"); + imgui.text(OpenGLManager::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.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 + 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 (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 = wxGetApp().plater()->get_collapse_toolbar().get_tooltip(); + + if (tooltip.empty()) + tooltip = wxGetApp().plater()->get_view_toolbar().get_tooltip(); + } + + set_tooltip(tooltip); + + 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(*this, get_overlay_window_width()); + wxGetApp().imgui()->render(); m_canvas->SwapBuffers(); @@ -1650,17 +2091,15 @@ void GLCanvas3D::render() #endif // ENABLE_RENDER_STATISTICS } -#if ENABLE_THUMBNAIL_GENERATOR -void GLCanvas3D::render_thumbnail(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, bool printable_only, bool parts_only, bool transparent_background) +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, transparent_background); break; } - case GLCanvas3DManager::FB_Ext: { _render_thumbnail_framebuffer_ext(thumbnail_data, w, h, printable_only, parts_only, transparent_background); break; } - default: { _render_thumbnail_legacy(thumbnail_data, w, h, printable_only, parts_only, 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() { @@ -1710,6 +2149,44 @@ void GLCanvas3D::ensure_on_bed(unsigned int object_idx) } } + +#if ENABLE_GCODE_VIEWER +const std::vector& GLCanvas3D::get_gcode_layers_zs() const +{ + return m_gcode_viewer.get_layers_zs(); +} + +std::vector GLCanvas3D::get_volumes_print_zs(bool active_only) const +{ + return m_volumes.get_current_print_zs(active_only); +} + +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_gcode_viewer.set_view_type(type); +} + +void GLCanvas3D::set_volumes_z_range(const std::array& range) +{ + m_volumes.set_range(range[0] - 1e-6, range[1] + 1e-6); +} + +void GLCanvas3D::set_toolpaths_z_range(const std::array& range) +{ + if (m_gcode_viewer.has_data()) + m_gcode_viewer.set_layers_z_range(range); +} +#else std::vector GLCanvas3D::get_current_print_zs(bool active_only) const { return m_volumes.get_current_print_zs(active_only); @@ -1719,6 +2196,7 @@ void GLCanvas3D::set_toolpaths_range(double low, double high) { m_volumes.set_range(low, high); } +#endif // ENABLE_GCODE_VIEWER std::vector GLCanvas3D::load_object(const ModelObject& model_object, int obj_idx, std::vector instance_idxs) { @@ -1726,7 +2204,7 @@ std::vector GLCanvas3D::load_object(const ModelObject& model_object, int ob { for (unsigned int i = 0; i < model_object.instances.size(); ++i) { - instance_idxs.push_back(i); + instance_idxs.emplace_back(i); } } return m_volumes.load_object(&model_object, obj_idx, instance_idxs, m_color_by, m_initialized); @@ -1762,8 +2240,10 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re 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) : @@ -1786,9 +2266,11 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re struct GLVolumeState { GLVolumeState() : - volume_idx(-1) {} + volume_idx(size_t(-1)) {} GLVolumeState(const GLVolume* volume, unsigned int volume_idx) : composite_id(volume->composite_id), volume_idx(volume_idx) {} + GLVolumeState(const GLVolume::CompositeID &composite_id) : + composite_id(composite_id), volume_idx(size_t(-1)) {} GLVolume::CompositeID composite_id; // Volume index in the old GLVolume vector. @@ -1796,8 +2278,8 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re }; // SLA steps to pull the preview meshes for. - typedef std::array SLASteps; - SLASteps sla_steps = { slaposSupportTree, slaposPad }; + typedef std::array SLASteps; + SLASteps sla_steps = { slaposDrillHoles, slaposSupportTree, slaposPad }; struct SLASupportState { std::array::value> step; }; @@ -1844,7 +2326,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re // Consider the DONE step without a valid mesh as invalid for the purpose // of mesh visualization. state.step[istep].state = PrintStateBase::INVALID; - else + else if (sla_steps[istep] != slaposDrillHoles) for (const ModelInstance* model_instance : print_object->model_object()->instances) // Only the instances, which are currently printable, will have the SLA support structures kept. // The instances outside the print bed will have the GLVolumes of their support structures released. @@ -1857,7 +2339,7 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re } std::sort(model_volume_state.begin(), model_volume_state.end(), model_volume_state_lower); std::sort(aux_volume_state.begin(), aux_volume_state.end(), model_volume_state_lower); - // Release all ModelVolume based GLVolumes not found in the current Model. + // Release all ModelVolume based GLVolumes not found in the current Model. Find the GLVolume of a hollowed mesh. for (size_t volume_id = 0; volume_id < m_volumes.volumes.size(); ++volume_id) { GLVolume* volume = m_volumes.volumes[volume_id]; ModelVolumeState key(volume); @@ -1914,22 +2396,13 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re } } sort_remove_duplicates(instance_ids_selected); + auto deleted_volumes_lower = [](const GLVolumeState &v1, const GLVolumeState &v2) { return v1.composite_id < v2.composite_id; }; + std::sort(deleted_volumes.begin(), deleted_volumes.end(), deleted_volumes_lower); if (m_reload_delayed) return; bool update_object_list = false; - - auto find_old_volume_id = [&deleted_volumes](const GLVolume::CompositeID& id) -> unsigned int { - for (unsigned int i = 0; i < (unsigned int)deleted_volumes.size(); ++i) - { - const GLVolumeState& v = deleted_volumes[i]; - if (v.composite_id == id) - return v.volume_idx; - } - return (unsigned int)-1; - }; - if (m_volumes.volumes != glvolumes_new) update_object_list = true; m_volumes.volumes = std::move(glvolumes_new); @@ -1944,9 +2417,13 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re assert(it != model_volume_state.end() && it->geometry_id == key.geometry_id); if (it->new_geometry()) { // New volume. - unsigned int old_id = find_old_volume_id(it->composite_id); - if (old_id != (unsigned int)-1) - map_glvolume_old_to_new[old_id] = m_volumes.volumes.size(); + auto it_old_volume = std::lower_bound(deleted_volumes.begin(), deleted_volumes.end(), GLVolumeState(it->composite_id), deleted_volumes_lower); + if (it_old_volume != deleted_volumes.end() && it_old_volume->composite_id == it->composite_id) + // If a volume changed its ObjectID, but it reuses a GLVolume's CompositeID, maintain its selection. + map_glvolume_old_to_new[it_old_volume->volume_idx] = m_volumes.volumes.size(); + // Note the index of the loaded volume, so that we can reload the main model GLVolume with the hollowed mesh + // later in this function. + it->volume_idx = m_volumes.volumes.size(); m_volumes.load_object_volume(&model_object, obj_idx, volume_idx, instance_idx, m_color_by, m_initialized); m_volumes.volumes.back()->geometry_id = key.geometry_id; update_object_list = true; @@ -1975,8 +2452,6 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re const ModelObject *model_object = print_object->model_object(); // Find an index of the ModelObject int object_idx; - if (std::all_of(state.step.begin(), state.step.end(), [](const PrintStateBase::StateWithTimeStamp &state){ return state.state != PrintStateBase::DONE; })) - continue; // There may be new SLA volumes added to the scene for this print_object. // Find the object index of this print_object in the Model::objects list. auto it = std::find(sla_print->model().objects.begin(), sla_print->model().objects.end(), model_object); @@ -1995,29 +2470,61 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re assert(it != model_object->instances.end()); int instance_idx = it - model_object->instances.begin(); for (size_t istep = 0; istep < sla_steps.size(); ++ istep) - if (state.step[istep].state == PrintStateBase::DONE) { - ModelVolumeState key(state.step[istep].timestamp, instance.instance_id.id); - auto it = std::lower_bound(aux_volume_state.begin(), aux_volume_state.end(), key, model_volume_state_lower); - assert(it != aux_volume_state.end() && it->geometry_id == key.geometry_id); - if (it->new_geometry()) { + if (sla_steps[istep] == slaposDrillHoles) { + // Hollowing is a special case, where the mesh from the backend is being loaded into the 1st volume of an instance, + // not into its own GLVolume. + // There shall always be such a GLVolume allocated. + ModelVolumeState key(model_object->volumes.front()->id(), instance.instance_id); + auto it = std::lower_bound(model_volume_state.begin(), model_volume_state.end(), key, model_volume_state_lower); + assert(it != model_volume_state.end() && it->geometry_id == key.geometry_id); + assert(!it->new_geometry()); + GLVolume &volume = *m_volumes.volumes[it->volume_idx]; + if (! volume.offsets.empty() && state.step[istep].timestamp != volume.offsets.front()) { + // The backend either produced a new hollowed mesh, or it invalidated the one that the front end has seen. + volume.indexed_vertex_array.release_geometry(); + if (state.step[istep].state == PrintStateBase::DONE) { + 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); +#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 + // to the GLVolume. We should refactor GLVolume significantly, so that the GLVolume will not contain member variables + // of various concenrs (model vs. 3D print path). + volume.offsets = { state.step[istep].timestamp }; + } else if (state.step[istep].state == PrintStateBase::DONE) { + // Check whether there is an existing auxiliary volume to be updated, or a new auxiliary volume to be created. + ModelVolumeState key(state.step[istep].timestamp, instance.instance_id.id); + auto it = std::lower_bound(aux_volume_state.begin(), aux_volume_state.end(), key, model_volume_state_lower); + assert(it != aux_volume_state.end() && it->geometry_id == key.geometry_id); + if (it->new_geometry()) { // This can be an SLA support structure that should not be rendered (in case someone used undo // to revert to before it was generated). If that's the case, we should not generate anything. if (model_object->sla_points_status != sla::PointsStatus::NoPoints) instances[istep].emplace_back(std::pair(instance_idx, print_instance_idx)); else shift_zs[object_idx] = 0.; + } else { + // Recycling an old GLVolume. Update the Object/Instance indices into the current Model. + m_volumes.volumes[it->volume_idx]->composite_id = GLVolume::CompositeID(object_idx, m_volumes.volumes[it->volume_idx]->volume_idx(), instance_idx); + m_volumes.volumes[it->volume_idx]->set_instance_transformation(model_object->instances[instance_idx]->get_transformation()); } - else { - // Recycling an old GLVolume. Update the Object/Instance indices into the current Model. - m_volumes.volumes[it->volume_idx]->composite_id = GLVolume::CompositeID(object_idx, m_volumes.volumes[it->volume_idx]->volume_idx(), instance_idx); - m_volumes.volumes[it->volume_idx]->set_instance_transformation(model_object->instances[instance_idx]->get_transformation()); - } } } -// // stores the current volumes count -// size_t volumes_count = m_volumes.volumes.size(); - for (size_t istep = 0; istep < sla_steps.size(); ++istep) if (!instances[istep].empty()) m_volumes.load_object_auxiliary(print_object, object_idx, instances[istep], sla_steps[istep], state.step[istep].timestamp, m_initialized); @@ -2081,24 +2588,27 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re // checks for geometry outside the print volume to render it accordingly if (!m_volumes.empty()) { - ModelInstance::EPrintVolumeState state; + 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(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 { _set_warning_texture(WarningTexture::ObjectOutside, false); _set_warning_texture(WarningTexture::ObjectClashed, false); + _set_warning_texture(WarningTexture::SlaSupportsOutside, false); post_event(Event(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, false)); } - m_camera.set_scene_box(scene_bounding_box()); + refresh_camera_scene_box(); if (m_selection.is_empty()) { @@ -2132,24 +2642,25 @@ static void reserve_new_volume_finalize_old_volume(GLVolume& vol_new, GLVolume& vol_old.finalize_geometry(gl_initialized); } +#if !ENABLE_GCODE_VIEWER static void load_gcode_retractions(const GCodePreviewData::Retraction& retractions, GLCanvas3D::GCodePreviewVolumeIndex::EType extrusion_type, GLVolumeCollection &volumes, GLCanvas3D::GCodePreviewVolumeIndex &volume_index, bool gl_initialized) { - volume_index.first_volumes.emplace_back(extrusion_type, 0, (unsigned int)volumes.volumes.size()); - // nothing to render, return if (retractions.positions.empty()) return; - GLVolume *volume = volumes.new_nontoolpath_volume(retractions.color.rgba, VERTEX_BUFFER_RESERVE_SIZE); + 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); 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.push_back(unscale(position.position(2))); - volume->offsets.push_back(volume->indexed_vertex_array.quad_indices.size()); - volume->offsets.push_back(volume->indexed_vertex_array.triangle_indices.size()); + volume->print_zs.emplace_back(unscale(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); @@ -2162,7 +2673,23 @@ static void load_gcode_retractions(const GCodePreviewData::Retraction& retractio } volume->indexed_vertex_array.finalize_geometry(gl_initialized); } +#endif // !ENABLE_GCODE_VIEWER +#if ENABLE_GCODE_VIEWER +void GLCanvas3D::load_gcode_preview(const GCodeProcessor::Result& gcode_result) +{ + m_gcode_viewer.load(gcode_result, *this->fff_print(), m_initialized); + if (wxGetApp().is_editor()) + _show_warning_texture_if_needed(WarningTexture::ToolpathOutside); +} + +void GLCanvas3D::refresh_gcode_preview(const GCodeProcessor::Result& gcode_result, const std::vector& str_tool_colors) +{ + m_gcode_viewer.refresh(gcode_result, str_tool_colors); + set_as_dirty(); + request_extra_frame(); +} +#else void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const std::vector& str_tool_colors) { const Print *print = this->fff_print(); @@ -2205,6 +2732,9 @@ void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const ++ 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]; @@ -2228,6 +2758,7 @@ void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const _generate_legend_texture(preview_data, tool_colors); } } +#endif // ENABLE_GCODE_VIEWER void GLCanvas3D::load_sla_preview() { @@ -2243,7 +2774,7 @@ void GLCanvas3D::load_sla_preview() } } -void GLCanvas3D::load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values) +void GLCanvas3D::load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values) { const Print *print = this->fff_print(); if (print == nullptr) @@ -2261,6 +2792,7 @@ void GLCanvas3D::load_preview(const std::vector& str_tool_colors, c _update_toolpath_volumes_outside_state(); _show_warning_texture_if_needed(WarningTexture::ToolpathOutside); +#if !ENABLE_GCODE_VIEWER if (color_print_values.empty()) reset_legend_texture(); else { @@ -2269,12 +2801,12 @@ void GLCanvas3D::load_preview(const std::vector& str_tool_colors, c const std::vector tool_colors = _parse_colors(str_tool_colors); _generate_legend_texture(preview_data, tool_colors); } +#endif // !ENABLE_GCODE_VIEWER } 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); @@ -2295,13 +2827,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); @@ -2322,6 +2856,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; } } @@ -2337,15 +2874,23 @@ void GLCanvas3D::on_idle(wxIdleEvent& evt) m_dirty |= m_main_toolbar.update_items_state(); m_dirty |= m_undoredo_toolbar.update_items_state(); - m_dirty |= m_view_toolbar.update_items_state(); + 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 (!m_dirty) return; _refresh_if_shown_on_screen(); - if (m_keep_dirty) + if (m_extra_frame_requested || mouse3d_controller_applied) { m_dirty = true; + m_extra_frame_requested = false; + evt.RequestMore(); + } + else + m_dirty = false; } void GLCanvas3D::on_char(wxKeyEvent& evt) @@ -2356,6 +2901,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)) { @@ -2363,7 +2909,7 @@ 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())) return; if (m_gizmos.on_char(evt)) @@ -2390,6 +2936,27 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) #endif /* __APPLE__ */ post_event(SimpleEvent(EVT_GLTOOLBAR_COPY)); break; + +#if ENABLE_CTRL_M_ON_WINDOWS + case WXK_CONTROL_M: + { + Mouse3DController& controller = wxGetApp().plater()->get_mouse3d_controller(); + controller.show_settings_dialog(!controller.is_settings_dialog_shown()); + m_dirty = true; + break; + } +#else +#if defined(__linux__) || defined(__APPLE__) + case WXK_CONTROL_M: + { + 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': case 'V': @@ -2400,6 +2967,16 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) break; +#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': @@ -2422,6 +2999,18 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); break; default: evt.Skip(); } + } + else if ((evt.GetModifiers() & shiftMask) != 0) { + switch (keyCode) { + case 'g': + case 'G': { + if (dynamic_cast(m_canvas->GetParent()) != nullptr) + post_event(wxKeyEvent(EVT_GLCANVAS_JUMP_TO, evt)); + break; + } + default: + evt.Skip(); + } } else if (evt.HasModifiers()) { evt.Skip(); } else { @@ -2432,6 +3021,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) 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 '0': { select_view("iso"); break; } case '1': { select_view("top"); break; } case '2': { select_view("bottom"); break; } @@ -2456,29 +3046,178 @@ void GLCanvas3D::on_char(wxKeyEvent& evt) case 'a': { post_event(SimpleEvent(EVT_GLCANVAS_ARRANGE)); break; } case 'B': case 'b': { zoom_to_bed(); break; } + case 'E': + case 'e': { m_labels.show(!m_labels.is_shown()); m_dirty = true; break; } case 'I': - case 'i': { set_camera_zoom(1.0); break; } + 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; } +#if ENABLE_GCODE_VIEWER + 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; + } +#endif // ENABLE_GCODE_VIEWER case 'O': - case 'o': { set_camera_zoom(-1.0); break; } + 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': +#if ENABLE_GCODE_VIEWER + 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; + } +#else case 'z': { m_selection.is_empty() ? zoom_to_volumes() : zoom_to_selection(); break; } +#endif // ENABLE_GCODE_VIEWER default: { evt.Skip(); break; } } } } +class TranslationProcessor +{ + using UpAction = std::function; + using DownAction = std::function; + + UpAction m_up_action{ nullptr }; + DownAction m_down_action{ nullptr }; + + bool m_running{ false }; + Vec3d m_direction{ Vec3d::UnitX() }; + +public: + TranslationProcessor(UpAction up_action, DownAction down_action) + : m_up_action(up_action), m_down_action(down_action) + { + } + + void process(wxKeyEvent& evt) + { + const int keyCode = evt.GetKeyCode(); + wxEventType type = evt.GetEventType(); + if (type == wxEVT_KEY_UP) { + switch (keyCode) + { + case WXK_NUMPAD_LEFT: case WXK_LEFT: + case WXK_NUMPAD_RIGHT: case WXK_RIGHT: + case WXK_NUMPAD_UP: case WXK_UP: + case WXK_NUMPAD_DOWN: case WXK_DOWN: + { + m_running = false; + m_up_action(); + break; + } + default: { break; } + } + } + else if (type == wxEVT_KEY_DOWN) { + bool apply = false; + + switch (keyCode) + { + case WXK_SHIFT: + { + if (m_running) + apply = true; + + break; + } + case WXK_NUMPAD_LEFT: + case WXK_LEFT: + { + m_direction = -Vec3d::UnitX(); + apply = true; + break; + } + case WXK_NUMPAD_RIGHT: + case WXK_RIGHT: + { + m_direction = Vec3d::UnitX(); + apply = true; + break; + } + case WXK_NUMPAD_UP: + case WXK_UP: + { + m_direction = Vec3d::UnitY(); + apply = true; + break; + } + case WXK_NUMPAD_DOWN: + case WXK_DOWN: + { + m_direction = -Vec3d::UnitY(); + apply = true; + break; + } + default: { break; } + } + + if (apply) { + m_running = true; + m_down_action(m_direction, evt.ShiftDown(), evt.CmdDown()); + } + } + } +}; + void GLCanvas3D::on_key(wxKeyEvent& evt) { + static TranslationProcessor translationProcessor( + [this]() { + do_move(L("Gizmo-Move")); + m_gizmos.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. + post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); + // updates camera target constraints + refresh_camera_scene_box(); + m_dirty = true; + }, + [this](const Vec3d& direction, bool slow, bool camera_space) { + m_selection.start_dragging(); + double multiplier = slow ? 1.0 : 10.0; + + Vec3d displacement; + if (camera_space) + { + Eigen::Matrix 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; + } + else + displacement = multiplier * direction; + + m_selection.translate(displacement); + m_dirty = true; + } + ); + const int keyCode = evt.GetKeyCode(); auto imgui = wxGetApp().imgui(); @@ -2495,8 +3234,14 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) // m_canvas->HandleAsNavigationKey(evt); // XXX: Doesn't work in some cases / on Linux post_event(SimpleEvent(EVT_GLCANVAS_TAB)); } + else if (keyCode == WXK_TAB && evt.ShiftDown() && ! 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()) { _update_selection_from_hover(); @@ -2519,11 +3264,37 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } else if (keyCode == WXK_CONTROL) m_dirty = true; + else if (m_gizmos.is_enabled() && !m_selection.is_empty()) { + translationProcessor.process(evt); + + switch (keyCode) + { + case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP: + case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN: + { + do_rotate(L("Gizmo-Rotate")); + m_gizmos.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. + post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED)); + // updates camera target constraints + refresh_camera_scene_box(); + m_dirty = true; + + break; + } + default: { break; } + } + } } else if (evt.GetEventType() == wxEVT_KEY_DOWN) { m_tab_down = keyCode == WXK_TAB && !evt.HasAnyModifiers(); if (keyCode == WXK_SHIFT) { + translationProcessor.process(evt); + if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)) { m_mouse.ignore_left_up = false; @@ -2540,14 +3311,39 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) } else if (keyCode == WXK_CONTROL) m_dirty = true; - // DoubleSlider navigation in Preview - else if (keyCode == WXK_LEFT || - keyCode == WXK_RIGHT || - keyCode == WXK_UP || - keyCode == WXK_DOWN ) + else if (m_gizmos.is_enabled() && !m_selection.is_empty()) { - if (dynamic_cast(m_canvas->GetParent()) != nullptr) - post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, evt)); + 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)); + m_dirty = true; +// wxGetApp().obj_manipul()->set_dirty(); + }; + + translationProcessor.process(evt); + + switch (keyCode) + { + case WXK_NUMPAD_PAGEUP: case WXK_PAGEUP: { do_rotate(0.25 * M_PI); break; } + case WXK_NUMPAD_PAGEDOWN: case WXK_PAGEDOWN: { do_rotate(-0.25 * M_PI); break; } + default: { break; } + } + } + else if (!m_gizmos.is_enabled()) + { + // DoubleSlider navigation in Preview + if (keyCode == WXK_LEFT || + keyCode == WXK_RIGHT || + keyCode == WXK_UP || + keyCode == WXK_DOWN) + { + if (dynamic_cast(m_canvas->GetParent()) != nullptr) +#if ENABLE_GCODE_VIEWER + post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_LAYERS_SLIDER, evt)); +#else + post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, evt)); +#endif // ENABLE_GCODE_VIEWER + } } } } @@ -2564,6 +3360,12 @@ void GLCanvas3D::on_key(wxKeyEvent& evt) void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt) { +#ifdef WIN32 + // Try to filter out spurious mouse wheel events comming from 3D mouse. + if (wxGetApp().plater()->get_mouse3d_controller().process_mouse_wheel()) + return; +#endif + if (!m_initialized) return; @@ -2577,6 +3379,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. @@ -2603,12 +3410,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 - set_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) @@ -2667,22 +3484,33 @@ std::string format_mouse_event_debug_message(const wxMouseEvent &evt) void GLCanvas3D::on_mouse(wxMouseEvent& evt) { + if (!m_initialized || !_set_current()) + return; + #if ENABLE_RETINA_GL const float scale = m_retina_helper->get_scale_factor(); evt.SetX(evt.GetX() * scale); evt.SetY(evt.GetY() * scale); #endif - Point pos(evt.GetX(), evt.GetY()); + Point pos(evt.GetX(), evt.GetY()); - ImGuiWrapper *imgui = wxGetApp().imgui(); + 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(); + m_tooltip.set_in_imgui(true); render(); #ifdef SLIC3R_DEBUG_MOUSE_EVENTS - printf((format_mouse_event_debug_message(evt) + " - Consumed by ImGUI\n").c_str()); + printf((format_mouse_event_debug_message(evt) + " - Consumed by ImGUI\n").c_str()); #endif /* SLIC3R_DEBUG_MOUSE_EVENTS */ - return; + m_dirty = true; + // do not return if dragging or tooltip not empty to allow for tooltip update + if (!m_mouse.dragging && m_tooltip.is_empty()) + return; } #ifdef __WXMSW__ @@ -2703,48 +3531,50 @@ 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_picking_enabled) - _set_current(); + if (m_gizmos.on_mouse(evt)) { + if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) + mouse_up_cleanup(); + + m_mouse.set_start_position_3D_as_invalid(); + m_mouse.position = pos.cast(); + 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(); } @@ -2753,8 +3583,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 @@ -2767,69 +3596,53 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) if (top_level_wnd && top_level_wnd->IsActive()) m_canvas->SetFocus(); m_mouse.position = pos.cast(); + 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()) 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 ((layer_editing_object_idx != -1) && m_layers_editing.reset_rect_contains(*this, pos(0), pos(1))) - { - if (evt.LeftDown()) - { - // A volume is selected and the mouse is inside the reset button. Reset the ModelObject's layer height profile. - m_layers_editing.reset_layer_height_profile(*this); - // Index 2 means no editing, just wait for mouse up event. - m_layers_editing.state = LayersEditing::Completed; - - m_dirty = true; - } - } - 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(); @@ -2838,8 +3651,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) @@ -2849,8 +3661,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 @@ -2863,16 +3674,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; @@ -2884,18 +3692,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 (m_camera.get_theta() == 90.0f) - { + 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(); @@ -2907,8 +3711,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); @@ -2917,8 +3721,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; @@ -2932,90 +3735,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()); 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)) - { - 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(); + } } // 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()) - { - const Vec3d& orig = m_mouse.drag.start_position_3D; - float sign = m_camera.inverted_phi ? -1.0f : 1.0f; - m_camera.phi += sign * ((float)pos(0) - (float)orig(0)) * TRACKBALLSIZE; - m_camera.set_theta(m_camera.get_theta() - ((float)pos(1) - (float)orig(1)) * TRACKBALLSIZE, wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA); + 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 (wxGetApp().app_config->get("use_free_camera") == "1") + // Virtual track ball (similar to the 3DConnexion mouse). + 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); + } + 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); - m_camera.set_target(m_camera.get_target() + orig - cur_pos); + 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. + 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.LeftUp() && m_mouse.dragging) - // Flips X mouse deltas if bed is upside down - m_camera.inverted_phi = (m_camera.get_dir_up()(2) < 0.0); - else if (evt.RightUp()) - { + else if (evt.RightUp()) { m_mouse.position = pos.cast(); // 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 @@ -3047,32 +3853,20 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt) mouse_up_cleanup(); } - else if (evt.Moving()) - { + else if (evt.Moving()) { m_mouse.position = pos.cast(); - std::string tooltip = ""; - - 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); // updates gizmos overlay if (m_selection.is_empty()) m_gizmos.reset_all_states(); +#if ENABLE_GCODE_VIEWER + m_dirty = true; +#else // Only refresh if picking is enabled, in that case the objects may get highlighted if the mouse cursor hovers over. - if (m_picking_enabled) + //if (m_picking_enabled) m_dirty = true; +#endif // ENABLE_GCODE_VIEWER } else evt.Skip(); @@ -3092,6 +3886,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; @@ -3126,6 +3927,7 @@ Vec2d GLCanvas3D::get_local_mouse_position() const return Vec2d(factor * mouse_pos.x, factor * mouse_pos.y); } +#if !ENABLE_GCODE_VIEWER void GLCanvas3D::reset_legend_texture() { if (m_legend_texture.get_id() != 0) @@ -3134,25 +3936,14 @@ void GLCanvas3D::reset_legend_texture() m_legend_texture.reset(); } } +#endif // !ENABLE_GCODE_VIEWER void GLCanvas3D::set_tooltip(const std::string& tooltip) const { if (m_canvas != nullptr) - { - 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())); - } + m_tooltip.set_text(tooltip); } - void GLCanvas3D::do_move(const std::string& snapshot_type) { if (m_model == nullptr) @@ -3391,13 +4182,6 @@ void GLCanvas3D::do_mirror(const std::string& snapshot_type) m_dirty = true; } -void GLCanvas3D::set_camera_zoom(double zoom) -{ - const Size& cnv_size = get_canvas_size(); - m_camera.set_zoom(zoom, _max_bounding_box(false, true), cnv_size.get_width(), cnv_size.get_height()); - m_dirty = true; -} - void GLCanvas3D::update_gizmos_on_off_state() { set_as_dirty(); @@ -3423,7 +4207,6 @@ void GLCanvas3D::handle_layers_data_focus_event(const t_layer_height_range range void GLCanvas3D::update_ui_from_settings() { - m_camera.set_type(wxGetApp().app_config->get("use_perspective_camera")); m_dirty = true; #if ENABLE_RETINA_GL @@ -3437,14 +4220,21 @@ 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 ENABLE_GCODE_VIEWER + if (wxGetApp().is_editor()) + wxGetApp().plater()->enable_collapse_toolbar(wxGetApp().app_config->get("show_collapse_button") == "1"); +#else + bool enable_collapse = wxGetApp().app_config->get("show_collapse_button") == "1"; + wxGetApp().plater()->get_collapse_toolbar().set_enabled(enable_collapse); +#endif // ENABLE_GCODE_VIEWER } - - GLCanvas3D::WipeTowerInfo GLCanvas3D::get_wipe_tower_info() const { WipeTowerInfo wti; @@ -3472,7 +4262,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) @@ -3494,14 +4284,32 @@ 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 { +#if ENABLE_GCODE_VIEWER + return m_gcode_viewer.has_data(); +#else return m_volumes.has_toolpaths_to_export(); +#endif // ENABLE_GCODE_VIEWER } void GLCanvas3D::export_toolpaths_to_obj(const char* filename) const { +#if ENABLE_GCODE_VIEWER + m_gcode_viewer.export_toolpaths_to_obj(filename); +#else m_volumes.export_toolpaths_to_obj(filename); +#endif // ENABLE_GCODE_VIEWER } void GLCanvas3D::mouse_up_cleanup() @@ -3529,14 +4337,15 @@ 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) +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); - imgui->set_next_window_bg_alpha(0.5f); - std::string title = is_undo ? L("Undo History") : L("Redo History"); + std::string title = is_undo ? L("Undo History") : L("Redo History"); imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); int hovered = m_imgui_undo_redo_hovered_pos; @@ -3546,20 +4355,82 @@ void GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) 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(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; } -#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) @@ -3583,27 +4454,23 @@ static void debug_output_thumbnail(const ThumbnailData& thumbnail_data) } #endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT - -static void render_volumes_in_thumbnail(Shader& shader, const GLVolumePtrs& volumes, ThumbnailData& thumbnail_data, bool printable_only, bool parts_only, bool transparent_background) +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 orange = { 0.923f, 0.504f, 0.264f, 1.0f }; + static const std::array gray = { 0.64f, 0.64f, 0.64f, 1.0f }; GLVolumePtrs visible_volumes; - for (GLVolume* vol : 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.push_back(vol); + visible_volumes.emplace_back(vol); } } @@ -3611,53 +4478,62 @@ static void render_volumes_in_thumbnail(Shader& shader, const GLVolumePtrs& volu return; BoundingBoxf3 box; - for (const GLVolume* vol : visible_volumes) - { + for (const GLVolume* vol : visible_volumes) { box.merge(vol->transformed_bounding_box()); } Camera camera; camera.set_type(Camera::Ortho); - camera.zoom_to_volumes(visible_volumes, thumbnail_data.width, thumbnail_data.height); + camera.set_scene_box(scene_bounding_box()); camera.apply_viewport(0, 0, thumbnail_data.width, thumbnail_data.height); + camera.zoom_to_volumes(visible_volumes); camera.apply_view_matrix(); - camera.apply_projection(box); + + double near_z = -1.0; + double far_z = -1.0; + + 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 = 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(1.0f, 1.0f, 1.0f, 0.0f)); + 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)); - shader.start_using(); - - GLint shader_id = 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 (const GLVolume* vol : visible_volumes) { + shader->set_uniform("uniform_color", (vol->printable && !vol->is_outside) ? orange : gray); vol->render(); } - 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)); } -void GLCanvas3D::_render_thumbnail_framebuffer(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, bool printable_only, bool parts_only, bool transparent_background) +void GLCanvas3D::_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 { thumbnail_data.set(w, h); if (!thumbnail_data.is_valid()) @@ -3710,7 +4586,7 @@ void GLCanvas3D::_render_thumbnail_framebuffer(ThumbnailData& thumbnail_data, un if (::glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE) { - render_volumes_in_thumbnail(m_shader, m_volumes.volumes, thumbnail_data, printable_only, parts_only, transparent_background); + _render_thumbnail_internal(thumbnail_data, printable_only, parts_only, show_bed, transparent_background); if (multisample) { @@ -3761,7 +4637,7 @@ void GLCanvas3D::_render_thumbnail_framebuffer(ThumbnailData& thumbnail_data, un glsafe(::glDisable(GL_MULTISAMPLE)); } -void GLCanvas3D::_render_thumbnail_framebuffer_ext(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, bool printable_only, bool parts_only, bool transparent_background) +void GLCanvas3D::_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 { thumbnail_data.set(w, h); if (!thumbnail_data.is_valid()) @@ -3814,7 +4690,7 @@ void GLCanvas3D::_render_thumbnail_framebuffer_ext(ThumbnailData& thumbnail_data if (::glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT) { - render_volumes_in_thumbnail(m_shader, m_volumes.volumes, thumbnail_data, printable_only, parts_only, transparent_background); + _render_thumbnail_internal(thumbnail_data, printable_only, parts_only, show_bed, transparent_background); if (multisample) { @@ -3865,7 +4741,7 @@ void GLCanvas3D::_render_thumbnail_framebuffer_ext(ThumbnailData& thumbnail_data glsafe(::glDisable(GL_MULTISAMPLE)); } -void GLCanvas3D::_render_thumbnail_legacy(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, bool printable_only, bool parts_only, bool transparent_background) +void GLCanvas3D::_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 { // check that thumbnail size does not exceed the default framebuffer size const Size& cnv_size = get_canvas_size(); @@ -3882,7 +4758,7 @@ void GLCanvas3D::_render_thumbnail_legacy(ThumbnailData& thumbnail_data, unsigne if (!thumbnail_data.is_valid()) return; - render_volumes_in_thumbnail(m_shader, m_volumes.volumes, thumbnail_data, printable_only, parts_only, transparent_background); + _render_thumbnail_internal(thumbnail_data, printable_only, parts_only, show_bed, transparent_background); glsafe(::glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (void*)thumbnail_data.pixels.data())); #if ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT @@ -3890,9 +4766,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() { @@ -3902,6 +4777,12 @@ bool GLCanvas3D::_init_toolbars() if (!_init_undoredo_toolbar()) return false; + if (!_init_view_toolbar()) + return false; + + if (!_init_collapse_toolbar()) + return false; + return true; } @@ -3930,7 +4811,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; @@ -4040,14 +4921,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("Height ranges")); - item.sprite_id = 10; - item.left.toggable = true; + item.tooltip = _utf8(L("Variable layer height")); + 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")) @@ -4055,7 +4973,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; @@ -4087,18 +5006,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"); @@ -4126,11 +5051,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"); @@ -4155,10 +5086,23 @@ bool GLCanvas3D::_init_undoredo_toolbar() if (!m_undoredo_toolbar.add_item(item)) return false; - + /* + if (!m_undoredo_toolbar.add_separator()) + return false; + */ return true; } +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); @@ -4166,7 +5110,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(); @@ -4180,11 +5124,6 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h) // ensures that this canvas is current _set_current(); - - // updates camera - m_camera.apply_viewport(0, 0, w, h); - - m_dirty = false; } BoundingBoxf3 GLCanvas3D::_max_bounding_box(bool include_gizmos, bool include_bed_model) const @@ -4201,25 +5140,27 @@ 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 ENABLE_GCODE_VIEWER + if (!m_main_toolbar.is_enabled()) + bb.merge(m_gcode_viewer.get_max_bounding_box()); +#endif // ENABLE_GCODE_VIEWER + return bb; } -#if ENABLE_THUMBNAIL_GENERATOR void GLCanvas3D::_zoom_to_box(const BoundingBoxf3& box, double margin_factor) { - const Size& cnv_size = get_canvas_size(); - m_camera.zoom_to_box(box, cnv_size.get_width(), cnv_size.get_height(), margin_factor); + wxGetApp().plater()->get_camera().zoom_to_box(box, margin_factor); m_dirty = true; } -#else -void GLCanvas3D::_zoom_to_box(const BoundingBoxf3& box) + +void GLCanvas3D::_update_camera_zoom(double zoom) { - const Size& cnv_size = get_canvas_size(); - m_camera.zoom_to_box(box, cnv_size.get_width(), cnv_size.get_height()); + wxGetApp().plater()->get_camera().update_zoom(zoom); m_dirty = true; } -#endif // ENABLE_THUMBNAIL_GENERATOR void GLCanvas3D::_refresh_if_shown_on_screen() { @@ -4236,8 +5177,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. @@ -4253,7 +5193,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); @@ -4271,17 +5211,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.push_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 @@ -4366,8 +5306,42 @@ void GLCanvas3D::_rectangular_selection_picking_pass() const _update_volumes_hover_state(); } +#if ENABLE_GCODE_VIEWER +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(config.option("bed_shape")); + if (opt != nullptr) { + BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values)); + ret = BoundingBoxf3(Vec3d(unscale(bed_box_2D.min(0)) - tolerance_x, unscale(bed_box_2D.min(1)) - tolerance_y, 0.0), Vec3d(unscale(bed_box_2D.max(0)) + tolerance_x, unscale(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; +} +#endif // ENABLE_GCODE_VIEWER + void GLCanvas3D::_render_background() const { +#if ENABLE_GCODE_VIEWER + 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; + } + } +#endif // ENABLE_GCODE_VIEWER + glsafe(::glPushMatrix()); glsafe(::glLoadIdentity()); glsafe(::glMatrixMode(GL_PROJECTION)); @@ -4378,7 +5352,11 @@ void GLCanvas3D::_render_background() const glsafe(::glDisable(GL_DEPTH_TEST)); ::glBegin(GL_QUADS); +#if ENABLE_GCODE_VIEWER + if (use_error_color) +#else if (m_dynamic_background_enabled && _is_any_volume_outside()) +#endif // ENABLE_GCODE_VIEWER ::glColor3fv(ERROR_BG_DARK_COLOR); else ::glColor3fv(DEFAULT_BG_DARK_COLOR); @@ -4386,8 +5364,12 @@ void GLCanvas3D::_render_background() const ::glVertex2f(-1.0f, -1.0f); ::glVertex2f(1.0f, -1.0f); +#if ENABLE_GCODE_VIEWER + if (use_error_color) +#else if (m_dynamic_background_enabled && _is_any_volume_outside()) - ::glColor3fv(ERROR_BG_LIGHT_COLOR); +#endif // ENABLE_GCODE_VIEWER +::glColor3fv(ERROR_BG_LIGHT_COLOR); else ::glColor3fv(DEFAULT_BG_LIGHT_COLOR); @@ -4402,13 +5384,20 @@ void GLCanvas3D::_render_background() const glsafe(::glPopMatrix()); } -void GLCanvas3D::_render_bed(float theta) 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(*this), theta, scale_factor); + + 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(*this), bottom, scale_factor, show_axes, show_texture); } void GLCanvas3D::_render_objects() const @@ -4416,21 +5405,16 @@ 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(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); + 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), (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")); m_volumes.check_outside_state(m_config, nullptr); } @@ -4443,36 +5427,59 @@ 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 } +#if ENABLE_GCODE_VIEWER +void GLCanvas3D::_render_gcode() const +{ + m_gcode_viewer.render(); +} +#endif // ENABLE_GCODE_VIEWER + 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); @@ -4485,27 +5492,105 @@ 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(); +#if !ENABLE_GCODE_VIEWER _render_legend_texture(); +#endif // !ENABLE_GCODE_VIEWER + + // 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*/); + 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*/)); + 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)) m_layers_editing.render_overlay(*this); + const ConfigOptionBool* opt = dynamic_cast(m_config->option("complete_objects")); + bool sequential_print = opt != nullptr && opt->value; + std::vector sorted_instances; + if (sequential_print) { + for (ModelObject* model_object : m_model->objects) + for (ModelInstance* model_instance : model_object->instances) { + sorted_instances.emplace_back(model_instance); + } + } + m_labels.render(sorted_instances); + glsafe(::glPopMatrix()); } @@ -4514,6 +5599,7 @@ void GLCanvas3D::_render_warning_texture() const m_warning_texture.render(*this); } +#if !ENABLE_GCODE_VIEWER void GLCanvas3D::_render_legend_texture() const { if (!m_legend_texture_enabled) @@ -4521,6 +5607,7 @@ void GLCanvas3D::_render_legend_texture() const m_legend_texture.render(*this); } +#endif // !ENABLE_GCODE_VIEWER void GLCanvas3D::_render_volumes_for_picking() const { @@ -4532,7 +5619,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) @@ -4580,23 +5667,13 @@ void GLCanvas3D::_render_main_toolbar() const if (!m_main_toolbar.is_enabled()) return; -#if ENABLE_RETINA_GL -// m_main_toolbar.set_scale(m_retina_helper->get_scale_factor()); - const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(true); - m_main_toolbar.set_scale(scale); //! #ys_FIXME_experiment -#else -// m_main_toolbar.set_scale(m_canvas->GetContentScaleFactor()); -// m_main_toolbar.set_scale(wxGetApp().em_unit()*0.1f); - const float size = int(GLToolbar::Default_Icons_Size * wxGetApp().toolbar_icon_scale(true)); - m_main_toolbar.set_icons_size(size); //! #ys_FIXME_experiment -#endif // ENABLE_RETINA_GL - Size cnv_size = get_canvas_size(); - float zoom = (float)m_camera.get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + 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); @@ -4607,49 +5684,56 @@ void GLCanvas3D::_render_undoredo_toolbar() const if (!m_undoredo_toolbar.is_enabled()) return; -#if ENABLE_RETINA_GL -// m_undoredo_toolbar.set_scale(m_retina_helper->get_scale_factor()); - const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(true); - m_undoredo_toolbar.set_scale(scale); //! #ys_FIXME_experiment -#else -// m_undoredo_toolbar.set_scale(m_canvas->GetContentScaleFactor()); -// m_undoredo_toolbar.set_scale(wxGetApp().em_unit()*0.1f); - const float size = int(GLToolbar::Default_Icons_Size * wxGetApp().toolbar_icon_scale(true)); - m_undoredo_toolbar.set_icons_size(size); //! #ys_FIXME_experiment -#endif // ENABLE_RETINA_GL - Size cnv_size = get_canvas_size(); - float zoom = (float)m_camera.get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + 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 + view_toolbar.set_scale(scale); //! #ys_FIXME_experiment #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); //! #ys_FIXME_experiment #endif // ENABLE_RETINA_GL Size cnv_size = get_canvas_size(); - float zoom = (float)m_camera.get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + 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 @@ -4801,7 +5885,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 @@ -4928,10 +6012,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& 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& 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; @@ -4984,29 +6068,26 @@ void GLCanvas3D::_load_print_toolpaths() if ((skirt_height == 0) && (print->config().brim_width.value > 0)) skirt_height = 1; - // get first skirt_height layers (maybe this should be moved to a PrintObject method?) - const PrintObject* object0 = print->objects().front(); + // Get first skirt_height layers. + //FIXME This code is fishy. It may not work for multiple objects with different layering due to variable layer height feature. + // This is not critical as this is just an initial preview. + const PrintObject* highest_object = *std::max_element(print->objects().begin(), print->objects().end(), [](auto l, auto r){ return l->layers().size() < r->layers().size(); }); std::vector print_zs; print_zs.reserve(skirt_height * 2); - for (size_t i = 0; i < std::min(skirt_height, object0->layers().size()); ++i) - { - print_zs.push_back(float(object0->layers()[i]->print_z)); - } - //FIXME why there are support layers? - for (size_t i = 0; i < std::min(skirt_height, object0->support_layers().size()); ++i) - { - print_zs.push_back(float(object0->support_layers()[i]->print_z)); - } + for (size_t i = 0; i < std::min(skirt_height, highest_object->layers().size()); ++ i) + print_zs.emplace_back(float(highest_object->layers()[i]->print_z)); + // Only add skirt for the raft layers. + for (size_t i = 0; i < std::min(skirt_height, std::min(highest_object->slicing_parameters().raft_layers(), highest_object->support_layers().size())); ++ i) + print_zs.emplace_back(float(highest_object->support_layers()[i]->print_z)); sort_remove_duplicates(print_zs); - if (print_zs.size() > skirt_height) - print_zs.erase(print_zs.begin() + skirt_height, print_zs.end()); - + skirt_height = std::min(skirt_height, print_zs.size()); + print_zs.erase(print_zs.begin() + skirt_height, print_zs.end()); GLVolume *volume = m_volumes.new_toolpath_volume(color, VERTEX_BUFFER_RESERVE_SIZE); - for (size_t i = 0; i < skirt_height; ++i) { - volume->print_zs.push_back(print_zs[i]); - volume->offsets.push_back(volume->indexed_vertex_array.quad_indices.size()); - volume->offsets.push_back(volume->indexed_vertex_array.triangle_indices.size()); + for (size_t i = 0; i < skirt_height; ++ i) { + volume->print_zs.emplace_back(print_zs[i]); + volume->offsets.emplace_back(volume->indexed_vertex_array.quad_indices.size()); + volume->offsets.emplace_back(volume->indexed_vertex_array.triangle_indices.size()); if (i == 0) _3DScene::extrusionentity_to_verts(print->brim(), print_zs[i], Point(0, 0), *volume); _3DScene::extrusionentity_to_verts(print->skirt(), print_zs[i], Point(0, 0), *volume); @@ -5020,23 +6101,26 @@ void GLCanvas3D::_load_print_toolpaths() volume->indexed_vertex_array.finalize_geometry(m_initialized); } -void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, const std::vector& str_tool_colors, const std::vector& color_print_values) +void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, const std::vector& str_tool_colors, const std::vector& color_print_values) { std::vector tool_colors = _parse_colors(str_tool_colors); struct Ctxt { - const Points *shifted_copies; + const PrintInstances *shifted_copies; std::vector layers; bool has_perimeters; bool has_infill; bool has_support; const std::vector* tool_colors; - const std::vector* color_print_values; + bool is_single_material_print; + int extruders_cnt; + const std::vector* color_print_values; static const float* color_perimeters() { static float color[4] = { 1.0f, 1.0f, 0.0f, 1.f }; return color; } // yellow static const float* color_infill() { static float color[4] = { 1.0f, 0.5f, 0.5f, 1.f }; return color; } // redish static const float* color_support() { static float color[4] = { 0.5f, 1.0f, 0.5f, 1.f }; return color; } // greenish + static const float* color_pause_or_custom_code() { static float color[4] = { 0.5f, 0.5f, 0.5f, 1.f }; return color; } // gray // For cloring by a tool, return a parsed color. bool color_by_tool() const { return tool_colors != nullptr; } @@ -5046,9 +6130,106 @@ 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 { - auto it = std::lower_bound(color_print_values->begin(), color_print_values->end(), layers[layer_idx]->print_z + EPSILON); + 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(); } + + const size_t color_print_color_idx_by_layer_idx_and_extruder(const size_t layer_idx, const int extruder) const + { + const coordf_t print_z = layers[layer_idx]->print_z; + + auto it = std::find_if(color_print_values->begin(), color_print_values->end(), + [print_z](const CustomGCode::Item& code) + { return fabs(code.print_z - print_z) < EPSILON; }); + if (it != color_print_values->end()) + { + CustomGCode::Type type = it->type; + // pause print or custom Gcode + 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 (type == CustomGCode::ToolChange) + return get_color_idx_for_tool_change(it, extruder); + // change color for current extruder + 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, 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->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->type == CustomGCode::ToolChange) + return get_color_idx_for_tool_change(it, extruder); + } + + return std::min(extruders_cnt - 1, std::max(extruder - 1, 0));; + } + + private: + int get_m600_color_idx(std::vector::const_iterator it) const + { + int shift = 0; + while (it != color_print_values->begin()) { + --it; + if (it->type == CustomGCode::ColorChange) + shift++; + } + return extruders_cnt + shift; + } + + int get_color_idx_for_tool_change(std::vector::const_iterator it, const int extruder) const + { + const int current_extruder = it->extruder == 0 ? extruder : it->extruder; + if (number_tools() == extruders_cnt + 1) // there is no one "M600" + return std::min(extruders_cnt - 1, std::max(current_extruder - 1, 0)); + + auto it_n = it; + while (it_n != color_print_values->begin()) { + --it_n; + if (it_n->type == CustomGCode::ColorChange && it_n->extruder == current_extruder) + return get_m600_color_idx(it_n); + } + + return std::min(extruders_cnt - 1, std::max(current_extruder - 1, 0)); + } + + int get_color_idx_for_color_change(std::vector::const_iterator it, const int extruder) const + { + if (extruders_cnt == 1) + return get_m600_color_idx(it); + + auto it_n = it; + bool is_tool_change = false; + while (it_n != color_print_values->begin()) { + --it_n; + 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); + break; + } + } + if (!is_tool_change && it->extruder == extruder) + return get_m600_color_idx(it); + + return -1; + } + } ctxt; ctxt.has_perimeters = print_object.is_step_done(posPerimeters); @@ -5056,8 +6237,10 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c ctxt.has_support = print_object.is_step_done(posSupportMaterial); ctxt.tool_colors = tool_colors.empty() ? nullptr : &tool_colors; ctxt.color_print_values = color_print_values.empty() ? nullptr : &color_print_values; + ctxt.is_single_material_print = this->fff_print()->extruders().size()==1; + ctxt.extruders_cnt = wxGetApp().extruders_edited_cnt(); - ctxt.shifted_copies = &print_object.copies(); + ctxt.shifted_copies = &print_object.instances(); // order layers by print_z { @@ -5070,15 +6253,17 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c } if (ctxt.has_perimeters || ctxt.has_infill) for (const Layer *layer : print_object.layers()) - ctxt.layers.push_back(layer); + ctxt.layers.emplace_back(layer); if (ctxt.has_support) for (const Layer *layer : print_object.support_layers()) - ctxt.layers.push_back(layer); + ctxt.layers.emplace_back(layer); std::sort(ctxt.layers.begin(), ctxt.layers.end(), [](const Layer *l1, const Layer *l2) { return l1->print_z < l2->print_z; }); // Maximum size of an allocation block: 32MB / sizeof(float) BOOST_LOG_TRIVIAL(debug) << "Loading print object toolpaths in parallel - start" << m_volumes.log_memory_info() << log_memory_info(); + const bool is_selected_separate_extruder = m_selected_extruder > 0 && ctxt.color_by_color_print(); + //FIXME Improve the heuristics for a grain size. size_t grain_size = std::max(ctxt.layers.size() / 16, size_t(1)); tbb::spin_mutex new_volume_mutex; @@ -5096,32 +6281,18 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c const size_t volumes_cnt_initial = m_volumes.volumes.size(); tbb::parallel_for( tbb::blocked_range(0, ctxt.layers.size(), grain_size), - [&ctxt, &new_volume](const tbb::blocked_range& range) { + [&ctxt, &new_volume, is_selected_separate_extruder, this](const tbb::blocked_range& range) { GLVolumePtrs vols; std::vector color_print_layer_to_glvolume; - auto volume = [&ctxt, &vols, &color_print_layer_to_glvolume, &range](size_t layer_idx, int extruder, int feature) -> GLVolume& { - return *vols[ctxt.color_by_color_print() ? - color_print_layer_to_glvolume[layer_idx - range.begin()] : + auto volume = [&ctxt, &vols, &color_print_layer_to_glvolume, &range](size_t layer_idx, int extruder, int feature) -> GLVolume& { + return *vols[ctxt.color_by_color_print()? + ctxt.color_print_color_idx_by_layer_idx_and_extruder(layer_idx, extruder) : ctxt.color_by_tool() ? std::min(ctxt.number_tools() - 1, std::max(extruder - 1, 0)) : feature ]; }; - if (ctxt.color_by_color_print()) { - // Create a map from the layer index to a GLVolume, which is initialized with the correct layer span color. - std::vector color_print_tool_to_glvolume(ctxt.number_tools(), -1); - color_print_layer_to_glvolume.reserve(range.end() - range.begin()); - vols.reserve(ctxt.number_tools()); - for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { - int idx_tool = (int)ctxt.color_print_color_idx_by_layer_idx(idx_layer); - if (color_print_tool_to_glvolume[idx_tool] == -1) { - color_print_tool_to_glvolume[idx_tool] = (int)vols.size(); - vols.emplace_back(new_volume(ctxt.color_tool(idx_tool))); - } - color_print_layer_to_glvolume.emplace_back(color_print_tool_to_glvolume[idx_tool]); - } - } - else if (ctxt.color_by_tool()) { + if (ctxt.color_by_color_print() || ctxt.color_by_tool()) { for (size_t i = 0; i < ctxt.number_tools(); ++i) vols.emplace_back(new_volume(ctxt.color_tool(i))); } @@ -5132,14 +6303,43 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c vol->indexed_vertex_array.reserve(VERTEX_BUFFER_RESERVE_SIZE / 6); for (size_t idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) { const Layer *layer = ctxt.layers[idx_layer]; + + if (is_selected_separate_extruder) + { + bool at_least_one_has_correct_extruder = false; + for (const LayerRegion* layerm : layer->regions()) + { + if (layerm->slices.surfaces.empty()) + continue; + const PrintRegionConfig& cfg = layerm->region()->config(); + if (cfg.perimeter_extruder.value == m_selected_extruder || + cfg.infill_extruder.value == m_selected_extruder || + cfg.solid_infill_extruder.value == m_selected_extruder ) { + at_least_one_has_correct_extruder = true; + break; + } + } + if (!at_least_one_has_correct_extruder) + continue; + } + for (GLVolume *vol : vols) if (vol->print_zs.empty() || vol->print_zs.back() != layer->print_z) { - vol->print_zs.push_back(layer->print_z); - vol->offsets.push_back(vol->indexed_vertex_array.quad_indices.size()); - vol->offsets.push_back(vol->indexed_vertex_array.triangle_indices.size()); + vol->print_zs.emplace_back(layer->print_z); + vol->offsets.emplace_back(vol->indexed_vertex_array.quad_indices.size()); + vol->offsets.emplace_back(vol->indexed_vertex_array.triangle_indices.size()); } - for (const Point © : *ctxt.shifted_copies) { + for (const PrintInstance &instance : *ctxt.shifted_copies) { + const Point © = instance.shift; for (const LayerRegion *layerm : layer->regions()) { + if (is_selected_separate_extruder) + { + const PrintRegionConfig& cfg = layerm->region()->config(); + if (cfg.perimeter_extruder.value != m_selected_extruder || + cfg.infill_extruder.value != m_selected_extruder || + cfg.solid_infill_extruder.value != m_selected_extruder) + continue; + } if (ctxt.has_perimeters) _3DScene::extrusionentity_to_verts(layerm->perimeters, float(layer->print_z), copy, volume(idx_layer, layerm->region()->config().perimeter_extruder.value, 0)); @@ -5283,9 +6483,9 @@ void GLCanvas3D::_load_wipe_tower_toolpaths(const std::vector& str_ for (size_t i = 0; i < vols.size(); ++i) { GLVolume &vol = *vols[i]; if (vol.print_zs.empty() || vol.print_zs.back() != layer.front().print_z) { - vol.print_zs.push_back(layer.front().print_z); - vol.offsets.push_back(vol.indexed_vertex_array.quad_indices.size()); - vol.offsets.push_back(vol.indexed_vertex_array.triangle_indices.size()); + vol.print_zs.emplace_back(layer.front().print_z); + vol.offsets.emplace_back(vol.indexed_vertex_array.quad_indices.size()); + vol.offsets.emplace_back(vol.indexed_vertex_array.triangle_indices.size()); } } for (const WipeTower::ToolChangeResult &extrusions : layer) { @@ -5355,6 +6555,7 @@ void GLCanvas3D::_load_wipe_tower_toolpaths(const std::vector& str_ BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - end" << m_volumes.log_memory_info() << log_memory_info(); } +#if !ENABLE_GCODE_VIEWER static inline int hex_digit_to_int(const char c) { return @@ -5386,7 +6587,7 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat case GCodePreviewData::Extrusion::FanSpeed: return path.fan_speed; case GCodePreviewData::Extrusion::VolumetricRate: - return path.feedrate * (float)path.mm3_per_mm; + return path.feedrate * path.mm3_per_mm; case GCodePreviewData::Extrusion::Tool: return (float)path.extruder_id; case GCodePreviewData::Extrusion::ColorPrint: @@ -5398,7 +6599,7 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat return 0.0f; } - static GCodePreviewData::Color path_color(const GCodePreviewData& data, const std::vector& tool_colors, float value) + static Color path_color(const GCodePreviewData& data, const std::vector& tool_colors, float value) { switch (data.extrusion.view_type) { @@ -5416,28 +6617,25 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat return data.get_volumetric_rate_color(value); case GCodePreviewData::Extrusion::Tool: { - GCodePreviewData::Color color; - ::memcpy((void*)color.rgba, (const void*)(tool_colors.data() + (unsigned int)value * 4), 4 * sizeof(float)); + 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; - int val = int(value); - while (val >= color_cnt) - val -= color_cnt; - - GCodePreviewData::Color color; - ::memcpy((void*)color.rgba, (const void*)(tool_colors.data() + val * 4), 4 * sizeof(float)); + Color color; + ::memcpy((void*)color.rgba.data(), (const void*)(tool_colors.data() + val * 4), 4 * sizeof(float)); return color; } default: - return GCodePreviewData::Color::Dummy; + return Color{}; } - return GCodePreviewData::Color::Dummy; + return Color{}; } }; @@ -5480,7 +6678,7 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat 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, vertex_buffer_prealloc_size)); + 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)); } } } @@ -5488,19 +6686,22 @@ void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_dat 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> &filters = roles_filters[size_t(path.extrusion_role)]; auto key = std::make_pair(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.push_back(layer.z); - vol.offsets.push_back(vol.indexed_vertex_array.quad_indices.size()); - vol.offsets.push_back(vol.indexed_vertex_array.triangle_indices.size()); + 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); } @@ -5560,7 +6761,7 @@ inline void travel_paths_internal( 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, VERTEX_BUFFER_RESERVE_SIZE)); + by_type.emplace_back(type, volumes.new_nontoolpath_volume(func_color(type).rgba.data(), VERTEX_BUFFER_RESERVE_SIZE)); } // populates volumes @@ -5572,9 +6773,9 @@ inline void travel_paths_internal( assert(it != by_type.end() && it->first == func_value(polyline)); GLVolume& vol = *it->second; - vol.print_zs.push_back(unscale(polyline.polyline.bounding_box().min(2))); - vol.offsets.push_back(vol.indexed_vertex_array.quad_indices.size()); - vol.offsets.push_back(vol.indexed_vertex_array.triangle_indices.size()); + vol.print_zs.emplace_back(unscale(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); @@ -5607,19 +6808,19 @@ void GLCanvas3D::_load_gcode_travel_paths(const GCodePreviewData& preview_data, case GCodePreviewData::Extrusion::Feedrate: travel_paths_internal(preview_data, [](const GCodePreviewData::Travel::Polyline &polyline) { return polyline.feedrate; }, - [&preview_data](const float feedrate) -> const GCodePreviewData::Color { return preview_data.get_feedrate_color(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(preview_data, [](const GCodePreviewData::Travel::Polyline &polyline) { return polyline.extruder_id; }, - [&tool_colors](const unsigned int extruder_id) -> const GCodePreviewData::Color { assert((extruder_id + 1) * 4 <= tool_colors.size()); return GCodePreviewData::Color(tool_colors.data() + extruder_id * 4); }, + [&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(preview_data, [](const GCodePreviewData::Travel::Polyline &polyline) { return polyline.type; }, - [&preview_data](const unsigned int type) -> const GCodePreviewData::Color& { return preview_data.travel.type_colors[type]; }, + [&preview_data](const unsigned int type) -> const Color& { return preview_data.travel.type_colors[type]; }, m_volumes, m_initialized); break; } @@ -5682,6 +6883,7 @@ void GLCanvas3D::_load_fff_shells() } } } +#endif // !ENABLE_GCODE_VIEWER // While it looks like we can call // this->reload_scene(true, true) @@ -5700,11 +6902,15 @@ 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; - v.set_instance_offset(unscale(instance.shift(0), instance.shift(1), 0)); + v.set_instance_offset(unscale(instance.shift.x(), instance.shift.y(), 0)); v.set_instance_rotation(Vec3d(0.0, 0.0, (double)instance.rotation)); v.set_instance_mirror(X, object.is_left_handed() ? -1. : 1.); v.set_convex_hull(mesh.convex_hull_3d()); @@ -5715,7 +6921,7 @@ void GLCanvas3D::_load_sla_shells() if (obj->is_step_done(slaposSliceSupports)) { unsigned int initial_volumes_count = (unsigned int)m_volumes.volumes.size(); for (const SLAPrintObject::Instance& instance : obj->instances()) { - add_volume(*obj, 0, instance, obj->transformed_mesh(), GLVolume::MODEL_COLOR[0], true); + add_volume(*obj, 0, instance, obj->get_mesh_to_print(), GLVolume::MODEL_COLOR[0], true); // Set the extruder_id and volume_id to achieve the same color as in the 3D scene when // through the update_volumes_colors_by_extruder() call. m_volumes.volumes.back()->extruder_id = obj->model_object()->volumes.front()->extruder_id(); @@ -5735,6 +6941,7 @@ void GLCanvas3D::_load_sla_shells() update_volumes_colors_by_extruder(); } +#if !ENABLE_GCODE_VIEWER void GLCanvas3D::_update_gcode_volumes_visibility(const GCodePreviewData& preview_data) { unsigned int size = (unsigned int)m_gcode_preview_volume_index.first_volumes.size(); @@ -5792,9 +6999,13 @@ void GLCanvas3D::_update_gcode_volumes_visibility(const GCodePreviewData& previe } } } +#endif // !ENABLE_GCODE_VIEWER void GLCanvas3D::_update_toolpath_volumes_outside_state() { +#if ENABLE_GCODE_VIEWER + BoundingBoxf3 test_volume = (m_config != nullptr) ? print_volume(*m_config) : BoundingBoxf3(); +#else // tolerance to avoid false detection at bed edges static const double tolerance_x = 0.05; static const double tolerance_y = 0.05; @@ -5811,15 +7022,23 @@ void GLCanvas3D::_update_toolpath_volumes_outside_state() print_volume.min(2) = -1e10; } } +#endif // ENABLE_GCODE_VIEWER for (GLVolume* volume : m_volumes.volumes) { +#if ENABLE_GCODE_VIEWER + volume->is_outside = ((test_volume.radius() > 0.0) && volume->is_extrusion_path) ? !test_volume.contains(volume->bounding_box()) : false; +#else volume->is_outside = ((print_volume.radius() > 0.0) && volume->is_extrusion_path) ? !print_volume.contains(volume->bounding_box()) : false; +#endif // ENABLE_GCODE_VIEWER } } void GLCanvas3D::_update_sla_shells_outside_state() { +#if ENABLE_GCODE_VIEWER + BoundingBoxf3 test_volume = (m_config != nullptr) ? print_volume(*m_config) : BoundingBoxf3(); +#else // tolerance to avoid false detection at bed edges static const double tolerance_x = 0.05; static const double tolerance_y = 0.05; @@ -5836,17 +7055,37 @@ void GLCanvas3D::_update_sla_shells_outside_state() print_volume.min(2) = -1e10; } } +#endif // ENABLE_GCODE_VIEWER for (GLVolume* volume : m_volumes.volumes) { +#if ENABLE_GCODE_VIEWER + volume->is_outside = ((test_volume.radius() > 0.0) && volume->shader_outside_printer_detection_enabled) ? !test_volume.contains(volume->transformed_convex_hull_bounding_box()) : false; +#else volume->is_outside = ((print_volume.radius() > 0.0) && volume->shader_outside_printer_detection_enabled) ? !print_volume.contains(volume->transformed_convex_hull_bounding_box()) : false; +#endif // ENABLE_GCODE_VIEWER } } void GLCanvas3D::_show_warning_texture_if_needed(WarningTexture::Warning warning) { _set_current(); +#if ENABLE_GCODE_VIEWER + 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); +#else _set_warning_texture(warning, _is_any_volume_outside()); +#endif // ENABLE_GCODE_VIEWER } std::vector GLCanvas3D::_parse_colors(const std::vector& colors) @@ -5874,10 +7113,12 @@ std::vector GLCanvas3D::_parse_colors(const std::vector& col return output; } +#if !ENABLE_GCODE_VIEWER void GLCanvas3D::_generate_legend_texture(const GCodePreviewData& preview_data, const std::vector& tool_colors) { m_legend_texture.generate(preview_data, tool_colors, *this, true); } +#endif // !ENABLE_GCODE_VIEWER void GLCanvas3D::_set_warning_texture(WarningTexture::Warning warning, bool state) { @@ -6009,6 +7250,45 @@ 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_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(); diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 8c2e6e9a58..cc3971c179 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -3,22 +3,26 @@ #include #include +#include -#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" +#if ENABLE_GCODE_VIEWER +#include "libslic3r/GCode/GCodeProcessor.hpp" +#include "GCodeViewer.hpp" +#endif // ENABLE_GCODE_VIEWER + +#include "libslic3r/Slicing.hpp" #include #include -class wxWindow; class wxSizeEvent; class wxIdleEvent; class wxKeyEvent; @@ -26,26 +30,28 @@ class wxMouseEvent; class wxTimerEvent; class wxPaintEvent; class wxGLCanvas; +class wxGLContext; // Support for Retina OpenGL on Mac OS #define ENABLE_RETINA_GL __APPLE__ namespace Slic3r { -class GLShader; -class ExPolygon; +struct Camera; class BackgroundSlicingProcess; +#if !ENABLE_GCODE_VIEWER class GCodePreviewData; -#if ENABLE_THUMBNAIL_GENERATOR +#endif // !ENABLE_GCODE_VIEWER 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 @@ -81,7 +87,8 @@ template using Vec2dsEvent = ArrayEvent; using Vec3dEvent = Event; template using Vec3dsEvent = ArrayEvent; -wxDECLARE_EVENT(EVT_GLCANVAS_INIT, SimpleEvent); +using HeightProfileSmoothEvent = Event; + wxDECLARE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_RIGHT_CLICK, RBtnEvent); wxDECLARE_EVENT(EVT_GLCANVAS_REMOVE_OBJECT, SimpleEvent); @@ -90,6 +97,7 @@ wxDECLARE_EVENT(EVT_GLCANVAS_SELECT_ALL, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_QUESTION_MARK, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_INCREASE_INSTANCES, Event); // data: +1 => increase, -1 => decrease wxDECLARE_EVENT(EVT_GLCANVAS_INSTANCE_MOVED, SimpleEvent); +wxDECLARE_EVENT(EVT_GLCANVAS_FORCE_UPDATE, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_WIPETOWER_MOVED, Vec3dEvent); wxDECLARE_EVENT(EVT_GLCANVAS_INSTANCE_ROTATED, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_INSTANCE_SCALED, SimpleEvent); @@ -100,18 +108,27 @@ 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); +#if ENABLE_GCODE_VIEWER +wxDECLARE_EVENT(EVT_GLCANVAS_MOVE_LAYERS_SLIDER, wxKeyEvent); +#else wxDECLARE_EVENT(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, wxKeyEvent); +#endif // ENABLE_GCODE_VIEWER wxDECLARE_EVENT(EVT_GLCANVAS_EDIT_COLOR_CHANGE, wxKeyEvent); +wxDECLARE_EVENT(EVT_GLCANVAS_JUMP_TO, wxKeyEvent); wxDECLARE_EVENT(EVT_GLCANVAS_UNDO, SimpleEvent); wxDECLARE_EVENT(EVT_GLCANVAS_REDO, SimpleEvent); +wxDECLARE_EVENT(EVT_GLCANVAS_COLLAPSE_SIDEBAR, SimpleEvent); +wxDECLARE_EVENT(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, SimpleEvent); +wxDECLARE_EVENT(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, Event); +wxDECLARE_EVENT(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, HeightProfileSmoothEvent); +wxDECLARE_EVENT(EVT_GLCANVAS_RELOAD_FROM_DISK, SimpleEvent); class GLCanvas3D { -#if ENABLE_THUMBNAIL_GENERATOR static const double DefaultCameraZoomToBoxMarginFactor; -#endif // ENABLE_THUMBNAIL_GENERATOR public: +#if !ENABLE_GCODE_VIEWER struct GCodePreviewVolumeIndex { enum EType @@ -138,6 +155,7 @@ public: void reset() { first_volumes.clear(); } }; +#endif // !ENABLE_GCODE_VIEWER private: class LayersEditing @@ -151,15 +169,11 @@ private: Num_States }; - private: static const float THICKNESS_BAR_WIDTH; - static const float THICKNESS_RESET_BUTTON_HEIGHT; + private: bool m_enabled; - Shader m_shader; unsigned int m_z_texture_id; - mutable GLTexture m_tooltip_texture; - mutable GLTexture m_reset_texture; // Not owned by LayersEditing. const DynamicPrintConfig *m_config; // ModelObject for the currently selected object (Model::objects[last_object_id]). @@ -168,9 +182,14 @@ private: float m_object_max_z; // Owned by LayersEditing. SlicingParameters *m_slicing_parameters; - std::vector m_layer_height_profile; + std::vector m_layer_height_profile; bool m_layer_height_profile_modified; + mutable float m_adaptive_quality; + mutable HeightProfileSmoothingParams m_smooth_params; + + static float s_overelay_window_width; + class LayersTexture { public: @@ -202,8 +221,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; @@ -217,28 +237,28 @@ private: void adjust_layer_height_profile(); void accept_changes(GLCanvas3D& canvas); void reset_layer_height_profile(GLCanvas3D& canvas); + void adaptive_layer_height_profile(GLCanvas3D& canvas, float quality_factor); + void smooth_layer_height_profile(GLCanvas3D& canvas, const HeightProfileSmoothingParams& smoothing_params); static float get_cursor_z_relative(const GLCanvas3D& canvas); static bool bar_rect_contains(const GLCanvas3D& canvas, float x, float y); - static bool reset_rect_contains(const GLCanvas3D& canvas, float x, float y); static Rect get_bar_rect_screen(const GLCanvas3D& canvas); - static Rect get_reset_rect_screen(const GLCanvas3D& canvas); static Rect get_bar_rect_viewport(const GLCanvas3D& canvas); - static Rect get_reset_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; } + std::string get_tooltip(const GLCanvas3D& canvas) const; + private: - bool _is_initialized() const; + bool is_initialized() const; void generate_layer_height_texture(); - void _render_tooltip_texture(const GLCanvas3D& canvas, const Rect& bar_rect, const Rect& reset_rect) const; - void _render_reset_texture(const Rect& reset_rect) const; - void _render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) const; - void _render_profile(const Rect& bar_rect) const; + void render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) const; + void render_profile(const Rect& bar_rect) const; void update_slicing_parameters(); static float thickness_bar_width(const GLCanvas3D &canvas); - static float reset_button_height(const GLCanvas3D &canvas); + }; struct Mouse @@ -335,6 +355,7 @@ private: bool generate(const std::string& msg, const GLCanvas3D& canvas, bool compress, bool red_colored = false); }; +#if !ENABLE_GCODE_VIEWER class LegendTexture : public GUI::GLTexture { static const int Px_Title_Offset = 5; @@ -352,13 +373,16 @@ private: public: LegendTexture(); - void fill_color_print_legend_values(const GCodePreviewData& preview_data, const GLCanvas3D& canvas, - std::vector>& cp_legend_values); + void fill_color_print_legend_items(const GLCanvas3D& canvas, + const std::vector& colors_in, + std::vector& colors, + std::vector& cp_legend_items); bool generate(const GCodePreviewData& preview_data, const std::vector& tool_colors, const GLCanvas3D& canvas, bool compress); void render(const GLCanvas3D& canvas) const; }; +#endif // !ENABLE_GCODE_VIEWER #if ENABLE_RENDER_STATISTICS struct RenderStats @@ -369,6 +393,56 @@ private: }; #endif // ENABLE_RENDER_STATISTICS + class Labels + { + bool m_enabled{ false }; + bool m_shown{ false }; + GLCanvas3D& m_canvas; + + public: + explicit Labels(GLCanvas3D& canvas) : m_canvas(canvas) {} + void enable(bool enable) { m_enabled = enable; } + void show(bool show) { m_shown = m_enabled ? show : false; } + bool is_shown() const { return m_shown; } + void render(const std::vector& sorted_instances) const; + }; + + class Tooltip + { + std::string m_text; + std::chrono::steady_clock::time_point m_start_time; + // Indicator that the mouse is inside an ImGUI dialog, therefore the tooltip should be suppressed. + bool m_in_imgui = false; + + public: + bool is_empty() const { return m_text.empty(); } + void set_text(const std::string& text); + void render(const Vec2d& mouse_position, GLCanvas3D& canvas) const; + // 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; }; + }; + public: enum ECursorType : unsigned char { @@ -383,15 +457,12 @@ private: std::unique_ptr m_retina_helper; #endif bool m_in_render; - bool m_render_enabled; +#if !ENABLE_GCODE_VIEWER LegendTexture m_legend_texture; +#endif // !ENABLE_GCODE_VIEWER 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; @@ -401,9 +472,16 @@ private: bool m_use_clipping_planes; mutable SlaCap m_sla_caps[2]; std::string m_sidebar_field; - bool m_keep_dirty; + // when true renders an extra frame by not resetting m_dirty to false + // see request_extra_frame() + bool m_extra_frame_requested; + bool m_event_handlers_bound{ false }; mutable GLVolumeCollection m_volumes; +#if ENABLE_GCODE_VIEWER + GCodeViewer m_gcode_viewer; +#endif // ENABLE_GCODE_VIEWER + Selection m_selection; const DynamicPrintConfig* m_config; Model* m_model; @@ -414,7 +492,9 @@ private: bool m_initialized; bool m_apply_zoom_to_volumes_filter; mutable std::vector m_hover_volume_idxs; +#if !ENABLE_GCODE_VIEWER bool m_legend_texture_enabled; +#endif // !ENABLE_GCODE_VIEWER bool m_picking_enabled; bool m_moving_enabled; bool m_dynamic_background_enabled; @@ -432,7 +512,9 @@ private: bool m_reload_delayed; +#if !ENABLE_GCODE_VIEWER GCodePreviewVolumeIndex m_gcode_preview_volume_index; +#endif // !ENABLE_GCODE_VIEWER #if ENABLE_RENDER_PICKING_PASS bool m_show_picking_texture; @@ -442,12 +524,21 @@ private: RenderStats m_render_stats; #endif // ENABLE_RENDER_STATISTICS - int m_imgui_undo_redo_hovered_pos{ -1 }; + mutable int m_imgui_undo_redo_hovered_pos{ -1 }; + mutable int m_mouse_wheel {0}; + int m_selected_extruder; + + Labels m_labels; + mutable Tooltip m_tooltip; + mutable bool m_tooltip_enabled{ true }; + Slope m_slope; 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; } @@ -459,9 +550,16 @@ public: void set_as_dirty(); unsigned int get_volumes_count() const; + const GLVolumeCollection& get_volumes() const { return m_volumes; } void reset_volumes(); int check_volumes_outside_state() const; +#if ENABLE_GCODE_VIEWER + 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); } +#endif // ENABLE_GCODE_VIEWER + 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); @@ -470,6 +568,7 @@ public: void set_config(const DynamicPrintConfig* config); void set_process(BackgroundSlicingProcess* process); void set_model(Model* model); + const Model* get_model() const { return m_model; } const Selection& get_selection() const { return m_selection; } Selection& get_selection() { return m_selection; } @@ -492,13 +591,18 @@ public: void set_color_by(const std::string& value); - const Camera& get_camera() const { 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); + void smooth_layer_height_profile(const HeightProfileSmoothingParams& smoothing_params); bool is_reload_delayed() const; @@ -511,14 +615,16 @@ public: void enable_main_toolbar(bool enable); 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 enable_render(bool enable) { m_render_enabled = enable; } - bool is_render_enabled() const { return m_render_enabled; } - void zoom_to_bed(); void zoom_to_volumes(); void zoom_to_selection(); +#if ENABLE_GCODE_VIEWER + void zoom_to_gcode(); +#endif // ENABLE_GCODE_VIEWER void select_view(const std::string& direction); void update_volumes_colors_by_extruder(); @@ -526,18 +632,30 @@ 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 transparent_background); -#endif // ENABLE_THUMBNAIL_GENERATOR + 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; void select_all(); void deselect_all(); void delete_selected(); void ensure_on_bed(unsigned int object_idx); +#if ENABLE_GCODE_VIEWER + 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& get_gcode_layers_zs() const; + std::vector 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& range); + void set_toolpaths_z_range(const std::array& range); +#else std::vector get_current_print_zs(bool active_only) const; +#endif // ENABLE_GCODE_VIEWER void set_toolpaths_range(double low, double high); std::vector load_object(const ModelObject& model_object, int obj_idx, std::vector instance_idxs); @@ -547,9 +665,16 @@ public: void reload_scene(bool refresh_immediately, bool force_full_scene_refresh = false); +#if ENABLE_GCODE_VIEWER + void load_gcode_preview(const GCodeProcessor::Result& gcode_result); + void refresh_gcode_preview(const GCodeProcessor::Result& gcode_result, const std::vector& str_tool_colors); + 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(); } +#else void load_gcode_preview(const GCodePreviewData& preview_data, const std::vector& str_tool_colors); +#endif // ENABLE_GCODE_VIEWER void load_sla_preview(); - void load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values); + void load_preview(const std::vector& str_tool_colors, const std::vector& color_print_values); void bind_event_handlers(); void unbind_event_handlers(); @@ -561,11 +686,14 @@ public: void on_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; +#if !ENABLE_GCODE_VIEWER void reset_legend_texture(); +#endif // !ENABLE_GCODE_VIEWER void set_tooltip(const std::string& tooltip) const; @@ -576,8 +704,6 @@ public: void do_flatten(const Vec3d& normal, const std::string& snapshot_type); void do_mirror(const std::string& snapshot_type); - void set_camera_zoom(double zoom); - void update_gizmos_on_off_state(); void reset_all_gizmos() { m_gizmos.reset_all_states(); } @@ -586,10 +712,9 @@ 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;} class WipeTowerInfo { protected: @@ -617,7 +742,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; @@ -625,71 +749,83 @@ public: void set_cursor(ECursorType type); void msw_rescale(); - bool is_keeping_dirty() const { return m_keep_dirty; } - void start_keeping_dirty() { m_keep_dirty = true; } - void stop_keeping_dirty() { m_keep_dirty = false; } + void request_extra_frame() { m_extra_frame_requested = true; } 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; void mouse_up_cleanup(); + 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); } + private: bool _is_shown_on_screen() const; bool _init_toolbars(); 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(); void _picking_pass() const; void _rectangular_selection_picking_pass() const; void _render_background() const; - void _render_bed(float theta) const; + void _render_bed(bool bottom, bool show_axes) const; void _render_objects() const; +#if ENABLE_GCODE_VIEWER + void _render_gcode() const; +#endif // ENABLE_GCODE_VIEWER 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; +#if !ENABLE_GCODE_VIEWER void _render_legend_texture() const; +#endif // !ENABLE_GCODE_VIEWER 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); -#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; + 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 transparent_background); + 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; // render thumbnail using an off-screen framebuffer when GLEW_EXT_framebuffer_object is supported - void _render_thumbnail_framebuffer_ext(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, bool printable_only, bool parts_only, bool transparent_background); + 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 transparent_background); -#endif // ENABLE_THUMBNAIL_GENERATOR + 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; void _update_volumes_hover_state() const; @@ -712,26 +848,32 @@ private: // Adds a new Slic3r::GUI::3DScene::Volume to $self->volumes, // one for perimeters, one for infill and one for supports. void _load_print_object_toolpaths(const PrintObject& print_object, const std::vector& str_tool_colors, - const std::vector& color_print_values); + const std::vector& color_print_values); // Create 3D thick extrusion lines for wipe tower extrusions void _load_wipe_tower_toolpaths(const std::vector& str_tool_colors); +#if !ENABLE_GCODE_VIEWER // generates gcode extrusion paths geometry void _load_gcode_extrusion_paths(const GCodePreviewData& preview_data, const std::vector& tool_colors); // generates gcode travel paths geometry void _load_gcode_travel_paths(const GCodePreviewData& preview_data, const std::vector& tool_colors); // generates objects and wipe tower geometry void _load_fff_shells(); +#endif // !ENABLE_GCODE_VIEWER // Load SLA objects and support structures for objects, for which the slaposSliceSupports step has been finished. void _load_sla_shells(); +#if !ENABLE_GCODE_VIEWER // sets gcode geometry visibility according to user selection void _update_gcode_volumes_visibility(const GCodePreviewData& preview_data); +#endif // !ENABLE_GCODE_VIEWER void _update_toolpath_volumes_outside_state(); void _update_sla_shells_outside_state(); void _show_warning_texture_if_needed(WarningTexture::Warning warning); +#if !ENABLE_GCODE_VIEWER // generates the legend texture in dependence of the current shown view type void _generate_legend_texture(const GCodePreviewData& preview_data, const std::vector& tool_colors); +#endif // !ENABLE_GCODE_VIEWER // generates a warning texture containing the given message void _set_warning_texture(WarningTexture::Warning warning, bool state); @@ -742,6 +884,11 @@ 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(); + + float get_overlay_window_width() { return LayersEditing::get_overlay_window_width(); } static std::vector _parse_colors(const std::vector& colors); diff --git a/src/slic3r/GUI/GLCanvas3DManager.cpp b/src/slic3r/GUI/GLCanvas3DManager.cpp deleted file mode 100644 index 3594e85a42..0000000000 --- a/src/slic3r/GUI/GLCanvas3DManager.cpp +++ /dev/null @@ -1,379 +0,0 @@ -#include "GLCanvas3DManager.hpp" -#include "../../slic3r/GUI/GUI.hpp" -#include "../../slic3r/GUI/AppConfig.hpp" -#include "../../slic3r/GUI/GLCanvas3D.hpp" - -#include - -#include -#include - -#include -#include - -#include -#include -#include - -#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 (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 tokens; - boost::split(tokens, m_version, boost::is_any_of(" "), boost::token_compress_on); - - if (tokens.empty()) - return false; - - std::vector 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 ? "" : ""; - std::string h2_end = format_as_html ? "" : ""; - std::string b_start = format_as_html ? "" : ""; - std::string b_end = format_as_html ? "" : ""; - std::string line_end = format_as_html ? "
" : "\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 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; - -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; - } - - 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 = wxString::Format( - _(L("PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n" - "while OpenGL version %s, render %s, vendor %s was detected.")), wxString(s_gl_info.get_version()), wxString(s_gl_info.get_renderer()), wxString(s_gl_info.get_vendor())); - 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) - { - 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/GLCanvas3DManager.hpp b/src/slic3r/GUI/GLCanvas3DManager.hpp deleted file mode 100644 index 940e0230ae..0000000000 --- a/src/slic3r/GUI/GLCanvas3DManager.hpp +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef slic3r_GLCanvas3DManager_hpp_ -#define slic3r_GLCanvas3DManager_hpp_ - -#include "libslic3r/BoundingBox.hpp" - -#include -#include - -class wxWindow; -class wxGLCanvas; -class wxGLContext; - -namespace Slic3r { - -class BackgroundSlicingProcess; -class DynamicPrintConfig; -class Model; -class ExPolygon; -typedef std::vector ExPolygons; -class ModelObject; -class PrintObject; - -namespace GUI { - -class GLCanvas3D; -class Bed3D; -class GLToolbar; -struct Camera; - -class GLCanvas3DManager -{ -public: - enum EFramebufferType : unsigned char - { - FB_None, - FB_Arb, - FB_Ext - }; - - class GLInfo - { - mutable bool m_detected; - - 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(); - - const std::string& get_version() const; - const std::string& get_glsl_version() const; - const std::string& get_vendor() const; - const std::string& get_renderer() const; - - int get_max_tex_size() const; - float get_max_anisotropy() const; - - bool is_version_greater_or_equal_to(unsigned int major, unsigned int minor) const; - - std::string to_string(bool format_as_html, bool extensions) const; - - private: - void detect() const; - }; - -private: - enum EMultisampleState : unsigned char - { - MS_Unknown, - MS_Enabled, - MS_Disabled - }; - - typedef std::map CanvasesMap; - - CanvasesMap m_canvases; - wxGLContext* m_context; - static GLInfo s_gl_info; - bool m_gl_initialized; - static EMultisampleState s_multisample; - static bool s_compressed_textures_supported; - 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(); - - bool init(wxGLCanvas* canvas); - void destroy(); - - GLCanvas3D* get_canvas(wxGLCanvas* canvas); - - 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 EFramebufferType get_framebuffers_type() { return s_framebuffers_type; } - - 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_ diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp new file mode 100644 index 0000000000..e738aa3c49 --- /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 +#include + +#include + +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 vertices(6 * data.positions.size()); + for (size_t i = 0; i < data.positions.size(); ++i) { + size_t offset = i * 6; + ::memcpy(static_cast(&vertices[offset]), static_cast(data.positions[i].data()), 3 * sizeof(float)); + ::memcpy(static_cast(&vertices[3 + offset]), static_cast(data.normals[i].data()), 3 * sizeof(float)); + } + + // indices data + std::vector 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(data.triangles[i][j]); + } + } + + m_indices_count = static_cast(indices.size()); + m_bounding_box = BoundingBoxf3(); + for (size_t i = 0; i < data.positions.size(); ++i) { + m_bounding_box.merge(data.positions[i].cast()); + } + + 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 vertices = std::vector(18 * mesh.stl.stats.number_of_facets); + std::vector indices = std::vector(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(&vertices[offset]), static_cast(facet.vertex[j].data()), 3 * sizeof(float)); + ::memcpy(static_cast(&vertices[3 + offset]), static_cast(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(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(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& vertices, const std::vector& 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(resolution); + std::vector cosines(resolution); + std::vector sines(resolution); + + for (int i = 0; i < resolution; ++i) + { + float angle = angle_step * static_cast(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(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(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(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(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(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(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(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(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(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 0000000000..0b4a69bdb0 --- /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 +#include + +namespace Slic3r { + +class TriangleMesh; + +namespace GUI { + + struct GLModelInitializationData + { + std::vector positions; + std::vector normals; + std::vector 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& vertices, const std::vector& 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 684563bff3..d7f3f7a3a8 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 @@ -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& 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()), Point(m_end_corner.cast()) }); + BoundingBox rectangle(Points{ Point(m_start_corner.cast()), Point(m_end_corner.cast()) }); // Iterate over all points and determine whether they're in the rectangle. for (unsigned int i = 0; iget_camera(); + float inv_zoom = (float)camera.get_inv_zoom(); Size cnv_size = canvas.get_canvas_size(); float cnv_half_width = 0.5f * (float)cnv_size.get_width(); diff --git a/src/slic3r/GUI/GLShader.cpp b/src/slic3r/GUI/GLShader.cpp index 577f6e1b50..3c2612b45e 100644 --- a/src/slic3r/GUI/GLShader.cpp +++ b/src/slic3r/GUI/GLShader.cpp @@ -1,366 +1,348 @@ -#include - +#include "libslic3r/libslic3r.h" #include "GLShader.hpp" -#include "libslic3r/Utils.hpp" #include "3DScene.hpp" -#include +#include "libslic3r/Utils.hpp" -#include -#include -#include +#include +#include +#include + +#include 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 char *value = (const char*)glGetString(param); - return std::string(value ? value : "N/A"); + auto load_from_file = [](const std::string& filename) { + 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(s.tellg()); + s.seekg(0, s.beg); + std::string source(file_length, '\0'); + s.read(source.data(), file_length); + if (!s.good()) { + BOOST_LOG_TRIVIAL(error) << "Error while loading file: '" << path << "'"; + return std::string(); + } + + s.close(); + return source; + }; + + ShaderSources sources = {}; + for (size_t i = 0; i < static_cast(EShaderType::Count); ++i) { + sources[i] = filenames[i].empty() ? std::string() : load_from_file(filenames[i]); + } + + bool valid = !sources[static_cast(EShaderType::Vertex)].empty() && !sources[static_cast(EShaderType::Fragment)].empty() && sources[static_cast(EShaderType::Compute)].empty(); + valid |= !sources[static_cast(EShaderType::Compute)].empty() && sources[static_cast(EShaderType::Vertex)].empty() && sources[static_cast(EShaderType::Fragment)].empty() && + sources[static_cast(EShaderType::Geometry)].empty() && sources[static_cast(EShaderType::TessEvaluation)].empty() && sources[static_cast(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, ¶ms)); - if (params == GL_FALSE) { - // Compilation failed. Get the log. - glsafe(::glGetShaderiv(this->fragment_program_id, GL_INFO_LOG_LENGTH, ¶ms)); - std::vector msg(params); - glsafe(::glGetShaderInfoLog(this->fragment_program_id, params, ¶ms, 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(EShaderType::Count)>& shader_ids) { + for (size_t i = 0; i < static_cast(EShaderType::Count); ++i) { + if (shader_ids[i] > 0) + glsafe(::glDeleteShader(shader_ids[i])); + } + }; + + assert(m_id == 0); + + m_name = name; + + std::array(EShaderType::Count)> shader_ids = { 0 }; + + for (size_t i = 0; i < static_cast(EShaderType::Count); ++i) { + const std::string& source = sources[i]; + if (!source.empty()) + { + EShaderType type = static_cast(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, ¶ms)); + if (params == GL_FALSE) { + // Compilation failed. + glsafe(::glGetShaderiv(id, GL_INFO_LOG_LENGTH, ¶ms)); + std::vector msg(params); + glsafe(::glGetShaderInfoLog(id, params, ¶ms, 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; + } } } - 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, ¶ms)); - if (params == GL_FALSE) { - // Compilation failed. Get the log. - glsafe(::glGetShaderiv(this->vertex_program_id, GL_INFO_LOG_LENGTH, ¶ms)); - std::vector msg(params); - glsafe(::glGetShaderInfoLog(this->vertex_program_id, params, ¶ms, msg.data())); - this->last_error = std::string("Vertex shader compilation failed:\n") + msg.data(); - this->release(); - 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(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, ¶ms)); + glsafe(::glGetProgramiv(m_id, GL_LINK_STATUS, ¶ms)); if (params == GL_FALSE) { - // Linking failed. Get the log. - glsafe(::glGetProgramiv(this->vertex_program_id, GL_INFO_LOG_LENGTH, ¶ms)); + // Linking failed. + glsafe(::glGetProgramiv(m_id, GL_INFO_LOG_LENGTH, ¶ms)); std::vector msg(params); - glsafe(::glGetProgramInfoLog(this->vertex_program_id, params, ¶ms, msg.data())); - this->last_error = std::string("Shader linking failed:\n") + msg.data(); - this->release(); + glsafe(::glGetProgramInfoLog(m_id, params, ¶ms, msg.data())); + BOOST_LOG_TRIVIAL(error) << "Unable to link shader program '" << name << "':\n" << msg.data(); + + // release shaders + release_shaders(shader_ids); + + // release shader program + glsafe(::glDeleteProgram(m_id)); + m_id = 0; + return false; } - last_error.clear(); + // release shaders, they are no more needed + release_shaders(shader_ids); + return true; } -bool GLShader::load_from_file(const char* fragment_shader_filename, const char* vertex_shader_filename) +void GLShaderProgram::start_using() const { - const std::string& path = resources_dir() + "/shaders/"; - - 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(const_cast(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; - - fs.seekg(0, fs.end); - file_length = (int)fs.tellg(); - fs.seekg(0, fs.beg); - std::string fragment_shader(file_length, '\0'); - fs.read(const_cast(fragment_shader.data()), file_length); - if (!fs.good()) - return false; - - fs.close(); - - return load_from_text(fragment_shader.c_str(), vertex_shader.c_str()); + assert(m_id > 0); + glsafe(::glUseProgram(m_id)); } -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; - } -} - -void GLShader::enable() const -{ - glsafe(::glUseProgram(this->shader_program_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 -{ - return this->shader_program_id ? glGetAttribLocation(this->shader_program_id, name) : -1; -} - -// Return shader uniform variable ID -int GLShader::get_uniform_location(const char *name) const -{ - return this->shader_program_id ? glGetUniformLocation(this->shader_program_id, name) : -1; -} - -bool GLShader::set_uniform(const char *name, float value) const -{ - int id = this->get_uniform_location(name); - if (id >= 0) { - glsafe(::glUniform1fARB(id, value)); - return true; - } - return false; -} - -bool GLShader::set_uniform(const char* name, const float* matrix) const +bool GLShaderProgram::set_uniform(const char* name, int value) const { int id = get_uniform_location(name); - if (id >= 0) - { - glsafe(::glUniformMatrix4fv(id, 1, GL_FALSE, (const GLfloat*)matrix)); + if (id >= 0) { + glsafe(::glUniform1i(id, static_cast(value))); return true; } return false; } -bool GLShader::set_uniform(const char* name, int value) const +bool GLShaderProgram::set_uniform(const char* name, bool value) const +{ + return set_uniform(name, value ? 1 : 0); +} + +bool GLShaderProgram::set_uniform(const char* name, float value) const { int id = get_uniform_location(name); - if (id >= 0) - { - glsafe(::glUniform1i(id, value)); + if (id >= 0) { + glsafe(::glUniform1f(id, static_cast(value))); return true; } return false; } -/* -# Set shader vector -sub SetVector +bool GLShaderProgram::set_uniform(const char* name, double value) const { - 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 ''; + return set_uniform(name, static_cast(value)); } -# Set shader 4x4 matrix -sub SetMatrix +bool GLShaderProgram::set_uniform(const char* name, const std::array& value) const { - 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) -{ -} - -Shader::~Shader() -{ - reset(); -} - -bool Shader::init(const std::string& vertex_shader_filename, const std::string& fragment_shader_filename) -{ - if (is_initialized()) + int id = get_uniform_location(name); + if (id >= 0) { + glsafe(::glUniform2iv(id, 1, static_cast(value.data()))); return true; + } + return false; +} - 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; +bool GLShaderProgram::set_uniform(const char* name, const std::array& value) const +{ + int id = get_uniform_location(name); + if (id >= 0) { + glsafe(::glUniform3iv(id, 1, static_cast(value.data()))); + return true; + } + return false; +} + +bool GLShaderProgram::set_uniform(const char* name, const std::array& value) const +{ + int id = get_uniform_location(name); + if (id >= 0) { + glsafe(::glUniform4iv(id, 1, static_cast(value.data()))); + return true; + } + return false; +} + +bool GLShaderProgram::set_uniform(const char* name, const std::array& value) const +{ + int id = get_uniform_location(name); + if (id >= 0) { + glsafe(::glUniform2fv(id, 1, static_cast(value.data()))); + return true; + } + return false; +} + +bool GLShaderProgram::set_uniform(const char* name, const std::array& value) const +{ + int id = get_uniform_location(name); + if (id >= 0) { + glsafe(::glUniform3fv(id, 1, static_cast(value.data()))); + return true; + } + return false; +} + +bool GLShaderProgram::set_uniform(const char* name, const std::array& value) const +{ + int id = get_uniform_location(name); + if (id >= 0) { + glsafe(::glUniform4fv(id, 1, static_cast(value.data()))); + return true; + } + return false; +} + +bool GLShaderProgram::set_uniform(const char* name, const float* value, size_t size) const +{ + 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(value))); + else if (size == 3) + glsafe(::glUniform3fv(id, 1, static_cast(value))); + else + glsafe(::glUniform4fv(id, 1, static_cast(value))); + + return true; } } - - return true; + return false; } -bool Shader::is_initialized() const +bool GLShaderProgram::set_uniform(const char* name, const Transform3f& value) const { - return (m_shader != nullptr); -} - -bool Shader::start_using() const -{ - if (is_initialized()) - { - m_shader->enable(); + int id = get_uniform_location(name); + if (id >= 0) { + glsafe(::glUniformMatrix4fv(id, 1, GL_FALSE, static_cast(value.matrix().data()))); return true; } - else - return false; + return false; } -void Shader::stop_using() const +bool GLShaderProgram::set_uniform(const char* name, const Transform3d& value) const { - if (m_shader != nullptr) - m_shader->disable(); + return set_uniform(name, value.cast()); } -int Shader::get_attrib_location(const std::string& name) const +bool GLShaderProgram::set_uniform(const char* name, const Matrix3f& value) const { - return (m_shader != nullptr) ? m_shader->get_attrib_location(name.c_str()) : -1; -} - -int Shader::get_uniform_location(const std::string& name) const -{ - return (m_shader != nullptr) ? m_shader->get_uniform_location(name.c_str()) : -1; -} - -void Shader::set_uniform(const std::string& name, float value) const -{ - if (m_shader != nullptr) - m_shader->set_uniform(name.c_str(), value); -} - -void Shader::set_uniform(const std::string& name, const float* matrix) const -{ - if (m_shader != nullptr) - m_shader->set_uniform(name.c_str(), matrix); -} - -void Shader::set_uniform(const std::string& name, bool value) const -{ - if (m_shader != nullptr) - m_shader->set_uniform(name.c_str(), value ? 1 : 0); -} - -unsigned int Shader::get_shader_program_id() const -{ - return (m_shader != nullptr) ? m_shader->shader_program_id : 0; -} - -void Shader::reset() -{ - if (m_shader != nullptr) - { - m_shader->release(); - delete m_shader; - m_shader = nullptr; + int id = get_uniform_location(name); + if (id >= 0) { + glsafe(::glUniformMatrix3fv(id, 1, GL_FALSE, static_cast(value.data()))); + return true; } + return false; +} + +bool GLShaderProgram::set_uniform(const char* name, const Vec3f& value) const +{ + int id = get_uniform_location(name); + if (id >= 0) { + glsafe(::glUniform3fv(id, 1, static_cast(value.data()))); + return true; + } + return false; +} + +bool GLShaderProgram::set_uniform(const char* name, const Vec3d& value) const +{ + return set_uniform(name, static_cast(value.cast())); +} + +int GLShaderProgram::get_attrib_location(const char* name) const +{ + return (m_id > 0) ? ::glGetAttribLocation(m_id, name) : -1; +} + +int GLShaderProgram::get_uniform_location(const char* name) const +{ + 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 df2a23f15c..84fdf5ebad 100644 --- a/src/slic3r/GUI/GLShader.hpp +++ b/src/slic3r/GUI/GLShader.hpp @@ -1,71 +1,69 @@ #ifndef slic3r_GLShader_hpp_ #define slic3r_GLShader_hpp_ -#include "libslic3r/libslic3r.h" +#include +#include + #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(); + enum class EShaderType + { + Vertex, + Fragment, + Geometry, + TessEvaluation, + TessControl, + Compute, + Count + }; - 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; -}; - -class Shader -{ - GLShader* m_shader; - -public: - Shader(); - ~Shader(); - - bool init(const std::string& vertex_shader_filename, const std::string& fragment_shader_filename); - - bool is_initialized() const; - - bool 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; + typedef std::array(EShaderType::Count)> ShaderFilenames; + typedef std::array(EShaderType::Count)> ShaderSources; private: - void reset(); + std::string m_name; + unsigned int m_id{ 0 }; + +public: + ~GLShaderProgram(); + + bool init_from_files(const std::string& name, const ShaderFilenames& filenames); + bool init_from_texts(const std::string& name, const ShaderSources& sources); + + const std::string& get_name() const { return m_name; } + unsigned int get_id() const { return m_id; } + + void start_using() const; + void stop_using() const; + + 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& value) const; + bool set_uniform(const char* name, const std::array& value) const; + bool set_uniform(const char* name, const std::array& value) const; + bool set_uniform(const char* name, const std::array& value) const; + bool set_uniform(const char* name, const std::array& value) const; + bool set_uniform(const char* name, const std::array& 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 0000000000..1041faa3dc --- /dev/null +++ b/src/slic3r/GUI/GLShadersManager.cpp @@ -0,0 +1,75 @@ +#include "libslic3r/libslic3r.h" +#include "GLShadersManager.hpp" +#include "3DScene.hpp" +#include "GUI_App.hpp" + +#include +#include + +#include + +namespace Slic3r { + +std::pair GLShadersManager::init() +{ + std::string error; + + auto append_shader = [this, &error](const std::string& name, const GLShaderProgram::ShaderFilenames& filenames) { + m_shaders.push_back(std::make_unique()); + if (!m_shaders.back()->init_from_files(name, filenames)) { + 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" }); + // 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() +{ + for (std::unique_ptr& shader : m_shaders) { + shader.reset(); + } +} + +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& 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& p) { return static_cast(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 0000000000..b2bbc140bd --- /dev/null +++ b/src/slic3r/GUI/GLShadersManager.hpp @@ -0,0 +1,30 @@ +#ifndef slic3r_GLShadersManager_hpp_ +#define slic3r_GLShadersManager_hpp_ + +#include "GLShader.hpp" + +#include +#include +#include + +namespace Slic3r { + +class GLShadersManager +{ + std::vector> m_shaders; + +public: + std::pair 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 62129cfc08..6a4d0f9b60 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 @@ -168,12 +169,16 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vectorwidth, image->height); - nsvgRasterize(rast, image, 0, 0, scale, sprite_data.data(), sprite_size_px, sprite_size_px, sprite_stride); + // offset by 1 to leave the first pixel empty (both in x and y) + nsvgRasterize(rast, image, 1, 1, scale, sprite_data.data(), sprite_size_px, sprite_size_px, sprite_stride); // makes white only copy of the sprite ::memcpy((void*)sprite_white_only_data.data(), (const void*)sprite_data.data(), sprite_bytes); @@ -231,7 +237,7 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector& state : states) { @@ -250,19 +256,25 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector 1.0f) glsafe(::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy)); } @@ -578,7 +590,7 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo if (apply_anisotropy) { - GLfloat max_anisotropy = GLCanvas3DManager::get_gl_info().get_max_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)); } diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp index 51d787d9d3..46371b037a 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 +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Camera.hpp" +#include "slic3r/GUI/Plater.hpp" #include #include @@ -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); @@ -86,7 +86,31 @@ 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 { - GLTexture::render_sub_texture(tex_id, left, right, bottom, top, get_uvs(tex_width, tex_height, icon_size)); + 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; + // tiles in the texture are spaced by 1 pixel + float icon_size_px = (float)(tex_width - 1) / (float)Num_States; + float inv_tex_width = 1.0f / (float)tex_width; + float inv_tex_height = 1.0f / (float)tex_height; + // tiles in the texture are spaced by 1 pixel + float u_offset = 1.0f * inv_tex_width; + float v_offset = 1.0f * inv_tex_height; + float du = icon_size_px * inv_tex_width; + float dv = icon_size_px * inv_tex_height; + float left = u_offset + (float)m_state * du; + float right = left + du - u_offset; + float top = v_offset + (float)m_data.sprite_id * dv; + float bottom = top + dv - v_offset; + ret.left_top = { left, top }; + ret.left_bottom = { left, bottom }; + ret.right_bottom = { right, bottom }; + ret.right_top = { right, top }; + return ret; + }; + + GLTexture::render_sub_texture(tex_id, left, right, bottom, top, uvs(tex_width, tex_height, icon_size)); if (is_pressed()) { @@ -97,28 +121,6 @@ void GLToolbarItem::render(unsigned int tex_id, float left, float right, float b } } -GLTexture::Quad_UVs GLToolbarItem::get_uvs(unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const -{ - GLTexture::Quad_UVs uvs; - - float inv_tex_width = (tex_width != 0) ? 1.0f / (float)tex_width : 0.0f; - float inv_tex_height = (tex_height != 0) ? 1.0f / (float)tex_height : 0.0f; - - float scaled_icon_width = (float)icon_size * inv_tex_width; - float scaled_icon_height = (float)icon_size * inv_tex_height; - float left = (float)m_state * scaled_icon_width; - float right = left + scaled_icon_width; - float top = (float)m_data.sprite_id * scaled_icon_height; - float bottom = top + scaled_icon_height; - - uvs.left_top = { left, top }; - uvs.left_bottom = { left, bottom }; - uvs.right_bottom = { right, bottom }; - uvs.right_top = { right, top }; - - return uvs; -} - BackgroundTexture::Metadata::Metadata() : filename("") , left(0) @@ -152,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) { } @@ -229,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); @@ -356,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 = L(""); + return tooltip; +} + +void GLToolbar::get_additional_tooltip(int item_id, std::string& text) +{ + if (0 <= item_id && item_id < (int)m_items.size()) + { + 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())) - { - GLToolbarItem* item = m_items[item_id]; - if (item != nullptr) - item->set_additional_tooltip(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() @@ -419,33 +430,58 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent) // 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())) + 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, // as when switching between views - processed = true; - + m_mouse_capture.reset(); + return true; + } m_mouse_capture.reset(); } if (evt.Moving()) - m_tooltip = update_hover_state(mouse_pos, parent); + update_hover_state(mouse_pos, parent); else if (evt.LeftUp()) - m_mouse_capture.left = false; + { + if (m_mouse_capture.left) + { + processed = true; + m_mouse_capture.left = false; + } + else + return false; + } else if (evt.MiddleUp()) - m_mouse_capture.middle = false; + { + if (m_mouse_capture.middle) + { + processed = true; + m_mouse_capture.middle = false; + } + else + return 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; + { + if (m_mouse_capture.right) + { + processed = true; + m_mouse_capture.right = false; + } + else + return false; + } + else if (evt.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; + } int item_id = contains_mouse(mouse_pos, parent); - if (item_id == -1) - { - // mouse is outside the toolbar - m_tooltip = L(""); - } - else + if (item_id != -1) { // mouse inside toolbar if (evt.LeftDown() || evt.LeftDClick()) @@ -453,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); @@ -470,15 +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(); } } - else if (evt.LeftUp()) - processed = true; } return processed; @@ -546,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)) @@ -553,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())) @@ -607,25 +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 L(""); + 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 zoom = (float)parent.get_camera().get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + 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(); @@ -642,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()) @@ -658,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 += L("\n") + additional_tooltip; - } - } switch (state) { @@ -711,8 +744,27 @@ 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; } @@ -721,16 +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 zoom = (float)parent.get_camera().get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + 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(); @@ -746,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()) @@ -762,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 += L("\n") + additional_tooltip; - } - } switch (state) { @@ -815,8 +852,27 @@ 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; } @@ -825,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 @@ -846,8 +900,7 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3 { // NB: mouse_pos is already scaled appropriately - float zoom = (float)parent.get_camera().get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + 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(); @@ -920,8 +973,7 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D& { // NB: mouse_pos is already scaled appropriately - float zoom = (float)parent.get_camera().get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + 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(); @@ -1073,8 +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 zoom = (float)parent.get_camera().get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + 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; @@ -1122,8 +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 zoom = (float)parent.get_camera().get_zoom(); - float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + 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; @@ -1177,24 +1227,31 @@ bool GLToolbar::generate_icons_texture() const } std::vector> 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 } - bool res = m_icons_texture.load_from_svg_files_as_sprites_array(filenames, states, (unsigned int)(m_layout.icons_size * m_layout.scale), true); + unsigned int sprite_size_px = (unsigned int)(m_layout.icons_size * m_layout.scale); +// // force even size +// if (sprite_size_px % 2 != 0) +// sprite_size_px += 1; + + bool res = m_icons_texture.load_from_svg_files_as_sprites_array(filenames, states, sprite_size_px, false); if (res) m_icons_texture_dirty = false; diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp index 07da836fce..74e18de975 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; } @@ -143,7 +145,6 @@ public: void 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; private: - GLTexture::Quad_UVs get_uvs(unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const; void set_visible(bool visible) { m_data.visible = visible; } friend class GLToolbar; @@ -253,7 +254,6 @@ private: }; MouseCapture m_mouse_capture; - std::string m_tooltip; int m_pressed_toggable_id; public: @@ -276,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(); @@ -293,15 +293,18 @@ public: bool is_any_item_pressed() const; + unsigned int get_items_count() const { return (unsigned int)m_items.size(); } int get_item_id(const std::string& name) const; 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 c22fd6f792..d822c98736 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 #include -#include #include +#include #if __APPLE__ #import @@ -18,22 +16,16 @@ #include "boost/nowide/convert.hpp" #endif -#include - -#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(boost::any_cast(value))); + else if (opt_key.compare("ironing_type") == 0) + config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("gcode_flavor") == 0) config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); + else if (opt_key.compare("machine_limits_usage") == 0) + config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("support_material_pattern") == 0) config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if (opt_key.compare("seam_position") == 0) @@ -200,6 +196,8 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); else if(opt_key.compare("support_pillar_connection_mode") == 0) config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); + else if(opt_key == "printhost_authorization_type") + config.set_key_value(opt_key, new ConfigOptionEnum(boost::any_cast(value))); } break; case coPoints:{ @@ -229,74 +227,100 @@ void show_error(wxWindow* parent, const wxString& message) msg.ShowModal(); } +void show_error(wxWindow* parent, const char* message) +{ + assert(message); + show_error(parent, wxString::FromUTF8(message)); +} + void show_error_id(int id, const std::string& message) { auto *parent = id != 0 ? wxWindow::FindWindowById(id) : nullptr; - show_error(parent, from_u8(message)); + show_error(parent, message); } void show_info(wxWindow* parent, const wxString& message, const wxString& title) { - wxMessageDialog msg_wingow(parent, message, 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(); } +void show_info(wxWindow* parent, const char* message, const char* title) +{ + assert(message); + show_info(parent, wxString::FromUTF8(message), title ? wxString::FromUTF8(title) : wxString()); +} + 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 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; + unsigned 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; - } - } + 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; + 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 0b904bad86..cf133971e3 100644 --- a/src/slic3r/GUI/GUI.hpp +++ b/src/slic3r/GUI/GUI.hpp @@ -1,7 +1,8 @@ #ifndef slic3r_GUI_hpp_ #define slic3r_GUI_hpp_ -#include +namespace boost { class any; } +namespace boost::filesystem { class path; } #include @@ -39,18 +40,26 @@ extern void add_menus(wxMenuBar *menu, int event_preferences_changed, int event_ 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()); } void show_error_id(int id, const std::string& message); // For Perl -void show_info(wxWindow* parent, const wxString& message, const wxString& title); +void show_info(wxWindow* parent, const wxString& message, const wxString& title = wxString()); +void show_info(wxWindow* parent, const char* message, const char* title = nullptr); +inline void show_info(wxWindow* parent, const std::string& message,const std::string& title = std::string()) { show_info(parent, message.c_str(), title.c_str()); } 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 7d37baa665..694cd7103f 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1,4 +1,6 @@ +#include "libslic3r/Technologies.hpp" #include "GUI_App.hpp" +#include "GUI_Init.hpp" #include "GUI_ObjectList.hpp" #include "GUI_ObjectManipulation.hpp" #include "I18N.hpp" @@ -10,6 +12,7 @@ #include #include #include +#include #include #include @@ -22,21 +25,30 @@ #include #include #include -#include +#include #include #include +#include +#include +#include +#include + #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" @@ -46,19 +58,344 @@ #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 "BitmapCache.hpp" #ifdef __WXMSW__ -#include +#include +#include #endif // __WXMSW__ -#if ENABLE_THUMBNAIL_GENERATOR +#if ENABLE_THUMBNAIL_GENERATOR_DEBUG #include #include -#endif // ENABLE_THUMBNAIL_GENERATOR +#endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG namespace Slic3r { namespace GUI { +class MainFrame; + +class SplashScreen : public wxSplashScreen +{ +public: + SplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds, wxPoint pos = wxDefaultPosition) + : wxSplashScreen(bitmap, splashStyle, milliseconds, (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), int(m_scale * 275)); + + 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); + + memDc.SetFont(m_constant_text.credits_font); + memDc.DrawLabel(m_constant_text.credits, banner_rect, wxALIGN_BOTTOM | wxALIGN_LEFT); + } + +private: + wxBitmap m_main_bitmap; + wxFont m_action_font; + 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); + + scale_font(m_constant_text.version_font, 2.f); + + // 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(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) { @@ -95,9 +432,10 @@ 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(); } -static void register_dpi_event() -{ #ifdef WIN32 +#if !wxVERSION_EQUAL_OR_GREATER_THAN(3,1,3) +static void register_win32_dpi_event() +{ enum { WM_DPICHANGED_ = 0x02e0 }; wxWindow::MSWRegisterMessageHandler(WM_DPICHANGED_, [](wxWindow *win, WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { @@ -110,9 +448,111 @@ static void register_dpi_event() return true; }); -#endif } +#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() +{ + 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(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; + PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam; + switch (wParam) { + case DBT_DEVICEARRIVAL: + if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) + plater->GetEventHandler()->AddPendingEvent(VolumeAttachedEvent(EVT_VOLUME_ATTACHED)); + else if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { + PDEV_BROADCAST_DEVICEINTERFACE lpdbi = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb; +// if (lpdbi->dbcc_classguid == GUID_DEVINTERFACE_VOLUME) { +// printf("DBT_DEVICEARRIVAL %d - Media has arrived: %ws\n", msg_count, lpdbi->dbcc_name); + if (lpdbi->dbcc_classguid == GUID_DEVINTERFACE_HID) + plater->GetEventHandler()->AddPendingEvent(HIDDeviceAttachedEvent(EVT_HID_DEVICE_ATTACHED, boost::nowide::narrow(lpdbi->dbcc_name))); + } + break; + case DBT_DEVICEREMOVECOMPLETE: + if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME) + plater->GetEventHandler()->AddPendingEvent(VolumeDetachedEvent(EVT_VOLUME_DETACHED)); + else if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { + PDEV_BROADCAST_DEVICEINTERFACE lpdbi = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb; +// if (lpdbi->dbcc_classguid == GUID_DEVINTERFACE_VOLUME) +// printf("DBT_DEVICEARRIVAL %d - Media was removed: %ws\n", msg_count, lpdbi->dbcc_name); + if (lpdbi->dbcc_classguid == GUID_DEVINTERFACE_HID) + plater->GetEventHandler()->AddPendingEvent(HIDDeviceDetachedEvent(EVT_HID_DEVICE_DETACHED, boost::nowide::narrow(lpdbi->dbcc_name))); + } + break; + default: + break; + } + 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(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(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(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 static void generic_exception_handle() { @@ -134,10 +574,10 @@ 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 std::exception& ex) { @@ -147,14 +587,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()) + , m_other_instance_message_handler(std::make_unique()) +{ + //app config initializes early becasuse it is used in instance checking in PrusaSlicer.cpp + this->init_app_config(); +} GUI_App::~GUI_App() { @@ -168,6 +646,77 @@ 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() +{ + return m_opengl_mgr.init_gl(); +} + +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 "-alpha"); +// 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(boost::nowide::widen(name), boost::nowide::widen(path)); +} + bool GUI_App::OnInit() { try { @@ -185,49 +734,96 @@ 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)); - SetAppName(SLIC3R_APP_KEY); - SetAppDisplayName(SLIC3R_APP_NAME); +#ifdef __linux__ + if (! check_old_linux_datadir(GetAppName())) { + std::cerr << "Quitting, user chose to move his 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__ + associate_3mf_files(); #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, *(this->plater_->get_current_canvas3D())); + } + } + }); + } + else { +#ifdef __WXMSW__ + associate_gcode_files(); +#endif // __WXMSW__ + } // initialize label colors and fonts init_label_colours(); @@ -241,66 +837,91 @@ bool GUI_App::on_init_inner() try { preset_bundle->load_presets(*app_config); } catch (const std::exception &ex) { - show_error(nullptr, from_u8(ex.what())); + show_error(nullptr, ex.what()); } - register_dpi_event(); +#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 // Let the libslic3r know the callback, which will translate messages on demand. 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())); + 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; + if (update_gui_after_init) { + 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; - PresetUpdater::UpdateResult updater_result; - try { - updater_result = preset_updater->config_update(); - if (updater_result == PresetUpdater::R_INCOMPAT_EXIT) { - mainframe->Close(); - } else if (updater_result == PresetUpdater::R_INCOMPAT_CONFIGURED) { - app_conf_exists = true; - } - } catch (const std::exception &ex) { - show_error(nullptr, from_u8(ex.what())); + if (preset_updater != nullptr) { + check_updates(false); + + CallAfter([this] { + config_wizard_startup(); + preset_updater->slic3r_update_notify(); + preset_updater->sync(preset_bundle); + }); } - CallAfter([this] { - config_wizard_startup(); - preset_updater->slic3r_update_notify(); - preset_updater->sync(preset_bundle); - }); +#ifdef _WIN32 + //sets window property to mainframe so other instances can indentify it + OtherInstanceMessageHandler::init_windows_properties(mainframe, m_instance_hash_int); +#endif //WIN32 } }); - load_current_presets(); - + 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); /* Temporary workaround for the correct behavior of the Scrolled sidebar panel: @@ -313,6 +934,10 @@ bool GUI_App::on_init_inner() update_mode(); // update view mode after fix of the object_list size +#ifdef __APPLE__ + other_instance_message_handler()->bring_instance_forward(); +#endif //__APPLE__ + m_initialized = true; return true; } @@ -332,16 +957,15 @@ unsigned GUI_App::get_colour_approx_luma(const wxColour &colour) bool GUI_App::dark_mode() { +#if __APPLE__ + // The check for dark mode returns false positive on 10.12 and 10.13, + // which allowed setting dark menu bar and dock area, which is + // is detected as dark mode. We must run on at least 10.14 where the + // proper dark mode was first introduced. + return wxPlatformInfo::Get().CheckOSVersion(10, 14) && mac_dark_mode(); +#else const unsigned luma = get_colour_approx_luma(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); return luma < 128; -} - -bool GUI_App::dark_mode_menus() -{ -#if __APPLE__ - return mac_dark_mode(); -#else - return dark_mode(); #endif } @@ -383,6 +1007,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) @@ -398,6 +1027,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) { @@ -416,6 +1046,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__ @@ -426,56 +1061,86 @@ 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 { - // Weird things happen as the Paint messages are floating around the windows being destructed. - // Avoid the Paint messages by hiding the main window. - // Also the application closes much faster without these unnecessary screen refreshes. - // In addition, there were some crashes due to the Paint events sent to already destructed windows. - mainframe->Show(false); +#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__ - const auto msg_name = _(L("Changing of an application language")) + dots; - wxProgressDialog dlg(msg_name, msg_name); + 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 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(); + + wxProgressDialog dlg(msg_name, msg_name, 100, nullptr, wxPD_AUTO_HIDE); dlg.Pulse(); + dlg.Update(10, _L("Recreating") + dots); - // to make sure nobody accesses data from the soon-to-be-destroyed widgets: - tabs_list.clear(); - plater_ = nullptr; - - dlg.Update(10, _(L("Recreating")) + dots); - - MainFrame* topwindow = mainframe; + MainFrame *old_main_frame = mainframe; mainframe = new MainFrame(); - sidebar().obj_list()->init_objects(); // propagate model objects to object list + 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); - if (topwindow) { - SetTopWindow(mainframe); - - dlg.Update(30, _(L("Recreating")) + dots); - topwindow->Destroy(); - } - - dlg.Update(80, _(L("Loading of current presets")) + 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); 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); - + 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 @@ -483,7 +1148,6 @@ void GUI_App::recreate_GUI() const int list_min_height = 15 * em_unit(); if (obj_list()->GetMinSize().GetY() > list_min_height) obj_list()->SetMinSize(wxSize(-1, list_min_height)); - update_mode(); // #ys_FIXME_delete_after_testing Do we still need this ? @@ -491,6 +1155,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() @@ -530,9 +1196,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) @@ -555,7 +1221,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); @@ -567,7 +1233,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); @@ -575,11 +1241,22 @@ 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()) { - _3DScene::remove_all_canvases(); - recreate_GUI(); + recreate_GUI(_L("Changing of an application language") + dots); return true; } else { return false; @@ -629,19 +1306,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; } @@ -670,7 +1348,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; @@ -687,7 +1364,6 @@ bool GUI_App::load_language(wxString language, bool initial) BOOST_LOG_TRIVIAL(trace) << boost::format("Best translation language detected (may be different from user locales): %1%") % m_language_info_best->CanonicalName.ToUTF8().data(); } } -#endif } const wxLanguageInfo *language_info = language.empty() ? nullptr : wxLocale::FindLanguageInfo(language); @@ -703,6 +1379,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) @@ -721,6 +1398,16 @@ 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; + if (! wxLocale::IsAvailable(language_info->Language)) { // Loading the language dictionary failed. wxString message = "Switching PrusaSlicer to language " + language_info->CanonicalName + " failed."; @@ -747,9 +1434,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; } @@ -757,7 +1444,7 @@ Tab* GUI_App::get_tab(Preset::Type type) { for (Tab* tab: tabs_list) if (tab->type() == type) - return tab->complited() ? tab : nullptr; // To avoid actions with no-completed Tab + return tab->completed() ? tab : nullptr; // To avoid actions with no-completed Tab return nullptr; } @@ -789,6 +1476,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) @@ -796,47 +1484,58 @@ void GUI_App::add_config_menu(wxMenuBar *menu) auto local_menu = new wxMenu(); wxWindowID config_id_base = wxWindow::NewControlId(int(ConfigMenuCnt)); - const auto config_wizard_name = _(ConfigWizard::name(true).wx_str()); - const auto config_wizard_tooltip = wxString::Format(_(L("Run %s")), config_wizard_name); + 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); + _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->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("Change Application &Language"))); - 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) { case ConfigMenuWizard: run_wizard(ConfigWizard::RR_USER); break; + case ConfigMenuUpdate: + check_updates(true); + break; 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; @@ -869,8 +1568,23 @@ void GUI_App::add_config_menu(wxMenuBar *menu) 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 (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: @@ -878,14 +1592,21 @@ void GUI_App::add_config_menu(wxMenuBar *menu) /* Before change application language, let's check unsaved changes on 3D-Scene * and draw user's attention to the application restarting after a language change */ - 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")), - wxICON_QUESTION | wxOK | wxCANCEL); - if ( dialog.ShowModal() == wxID_CANCEL) - return; + { + // 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?"), + title, + wxICON_QUESTION | wxOK | wxCANCEL); + if (dialog.ShowModal() == wxID_CANCEL) + return; + } switch_language(); break; @@ -899,42 +1620,50 @@ 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. - return true; - // Ask the user. - 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?")); - wxMessageDialog dialog(mainframe, - message, - wxString(SLIC3R_APP_NAME) + " - " + _(L("Unsaved Presets")), - wxICON_QUESTION | wxYES_NO | wxNO_DEFAULT); - return dialog.ShowModal() == wxID_YES; + 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& 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::checked_tab(Tab* tab) @@ -948,12 +1677,19 @@ bool GUI_App::checked_tab(Tab* tab) // Update UI / Tabs to reflect changes in the currently loaded presets void GUI_App::load_current_presets() { + // check printer_presets for the containing information about "Print Host upload" + // and create physical printer from it, if any exists + 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) if (tab->supports_printer_technology(printer_technology)) { - if (tab->type() == Preset::TYPE_PRINTER) + if (tab->type() == Preset::TYPE_PRINTER) { static_cast(tab)->update_pages(); + // Mark the plater to update print bed by tab->load_current_preset() from Plater::on_config_change(). + this->plater()->force_print_bed_update(); + } tab->load_current_preset(); } } @@ -965,13 +1701,58 @@ 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) { + wxString fn = filename.Upper(); + if (fn.EndsWith(".G") || fn.EndsWith(".GCODE")) + ++ 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 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 gcode_files; + std::vector non_gcode_files; + for (const auto& filename : fileNames) { + wxString fn = filename.Upper(); + if (fn.EndsWith(".G") || fn.EndsWith(".GCODE")) + 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()) + this->plater()->load_files(files, true, true); + for (const wxString &filename : gcode_files) + start_new_gcodeviewer(&filename); + } } #endif /* __APPLE */ @@ -1078,9 +1859,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!")); } } @@ -1097,7 +1878,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; @@ -1126,7 +1907,6 @@ void GUI_App::gcode_thumbnails_debug() } else if (reading_image && boost::starts_with(gcode_line, END_MASK)) { -#if ENABLE_THUMBNAIL_GENERATOR_PNG_TO_GCODE std::string out_filename = out_path + std::to_string(width) + "x" + std::to_string(height) + ".png"; boost::nowide::ofstream out_file(out_filename.c_str(), std::ios::binary); if (out_file.good()) @@ -1138,46 +1918,6 @@ void GUI_App::gcode_thumbnails_debug() out_file.write(decoded.c_str(), decoded.size()); out_file.close(); } -#else - if (!row.empty()) - { - rows.push_back(row); - row.clear(); - } - - if ((unsigned int)rows.size() == height) - { - std::vector thumbnail(4 * width * height, 0); - for (unsigned int r = 0; r < (unsigned int)rows.size(); ++r) - { - std::string decoded_row; - decoded_row.resize(boost::beast::detail::base64::decoded_size(rows[r].size())); - decoded_row.resize(boost::beast::detail::base64::decode((void*)&decoded_row[0], rows[r].data(), rows[r].size()).first); - - if ((unsigned int)decoded_row.size() == width * 4) - { - void* image_ptr = (void*)(thumbnail.data() + r * width * 4); - ::memcpy(image_ptr, (const void*)decoded_row.c_str(), width * 4); - } - } - - wxImage image(width, height); - image.InitAlpha(); - - for (unsigned int r = 0; r < height; ++r) - { - unsigned int rr = r * width; - for (unsigned int c = 0; c < width; ++c) - { - unsigned char* px = thumbnail.data() + 4 * (rr + c); - image.SetRGB((int)c, (int)r, px[0], px[1], px[2]); - image.SetAlpha((int)c, (int)r, px[3]); - } - } - - image.SaveFile(out_path + std::to_string(width) + "x" + std::to_string(height) + ".png", wxBITMAP_TYPE_PNG); - } -#endif // ENABLE_THUMBNAIL_GENERATOR_PNG_TO_GCODE reading_image = false; width = 0; @@ -1185,17 +1925,7 @@ void GUI_App::gcode_thumbnails_debug() rows.clear(); } else if (reading_image) - { -#if !ENABLE_THUMBNAIL_GENERATOR_PNG_TO_GCODE - if (!row.empty() && (gcode_line[1] == ' ')) - { - rows.push_back(row); - row.clear(); - } -#endif // !ENABLE_THUMBNAIL_GENERATOR_PNG_TO_GCODE - row += gcode_line.substr(2); - } } } @@ -1230,7 +1960,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()); } @@ -1254,7 +1986,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()) { @@ -1270,6 +2002,27 @@ bool GUI_App::config_wizard_startup() return false; } +void GUI_App::check_updates(const bool verbose) +{ + PresetUpdater::UpdateResult updater_result; + try { + 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) { + m_app_conf_exists = true; + } + else if (verbose && updater_result == PresetUpdater::R_NOOP) { + MsgNoUpdates dlg; + dlg.ShowModal(); + } + } + 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) = @_; @@ -1297,50 +2050,47 @@ bool GUI_App::config_wizard_startup() #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)); @@ -1354,9 +2104,33 @@ 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); +} + +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 bc912086e8..fec73b7244 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -3,15 +3,16 @@ #include #include -#include "libslic3r/PrintConfig.hpp" -#include "MainFrame.hpp" #include "ImGuiWrapper.hpp" #include "ConfigWizard.hpp" +#include "OpenGLManager.hpp" +#include "libslic3r/Preset.hpp" #include #include #include #include +#include #include #include @@ -23,14 +24,28 @@ 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; + -namespace GUI -{ enum FileType { @@ -74,10 +89,26 @@ 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 }; wxColour m_color_label_modified; wxColour m_color_label_sys; @@ -86,8 +117,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 m_wxLocale; @@ -96,20 +128,40 @@ class GUI_App : public wxApp // Best translation language, provided by Windows or OSX, owned by wxWidgets. const wxLanguageInfo *m_language_info_best = nullptr; + OpenGLManager m_opengl_mgr; + + std::unique_ptr m_removable_drive_manager; + std::unique_ptr m_imgui; std::unique_ptr m_printhost_job_queue; ConfigWizard* m_wizard; // Managed by wxWindow tree + std::unique_ptr m_other_instance_message_handler; + std::unique_ptr 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(); - static bool dark_mode_menus(); void init_label_colours(); void update_label_colours_from_appconfig(); void init_fonts(); @@ -124,18 +176,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 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); @@ -153,10 +211,12 @@ public: 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 */ @@ -169,18 +229,33 @@ 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; std::vector 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(); } PrintHostJobQueue& printhost_job_queue() { return *m_printhost_job_queue.get(); } @@ -188,27 +263,36 @@ public: void open_web_page_localized(const std::string &http_address); bool run_wizard(ConfigWizard::RunReason reason, ConfigWizard::StartPage start_page = ConfigWizard::SP_WELCOME); -#if ENABLE_THUMBNAIL_GENERATOR +#if ENABLE_THUMBNAIL_GENERATOR_DEBUG // temporary and debug only -> extract thumbnails from selected gcode and save them as png files void gcode_thumbnails_debug(); -#endif // ENABLE_THUMBNAIL_GENERATOR +#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); } 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); bool select_language(); bool config_wizard_startup(); + void check_updates(const bool verbose); #ifdef __WXMSW__ void associate_3mf_files(); + void associate_gcode_files(); #endif // __WXMSW__ }; 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 0000000000..70536c6ba9 --- /dev/null +++ b/src/slic3r/GUI/GUI_Init.cpp @@ -0,0 +1,84 @@ +#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 + +#include +#include + +namespace Slic3r { +namespace GUI { + +int GUI_Run(GUI_InitParams ¶ms) +{ + 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 = ¶ms; +/* + 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 0000000000..c420c9554a --- /dev/null +++ b/src/slic3r/GUI/GUI_Init.hpp @@ -0,0 +1,27 @@ +#ifndef slic3r_GUI_Init_hpp_ +#define slic3r_GUI_Init_hpp_ + +#include + +namespace Slic3r { + +namespace GUI { + +struct GUI_InitParams +{ + int argc; + char **argv; + + std::vector load_configs; + DynamicPrintConfig extra_config; + std::vector input_files; + + bool start_as_gcodeviewer; +}; + +int GUI_Run(GUI_InitParams ¶ms); + +} // 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 d209214ae6..7d8643c7f8 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 @@ -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); @@ -58,7 +61,7 @@ void ObjectLayers::select_editor(LayerRangeEditor* editor, const bool is_last_ed } } -wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range) +wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range, PlusMinusButton *delete_button, PlusMinusButton *add_button) { const bool is_last_edited_range = range == m_selectable_range; @@ -79,8 +82,8 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range) // Add control for the "Min Z" - auto editor = new LayerRangeEditor(this, double_to_string(range.first), etMinZ, - set_focus_data, [range, update_focus_data, this](coordf_t min_z, bool enter_pressed) + auto editor = new LayerRangeEditor(this, double_to_string(range.first), etMinZ, set_focus_data, + [range, update_focus_data, this, delete_button, add_button](coordf_t min_z, bool enter_pressed, bool dont_update_ui) { if (fabs(min_z - range.first) < EPSILON) { m_selection_type = etUndef; @@ -89,10 +92,14 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range) // data for next focusing coordf_t max_z = min_z < range.second ? range.second : min_z + 0.5; - const t_layer_height_range& new_range = { min_z, max_z }; + const t_layer_height_range new_range = { min_z, max_z }; + if (delete_button) + delete_button->range = new_range; + if (add_button) + add_button->range = new_range; update_focus_data(new_range, etMinZ, enter_pressed); - return wxGetApp().obj_list()->edit_layer_range(range, new_range); + return wxGetApp().obj_list()->edit_layer_range(range, new_range, dont_update_ui); }); select_editor(editor, is_last_edited_range); @@ -100,8 +107,8 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range) // Add control for the "Max Z" - editor = new LayerRangeEditor(this, double_to_string(range.second), etMaxZ, - set_focus_data, [range, update_focus_data, this](coordf_t max_z, bool enter_pressed) + editor = new LayerRangeEditor(this, double_to_string(range.second), etMaxZ, set_focus_data, + [range, update_focus_data, this, delete_button, add_button](coordf_t max_z, bool enter_pressed, bool dont_update_ui) { if (fabs(max_z - range.second) < EPSILON || range.first > max_z) { m_selection_type = etUndef; @@ -110,9 +117,13 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range) // data for next focusing const t_layer_height_range& new_range = { range.first, max_z }; + if (delete_button) + delete_button->range = new_range; + if (add_button) + add_button->range = new_range; update_focus_data(new_range, etMaxZ, enter_pressed); - return wxGetApp().obj_list()->edit_layer_range(range, new_range); + return wxGetApp().obj_list()->edit_layer_range(range, new_range, dont_update_ui); }); select_editor(editor, is_last_edited_range); @@ -120,9 +131,8 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range) // Add control for the "Layer height" - editor = new LayerRangeEditor(this, - double_to_string(m_object->layer_config_ranges[range].option("layer_height")->getFloat()), - etLayerHeight, set_focus_data, [range, this](coordf_t layer_height, bool) + editor = new LayerRangeEditor(this, double_to_string(m_object->layer_config_ranges[range].option("layer_height")->getFloat()), etLayerHeight, set_focus_data, + [range, this](coordf_t layer_height, bool, bool) { return wxGetApp().obj_list()->edit_layer_range(range, layer_height); }); @@ -141,30 +151,30 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range) return sizer; } - + 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 sizer = create_layer(range); - - auto del_btn = new ScalableButton(m_parent, wxID_ANY, m_bmp_delete); + auto del_btn = new PlusMinusButton(m_parent, m_bmp_delete, range); del_btn->SetToolTip(_(L("Remove layer range"))); + auto add_btn = new PlusMinusButton(m_parent, m_bmp_add, range); + wxString tooltip = wxGetApp().obj_list()->can_add_new_range_after_current(range); + add_btn->SetToolTip(tooltip.IsEmpty() ? _(L("Add layer range")) : tooltip); + add_btn->Enable(tooltip.IsEmpty()); + + auto sizer = create_layer(range, del_btn, add_btn); sizer->Add(del_btn, 0, wxRIGHT | wxLEFT, em_unit(m_parent)); - - del_btn->Bind(wxEVT_BUTTON, [range](wxEvent &) { - wxGetApp().obj_list()->del_layer_range(range); - }); - - auto add_btn = new ScalableButton(m_parent, wxID_ANY, m_bmp_add); - add_btn->SetToolTip(_(L("Add layer range"))); - sizer->Add(add_btn); - add_btn->Bind(wxEVT_BUTTON, [range](wxEvent &) { - wxGetApp().obj_list()->add_layer_range_after_current(range); + del_btn->Bind(wxEVT_BUTTON, [del_btn](wxEvent &) { + wxGetApp().obj_list()->del_layer_range(del_btn->range); + }); + + add_btn->Bind(wxEVT_BUTTON, [add_btn](wxEvent &) { + wxGetApp().obj_list()->add_layer_range_after_current(add_btn->range); }); } } @@ -204,7 +214,7 @@ void ObjectLayers::update_layers_list() if (type & itLayerRoot) create_layers_list(); else - create_layer(objects_ctrl->GetModel()->GetLayerRangeByItem(item)); + create_layer(objects_ctrl->GetModel()->GetLayerRangeByItem(item), nullptr, nullptr); m_parent->Layout(); } @@ -255,7 +265,7 @@ void ObjectLayers::msw_rescale() { wxSizerItem* b_item = item->GetSizer()->GetItem(btn); if (b_item->IsWindow()) { - ScalableButton* button = dynamic_cast(b_item->GetWindow()); + auto button = dynamic_cast(b_item->GetWindow()); if (button != nullptr) button->msw_rescale(); } @@ -265,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 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(b_item->GetWindow()); + if (button != nullptr) + button->msw_rescale(); + } + } + } + } + m_grid_sizer->Layout(); +} + void ObjectLayers::reset_selection() { m_selectable_range = { 0.0, 0.0 }; @@ -275,7 +312,7 @@ LayerRangeEditor::LayerRangeEditor( ObjectLayers* parent, const wxString& value, EditorType type, std::function set_focus_data_fn, - std::function edit_fn + std::function edit_fn ) : m_valid_value(value), m_type(type), @@ -293,13 +330,13 @@ LayerRangeEditor::LayerRangeEditor( ObjectLayers* parent, m_enter_pressed = true; // If LayersList wasn't updated/recreated, we can call wxEVT_KILL_FOCUS.Skip() if (m_type&etLayerHeight) { - if (!edit_fn(get_value(), true)) + if (!edit_fn(get_value(), true, false)) SetValue(m_valid_value); else m_valid_value = double_to_string(get_value()); m_call_kill_focus = true; } - else if (!edit_fn(get_value(), true)) { + else if (!edit_fn(get_value(), true, false)) { SetValue(m_valid_value); m_call_kill_focus = true; } @@ -319,13 +356,13 @@ LayerRangeEditor::LayerRangeEditor( ObjectLayers* parent, #endif // not __WXGTK__ // If LayersList wasn't updated/recreated, we should call e.Skip() if (m_type & etLayerHeight) { - if (!edit_fn(get_value(), false)) + if (!edit_fn(get_value(), false, dynamic_cast(e.GetWindow()) != nullptr)) SetValue(m_valid_value); else m_valid_value = double_to_string(get_value()); e.Skip(); } - else if (!edit_fn(get_value(), false)) { + else if (!edit_fn(get_value(), false, dynamic_cast(e.GetWindow()) != nullptr)) { SetValue(m_valid_value); e.Skip(); } @@ -387,4 +424,4 @@ void LayerRangeEditor::msw_rescale() } } //namespace GUI -} //namespace Slic3r \ No newline at end of file +} //namespace Slic3r diff --git a/src/slic3r/GUI/GUI_ObjectLayers.hpp b/src/slic3r/GUI/GUI_ObjectLayers.hpp index c0de3be4ce..736b5844d6 100644 --- a/src/slic3r/GUI/GUI_ObjectLayers.hpp +++ b/src/slic3r/GUI/GUI_ObjectLayers.hpp @@ -43,7 +43,8 @@ public: const wxString& value = wxEmptyString, EditorType type = etUndef, std::function set_focus_data_fn = [](EditorType) {;}, - std::function edit_fn = [](coordf_t, bool) {return false; } + // callback parameters: new value, from enter, dont't update panel UI (when called from edit field's kill focus handler for the PlusMinusButton) + std::function edit_fn = [](coordf_t, bool, bool) {return false; } ); ~LayerRangeEditor() {} @@ -69,8 +70,23 @@ public: ObjectLayers(wxWindow* parent); ~ObjectLayers() {} + + // Button remembers the layer height range, for which it has been created. + // The layer height range for this button is updated when the low or high boundary of the layer height range is updated + // by the respective text edit field, so that this button emits an action for an up to date layer height range value. + class PlusMinusButton : public ScalableButton + { + public: + PlusMinusButton(wxWindow *parent, const ScalableBitmap &bitmap, std::pair range) : ScalableButton(parent, wxID_ANY, bitmap), range(range) {} + // updated when the text edit field loses focus for any PlusMinusButton. + std::pair range; + }; + void select_editor(LayerRangeEditor* editor, const bool is_last_edited_range); - wxSizer* create_layer(const t_layer_height_range& range); // without_buttons + // Create sizer with layer height range and layer height text edit fields, without buttons. + // If the delete and add buttons are provided, the respective text edit fields will modify the layer height ranges of thes buttons + // on value change, so that these buttons work with up to date values. + wxSizer* create_layer(const t_layer_height_range& range, PlusMinusButton *delete_button, PlusMinusButton *add_button); void create_layers_list(); void update_layers_list(); @@ -78,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 a88980a8d4..0b3de9f6af 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" @@ -59,6 +59,11 @@ static PrinterTechnology printer_technology() return wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology(); } +static const Selection& scene_selection() +{ + return wxGetApp().plater()->canvas3D()->get_selection(); +} + // Config from current edited printer preset static DynamicPrintConfig& printer_config() { @@ -72,7 +77,9 @@ static int extruders_count() static void take_snapshot(const wxString& snapshot_name) { - wxGetApp().plater()->take_snapshot(snapshot_name); + Plater* plater = wxGetApp().plater(); + if (plater) + plater->take_snapshot(snapshot_name); } ObjectList::ObjectList(wxWindow* parent) : @@ -81,23 +88,22 @@ 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(nullptr, "layers"); - CATEGORY_ICON[L("Infill")] = create_scaled_bitmap(nullptr, "infill"); - CATEGORY_ICON[L("Support material")] = create_scaled_bitmap(nullptr, "support"); - CATEGORY_ICON[L("Speed")] = create_scaled_bitmap(nullptr, "time"); - CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap(nullptr, "funnel"); - CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap(nullptr, "funnel"); - CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap(nullptr, "funnel"); -// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap(nullptr, "skirt+brim"); -// CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap(nullptr, "time"); - CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap(nullptr, "wrench"); + 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"); + CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap("funnel"); + CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap("funnel"); +// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap("skirt+brim"); +// CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap("time"); + CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap("wrench"); // ptSLA - CATEGORY_ICON[L("Supports")] = create_scaled_bitmap(nullptr, "support"/*"sla_supports"*/); - CATEGORY_ICON[L("Pad")] = create_scaled_bitmap(nullptr, "pad"); + CATEGORY_ICON[L("Supports")] = create_scaled_bitmap("support"/*"sla_supports"*/); + CATEGORY_ICON[L("Pad")] = create_scaled_bitmap("pad"); + CATEGORY_ICON[L("Hollowing")] = create_scaled_bitmap("hollowing"); } // create control @@ -107,11 +113,23 @@ ObjectList::ObjectList(wxWindow* parent) : // describe control behavior Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, [this](wxDataViewEvent& event) { + // detect the current mouse position here, to pass it to list_manipulation() method + // if we detect it later, the user may have moved the mouse pointer while calculations are performed, and this would mess-up the HitTest() call performed into list_manipulation() + // see: https://github.com/prusa3d/PrusaSlicer/issues/3802 + const wxPoint mouse_pos = this->get_mouse_position_in_control(); + #ifndef __APPLE__ // On Windows and Linux, forces a kill focus emulation on the object manipulator fields because this event handler is called // before the kill focus event handler on the object manipulator when changing selection in the list, invalidating the object // manipulator cache with the following call to selection_changed() - wxGetApp().obj_manipul()->emulate_kill_focus(); +// wxGetApp().obj_manipul()->emulate_kill_focus(); // It's not necessury anymore #ys_FIXME delete after testing + + // On Windows and Linux: + // It's not invoked KillFocus event for "temporary" panels (like "Manipulation panel", "Settings", "Layer ranges"), + // if we change selection in object list. + // see https://github.com/prusa3d/PrusaSlicer/issues/3303 + // But, if we call SetFocus() for ObjectList it will cause an invoking of a KillFocus event for "temporary" panels + this->SetFocus(); #else // To avoid selection update from SetSelection() and UnselectAll() under osx if (m_prevent_list_events) @@ -142,7 +160,7 @@ ObjectList::ObjectList(wxWindow* parent) : // Workaround for entering the column editing mode on Windows. Simulate keyboard enter when another column of the active line is selected. wxDataViewItem item; wxDataViewColumn *col; - this->HitTest(get_mouse_position_in_control(), item, col); + this->HitTest(this->get_mouse_position_in_control(), item, col); new_selected_column = (col == nullptr) ? -1 : (int)col->GetModelColumn(); if (new_selected_item == m_last_selected_item && m_last_selected_column != -1 && m_last_selected_column != new_selected_column) { // Mouse clicked on another column of the active row. Simulate keyboard enter to enter the editing mode of the current column. @@ -158,11 +176,11 @@ ObjectList::ObjectList(wxWindow* parent) : selection_changed(); #ifndef __WXMSW__ - set_tooltip_for_item(get_mouse_position_in_control()); + set_tooltip_for_item(this->get_mouse_position_in_control()); #endif //__WXMSW__ #ifndef __WXOSX__ - list_manipulation(); + list_manipulation(mouse_pos); #endif //__WXOSX__ }); @@ -198,7 +216,7 @@ ObjectList::ObjectList(wxWindow* parent) : #ifdef __WXMSW__ GetMainWindow()->Bind(wxEVT_MOTION, [this](wxMouseEvent& event) { - set_tooltip_for_item(get_mouse_position_in_control()); + set_tooltip_for_item(this->get_mouse_position_in_control()); event.Skip(); }); #endif //__WXMSW__ @@ -224,9 +242,9 @@ ObjectList::ObjectList(wxWindow* parent) : // So the postponed EnsureVisible() call is planned for an item, which may not exist at the Idle processing time, if this wxEVT_SIZE // event is succeeded by a delete of the currently active item. We are trying our luck by postponing the wxEVT_SIZE triggered EnsureVisible(), // which seems to be working as of now. - this->CallAfter([this](){ this->EnsureVisible(this->GetCurrentItem()); }); + this->CallAfter([this](){ ensure_current_item_visible(); }); #else - this->EnsureVisible(this->GetCurrentItem()); + ensure_current_item_visible(); #endif e.Skip(); })); @@ -259,7 +277,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(), + 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: @@ -267,11 +289,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. @@ -281,6 +307,7 @@ void ObjectList::create_objects_ctrl() GetColumn(colName)->SetWidth(20*em); GetColumn(colPrint)->SetWidth(3*em); GetColumn(colExtruder)->SetWidth(8*em); + GetColumn(colEditing) ->SetWidth(7*em); } } @@ -312,6 +339,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& obj_idxs, std::vector& 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()); + 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) @@ -328,7 +383,7 @@ wxString ObjectList::get_mesh_errors_list(const int obj_idx, const int vol_idx / return ""; // hide tooltip // Create tooltip string, if there are errors - wxString tooltip = wxString::Format(_(L("Auto-repaired (%d errors):\n")), errors); + wxString tooltip = wxString::Format(_(L("Auto-repaired (%d errors):")), errors) + "\n"; const stl_stats& stats = vol_idx == -1 ? (*m_objects)[obj_idx]->get_object_stl_stats() : @@ -345,7 +400,7 @@ wxString ObjectList::get_mesh_errors_list(const int obj_idx, const int vol_idx / for (const auto& error : error_msg) if (error.second > 0) - tooltip += wxString::Format("\t%d %s\n", error.second, _(error.first)); + tooltip += from_u8((boost::format("\t%1% %2%\n") % error.second % _utf8(error.first)).str()); if (is_windows10()) tooltip += _(L("Right button click the icon to fix STL through Netfabb")); @@ -405,14 +460,6 @@ void ObjectList::set_tooltip_for_item(const wxPoint& pt) GetMainWindow()->SetToolTip(tooltip); } -wxPoint ObjectList::get_mouse_position_in_control() -{ - const wxPoint& pt = wxGetMousePosition(); -// wxWindow* win = GetMainWindow(); -// wxPoint screen_pos = win->GetScreenPosition(); - return wxPoint(pt.x - /*win->*/GetScreenPosition().x, pt.y - /*win->*/GetScreenPosition().y); -} - int ObjectList::get_selected_obj_idx() const { if (GetSelectedItemsCount() == 1) @@ -421,7 +468,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); @@ -445,10 +492,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("extruder")->value) > max_extruder) + size_t(object->config.extruder()) > max_extruder) extruder = _(L("default")); else - extruder = wxString::Format("%d", object->config.option("extruder")->value); + extruder = wxString::Format("%d", object->config.extruder()); m_objects_model->SetExtruder(extruder, item); @@ -457,10 +504,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("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("extruder")->value); + extruder = wxString::Format("%d", object->volumes[id]->config.extruder()); m_objects_model->SetExtruder(extruder, item); } @@ -470,7 +517,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; @@ -525,6 +571,8 @@ void ObjectList::update_extruder_in_config(const wxDataViewItem& item) if (!m_config) return; + take_snapshot(_(L("Change Extruder"))); + const int extruder = m_objects_model->GetExtruderNumber(item); m_config->set_key_value("extruder", new ConfigOptionInt(extruder)); @@ -551,10 +599,10 @@ void ObjectList::update_name_in_model(const wxDataViewItem& item) const void ObjectList::init_icons() { - m_bmp_solidmesh = ScalableBitmap(nullptr, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART) ].second); - m_bmp_modifiermesh = ScalableBitmap(nullptr, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::PARAMETER_MODIFIER)].second); - m_bmp_support_enforcer = ScalableBitmap(nullptr, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER) ].second); - m_bmp_support_blocker = ScalableBitmap(nullptr, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER) ].second); + m_bmp_solidmesh = ScalableBitmap(this, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART) ].second); + m_bmp_modifiermesh = ScalableBitmap(this, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::PARAMETER_MODIFIER)].second); + m_bmp_support_enforcer = ScalableBitmap(this, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER) ].second); + m_bmp_support_blocker = ScalableBitmap(this, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER) ].second); m_bmp_vector.reserve(4); // bitmaps for different types of parts m_bmp_vector.push_back(&m_bmp_solidmesh.bmp()); @@ -567,12 +615,12 @@ void ObjectList::init_icons() m_objects_model->SetVolumeBitmaps(m_bmp_vector); // init icon for manifold warning - m_bmp_manifold_warning = ScalableBitmap(nullptr, "exclamation"); + m_bmp_manifold_warning = ScalableBitmap(this, "exclamation"); // Set warning bitmap for the model m_objects_model->SetWarningBitmap(&m_bmp_manifold_warning.bmp()); // init bitmap for "Add Settings" context menu - m_bmp_cog = ScalableBitmap(nullptr, "cog"); + m_bmp_cog = ScalableBitmap(this, "cog"); } void ObjectList::msw_rescale_icons() @@ -599,23 +647,21 @@ void ObjectList::msw_rescale_icons() // Update CATEGORY_ICON according to new scale { - // 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(nullptr, "layers"); - CATEGORY_ICON[L("Infill")] = create_scaled_bitmap(nullptr, "infill"); - CATEGORY_ICON[L("Support material")] = create_scaled_bitmap(nullptr, "support"); - CATEGORY_ICON[L("Speed")] = create_scaled_bitmap(nullptr, "time"); - CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap(nullptr, "funnel"); - CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap(nullptr, "funnel"); - CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap(nullptr, "funnel"); -// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap(nullptr, "skirt+brim"); -// CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap(nullptr, "time"); - CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap(nullptr, "wrench"); + 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"); + CATEGORY_ICON[L("Extrusion Width")] = create_scaled_bitmap("funnel"); + CATEGORY_ICON[L("Wipe options")] = create_scaled_bitmap("funnel"); +// CATEGORY_ICON[L("Skirt and brim")] = create_scaled_bitmap("skirt+brim"); +// CATEGORY_ICON[L("Speed > Acceleration")] = create_scaled_bitmap("time"); + CATEGORY_ICON[L("Advanced")] = create_scaled_bitmap("wrench"); // ptSLA - CATEGORY_ICON[L("Supports")] = create_scaled_bitmap(nullptr, "support"/*"sla_supports"*/); - CATEGORY_ICON[L("Pad")] = create_scaled_bitmap(nullptr, "pad"); + CATEGORY_ICON[L("Supports")] = create_scaled_bitmap("support"/*"sla_supports"*/); + CATEGORY_ICON[L("Pad")] = create_scaled_bitmap("pad"); } } @@ -656,33 +702,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); @@ -693,7 +747,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); @@ -706,6 +760,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)) @@ -722,8 +817,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("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); } @@ -776,23 +871,31 @@ void ObjectList::OnChar(wxKeyEvent& event) */ #endif /* __WXOSX__ */ -void ObjectList::OnContextMenu(wxDataViewEvent&) +void ObjectList::OnContextMenu(wxDataViewEvent& evt) { + // The mouse position returned by get_mouse_position_in_control() here is the one at the time the mouse button is released (mouse up event) + wxPoint mouse_pos = this->get_mouse_position_in_control(); + // Do not show the context menu if the user pressed the right mouse button on the 3D scene and released it on the objects list GLCanvas3D* canvas = wxGetApp().plater()->canvas3D(); bool evt_context_menu = (canvas != nullptr) ? !canvas->is_mouse_dragging() : true; if (!evt_context_menu) canvas->mouse_up_cleanup(); - list_manipulation(evt_context_menu); + list_manipulation(mouse_pos, evt_context_menu); } -void ObjectList::list_manipulation(bool evt_context_menu/* = false*/) +void ObjectList::list_manipulation(const wxPoint& mouse_pos, bool evt_context_menu/* = false*/) { + // Interesting fact: when mouse_pos.x < 0, HitTest(mouse_pos, item, col) returns item = null, but column = last column. + // So, when mouse was moved to scene immediately after clicking in ObjectList, in the scene will be shown context menu for the Editing column. + // see: https://github.com/prusa3d/PrusaSlicer/issues/3802 + if (mouse_pos.x < 0) + return; + wxDataViewItem item; wxDataViewColumn* col = nullptr; - const wxPoint pt = get_mouse_position_in_control(); - HitTest(pt, item, col); + HitTest(mouse_pos, item, col); if (m_extruder_editor) m_extruder_editor->Hide(); @@ -805,7 +908,7 @@ void ObjectList::list_manipulation(bool evt_context_menu/* = false*/) if (!item) { if (col == nullptr) { - if (wxOSX) + if (wxOSX && !multiple_selection()) UnselectAll(); else if (!evt_context_menu) // Case, when last item was deleted and under GTK was called wxEVT_DATAVIEW_SELECTION_CHANGED, @@ -820,34 +923,41 @@ void ObjectList::list_manipulation(bool evt_context_menu/* = false*/) } if (wxOSX && item && col) { + wxDataViewItemArray sels; + GetSelections(sels); UnselectAll(); - Select(item); + if (sels.Count() > 1) + SetSelections(sels); + else + Select(item); } - const wxString title = col->GetTitle(); - - if (title == " ") - toggle_printable_state(item); - else if (title == _("Editing")) - show_context_menu(evt_context_menu); - else if (title == _("Name")) + if (col != nullptr) { - if (wxOSX) - show_context_menu(evt_context_menu); // return context menu under OSX (related to #2909) + const wxString title = col->GetTitle(); + if (title == " ") + toggle_printable_state(item); + else if (title == _("Editing")) + show_context_menu(evt_context_menu); + else if (title == _("Name")) + { + if (wxOSX) + show_context_menu(evt_context_menu); // return context menu under OSX (related to #2909) - if (is_windows10()) - { - int obj_idx, vol_idx; - get_selected_item_indexes(obj_idx, vol_idx, item); + if (is_windows10()) + { + int obj_idx, vol_idx; + get_selected_item_indexes(obj_idx, vol_idx, item); - if (get_mesh_errors_count(obj_idx, vol_idx) > 0 && - pt.x > 2*wxGetApp().em_unit() && pt.x < 4*wxGetApp().em_unit() ) - fix_through_netfabb(); - } - } - // workaround for extruder editing under OSX - else if (wxOSX && evt_context_menu && title == _("Extruder")) - extruder_editing(); + if (get_mesh_errors_count(obj_idx, vol_idx) > 0 && + mouse_pos.x > 2 * wxGetApp().em_unit() && mouse_pos.x < 4 * wxGetApp().em_unit()) + fix_through_netfabb(); + } + } + // workaround for extruder editing under OSX + else if (wxOSX && evt_context_menu && title == _("Extruder")) + extruder_editing(); + } #ifndef __WXMSW__ GetMainWindow()->SetToolTip(""); // hide tooltip @@ -895,40 +1005,17 @@ void ObjectList::extruder_editing() if (!item || !(m_objects_model->GetItemType(item) & (itVolume | itObject))) return; - std::vector icons = get_extruder_color_icons(); - if (icons.empty()) - return; - const int column_width = GetColumn(colExtruder)->GetWidth() + wxSystemSettings::GetMetric(wxSYS_VSCROLL_X) + 5; - wxPoint pos = get_mouse_position_in_control(); + wxPoint pos = this->get_mouse_position_in_control(); wxSize size = wxSize(column_width, -1); pos.x = GetColumn(colName)->GetWidth() + GetColumn(colPrint)->GetWidth() + 5; pos.y -= GetTextExtent("m").y; - if (!m_extruder_editor) - m_extruder_editor = new wxBitmapComboBox(this, wxID_ANY, wxEmptyString, pos, size, - 0, nullptr, wxCB_READONLY); - else - { - m_extruder_editor->SetPosition(pos); - m_extruder_editor->SetMinSize(size); - m_extruder_editor->SetSize(size); - m_extruder_editor->Clear(); - m_extruder_editor->Show(); - } + apply_extruder_selector(&m_extruder_editor, this, L("default"), pos, size); - int i = 0; - for (wxBitmap* bmp : icons) { - if (i == 0) { - m_extruder_editor->Append(_(L("default")), *bmp); - ++i; - } - - m_extruder_editor->Append(wxString::Format("%d", i), *bmp); - ++i; - } m_extruder_editor->SetSelection(m_objects_model->GetExtruderNumber(item)); + m_extruder_editor->Show(); auto set_extruder = [this]() { @@ -940,6 +1027,7 @@ void ObjectList::extruder_editing() m_objects_model->SetExtruder(m_extruder_editor->GetString(selection), item); m_extruder_editor->Hide(); + update_extruder_in_config(item); }; // to avoid event propagation to other sidebar items @@ -948,31 +1036,50 @@ void ObjectList::extruder_editing() set_extruder(); evt.StopPropagation(); }); - /* - m_extruder_editor->Bind(wxEVT_KILL_FOCUS, [set_extruder](wxFocusEvent& evt) - { - set_extruder(); - evt.Skip(); - });*/ - } 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); + 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() @@ -997,6 +1104,8 @@ void ObjectList::key_event(wxKeyEvent& event) ) { remove(); } + else if (event.GetKeyCode() == WXK_F5) + wxGetApp().plater()->reload_all_from_disk(); else if (wxGetKeyState(wxKeyCode('A')) && wxGetKeyState(WXK_CONTROL/*WXK_SHIFT*/)) select_item_all_children(); else if (wxGetKeyState(wxKeyCode('C')) && wxGetKeyState(WXK_CONTROL)) @@ -1019,14 +1128,13 @@ void ObjectList::OnBeginDrag(wxDataViewEvent &event) const bool mult_sel = multiple_selection(); if ((mult_sel && !selected_instances_of_same_object()) || - (!mult_sel && (GetSelection() != item)) || - m_objects_model->GetParent(item) == wxDataViewItem(nullptr) ) { + (!mult_sel && (GetSelection() != item)) ) { event.Veto(); return; } const ItemType& type = m_objects_model->GetItemType(item); - if (!(type & (itVolume | itInstance))) { + if (!(type & (itVolume | itObject | itInstance))) { event.Veto(); return; } @@ -1040,11 +1148,13 @@ void ObjectList::OnBeginDrag(wxDataViewEvent &event) for (auto sel : sels ) sub_obj_idxs.insert(m_objects_model->GetInstanceIdByItem(sel)); } - else + else if (type & itObject) + m_dragged_data.init(m_objects_model->GetIdByItem(item), type); + else m_dragged_data.init(m_objects_model->GetObjectIdByItem(item), - type&itVolume ? m_objects_model->GetVolumeIdByItem(item) : + type&itVolume ? m_objects_model->GetVolumeIdByItem(item) : m_objects_model->GetInstanceIdByItem(item), - type); + type); /* Under MSW or OSX, DnD moves an item to the place of another selected item * But under GTK, DnD moves an item between another two items. @@ -1065,10 +1175,20 @@ void ObjectList::OnBeginDrag(wxDataViewEvent &event) bool ObjectList::can_drop(const wxDataViewItem& item) const { - return (m_dragged_data.type() == itInstance && !item.IsOk()) || - (m_dragged_data.type() == itVolume && item.IsOk() && - m_objects_model->GetItemType(item) == itVolume && - m_dragged_data.obj_idx() == m_objects_model->GetObjectIdByItem(item)); + // move instance(s) or object on "empty place" of ObjectList + if ( (m_dragged_data.type() & (itInstance | itObject)) && !item.IsOk() ) + return true; + + // type of moved item should be the same as a "destination" item + if (!item.IsOk() || !(m_dragged_data.type() & (itVolume|itObject)) || + m_objects_model->GetItemType(item) != m_dragged_data.type() ) + return false; + + // move volumes inside one object only + if (m_dragged_data.type() & itVolume) + return m_dragged_data.obj_idx() == m_objects_model->GetObjectIdByItem(item); + + return true; } void ObjectList::OnDropPossible(wxDataViewEvent &event) @@ -1098,9 +1218,6 @@ void ObjectList::OnDrop(wxDataViewEvent &event) return; } - const int from_volume_id = m_dragged_data.sub_obj_idx(); - int to_volume_id = m_objects_model->GetVolumeIdByItem(item); - // It looks like a fixed in current version of the wxWidgets // #ifdef __WXGTK__ // /* Under GTK, DnD moves an item between another two items. @@ -1112,18 +1229,39 @@ void ObjectList::OnDrop(wxDataViewEvent &event) take_snapshot(_((m_dragged_data.type() == itVolume) ? L("Volumes in Object reordered") : L("Object reordered"))); - auto& volumes = (*m_objects)[m_dragged_data.obj_idx()]->volumes; - auto delta = to_volume_id < from_volume_id ? -1 : 1; - int cnt = 0; - for (int id = from_volume_id; cnt < abs(from_volume_id - to_volume_id); id += delta, cnt++) - std::swap(volumes[id], volumes[id + delta]); + if (m_dragged_data.type() & itVolume) + { + int from_volume_id = m_dragged_data.sub_obj_idx(); + int to_volume_id = m_objects_model->GetVolumeIdByItem(item); + int delta = to_volume_id < from_volume_id ? -1 : 1; - select_item(m_objects_model->ReorganizeChildren(from_volume_id, to_volume_id, - m_objects_model->GetParent(item))); + auto& volumes = (*m_objects)[m_dragged_data.obj_idx()]->volumes; + + int cnt = 0; + for (int id = from_volume_id; cnt < abs(from_volume_id - to_volume_id); id += delta, cnt++) + std::swap(volumes[id], volumes[id + delta]); + + select_item(m_objects_model->ReorganizeChildren(from_volume_id, to_volume_id, m_objects_model->GetParent(item))); + + } + else if (m_dragged_data.type() & itObject) + { + int from_obj_id = m_dragged_data.obj_idx(); + int to_obj_id = item.IsOk() ? m_objects_model->GetIdByItem(item) : ((int)m_objects->size()-1); + int delta = to_obj_id < from_obj_id ? -1 : 1; + + int cnt = 0; + for (int id = from_obj_id; cnt < abs(from_obj_id - to_obj_id); id += delta, cnt++) + std::swap((*m_objects)[id], (*m_objects)[id + delta]); + + select_item(m_objects_model->ReorganizeObjects(from_obj_id, to_obj_id)); + } changed_object(m_dragged_data.obj_idx()); m_dragged_data.clear(); + + wxGetApp().plater()->set_current_canvas_as_dirty(); } @@ -1165,7 +1303,7 @@ const std::vector& ObjectList::get_options_for_bundle(const wxStrin for (auto& it : bundle_quick) { - if ( bundle_name == wxString::Format(_(L("Quick Add Settings (%s)")), _(it.first)) ) + if ( bundle_name == from_u8((boost::format(_utf8(L("Quick Add Settings (%s)"))) % _(it.first)).str()) ) return it.second; } #endif @@ -1181,6 +1319,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); @@ -1209,7 +1354,13 @@ void ObjectList::get_settings_choice(const wxString& category_name) { wxArrayString names; wxArrayInt selections; - wxDataViewItem item = GetSelection(); + + /* If we try to add settings for object/part from 3Dscene, + * for the second try there is selected ItemSettings in ObjectList. + * So, check if selected item isn't SettingsItem. And get a SettingsItem's parent item, if yes + */ + const wxDataViewItem selected_item = GetSelection(); + wxDataViewItem item = m_objects_model->GetItemType(selected_item) & itSettings ? m_objects_model->GetParent(selected_item) : selected_item; const ItemType item_type = m_objects_model->GetItemType(item); @@ -1328,15 +1479,24 @@ 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) { std::vector options = get_options_for_bundle(bundle_name); - wxDataViewItem item = GetSelection(); + const Selection& selection = scene_selection(); + const wxDataViewItem sel_item = // when all instances in object are selected + GetSelectedItemsCount() > 1 && selection.is_single_full_object() ? + m_objects_model->GetItemById(selection.get_object_idx()) : + GetSelection(); - ItemType item_type = m_objects_model->GetItemType(item); + /* If we try to add settings for object/part from 3Dscene, + * for the second try there is selected ItemSettings in ObjectList. + * So, check if selected item isn't SettingsItem. And get a SettingsItem's parent item, if yes + */ + wxDataViewItem item = m_objects_model->GetItemType(sel_item) & itSettings ? m_objects_model->GetParent(sel_item) : sel_item; + const ItemType item_type = m_objects_model->GetItemType(item); /* Because of we couldn't edited layer_height for ItVolume from settings list, * correct options according to the selected item type : @@ -1376,7 +1536,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) @@ -1422,17 +1582,23 @@ void ObjectList::append_menu_items_add_volume(wxMenu* menu) const ConfigOptionMode mode = wxGetApp().get_mode(); + wxWindow* parent = wxGetApp().plater(); + if (mode == comAdvanced) { append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].first), "", - [this](wxCommandEvent&) { load_subobject(ModelVolumeType::MODEL_PART); }, ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].second); + [this](wxCommandEvent&) { load_subobject(ModelVolumeType::MODEL_PART); }, + ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::MODEL_PART)].second, nullptr, + [this]() { return is_instance_or_object_selected(); }, parent); } if (mode == comSimple) { append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER)].first), "", [this](wxCommandEvent&) { load_generic_subobject(L("Box"), ModelVolumeType::SUPPORT_ENFORCER); }, - ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER)].second); + ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_ENFORCER)].second, nullptr, + [this]() { return is_instance_or_object_selected(); }, parent); append_menu_item(menu, wxID_ANY, _(ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER)].first), "", [this](wxCommandEvent&) { load_generic_subobject(L("Box"), ModelVolumeType::SUPPORT_BLOCKER); }, - ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER)].second); + ADD_VOLUME_MENU_ITEMS[int(ModelVolumeType::SUPPORT_BLOCKER)].second, nullptr, + [this]() { return is_instance_or_object_selected(); }, parent); return; } @@ -1442,7 +1608,8 @@ void ObjectList::append_menu_items_add_volume(wxMenu* menu) auto& item = ADD_VOLUME_MENU_ITEMS[type]; wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType(type)); - append_submenu(menu, sub_menu, wxID_ANY, _(item.first), "", item.second); + append_submenu(menu, sub_menu, wxID_ANY, _(item.first), "", item.second, + [this]() { return is_instance_or_object_selected(); }, parent); } } @@ -1453,10 +1620,17 @@ wxMenuItem* ObjectList::append_menu_item_split(wxMenu* menu) [this]() { return is_splittable(); }, wxGetApp().plater()); } -wxMenuItem* ObjectList::append_menu_item_layers_editing(wxMenu* menu) +bool ObjectList::is_instance_or_object_selected() +{ + const Selection& selection = scene_selection(); + return selection.is_single_full_instance() || selection.is_single_full_object(); +} + +wxMenuItem* ObjectList::append_menu_item_layers_editing(wxMenu* menu, wxWindow* parent) { return append_menu_item(menu, wxID_ANY, _(L("Height range Modifier")), "", - [this](wxCommandEvent&) { layers_editing(); }, "edit_layers_all", menu); + [this](wxCommandEvent&) { layers_editing(); }, "edit_layers_all", menu, + [this]() { return is_instance_or_object_selected(); }, parent); } wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_) @@ -1484,19 +1658,26 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_) #if 0 for (auto& it : m_freq_settings_fff) { - settings_id = menu->FindItem(wxString::Format(_(L("Quick Add Settings (%s)")), _(it.first))); + settings_id = menu->FindItem(from_u8((boost::format(_utf8(L("Quick Add Settings (%s)"))) % _(it.first)).str())); if (settings_id != wxNOT_FOUND) menu->Destroy(settings_id); } for (auto& it : m_freq_settings_sla) { - settings_id = menu->FindItem(wxString::Format(_(L("Quick Add Settings (%s)")), _(it.first))); + settings_id = menu->FindItem(from_u8((boost::format(_utf8(L("Quick Add Settings (%s)"))) % _(it.first)).str())); if (settings_id != wxNOT_FOUND) menu->Destroy(settings_id); } #endif menu->DestroySeparators(); // delete old separators + // 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()) || + selection.is_multiple_volume() || selection.is_mixed() ) // more than one volume(part) is selected on the scene + return nullptr; + const auto sel_vol = get_selected_model_volume(); if (sel_vol && sel_vol->type() >= ModelVolumeType::SUPPORT_ENFORCER) return nullptr; @@ -1512,7 +1693,10 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_) menu->SetFirstSeparator(); // Add frequently settings - const bool is_object_settings = m_objects_model->GetItemType(GetSelection()) == itObject; + 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 = is_object_item(item_type); create_freq_settings_popupmenu(menu, is_object_settings); if (mode == comAdvanced) @@ -1529,24 +1713,51 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_) return menu->Append(menu_item); } -wxMenuItem* ObjectList::append_menu_item_change_type(wxMenu* menu) +wxMenuItem* ObjectList::append_menu_item_change_type(wxMenu* menu, wxWindow* parent/* = nullptr*/) { return append_menu_item(menu, wxID_ANY, _(L("Change type")), "", - [this](wxCommandEvent&) { change_part_type(); }, "", menu); - + [this](wxCommandEvent&) { change_part_type(); }, "", menu, + [this]() { + wxDataViewItem item = GetSelection(); + return item.IsOk() || m_objects_model->GetItemType(item) == itVolume; + }, parent); } wxMenuItem* ObjectList::append_menu_item_instance_to_object(wxMenu* menu, wxWindow* parent) { - return append_menu_item(menu, wxID_ANY, _(L("Set as a Separated Object")), "", - [this](wxCommandEvent&) { split_instances(); }, "", menu, [](){return wxGetApp().plater()->can_set_instance_to_object(); }, parent); + wxMenuItem* menu_item = append_menu_item(menu, wxID_ANY, _(L("Set as a Separated Object")), "", + [this](wxCommandEvent&) { split_instances(); }, "", menu); + + /* New behavior logic: + * 1. Split Object to several separated object, if ALL instances are selected + * 2. Separate selected instances from the initial object to the separated object, + * if some (not all) instances are selected + */ + parent->Bind(wxEVT_UPDATE_UI, [](wxUpdateUIEvent& evt) + { + const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + evt.SetText(selection.is_single_full_object() ? + _(L("Set as a Separated Objects")) : _(L("Set as a Separated Object"))); + + evt.Enable(wxGetApp().plater()->can_set_instance_to_object()); + }, menu_item->GetId()); + + return menu_item; } wxMenuItem* ObjectList::append_menu_item_printable(wxMenu* menu, wxWindow* /*parent*/) { - return append_menu_check_item(menu, wxID_ANY, _(L("Printable")), "", [](wxCommandEvent&) { - wxGetApp().plater()->canvas3D()->get_selection().toggle_instance_printable_state(); - }, menu); + return append_menu_check_item(menu, wxID_ANY, _(L("Printable")), "", [this](wxCommandEvent&) { + const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + wxDataViewItem item; + if (GetSelectedItemsCount() > 1 && selection.is_single_full_object()) + item = m_objects_model->GetItemById(selection.get_object_idx()); + else + item = GetSelection(); + + if (item) + toggle_printable_state(item); + }, menu); } void ObjectList::append_menu_items_osx(wxMenu* menu) @@ -1580,38 +1791,54 @@ void ObjectList::append_menu_item_export_stl(wxMenu* menu) const void ObjectList::append_menu_item_reload_from_disk(wxMenu* menu) const { append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected volumes from disk")), - [this](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu, []() { return wxGetApp().plater()->can_reload_from_disk(); }, wxGetApp().plater()); + [this](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu, + []() { return wxGetApp().plater()->can_reload_from_disk(); }, wxGetApp().plater()); } -void ObjectList::append_menu_item_change_extruder(wxMenu* menu) const +void ObjectList::append_menu_item_change_extruder(wxMenu* menu) { - const wxString name = _(L("Change extruder")); + const std::vector names = {_(L("Change extruder")), _(L("Set extruder for selected items")) }; // Delete old menu item - const int item_id = menu->FindItem(name); - if (item_id != wxNOT_FOUND) - menu->Destroy(item_id); + for (const wxString& name : names) { + const int item_id = menu->FindItem(name); + if (item_id != wxNOT_FOUND) + menu->Destroy(item_id); + } const int extruders_cnt = extruders_count(); - const wxDataViewItem item = GetSelection(); - if (item && extruders_cnt > 1) - { - DynamicPrintConfig& config = get_item_config(item); + if (extruders_cnt <= 1) + return; - const int initial_extruder = !config.has("extruder") ? 0 : - config.option("extruder")->value; + wxDataViewItemArray sels; + GetSelections(sels); + if (sels.IsEmpty()) + return; - wxMenu* extruder_selection_menu = new wxMenu(); + std::vector icons = get_extruder_color_icons(true); + wxMenu* extruder_selection_menu = new wxMenu(); + const wxString& name = sels.Count()==1 ? names[0] : names[1]; - for (int i = 0; i <= extruders_cnt; i++) - { - const wxString& item_name = i == 0 ? _(L("Default")) : wxString::Format("%d", i); - - append_menu_radio_item(extruder_selection_menu, wxID_ANY, item_name, "", - [this, i](wxCommandEvent&) { set_extruder_for_selected_items(i); }, menu)->Check(i == initial_extruder); - } - - menu->AppendSubMenu(extruder_selection_menu, name, _(L("Select new extruder for the object/part"))); + int initial_extruder = -1; // negative value for multiple object/part selection + if (sels.Count()==1) { + const ModelConfig &config = get_item_config(sels[0]); + initial_extruder = config.has("extruder") ? config.extruder() : 0; } + + for (int i = 0; i <= extruders_cnt; i++) + { + bool is_active_extruder = i == initial_extruder; + int icon_idx = i == 0 ? 0 : i - 1; + + const wxString& item_name = (i == 0 ? _(L("Default")) : wxString::Format(_(L("Extruder %d")), i)) + + (is_active_extruder ? " (" + _(L("active")) + ")" : ""); + + append_menu_item(extruder_selection_menu, wxID_ANY, item_name, "", + [this, i](wxCommandEvent&) { set_extruder_for_selected_items(i); }, *icons[icon_idx], menu, + [is_active_extruder]() { return !is_active_extruder; }, GUI::wxGetApp().plater()); + + } + + menu->AppendSubMenu(extruder_selection_menu, name); } void ObjectList::append_menu_item_delete(wxMenu* menu) @@ -1626,6 +1853,31 @@ 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_items_convert_unit(wxMenu* menu) +{ + append_menu_item(menu, wxID_ANY, _L("Convert from imperial units"), _L("Convert from imperial units"), + [](wxCommandEvent&) { wxGetApp().plater()->convert_unit(true); }, "", menu); + + append_menu_item(menu, wxID_ANY, _L("Revert conversion from imperial units"), _L("Revert conversion from imperial units"), + [](wxCommandEvent&) { wxGetApp().plater()->convert_unit(false); }, "", menu); +} + +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__ @@ -1633,16 +1885,21 @@ void ObjectList::create_object_popupmenu(wxMenu *menu) #endif // __WXOSX__ append_menu_item_reload_from_disk(menu); + append_menu_items_convert_unit(menu); append_menu_item_export_stl(menu); append_menu_item_fix_through_netfabb(menu); append_menu_item_scale_selection_to_fit_print_volume(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 - append_menu_item_layers_editing(menu); + append_menu_item_layers_editing(menu, wxGetApp().plater()); menu->AppendSeparator(); // rest of a object_menu will be added later in: @@ -1657,6 +1914,7 @@ void ObjectList::create_sla_object_popupmenu(wxMenu *menu) #endif // __WXOSX__ append_menu_item_reload_from_disk(menu); + append_menu_items_convert_unit(menu); append_menu_item_export_stl(menu); append_menu_item_fix_through_netfabb(menu); // rest of a object_sla_menu will be added later in: @@ -1670,6 +1928,7 @@ void ObjectList::create_part_popupmenu(wxMenu *menu) #endif // __WXOSX__ append_menu_item_reload_from_disk(menu); + append_menu_items_convert_unit(menu); append_menu_item_export_stl(menu); append_menu_item_fix_through_netfabb(menu); @@ -1686,23 +1945,13 @@ void ObjectList::create_part_popupmenu(wxMenu *menu) void ObjectList::create_instance_popupmenu(wxMenu*menu) { m_menu_item_split_instances = append_menu_item_instance_to_object(menu, wxGetApp().plater()); - - /* New behavior logic: - * 1. Split Object to several separated object, if ALL instances are selected - * 2. Separate selected instances from the initial object to the separated object, - * if some (not all) instances are selected - */ - wxGetApp().plater()->Bind(wxEVT_UPDATE_UI, [](wxUpdateUIEvent& evt) { -// evt.Enable(can_split_instances()); }, m_menu_item_split_instances->GetId()); - evt.SetText(wxGetApp().plater()->canvas3D()->get_selection().is_single_full_object() ? - _(L("Set as a Separated Objects")) : _(L("Set as a Separated Object"))); - }, m_menu_item_split_instances->GetId()); } void ObjectList::create_default_popupmenu(wxMenu*menu) { wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType::INVALID); - append_submenu(menu, sub_menu, wxID_ANY, _(L("Add Shape")), "", "add_part"); + append_submenu(menu, sub_menu, wxID_ANY, _(L("Add Shape")), "", "add_part", + [](){return true;}, this); } wxMenu* ObjectList::create_settings_popupmenu(wxMenu *parent_menu) @@ -1710,13 +1959,21 @@ wxMenu* ObjectList::create_settings_popupmenu(wxMenu *parent_menu) wxMenu *menu = new wxMenu; settings_menu_hierarchy settings_menu; - const bool is_part = m_objects_model->GetParent(GetSelection()) != wxDataViewItem(nullptr); - get_options_menu(settings_menu, is_part); + + /* If we try to add settings for object/part from 3Dscene, + * for the second try there is selected ItemSettings in ObjectList. + * So, check if selected item isn't SettingsItem. And get a SettingsItem's parent item, if yes + */ + const wxDataViewItem selected_item = GetSelection(); + wxDataViewItem item = m_objects_model->GetItemType(selected_item) & itSettings ? m_objects_model->GetParent(selected_item) : selected_item; + + 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), "", [menu, this](wxCommandEvent& event) { get_settings_choice(menu->GetLabel(event.GetId())); }, - CATEGORY_ICON.find(cat.first) == CATEGORY_ICON.end() ? wxNullBitmap : CATEGORY_ICON.at(cat.first), parent_menu); + CATEGORY_ICON.find(cat.first) == CATEGORY_ICON.end() ? wxNullBitmap : CATEGORY_ICON.at(cat.first), parent_menu, + [this]() { return true; }, wxGetApp().plater()); } return menu; @@ -1736,7 +1993,8 @@ void ObjectList::create_freq_settings_popupmenu(wxMenu *menu, const bool is_obje append_menu_item(menu, wxID_ANY, _(it.first), "", [menu, this](wxCommandEvent& event) { get_freq_settings_choice(menu->GetLabel(event.GetId())); }, - CATEGORY_ICON.find(it.first) == CATEGORY_ICON.end() ? wxNullBitmap : CATEGORY_ICON.at(it.first), menu); + CATEGORY_ICON.find(it.first) == CATEGORY_ICON.end() ? wxNullBitmap : CATEGORY_ICON.at(it.first), menu, + [this]() { return true; }, wxGetApp().plater()); } #if 0 // Add "Quick" settings bundles @@ -1747,9 +2005,10 @@ void ObjectList::create_freq_settings_popupmenu(wxMenu *menu, const bool is_obje if (improper_category(it.first, extruders_cnt)) continue; - append_menu_item(menu, wxID_ANY, wxString::Format(_(L("Quick Add Settings (%s)")), _(it.first)), "", + append_menu_item(menu, wxID_ANY, from_u8((boost::format(_utf8(L("Quick Add Settings (%s)"))) % _(it.first)).str()), "", [menu, this](wxCommandEvent& event) { get_freq_settings_choice(menu->GetLabel(event.GetId())); }, - CATEGORY_ICON.find(it.first) == CATEGORY_ICON.end() ? wxNullBitmap : CATEGORY_ICON.at(it.first), menu); + CATEGORY_ICON.find(it.first) == CATEGORY_ICON.end() ? wxNullBitmap : CATEGORY_ICON.at(it.first), menu, + [this]() { return true; }, wxGetApp().plater()); } #endif } @@ -1879,7 +2138,7 @@ void ObjectList::load_generic_subobject(const std::string& type_name, const Mode if (obj_idx < 0) return; - const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + const Selection& selection = scene_selection(); assert(obj_idx == selection.get_object_idx()); /** Any changes of the Object's composition is duplicated for all Object's Instances @@ -1953,37 +2212,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 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()); + + if (center) { + const BoundingBoxf bed_shape = wxGetApp().plater()->bed_shape_bb(); + new_object->instances[0]->set_offset(Slic3r::to_3d(bed_shape.center().cast(), -new_object->origin_translation(2))); + } else { + new_object->instances[0]->set_offset(bb.center()); + } - new_object->center_around_origin(); new_object->ensure_on_bed(); - const BoundingBoxf bed_shape = wxGetApp().plater()->bed_shape_bb(); - new_object->instances[0]->set_offset(Slic3r::to_3d(bed_shape.center().cast(), -new_object->origin_translation(2))); - 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 @@ -2051,9 +2318,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("extruder")->value; + int extruder = m_config->has("extruder") ? m_config->extruder() : -1; coordf_t layer_height = 0.0; if (is_layer_settings) @@ -2105,8 +2370,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]; @@ -2189,24 +2455,228 @@ 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("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(); + if (parent == item) Expand(parent); 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& 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> sel_map; + std::set 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 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 auto item = GetSelection(); - const int obj_idx = get_selected_obj_idx(); - if (!item || obj_idx < 0) + const Selection& selection = scene_selection(); + const int obj_idx = selection.get_object_idx(); + wxDataViewItem item = obj_idx >= 0 && GetSelectedItemsCount() > 1 && selection.is_single_full_object() ? + m_objects_model->GetItemById(obj_idx) : + GetSelection(); + + if (!item) return; const wxDataViewItem obj_item = m_objects_model->GetTopParent(item); @@ -2220,7 +2690,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 @@ -2319,10 +2789,38 @@ bool ObjectList::selected_instances_of_same_object() bool ObjectList::can_split_instances() { - const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + const Selection& selection = scene_selection(); 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 { @@ -2347,7 +2845,7 @@ void ObjectList::part_selection_changed() { og_name = _(L("Group manipulation")); - const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + const Selection& selection = scene_selection(); // don't show manipulation panel for case of all Object's parts selection update_and_show_manipulations = !selection.is_single_full_instance(); } @@ -2508,8 +3006,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("extruder")->value, + model_object->config.has("extruder") ? model_object->config.extruder() : 0, get_mesh_errors_count(obj_idx) > 0); // add volumes to the object @@ -2519,10 +3016,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("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); } @@ -2542,7 +3038,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); @@ -2620,7 +3116,7 @@ void ObjectList::delete_from_model_and_list(const std::vector& 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("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); @@ -2644,6 +3140,7 @@ 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)); + selection_changed(); } void ObjectList::decrease_object_instances(const size_t obj_idx, const size_t num) @@ -2758,13 +3255,13 @@ void ObjectList::del_layer_range(const t_layer_height_range& range) static double get_min_layer_height(const int extruder_idx) { const DynamicPrintConfig& config = wxGetApp().preset_bundle->printers.get_edited_preset().config; - return config.opt_float("min_layer_height", extruder_idx <= 0 ? 0 : extruder_idx-1); + return config.opt_float("min_layer_height", std::max(0, extruder_idx - 1)); } static double get_max_layer_height(const int extruder_idx) { const DynamicPrintConfig& config = wxGetApp().preset_bundle->printers.get_edited_preset().config; - int extruder_idx_zero_based = extruder_idx <= 0 ? 0 : extruder_idx-1; + int extruder_idx_zero_based = std::max(0, extruder_idx - 1); double max_layer_height = config.opt_float("max_layer_height", extruder_idx_zero_based); // In case max_layer_height is set to zero, it should default to 75 % of nozzle diameter: @@ -2774,80 +3271,139 @@ static double get_max_layer_height(const int extruder_idx) return max_layer_height; } -void ObjectList::add_layer_range_after_current(const t_layer_height_range& current_range) +// When editing this function, please synchronize the conditions with can_add_new_range_after_current(). +void ObjectList::add_layer_range_after_current(const t_layer_height_range current_range) { const int obj_idx = get_selected_obj_idx(); - if (obj_idx < 0) return; + assert(obj_idx >= 0); + if (obj_idx < 0) + // This should not happen. + return; 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()) + // This shoudl not happen. + return; - const t_layer_height_range& last_range = (--ranges.end())->first; - - if (current_range == last_range) + auto it_next_range = it_range; + bool changed = false; + if (++ it_next_range == ranges.end()) { + // Adding a new layer height range after the last one. take_snapshot(_(L("Add Height Range"))); + changed = true; - const t_layer_height_range& new_range = { last_range.second, last_range.second + 2. }; - ranges[new_range] = get_default_layer_config(obj_idx); + const t_layer_height_range new_range = { current_range.second, current_range.second + 2. }; + ranges[new_range].assign_config(get_default_layer_config(obj_idx)); add_layer_item(new_range, layers_item); } - else + else if (const std::pair &next_range = it_next_range->first; current_range.second <= next_range.first) { - const t_layer_height_range& next_range = (++ranges.find(current_range))->first; - - if (current_range.second > next_range.first) - return; // range division has no sense - const int layer_idx = m_objects_model->GetItemIdByLayerRange(obj_idx, next_range); - if (layer_idx < 0) - return; - - if (current_range.second == next_range.first) + assert(layer_idx >= 0); + if (layer_idx >= 0) { - const auto old_config = ranges.at(next_range); + if (current_range.second == next_range.first) + { + // Splitting the next layer height range to two. + const auto old_config = ranges.at(next_range); + const coordf_t delta = next_range.second - next_range.first; + // Layer height of the current layer. + const coordf_t old_min_layer_height = get_min_layer_height(old_config.opt_int("extruder")); + // Layer height of the layer to be inserted. + const coordf_t new_min_layer_height = get_min_layer_height(0); + if (delta >= old_min_layer_height + new_min_layer_height - EPSILON) { + const coordf_t middle_layer_z = (new_min_layer_height > 0.5 * delta) ? + next_range.second - new_min_layer_height : + next_range.first + std::max(old_min_layer_height, 0.5 * delta); + t_layer_height_range new_range = { middle_layer_z, next_range.second }; - const coordf_t delta = (next_range.second - next_range.first); - if (delta < get_min_layer_height(old_config.opt_int("extruder"))/*0.05f*/) // next range division has no sense - return; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add Height Range"))); + changed = true; - const coordf_t midl_layer = next_range.first + 0.5 * delta; - - t_layer_height_range new_range = { midl_layer, next_range.second }; + // create new 2 layers instead of deleted one + // delete old layer - Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add Height Range"))); + wxDataViewItem layer_item = m_objects_model->GetItemByLayerRange(obj_idx, next_range); + del_subobject_item(layer_item); - // create new 2 layers instead of deleted one + ranges[new_range] = old_config; + add_layer_item(new_range, layers_item, layer_idx); - // delete old layer + new_range = { current_range.second, middle_layer_z }; + ranges[new_range].assign_config(get_default_layer_config(obj_idx)); + add_layer_item(new_range, layers_item, layer_idx); + } + } + else if (next_range.first - current_range.second >= get_min_layer_height(0) - EPSILON) + { + // Filling in a gap between the current and a new layer height range with a new one. + take_snapshot(_(L("Add Height Range"))); + changed = true; - wxDataViewItem layer_item = m_objects_model->GetItemByLayerRange(obj_idx, next_range); - del_subobject_item(layer_item); - - ranges[new_range] = old_config; - add_layer_item(new_range, layers_item, layer_idx); - - new_range = { current_range.second, midl_layer }; - ranges[new_range] = get_default_layer_config(obj_idx); - add_layer_item(new_range, layers_item, layer_idx); + const t_layer_height_range new_range = { current_range.second, next_range.first }; + ranges[new_range].assign_config(get_default_layer_config(obj_idx)); + add_layer_item(new_range, layers_item, layer_idx); + } } - else - { - take_snapshot(_(L("Add Height Range"))); - - const t_layer_height_range new_range = { current_range.second, next_range.first }; - ranges[new_range] = get_default_layer_config(obj_idx); - add_layer_item(new_range, layers_item, layer_idx); - } } - changed_object(obj_idx); + if (changed) + changed_object(obj_idx); + // The layer range panel is updated even if this function does not change the layer ranges, as the panel update + // may have been postponed from the "kill focus" event of a text field, if the focus was lost for the "add layer" button. // select item to update layers sizer select_item(layers_item); } +// Returning an empty string means that the layer could be added after the current layer. +// Otherwise an error tooltip is returned. +// When editing this function, please synchronize the conditions with add_layer_range_after_current(). +wxString ObjectList::can_add_new_range_after_current(const t_layer_height_range current_range) +{ + const int obj_idx = get_selected_obj_idx(); + assert(obj_idx >= 0); + if (obj_idx < 0) + // This should not happen. + return "ObjectList assert"; + + 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()) + // This shoudl not happen. + return "ObjectList assert"; + + auto it_next_range = it_range; + if (++ it_next_range == ranges.end()) + // Adding a layer after the last layer is always possible. + return ""; + + if (const std::pair& next_range = it_next_range->first; current_range.second <= next_range.first) + { + if (current_range.second == next_range.first) { + if (next_range.second - next_range.first < get_min_layer_height(it_next_range->second.opt_int("extruder")) + get_min_layer_height(0) - EPSILON) + return _(L("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.")); + } else if (next_range.first - current_range.second < get_min_layer_height(0) - EPSILON) { + return _(L("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.")); + } + } else + return _(L("Cannot insert a new layer range after the current layer range.\n" + "Current layer range overlaps with the next layer range.")); + + // All right, new layer height range could be inserted. + return ""; +} + void ObjectList::add_layer_item(const t_layer_height_range& range, const wxDataViewItem layers_item, const int layer_idx /* = -1*/) @@ -2855,7 +3411,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; @@ -2868,11 +3424,14 @@ void ObjectList::add_layer_item(const t_layer_height_range& range, bool ObjectList::edit_layer_range(const t_layer_height_range& range, coordf_t layer_height) { - const int obj_idx = get_selected_obj_idx(); + // Use m_selected_object_id instead of get_selected_obj_idx() + // because of get_selected_obj_idx() return obj_idx for currently selected item. + // But edit_layer_range(...) function can be called, when Selection in ObjectList could be changed + const int obj_idx = m_selected_object_id ; 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; @@ -2882,42 +3441,54 @@ bool ObjectList::edit_layer_range(const t_layer_height_range& range, coordf_t la layer_height <= get_max_layer_height(extruder_idx)) { config->set_key_value("layer_height", new ConfigOptionFloat(layer_height)); + changed_object(obj_idx); return true; } return false; } -bool ObjectList::edit_layer_range(const t_layer_height_range& range, const t_layer_height_range& new_range) +bool ObjectList::edit_layer_range(const t_layer_height_range& range, const t_layer_height_range& new_range, bool dont_update_ui) { - const int obj_idx = get_selected_obj_idx(); + // Use m_selected_object_id instead of get_selected_obj_idx() + // because of get_selected_obj_idx() return obj_idx for currently selected item. + // But edit_layer_range(...) function can be called, when Selection in ObjectList could be changed + const int obj_idx = m_selected_object_id; if (obj_idx < 0) return false; take_snapshot(_(L("Edit Height Range"))); 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]; - - ranges.erase(range); - ranges[new_range] = config; + { + ModelConfig config = std::move(ranges[range]); + ranges.erase(range); + ranges[new_range] = std::move(config); + } + changed_object(obj_idx); + wxDataViewItem root_item = m_objects_model->GetLayerRootItem(m_objects_model->GetItemById(obj_idx)); // To avoid update selection after deleting of a selected item (under GTK) // set m_prevent_list_events to true m_prevent_list_events = true; m_objects_model->DeleteChildren(root_item); - if (root_item.IsOk()) + if (root_item.IsOk()) { // create Layer item(s) according to the layer_config_ranges for (const auto& r : ranges) add_layer_item(r.first, root_item); + } + + // if this function was invoked from wxEVT_CHANGE_SELECTION selected item could be other than itLayer or itLayerRoot + if (!dont_update_ui && (sel_type & (itLayer | itLayerRoot))) + select_item(sel_type&itLayer ? m_objects_model->GetItemByLayerRange(obj_idx, new_range) : root_item); - select_item(sel_type&itLayer ? m_objects_model->GetItemByLayerRange(obj_idx, new_range) : root_item); Expand(root_item); + m_prevent_list_events = false; return true; } @@ -2955,7 +3526,7 @@ int ObjectList::get_selected_layers_range_idx() const void ObjectList::update_selections() { - const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + const Selection& selection = scene_selection(); wxDataViewItemArray sels; if ( ( m_selection_mode & (smSettings|smLayer|smLayerRoot) ) == 0) @@ -2985,7 +3556,8 @@ void ObjectList::update_selections() else if (selection.is_single_full_object() || selection.is_multiple_full_object()) { const Selection::ObjectIdxsToInstanceIdxsMap& objects_content = selection.get_content(); - if (m_selection_mode & (smSettings | smLayer | smLayerRoot)) + // it's impossible to select Settings, Layer or LayerRoot for several objects + if (!selection.is_multiple_full_object() && (m_selection_mode & (smSettings | smLayer | smLayerRoot))) { auto obj_idx = objects_content.begin()->first; wxDataViewItem obj_item = m_objects_model->GetItemById(obj_idx); @@ -3076,7 +3648,9 @@ void ObjectList::update_selections() for (auto obj_ins : objects_content_list) { if (obj_ins.first == glv_obj_idx) { - if (obj_ins.second.find(glv_ins_idx) != obj_ins.second.end()) { + if (obj_ins.second.find(glv_ins_idx) != obj_ins.second.end() && + !selection.is_from_single_instance() ) // a case when volumes of different types are selected + { if (glv_ins_idx == 0 && (*m_objects)[glv_obj_idx]->instances.size() == 1) sels.Add(m_objects_model->GetItemById(glv_obj_idx)); else @@ -3105,7 +3679,7 @@ void ObjectList::update_selections() select_items(sels); // Scroll selected Item in the middle of an object list - this->EnsureVisible(this->GetCurrentItem()); + ensure_current_item_visible(); } void ObjectList::update_selections_on_canvas() @@ -3302,7 +3876,7 @@ bool ObjectList::check_last_selection(wxString& msg_str) (type & itInstance && !(m_selection_mode & smInstance)) ) { - // Inform user why selection isn't complited + // Inform user why selection isn't completed const wxString item_type = m_selection_mode & smInstance ? _(L("Object or Instance")) : m_selection_mode & smVolume ? _(L("Part")) : _(L("Layer")); @@ -3461,7 +4035,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()); } } @@ -3486,14 +4060,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(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); @@ -3662,7 +4236,7 @@ void ObjectList::instances_to_separated_objects(const int obj_idx) void ObjectList::split_instances() { - const Selection& selection = wxGetApp().plater()->canvas3D()->get_selection(); + const Selection& selection = scene_selection(); const int obj_idx = selection.get_object_idx(); if (obj_idx == -1) return; @@ -3786,6 +4360,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) @@ -3821,6 +4415,10 @@ void ObjectList::OnEditingDone(wxDataViewEvent &event) // Here the last active column is forgotten, so when leaving the editing mode, the next mouse click will not enter the editing mode of the newly selected column. m_last_selected_column = -1; #endif //__WXMSW__ + + Plater* plater = wxGetApp().plater(); + if (plater) + plater->set_current_canvas_as_dirty(); } void ObjectList::show_multi_selection_menu() @@ -3829,18 +4427,25 @@ void ObjectList::show_multi_selection_menu() GetSelections(sels); for (const wxDataViewItem& item : sels) - if (!(m_objects_model->GetItemType(item) & (itVolume | itObject))) - // show this menu only for Object(s)/Volume(s) selection + if (!(m_objects_model->GetItemType(item) & (itVolume | itObject | itInstance))) + // show this menu only for Objects(Instances mixed with Objects)/Volumes selection return; wxMenu* menu = new wxMenu(); if (extruders_count() > 1) - append_menu_item(menu, wxID_ANY, _(L("Set extruder for selected items")), - _(L("Select extruder number for selected objects and/or parts")), - [this](wxCommandEvent&) { extruder_selection(); }, "", menu); + append_menu_item_change_extruder(menu); - PopupMenu(menu); + append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected volumes from disk")), + [this](wxCommandEvent&) { wxGetApp().plater()->reload_from_disk(); }, "", menu, []() { + return wxGetApp().plater()->can_reload_from_disk(); + }, wxGetApp().plater()); + + append_menu_items_convert_unit(menu); + if (can_merge_to_multipart_object()) + append_menu_item_merge_to_multipart_object(menu); + + wxGetApp().plater()->PopupMenu(menu); } void ObjectList::extruder_selection() @@ -3875,21 +4480,24 @@ void ObjectList::set_extruder_for_selected_items(const int extruder) const wxDataViewItemArray sels; GetSelections(sels); + if (!sels.empty()) + take_snapshot(_(L("Change Extruders"))); + 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("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("extruder")->value); + wxString::Format("%d", config.extruder()); auto const type = m_objects_model->GetItemType(item); @@ -3915,8 +4523,15 @@ void ObjectList::update_after_undo_redo() Plater::SuppressSnapshots suppress(wxGetApp().plater()); // Unselect all objects before deleting them, so that no change of selection is emitted during deletion. - unselect_objects();//this->UnselectAll(); + + /* To avoid execution of selection_changed() + * from wxEVT_DATAVIEW_SELECTION_CHANGED emitted from DeleteAll(), + * wrap this two functions into m_prevent_list_events * + * */ + m_prevent_list_events = true; + this->UnselectAll(); m_objects_model->DeleteAll(); + m_prevent_list_events = false; size_t obj_idx = 0; std::vector obj_idxs; @@ -3962,9 +4577,9 @@ void ObjectList::toggle_printable_state(wxDataViewItem item) // get object's printable and change it const bool printable = !m_objects_model->IsPrintable(item); - const wxString snapshot_text = wxString::Format("%s %s", - printable ? _(L("Set Printable")) : _(L("Set Unprintable")), - object->name); + const wxString snapshot_text = from_u8((boost::format("%1% %2%") + % (printable ? _(L("Set Printable")) : _(L("Set Unprintable"))) + % object->name).str()); take_snapshot(snapshot_text); // set printable value for all instances in object diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp index 0874343b6e..df27fcbdb1 100644 --- a/src/slic3r/GUI/GUI_ObjectList.hpp +++ b/src/slic3r/GUI/GUI_ObjectList.hpp @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -10,6 +11,9 @@ #include "Event.hpp" #include "wxExtensions.hpp" +#include "ObjectDataViewModel.hpp" + +#include "libslic3r/PrintConfig.hpp" class wxBoxSizer; class wxBitmapComboBox; @@ -20,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: @@ -34,9 +40,9 @@ typedef std::map< std::string, std::vector< std::pair typedef std::vector ModelVolumePtrs; -typedef double coordf_t; -typedef std::pair t_layer_height_range; -typedef std::map t_layer_config_ranges; +typedef double coordf_t; +typedef std::pair t_layer_height_range; +typedef std::map t_layer_config_ranges; namespace GUI { @@ -78,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) { @@ -138,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 *m_objects{ nullptr }; wxBitmapComboBox *m_extruder_editor { nullptr }; std::vector 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 @@ -171,6 +197,12 @@ private: SettingsBundle m_freq_settings_sla; #endif + inline void ensure_current_item_visible() + { + if (const auto &item = this->GetCurrentItem()) + this->EnsureVisible(item); + } + public: ObjectList(wxWindow* parent); ~ObjectList(); @@ -179,7 +211,7 @@ public: std::map CATEGORY_ICON; ObjectDataViewModel* GetModel() const { return m_objects_model; } - DynamicPrintConfig* config() const { return m_config; } + ModelConfig* config() const { return m_config; } std::vector* objects() const { return m_objects; } ModelObject* object(const int obj_idx) const ; @@ -201,6 +233,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& obj_idxs, std::vector& 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 @@ -220,28 +253,34 @@ public: void copy(); void paste(); + bool copy_to_clipboard(); + bool paste_from_clipboard(); void undo(); void redo(); void get_settings_choice(const wxString& category_name); void get_freq_settings_choice(const wxString& bundle_name); void show_settings(const wxDataViewItem settings_item); + bool is_instance_or_object_selected(); wxMenu* append_submenu_add_generic(wxMenu* menu, const ModelVolumeType type); void append_menu_items_add_volume(wxMenu* menu); wxMenuItem* append_menu_item_split(wxMenu* menu); - wxMenuItem* append_menu_item_layers_editing(wxMenu* menu); + wxMenuItem* append_menu_item_layers_editing(wxMenu* menu, wxWindow* parent); wxMenuItem* append_menu_item_settings(wxMenu* menu); - wxMenuItem* append_menu_item_change_type(wxMenu* menu); + wxMenuItem* append_menu_item_change_type(wxMenu* menu, wxWindow* parent = nullptr); wxMenuItem* append_menu_item_instance_to_object(wxMenu* menu, wxWindow* parent); wxMenuItem* append_menu_item_printable(wxMenu* menu, wxWindow* parent); void append_menu_items_osx(wxMenu* menu); wxMenuItem* append_menu_item_fix_through_netfabb(wxMenu* menu); void append_menu_item_export_stl(wxMenu* menu) const; void append_menu_item_reload_from_disk(wxMenu* menu) const; - void append_menu_item_change_extruder(wxMenu* menu) const; + 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_items_convert_unit(wxMenu* menu); + 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); @@ -256,6 +295,7 @@ public: void load_part(ModelObject* model_object, std::vector> &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); @@ -264,6 +304,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); @@ -274,11 +315,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(); + 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; @@ -311,13 +354,27 @@ public: // Remove objects/sub-object from the list void remove(); void del_layer_range(const t_layer_height_range& range); - void add_layer_range_after_current(const t_layer_height_range& current_range); + // Add a new layer height after the current range if possible. + // The current range is shortened and the new range is entered after the shortened current range if it fits. + // If no range fits after the current range, then no range is inserted. + // The layer range panel is updated even if this function does not change the layer ranges, as the panel update + // may have been postponed from the "kill focus" event of a text field, if the focus was lost for the "add layer" button. + // Rather providing the range by a value than by a reference, so that the memory referenced cannot be invalidated. + void add_layer_range_after_current(const t_layer_height_range current_range); + wxString can_add_new_range_after_current( t_layer_height_range current_range); void add_layer_item (const t_layer_height_range& range, const wxDataViewItem layers_item, const int layer_idx = -1); bool edit_layer_range(const t_layer_height_range& range, coordf_t layer_height); + // This function may be called when a text field loses focus for a "add layer" or "remove layer" button. + // In that case we don't want to destroy the panel with that "add layer" or "remove layer" buttons, as some messages + // are already planned for them and destroying these widgets leads to crashes at least on OSX. + // In that case the "add layer" or "remove layer" button handlers are responsible for always rebuilding the panel + // even if the "add layer" or "remove layer" buttons did not update the layer spans or layer heights. bool edit_layer_range(const t_layer_height_range& range, - const t_layer_height_range& new_range); + const t_layer_height_range& new_range, + // Don't destroy the panel with the "add layer" or "remove layer" buttons. + bool suppress_ui_update = false); void init_objects(); bool multiple_selection() const ; @@ -353,24 +410,30 @@ 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& object_idxs); void msw_rescale(); + void sys_color_changed(); void update_after_undo_redo(); //update printable state for item from objects model void update_printable_state(int obj_idx, int instance_idx); void toggle_printable_state(wxDataViewItem item); + void show_multi_selection_menu(); + private: #ifdef __WXOSX__ // void OnChar(wxKeyEvent& event); #endif /* __WXOSX__ */ void OnContextMenu(wxDataViewEvent &event); - void list_manipulation(bool evt_context_menu = false); + void list_manipulation(const wxPoint& mouse_pos, bool evt_context_menu = false); void OnBeginDrag(wxDataViewEvent &event); void OnDropPossible(wxDataViewEvent &event); @@ -383,8 +446,6 @@ private: void OnEditingStarted(wxDataViewEvent &event); #endif /* __WXMSW__ */ void OnEditingDone(wxDataViewEvent &event); - - void show_multi_selection_menu(); void extruder_selection(); void set_extruder_for_selected_items(const int extruder) const ; diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp index 937e3dbdc8..2754d255a0 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 #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); @@ -243,11 +251,13 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) : // Add Axes labels with icons static const char axes[] = { 'X', 'Y', 'Z' }; +// std::vector axes_color = {"#990000", "#009900","#000099"}; for (size_t axis_idx = 0; axis_idx < sizeof(axes); axis_idx++) { const char label = axes[axis_idx]; wxStaticText* axis_name = new wxStaticText(m_parent, wxID_ANY, wxString(label)); set_font_and_background_style(axis_name, wxGetApp().bold_font()); +// axis_name->SetForegroundColour(wxColour(axes_color[axis_idx])); sizer = new wxBoxSizer(wxHORIZONTAL); // Under OSX we use font, smaller than default font, so @@ -258,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; @@ -312,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); @@ -328,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(); @@ -344,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()); @@ -354,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(); @@ -388,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.); @@ -403,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, "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); } @@ -450,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"); @@ -460,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(); @@ -479,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.; @@ -487,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(); @@ -498,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"); @@ -560,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); @@ -573,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 { @@ -849,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") @@ -870,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) { @@ -927,9 +979,29 @@ 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, diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp index e6f99ab2a1..560fbb400d 100644 --- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp +++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp @@ -4,12 +4,14 @@ #include #include "GUI_ObjectSettings.hpp" -#include "GLCanvas3D.hpp" +#include "libslic3r/Point.hpp" +#include 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 58daec8b7a..2501ea4995 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 @@ -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()) { @@ -98,7 +101,7 @@ bool ObjectSettings::update_settings_list() btn->SetBitmapHover(m_bmp_delete_focus.bmp()); btn->Bind(wxEVT_BUTTON, [opt_key, config, this](wxEvent &event) { - wxGetApp().plater()->take_snapshot(wxString::Format(_(L("Delete Option %s")), opt_key)); + wxGetApp().plater()->take_snapshot(from_u8((boost::format(_utf8(L("Delete Option %s"))) % opt_key).str())); config->erase(opt_key); wxGetApp().obj_list()->changed_object(); wxTheApp->CallAfter([this]() { @@ -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(wxString::Format(_(L("Change Option %s")), opt_id)); + 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 ff187eddcf..91cfe1dda4 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 d89ac1bcbb..c108f69467 100644 --- a/src/slic3r/GUI/GUI_Preview.cpp +++ b/src/slic3r/GUI/GUI_Preview.cpp @@ -1,16 +1,18 @@ #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 "wxExtensions.hpp" +#include "libslic3r/PresetBundle.hpp" +#include "DoubleSlider.hpp" +#include "Plater.hpp" +#if ENABLE_GCODE_VIEWER +#include "MainFrame.hpp" +#endif // ENABLE_GCODE_VIEWER #include #include @@ -27,33 +29,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->allow_multisample(GLCanvas3DManager::can_multisample()); + m_canvas = new GLCanvas3D(m_canvas_widget); + m_canvas->set_context(wxGetApp().init_glcontext(*m_canvas_widget)); + + m_canvas->allow_multisample(OpenGLManager::can_multisample()); // XXX: If have OpenGL m_canvas->enable_picking(true); m_canvas->enable_moving(true); @@ -65,6 +69,8 @@ bool View3D::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_ m_canvas->enable_selection(true); 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); @@ -162,100 +168,205 @@ void View3D::render() m_canvas->set_as_dirty(); } +#if ENABLE_GCODE_VIEWER Preview::Preview( - wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, + wxWindow* parent, Model* model, DynamicPrintConfig* config, + BackgroundSlicingProcess* process, GCodeProcessor::Result* gcode_result, std::function schedule_background_process_func) +#else +Preview::Preview( + wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function schedule_background_process_func) +#endif // ENABLE_GCODE_VIEWER : m_canvas_widget(nullptr) , m_canvas(nullptr) +#if ENABLE_GCODE_VIEWER + , m_left_sizer(nullptr) + , m_layers_slider_sizer(nullptr) + , m_bottom_toolbar_panel(nullptr) +#else , m_double_slider_sizer(nullptr) +#endif // ENABLE_GCODE_VIEWER , m_label_view_type(nullptr) , m_choice_view_type(nullptr) - , m_label_show_features(nullptr) + , m_label_show(nullptr) , m_combochecklist_features(nullptr) +#if ENABLE_GCODE_VIEWER + , m_combochecklist_features_pos(0) + , m_combochecklist_options(nullptr) +#else , m_checkbox_travel(nullptr) , m_checkbox_retractions(nullptr) , m_checkbox_unretractions(nullptr) , m_checkbox_shells(nullptr) , m_checkbox_legend(nullptr) +#endif // ENABLE_GCODE_VIEWER , m_config(config) , m_process(process) +#if ENABLE_GCODE_VIEWER + , m_gcode_result(gcode_result) +#else , m_gcode_preview_data(gcode_preview_data) +#endif // ENABLE_GCODE_VIEWER , m_number_extruders(1) , m_preferred_color_mode("feature") , m_loaded(false) +#if !ENABLE_GCODE_VIEWER , m_enabled(false) +#endif // !ENABLE_GCODE_VIEWER , 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)) - { + if (init(parent, model)) { +#if !ENABLE_GCODE_VIEWER show_hide_ui_elements("none"); +#endif // !ENABLE_GCODE_VIEWER 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()); +#if ENABLE_GCODE_VIEWER + // to match the background of the sliders +#ifdef _WIN32 + SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); +#else + SetBackgroundColour(GetParent()->GetBackgroundColour()); +#endif // _WIN32 +#endif // ENABLE_GCODE_VIEWER + + 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); +#if ENABLE_GCODE_VIEWER + 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); +#else m_double_slider_sizer = new wxBoxSizer(wxHORIZONTAL); create_double_slider(); - m_label_view_type = new wxStaticText(this, wxID_ANY, _(L("View"))); + 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"))); +#endif // ENABLE_GCODE_VIEWER + 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"))); +#if ENABLE_GCODE_VIEWER + m_label_show = new wxStaticText(m_bottom_toolbar_panel, wxID_ANY, _L("Show")); +#else + m_label_show = new wxStaticText(this, wxID_ANY, _L("Show")); +#endif // ENABLE_GCODE_VIEWER 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"))); +#if ENABLE_GCODE_VIEWER + m_combochecklist_features->Create(m_bottom_toolbar_panel, wxID_ANY, _L("Feature types"), wxDefaultPosition, wxDefaultSize, wxCB_READONLY); +#else + m_combochecklist_features->Create(this, wxID_ANY, _L("Feature types"), wxDefaultPosition, wxDefaultSize, wxCB_READONLY); +#endif // ENABLE_GCODE_VIEWER 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")) +#if ENABLE_GCODE_VIEWER + _L("Unknown") + "|1|" + +#endif // ENABLE_GCODE_VIEWER + _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); + Slic3r::GUI::create_combochecklist(m_combochecklist_features, GUI::into_u8(_L("Feature types")), feature_items); - 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"))); +#if ENABLE_GCODE_VIEWER + 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::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); +#else + 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("Deretractions")); + 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); +#endif // ENABLE_GCODE_VIEWER +#if ENABLE_GCODE_VIEWER + 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, wxSize(-1, 3 * GetTextExtent("m").y), 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); +#else 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); @@ -264,7 +375,7 @@ bool Preview::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view 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_label_show, 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); @@ -280,6 +391,7 @@ bool Preview::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL); main_sizer->Add(top_sizer, 1, wxALL | wxEXPAND, 0); main_sizer->Add(bottom_sizer, 0, wxALL | wxEXPAND, 0); +#endif // ENABLE_GCODE_VIEWER SetSizer(main_sizer); SetMinSize(GetSize()); @@ -287,6 +399,7 @@ bool Preview::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view bind_event_handlers(); +#if !ENABLE_GCODE_VIEWER // sets colors for gcode preview extrusion roles std::vector extrusion_roles_colors = { "Perimeter", "FFFF66", @@ -304,6 +417,7 @@ bool Preview::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view "Custom", "28CC94" }; m_gcode_preview_data->set_extrusion_paths_colors(extrusion_roles_colors); +#endif // !ENABLE_GCODE_VIEWER return true; } @@ -312,12 +426,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() @@ -334,22 +447,24 @@ void Preview::set_number_extruders(unsigned int 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 ENABLE_GCODE_VIEWER + if ((0 <= type) && (type < static_cast(GCodeViewer::EViewType::Count))) + m_canvas->set_gcode_view_preview_type(static_cast(type)); +#else if ((0 <= type) && (type < (int)GCodePreviewData::Extrusion::Num_View_Types)) m_gcode_preview_data->extrusion.view_type = (GCodePreviewData::Extrusion::EViewType)type; +#endif // ENABLE_GCODE_VIEWER m_preferred_color_mode = (type == tool_idx) ? "tool_or_feature" : "feature"; } } -void Preview::set_canvas_as_dirty() -{ - m_canvas->set_as_dirty(); -} - +#if !ENABLE_GCODE_VIEWER void Preview::set_enabled(bool enabled) { m_enabled = enabled; } +#endif // !ENABLE_GCODE_VIEWER void Preview::bed_shape_changed() { @@ -376,6 +491,9 @@ void Preview::load_print(bool keep_z_range) else if (tech == ptSLA) load_print_as_sla(); +#if ENABLE_GCODE_VIEWER + update_bottom_toolbar(); +#endif // ENABLE_GCODE_VIEWER Layout(); } @@ -397,7 +515,9 @@ void Preview::reload_print(bool keep_volumes) !keep_volumes) { m_canvas->reset_volumes(); +#if !ENABLE_GCODE_VIEWER m_canvas->reset_legend_texture(); +#endif // !ENABLE_GCODE_VIEWER m_loaded = false; #ifdef __linux__ m_volumes_cleanup_required = false; @@ -420,7 +540,12 @@ void Preview::refresh_print() void Preview::msw_rescale() { // rescale slider +#if ENABLE_GCODE_VIEWER + if (m_layers_slider != nullptr) m_layers_slider->msw_rescale(); + if (m_moves_slider != nullptr) m_moves_slider->msw_rescale(); +#else if (m_slider) m_slider->msw_rescale(); +#endif // ENABLE_GCODE_VIEWER // rescale warning legend on the canvas get_canvas3d()->msw_rescale(); @@ -429,28 +554,57 @@ void Preview::msw_rescale() refresh_print(); } -void Preview::move_double_slider(wxKeyEvent& evt) +void Preview::jump_layers_slider(wxKeyEvent& evt) { - if (m_slider) +#if ENABLE_GCODE_VIEWER + if (m_layers_slider) m_layers_slider->OnChar(evt); +#else + if (m_slider) m_slider->OnKeyDown(evt); +#endif // ENABLE_GCODE_VIEWER } +#if ENABLE_GCODE_VIEWER +void Preview::move_layers_slider(wxKeyEvent& evt) +{ + if (m_layers_slider != nullptr) m_layers_slider->OnKeyDown(evt); +} +#else +void Preview::move_double_slider(wxKeyEvent& evt) +{ + if (m_slider) + m_slider->OnKeyDown(evt); +} +#endif // ENABLE_GCODE_VIEWER + +#if ENABLE_GCODE_VIEWER +void Preview::edit_layers_slider(wxKeyEvent& evt) +{ + if (m_layers_slider != nullptr) m_layers_slider->OnChar(evt); +} +#else void Preview::edit_double_slider(wxKeyEvent& evt) { - if (m_slider) + if (m_slider) m_slider->OnChar(evt); } +#endif // ENABLE_GCODE_VIEWER 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); +#if ENABLE_GCODE_VIEWER + 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); +#else 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); +#endif // ENABLE_GCODE_VIEWER } void Preview::unbind_event_handlers() @@ -458,19 +612,25 @@ 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); +#if ENABLE_GCODE_VIEWER + 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); +#else 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); +#endif // ENABLE_GCODE_VIEWER } +#if !ENABLE_GCODE_VIEWER void Preview::show_hide_ui_elements(const std::string& what) { bool enable = (what == "full"); - m_label_show_features->Enable(enable); + m_label_show->Enable(enable); m_combochecklist_features->Enable(enable); - m_checkbox_travel->Enable(enable); + m_checkbox_travel->Enable(enable); m_checkbox_retractions->Enable(enable); m_checkbox_unretractions->Enable(enable); m_checkbox_shells->Enable(enable); @@ -481,7 +641,7 @@ void Preview::show_hide_ui_elements(const std::string& what) m_choice_view_type->Enable(enable); bool visible = (what != "none"); - m_label_show_features->Show(visible); + m_label_show->Show(visible); m_combochecklist_features->Show(visible); m_checkbox_travel->Show(visible); m_checkbox_retractions->Show(visible); @@ -491,21 +651,37 @@ void Preview::show_hide_ui_elements(const std::string& what) m_label_view_type->Show(visible); m_choice_view_type->Show(visible); } +#endif // !ENABLE_GCODE_VIEWER -void Preview::reset_sliders() +#if ENABLE_GCODE_VIEWER +void Preview::hide_layers_slider() +{ + m_layers_slider_sizer->Hide((size_t)0); + Layout(); +} +#else +void Preview::reset_sliders(bool reset_all) { m_enabled = false; -// reset_double_slider(); - m_double_slider_sizer->Hide((size_t)0); + // 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); } +#endif // ENABLE_GCODE_VIEWER +#if !ENABLE_GCODE_VIEWER void Preview::update_sliders(const std::vector& layers_z, bool keep_z_range) { m_enabled = true; update_double_slider(layers_z, keep_z_range); + m_double_slider_sizer->Show((size_t)0); + Layout(); } +#endif // !ENABLE_GCODE_VIEWER void Preview::on_size(wxSizeEvent& evt) { @@ -517,23 +693,62 @@ void Preview::on_choice_view_type(wxCommandEvent& evt) { m_preferred_color_mode = (m_choice_view_type->GetStringSelection() == L("Tool")) ? "tool" : "feature"; int selection = m_choice_view_type->GetCurrentSelection(); +#if ENABLE_GCODE_VIEWER + if (0 <= selection && selection < static_cast(GCodeViewer::EViewType::Count)) + m_canvas->set_toolpath_view_type(static_cast(selection)); + + refresh_print(); +#else if ((0 <= selection) && (selection < (int)GCodePreviewData::Extrusion::Num_View_Types)) m_gcode_preview_data->extrusion.view_type = (GCodePreviewData::Extrusion::EViewType)selection; reload_print(); +#endif // ENABLE_GCODE_VIEWER } 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); +#if ENABLE_GCODE_VIEWER + m_canvas->set_toolpath_role_visibility_flags(flags); +#else + m_gcode_preview_data->extrusion.role_flags = flags; +#endif // ENABLE_GCODE_VIEWER refresh_print(); } +#if ENABLE_GCODE_VIEWER +void Preview::on_combochecklist_options(wxCommandEvent& evt) +{ + auto xored = [](unsigned int flags1, unsigned int flags2, unsigned int flag) { + auto is_flag_set = [](unsigned int flags, unsigned int flag) { + return (flags & (1 << flag)) != 0; + }; + return !is_flag_set(flags1, flag) != !is_flag_set(flags2, flag); + }; + + unsigned int curr_flags = m_canvas->get_gcode_options_visibility_flags(); + unsigned int new_flags = Slic3r::GUI::combochecklist_get_flags(m_combochecklist_options); + if (curr_flags == new_flags) + return; + + m_canvas->set_gcode_options_visibility_from_flags(new_flags); + + bool skip_refresh = xored(curr_flags, new_flags, static_cast(OptionType::Shells)) || + xored(curr_flags, new_flags, static_cast(OptionType::ToolMarker)); + + if (!skip_refresh) + refresh_print(); + else + m_canvas->set_as_dirty(); +} +#else void Preview::on_checkbox_travel(wxCommandEvent& evt) { m_gcode_preview_data->travel.is_visible = m_checkbox_travel->IsChecked(); - refresh_print(); + 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(); } void Preview::on_checkbox_retractions(wxCommandEvent& evt) @@ -559,47 +774,138 @@ void Preview::on_checkbox_legend(wxCommandEvent& evt) m_canvas->enable_legend_texture(m_checkbox_legend->IsChecked()); m_canvas_widget->Refresh(); } +#endif // ENABLE_GCODE_VIEWER -void Preview::update_view_type() +void Preview::update_view_type(bool keep_volumes) { const DynamicPrintConfig& config = wxGetApp().preset_bundle->project_config; - const wxString& choice = !config.option("colorprint_heights")->values.empty() && - wxGetApp().extruders_edited_cnt()==1 ? - _(L("Color Print")) : + const wxString& choice = !wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes.empty() /*&& + (wxGetApp().extruders_edited_cnt()==1 || !slice_completed) */? + _L("Color Print") : config.option("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 ENABLE_GCODE_VIEWER + if ((0 <= type) && (type < static_cast(GCodeViewer::EViewType::Count))) + m_canvas->set_gcode_view_preview_type(static_cast(type)); +#else if (0 <= type && type < (int)GCodePreviewData::Extrusion::Num_View_Types) m_gcode_preview_data->extrusion.view_type = (GCodePreviewData::Extrusion::EViewType)type; +#endif // ENABLE_GCODE_VIEWER m_preferred_color_mode = "feature"; } + +#if ENABLE_GCODE_VIEWER + reload_print(keep_volumes); +#else + reload_print(); +#endif // ENABLE_GCODE_VIEWER } +#if ENABLE_GCODE_VIEWER +void Preview::update_bottom_toolbar() +{ + 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(); + } + } + } +} +#endif // ENABLE_GCODE_VIEWER + +#if ENABLE_GCODE_VIEWER +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()); + + sizer->Add(m_layers_slider, 0, wxEXPAND, 0); + + // sizer, m_canvas_widget + 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_layers_slider->UseDefaultColors(true); + event.Skip(); + }); + + 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_layers_slider->GetTicksValues(); + m_schedule_background_process(); + + update_view_type(false); + }); + + return sizer; +} +#else void Preview::create_double_slider() { - m_slider = new DoubleSlider(this, wxID_ANY, 0, 0, 0, 100); + 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); + m_double_slider_sizer->Add(m_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_UP, [this](wxKeyEvent& event) { + if (event.GetKeyCode() == WXK_SHIFT) + m_slider->UseDefaultColors(true); + event.Skip(); + }); m_slider->Bind(wxEVT_SCROLL_CHANGED, &Preview::on_sliders_scroll_changed, this); - - Bind(wxCUSTOMEVT_TICKSCHANGED, [this](wxEvent&) { - wxGetApp().preset_bundle->project_config.option("colorprint_heights")->values = m_slider->GetTicksValues(); + Bind(DoubleSlider::wxCUSTOMEVT_TICKSCHANGED, [this](wxEvent&) { + Model& model = wxGetApp().plater()->model(); + model.custom_gcode_per_print_z = m_slider->GetTicksValues(); m_schedule_background_process(); - update_view_type(); - - reload_print(); + update_view_type(false); }); } +#endif // ENABLE_GCODE_VIEWER // Find an index of a value in a sorted vector, which is in . // Returns -1 if there is no such member. @@ -628,12 +934,88 @@ static int find_close_layer_idx(const std::vector& zs, double &z, double return -1; } -void Preview::update_double_slider(const std::vector& layers_z, bool keep_z_range) +#if ENABLE_GCODE_VIEWER +void Preview::check_layers_slider_values(std::vector& ticks_from_model, const std::vector& layers_z) +#else +void Preview::check_slider_values(std::vector& ticks_from_model, + const std::vector& layers_z) +#endif // ENABLE_GCODE_VIEWER +{ + // All ticks that would end up outside the slider range should be erased. + // TODO: this should be placed into more appropriate part of code, + // this function is e.g. not called when the last object is deleted + unsigned int old_size = ticks_from_model.size(); + ticks_from_model.erase(std::remove_if(ticks_from_model.begin(), ticks_from_model.end(), + [layers_z](CustomGCode::Item val) + { + auto it = std::lower_bound(layers_z.begin(), layers_z.end(), val.print_z - DoubleSlider::epsilon()); + return it == layers_z.end(); + }), + ticks_from_model.end()); + if (ticks_from_model.size() != old_size) + m_schedule_background_process(); +} + +#if ENABLE_GCODE_VIEWER +void Preview::update_layers_slider(const std::vector& layers_z, bool keep_z_range) +{ + // Save the initial slider span. + 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_layers_slider->GetMaxValueD()) > DoubleSlider::epsilon()/*1e-6*/; + force_sliders_full_range |= span_changed; + } + 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_layers_slider_mode(); + + CustomGCode::Info& ticks_info_from_model = wxGetApp().plater()->model().custom_gcode_per_print_z; + check_layers_slider_values(ticks_info_from_model.gcodes, layers_z); + + 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_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) { + int idx_new = find_close_layer_idx(layers_z, z_high, DoubleSlider::epsilon()/*1e-6*/); + if (idx_new != -1) + idx_high = idx_new; + } + } + m_layers_slider->SetSelectionSpan(idx_low, idx_high); + m_layers_slider->SetTicksValues(ticks_info_from_model); + + bool sla_print_technology = wxGetApp().plater()->printer_technology() == ptSLA; + bool sequential_print = wxGetApp().preset_bundle->prints.get_edited_preset().config.opt_bool("complete_objects"); + m_layers_slider->SetDrawMode(sla_print_technology, sequential_print); + m_layers_slider->SetExtruderColors(wxGetApp().plater()->get_extruder_colors_from_plater_config()); + + m_layers_slider_sizer->Show((size_t)0); + Layout(); +} +#else +void Preview::update_double_slider(const std::vector & 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; + bool force_sliders_full_range = was_empty; if (!keep_z_range) { @@ -641,24 +1023,27 @@ void Preview::update_double_slider(const std::vector& layers_z, bool kee 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_max = force_sliders_full_range || m_slider->is_higher_at_max(); - std::vector &ticks_from_config = (wxGetApp().preset_bundle->project_config.option("colorprint_heights"))->values; - check_slider_values(ticks_from_config, layers_z); + // Detect and set manipulation mode for double slider + update_double_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); m_slider->SetSliderValues(layers_z); assert(m_slider->GetMinValue() == 0); m_slider->SetMaxValue(layers_z.empty() ? 0 : layers_z.size() - 1); - int idx_low = 0; + int idx_low = 0; int idx_high = m_slider->GetMaxValue(); - if (! layers_z.empty()) { - if (! snap_to_min) { + 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; @@ -666,42 +1051,141 @@ void Preview::update_double_slider(const std::vector& layers_z, bool kee } m_slider->SetSelectionSpan(idx_low, idx_high); - m_slider->SetTicksValues(ticks_from_config); + m_slider->SetTicksValues(ticks_info_from_model); - bool color_print_enable = (wxGetApp().plater()->printer_technology() == ptFFF); - if (color_print_enable) { - const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->printers.get_edited_preset().config; - if (cfg.opt("nozzle_diameter")->values.size() > 1) - color_print_enable = false; - } - m_slider->EnableTickManipulation(color_print_enable); + bool sla_print_technology = wxGetApp().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_slider->SetExtruderColors(wxGetApp().plater()->get_extruder_colors_from_plater_config()); } +#endif // ENABLE_GCODE_VIEWER -void Preview::check_slider_values(std::vector& ticks_from_config, - const std::vector &layers_z) +#if ENABLE_GCODE_VIEWER +void Preview::update_layers_slider_mode() +#else +void Preview::update_double_slider_mode() +#endif // ENABLE_GCODE_VIEWER { - // All ticks that would end up outside the slider range should be erased. - // TODO: this should be placed into more appropriate part of code, - // this function is e.g. not called when the last object is deleted - unsigned int old_size = ticks_from_config.size(); - ticks_from_config.erase(std::remove_if(ticks_from_config.begin(), ticks_from_config.end(), - [layers_z](double val) + // true -> single-extruder printer profile OR + // multi-extruder printer profile , but whole model is printed by only one extruder + // false -> multi-extruder printer profile , and model is printed by several extruders + bool one_extruder_printed_model = true; + + // extruder used for whole model for multi-extruder printer profile + int only_extruder = -1; + + if (wxGetApp().extruders_edited_cnt() > 1) { - auto it = std::lower_bound(layers_z.begin(), layers_z.end(), val - DoubleSlider::epsilon()); - return it == layers_z.end(); - }), - ticks_from_config.end()); - if (ticks_from_config.size() != old_size) - m_schedule_background_process(); + const ModelObjectPtrs& objects = wxGetApp().plater()->model().objects; + + // check if whole model uses just only one extruder + if (!objects.empty()) + { + const int extruder = objects[0]->config.has("extruder") ? + objects[0]->config.option("extruder")->getInt() : 0; + + auto is_one_extruder_printed_model = [objects, extruder]() + { + for (ModelObject* object : objects) + { + if (object->config.has("extruder") && + object->config.option("extruder")->getInt() != extruder) + return false; + + if (object->volumes.size() > 1) + for (ModelVolume* volume : object->volumes) + if (volume->config.has("extruder") && + volume->config.option("extruder")->getInt() != extruder) + return false; + + for (const auto& range : object->layer_config_ranges) + if (range.second.has("extruder") && + range.second.option("extruder")->getInt() != extruder) + return false; + } + return true; + }; + + if (is_one_extruder_printed_model()) + only_extruder = extruder; + else + one_extruder_printed_model = false; + } + } + +#if ENABLE_GCODE_VIEWER + m_layers_slider->SetModeAndOnlyExtruder(one_extruder_printed_model, only_extruder); +#else + m_slider->SetModeAndOnlyExtruder(one_extruder_printed_model, only_extruder); +#endif // ENABLE_GCODE_VIEWER } +#if ENABLE_GCODE_VIEWER +void Preview::reset_layers_slider() +{ + m_layers_slider->SetHigherValue(0); + m_layers_slider->SetLowerValue(0); +} +#else void Preview::reset_double_slider() { m_slider->SetHigherValue(0); m_slider->SetLowerValue(0); } +#endif // ENABLE_GCODE_VIEWER -void Preview::update_double_slider_from_canvas(wxKeyEvent& event) +#if ENABLE_GCODE_VIEWER +void Preview::update_layers_slider_from_canvas(wxKeyEvent& event) +{ + if (event.HasModifiers()) { + event.Skip(); + return; + } + + const auto key = event.GetKeyCode(); + + if (key == 'U' || key == 'D') { + const int new_pos = key == 'U' ? m_layers_slider->GetHigherValue() + 1 : m_layers_slider->GetHigherValue() - 1; + 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 == 'S') + m_layers_slider->ChangeOneLayerLock(); + else if (key == WXK_SHIFT) + 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 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(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(); + } +} +#else +void Preview::update_double_slider_from_canvas(wxKeyEvent & event) { if (event.HasModifiers()) { event.Skip(); @@ -722,12 +1206,21 @@ void Preview::update_double_slider_from_canvas(wxKeyEvent& event) } else if (key == 'S') m_slider->ChangeOneLayerLock(); + else if (key == WXK_SHIFT) + m_slider->UseDefaultColors(false); else event.Skip(); } +#endif // ENABLE_GCODE_VIEWER void Preview::load_print_as_fff(bool keep_z_range) { +#if ENABLE_GCODE_VIEWER + if (wxGetApp().mainframe == nullptr || wxGetApp().is_recreating_gui()) + // avoid processing while mainframe is being constructed + return; +#endif // ENABLE_GCODE_VIEWER + if (m_loaded || m_process->current_printer_technology() != ptFFF) return; @@ -751,88 +1244,122 @@ void Preview::load_print_as_fff(bool keep_z_range) } } - if (! has_layers) - { - reset_sliders(); +#if ENABLE_GCODE_VIEWER + if (wxGetApp().is_editor() && !has_layers) { + hide_layers_slider(); + m_left_sizer->Hide(m_bottom_toolbar_panel); + m_left_sizer->Layout(); + Refresh(); +#else + if (! has_layers) { + reset_sliders(true); m_canvas->reset_legend_texture(); +#endif // ENABLE_GCODE_VIEWER m_canvas_widget->Refresh(); return; } - if (m_preferred_color_mode == "tool_or_feature") - { + 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 ENABLE_GCODE_VIEWER + if (0 <= type && type < static_cast(GCodeViewer::EViewType::Count)) + m_canvas->set_gcode_view_preview_type(static_cast(type)); +#else if ((0 <= type) && (type < (int)GCodePreviewData::Extrusion::Num_View_Types)) m_gcode_preview_data->extrusion.view_type = (GCodePreviewData::Extrusion::EViewType)type; +#endif // ENABLE_GCODE_VIEWER // If the->SetSelection changed the following line, revert it to "decide yourself". m_preferred_color_mode = "tool_or_feature"; } +#if ENABLE_GCODE_VIEWER + GCodeViewer::EViewType gcode_view_type = m_canvas->get_gcode_view_preview_type(); + bool gcode_preview_data_valid = !m_gcode_result->moves.empty(); +#else bool gcode_preview_data_valid = print->is_step_done(psGCodeExport) && ! m_gcode_preview_data->empty(); +#endif // ENABLE_GCODE_VIEWER // Collect colors per extruder. std::vector colors; - std::vector color_print_values = {}; + std::vector 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 = GCodePreviewData::ColorPrintColors(); - if (! gcode_preview_data_valid) { - //FIXME accessing full_config() is pretty expensive. - // Only initialize color_print_values for the initial preview, not for the full preview where the color_print_values is extracted from the G-code. - const auto& config = wxGetApp().preset_bundle->project_config; - color_print_values = config.option("colorprint_heights")->values; +#if ENABLE_GCODE_VIEWER + if (gcode_view_type == GCodeViewer::EViewType::ColorPrint) { + colors = wxGetApp().plater()->get_colors_for_color_print(m_gcode_result); +#else + 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 +#endif // ENABLE_GCODE_VIEWER + + if (!gcode_preview_data_valid) { + color_print_values = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes; +#if ENABLE_GCODE_VIEWER + colors.push_back("#808080"); // gray color for pause print or custom G-code +#endif // ENABLE_GCODE_VIEWER } } - else if (gcode_preview_data_valid || (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::Tool) ) - { - const ConfigOptionStrings* extruders_opt = dynamic_cast(m_config->option("extruder_colour")); - const ConfigOptionStrings* filamemts_opt = dynamic_cast(m_config->option("filament_colour")); - unsigned int colors_count = std::max((unsigned int)extruders_opt->values.size(), (unsigned int)filamemts_opt->values.size()); - - unsigned char rgb[3]; - for (unsigned int i = 0; i < colors_count; ++i) - { - std::string color = m_config->opt_string("extruder_colour", i); - if (!PresetBundle::parse_color(color, rgb)) - { - color = m_config->opt_string("filament_colour", i); - if (!PresetBundle::parse_color(color, rgb)) - color = "#FFFFFF"; - } - - colors.emplace_back(color); - } +#if ENABLE_GCODE_VIEWER + else if (gcode_preview_data_valid || gcode_view_type == GCodeViewer::EViewType::Tool) { + colors = wxGetApp().plater()->get_extruder_colors_from_plater_config(m_gcode_result); +#else + 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(); +#endif // ENABLE_GCODE_VIEWER color_print_values.clear(); } - if (IsShown()) - { + if (IsShown()) { +#if ENABLE_GCODE_VIEWER + std::vector zs; +#endif // ENABLE_GCODE_VIEWER + + m_canvas->set_selected_extruder(0); if (gcode_preview_data_valid) { // Load the real G-code preview. +#if ENABLE_GCODE_VIEWER + 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(); +#else m_canvas->load_gcode_preview(*m_gcode_preview_data, colors); +#endif // ENABLE_GCODE_VIEWER m_loaded = true; } else { - // disable color change information for multi-material presets - if (wxGetApp().extruders_edited_cnt() > 1) - color_print_values.clear(); - // Load the initial preview based on slices, not the final G-code. m_canvas->load_preview(colors, color_print_values); +#if ENABLE_GCODE_VIEWER + m_left_sizer->Hide(m_bottom_toolbar_panel); + m_left_sizer->Layout(); + Refresh(); + zs = m_canvas->get_volumes_print_zs(true); +#endif // ENABLE_GCODE_VIEWER } +#if !ENABLE_GCODE_VIEWER show_hide_ui_elements(gcode_preview_data_valid ? "full" : "simple"); - // recalculates zs and update sliders accordingly std::vector zs = m_canvas->get_current_print_zs(true); +#endif // !ENABLE_GCODE_VIEWER if (zs.empty()) { // all layers filtered out - reset_sliders(); +#if ENABLE_GCODE_VIEWER + hide_layers_slider(); +#else + reset_sliders(true); +#endif // ENABLE_GCODE_VIEWER m_canvas_widget->Refresh(); } else +#if ENABLE_GCODE_VIEWER + update_layers_slider(zs, keep_z_range); +#else update_sliders(zs, keep_z_range); +#endif // ENABLE_GCODE_VIEWER } } @@ -860,43 +1387,96 @@ void Preview::load_print_as_sla() n_layers = (unsigned int)zs.size(); if (n_layers == 0) { - reset_sliders(); +#if ENABLE_GCODE_VIEWER + hide_layers_slider(); +#else + reset_sliders(true); +#endif // ENABLE_GCODE_VIEWER m_canvas_widget->Refresh(); } if (IsShown()) { m_canvas->load_sla_preview(); +#if ENABLE_GCODE_VIEWER + m_left_sizer->Hide(m_bottom_toolbar_panel); + m_left_sizer->Hide(m_bottom_toolbar_panel); + m_left_sizer->Layout(); + Refresh(); +#else show_hide_ui_elements("none"); +#endif // ENABLE_GCODE_VIEWER if (n_layers > 0) +#if ENABLE_GCODE_VIEWER + update_layers_slider(zs); +#else update_sliders(zs); +#endif // ENABLE_GCODE_VIEWER m_loaded = true; } } +#if ENABLE_GCODE_VIEWER +void Preview::on_layers_slider_scroll_changed(wxCommandEvent& event) +#else void Preview::on_sliders_scroll_changed(wxCommandEvent& event) +#endif // ENABLE_GCODE_VIEWER { - if (IsShown()) - { + if (IsShown()) { PrinterTechnology tech = m_process->current_printer_technology(); - if (tech == ptFFF) - { + if (tech == ptFFF) { +#if ENABLE_GCODE_VIEWER + m_canvas->set_volumes_z_range({ m_layers_slider->GetLowerValueD(), m_layers_slider->GetHigherValueD() }); + m_canvas->set_toolpaths_z_range({ static_cast(m_layers_slider->GetLowerValue()), static_cast(m_layers_slider->GetHigherValue()) }); + m_canvas->set_as_dirty(); +#else 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); +#endif // ENABLE_GCODE_VIEWER } - else if (tech == ptSLA) - { + else if (tech == ptSLA) { +#if ENABLE_GCODE_VIEWER + 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); +#else 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); +#endif // ENABLE_GCODE_VIEWER m_canvas->render(); } } } +#if ENABLE_GCODE_VIEWER +void Preview::on_moves_slider_scroll_changed(wxCommandEvent& event) +{ + m_canvas->update_gcode_sequential_view_current(static_cast(m_moves_slider->GetLowerValueD() - 1.0), static_cast(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::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 ""; } + } +} +#endif // ENABLE_GCODE_VIEWER } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp index 08d5991b4e..5ad70a1ac7 100644 --- a/src/slic3r/GUI/GUI_Preview.hpp +++ b/src/slic3r/GUI/GUI_Preview.hpp @@ -2,9 +2,14 @@ #define slic3r_GUI_Preview_hpp_ #include + #include "libslic3r/Point.hpp" +#include "libslic3r/CustomGCode.hpp" #include +#if ENABLE_GCODE_VIEWER +#include "libslic3r/GCode/GCodeProcessor.hpp" +#endif // ENABLE_GCODE_VIEWER class wxNotebook; class wxGLCanvas; @@ -12,23 +17,30 @@ class wxBoxSizer; class wxStaticText; class wxChoice; class wxComboCtrl; +class wxBitmapComboBox; class wxCheckBox; -class DoubleSlider; namespace Slic3r { class DynamicPrintConfig; class Print; class BackgroundSlicingProcess; +#if !ENABLE_GCODE_VIEWER class GCodePreviewData; +#endif // !ENABLE_GCODE_VIEWER class Model; +namespace DoubleSlider { + class Control; +}; + namespace GUI { class GLCanvas3D; class GLToolbar; class Bed3D; struct Camera; +class Plater; class View3D : public wxPanel { @@ -36,7 +48,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; } @@ -64,27 +76,42 @@ 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; +#if ENABLE_GCODE_VIEWER + wxBoxSizer* m_left_sizer; + wxBoxSizer* m_layers_slider_sizer; + wxPanel* m_bottom_toolbar_panel; +#else wxBoxSizer* m_double_slider_sizer; +#endif // ENABLE_GCODE_VIEWER wxStaticText* m_label_view_type; wxChoice* m_choice_view_type; - wxStaticText* m_label_show_features; + wxStaticText* m_label_show; wxComboCtrl* m_combochecklist_features; +#if ENABLE_GCODE_VIEWER + size_t m_combochecklist_features_pos; + wxComboCtrl* m_combochecklist_options; +#else wxCheckBox* m_checkbox_travel; wxCheckBox* m_checkbox_retractions; wxCheckBox* m_checkbox_unretractions; wxCheckBox* m_checkbox_shells; wxCheckBox* m_checkbox_legend; +#endif // ENABLE_GCODE_VIEWER DynamicPrintConfig* m_config; BackgroundSlicingProcess* m_process; +#if ENABLE_GCODE_VIEWER + GCodeProcessor::Result* m_gcode_result; +#else GCodePreviewData* m_gcode_preview_data; +#endif // ENABLE_GCODE_VIEWER #ifdef __linux__ // We are getting mysterious crashes on Linux in gtk due to OpenGL context activation GH #1874 #1955. @@ -99,13 +126,39 @@ class Preview : public wxPanel std::string m_preferred_color_mode; bool m_loaded; +#if !ENABLE_GCODE_VIEWER bool m_enabled; +#endif // !ENABLE_GCODE_VIEWER - DoubleSlider* m_slider {nullptr}; +#if ENABLE_GCODE_VIEWER + DoubleSlider::Control* m_layers_slider{ nullptr }; + DoubleSlider::Control* m_moves_slider{ nullptr }; +#else + DoubleSlider::Control* m_slider {nullptr}; +#endif // ENABLE_GCODE_VIEWER public: - Preview(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, - BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function schedule_background_process = [](){}); +#if ENABLE_GCODE_VIEWER + enum class OptionType : unsigned int + { + Travel, + Retractions, + Unretractions, + ToolChanges, + ColorChanges, + PausePrints, + CustomGCodes, + Shells, + ToolMarker, + Legend + }; + +Preview(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process, + GCodeProcessor::Result* gcode_result, std::function schedule_background_process = []() {}); +#else +Preview(wxWindow* parent, Model* model, DynamicPrintConfig* config, + BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function schedule_background_process = []() {}); +#endif // ENABLE_GCODE_VIEWER virtual ~Preview(); wxGLCanvas* get_wxglcanvas() { return m_canvas_widget; } @@ -114,8 +167,9 @@ public: void set_as_dirty(); void set_number_extruders(unsigned int number_extruders); - void set_canvas_as_dirty(); +#if !ENABLE_GCODE_VIEWER void set_enabled(bool enabled); +#endif // !ENABLE_GCODE_VIEWER void bed_shape_changed(); void select_view(const std::string& direction); void set_drop_target(wxDropTarget* target); @@ -125,47 +179,84 @@ public: void refresh_print(); void msw_rescale(); + void jump_layers_slider(wxKeyEvent& evt); +#if ENABLE_GCODE_VIEWER + void move_layers_slider(wxKeyEvent& evt); + void edit_layers_slider(wxKeyEvent& evt); +#else void move_double_slider(wxKeyEvent& evt); void edit_double_slider(wxKeyEvent& evt); +#endif // ENABLE_GCODE_VIEWER - void update_view_type(); + void update_view_type(bool keep_volumes); bool is_loaded() const { return m_loaded; } +#if ENABLE_GCODE_VIEWER + void update_bottom_toolbar(); + void update_moves_slider(); + void enable_moves_slider(bool enable); + void hide_layers_slider(); +#endif // ENABLE_GCODE_VIEWER + 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(); +#if !ENABLE_GCODE_VIEWER void show_hide_ui_elements(const std::string& what); - void reset_sliders(); + void reset_sliders(bool reset_all); void update_sliders(const std::vector& layers_z, bool keep_z_range = false); +#endif // !ENABLE_GCODE_VIEWER void on_size(wxSizeEvent& evt); void on_choice_view_type(wxCommandEvent& evt); void on_combochecklist_features(wxCommandEvent& evt); +#if ENABLE_GCODE_VIEWER + void on_combochecklist_options(wxCommandEvent& evt); +#else 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); +#endif // ENABLE_GCODE_VIEWER +#if ENABLE_GCODE_VIEWER + // Create/Update/Reset double slider on 3dPreview + wxBoxSizer* create_layers_slider_sizer(); + void check_layers_slider_values(std::vector& ticks_from_model, + const std::vector& layers_z); + void reset_layers_slider(); + void update_layers_slider(const std::vector& 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); +#else // Create/Update/Reset double slider on 3dPreview void create_double_slider(); - void update_double_slider(const std::vector& layers_z, bool keep_z_range = false); - void check_slider_values(std::vector &ticks_from_config, - const std::vector &layers_z); + void check_slider_values(std::vector& ticks_from_model, + const std::vector& layers_z); void reset_double_slider(); + void update_double_slider(const std::vector& 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); +#endif // ENABLE_GCODE_VIEWER void load_print_as_fff(bool keep_z_range = false); void load_print_as_sla(); +#if ENABLE_GCODE_VIEWER + void on_layers_slider_scroll_changed(wxCommandEvent& event); + void on_moves_slider_scroll_changed(wxCommandEvent& event); + wxString get_option_type_string(OptionType type) const; +#else void on_sliders_scroll_changed(wxCommandEvent& event); - +#endif // ENABLE_GCODE_VIEWER }; } // namespace GUI diff --git a/src/slic3r/GUI/GUI_Utils.cpp b/src/slic3r/GUI/GUI_Utils.cpp index 5090382cef..e2a6ccb885 100644 --- a/src/slic3r/GUI/GUI_Utils.cpp +++ b/src/slic3r/GUI/GUI_Utils.cpp @@ -21,6 +21,12 @@ namespace Slic3r { namespace GUI { +#ifdef _WIN32 +wxDEFINE_EVENT(EVT_HID_DEVICE_ATTACHED, HIDDeviceAttachedEvent); +wxDEFINE_EVENT(EVT_HID_DEVICE_DETACHED, HIDDeviceDetachedEvent); +wxDEFINE_EVENT(EVT_VOLUME_ATTACHED, VolumeAttachedEvent); +wxDEFINE_EVENT(EVT_VOLUME_DETACHED, VolumeDetachedEvent); +#endif // _WIN32 wxTopLevelWindow* find_toplevel_parent(wxWindow *window) { @@ -55,7 +61,9 @@ void on_window_geometry(wxTopLevelWindow *tlw, std::function 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 typename F::FN winapi_get_function(const wchar_t *dll, const char *fn_name) { @@ -67,7 +75,7 @@ template 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_ { @@ -112,10 +120,13 @@ int get_dpi_for_window(wxWindow *window) #elif defined __APPLE__ // TODO return DPI_DEFAULT; +#else // freebsd and others + // TODO + return DPI_DEFAULT; #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. @@ -125,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. @@ -259,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::system_clock::now().time_since_epoch()); +} + +TaskTimer::~TaskTimer() +{ + std::chrono::milliseconds stop_timer = std::chrono::duration_cast( + 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 f7bebd5778..3235d6e9ea 100644 --- a/src/slic3r/GUI/GUI_Utils.hpp +++ b/src/slic3r/GUI/GUI_Utils.hpp @@ -18,14 +18,36 @@ #include #include +#include + +#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 { +#ifdef _WIN32 +// USB HID attach / detach events from Windows OS. +using HIDDeviceAttachedEvent = Event; +using HIDDeviceDetachedEvent = Event; +wxDECLARE_EVENT(EVT_HID_DEVICE_ATTACHED, HIDDeviceAttachedEvent); +wxDECLARE_EVENT(EVT_HID_DEVICE_DETACHED, HIDDeviceDetachedEvent); + +// Disk aka Volume attach / detach events from Windows OS. +using VolumeAttachedEvent = SimpleEvent; +using VolumeDetachedEvent = SimpleEvent; +wxDECLARE_EVENT(EVT_VOLUME_ATTACHED, VolumeAttachedEvent); +wxDECLARE_EVENT(EVT_VOLUME_DETACHED, VolumeDetachedEvent); +#endif /* _WIN32 */ wxTopLevelWindow* find_toplevel_parent(wxWindow *window); @@ -33,9 +55,11 @@ void on_window_geometry(wxTopLevelWindow *tlw, std::function 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; @@ -51,6 +75,7 @@ struct DpiChangedEvent : public wxEvent { }; wxDECLARE_EVENT(EVT_DPI_CHANGED_SLICER, DpiChangedEvent); +#endif // !wxVERSION_EQUAL_OR_GREATER_THAN template class DPIAware : public P { @@ -62,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. @@ -70,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(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(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) { @@ -109,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() {} @@ -119,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; @@ -131,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; @@ -170,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(10, 10.0f * m_scale_factor); +#else m_em_unit = std::max(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); @@ -319,7 +376,7 @@ public: static WindowMetrics from_window(wxTopLevelWindow *window); static boost::optional 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); @@ -328,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 cb18bdb166..9bc34f9909 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp @@ -5,14 +5,8 @@ #include "slic3r/GUI/GUI_App.hpp" - - - - // TODO: Display tooltips quicker on Linux - - namespace Slic3r { namespace GUI { @@ -263,12 +257,6 @@ void GLGizmoBase::render_grabbers_for_picking(const BoundingBoxf3& box) const } } - -void GLGizmoBase::set_tooltip(const std::string& tooltip) const -{ - m_parent.set_tooltip(tooltip); -} - std::string GLGizmoBase::format(float value, unsigned int decimals) const { return Slic3r::string_printf("%.*f", decimals, value); @@ -301,5 +289,6 @@ unsigned char picking_checksum_alpha_channel(unsigned char red, unsigned char gr return b; } + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp index da30427793..44f0a69729 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 @@ -30,7 +29,10 @@ static const float CONSTRAINED_COLOR[4] = { 0.5f, 0.5f, 0.5f, 1.0f }; class ImGuiWrapper; - +class GLCanvas3D; +enum class CommonGizmosDataID; +class CommonGizmosDataPool; +class Selection; class GLGizmoBase { @@ -99,9 +101,13 @@ protected: mutable std::vector m_grabbers; ImGuiWrapper* m_imgui; bool m_first_input_window_render; + mutable std::string m_tooltip; + CommonGizmosDataPool* m_c; public: - GLGizmoBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + GLGizmoBase(GLCanvas3D& parent, + const std::string& icon_filename, + unsigned int sprite_id); virtual ~GLGizmoBase() {} bool init() { return on_init(); } @@ -118,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; } @@ -142,10 +149,12 @@ public: void update(const UpdateData& data); - void render() const { on_render(); } + void render() const { m_tooltip.clear(); on_render(); } void render_for_picking() const { on_render_for_picking(); } void render_input_window(float x, float y, float bottom_limit); + virtual std::string get_tooltip() const { return ""; } + protected: virtual bool on_init() = 0; virtual void on_load(cereal::BinaryInputArchive& ar) {} @@ -155,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() {} @@ -171,7 +181,6 @@ protected: void render_grabbers(float size) const; void render_grabbers_for_picking(const BoundingBoxf3& box) const; - void set_tooltip(const std::string& tooltip) const; std::string format(float value, unsigned int decimals) const; }; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp index 76a9ed6032..4c00f8f2fd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp @@ -9,7 +9,10 @@ #include #include +#include + #include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/Plater.hpp" namespace Slic3r { @@ -28,6 +31,11 @@ GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, uns , m_rotate_lower(false) {} +std::string GLGizmoCut::get_tooltip() const +{ + return (m_hover_id == 0 || m_grabbers[0].dragging) ? "Z: " + format(m_cut_z, 2) : ""; +} + bool GLGizmoCut::on_init() { m_grabbers.emplace_back(); @@ -77,10 +85,6 @@ void GLGizmoCut::on_update(const UpdateData& data) void GLGizmoCut::on_render() const { - if (m_grabbers[0].dragging) { - set_tooltip("Z: " + format(m_cut_z, 2)); - } - const Selection& selection = m_parent.get_selection(); update_max_z(selection); @@ -136,21 +140,39 @@ void GLGizmoCut::on_render_for_picking() const void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit) { - const float approx_height = m_imgui->scaled(11.0f); - y = std::min(y, bottom_limit - approx_height); - m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); + static float last_y = 0.0f; + static float last_h = 0.0f; - m_imgui->set_next_window_bg_alpha(0.5f); + m_imgui->begin(_(L("Cut")), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - m_imgui->begin(_(L("Cut")), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); + // 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)) + { + // ask canvas for another frame to render the window in the correct position + m_parent.request_extra_frame(); + if (last_h != win_h) + last_h = win_h; + if (last_y != y) + last_y = y; + } - ImGui::PushItemWidth(m_imgui->scaled(5.0f)); - ImGui::InputDouble("Z", &m_cut_z, 0.0f, 0.0f, "%.2f"); + ImGui::AlignTextToFramePadding(); + 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"); + + 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); + 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_end(); @@ -171,17 +193,25 @@ void GLGizmoCut::update_max_z(const Selection& selection) const void GLGizmoCut::set_cut_z(double cut_z) const { // Clamp the plane to the object's bounding box - m_cut_z = std::max(0.0, std::min(m_max_z, cut_z)); + m_cut_z = std::clamp(cut_z, 0.0, m_max_z); } 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/GLGizmoCut.hpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp index 6e5738a422..c0f33978f6 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.hpp @@ -25,6 +25,11 @@ class GLGizmoCut : public GLGizmoBase public: GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + double get_cut_z() const { return m_cut_z; } + void set_cut_z(double cut_z) const; + + std::string get_tooltip() const override; + protected: virtual bool on_init(); virtual void on_load(cereal::BinaryInputArchive& ar) { ar(m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower); } @@ -40,7 +45,6 @@ protected: private: void update_max_z(const Selection& selection) const; - void set_cut_z(double cut_z) const; void perform_cut(const Selection& selection); double 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 0000000000..48af11a8a7 --- /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 + + +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().normalized(); + Vec3f limit = (trafo_matrix.inverse() * Vec3d(std::sin(threshold), 0, -std::cos(threshold))).cast().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(*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 0000000000..fc97707873 --- /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 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 9fae8893ac..fc5edff6d0 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 @@ -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(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(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()); 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(); + 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; iinstances.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 9cd2ab6bb1..f6fe06451a 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 vertices; + std::vector vertices; // should be in fact local in update_planes() + GLIndexedVertexArray vbo; Vec3d normal; float area; }; @@ -30,8 +36,7 @@ private: std::vector 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 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 new file mode 100644 index 0000000000..3d0d9c79ad --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp @@ -0,0 +1,919 @@ +#include "GLGizmoHollow.hpp" +#include "slic3r/GUI/GLCanvas3D.hpp" +#include "slic3r/GUI/Camera.hpp" +#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp" + +#include + +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI_ObjectSettings.hpp" +#include "slic3r/GUI/GUI_ObjectList.hpp" +#include "slic3r/GUI/Plater.hpp" +#include "libslic3r/PresetBundle.hpp" + +#include "libslic3r/Model.hpp" + + +namespace Slic3r { +namespace GUI { + +GLGizmoHollow::GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id) + : GLGizmoBase(parent, icon_filename, sprite_id) + , m_quadric(nullptr) +{ + m_quadric = ::gluNewQuadric(); + if (m_quadric != nullptr) + // using GLU_FILL does not work when the instance's transformation + // contains mirroring (normals are reverted) + ::gluQuadricDrawStyle(m_quadric, GLU_FILL); +} + +GLGizmoHollow::~GLGizmoHollow() +{ + if (m_quadric != nullptr) + ::gluDeleteQuadric(m_quadric); +} + +bool GLGizmoHollow::on_init() +{ + m_shortcut_key = WXK_CONTROL_H; + m_desc["enable"] = _(L("Hollow this object")); + m_desc["preview"] = _(L("Preview hollowed and drilled model")); + m_desc["offset"] = _(L("Offset")) + ": "; + m_desc["quality"] = _(L("Quality")) + ": "; + m_desc["closing_distance"] = _(L("Closing distance")) + ": "; + m_desc["hole_diameter"] = _(L("Hole diameter")) + ": "; + m_desc["hole_depth"] = _(L("Hole depth")) + ": "; + m_desc["remove_selected"] = _(L("Remove selected holes")); + m_desc["remove_all"] = _(L("Remove all holes")); + m_desc["clipping_of_view"] = _(L("Clipping of view"))+ ": "; + m_desc["reset_direction"] = _(L("Reset direction")); + m_desc["show_supports"] = _(L("Show supports")); + + return true; +} + +void GLGizmoHollow::set_sla_support_data(ModelObject*, const Selection&) +{ + if (! m_c->selection_info()) + return; + + const ModelObject* mo = m_c->selection_info()->model_object(); + if (m_state == On && mo) { + if (m_old_mo_id != mo->id()) { + reload_cache(); + m_old_mo_id = mo->id(); + } + if (m_c->hollowed_mesh() && m_c->hollowed_mesh()->get_hollowed_mesh()) + m_holes_in_drilled_mesh = mo->sla_drain_holes; + } +} + + + +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 + && (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; + } + + glsafe(::glEnable(GL_BLEND)); + glsafe(::glEnable(GL_DEPTH_TEST)); + + if (m_quadric != nullptr && selection.is_from_single_instance()) + render_points(selection, false); + + m_selection_rectangle.render(m_parent); + m_c->object_clipper()->render_cut(); + m_c->supports_clipper()->render_cut(); + + glsafe(::glDisable(GL_BLEND)); +} + + +void GLGizmoHollow::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); +} + +void GLGizmoHollow::render_points(const Selection& selection, bool picking) const +{ + if (!picking) + glsafe(::glEnable(GL_LIGHTING)); + + 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(); + + glsafe(::glPushMatrix()); + glsafe(::glTranslated(0.0, 0.0, m_c->selection_info()->get_sla_shift())); + glsafe(::glMultMatrixd(instance_matrix.data())); + + float render_color[4]; + 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 = drain_holes[i]; + const bool& point_selected = m_selected[i]; + + if (is_mesh_point_clipped(drain_hole.pos.cast())) + continue; + + // First decide about the color of the point. + if (picking) { + std::array color = picking_color_component(i); + render_color[0] = color[0]; + render_color[1] = color[1]; + render_color[2] = color[2]; + render_color[3] = color[3]; + } + else { + render_color[3] = 1.f; + if (size_t(m_hover_id) == i) { + render_color[0] = 0.f; + render_color[1] = 1.0f; + render_color[2] = 1.0f; + } + else { // neigher hover nor picking + render_color[0] = point_selected ? 1.0f : 0.7f; + render_color[1] = point_selected ? 0.3f : 0.7f; + render_color[2] = point_selected ? 0.3f : 0.7f; + render_color[3] = 0.5f; + } + } + glsafe(::glColor4fv(render_color)); + float render_color_emissive[4] = { 0.5f * render_color[0], 0.5f * render_color[1], 0.5f * render_color[2], 1.f}; + glsafe(::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive)); + + // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2))); + glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); + + if (vol->is_left_handed()) + 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()); + 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 + 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 - sla::HoleStickOutLength)); + glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); + ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); + glsafe(::glPopMatrix()); + + if (vol->is_left_handed()) + glFrontFace(GL_CCW); + glsafe(::glPopMatrix()); + } + + { + // Reset emissive component to zero (the default value) + float render_color_emissive[4] = { 0.f, 0.f, 0.f, 1.f }; + glsafe(::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive)); + } + + if (!picking) + glsafe(::glDisable(GL_LIGHTING)); + + glsafe(::glPopMatrix()); +} + + + +bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const +{ + if (m_c->object_clipper()->get_position() == 0.) + return false; + + 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); +} + + + +// Unprojects the mouse position on the mesh and saves hit point and normal of the facet into pos_and_normal +// Return false if no intersection was found, true otherwise. +bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) +{ + if (! m_c->raycaster()->raycaster()) + return false; + + 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_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->raycaster()->raycaster()->unproject_on_mesh( + mouse_pos, + trafo.get_matrix(), + camera, + hit, + normal, + clp_dist != 0. ? clp : nullptr)) + { + 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. + for (const sla::DrainHole& hole : m_holes_in_drilled_mesh) { + sla::DrainHole outer(hole); + outer.radius *= 1.001f; + outer.height *= 1.001f; + if (outer.is_inside(hit)) + return false; + } + } + + // Return both the point and the facet normal. + pos_and_normal = std::make_pair(hit, normal); + return true; + } + else + return false; +} + +// 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 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) { + if (shift_down || alt_down) { + m_selection_rectangle.start_dragging(mouse_position, shift_down ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect); + } + } + else { + if (m_selected[m_hover_id]) + unselect_point(m_hover_id); + else { + if (!alt_down) + select_point(m_hover_id); + } + } + + return true; + } + + // left down without selection rectangle - place point on the mesh: + if (action == SLAGizmoEventType::LeftDown && !m_selection_rectangle.is_dragging() && !shift_down) { + // If any point is in hover state, this should initiate its move - return control back to GLCanvas: + if (m_hover_id != -1) + return false; + + // If there is some selection, don't add new point and deselect everything instead. + if (m_selection_empty) { + std::pair pos_and_normal; + if (unproject_on_mesh(mouse_position, pos_and_normal)) { // we got an intersection + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add drainage hole"))); + + 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() == mo->sla_drain_holes.size()); + m_parent.set_as_dirty(); + m_wait_for_up_event = true; + } + else + return false; + } + else + select_point(NoPoints); + + return true; + } + + // left up with selection rectangle - select points inside the rectangle: + if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::ShiftUp || action == SLAGizmoEventType::AltUp) && m_selection_rectangle.is_dragging()) { + // Is this a selection or deselection rectangle? + GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state(); + + // First collect positions of all the points in world coordinates. + 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 points; + for (unsigned int i=0; isla_drain_holes.size(); ++i) + points.push_back(trafo.get_matrix() * mo->sla_drain_holes[i].pos.cast()); + + // Now ask the rectangle which of the points are inside. + std::vector points_inside; + std::vector points_idxs = m_selection_rectangle.stop_dragging(m_parent, points); + for (size_t idx : points_idxs) + points_inside.push_back(points[idx].cast()); + + // Only select/deselect points that are actually visible + 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]); + else + select_point(points_idxs[idx]); + } + return true; + } + + // left up with no selection rectangle + if (action == SLAGizmoEventType::LeftUp) { + if (m_wait_for_up_event) { + m_wait_for_up_event = false; + return true; + } + } + + // dragging the selection rectangle: + if (action == SLAGizmoEventType::Dragging) { + if (m_wait_for_up_event) + return true; // point has been placed and the button not released yet + // this prevents GLCanvas from starting scene rotation + + if (m_selection_rectangle.is_dragging()) { + m_selection_rectangle.dragging(mouse_position); + return true; + } + + return false; + } + + if (action == SLAGizmoEventType::Delete) { + // delete key pressed + delete_selected_points(); + return true; + } + + if (action == SLAGizmoEventType::RightDown) { + if (m_hover_id != -1) { + select_point(NoPoints); + select_point(m_hover_id); + delete_selected_points(); + return true; + } + return false; + } + + if (action == SLAGizmoEventType::SelectAll) { + select_point(AllPoints); + return true; + } + + if (action == SLAGizmoEventType::MouseWheelUp && control_down) { + 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) { + 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) { + m_c->object_clipper()->set_position(-1., false); + return true; + } + + return false; +} + +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; idxselection_info()->model_object()->sla_drain_holes; + + if (m_hover_id != -1) { + std::pair pos_and_normal; + if (! unproject_on_mesh(data.mouse_pos.cast(), pos_and_normal)) + return; + drain_holes[m_hover_id].pos = pos_and_normal.first; + drain_holes[m_hover_id].normal = -pos_and_normal.second; + } +} + + +void GLGizmoHollow::hollow_mesh(bool postpone_error_messages) +{ + wxGetApp().CallAfter([this, postpone_error_messages]() { + wxGetApp().plater()->reslice_SLA_hollowing( + *m_c->selection_info()->model_object(), postpone_error_messages); + }); +} + + +std::vector> +GLGizmoHollow::get_config_options(const std::vector& keys) const +{ + std::vector> out; + const ModelObject* mo = m_c->selection_info()->model_object(); + + if (! mo) + return out; + + const DynamicPrintConfig& object_cfg = mo->config.get(); + const DynamicPrintConfig& print_cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; + std::unique_ptr default_cfg = nullptr; + + for (const std::string& key : keys) { + if (object_cfg.has(key)) + out.emplace_back(object_cfg.option(key), &object_cfg.def()->options.at(key)); // at() needed for const map + else + if (print_cfg.has(key)) + out.emplace_back(print_cfg.option(key), &print_cfg.def()->options.at(key)); + else { // we must get it from defaults + if (default_cfg == nullptr) + default_cfg.reset(DynamicPrintConfig::new_from_defaults_keys(keys)); + out.emplace_back(default_cfg->option(key), &default_cfg->def()->options.at(key)); + } + } + + return out; +} + + +void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit) +{ + 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, + // so it is not delayed until the background process finishes. + + ConfigOptionMode current_mode = wxGetApp().get_mode(); + + std::vector opts_keys = {"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"}; + auto opts = get_config_options(opts_keys); + auto* offset_cfg = static_cast(opts[0].first); + float offset = offset_cfg->value; + double offset_min = opts[0].second->min; + double offset_max = opts[0].second->max; + + auto* quality_cfg = static_cast(opts[1].first); + float quality = quality_cfg->value; + double quality_min = opts[1].second->min; + double quality_max = opts[1].second->max; + ConfigOptionMode quality_mode = opts[1].second->mode; + + auto* closing_d_cfg = static_cast(opts[2].first); + float closing_d = closing_d_cfg->value; + double closing_d_min = opts[2].second->min; + double closing_d_max = opts[2].second->max; + ConfigOptionMode closing_d_mode = opts[2].second->mode; + + m_desc["offset"] = _(opts[0].second->label) + ":"; + m_desc["quality"] = _(opts[1].second->label) + ":"; + m_desc["closing_distance"] = _(opts[2].second->label) + ":"; + + +RENDER_AGAIN: + const float approx_height = m_imgui->scaled(20.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 settings_sliders_left = + std::max({m_imgui->calc_text_size(m_desc.at("offset")).x, + m_imgui->calc_text_size(m_desc.at("quality")).x, + m_imgui->calc_text_size(m_desc.at("closing_distance")).x, + m_imgui->calc_text_size(m_desc.at("hole_diameter")).x, + m_imgui->calc_text_size(m_desc.at("hole_depth")).x}) + + m_imgui->scaled(1.f); + + 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 diameter_slider_left = settings_sliders_left; //m_imgui->calc_text_size(m_desc.at("hole_diameter")).x + m_imgui->scaled(1.f); + const float minimal_slider_width = m_imgui->scaled(4.f); + + float window_width = minimal_slider_width + std::max({settings_sliders_left, clipping_slider_left, diameter_slider_left}); + window_width = std::max(window_width, m_imgui->calc_text_size(m_desc.at("preview")).x); + + if (m_imgui->button(m_desc["preview"])) + hollow_mesh(); + + bool config_changed = false; + + ImGui::Separator(); + + { + auto opts = get_config_options({"hollowing_enable"}); + m_enable_hollowing = static_cast(opts[0].first)->value; + if (m_imgui->checkbox(m_desc["enable"], m_enable_hollowing)) { + mo->config.set("hollowing_enable", m_enable_hollowing); + wxGetApp().obj_list()->update_and_show_object_settings_item(); + config_changed = true; + } + } + + m_imgui->disabled_begin(! m_enable_hollowing); + float max_tooltip_width = ImGui::GetFontSize() * 20.0f; + m_imgui->text(m_desc.at("offset")); + ImGui::SameLine(settings_sliders_left); + ImGui::PushItemWidth(window_width - settings_sliders_left); + ImGui::SliderFloat(" ", &offset, offset_min, offset_max, "%.1f mm"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(max_tooltip_width); + ImGui::TextUnformatted((_utf8(opts[0].second->tooltip)).c_str()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } + bool slider_clicked = ImGui::IsItemClicked(); // someone clicked the slider + bool slider_edited = ImGui::IsItemEdited(); // someone is dragging the slider + bool slider_released = ImGui::IsItemDeactivatedAfterEdit(); // someone has just released the slider + + if (current_mode >= quality_mode) { + m_imgui->text(m_desc.at("quality")); + ImGui::SameLine(settings_sliders_left); + ImGui::SliderFloat(" ", &quality, quality_min, quality_max, "%.1f"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(max_tooltip_width); + ImGui::TextUnformatted((_utf8(opts[1].second->tooltip)).c_str()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } + slider_clicked |= ImGui::IsItemClicked(); + slider_edited |= ImGui::IsItemEdited(); + slider_released |= ImGui::IsItemDeactivatedAfterEdit(); + } + + if (current_mode >= closing_d_mode) { + m_imgui->text(m_desc.at("closing_distance")); + ImGui::SameLine(settings_sliders_left); + ImGui::SliderFloat(" ", &closing_d, closing_d_min, closing_d_max, "%.1f mm"); + if (ImGui::IsItemHovered()) { + ImGui::BeginTooltip(); + ImGui::PushTextWrapPos(max_tooltip_width); + ImGui::TextUnformatted((_utf8(opts[2].second->tooltip)).c_str()); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } + slider_clicked |= ImGui::IsItemClicked(); + slider_edited |= ImGui::IsItemEdited(); + slider_released |= ImGui::IsItemDeactivatedAfterEdit(); + } + + if (slider_clicked) { + m_offset_stash = offset; + m_quality_stash = quality; + m_closing_d_stash = closing_d; + } + if (slider_edited || slider_released) { + if (slider_released) { + 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"))); + } + 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; + } + } + + m_imgui->disabled_end(); + + bool force_refresh = false; + bool remove_selected = false; + bool remove_all = false; + + ImGui::Separator(); + + float diameter_upper_cap = 15.; + if (m_new_hole_radius > diameter_upper_cap) + m_new_hole_radius = diameter_upper_cap; + m_imgui->text(m_desc.at("hole_diameter")); + ImGui::SameLine(diameter_slider_left); + ImGui::PushItemWidth(window_width - diameter_slider_left); + + float diam = 2.f * m_new_hole_radius; + ImGui::SliderFloat("", &diam, 1.f, diameter_upper_cap, "%.1f mm"); + m_new_hole_radius = diam / 2.f; + bool clicked = ImGui::IsItemClicked(); + bool edited = ImGui::IsItemEdited(); + bool deactivated = ImGui::IsItemDeactivatedAfterEdit(); + + m_imgui->text(m_desc["hole_depth"]); + ImGui::SameLine(diameter_slider_left); + ImGui::SliderFloat(" ", &m_new_hole_height, 0.f, 10.f, "%.1f mm"); + + clicked |= ImGui::IsItemClicked(); + edited |= ImGui::IsItemEdited(); + deactivated |= ImGui::IsItemDeactivatedAfterEdit(); + + // Following is a nasty way to: + // - save the initial value of the slider before one starts messing with it + // - keep updating the head radius during sliding so it is continuosly refreshed in 3D scene + // - take correct undo/redo snapshot after the user is done with moving the slider + if (! m_selection_empty) { + if (clicked) { + m_holes_stash = mo->sla_drain_holes; + } + if (edited) { + for (size_t idx=0; idxsla_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 = 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; isla_drain_holes = new_holes; + } + } + + m_imgui->disabled_begin(m_selection_empty); + remove_selected = m_imgui->button(m_desc.at("remove_selected")); + m_imgui->disabled_end(); + + 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->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); + + // make sure supports are shown/hidden as appropriate + 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; + } + + m_imgui->end(); + + + if (remove_selected || remove_all) { + force_refresh = false; + m_parent.set_as_dirty(); + + if (remove_all) { + select_point(AllPoints); + delete_selected_points(); + } + if (remove_selected) + delete_selected_points(); + + if (first_run) { + first_run = false; + goto RENDER_AGAIN; + } + } + + if (force_refresh) + m_parent.set_as_dirty(); + + if (config_changed) + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_FORCE_UPDATE)); +} + +bool GLGizmoHollow::on_is_activable() const +{ + const Selection& selection = m_parent.get_selection(); + + if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA + || !selection.is_from_single_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 && selection.get_volume(idx)->composite_id.volume_id >= 0) + return false; + + return true; +} + +bool GLGizmoHollow::on_is_selectable() const +{ + return (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA); +} + +std::string GLGizmoHollow::on_get_name() const +{ + return (_(L("Hollow and drill")) + " [H]").ToUTF8().data(); +} + + +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() +{ + if (m_state == m_old_state) + return; + + if (m_state == Off && m_old_state != Off) // the gizmo was just turned Off + m_parent.post_event(SimpleEvent(EVT_GLCANVAS_FORCE_UPDATE)); + m_old_state = m_state; +} + + + +void GLGizmoHollow::on_start_dragging() +{ + if (m_hover_id != -1) { + select_point(NoPoints); + select_point(m_hover_id); + m_hole_before_drag = m_c->selection_info()->model_object()->sla_drain_holes[m_hover_id].pos; + } + else + m_hole_before_drag = Vec3f::Zero(); +} + + +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 = 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 + { + drain_holes[m_hover_id].pos = m_hole_before_drag; + Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Move drainage hole"))); + drain_holes[m_hover_id].pos = backup; + } + } + m_hole_before_drag = Vec3f::Zero(); +} + + + +void GLGizmoHollow::on_load(cereal::BinaryInputArchive& ar) +{ + ar(m_new_hole_radius, + m_new_hole_height, + m_selected, + m_selection_empty + ); +} + + + +void GLGizmoHollow::on_save(cereal::BinaryOutputArchive& ar) const +{ + ar(m_new_hole_radius, + m_new_hole_height, + m_selected, + m_selection_empty + ); +} + + + +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 = drain_holes[0].radius; + m_new_hole_height = drain_holes[0].height; + } + } + else { + while (size_t(i) >= m_selected.size()) + m_selected.push_back(false); + m_selected[i] = true; + m_selection_empty = false; + m_new_hole_radius = drain_holes[i].radius; + m_new_hole_height = drain_holes[i].height; + } +} + + +void GLGizmoHollow::unselect_point(int i) +{ + m_selected[i] = false; + m_selection_empty = true; + for (const bool sel : m_selected) { + if (sel) { + m_selection_empty = false; + break; + } + } +} + +void GLGizmoHollow::reload_cache() +{ + m_selected.clear(); + m_selected.assign(m_c->selection_info()->model_object()->sla_drain_holes.size(), false); +} + + +void GLGizmoHollow::on_set_hover_id() +{ + if (int(m_c->selection_info()->model_object()->sla_drain_holes.size()) <= m_hover_id) + m_hover_id = -1; +} + + + + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp new file mode 100644 index 0000000000..5d34f04d6f --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp @@ -0,0 +1,113 @@ +#ifndef slic3r_GLGizmoHollow_hpp_ +#define slic3r_GLGizmoHollow_hpp_ + +#include "GLGizmoBase.hpp" +#include "slic3r/GUI/GLSelectionRectangle.hpp" + +#include +#include +#include + +#include + + +namespace Slic3r { + +class ConfigOption; +class ConfigOptionDef; + +namespace GUI { + +enum class SLAGizmoEventType : unsigned char; + +class GLGizmoHollow : public GLGizmoBase +{ +private: + bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal); + + GLUquadricObj* m_quadric; + + +public: + GLGizmoHollow(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id); + ~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(); + bool is_selection_rectangle_dragging() const { + return m_selection_rectangle.is_dragging(); + } + +private: + bool on_init() override; + void on_update(const UpdateData& data) override; + void on_render() const override; + void on_render_for_picking() const override; + + void render_points(const Selection& selection, bool picking = false) const; + void hollow_mesh(bool postpone_error_messages = false); + bool unsaved_changes() const; + + 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 m_selected; // which holes are currently selected + + bool m_enable_hollowing = true; + + // Stashes to keep data for undo redo. Is taken after the editing + // is done, the data are updated continuously. + float m_offset_stash = 3.0f; + float m_quality_stash = 0.5f; + float m_closing_d_stash = 2.f; + Vec3f m_hole_before_drag = Vec3f::Zero(); + sla::DrainHoles m_holes_in_drilled_mesh; + + sla::DrainHoles m_holes_stash; + + // 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 m_desc; + + GLSelectionRectangle m_selection_rectangle; + + bool m_wait_for_up_event = false; + 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) + + std::vector> get_config_options(const std::vector& keys) const; + bool is_mesh_point_clipped(const Vec3d& point) const; + + // Methods that do the model_object and editing cache synchronization, + // editing mode selection, etc: + enum { + AllPoints = -2, + NoPoints, + }; + void select_point(int i); + void unselect_point(int i); + void reload_cache(); + +protected: + void on_set_state() override; + void on_set_hover_id() override; + 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; + bool on_is_selectable() const override; + void on_load(cereal::BinaryInputArchive& ar) override; + void on_save(cereal::BinaryOutputArchive& ar) const override; +}; + + + +} // namespace GUI +} // namespace Slic3r + +#endif // slic3r_GLGizmoHollow_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp index 862ffe41af..f349776ab3 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.cpp @@ -31,6 +31,22 @@ GLGizmoMove3D::~GLGizmoMove3D() ::gluDeleteQuadric(m_quadric); } +std::string GLGizmoMove3D::get_tooltip() const +{ + const Selection& selection = m_parent.get_selection(); + bool show_position = selection.is_single_full_instance(); + const Vec3d& position = selection.get_bounding_box().center(); + + if (m_hover_id == 0 || m_grabbers[0].dragging) + return "X: " + format(show_position ? position(0) : m_displacement(0), 2); + else if (m_hover_id == 1 || m_grabbers[1].dragging) + return "Y: " + format(show_position ? position(1) : m_displacement(1), 2); + else if (m_hover_id == 2 || m_grabbers[2].dragging) + return "Z: " + format(show_position ? position(2) : m_displacement(2), 2); + else + return ""; +} + bool GLGizmoMove3D::on_init() { for (int i = 0; i < 3; ++i) @@ -48,6 +64,11 @@ std::string GLGizmoMove3D::on_get_name() const return (_(L("Move")) + " [M]").ToUTF8().data(); } +bool GLGizmoMove3D::on_is_activable() const +{ + return !m_parent.get_selection().is_empty(); +} + void GLGizmoMove3D::on_start_dragging() { if (m_hover_id != -1) @@ -80,22 +101,6 @@ void GLGizmoMove3D::on_render() const { const Selection& selection = m_parent.get_selection(); - bool show_position = selection.is_single_full_instance(); - const Vec3d& position = selection.get_bounding_box().center(); - - if ((show_position && (m_hover_id == 0)) || m_grabbers[0].dragging) - set_tooltip("X: " + format(show_position ? position(0) : m_displacement(0), 2)); - else if (!m_grabbers[0].dragging && (m_hover_id == 0)) - set_tooltip("X"); - else if ((show_position && (m_hover_id == 1)) || m_grabbers[1].dragging) - set_tooltip("Y: " + format(show_position ? position(1) : m_displacement(1), 2)); - else if (!m_grabbers[1].dragging && (m_hover_id == 1)) - set_tooltip("Y"); - else if ((show_position && (m_hover_id == 2)) || m_grabbers[2].dragging) - set_tooltip("Z: " + format(show_position ? position(2) : m_displacement(2), 2)); - else if (!m_grabbers[2].dragging && (m_hover_id == 2)) - set_tooltip("Z"); - glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glEnable(GL_DEPTH_TEST)); @@ -166,25 +171,6 @@ void GLGizmoMove3D::on_render_for_picking() const render_grabber_extension(Z, box, true); } -#if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI -void GLGizmoMove3D::on_render_input_window(float x, float y, float bottom_limit) -{ - const Selection& selection = m_parent.get_selection(); - bool show_position = selection.is_single_full_instance(); - const Vec3d& position = selection.get_bounding_box().center(); - - Vec3d displacement = show_position ? position : m_displacement; - wxString label = show_position ? _(L("Position (mm)")) : _(L("Displacement (mm)")); - - m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - m_imgui->set_next_window_bg_alpha(0.5f); - m_imgui->begin(label, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - m_imgui->input_vec3("", displacement, 100.0f, "%.2f"); - - m_imgui->end(); -} -#endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI - double GLGizmoMove3D::calc_projection(const UpdateData& data) const { double projection = 0.0; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp index 21b1d397be..5a4275b7fc 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoMove.hpp @@ -30,17 +30,17 @@ public: const Vec3d& get_displacement() const { return m_displacement; } + std::string get_tooltip() const override; + protected: virtual bool on_init(); virtual std::string on_get_name() const; + virtual bool on_is_activable() const; virtual void on_start_dragging(); virtual void on_stop_dragging(); virtual void on_update(const UpdateData& data); virtual void on_render() const; virtual void on_render_for_picking() const; -#if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI - virtual void on_render_input_window(float x, float y, float bottom_limit); -#endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI private: double calc_projection(const UpdateData& data) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp new file mode 100644 index 0000000000..819d014e81 --- /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 + +#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.stl.facet_start[i].normal.cast()); + 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 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 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 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(); + + 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& 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::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(), 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()).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 cnts; + + ::glScalef(1.01f, 1.01f, 1.01f); + + for (int tr_id=0; tr_idpush_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 0000000000..6f8cbec603 --- /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 + + + + +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 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> 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& 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 9a2c72633e..c5060a88ed 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 +#include "slic3r/GUI/GUI_App.hpp" +#include "slic3r/GUI/GUI.hpp" +#include "libslic3r/PresetBundle.hpp" + +#include "libslic3r/SLA/Rotfinder.hpp" namespace Slic3r { namespace GUI { @@ -67,6 +73,18 @@ void GLGizmoRotate::set_angle(double angle) m_angle = angle; } +std::string GLGizmoRotate::get_tooltip() const +{ + std::string axis; + switch (m_axis) + { + case X: { axis = "X"; break; } + case Y: { axis = "Y"; break; } + case Z: { axis = "Z"; break; } + } + return (m_hover_id == 0 || m_grabbers[0].dragging) ? axis + ": " + format((float)Geometry::rad2deg(m_angle), 4) : ""; +} + bool GLGizmoRotate::on_init() { m_grabbers.push_back(Grabber()); @@ -127,19 +145,7 @@ void GLGizmoRotate::on_render() const const Selection& selection = m_parent.get_selection(); const BoundingBoxf3& box = selection.get_bounding_box(); - std::string axis; - switch (m_axis) - { - case X: { axis = "X"; break; } - case Y: { axis = "Y"; break; } - case Z: { axis = "Z"; break; } - } - - if (!m_dragging && (m_hover_id == 0)) - set_tooltip(axis); - else if (m_dragging) - set_tooltip(axis + ": " + format((float)Geometry::rad2deg(m_angle), 4) + "\u00B0"); - else + if (m_hover_id != 0 && !m_grabbers[0].dragging) { m_center = box.center(); m_radius = Offset + box.radius(); @@ -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); @@ -449,6 +461,11 @@ std::string GLGizmoRotate3D::on_get_name() const return (_(L("Rotate")) + " [R]").ToUTF8().data(); } +bool GLGizmoRotate3D::on_is_activable() const +{ + return !m_parent.get_selection().is_empty(); +} + void GLGizmoRotate3D::on_start_dragging() { if ((0 <= m_hover_id) && (m_hover_id < 3)) @@ -475,21 +492,5 @@ void GLGizmoRotate3D::on_render() const m_gizmos[Z].render(); } -#if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI -void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limit) -{ - Vec3d rotation(Geometry::rad2deg(m_gizmos[0].get_angle()), Geometry::rad2deg(m_gizmos[1].get_angle()), Geometry::rad2deg(m_gizmos[2].get_angle())); - wxString label = _(L("Rotation (deg)")); - - m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - m_imgui->set_next_window_bg_alpha(0.5f); - m_imgui->begin(label, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - m_imgui->input_vec3("", rotation, 100.0f, "%.2f"); - m_imgui->end(); -} -#endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI - - - } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp index c856e5465c..126c97b1dd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp @@ -49,13 +49,15 @@ public: double get_angle() const { return m_angle; } void set_angle(double angle); + 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; @@ -81,53 +83,61 @@ public: Vec3d get_rotation() const { return Vec3d(m_gizmos[X].get_angle(), m_gizmos[Y].get_angle(), m_gizmos[Z].get_angle()); } void set_rotation(const Vec3d& rotation) { m_gizmos[X].set_angle(rotation(0)); m_gizmos[Y].set_angle(rotation(1)); m_gizmos[Z].set_angle(rotation(2)); } + std::string get_tooltip() const override + { + std::string tooltip = m_gizmos[X].get_tooltip(); + if (tooltip.empty()) + tooltip = m_gizmos[Y].get_tooltip(); + if (tooltip.empty()) + tooltip = m_gizmos[Z].get_tooltip(); + return tooltip; + } + 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 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(); } } -#if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI - virtual void on_render_input_window(float x, float y, float bottom_limit); -#endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI + + void on_render_input_window(float x, float y, float bottom_limit) override; }; - - } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp index a685fb7742..fa2069d0ab 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp @@ -20,6 +20,37 @@ GLGizmoScale3D::GLGizmoScale3D(GLCanvas3D& parent, const std::string& icon_filen { } +std::string GLGizmoScale3D::get_tooltip() const +{ + const Selection& selection = m_parent.get_selection(); + + bool single_instance = selection.is_single_full_instance(); + bool single_volume = selection.is_single_modifier() || selection.is_single_volume(); + + Vec3f scale = 100.0f * Vec3f::Ones(); + if (single_instance) + scale = 100.0f * selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_scaling_factor().cast(); + else if (single_volume) + scale = 100.0f * selection.get_volume(*selection.get_volume_idxs().begin())->get_volume_scaling_factor().cast(); + + if (m_hover_id == 0 || m_hover_id == 1 || m_grabbers[0].dragging || m_grabbers[1].dragging) + return "X: " + format(scale(0), 4) + "%"; + else if (m_hover_id == 2 || m_hover_id == 3 || m_grabbers[2].dragging || m_grabbers[3].dragging) + return "Y: " + format(scale(1), 4) + "%"; + else if (m_hover_id == 4 || m_hover_id == 5 || m_grabbers[4].dragging || m_grabbers[5].dragging) + return "Z: " + format(scale(2), 4) + "%"; + else if (m_hover_id == 6 || m_hover_id == 7 || m_hover_id == 8 || m_hover_id == 9 || + m_grabbers[6].dragging || m_grabbers[7].dragging || m_grabbers[8].dragging || m_grabbers[9].dragging) + { + std::string tooltip = "X: " + format(scale(0), 4) + "%\n"; + tooltip += "Y: " + format(scale(1), 4) + "%\n"; + tooltip += "Z: " + format(scale(2), 4) + "%"; + return tooltip; + } + else + return ""; +} + bool GLGizmoScale3D::on_init() { for (int i = 0; i < 10; ++i) @@ -49,7 +80,8 @@ std::string GLGizmoScale3D::on_get_name() const bool GLGizmoScale3D::on_is_activable() const { - return !m_parent.get_selection().is_wipe_tower(); + const Selection& selection = m_parent.get_selection(); + return !selection.is_empty() && !selection.is_wipe_tower(); } void GLGizmoScale3D::on_start_dragging() @@ -88,37 +120,6 @@ void GLGizmoScale3D::on_render() 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) - scale = 100.0f * selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_scaling_factor().cast(); - else if (single_volume) - scale = 100.0f * selection.get_volume(*selection.get_volume_idxs().begin())->get_volume_scaling_factor().cast(); - - if ((single_selection && ((m_hover_id == 0) || (m_hover_id == 1))) || m_grabbers[0].dragging || m_grabbers[1].dragging) - set_tooltip("X: " + format(scale(0), 4) + "%"); - else if (!m_grabbers[0].dragging && !m_grabbers[1].dragging && ((m_hover_id == 0) || (m_hover_id == 1))) - set_tooltip("X"); - else if ((single_selection && ((m_hover_id == 2) || (m_hover_id == 3))) || m_grabbers[2].dragging || m_grabbers[3].dragging) - set_tooltip("Y: " + format(scale(1), 4) + "%"); - else if (!m_grabbers[2].dragging && !m_grabbers[3].dragging && ((m_hover_id == 2) || (m_hover_id == 3))) - set_tooltip("Y"); - else if ((single_selection && ((m_hover_id == 4) || (m_hover_id == 5))) || m_grabbers[4].dragging || m_grabbers[5].dragging) - set_tooltip("Z: " + format(scale(2), 4) + "%"); - else if (!m_grabbers[4].dragging && !m_grabbers[5].dragging && ((m_hover_id == 4) || (m_hover_id == 5))) - set_tooltip("Z"); - else if ((single_selection && ((m_hover_id == 6) || (m_hover_id == 7) || (m_hover_id == 8) || (m_hover_id == 9))) - || m_grabbers[6].dragging || m_grabbers[7].dragging || m_grabbers[8].dragging || m_grabbers[9].dragging) - { - std::string tooltip = "X: " + format(scale(0), 4) + "%\n"; - tooltip += "Y: " + format(scale(1), 4) + "%\n"; - tooltip += "Z: " + format(scale(2), 4) + "%"; - set_tooltip(tooltip); - } - else if (!m_grabbers[6].dragging && !m_grabbers[7].dragging && !m_grabbers[8].dragging && !m_grabbers[9].dragging && - ((m_hover_id == 6) || (m_hover_id == 7) || (m_hover_id == 8) || (m_hover_id == 9))) - set_tooltip("X/Y/Z"); glsafe(::glClear(GL_DEPTH_BUFFER_BIT)); glsafe(::glEnable(GL_DEPTH_TEST)); @@ -284,21 +285,6 @@ void GLGizmoScale3D::on_render_for_picking() const render_grabbers_for_picking(m_parent.get_selection().get_bounding_box()); } -#if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI -void GLGizmoScale3D::on_render_input_window(float x, float y, float bottom_limit) -{ - const Selection& selection = m_parent.get_selection(); - bool single_instance = selection.is_single_full_instance(); - wxString label = _(L("Scale (%)")); - - m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - m_imgui->set_next_window_bg_alpha(0.5f); - m_imgui->begin(label, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse); - m_imgui->input_vec3("", m_scale * 100.f, 100.0f, "%.2f"); - m_imgui->end(); -} -#endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI - void GLGizmoScale3D::render_grabbers_connection(unsigned int id_1, unsigned int id_2) const { unsigned int grabbers_count = (unsigned int)m_grabbers.size(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp index 7b77fe5599..0d8f3f7fa7 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 { @@ -42,6 +44,8 @@ public: const Vec3d& get_offset() const { return m_offset; } + std::string get_tooltip() const override; + protected: virtual bool on_init(); virtual std::string on_get_name() const; @@ -50,9 +54,6 @@ protected: virtual void on_update(const UpdateData& data); virtual void on_render() const; virtual void on_render_for_picking() const; -#if !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI - virtual void on_render_input_window(float x, float y, float bottom_limit); -#endif // !DISABLE_MOVE_ROTATE_SCALE_GIZMOS_IMGUI private: void render_grabbers_connection(unsigned int id_1, unsigned int id_2) const; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp new file mode 100644 index 0000000000..266230f11a --- /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 + + +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(*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 0000000000..dfadec0da7 --- /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 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 000ddf8c95..e626aa7f86 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 @@ -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,9 +26,7 @@ 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_clipping_plane.reset(new ClippingPlane(Vec3d::Zero(), 0.)); +{ m_quadric = ::gluNewQuadric(); if (m_quadric != nullptr) // using GLU_FILL does not work when the instance's transformation @@ -63,40 +62,22 @@ bool GLGizmoSlaSupports::on_init() void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const Selection& selection) { - if (! model_object || selection.is_empty()) { - m_model_object = nullptr; + if (! m_c->selection_info()) return; + + ModelObject* mo = m_c->selection_info()->model_object(); + + if (m_state == On && mo && mo->id() != m_old_mo_id) { + disable_editing_mode(); + reload_cache(); + m_old_mo_id = mo->id(); + m_c->instances_hider()->show_supports(true); } - if (m_model_object != model_object || m_model_object_id != model_object->id()) { - m_model_object = model_object; - m_print_object_idx = -1; - } - - m_active_instance = selection.get_instance_idx(); - - if (model_object && selection.is_from_single_instance()) - { - // Cache the bb - it's needed for dealing with the clipping plane quite often - // It could be done inside update_mesh but one has to account for scaling of the instance. - //FIXME calling ModelObject::instance_bounding_box() is expensive! - m_active_instance_bb_radius = m_model_object->instance_bounding_box(m_active_instance).radius(); - - if (is_mesh_update_necessary()) { - update_mesh(); - reload_cache(); - } - - // If we triggered autogeneration before, check backend and fetch results if they are there - if (m_model_object->sla_points_status == sla::PointsStatus::Generating) + // If we triggered autogeneration before, check backend and fetch results if they are there + if (mo) { + if (mo->sla_points_status == sla::PointsStatus::Generating) get_data_from_backend(); - - if (m_state == On) { - m_parent.toggle_model_objects_visibility(false); - m_parent.toggle_model_objects_visibility(true, m_model_object, m_active_instance); - } - else - m_parent.toggle_model_objects_visibility(true, nullptr, -1); } } @@ -104,130 +85,34 @@ 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_model_object does not match selection, ask GLCanvas3D to turn us off + // If current m_c->m_model_object does not match selection, ask GLCanvas3D to turn us off if (m_state == On - && (m_model_object != selection.get_model()->objects[selection.get_object_idx()] - || m_active_instance != selection.get_instance_idx() - || m_model_object_id != 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; } - if (! m_its || ! m_mesh) - const_cast(this)->update_mesh(); - glsafe(::glEnable(GL_BLEND)); glsafe(::glEnable(GL_DEPTH_TEST)); - m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z(); - 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_clipping_plane(const Selection& selection) const -{ - if (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_object_clipper) { - m_object_clipper.reset(new MeshClipper); - m_object_clipper->set_mesh(*m_mesh); - } - m_object_clipper->set_plane(*m_clipping_plane); - 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_print_object_idx < 0 || (int)m_parent.sla_print()->objects().size() != m_print_objects_count) { - m_print_objects_count = m_parent.sla_print()->objects().size(); - m_print_object_idx = -1; - for (const SLAPrintObject* po : m_parent.sla_print()->objects()) { - ++m_print_object_idx; - if (po->model_object()->id() == m_model_object->id()) - break; - } - } - if (m_print_object_idx >= 0) { - const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_print_object_idx]; - - if (print_object->is_step_done(slaposSupportTree)) { - // 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_supports_clipper || (int)timestamp != m_old_timestamp) { - // The timestamp has changed. - m_supports_clipper.reset(new MeshClipper); - // The mesh should already have the shared vertices calculated. - m_supports_clipper->set_mesh(print_object->support_mesh()); - m_old_timestamp = timestamp; - } - m_supports_clipper->set_plane(*m_clipping_plane); - m_supports_clipper->set_transformation(supports_trafo); - } - else - // The supports are not valid. We better dump the cached data. - m_supports_clipper.reset(); - } - - // At this point we have the triangulated cuts for both the object and supports - let's render. - if (! m_object_clipper->get_triangles().empty()) { - ::glPushMatrix(); - ::glColor3f(1.0f, 0.37f, 0.0f); - ::glBegin(GL_TRIANGLES); - for (const Vec3f& point : m_object_clipper->get_triangles()) - ::glVertex3f(point(0), point(1), point(2)); - ::glEnd(); - ::glPopMatrix(); - } - - if (m_supports_clipper && ! 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_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); } @@ -240,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]; @@ -298,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_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()); @@ -327,6 +213,48 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) glsafe(::glMaterialfv(GL_FRONT, GL_EMISSION, render_color_emissive)); } + // Now render the drain holes: + //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->selection_info()->model_object()->sla_drain_holes) { + if (is_mesh_point_clipped(drain_hole.pos.cast())) + continue; + + // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object. + glsafe(::glPushMatrix()); + glsafe(::glTranslatef(drain_hole.pos(0), drain_hole.pos(1), drain_hole.pos(2))); + glsafe(::glMultMatrixd(instance_scaling_matrix_inverse.data())); + + if (vol->is_left_handed()) + 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()); + 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 + 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 - sla::HoleStickOutLength)); + glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f)); + ::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1); + glsafe(::glPopMatrix()); + + if (vol->is_left_handed()) + glFrontFace(GL_CCW); + glsafe(::glPopMatrix()); + } + } + if (!picking) glsafe(::glDisable(GL_LIGHTING)); @@ -337,41 +265,17 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const { - if (m_clipping_plane_distance == 0.f) + if (m_c->object_clipper()->get_position() == 0.) return false; - Vec3d transformed_point = m_model_object->instances.front()->get_transformation().get_matrix() * point; - transformed_point(2) += m_z_shift; - return 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(); - - -bool GLGizmoSlaSupports::is_mesh_update_necessary() const -{ - return ((m_state == On) && (m_model_object != nullptr) && !m_model_object->instances.empty()) - && ((m_model_object->id() != m_model_object_id) || m_its == nullptr); -} - - - -void GLGizmoSlaSupports::update_mesh() -{ - if (! m_model_object) - return; - - wxBusyCursor wait; - // this way we can use that mesh directly. - // This mesh does not account for the possible Z up SLA offset. - m_mesh = &m_model_object->volumes.front()->mesh(); - m_its = &m_mesh->its; - - // If this is different mesh than last time or if the AABB tree is uninitialized, recalculate it. - if (m_model_object_id != m_model_object->id() || ! m_mesh_raycaster) - m_mesh_raycaster.reset(new MeshRaycaster(*m_mesh)); - - m_model_object_id = m_model_object->id(); - disable_editing_mode(); + 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); } @@ -380,26 +284,51 @@ void GLGizmoSlaSupports::update_mesh() // Return false if no intersection was found, true otherwise. bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pair& pos_and_normal) { - // if the gizmo doesn't have the V, F structures for igl, calculate them first: - if (! m_mesh_raycaster) - update_mesh(); + 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_mesh_raycaster->unproject_on_mesh(mouse_pos, trafo.get_matrix(), camera, hit, normal, m_clipping_plane.get())) { - // Return both the point and the facet normal. - pos_and_normal = std::make_pair(hit, normal); - return true; + if (m_c->raycaster()->raycaster()->unproject_on_mesh( + mouse_pos, + trafo.get_matrix(), + camera, + hit, + normal, + 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->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; + } + } + } + if (! in_hole) { + // Return both the point and the facet normal. + pos_and_normal = std::make_pair(hit, normal); + return true; + } } - else - return false; + + return false; } // Following function is called from GLCanvas3D to inform the gizmo about a mouse/keyboard event. @@ -408,6 +337,9 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pairselection_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: @@ -459,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_model_object->instances[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 points; for (unsigned int i=0; i()); @@ -472,7 +404,9 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous points_inside.push_back(points[idx].cast()); // Only select/deselect points that are actually visible - for (size_t idx : m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, 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]); @@ -549,19 +483,21 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous } if (action == SLAGizmoEventType::MouseWheelUp && control_down) { - m_clipping_plane_distance = std::min(1.f, m_clipping_plane_distance + 0.01f); - update_clipping_plane(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_clipping_plane_distance = std::max(0.f, 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; } @@ -584,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) @@ -600,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)); } } } @@ -609,11 +541,12 @@ void GLGizmoSlaSupports::on_update(const UpdateData& data) std::vector GLGizmoSlaSupports::get_config_options(const std::vector& keys) const { std::vector out; + const ModelObject* mo = m_c->selection_info()->model_object(); - if (!m_model_object) + if (! mo) return out; - const DynamicPrintConfig& object_cfg = 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 default_cfg = nullptr; @@ -634,14 +567,6 @@ std::vector GLGizmoSlaSupports::get_config_options(const st } -ClippingPlane GLGizmoSlaSupports::get_sla_clipping_plane() const -{ - if (!m_model_object || m_state == Off || m_clipping_plane_distance == 0.f) - return ClippingPlane::ClipsNothing(); - else - return ClippingPlane(-m_clipping_plane->get_normal(), m_clipping_plane->get_data()[3]); -} - /* void GLGizmoSlaSupports::find_intersecting_facets(const igl::AABB* aabb, const Vec3f& normal, double offset, std::vector& idxs) const @@ -665,7 +590,7 @@ void GLGizmoSlaSupports::find_intersecting_facets(const igl::AABBvolumes.front()->mesh); + TriangleMeshSlicer tms(&m_c->m_model_object->volumes.front()->mesh); Vec3f normal(0.f, 1.f, 1.f); double d = 0.; @@ -686,7 +611,12 @@ void GLGizmoSlaSupports::make_line_segments() const void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_limit) { - if (!m_model_object) + static float last_y = 0.0f; + static float last_h = 0.0f; + + 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, @@ -696,13 +626,23 @@ RENDER_AGAIN: //const ImVec2 window_size(m_imgui->scaled(18.f, 16.f)); //ImGui::SetNextWindowPos(ImVec2(x, y - std::max(0.f, y+window_size.y-bottom_limit) )); //ImGui::SetNextWindowSize(ImVec2(window_size)); - - const float approx_height = m_imgui->scaled(18.0f); - y = std::min(y, bottom_limit - approx_height); - m_imgui->set_next_window_pos(x, y, ImGuiCond_Always); - m_imgui->set_next_window_bg_alpha(0.5f); + m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); + // 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)) + { + // ask canvas for another frame to render the window in the correct position + m_parent.request_extra_frame(); + if (last_h != win_h) + last_h = win_h; + if (last_y != y) + last_y = y; + } + // 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 settings_sliders_left = std::max(m_imgui->calc_text_size(m_desc.at("minimal_distance")).x, m_imgui->calc_text_size(m_desc.at("points_density")).x) + m_imgui->scaled(1.f); @@ -715,7 +655,6 @@ RENDER_AGAIN: float window_width = minimal_slider_width + std::max(std::max(settings_sliders_left, clipping_slider_left), diameter_slider_left); window_width = std::max(std::max(window_width, buttons_width_approx), lock_supports_width_approx); - bool force_refresh = false; bool remove_selected = false; bool remove_all = false; @@ -725,6 +664,7 @@ RENDER_AGAIN: float diameter_upper_cap = static_cast(wxGetApp().preset_bundle->sla_prints.get_edited_preset().config.option("support_pillar_diameter"))->value; if (m_new_point_head_diameter > diameter_upper_cap) m_new_point_head_diameter = diameter_upper_cap; + ImGui::AlignTextToFramePadding(); m_imgui->text(m_desc.at("head_diameter")); ImGui::SameLine(diameter_slider_left); ImGui::PushItemWidth(window_width - diameter_slider_left); @@ -785,6 +725,7 @@ RENDER_AGAIN: } } else { // not in editing mode: + ImGui::AlignTextToFramePadding(); m_imgui->text(m_desc.at("minimal_distance")); ImGui::SameLine(settings_sliders_left); ImGui::PushItemWidth(window_width - settings_sliders_left); @@ -798,6 +739,7 @@ RENDER_AGAIN: bool slider_edited = ImGui::IsItemEdited(); // someone is dragging the slider bool slider_released = ImGui::IsItemDeactivatedAfterEdit(); // someone has just released the slider + ImGui::AlignTextToFramePadding(); m_imgui->text(m_desc.at("points_density")); ImGui::SameLine(settings_sliders_left); @@ -811,15 +753,15 @@ RENDER_AGAIN: m_density_stash = density; } if (slider_edited) { - m_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; - m_model_object->config.opt("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_model_object->config.opt("support_points_minimal_distance", true)->value = m_minimal_point_distance_stash; - m_model_object->config.opt("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_model_object->config.opt("support_points_minimal_distance", true)->value = minimal_point_distance; - m_model_object->config.opt("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(); } @@ -828,7 +770,7 @@ RENDER_AGAIN: if (generate) auto_generate(); - m_imgui->text(""); + ImGui::Separator(); if (m_imgui->button(m_desc.at("manual_editing"))) switch_to_editing_mode(); @@ -837,29 +779,33 @@ RENDER_AGAIN: m_imgui->disabled_end(); // m_imgui->text(""); - // m_imgui->text(m_model_object->sla_points_status == sla::PointsStatus::NoPoints ? _(L("No points (will be autogenerated)")) : - // (m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated ? _(L("Autogenerated points (no modifications)")) : - // (m_model_object->sla_points_status == sla::PointsStatus::UserModified ? _(L("User-modified points")) : - // (m_model_object->sla_points_status == sla::PointsStatus::Generating ? _(L("Generation in progress...")) : "UNKNOWN STATUS")))); + // m_imgui->text(m_c->m_model_object->sla_points_status == sla::PointsStatus::NoPoints ? _(L("No points (will be autogenerated)")) : + // (m_c->m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated ? _(L("Autogenerated points (no modifications)")) : + // (m_c->m_model_object->sla_points_status == sla::PointsStatus::UserModified ? _(L("User-modified points")) : + // (m_c->m_model_object->sla_points_status == sla::PointsStatus::Generating ? _(L("Generation in progress...")) : "UNKNOWN STATUS")))); } // Following is rendered in both editing and non-editing mode: - m_imgui->text(""); - if (m_clipping_plane_distance == 0.f) + 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](){ - 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_clipping_plane_distance, 0.f, 1.f, "%.2f")) - update_clipping_plane(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("?")) { @@ -871,12 +817,6 @@ RENDER_AGAIN: m_imgui->end(); - if (m_editing_mode != m_old_editing_state) { // user toggled between editing/non-editing mode - m_parent.toggle_sla_auxiliaries_visibility(!m_editing_mode, m_model_object, m_active_instance); - force_refresh = true; - } - m_old_editing_state = m_editing_mode; - if (remove_selected || remove_all) { force_refresh = false; m_parent.set_as_dirty(); @@ -930,41 +870,40 @@ 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_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 == 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"))); - if (is_mesh_update_necessary()) - update_mesh(); - - // we'll now reload support points: - if (m_model_object) - reload_cache(); - - m_parent.toggle_model_objects_visibility(false); - if (m_model_object) - m_parent.toggle_model_objects_visibility(true, m_model_object, 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. const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config; m_new_point_head_diameter = static_cast(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_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 @@ -983,14 +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_clipping_plane_distance = 0.f; - // Release clippers and the AABB raycaster. - m_its = nullptr; - m_object_clipper.reset(); - m_supports_clipper.reset(); - m_mesh_raycaster.reset(); + m_old_mo_id = -1; } } m_old_state = m_state; @@ -1030,10 +963,7 @@ void GLGizmoSlaSupports::on_stop_dragging() void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar) { - ar(m_clipping_plane_distance, - *m_clipping_plane, - m_model_object_id, - m_new_point_head_diameter, + ar(m_new_point_head_diameter, m_normal_cache, m_editing_cache, m_selection_empty @@ -1044,10 +974,7 @@ void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar) void GLGizmoSlaSupports::on_save(cereal::BinaryOutputArchive& ar) const { - ar(m_clipping_plane_distance, - *m_clipping_plane, - m_model_object_id, - m_new_point_head_diameter, + ar(m_new_point_head_diameter, m_normal_cache, m_editing_cache, m_selection_empty @@ -1124,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_model_object->sla_points_status = sla::PointsStatus::UserModified; - m_model_object->sla_support_points.clear(); - 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(); } @@ -1136,20 +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_model_object->sla_points_status == sla::PointsStatus::AutoGenerated || 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_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 { + 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_model_object->id()) + if (po->model_object()->id() == mo->id()) return po->is_step_done(slaposSupportPoints); } return false; @@ -1157,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_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_model_object->id()) { + if (po->model_object()->id() == mo->id()) { m_normal_cache.clear(); const std::vector& points = po->get_support_points(); auto mat = po->trafo().inverse().cast(); for (unsigned int i=0; isla_points_status = sla::PointsStatus::AutoGenerated; + mo->sla_points_status = sla::PointsStatus::AutoGenerated; break; } } @@ -1186,15 +1123,17 @@ void GLGizmoSlaSupports::get_data_from_backend() void GLGizmoSlaSupports::auto_generate() { - wxMessageDialog dlg(GUI::wxGetApp().plater(), _(L( - "Autogeneration will erase all manually edited points.\n\n" - "Are you sure you want to do it?\n" - )), _(L("Warning")), wxICON_WARNING | wxYES | wxNO); + wxMessageDialog dlg(GUI::wxGetApp().plater(), + _(L("Autogeneration will erase all manually edited points.")) + "\n\n" + + _(L("Are you sure you want to do it?")) + "\n", + _(L("Warning")), wxICON_WARNING | wxYES | wxNO); - if (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_model_object->sla_points_status = sla::PointsStatus::Generating; + mo->sla_points_status = sla::PointsStatus::Generating; } } @@ -1208,6 +1147,9 @@ void GLGizmoSlaSupports::switch_to_editing_mode() for (const sla::SupportPoint& sp : m_normal_cache) m_editing_cache.emplace_back(sp); select_point(NoPoints); + + m_c->instances_hider()->show_supports(false); + m_parent.set_as_dirty(); } @@ -1216,6 +1158,8 @@ void GLGizmoSlaSupports::disable_editing_mode() if (m_editing_mode) { m_editing_mode = false; wxGetApp().plater()->leave_gizmos_stack(); + m_c->instances_hider()->show_supports(true); + m_parent.set_as_dirty(); } } @@ -1233,18 +1177,6 @@ bool GLGizmoSlaSupports::unsaved_changes() const return false; } - -void GLGizmoSlaSupports::update_clipping_plane(bool keep_normal) const -{ - Vec3d normal = (keep_normal && m_clipping_plane->get_normal() != Vec3d::Zero() ? - m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward()); - - const Vec3d& center = m_model_object->instances[m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift); - float dist = normal.dot(center); - *m_clipping_plane = ClippingPlane(normal, (dist - (-m_active_instance_bb_radius) - m_clipping_plane_distance * 2*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 15b2df80ea..f9cf2f9352 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp @@ -4,45 +4,30 @@ #include "GLGizmoBase.hpp" #include "slic3r/GUI/GLSelectionRectangle.hpp" -#include "libslic3r/SLA/SLACommon.hpp" +#include "libslic3r/SLA/SupportPoint.hpp" +#include "libslic3r/ObjectID.hpp" #include #include namespace Slic3r { + +class ConfigOption; + namespace GUI { -class ClippingPlane; -class MeshClipper; -class MeshRaycaster; 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& pos_and_normal); const float RenderPointScale = 1.f; GLUquadricObj* m_quadric; - typedef Eigen::Map> MapMatrixXfUnaligned; - typedef Eigen::Map> MapMatrixXiUnaligned; - - std::unique_ptr m_mesh_raycaster; - const TriangleMesh* m_mesh; - const indexed_triangle_set* m_its; - mutable const TriangleMesh* m_supports_mesh; - mutable std::vector m_triangles; - mutable std::vector m_supports_triangles; - mutable int m_old_timestamp = -1; - mutable int m_print_object_idx = -1; - mutable int m_print_objects_count = -1; class CacheEntry { public: @@ -77,7 +62,7 @@ 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(); } @@ -90,16 +75,11 @@ 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; - bool is_mesh_update_necessary() const; - void update_mesh(); bool unsaved_changes() const; bool m_lock_unique_islands = false; bool m_editing_mode = false; // Is editing mode active? - bool m_old_editing_state = false; // To keep track of whether the user toggled between the modes (needed for imgui refreshes). float m_new_point_head_diameter; // Size of a new point. CacheEntry m_point_before_drag; // undo/redo - so we know what state was edited float m_old_point_head_diameter = 0.; // the same @@ -107,9 +87,7 @@ private: float m_density_stash = 0.f; // and again mutable std::vector m_editing_cache; // a support point and whether it is currently selected std::vector m_normal_cache; // to restore after discarding changes or undo/redo - - float m_clipping_plane_distance = 0.f; - std::unique_ptr 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. @@ -121,11 +99,9 @@ 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) - mutable std::unique_ptr m_object_clipper; - mutable std::unique_ptr m_supports_clipper; - std::vector get_config_options(const std::vector& keys) const; bool is_mesh_point_clipped(const Vec3d& point) const; + bool is_point_in_hole(const Vec3f& pt) const; //void find_intersecting_facets(const igl::AABB* aabb, const Vec3f& normal, double offset, std::vector& out) const; // Methods that do the model_object and editing cache synchronization, @@ -143,8 +119,6 @@ private: void auto_generate(); void switch_to_editing_mode(); void disable_editing_mode(); - void reset_clipping_plane_normal() const; - void update_clipping_plane(bool keep_normal = false) const; protected: void on_set_state() override; @@ -161,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 272fa098a3..e8e73959cc 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmos.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmos.hpp @@ -31,6 +31,8 @@ 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" #endif //slic3r_GLGizmos_hpp_ diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp new file mode 100644 index 0000000000..a34c7562e7 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp @@ -0,0 +1,465 @@ +#include "GLGizmosCommon.hpp" + +#include + +#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 + +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(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(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(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(m_data.at(CommonGizmosDataID::Raycaster).get()); + assert(rc); + return rc->is_valid() ? rc : nullptr; +} + +ObjectClipper* CommonGizmosDataPool::object_clipper() const +{ + ObjectClipper* oc = dynamic_cast(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(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 meshes; + const std::vector& 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 Raycaster::raycasters() const +{ + std::vector 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 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 0000000000..aedf782e89 --- /dev/null +++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp @@ -0,0 +1,307 @@ +#ifndef slic3r_GUI_GLGizmosCommon_hpp_ +#define slic3r_GUI_GLGizmosCommon_hpp_ + +#include +#include + +#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> 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 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 raycasters() const; + +protected: + void on_update() override; + void on_release() override; + +private: + std::vector> m_raycasters; + std::vector 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 m_old_meshes; + std::vector> m_clippers; + std::unique_ptr 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 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 25dab03360..e3bb964ad3 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp @@ -2,12 +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 +#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 namespace Slic3r { @@ -20,10 +33,6 @@ GLGizmosManager::GLGizmosManager(GLCanvas3D& parent) , m_enabled(false) , m_icons_texture_dirty(true) , m_current(Undefined) - , m_overlay_icons_size(Default_Icons_Size) - , m_overlay_scale(1.0f) - , m_overlay_border(5.0f) - , m_overlay_gap_y(5.0f) , m_tooltip("") , m_serializing(false) { @@ -53,19 +62,18 @@ size_t GLGizmosManager::get_gizmo_idx_from_mouse(const Vec2d& mouse_pos) const return Undefined; float cnv_h = (float)m_parent.get_canvas_size().get_height(); - float height = get_total_overlay_height(); - float scaled_icons_size = m_overlay_icons_size * m_overlay_scale; - float scaled_border = m_overlay_border * m_overlay_scale; - float scaled_gap_y = m_overlay_gap_y * m_overlay_scale; - float scaled_stride_y = scaled_icons_size + scaled_gap_y; - float top_y = 0.5f * (cnv_h - height) + scaled_border; + float height = get_scaled_total_height(); + float icons_size = m_layout.scaled_icons_size(); + float border = m_layout.scaled_border(); + float stride_y = m_layout.scaled_stride_y(); + float top_y = 0.5f * (cnv_h - height) + border; // is mouse horizontally in the area? - if ((scaled_border <= (float)mouse_pos(0) && ((float)mouse_pos(0) <= scaled_border + scaled_icons_size))) { + if ((border <= (float)mouse_pos(0) && ((float)mouse_pos(0) <= border + icons_size))) { // which icon is it on? - size_t from_top = (size_t)((float)mouse_pos(1) - top_y)/scaled_stride_y; + size_t from_top = (size_t)((float)mouse_pos(1) - top_y) / stride_y; // is it really on the icon or already past the border? - if ((float)mouse_pos(1) <= top_y + from_top*scaled_stride_y + scaled_icons_size) { + if ((float)mouse_pos(1) <= top_y + from_top * stride_y + icons_size) { std::vector selectable = get_selectable_idxs(); if (from_top < selectable.size()) return selectable[from_top]; @@ -88,18 +96,25 @@ bool GLGizmosManager::init() return false; } + // Order of gizmos in the vector must match order in EType! m_gizmos.emplace_back(new GLGizmoMove3D(m_parent, "move.svg", 0)); m_gizmos.emplace_back(new GLGizmoScale3D(m_parent, "scale.svg", 1)); m_gizmos.emplace_back(new GLGizmoRotate3D(m_parent, "rotate.svg", 2)); m_gizmos.emplace_back(new GLGizmoFlatten(m_parent, "place.svg", 3)); m_gizmos.emplace_back(new GLGizmoCut(m_parent, "cut.svg", 4)); - m_gizmos.emplace_back(new GLGizmoSlaSupports(m_parent, "sla_supports.svg", 5)); + 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 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; @@ -110,18 +125,18 @@ bool GLGizmosManager::init() void GLGizmosManager::set_overlay_icon_size(float size) { - if (m_overlay_icons_size != size) + if (m_layout.icons_size != size) { - m_overlay_icons_size = size; + m_layout.icons_size = size; m_icons_texture_dirty = true; } } void GLGizmosManager::set_overlay_scale(float scale) { - if (m_overlay_scale != scale) + if (m_layout.scale != scale) { - m_overlay_scale = scale; + m_layout.scale = scale; m_icons_texture_dirty = true; } } @@ -131,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() @@ -191,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 @@ -200,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()) { @@ -208,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) { @@ -216,13 +241,15 @@ void GLGizmosManager::update_data() set_rotation(Vec3d(0., 0., (M_PI/180.) * dynamic_cast(config.option("wipe_tower_rotation_angle"))->value)); set_flattening_data(nullptr); set_sla_support_data(nullptr); + set_painter_gizmo_data(); } else { set_scale(Vec3d::Ones()); 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(nullptr); + set_sla_support_data(selection.is_from_single_instance() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr); + set_painter_gizmo_data(); } } @@ -345,11 +372,25 @@ void GLGizmosManager::set_flattening_data(const ModelObject* model_object) } void GLGizmosManager::set_sla_support_data(ModelObject* model_object) +{ + if (! m_enabled + || m_gizmos.empty() + || wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA) + return; + + auto* gizmo_hollow = dynamic_cast(m_gizmos[Hollow].get()); + auto* gizmo_supports = dynamic_cast(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(m_gizmos[SlaSupports].get())->set_sla_support_data(model_object, m_parent.get_selection()); + dynamic_cast(m_gizmos[FdmSupports].get())->set_painter_gizmo_data(m_parent.get_selection()); + dynamic_cast(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. @@ -358,15 +399,28 @@ bool GLGizmosManager::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_p if (!m_enabled || m_gizmos.empty()) return false; - return dynamic_cast(m_gizmos[SlaSupports].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + if (m_current == SlaSupports) + return dynamic_cast(m_gizmos[SlaSupports].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + else if (m_current == Hollow) + return dynamic_cast(m_gizmos[Hollow].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + else if (m_current == FdmSupports) + return dynamic_cast(m_gizmos[FdmSupports].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down); + else if (m_current == Seam) + return dynamic_cast(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_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(); - - return dynamic_cast(m_gizmos[SlaSupports].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 @@ -383,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(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(); @@ -402,11 +470,20 @@ void GLGizmosManager::render_overlay() const do_render_overlay(); } +std::string GLGizmosManager::get_tooltip() const +{ + if (!m_tooltip.empty()) + return m_tooltip; + + const GLGizmoBase* curr = get_current(); + return (curr != nullptr) ? curr->get_tooltip() : ""; +} + bool GLGizmosManager::on_mouse_wheel(wxMouseEvent& evt) { bool processed = false; - if (m_current == SlaSupports) { + 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; @@ -427,44 +504,120 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) int selected_object_idx = selection.get_object_idx(); bool processed = false; - // 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(); - } + // 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); - 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; + else if (evt.LeftUp()) { + if (m_mouse_capture.left) { + processed = true; + m_mouse_capture.left = false; + } + 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; } + 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; } +// else +// return 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; + 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) { + pending_right_up = false; + return true; + } + if (m_mouse_capture.right) { + processed = true; + m_mouse_capture.right = false; + } +// else +// return false; + } + 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 if (evt.Dragging() && is_dragging()) { + if (!m_parent.get_wxglcanvas()->HasCapture()) + m_parent.get_wxglcanvas()->CaptureMouse(); - if (get_gizmo_idx_from_mouse(mouse_pos) == Undefined) - { + 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 (control_down) + 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; + } + + if (get_gizmo_idx_from_mouse(mouse_pos) == Undefined) { // mouse is outside the toolbar m_tooltip = ""; - if (evt.LeftDown()) - { - if ((m_current == SlaSupports) && 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()) { @@ -482,132 +635,70 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt) processed = true; } } - else if (evt.RightDown() && (selected_object_idx != -1) && (m_current == SlaSupports) && 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)) - // don't allow dragging objects with the Sla gizmo on + 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_current == SlaSupports) && gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown())) - { + } + 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() && !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; } - 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); } - 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 platter 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; - } - else if (evt.LeftUp() && (m_current == SlaSupports) && !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; } - else if (evt.LeftUp()) - processed = true; } return processed; @@ -633,7 +724,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) #endif /* __APPLE__ */ { // Sla gizmo selects all support points - if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::SelectAll)) + if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::SelectAll)) processed = true; break; @@ -667,7 +758,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) case 'r' : case 'R' : { - if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::ResetClippingPlane)) + if ((m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam) && gizmo_event(SLAGizmoEventType::ResetClippingPlane)) processed = true; break; @@ -679,7 +770,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) case WXK_DELETE: #endif /* __APPLE__ */ { - if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::Delete)) + if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::Delete)) processed = true; break; @@ -700,7 +791,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt) { if ((m_current == SlaSupports) && gizmo_event(SLAGizmoEventType::ManualEditing)) processed = true; - + break; } case 'F': @@ -741,20 +832,31 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) if (evt.GetEventType() == wxEVT_KEY_UP) { - if (m_current == SlaSupports) + if (m_current == SlaSupports || m_current == Hollow) { - GLGizmoSlaSupports* gizmo = dynamic_cast(get_current()); + bool is_editing = true; + bool is_rectangle_dragging = false; + + if (m_current == SlaSupports) { + GLGizmoSlaSupports* gizmo = dynamic_cast(get_current()); + is_editing = gizmo->is_in_editing_mode(); + is_rectangle_dragging = gizmo->is_selection_rectangle_dragging(); + } + else { + GLGizmoHollow* gizmo = dynamic_cast(get_current()); + is_rectangle_dragging = gizmo->is_selection_rectangle_dragging(); + } if (keyCode == WXK_SHIFT) { // shift has been just released - SLA gizmo might want to close rectangular selection. - if (gizmo_event(SLAGizmoEventType::ShiftUp) || (gizmo->is_in_editing_mode() && gizmo->is_selection_rectangle_dragging())) + if (gizmo_event(SLAGizmoEventType::ShiftUp) || (is_editing && is_rectangle_dragging)) processed = true; } else if (keyCode == WXK_ALT) { // alt has been just released - SLA gizmo might want to close rectangular selection. - if (gizmo_event(SLAGizmoEventType::AltUp) || (gizmo->is_in_editing_mode() && gizmo->is_selection_rectangle_dragging())) + if (gizmo_event(SLAGizmoEventType::AltUp) || (is_editing && is_rectangle_dragging)) processed = true; } } @@ -770,6 +872,21 @@ bool GLGizmosManager::on_key(wxKeyEvent& evt) // m_parent.set_cursor(GLCanvas3D::Cross); processed = true; } + else if (m_current == Cut) + { + auto do_move = [this, &processed](double delta_z) { + GLGizmoCut* cut = dynamic_cast(get_current()); + cut->set_cut_z(delta_z + cut->get_cut_z()); + processed = true; + }; + + switch (keyCode) + { + case WXK_NUMPAD_UP: case WXK_UP: { do_move(1.0); break; } + case WXK_NUMPAD_DOWN: case WXK_DOWN: { do_move(-1.0); break; } + default: { break; } + } + } } if (processed) @@ -843,97 +960,84 @@ void GLGizmosManager::render_background(float left, float top, float right, floa void GLGizmosManager::do_render_overlay() const { - if (m_gizmos.empty()) + std::vector selectable_idxs = get_selectable_idxs(); + if (selectable_idxs.empty()) return; 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 = (zoom != 0.0f) ? 1.0f / zoom : 0.0f; + float zoom = (float)wxGetApp().plater()->get_camera().get_zoom(); + float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom(); - float height = get_total_overlay_height(); - float width = get_total_overlay_width(); - float scaled_border = m_overlay_border * m_overlay_scale * inv_zoom; + float height = get_scaled_total_height(); + float width = get_scaled_total_width(); + float zoomed_border = m_layout.scaled_border() * inv_zoom; - float top_x = (-0.5f * cnv_w) * inv_zoom; - float top_y = (0.5f * height) * inv_zoom; + float zoomed_top_x = (-0.5f * cnv_w) * inv_zoom; + float zoomed_top_y = (0.5f * height) * inv_zoom; - float left = top_x; - float top = top_y; - float right = left + width * inv_zoom; - float bottom = top - height * inv_zoom; + float zoomed_left = zoomed_top_x; + float zoomed_top = zoomed_top_y; + float zoomed_right = zoomed_left + width * inv_zoom; + float zoomed_bottom = zoomed_top - height * inv_zoom; - render_background(left, top, right, bottom, scaled_border); + render_background(zoomed_left, zoomed_top, zoomed_right, zoomed_bottom, zoomed_border); - top_x += scaled_border; - top_y -= scaled_border; - float scaled_gap_y = m_overlay_gap_y * m_overlay_scale * inv_zoom; + zoomed_top_x += zoomed_border; + zoomed_top_y -= zoomed_border; + + float icons_size = m_layout.scaled_icons_size(); + float zoomed_icons_size = icons_size * inv_zoom; + float zoomed_stride_y = m_layout.scaled_stride_y() * inv_zoom; - float scaled_icons_size = m_overlay_icons_size * m_overlay_scale * inv_zoom; - float scaled_stride_y = scaled_icons_size + scaled_gap_y; unsigned int icons_texture_id = m_icons_texture.get_id(); int tex_width = m_icons_texture.get_width(); int tex_height = m_icons_texture.get_height(); - float inv_tex_width = (tex_width != 0) ? 1.0f / tex_width : 0.0f; - float inv_tex_height = (tex_height != 0) ? 1.0f / tex_height : 0.0f; - if ((icons_texture_id == 0) || (tex_width <= 0) || (tex_height <= 0)) + if ((icons_texture_id == 0) || (tex_width <= 1) || (tex_height <= 1)) return; - for (size_t idx : get_selectable_idxs()) + float du = (float)(tex_width - 1) / (4.0f * (float)tex_width); // 4 is the number of possible states if the icons + float dv = (float)(tex_height - 1) / (float)(m_gizmos.size() * tex_height); + + // tiles in the texture are spaced by 1 pixel + float u_offset = 1.0f / (float)tex_width; + float v_offset = 1.0f / (float)tex_height; + + for (size_t idx : selectable_idxs) { GLGizmoBase* gizmo = m_gizmos[idx].get(); unsigned int sprite_id = gizmo->get_sprite_id(); - int icon_idx = m_current == idx ? 2 : (m_hover == idx ? 1 : 0); + int icon_idx = (m_current == idx) ? 2 : ((m_hover == idx) ? 1 : (gizmo->is_activable()? 0 : 3)); - float u_icon_size = m_overlay_icons_size * m_overlay_scale * inv_tex_width; - float v_icon_size = m_overlay_icons_size * m_overlay_scale * inv_tex_height; - float v_top = sprite_id * v_icon_size; - float u_left = icon_idx * u_icon_size; - float v_bottom = v_top + v_icon_size; - float u_right = u_left + u_icon_size; + float v_top = v_offset + sprite_id * dv; + float u_left = u_offset + icon_idx * du; + float v_bottom = v_top + dv - v_offset; + float u_right = u_left + du - u_offset; - GLTexture::render_sub_texture(icons_texture_id, top_x, top_x + scaled_icons_size, top_y - scaled_icons_size, top_y, { { u_left, v_bottom }, { u_right, v_bottom }, { u_right, v_top }, { u_left, v_top } }); + 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(); - gizmo->render_input_window(width, 0.5f * cnv_h - top_y * zoom, toolbar_top); + 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); } - top_y -= scaled_stride_y; + zoomed_top_y -= zoomed_stride_y; } } -float GLGizmosManager::get_total_overlay_height() const +float GLGizmosManager::get_scaled_total_height() const { - float scaled_icons_size = m_overlay_icons_size * m_overlay_scale; - float scaled_border = m_overlay_border * m_overlay_scale; - float scaled_gap_y = m_overlay_gap_y * m_overlay_scale; - float scaled_stride_y = scaled_icons_size + scaled_gap_y; - float height = 2.0f * scaled_border; - - /*for (size_t idx=0; idxis_selectable()) - continue; - - height += scaled_stride_y; - }*/ - height += get_selectable_idxs().size() * scaled_stride_y; - - return height - scaled_gap_y; + return m_layout.scale * (2.0f * m_layout.border + (float)get_selectable_idxs().size() * m_layout.stride_y() - m_layout.gap_y); } -float GLGizmosManager::get_total_overlay_width() const +float GLGizmosManager::get_scaled_total_width() const { - return (2.0f * m_overlay_border + m_overlay_icons_size) * m_overlay_scale; + return 2.0f * m_layout.scaled_border() + m_layout.scaled_icons_size(); } GLGizmoBase* GLGizmosManager::get_current() const { - if (m_current==Undefined || m_gizmos.empty()) - return nullptr; - else - return m_gizmos[m_current].get(); + return ((m_current == Undefined) || m_gizmos.empty()) ? nullptr : m_gizmos[m_current].get(); } bool GLGizmosManager::generate_icons_texture() const @@ -951,11 +1055,17 @@ bool GLGizmosManager::generate_icons_texture() const } std::vector> states; - states.push_back(std::make_pair(1, false)); - states.push_back(std::make_pair(0, false)); - states.push_back(std::make_pair(0, true)); + states.push_back(std::make_pair(1, false)); // Activable + states.push_back(std::make_pair(0, false)); // Hovered + states.push_back(std::make_pair(0, true)); // Selected + states.push_back(std::make_pair(2, false)); // Disabled - bool res = m_icons_texture.load_from_svg_files_as_sprites_array(filenames, states, (unsigned int)(m_overlay_icons_size * m_overlay_scale), true); + unsigned int sprite_size_px = (unsigned int)m_layout.scaled_icons_size(); +// // force even size +// if (sprite_size_px % 2 != 0) +// sprite_size_px += 1; + + bool res = m_icons_texture.load_from_svg_files_as_sprites_array(filenames, states, sprite_size_px, false); if (res) m_icons_texture_dirty = false; @@ -1003,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; } diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp index 0defb13483..7f47167e9e 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 @@ -18,6 +20,8 @@ namespace GUI { class GLCanvas3D; class ClippingPlane; +enum class SLAGizmoEventType : unsigned char; +class CommonGizmosDataPool; class Rect { @@ -54,22 +58,42 @@ public: enum EType : unsigned char { + // Order must match index in m_gizmos! Move, Scale, Rotate, Flatten, Cut, + Hollow, SlaSupports, + FdmSupports, + Seam, Undefined }; private: + struct Layout + { + float scale{ 1.0f }; + float icons_size{ Default_Icons_Size }; + float border{ 5.0f }; + float gap_y{ 5.0f }; + + float stride_y() const { return icons_size + gap_y;} + + float scaled_icons_size() const { return scale * icons_size; } + float scaled_border() const { return scale * border; } + float scaled_gap_y() const { return scale * gap_y; } + float scaled_stride_y() const { return scale * stride_y(); } + }; + GLCanvas3D& m_parent; bool m_enabled; std::vector> m_gizmos; mutable GLTexture m_icons_texture; mutable bool m_icons_texture_dirty; BackgroundTexture m_background_texture; + Layout m_layout; EType m_current; EType m_hover; @@ -79,11 +103,6 @@ private: void activate_gizmo(EType type); - float m_overlay_icons_size; - float m_overlay_scale; - float m_overlay_border; - float m_overlay_gap_y; - struct MouseCapture { bool left; @@ -100,6 +119,8 @@ private: MouseCapture m_mouse_capture; std::string m_tooltip; bool m_serializing; + //std::unique_ptr m_common_gizmos_data; + std::unique_ptr m_common_gizmos_data; public: explicit GLGizmosManager(GLCanvas3D& parent); @@ -149,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); @@ -157,6 +179,7 @@ public: void update_data(); EType get_current_type() const { return m_current; } + GLGizmoBase* get_current() const; bool is_running() const; bool handle_shortcut(int key); @@ -180,16 +203,20 @@ 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; - const std::string& get_tooltip() const { return m_tooltip; } + std::string get_tooltip() const; bool on_mouse(wxMouseEvent& evt); bool on_mouse_wheel(wxMouseEvent& evt); @@ -198,14 +225,14 @@ 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; - float get_total_overlay_height() const; - float get_total_overlay_width() const; - - GLGizmoBase* get_current() const; + float get_scaled_total_height() const; + float get_scaled_total_width() const; bool generate_icons_texture() const; @@ -214,6 +241,8 @@ private: bool grabber_contains_mouse() const; }; + + } // namespace GUI } // namespace Slic3r diff --git a/src/slic3r/GUI/I18N.hpp b/src/slic3r/GUI/I18N.hpp index bf3103f771..7bad6880e9 100644 --- a/src/slic3r/GUI/I18N.hpp +++ b/src/slic3r/GUI/I18N.hpp @@ -1,16 +1,18 @@ #ifndef _ -#define _(s) Slic3r::GUI::I18N::translate((s)) +#define _(s) Slic3r::GUI::I18N::translate((s)) +#define _L(s) Slic3r::GUI::I18N::translate((s)) #define _utf8(s) Slic3r::GUI::I18N::translate_utf8((s)) +#define _u8L(s) Slic3r::GUI::I18N::translate_utf8((s)) #endif /* _ */ #ifndef _CTX -#define _CTX(s, ctx) Slic3r::GUI::I18N::translate((s), (ctx)) +#define _CTX(s, ctx) Slic3r::GUI::I18N::translate((s), (ctx)) #define _CTX_utf8(s, ctx) Slic3r::GUI::I18N::translate_utf8((s), (ctx)) #endif /* _ */ #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. @@ -40,21 +42,25 @@ namespace I18N { inline wxString translate(const wchar_t *s) { return wxGetTranslation(s); } inline wxString translate(const std::string &s) { return wxGetTranslation(wxString(s.c_str(), wxConvUTF8)); } inline wxString translate(const std::wstring &s) { return wxGetTranslation(s.c_str()); } + inline wxString translate(const wxString &s) { return wxGetTranslation(s); } inline wxString translate(const char *s, const char *plural, unsigned int n) { return wxGetTranslation(wxString(s, wxConvUTF8), wxString(plural, wxConvUTF8), n); } inline wxString translate(const wchar_t *s, const wchar_t *plural, unsigned int n) { return wxGetTranslation(s, plural, n); } inline wxString translate(const std::string &s, const std::string &plural, unsigned int n) { return wxGetTranslation(wxString(s.c_str(), wxConvUTF8), wxString(plural.c_str(), wxConvUTF8), n); } inline wxString translate(const std::wstring &s, const std::wstring &plural, unsigned int n) { return wxGetTranslation(s.c_str(), plural.c_str(), n); } + inline wxString translate(const wxString &s, const wxString &plural, unsigned int n) { return wxGetTranslation(s, plural, n); } inline std::string translate_utf8(const char *s) { return wxGetTranslation(wxString(s, wxConvUTF8)).ToUTF8().data(); } inline std::string translate_utf8(const wchar_t *s) { return wxGetTranslation(s).ToUTF8().data(); } inline std::string translate_utf8(const std::string &s) { return wxGetTranslation(wxString(s.c_str(), wxConvUTF8)).ToUTF8().data(); } inline std::string translate_utf8(const std::wstring &s) { return wxGetTranslation(s.c_str()).ToUTF8().data(); } + inline std::string translate_utf8(const wxString &s) { return wxGetTranslation(s).ToUTF8().data(); } inline std::string translate_utf8(const char *s, const char *plural, unsigned int n) { return translate(s, plural, n).ToUTF8().data(); } inline std::string translate_utf8(const wchar_t *s, const wchar_t *plural, unsigned int n) { return translate(s, plural, n).ToUTF8().data(); } inline std::string translate_utf8(const std::string &s, const std::string &plural, unsigned int n) { return translate(s, plural, n).ToUTF8().data(); } inline std::string translate_utf8(const std::wstring &s, const std::wstring &plural, unsigned int n) { return translate(s, plural, n).ToUTF8().data(); } + inline std::string translate_utf8(const wxString &s, const wxString &plural, unsigned int n) { return translate(s, plural, n).ToUTF8().data(); } #if wxCHECK_VERSION(3, 1, 1) #define _wxGetTranslation_ctx(S, CTX) wxGetTranslation((S), wxEmptyString, (CTX)) @@ -66,11 +72,13 @@ namespace I18N { inline wxString translate(const wchar_t *s, const char* ctx) { return _wxGetTranslation_ctx(s, ctx); } inline wxString translate(const std::string &s, const char* ctx) { return _wxGetTranslation_ctx(wxString(s.c_str(), wxConvUTF8), ctx); } inline wxString translate(const std::wstring &s, const char* ctx) { return _wxGetTranslation_ctx(s.c_str(), ctx); } + inline wxString translate(const wxString &s, const char* ctx) { return _wxGetTranslation_ctx(s, ctx); } - inline wxString translate_utf8(const char *s, const char* ctx) { return _wxGetTranslation_ctx(wxString(s, wxConvUTF8), ctx).ToUTF8().data(); } - inline wxString translate_utf8(const wchar_t *s, const char* ctx) { return _wxGetTranslation_ctx(s, ctx).ToUTF8().data(); } - inline wxString translate_utf8(const std::string &s, const char* ctx) { return _wxGetTranslation_ctx(wxString(s.c_str(), wxConvUTF8), ctx).ToUTF8().data(); } - inline wxString translate_utf8(const std::wstring &s, const char* ctx) { return _wxGetTranslation_ctx(s.c_str(), ctx).ToUTF8().data(); } + inline std::string translate_utf8(const char *s, const char* ctx) { return _wxGetTranslation_ctx(wxString(s, wxConvUTF8), ctx).ToUTF8().data(); } + inline std::string translate_utf8(const wchar_t *s, const char* ctx) { return _wxGetTranslation_ctx(s, ctx).ToUTF8().data(); } + inline std::string translate_utf8(const std::string &s, const char* ctx) { return _wxGetTranslation_ctx(wxString(s.c_str(), wxConvUTF8), ctx).ToUTF8().data(); } + inline std::string translate_utf8(const std::wstring &s, const char* ctx) { return _wxGetTranslation_ctx(s.c_str(), ctx).ToUTF8().data(); } + inline std::string translate_utf8(const wxString &s, const char* ctx) { return _wxGetTranslation_ctx(s, ctx).ToUTF8().data(); } #undef _wxGetTranslation_ctx } // namespace I18N diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp index 8e4d9eebfa..5da0efa6ed 100644 --- a/src/slic3r/GUI/ImGuiWrapper.cpp +++ b/src/slic3r/GUI/ImGuiWrapper.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -15,17 +16,53 @@ #include +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif #include #include "libslic3r/libslic3r.h" #include "libslic3r/Utils.hpp" -#include "3DScene.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 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 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) @@ -96,7 +133,7 @@ void ImGuiWrapper::set_language(const std::string &language) ranges = ranges_turkish; } else if (lang == "vi") { ranges = ranges_vietnamese; - } else if (lang == "jp") { + } else if (lang == "ja") { ranges = ImGui::GetIO().Fonts->GetGlyphRangesJapanese(); // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs m_font_cjk = true; } else if (lang == "ko") { @@ -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(evt.GetWheelDelta()); + if (wheel_delta != 0.0f) + io.MouseWheel = static_cast(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); @@ -254,6 +299,16 @@ bool ImGuiWrapper::begin(const wxString &name, int flags) return begin(into_u8(name), flags); } +bool ImGuiWrapper::begin(const std::string& name, bool* close, int flags) +{ + return ImGui::Begin(name.c_str(), close, (ImGuiWindowFlags)flags); +} + +bool ImGuiWrapper::begin(const wxString& name, bool* close, int flags) +{ + return begin(into_u8(name), close, flags); +} + void ImGuiWrapper::end() { ImGui::End(); @@ -265,17 +320,34 @@ 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(&value), 0.0f, 0.0f, format.c_str()); } +bool ImGuiWrapper::input_double(const wxString &label, const double &value, const std::string &format) +{ + auto label_utf8 = into_u8(label); + return input_double(label_utf8, value, format); +} + bool ImGuiWrapper::input_vec3(const std::string &label, const Vec3d &value, float width, const std::string &format) { bool value_changed = false; @@ -303,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) @@ -317,16 +389,48 @@ 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); +} + +bool ImGuiWrapper::slider_float(const std::string& label, float* v, float v_min, float v_max, const char* format/* = "%.3f"*/, float power/* = 1.0f*/) +{ + return this->slider_float(label.c_str(), v, v_min, v_max, format, power); +} + +bool ImGuiWrapper::slider_float(const wxString& label, float* v, float v_min, float v_max, const char* format/* = "%.3f"*/, float power/* = 1.0f*/) +{ + auto label_utf8 = into_u8(label); + return this->slider_float(label_utf8.c_str(), v, v_min, v_max, format, power); +} + bool ImGuiWrapper::combo(const wxString& label, const std::vector& options, int& selection) { // this is to force the label to the left of the widget: 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)) { @@ -342,7 +446,40 @@ bool ImGuiWrapper::combo(const wxString& label, const std::vector& 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); @@ -364,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[255]; + 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 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"); @@ -409,27 +854,140 @@ bool ImGuiWrapper::want_any_input() const return io.WantCaptureMouse || io.WantCaptureKeyboard || io.WantTextInput; } +#ifdef __APPLE__ +static const ImWchar ranges_keyboard_shortcuts[] = +{ + 0x21E7, 0x21E7, // OSX Shift Key symbol + 0x2318, 0x2318, // OSX Command Key symbol + 0x2325, 0x2325, // OSX Option Key symbol + 0, +}; +#endif // __APPLE__ + + +std::vector ImGuiWrapper::load_svg(const std::string& bitmap_name, unsigned target_width, unsigned target_height) +{ + std::vector 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 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(); ImGuiIO& io = ImGui::GetIO(); io.Fonts->Clear(); - //FIXME replace with io.Fonts->AddFontFromMemoryTTF(buf_decompressed_data, (int)buf_decompressed_size, m_font_size, nullptr, m_glyph_ranges); + + // Create ranges of characters from m_glyph_ranges, possibly adding some OS specific special characters. + ImVector ranges; + ImFontAtlas::GlyphRangesBuilder builder; + builder.AddRanges(m_glyph_ranges); +#ifdef __APPLE__ + if (m_font_cjk) + // Apple keyboard shortcuts are only contained in the CJK fonts. + builder.AddRanges(ranges_keyboard_shortcuts); +#endif + builder.BuildRanges(&ranges); // Build the final result (ordered ranges with all the unique characters submitted) + + //FIXME replace with io.Fonts->AddFontFromMemoryTTF(buf_decompressed_data, (int)buf_decompressed_size, m_font_size, nullptr, ranges.Data); //https://github.com/ocornut/imgui/issues/220 - ImFont* font = io.Fonts->AddFontFromFileTTF((Slic3r::resources_dir() + "/fonts/" + (m_font_cjk ? "NotoSansCJK-Regular.ttc" : "NotoSans-Regular.ttf")).c_str(), m_font_size, nullptr, m_glyph_ranges); + ImFont* font = io.Fonts->AddFontFromFileTTF((Slic3r::resources_dir() + "/fonts/" + (m_font_cjk ? "NotoSansCJK-Regular.ttc" : "NotoSans-Regular.ttf")).c_str(), m_font_size, nullptr, ranges.Data); 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"); } } +#ifdef __APPLE__ + ImFontConfig config; + config.MergeMode = true; + if (! m_font_cjk) { + // Apple keyboard shortcuts are only contained in the CJK fonts. + ImFont *font_cjk = io.Fonts->AddFontFromFileTTF((Slic3r::resources_dir() + "/fonts/NotoSansCJK-Regular.ttc").c_str(), m_font_size, &config, ranges_keyboard_shortcuts); + assert(font_cjk != nullptr); + } +#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)) { + std::vector 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 = lround(32 * font_scale); // default size of large icon is 32 px + + for (auto icon : font_icons_large) { + if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id)) { + std::vector 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)); @@ -490,21 +1048,16 @@ 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_GREY_DARK = 0x444444ff; - 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_BACKGROUND); + set_color(ImGuiCol_TitleBgActive, COL_ORANGE_DARK); // Generics - set_color(ImGuiCol_TitleBgActive, COL_ORANGE_DARK); set_color(ImGuiCol_FrameBg, COL_GREY_DARK); set_color(ImGuiCol_FrameBgHovered, COL_GREY_LIGHT); set_color(ImGuiCol_FrameBgActive, COL_GREY_LIGHT); @@ -513,9 +1066,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); @@ -528,6 +1081,16 @@ void ImGuiWrapper::init_style() // Slider set_color(ImGuiCol_SliderGrab, COL_ORANGE_DARK); set_color(ImGuiCol_SliderGrabActive, COL_ORANGE_LIGHT); + + // 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 c6550351e7..5484e46c6f 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,21 +57,36 @@ 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); + bool begin(const std::string& name, bool* close, int flags = 0); + bool begin(const wxString& name, bool* close, int flags = 0); 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"); bool checkbox(const wxString &label, bool &value); 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& 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(); @@ -77,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(); @@ -84,6 +112,7 @@ private: void render_draw_data(ImDrawData *draw_data); bool display_initialized() const; void destroy_font(); + std::vector 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 0000000000..8067fc7f32 --- /dev/null +++ b/src/slic3r/GUI/InstanceCheck.cpp @@ -0,0 +1,606 @@ +#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 +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#endif //WIN32 + +#if __linux__ +#include /* Pull in all of D-Bus headers. */ +#endif //__linux__ + +namespace Slic3r { +namespace instance_check_internal +{ + struct CommandLineAnalysis + { + std::optional should_send; + std::string cl_string; + }; + static CommandLineAnalysis process_command_line(int argc, char** argv) + { + CommandLineAnalysis ret; + //if (argc < 2) + // return ret; + std::vector 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") == 0 && 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"); + unsigned long long other_instance_hash = PtrToUint(handle); + unsigned long long other_instance_hash_major; + unsigned long long 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 command_line_args = std::make_unique(const_cast(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) +{ +#ifndef _WIN32 + boost::system::error_code ec; +#endif + std::size_t hashed_path = +#ifdef _WIN32 + std::hash{}(boost::filesystem::system_complete(argv[0]).string()); +#else + std::hash{}(boost::filesystem::canonical(boost::filesystem::system_complete(argv[0]), ec).string()); + if(ec.value() > 0) { // canonical was not able to find execitable (can happen with appimage on some systems) + ec.clear(); + // Compose path with boost canonical of folder and filename + hashed_path = std::hash{}(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{}(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 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 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 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(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 = + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " "; + + 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 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 0000000000..9fb74b0a94 --- /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 +#endif //_WIN32 + +#include + +#include + +#if __linux__ +#include +#include +#include +#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>; +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 0000000000..30943c4d53 --- /dev/null +++ b/src/slic3r/GUI/InstanceCheckMac.h @@ -0,0 +1,9 @@ +#import + +@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 0000000000..9969b1a7b2 --- /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/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp new file mode 100644 index 0000000000..41fd717da8 --- /dev/null +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -0,0 +1,224 @@ +#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({ + {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(ap); + ret.translation = scaled(m_pos); + ret.rotation = m_rotation; + ret.priority++; + return ret; + } +}; + +static WipeTower get_wipe_tower(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 */); +} + +double ArrangeJob::bed_stride() const { + double bedwidth = m_plater->bed_shape_bb().size().x(); + return scaled((1. + LOGICAL_BED_GAP) * bedwidth); +} + +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(mi)); + } + + if (auto wti = get_wipe_tower(*m_plater)) + m_selected.emplace_back(wti.get_arrange_polygon()); +} + +void ArrangeJob::prepare_selected() { + clear_input(); + + Model &model = m_plater->model(); + double stride = bed_stride(); + + std::vector + 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 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)); + } + } + + if (auto wti = get_wipe_tower(*m_plater)) { + ArrangePolygon &&ap = get_arrange_poly(&wti); + + m_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; +} + +void ArrangeJob::prepare() +{ + wxGetKeyState(WXK_SHIFT) ? prepare_selected() : prepare_all(); +} + +void ArrangeJob::process() +{ + static const auto arrangestr = _(L("Arranging")); + + double dist = min_object_distance(*m_plater->config()); + + arrangement::ArrangeParams params; + params.min_obj_distance = scaled(dist); + + 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(); +} + +arrangement::ArrangePolygon get_wipe_tower_arrangepoly(Plater &plater) +{ + return WipeTower{plater.canvas3D()->get_wipe_tower_info()}.get_arrange_polygon(); +} + +void apply_wipe_tower_arrangepoly(Plater &plater, const arrangement::ArrangePolygon &ap) +{ + WipeTower{plater.canvas3D()->get_wipe_tower_info()}.apply_arrange_result(ap.translation.cast(), ap.rotation); +} + +}} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.hpp b/src/slic3r/GUI/Jobs/ArrangeJob.hpp new file mode 100644 index 0000000000..bd097af6be --- /dev/null +++ b/src/slic3r/GUI/Jobs/ArrangeJob.hpp @@ -0,0 +1,77 @@ +#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; + + // 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(); + + // Stride between logical beds + double bed_stride() const; + + // Set up arrange polygon for a ModelInstance and Wipe tower + template 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()) { + Vec2d t = p.translation.cast(); + 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(); + + // 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 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; +}; + +arrangement::ArrangePolygon get_wipe_tower_arrangepoly(Plater &); +void apply_wipe_tower_arrangepoly(Plater &plater, const arrangement::ArrangePolygon &ap); + +}} // namespace Slic3r::GUI + +#endif // ARRANGEJOB_HPP diff --git a/src/slic3r/GUI/Jobs/Job.cpp b/src/slic3r/GUI/Jobs/Job.cpp new file mode 100644 index 0000000000..fedb6f4aca --- /dev/null +++ b/src/slic3r/GUI/Jobs/Job.cpp @@ -0,0 +1,122 @@ +#include + +#include "Job.hpp" +#include +#include + +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 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 aborted(m_jobs.size(), false); + + for (size_t jid = 0; jid < m_jobs.size(); ++jid) + aborted[jid] = m_jobs[jid]->join(wait_ms); + + if (!std::all_of(aborted.begin(), aborted.end(), [](bool t) { return t; })) + BOOST_LOG_TRIVIAL(error) << "Could not abort a job!"; +} + +bool GUI::ExclusiveJobGroup::is_any_running() const +{ + return std::any_of(m_jobs.begin(), m_jobs.end(), + [](const std::unique_ptr &j) { + return j->is_running(); + }); +} + +} + diff --git a/src/slic3r/GUI/Jobs/Job.hpp b/src/slic3r/GUI/Jobs/Job.hpp new file mode 100644 index 0000000000..aea7692e7f --- /dev/null +++ b/src/slic3r/GUI/Jobs/Job.hpp @@ -0,0 +1,111 @@ +#ifndef JOB_HPP +#define JOB_HPP + +#include + +#include "libslic3r/libslic3r.h" + +#include + +#include "ProgressIndicator.hpp" + +#include + +#include + +namespace Slic3r { namespace GUI { + +// A class to handle UI jobs like arranging and optimizing rotation. +// These are not instant jobs, the user has to be informed about their +// state in the status progress indicator. On the other hand they are +// separated from the background slicing process. Ideally, these jobs should +// run when the background process is not running. +// +// TODO: A mechanism would be useful for blocking the plater interactions: +// objects would be frozen for the user. In case of arrange, an animation +// could be shown, or with the optimize orientations, partial results +// could be displayed. +class Job : public wxEvtHandler +{ + int m_range = 100; + boost::thread m_thread; + std::atomic m_running{false}, m_canceled{false}; + bool m_finalized = false; + std::shared_ptr 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 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> m_jobs; + +protected: + virtual void before_start() {} + +public: + virtual ~ExclusiveJobGroup() = default; + + size_t add_job(std::unique_ptr &&job) + { + m_jobs.emplace_back(std::move(job)); + return m_jobs.size() - 1; + } + + void start(size_t jid); + + void cancel_all() { for (auto& j : m_jobs) j->cancel(); } + + void join_all(int wait_ms = 0); + + void stop_all() { cancel_all(); join_all(ABORT_WAIT_MAX_MS); } + + bool is_any_running() const; +}; + +}} // namespace Slic3r::GUI + +#endif // JOB_HPP diff --git a/src/slic3r/GUI/Jobs/ProgressIndicator.hpp b/src/slic3r/GUI/Jobs/ProgressIndicator.hpp new file mode 100644 index 0000000000..674a81ba26 --- /dev/null +++ b/src/slic3r/GUI/Jobs/ProgressIndicator.hpp @@ -0,0 +1,29 @@ +#ifndef IPROGRESSINDICATOR_HPP +#define IPROGRESSINDICATOR_HPP + +#include +#include + +namespace Slic3r { + +/** + * @brief Generic progress indication interface. + */ +class ProgressIndicator { +public: + + /// Cancel callback function type + using CancelFn = std::function; + + virtual ~ProgressIndicator() = default; + + virtual void set_range(int range) = 0; + virtual void set_cancel_callback(CancelFn = CancelFn()) = 0; + virtual void set_progress(int pr) = 0; + virtual void set_status_text(const char *) = 0; // utf8 char array + virtual int get_range() const = 0; +}; + +} + +#endif // IPROGRESSINDICATOR_HPP diff --git a/src/slic3r/GUI/Jobs/RotoptimizeJob.cpp b/src/slic3r/GUI/Jobs/RotoptimizeJob.cpp new file mode 100644 index 0000000000..978ccf8fcf --- /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 0000000000..983c43c684 --- /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 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 0000000000..ec289ae344 --- /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 +#include +#include +#include +#include + +namespace Slic3r { namespace GUI { + +enum class Sel { modelAndProfile, profileOnly, modelOnly}; + +class ImportDlg: public wxDialog { + wxFilePickerCtrl *m_filepicker; + wxComboBox *m_import_dropdown, *m_quality_dropdown; + +public: + ImportDlg(Plater *plater) + : wxDialog{plater, wxID_ANY, "Import SLA archive"} + { + auto szvert = new wxBoxSizer{wxVERTICAL}; + auto szfilepck = new wxBoxSizer{wxHORIZONTAL}; + + m_filepicker = new wxFilePickerCtrl(this, wxID_ANY, + from_u8(wxGetApp().app_config->get_last_dir()), _(L("Choose SLA archive:")), + "SL1 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 inp_choices = { + _(L("Import model and profile")), + _(L("Import profile only")), + _(L("Import model only")) + }; + + m_import_dropdown = new wxComboBox( + this, wxID_ANY, inp_choices[0], wxDefaultPosition, wxDefaultSize, + inp_choices.size(), inp_choices.data(), wxCB_READONLY | wxCB_DROPDOWN); + + szchoices->Add(m_import_dropdown); + szchoices->Add(new wxStaticText(this, wxID_ANY, _L("Quality") + ": "), 0, wxALIGN_CENTER | wxALL, 5); + + static const std::vector qual_choices = { + _(L("Accurate")), + _(L("Balanced")), + _(L("Quick")) + }; + + m_quality_dropdown = new wxComboBox( + this, wxID_ANY, qual_choices[0], wxDefaultPosition, wxDefaultSize, + qual_choices.size(), qual_choices.data(), wxCB_READONLY | wxCB_DROPDOWN); + szchoices->Add(m_quality_dropdown); + + m_import_dropdown->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &) { + if (get_selection() == Sel::profileOnly) + m_quality_dropdown->Disable(); + else m_quality_dropdown->Enable(); + }); + + szvert->Add(szchoices, 0, wxALL, 5); + szvert->AddStretchSpacer(1); + auto szbtn = new wxBoxSizer(wxHORIZONTAL); + szbtn->Add(new wxButton{this, wxID_CANCEL}); + szbtn->Add(new wxButton{this, wxID_OK}); + szvert->Add(szbtn, 0, wxALIGN_RIGHT | wxALL, 5); + + SetSizerAndFit(szvert); + } + + Sel get_selection() const + { + int sel = m_import_dropdown->GetSelection(); + return Sel(std::min(int(Sel::modelOnly), std::max(0, sel))); + } + + Vec2i get_marchsq_windowsize() const + { + enum { Accurate, Balanced, Fast}; + + switch(m_quality_dropdown->GetSelection()) + { + case Fast: return {8, 8}; + case Balanced: return {4, 4}; + default: + case Accurate: + return {2, 2}; + } + } + + wxString get_path() const + { + return m_filepicker->GetPath(); + } +}; + +class SLAImportJob::priv { +public: + Plater *plater; + + 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 pri, Plater *plater) + : Job{std::move(pri)}, p{std::make_unique(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 0000000000..cff6cc899b --- /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 p; + +public: + SLAImportJob(std::shared_ptr 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 e3ef335e68..62fb1cec9e 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,249 +7,303 @@ #include #include "GUI_App.hpp" #include "wxExtensions.hpp" +#include "MainFrame.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 +#elif (BOOK_TYPE == LISTBOOK_TOP) || (BOOK_TYPE == LISTBOOK_LEFT) +#include +#elif BOOK_TYPE == TOOLBOOK +#include +#elif BOOK_TYPE == CHOICEBOOK +#include +#endif // BOOK_TYPE namespace Slic3r { namespace GUI { KBShortcutsDialog::KBShortcutsDialog() - : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Keyboard Shortcuts")), - wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + : DPIDialog((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) { SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); - auto main_sizer = new wxBoxSizer(wxVERTICAL); - - // logo - m_logo_bmp = ScalableBitmap(this, "PrusaSlicer_32px.png", 32); - // fonts const wxFont& font = wxGetApp().normal_font(); const wxFont& bold_font = wxGetApp().bold_font(); SetFont(font); - wxFont head_font = bold_font; -#ifdef __WXOSX__ - head_font.SetPointSize(14); -#else - head_font.SetPointSize(bold_font.GetPointSize() + 2); -#endif // __WXOSX__ + auto main_sizer = new wxBoxSizer(wxVERTICAL); + + 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); fill_shortcuts(); - - panel = new wxScrolledWindow(this, wxID_ANY, wxDefaultPosition, get_size()); - panel->SetScrollbars(1, 20, 1, 2); - - auto main_grid_sizer = new wxFlexGridSizer(2, 10, 10); - panel->SetSizer(main_grid_sizer); - main_sizer->Add(panel, 1, wxEXPAND | wxALL, 0); - - wxBoxSizer* l_sizer = new wxBoxSizer(wxVERTICAL); - main_grid_sizer->Add(l_sizer, 0); - - wxBoxSizer* r_sizer = new wxBoxSizer(wxVERTICAL); - main_grid_sizer->Add(r_sizer, 0); - - m_head_bitmaps.reserve(m_full_shortcuts.size()); - - for (auto& shortcut : m_full_shortcuts) - { - auto sizer = shortcut.second.second == szLeft ? l_sizer : r_sizer; - wxBoxSizer* hsizer = new wxBoxSizer(wxHORIZONTAL); - sizer->Add(hsizer, 0, wxEXPAND | wxTOP | wxBOTTOM, 10); - - // logo - m_head_bitmaps.push_back(new wxStaticBitmap(panel, wxID_ANY, m_logo_bmp.bmp())); - hsizer->Add(m_head_bitmaps.back(), 0, wxEXPAND | wxLEFT | wxRIGHT, 15); - - // head - wxStaticText* head = new wxStaticText(panel, wxID_ANY, shortcut.first); - head->SetFont(head_font); - hsizer->Add(head, 0, wxALIGN_CENTER_VERTICAL); - - - // Shortcuts list - auto grid_sizer = new wxFlexGridSizer(2, 5, 15); - sizer->Add(grid_sizer, 0, wxEXPAND | wxLEFT| wxRIGHT, 15); - - for (auto pair : shortcut.second.first) - { - auto shortcut = new wxStaticText(panel, wxID_ANY, _(pair.first)); - shortcut->SetFont(bold_font); - grid_sizer->Add(shortcut, -1, wxALIGN_CENTRE_VERTICAL); - - auto description = new wxStaticText(panel, wxID_ANY, _(pair.second)); - description->SetFont(font); - grid_sizer->Add(description, -1, wxALIGN_CENTRE_VERTICAL); - } + 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); } wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxOK); - this->SetEscapeId(wxID_OK); - this->Bind(wxEVT_BUTTON, &KBShortcutsDialog::onCloseDialog, this, wxID_OK); - main_sizer->Add(buttons, 0, wxEXPAND | wxRIGHT | wxBOTTOM, 15); - - this->Bind(wxEVT_LEFT_DOWN, &KBShortcutsDialog::onCloseDialog, this); + main_sizer->Add(buttons, 0, wxEXPAND | wxALL, 5); SetSizer(main_sizer); main_sizer->SetSizeHints(this); } -void KBShortcutsDialog::fill_shortcuts() -{ - const std::string &ctrl = GUI::shortkey_ctrl_prefix(); - const std::string &alt = GUI::shortkey_alt_prefix(); - - m_full_shortcuts.reserve(4); - - Shortcuts main_shortcuts; - main_shortcuts.reserve(25); - - main_shortcuts.push_back(Shortcut(ctrl+"O" ,L("Open project STL/OBJ/AMF/3MF with config, delete bed"))); - main_shortcuts.push_back(Shortcut(ctrl+"I" ,L("Import STL/OBJ/AMF/3MF without config, keep bed"))); - main_shortcuts.push_back(Shortcut(ctrl+"L" ,L("Load Config from .ini/amf/3mf/gcode"))); - main_shortcuts.push_back(Shortcut(ctrl+"G" ,L("Export G-code"))); - main_shortcuts.push_back(Shortcut(ctrl+"S" ,L("Save project (3MF)"))); - main_shortcuts.push_back(Shortcut(ctrl+alt+"L" ,L("Load Config from .ini/amf/3mf/gcode and merge"))); - main_shortcuts.push_back(Shortcut(ctrl+"R" ,L("(Re)slice"))); -// main_shortcuts.push_back(Shortcut(ctrl+"U" ,L("Quick slice"))); -// main_shortcuts.push_back(Shortcut(ctrl+"Shift+U" ,L("Repeat last quick slice"))); - main_shortcuts.push_back(Shortcut(ctrl+"1" ,L("Select Plater Tab"))); -// main_shortcuts.push_back(Shortcut(ctrl+alt+"U" ,L("Quick slice and Save as"))); - main_shortcuts.push_back(Shortcut(ctrl+"2" ,L("Select Print Settings Tab"))); - main_shortcuts.push_back(Shortcut(ctrl+"3" ,L("Select Filament Settings Tab"))); - main_shortcuts.push_back(Shortcut(ctrl+"4" ,L("Select Printer Settings Tab"))); - main_shortcuts.push_back(Shortcut(ctrl+"5" ,L("Switch to 3D"))); - main_shortcuts.push_back(Shortcut(ctrl+"6" ,L("Switch to Preview"))); - main_shortcuts.push_back(Shortcut(ctrl+"P" ,L("Preferences"))); - main_shortcuts.push_back(Shortcut(ctrl+"J" ,L("Print host upload queue"))); - main_shortcuts.push_back(Shortcut("0-6" ,L("Camera view"))); - main_shortcuts.push_back(Shortcut("+" ,L("Add Instance of the selected object"))); - main_shortcuts.push_back(Shortcut("-" ,L("Remove Instance of the selected object"))); - main_shortcuts.push_back(Shortcut("?" ,L("Show keyboard shortcuts list"))); - main_shortcuts.push_back(Shortcut(ctrl/*+"LeftMouse"*/,L("Press to select multiple object or move multiple object with mouse"))); - - m_full_shortcuts.push_back(std::make_pair(_(L("Main Shortcuts")), std::make_pair(main_shortcuts, szLeft))); - - - Shortcuts plater_shortcuts; - plater_shortcuts.reserve(20); - - plater_shortcuts.push_back(Shortcut("A", L("Arrange"))); - plater_shortcuts.push_back(Shortcut("Shift+A", L("Arrange selection"))); - plater_shortcuts.push_back(Shortcut(ctrl+"A", L("Select All objects"))); - plater_shortcuts.push_back(Shortcut("Del", L("Delete selected"))); - plater_shortcuts.push_back(Shortcut(ctrl+"Del", L("Delete All"))); - plater_shortcuts.push_back(Shortcut(ctrl+"C", L("Copy to clipboard"))); - plater_shortcuts.push_back(Shortcut(ctrl+"V", L("Paste from clipboard"))); - plater_shortcuts.push_back(Shortcut("M", L("Gizmo move"))); - plater_shortcuts.push_back(Shortcut("S", L("Gizmo scale"))); - plater_shortcuts.push_back(Shortcut("R", L("Gizmo rotate"))); - plater_shortcuts.push_back(Shortcut("C", L("Gizmo cut"))); - plater_shortcuts.push_back(Shortcut("F", L("Gizmo Place face on bed"))); - plater_shortcuts.push_back(Shortcut("L", L("Gizmo SLA support points"))); - plater_shortcuts.push_back(Shortcut("Shift+", L("Press to activate selection rectangle\nor to snap by 5% in Gizmo scale\nor to snap by 1mm in Gizmo move"))); - plater_shortcuts.push_back(Shortcut("F", L("Press to scale selection to fit print volume\nin Gizmo scale"))); - plater_shortcuts.push_back(Shortcut(alt, L("Press to activate deselection rectangle\nor to scale or rotate selected objects\naround their own center"))); - plater_shortcuts.push_back(Shortcut(ctrl, L("Press to activate one direction scaling in Gizmo scale"))); - plater_shortcuts.push_back(Shortcut("K", L("Change camera type (perspective, orthographic)"))); - plater_shortcuts.push_back(Shortcut("B", L("Zoom to Bed"))); - plater_shortcuts.push_back(Shortcut("Z", L("Zoom to all objects in scene, if none selected"))); - plater_shortcuts.push_back(Shortcut("Z", L("Zoom to selected object"))); - plater_shortcuts.push_back(Shortcut("I", L("Zoom in"))); - plater_shortcuts.push_back(Shortcut("O", L("Zoom out"))); - plater_shortcuts.push_back(Shortcut("ESC", L("Unselect gizmo / Clear selection"))); -#if ENABLE_RENDER_PICKING_PASS - // Don't localize debugging texts. - plater_shortcuts.push_back(Shortcut("T", "Toggle picking pass texture rendering on/off")); -#endif // ENABLE_RENDER_PICKING_PASS - - m_full_shortcuts.push_back(std::make_pair(_(L("Plater Shortcuts")), std::make_pair(plater_shortcuts, szRight))); - - -// Shortcuts gizmo_shortcuts; -// gizmo_shortcuts.reserve(2); -// -// gizmo_shortcuts.push_back(Shortcut("Shift+", L("Press to snap by 5% in Gizmo Scale\n or by 1mm in Gizmo Move"))); -// gizmo_shortcuts.push_back(Shortcut(alt, L("Press to scale or rotate selected objects around their own center"))); -// -// m_full_shortcuts.push_back(std::make_pair(_(L("Gizmo Shortcuts")), std::make_pair(gizmo_shortcuts, 1))); - - - Shortcuts preview_shortcuts; - preview_shortcuts.reserve(4); - - preview_shortcuts.push_back(Shortcut(L("Arrow Up"), L("Upper Layer"))); - preview_shortcuts.push_back(Shortcut(L("Arrow Down"), L("Lower Layer"))); - preview_shortcuts.push_back(Shortcut("U", L("Upper Layer"))); - preview_shortcuts.push_back(Shortcut("D", L("Lower Layer"))); - preview_shortcuts.push_back(Shortcut("L", L("Show/Hide (L)egend"))); - - m_full_shortcuts.push_back(std::make_pair(_(L("Preview Shortcuts")), std::make_pair(preview_shortcuts, szLeft))); - - - Shortcuts layers_slider_shortcuts; - layers_slider_shortcuts.reserve(6); - - layers_slider_shortcuts.push_back(Shortcut(L("Arrow Up"), L("Move current slider thumb Up"))); - layers_slider_shortcuts.push_back(Shortcut(L("Arrow Down"), L("Move current slider thumb Down"))); - layers_slider_shortcuts.push_back(Shortcut(L("Arrow Left"), L("Set upper thumb to current slider thumb"))); - layers_slider_shortcuts.push_back(Shortcut(L("Arrow Right"),L("Set lower thumb to current slider thumb"))); - layers_slider_shortcuts.push_back(Shortcut("+", L("Add color change marker for current layer"))); - layers_slider_shortcuts.push_back(Shortcut("-", L("Delete color change marker for current layer"))); - - m_full_shortcuts.push_back(std::make_pair(_(L("Layers Slider Shortcuts")), std::make_pair(layers_slider_shortcuts, szRight))); -} - -void KBShortcutsDialog::on_dpi_changed(const wxRect &suggested_rect) +void KBShortcutsDialog::on_dpi_changed(const wxRect& suggested_rect) { m_logo_bmp.msw_rescale(); + m_header_bitmap->SetBitmap(m_logo_bmp.bmp()); + msw_buttons_rescale(this, em_unit(), { wxID_OK }); - for (wxStaticBitmap* bmp : m_head_bitmaps) - bmp->SetBitmap(m_logo_bmp.bmp()); - - const int em = em_unit(); - - msw_buttons_rescale(this, em, { wxID_OK }); - - wxSize size = get_size(); - - panel->SetMinSize(size); - - SetMinSize(size); + Layout(); Fit(); - Refresh(); } -void KBShortcutsDialog::onCloseDialog(wxEvent &) +void KBShortcutsDialog::fill_shortcuts() { - this->EndModal(wxID_CLOSE); + const std::string& ctrl = GUI::shortkey_ctrl_prefix(); + const std::string& alt = GUI::shortkey_alt_prefix(); + + 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") }, + { "F5", L("Reload plater from disk") }, + { 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") }, + // 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") }, + { "Tab", L("Switch between Editor/Preview") }, + { "Shift+Tab", L("Collapse/Expand the sidebar") }, +#if ENABLE_CTRL_M_ON_WINDOWS + { ctrl + "M", L("Show/Hide 3Dconnexion devices settings dialog") }, +#else +#if defined(__linux__) || defined(__APPLE__) + { ctrl + "M", L("Show/Hide 3Dconnexion devices settings dialog") }, +#endif // __linux__ +#endif // ENABLE_CTRL_M_ON_WINDOWS +#if ENABLE_RENDER_PICKING_PASS + // Don't localize debugging texts. + { "P", "Toggle picking pass texture rendering on/off" }, +#endif // ENABLE_RENDER_PICKING_PASS + }; + + m_full_shortcuts.push_back(std::make_pair(_L("Plater"), plater_shortcuts)); + + 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(std::make_pair(_L("Gizmos"), gizmos_shortcuts)); + } + + Shortcuts preview_shortcuts = { + { 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 & Estimated printing time") }, + }; + + m_full_shortcuts.push_back(std::make_pair(_L("Preview"), preview_shortcuts)); + + Shortcuts layers_slider_shortcuts = { + { 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") }, + { "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)); + + Shortcuts sequential_slider_shortcuts = { + { L("Arrow Left"), L("Move current slider thumb Left") }, + { L("Arrow Right"), L("Move current slider thumb Right") }, + { "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("Sequential Slider"), sequential_slider_shortcuts)); } -wxSize KBShortcutsDialog::get_size() +wxPanel* KBShortcutsDialog::create_header(wxWindow* parent, const wxFont& bold_font) { - wxTopLevelWindow* window = Slic3r::GUI::find_toplevel_parent(this); - const int display_idx = wxDisplay::GetFromWindow(window); - wxRect display; - if (display_idx == wxNOT_FOUND) { - display = wxDisplay(0u).GetClientArea(); - window->Move(display.GetTopLeft()); - } - else { - display = wxDisplay(display_idx).GetClientArea(); + wxPanel* panel = new wxPanel(parent); + wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); + + wxFont header_font = bold_font; +#ifdef __WXOSX__ + header_font.SetPointSize(14); +#else + header_font.SetPointSize(bold_font.GetPointSize() + 2); +#endif // __WXOSX__ + + sizer->AddStretchSpacer(); + + // logo + 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")); + text->SetFont(header_font); + sizer->Add(text, 0, wxALIGN_CENTER_VERTICAL); + + sizer->AddStretchSpacer(); + + panel->SetSizer(sizer); + return panel; +} + +wxPanel* KBShortcutsDialog::create_page(wxWindow* parent, const std::pair& 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; + + wxScrolledWindow* page = new wxScrolledWindow(parent); + page->SetScrollbars(20, 20, 50, 50); + page->SetInitialSize(wxSize(850, 450)); + +#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 + + 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) { + int id = j * max_items_per_column + i; + if (id < items_count) { + 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); + } + else { + grid_sizer->Add(new wxStaticText(page, wxID_ANY, ""), 0, wxALIGN_CENTRE_VERTICAL); + grid_sizer->Add(new wxStaticText(page, wxID_ANY, ""), 0, wxALIGN_CENTRE_VERTICAL); + } + } } - const int em = em_unit(); - wxSize dialog_size = wxSize(90 * em, 85 * em); + sizer->Add(grid_sizer, 1, wxEXPAND | wxALL, 10); - const int margin = 10 * em; - if (dialog_size.x > display.GetWidth()) - dialog_size.x = display.GetWidth() - margin; - if (dialog_size.y > display.GetHeight()) - dialog_size.y = display.GetHeight() - margin; - - return dialog_size; + page->SetSizer(sizer); + return page; } } // namespace GUI diff --git a/src/slic3r/GUI/KBShortcutsDialog.hpp b/src/slic3r/GUI/KBShortcutsDialog.hpp index 7ac28778b5..a8ec4e4267 100644 --- a/src/slic3r/GUI/KBShortcutsDialog.hpp +++ b/src/slic3r/GUI/KBShortcutsDialog.hpp @@ -13,33 +13,27 @@ namespace GUI { class KBShortcutsDialog : public DPIDialog { - enum PLACED_SIZER_ID - { - szLeft = 0, - szRight - }; - typedef std::pair Shortcut; - typedef std::vector< Shortcut > Shortcuts; - typedef std::vector< std::pair> > ShortcutsVec; + typedef std::vector Shortcuts; + typedef std::vector> ShortcutsVec; - wxScrolledWindow* panel; - - ShortcutsVec m_full_shortcuts; - ScalableBitmap m_logo_bmp; - std::vector m_head_bitmaps; + ShortcutsVec m_full_shortcuts; + ScalableBitmap m_logo_bmp; + wxStaticBitmap* m_header_bitmap; + std::vector m_pages; public: KBShortcutsDialog(); - void fill_shortcuts(); - protected: void on_dpi_changed(const wxRect &suggested_rect) override; private: - void onCloseDialog(wxEvent &); - wxSize get_size(); + void fill_shortcuts(); + + wxPanel* create_header(wxWindow* parent, const wxFont& bold_font); + wxPanel* create_page(wxWindow* parent, const std::pair& 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 63c8d329c5..0000000000 --- a/src/slic3r/GUI/LambdaObjectDialog.cpp +++ /dev/null @@ -1,200 +0,0 @@ -#include "LambdaObjectDialog.hpp" - -#include -#include -#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(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(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(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(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(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(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(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 6cc99c8a74..0000000000 --- a/src/slic3r/GUI/LambdaObjectDialog.hpp +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef slic3r_LambdaObjectDialog_hpp_ -#define slic3r_LambdaObjectDialog_hpp_ - -#include "GUI.hpp" - -#include -#include -#include - -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; -class LambdaObjectDialog : public wxDialog -{ - wxChoicebook* m_modificator_options_book = nullptr; - std::vector 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 b76110a874..fc0b6c46d6 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -7,7 +7,8 @@ #include #include #include -#include +//#include +#include #include #include @@ -15,27 +16,78 @@ #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 #include "GUI_App.hpp" +#ifdef _WIN32 +#include +#include +#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") == "1") { + // 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. + //FIXME Vojtech thinks the condition is wrong. + 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__ + 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); @@ -45,32 +97,97 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S #endif // Font is already set in DPIFrame constructor */ + +#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(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(wxTBI_DOCK); + m_taskbar_icon->SetIcon(wxIcon(Slic3r::var("PrusaSlicer-gcodeviewer_128px.png"), wxBITMAP_TYPE_PNG), "G-code Viewer"); + break; + } +#endif // __APPLE__ + // Load the icon either from the exe, or from the ico file. #if _WIN32 { +#if ENABLE_GCODE_VIEWER + wxString src_path; + wxFileName::SplitPath(wxStandardPaths::Get().GetExecutablePath(), &src_path, nullptr, nullptr, wxPATH_NATIVE); + switch (wxGetApp().get_app_mode()) { + default: + case GUI_App::EAppMode::Editor: { src_path += "\\prusa-slicer.exe"; break; } + case GUI_App::EAppMode::GCodeViewer: { src_path += "\\prusa-gcodeviewer.exe"; break; } + } + wxIconLocation icon_location; + icon_location.SetFileName(src_path); + SetIcon(icon_location); +#else TCHAR szExeFileName[MAX_PATH]; GetModuleFileName(nullptr, szExeFileName, MAX_PATH); SetIcon(wxIcon(szExeFileName, wxBITMAP_TYPE_ICO)); +#endif // ENABLE_GCODE_VIEWER } #else - SetIcon(wxIcon(Slic3r::var("PrusaSlicer_128px.png"), wxBITMAP_TYPE_PNG)); +#if ENABLE_GCODE_VIEWER + switch (wxGetApp().get_app_mode()) + { + default: + case GUI_App::EAppMode::Editor: + { +#endif // ENABLE_GCODE_VIEWER + SetIcon(wxIcon(Slic3r::var("PrusaSlicer_128px.png"), wxBITMAP_TYPE_PNG)); +#if ENABLE_GCODE_VIEWER + break; + } + case GUI_App::EAppMode::GCodeViewer: + { + SetIcon(wxIcon(Slic3r::var("PrusaSlicer-gcodeviewer_128px.png"), wxBITMAP_TYPE_PNG)); + break; + } + } +#endif // ENABLE_GCODE_VIEWER #endif // _WIN32 // initialize status bar - m_statusbar.reset(new ProgressStatusBar(this)); - 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(this); + m_statusbar = std::make_shared(this); + m_statusbar->set_font(GUI::wxGetApp().normal_font()); +#if ENABLE_GCODE_VIEWER + if (wxGetApp().is_editor()) +#endif // ENABLE_GCODE_VIEWER + 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(); +#if ENABLE_GCODE_VIEWER + 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 +#else init_menubar(); +#endif // ENABLE_GCODE_VIEWER // set default tooltip timer in msec // SetAutoPop supposedly accepts long integers but some bug doesn't allow for larger values @@ -80,14 +197,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 @@ -106,57 +225,332 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S event.Veto(); return; } - - if(m_plater) m_plater->stop_jobs(); - - // Weird things happen as the Paint messages are floating around the windows being destructed. - // Avoid the Paint messages by hiding the main window. - // Also the application closes much faster without these unnecessary screen refreshes. - // In addition, there were some crashes due to the Paint events sent to already destructed windows. - this->Show(false); - - // 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 platter - // to avoid any manipulations with them from App->wxEVT_IDLE after of the mainframe closing - wxGetApp().tabs_list.clear(); - wxGetApp().plater_ = nullptr; - + 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 +#if ENABLE_RETINA_GL + 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 ENABLE_GCODE_VIEWER + m_plater->get_collapse_toolbar().set_enabled(wxGetApp().app_config->get("show_collapse_button") == "1"); +#endif // ENABLE_GCODE_VIEWER + m_plater->show_action_buttons(true); + } } -MainFrame::~MainFrame() = default; +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(); + }; + +#if ENABLE_GCODE_VIEWER + 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); +#else + ESettingsLayout layout = 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; +#endif // ENABLE_GCODE_VIEWER + + 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; + } +#if ENABLE_GCODE_VIEWER + 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; + } +#endif // ENABLE_GCODE_VIEWER + } + +#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 + if (m_hDeviceNotify) { + ::UnregisterDeviceNotification(HDEVNOTIFY(m_hDeviceNotify)); + m_hDeviceNotify = nullptr; + } + if (m_ulSHChangeNotifyRegister) { + SHChangeNotifyDeregister(m_ulSHChangeNotifyRegister); + m_ulSHChangeNotifyRegister = 0; + } +#endif // _WIN32 + +#if ENABLE_GCODE_VIEWER + 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(); + } +#else + if (m_plater) + 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 + if (m_plater) 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 + if (m_plater) m_plater->reset_canvas_volumes(); +#endif // ENABLE_GCODE_VIEWER + + // Weird things happen as the Paint messages are floating around the windows being destructed. + // Avoid the Paint messages by hiding the main window. + // Also the application closes much faster without these unnecessary screen refreshes. + // In addition, there were some crashes due to the Paint events sent to already destructed windows. + this->Show(false); + + 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; +// Slic3r::GUI::deregister_on_request_update_callback(); + + // set to null tabs and a plater + // to avoid any manipulations with them from App->wxEVT_IDLE after of the mainframe closing + wxGetApp().tabs_list.clear(); + wxGetApp().plater_ = nullptr; +} 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()); if (!project.empty()) title += (project + " - "); } - title += (wxString(SLIC3R_BUILD_ID) + " " + _(L("based on Slic3r"))); + +#if ENABLE_GCODE_VIEWER + std::string build_id = wxGetApp().is_editor() ? SLIC3R_BUILD_ID : GCODEVIEWER_BUILD_ID; +#else + std::string build_id = SLIC3R_BUILD_ID; +#endif // ENABLE_GCODE_VIEWER + 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") && + (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) + // People are using 32bit slicer on a 64bit machine by mistake. Make it explicit. + build_id += " 32 bit"; +#endif + } + } +#if ENABLE_GCODE_VIEWER + title += wxString(build_id); + if (wxGetApp().is_editor()) + title += (" " + _L("based on Slic3r")); +#else + title += (wxString(build_id) + " " + _L("based on Slic3r")); +#endif // ENABLE_GCODE_VIEWER SetTitle(title); } @@ -169,24 +563,32 @@ 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(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(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(); @@ -197,7 +599,10 @@ void MainFrame::init_tabpanel() // 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 ENABLE_GCODE_VIEWER + if (wxGetApp().is_editor()) +#endif // ENABLE_GCODE_VIEWER + create_preset_tabs(); if (m_plater) { // load initial config @@ -212,6 +617,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(); @@ -232,6 +693,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(); @@ -288,14 +765,32 @@ bool MainFrame::can_export_gcode() const bool MainFrame::can_send_gcode() const { - if (m_plater == nullptr) - return false; + if (m_plater && ! m_plater->model().objects.empty()) + if (const DynamicPrintConfig *cfg = wxGetApp().preset_bundle->physical_printers.get_selected_printer_config(); cfg) + if (const auto *print_host_opt = cfg->option("print_host"); print_host_opt) + return ! print_host_opt->value.empty(); + return false; +} - if (m_plater->model().objects.empty()) - return false; +bool MainFrame::can_export_gcode_sd() const +{ + if (m_plater == nullptr) + return false; - const auto print_host_opt = wxGetApp().preset_bundle->printers.get_edited_preset().config.option("print_host"); - return print_host_opt != nullptr && !print_host_opt->value.empty(); + if (m_plater->model().objects.empty()) + return false; + + if (m_plater->is_export_gcode_scheduled()) + return false; + + // TODO:: add other filters + + return wxGetApp().removable_drive_manager()->status().has_removable_drives; +} + +bool MainFrame::can_eject() const +{ + return wxGetApp().removable_drive_manager()->status().has_eject; } bool MainFrame::can_slice() const @@ -306,8 +801,19 @@ bool MainFrame::can_slice() const bool MainFrame::can_change_view() const { - int page_id = m_tabpanel->GetSelection(); - return page_id != wxNOT_FOUND && dynamic_cast(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(m_tabpanel->GetPage((size_t)page_id)) != nullptr; + } +#if ENABLE_GCODE_VIEWER + case ESettingsLayout::GCodeViewer: { return true; } +#endif // ENABLE_GCODE_VIEWER + } } bool MainFrame::can_select() const @@ -335,22 +841,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(this); - // 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++) @@ -358,7 +864,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 @@ -378,17 +884,109 @@ void MainFrame::on_dpi_changed(const wxRect &suggested_rect) this->Maximize(is_maximized); } -static std::string menu_icon(const std::string& icon_name) +void MainFrame::on_sys_color_changed() { -#ifdef __WXMSW__ - const std::string folder = "white\\"; -#else - const std::string folder = "white/"; -#endif - return wxGetApp().dark_mode_menus() ? folder+icon_name : icon_name; + 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)); } +#if ENABLE_GCODE_VIEWER +#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 ENABLE_GCODE_VIEWER + if (wxGetApp().is_editor()) +#endif // ENABLE_GCODE_VIEWER + append_menu_item(helpMenu, wxID_ANY, wxString::Format(_L("&About %s"), SLIC3R_APP_NAME), _L("Show about dialog"), + [](wxCommandEvent&) { Slic3r::GUI::about(); }); +#if ENABLE_GCODE_VIEWER + else + append_menu_item(helpMenu, wxID_ANY, wxString::Format(_L("&About %s"), GCODEVIEWER_APP_NAME), _L("Show about dialog"), + [](wxCommandEvent&) { Slic3r::GUI::about(); }); +#endif // ENABLE_GCODE_VIEWER + 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 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() +#else void MainFrame::init_menubar() +#endif // ENABLE_GCODE_VIEWER { #ifdef __APPLE__ wxMenuBar::SetAutoWindowMenu(false); @@ -397,15 +995,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")), - [this](wxCommandEvent&) { if (m_plater) m_plater->load_project(); }, menu_icon("open"), nullptr, + 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; @@ -414,18 +1012,19 @@ void MainFrame::init_menubar() m_plater->load_project(filename); else { - wxMessageDialog msg(this, _(L("The selected project is no more available")), _(L("Error"))); - msg.ShowModal(); - - m_recent_projects.RemoveFileFromHistory(file_id); - std::vector recent_projects; - size_t count = m_recent_projects.GetCount(); - for (size_t i = 0; i < count; ++i) + 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) { - recent_projects.push_back(into_u8(m_recent_projects.GetHistoryFile(i))); + m_recent_projects.RemoveFileFromHistory(file_id); + std::vector recent_projects; + size_t count = m_recent_projects.GetCount(); + for (size_t i = 0; i < count; ++i) + { + recent_projects.push_back(into_u8(m_recent_projects.GetHistoryFile(i))); + } + wxGetApp().app_config->set_recent_projects(recent_projects); + wxGetApp().app_config->save(); } - wxGetApp().app_config->set_recent_projects(recent_projects); - wxGetApp().app_config->save(); } }, wxID_FILE1, wxID_FILE9); @@ -438,80 +1037,104 @@ 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")), - [this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(into_path(m_plater->get_project_filename(".3mf"))); }, menu_icon("save"), nullptr, + 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(); }, menu_icon("save"), nullptr, + [this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(); }, "save", nullptr, [this](){return m_plater != nullptr && can_save(); }, this); 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")), - [this](wxCommandEvent&) { if (m_plater) m_plater->add_model(); }, menu_icon("import_plater"), nullptr, + 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")), - [this](wxCommandEvent&) { load_config_file(); }, menu_icon("import_config")); - 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(); }, menu_icon("import_config")); + 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, + []() {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, + []() {return true; }, this); import_menu->AppendSeparator(); - append_menu_item(import_menu, wxID_ANY, _(L("Import Config &Bundle")) + dots, _(L("Load presets from a bundle")), - [this](wxCommandEvent&) { load_configbundle(); }, menu_icon("import_config_bundle")); - append_submenu(fileMenu, import_menu, wxID_ANY, _(L("&Import")), ""); + 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, + []() {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(); }, menu_icon("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")), - [this](wxCommandEvent&) { if (m_plater) m_plater->send_gcode(); }, menu_icon("export_gcode"), nullptr, + 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"), + [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")), - [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(); }, menu_icon("export_plater"), nullptr, + 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")), - [this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(true); }, menu_icon("export_plater"), nullptr, + 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")), - [this](wxCommandEvent&) { if (m_plater) m_plater->export_amf(); }, menu_icon("export_plater"), nullptr, + 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")), - [this](wxCommandEvent&) { if (m_plater) m_plater->export_toolpaths_to_obj(); }, menu_icon("export_plater"), nullptr, + 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")), - [this](wxCommandEvent&) { export_config(); }, menu_icon("export_config")); - append_menu_item(export_menu, wxID_ANY, _(L("Export Config &Bundle")) + dots, _(L("Export all presets to file")), - [this](wxCommandEvent&) { export_configbundle(); }, menu_icon("export_config_bundle")); - append_submenu(fileMenu, export_menu, wxID_ANY, _(L("&Export")), ""); + 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, + []() {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, + []() {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."), + [this](wxCommandEvent&) { if (m_plater) m_plater->eject_drive(); }, "eject_sd", nullptr, + [this]() {return can_eject(); }, this); fileMenu->AppendSeparator(); #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); @@ -519,17 +1142,22 @@ 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")), - [this](wxCommandEvent&) { reslice_now(); }, menu_icon("re_slice"), nullptr, - [this](){return m_plater != nullptr && can_reslice(); }, this); + 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); fileMenu->AppendSeparator(); - append_menu_item(fileMenu, wxID_ANY, _(L("&Repair STL file")) + dots, _(L("Automatically repair an STL file")), - [this](wxCommandEvent&) { repair_stl(); }, menu_icon("wrench")); + append_menu_item(fileMenu, wxID_ANY, _L("&Repair STL file") + dots, _L("Automatically repair an STL file"), + [this](wxCommandEvent&) { repair_stl(); }, "wrench", nullptr, + []() { return true; }, this); fileMenu->AppendSeparator(); - append_menu_item(fileMenu, wxID_EXIT, _(L("&Quit")), wxString::Format(_(L("Quit %s")), SLIC3R_APP_NAME), - [this](wxCommandEvent&) { Close(false); }); + 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"); } +#if !ENABLE_GCODE_VIEWER #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. @@ -539,6 +1167,7 @@ void MainFrame::init_menubar() wxString sep = " - "; wxString sep_space = ""; #endif +#endif // !ENABLE_GCODE_VIEWER // Edit menu wxMenu* editMenu = nullptr; @@ -551,66 +1180,78 @@ 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&) { if (m_plater != nullptr) 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&) { if (m_plater != nullptr) 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(); }, - menu_icon("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(); }, - menu_icon("delete_all_menu"), nullptr, [this](){return can_delete_all(); }, this); + 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(); }, + "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(); }, - menu_icon("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(); }, - menu_icon("paste_menu"), nullptr, [this](){return m_plater->can_paste_from_clipboard(); }, this); + 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(); }, + "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(); }, + "", nullptr, [this]() {return !m_plater->model().objects.empty(); }, this); + + 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); }, menu_icon("plater")); - 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); }, menu_icon("cog")); - 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); }, menu_icon("spool")); + 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); }, menu_icon("printer")); + 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")), - [this](wxCommandEvent&) { m_plater->select_view_3D("3D"); }, menu_icon("editor_menu"), nullptr, + 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")), - [this](wxCommandEvent&) { m_plater->select_view_3D("Preview"); }, menu_icon("preview_menu"), nullptr, + 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 !ENABLE_GCODE_VIEWER #if _WIN32 // This is needed on Windows to fake the CTRL+# of the window menu when using the numpad wxAcceleratorEntry entries[6]; @@ -623,109 +1264,206 @@ void MainFrame::init_menubar() wxAcceleratorTable accel(6, entries); SetAcceleratorTable(accel); #endif // _WIN32 +#endif // !ENABLE_GCODE_VIEWER 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(); }, menu_icon("upload_queue")); + 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+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(); +#if ENABLE_GCODE_VIEWER + add_common_view_menu_items(viewMenu, this, std::bind(&MainFrame::can_change_view, this)); +#else // 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"); }, + 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); 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"); }, + 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"); }, + 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"); }, + 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"); }, + 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"); }, + 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"); }, + 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); +#endif // ENABLE_GCODE_VIEWER + viewMenu->AppendSeparator(); + 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 +#if ENABLE_GCODE_VIEWER + auto helpMenu = generate_help_menu(); +#else auto helpMenu = new wxMenu(); { - append_menu_item(helpMenu, wxID_ANY, _(L("Prusa 3D &Drivers")), _(L("Open the Prusa3D drivers download page in your browser")), + 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"); }); + append_menu_item(helpMenu, wxID_ANY, _L("Software &Releases"), _L("Open the software releases page in your browser"), + [this](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), + 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), +// 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")), + 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)")), + 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")), + 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("https://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")), + 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, _(L("DEBUG gcode thumbnails")), _(L("DEBUG ONLY - read the selected gcode file and generates png for the contained thumbnails")), + 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 } +#endif // ENABLE_GCODE_VIEWER // menubar // assign menubar to frame after appending items, otherwise special items // will not be handled correctly +#if ENABLE_GCODE_VIEWER + 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(m_menubar); + m_menubar->Append(helpMenu, _L("&Help")); + SetMenuBar(m_menubar); +#else 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"))); + menubar->Append(fileMenu, _L("&File")); + if (editMenu) menubar->Append(editMenu, _L("&Edit")); + menubar->Append(windowMenu, _L("&Window")); + if (viewMenu) menubar->Append(viewMenu, _L("&View")); // Add additional menus from C++ wxGetApp().add_config_menu(menubar); - menubar->Append(helpMenu, _(L("&Help"))); + menubar->Append(helpMenu, _L("&Help")); SetMenuBar(menubar); +#endif // ENABLE_GCODE_VIEWER #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 +#if ENABLE_GCODE_VIEWER + wxMenu* apple_menu = m_menubar->OSXGetAppleMenu(); +#else wxMenu *apple_menu = menubar->OSXGetAppleMenu(); +#endif // ENABLE_GCODE_VIEWER if (apple_menu != nullptr) { apple_menu->Bind(wxEVT_MENU, [this](wxCommandEvent &) { Close(); }, wxID_EXIT); } -#endif +#endif // __APPLE__ if (plater()->printer_technology() == ptSLA) update_menubar(); } +#if ENABLE_GCODE_VIEWER +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); + 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")); +#if ENABLE_GCODE_VIEWER + // Add additional menus from C++ + wxGetApp().add_config_menu(m_menubar); +#endif // ENABLE_GCODE_VIEWER + 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__ +} +#endif // ENABLE_GCODE_VIEWER + void MainFrame::update_menubar() { +#if ENABLE_GCODE_VIEWER + if (wxGetApp().is_gcode_viewer()) + return; +#endif // ENABLE_GCODE_VIEWER + 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(this, menu_icon(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". @@ -745,7 +1483,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) @@ -756,14 +1494,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; } @@ -798,7 +1536,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, wxString::Format(_(L("Save %s file as:")) , qs & qsExportSVG ? _(L("SVG")) : _(L("G-code")) ), + 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); @@ -810,7 +1548,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) @@ -819,10 +1557,10 @@ void MainFrame::quick_slice(const int qs) } // show processbar dialog - m_progress_dialog = new wxProgressDialog(_(L("Slicing")) + dots, - // TRN "Processing input_file_basename" - wxString::Format(_(L("Processing %s")), input_file_basename + dots), - 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 = (); @@ -844,9 +1582,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(); }); } @@ -861,7 +1599,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) @@ -897,7 +1635,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); @@ -916,7 +1654,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; @@ -941,7 +1679,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; @@ -952,7 +1690,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); @@ -963,7 +1701,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()); } @@ -978,7 +1716,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) @@ -999,12 +1737,12 @@ 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); - Slic3r::GUI::show_info(this, message, "Info"); + const auto message = wxString::Format(_L("%d presets successfully imported."), presets_imported); + Slic3r::GUI::show_info(this, message, wxString("Info")); } // Load a provied DynamicConfig into the Print / Filament / Printer tabs, thus modifying the active preset. -// Also update the platter with the new presets. +// Also update the plater with the new presets. void MainFrame::load_config(const DynamicPrintConfig& config) { PrinterTechnology printer_technology = wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology(); @@ -1041,9 +1779,95 @@ void MainFrame::load_config(const DynamicPrintConfig& config) #endif } -void MainFrame::select_tab(size_t tab) const +void MainFrame::select_tab(Tab* tab) { - m_tabpanel->SetSelection(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)*/) +{ + 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(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(m_tabpanel->GetPage(new_selection))->OnActivate(); } // Set a camera direction, zoom to all objects. @@ -1121,15 +1945,16 @@ 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"; +// const bool bp_on = wxGetApp().app_config->get("background_processing") == "1"; // m_menu_item_reslice_now->Enable(!bp_on); - m_plater->sidebar().show_reslice(!bp_on); - m_plater->sidebar().show_export(bp_on); - m_plater->sidebar().Layout(); +// m_plater->sidebar().show_reslice(!bp_on); +// m_plater->sidebar().show_export(bp_on); +// 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(); } @@ -1147,5 +1972,109 @@ 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 ENABLE_GCODE_VIEWER + if (wxGetApp().is_gcode_viewer()) + return; +#endif // ENABLE_GCODE_VIEWER + +#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 ENABLE_GCODE_VIEWER + if (wxGetApp().is_gcode_viewer()) + return; +#endif // ENABLE_GCODE_VIEWER + + 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 28bd0242b5..611ea7991c 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -7,12 +7,14 @@ #include #include #include +#ifdef __APPLE__ +#include +#endif // __APPLE__ #include #include #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,13 +71,20 @@ class MainFrame : public DPIFrame wxString m_qs_last_input_file = wxEmptyString; wxString m_qs_last_output_file = wxEmptyString; wxString m_last_config = wxEmptyString; +#if ENABLE_GCODE_VIEWER + wxMenuBar* m_menubar{ nullptr }; +#endif // ENABLE_GCODE_VIEWER + #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; @@ -70,6 +98,8 @@ class MainFrame : public DPIFrame bool can_export_supports() const; bool can_export_gcode() const; bool can_send_gcode() const; + bool can_export_gcode_sd() const; + bool can_eject() const; bool can_slice() const; bool can_change_view() const; bool can_select() const; @@ -84,6 +114,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 @@ -91,12 +122,31 @@ class MainFrame : public DPIFrame wxFileHistory m_recent_projects; + enum class ESettingsLayout + { + Unknown, + Old, + New, + Dlg, +#if ENABLE_GCODE_VIEWER + GCodeViewer +#endif // ENABLE_GCODE_VIEWER + }; + + 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(); + ~MainFrame() = default; + + void update_layout(); + + // Called when closing the application and when switching the application language. + void shutdown(); Plater* plater() { return m_plater; } @@ -105,12 +155,22 @@ public: void init_tabpanel(); void create_preset_tabs(); void add_created_tab(Tab* panel); + 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(); +#if ENABLE_GCODE_VIEWER + void init_menubar_as_editor(); + void init_menubar_as_gcodeviewer(); +#else void init_menubar(); +#endif // ENABLE_GCODE_VIEWER 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(); @@ -120,12 +180,15 @@ 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 Platter and save changes to the AppConfig + // Propagate changed configuration from the Tab to the Plater and save changes to the AppConfig void on_config_changed(DynamicPrintConfig* cfg) const ; void add_to_recent_projects(const wxString& filename); @@ -134,8 +197,20 @@ public: Plater* m_plater { nullptr }; wxNotebook* m_tabpanel { nullptr }; + SettingsDialog m_settings_dialog; + wxWindow* m_plater_page{ nullptr }; wxProgressDialog* m_progress_dialog { nullptr }; - std::unique_ptr m_statusbar; + std::shared_ptr m_statusbar; + +#ifdef __APPLE__ + std::unique_ptr 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 }; } // GUI diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp index 62a6813a66..ee0abe76f9 100644 --- a/src/slic3r/GUI/MeshUtils.cpp +++ b/src/slic3r/GUI/MeshUtils.cpp @@ -5,10 +5,6 @@ #include "slic3r/GUI/Camera.hpp" -// There is an L function in igl that would be overridden by our localization macro. -#undef L -#include - #include @@ -31,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); } } @@ -44,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& 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(); } @@ -71,89 +66,47 @@ void MeshClipper::recalculate_triangles() const Vec3f& scaling = m_trafo.get_scaling_factor().cast(); // Calculate clipping plane normal in mesh coordinates. Vec3f up_noscale = instance_matrix_no_translation_no_scaling.inverse() * m_plane.get_normal().cast(); - 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 list_of_expolys; - m_tms->set_up_direction(up); - m_tms->slice(std::vector{height_mesh}, 0.f, &list_of_expolys, [](){}); + m_tms->set_up_direction(up.cast()); + m_tms->slice(std::vector{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() * tr; + tr = m_trafo.get_matrix() * 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(); + // 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; } -class MeshRaycaster::AABBWrapper { -public: - AABBWrapper(const TriangleMesh* mesh); - ~AABBWrapper() { m_AABB.deinit(); } - - typedef Eigen::Map> MapMatrixXfUnaligned; - typedef Eigen::Map> MapMatrixXiUnaligned; - igl::AABB m_AABB; - - Vec3f get_hit_pos(const igl::Hit& hit) const; - Vec3f get_hit_normal(const igl::Hit& hit) const; - -private: - const TriangleMesh* m_mesh; -}; - -MeshRaycaster::AABBWrapper::AABBWrapper(const TriangleMesh* mesh) - : m_mesh(mesh) +Vec3f MeshRaycaster::get_triangle_normal(size_t facet_idx) const { - m_AABB.init( - MapMatrixXfUnaligned(m_mesh->its.vertices.front().data(), m_mesh->its.vertices.size(), 3), - MapMatrixXiUnaligned(m_mesh->its.indices.front().data(), m_mesh->its.indices.size(), 3)); + return m_normals[facet_idx]; } - -MeshRaycaster::MeshRaycaster(const TriangleMesh& mesh) - : m_AABB_wrapper(new AABBWrapper(&mesh)), m_mesh(&mesh) -{ -} - -MeshRaycaster::~MeshRaycaster() -{ - delete m_AABB_wrapper; -} - -Vec3f MeshRaycaster::AABBWrapper::get_hit_pos(const igl::Hit& hit) const -{ - const stl_triangle_vertex_indices& indices = m_mesh->its.indices[hit.id]; - return Vec3f((1-hit.u-hit.v) * m_mesh->its.vertices[indices(0)] - + hit.u * m_mesh->its.vertices[indices(1)] - + hit.v * m_mesh->its.vertices[indices(2)]); -} - - -Vec3f MeshRaycaster::AABBWrapper::get_hit_normal(const igl::Hit& hit) const -{ - const stl_triangle_vertex_indices& indices = m_mesh->its.indices[hit.id]; - Vec3f a(m_mesh->its.vertices[indices(1)] - m_mesh->its.vertices[indices(0)]); - Vec3f b(m_mesh->its.vertices[indices(2)] - m_mesh->its.vertices[indices(0)]); - return Vec3f(a.cross(b)); -} - - -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& viewport = camera.get_viewport(); const Transform3d& model_mat = camera.get_view_matrix(); @@ -164,27 +117,34 @@ bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& ::gluUnProject(mouse_pos(0), viewport[3] - mouse_pos(1), 0., model_mat.data(), proj_mat.data(), viewport.data(), &pt1(0), &pt1(1), &pt1(2)); ::gluUnProject(mouse_pos(0), viewport[3] - mouse_pos(1), 1., model_mat.data(), proj_mat.data(), viewport.data(), &pt2(0), &pt2(1), &pt2(2)); - std::vector hits; - Transform3d inv = trafo.inverse(); - pt1 = inv * pt1; pt2 = inv * pt2; - if (! m_AABB_wrapper->m_AABB.intersect_ray( - AABBWrapper::MapMatrixXfUnaligned(m_mesh->its.vertices.front().data(), m_mesh->its.vertices.size(), 3), - AABBWrapper::MapMatrixXiUnaligned(m_mesh->its.indices.front().data(), m_mesh->its.indices.size(), 3), - pt1.cast(), (pt2-pt1).cast(), hits)) - return false; // no intersection found + point = pt1; + direction = pt2-pt1; +} - std::sort(hits.begin(), hits.end(), [](const igl::Hit& a, const igl::Hit& b) { return a.t < b.t; }); + +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 hits = m_emesh.query_ray_hits(point, direction); + + if (hits.empty()) + return false; // no intersection found unsigned i = 0; // Remove points that are obscured or cut by the clipping plane if (clipping_plane) { for (i=0; iis_point_clipped(trafo * m_AABB_wrapper->get_hit_pos(hits[i]).cast())) + if (! clipping_plane->is_point_clipped(trafo * hits[i].position())) break; if (i==hits.size() || (hits.size()-i) % 2 != 0) { @@ -195,8 +155,12 @@ 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 = m_AABB_wrapper->get_hit_pos(hits[i]); - normal = m_AABB_wrapper->get_hit_normal(hits[i]); + position = hits[i].position().cast(); + normal = hits[i].normal().cast(); + + if (facet_idx) + *facet_idx = hits[i].face(); + return true; } @@ -220,24 +184,21 @@ std::vector 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 hits; + std::vector hits; // Offset the start of the ray by EPSILON to account for numerical inaccuracies. - if (m_AABB_wrapper->m_AABB.intersect_ray( - AABBWrapper::MapMatrixXfUnaligned(m_mesh->its.vertices.front().data(), m_mesh->its.vertices.size(), 3), - AABBWrapper::MapMatrixXiUnaligned(m_mesh->its.indices.front().data(), m_mesh->its.indices.size(), 3), - inverse_trafo * pt + direction_to_camera_mesh * EPSILON, direction_to_camera_mesh, hits)) { + hits = m_emesh.query_ray_hits((inverse_trafo * pt + direction_to_camera_mesh * EPSILON).cast(), + direction_to_camera.cast()); - std::sort(hits.begin(), hits.end(), [](const igl::Hit& h1, const igl::Hit& h2) { return h1.t < h2.t; }); + if (! hits.empty()) { // If the closest hit facet normal points in the same direction as the ray, // we are looking through the mesh and should therefore discard the point: - if (m_AABB_wrapper->get_hit_normal(hits.front()).dot(direction_to_camera_mesh) > 0.f) + if (hits.front().normal().dot(direction_to_camera_mesh.cast()) > 0) is_obscured = true; // Eradicate all hits that the caller wants to ignore for (unsigned j=0; jis_point_clipped(trafo.get_matrix() * m_AABB_wrapper->get_hit_pos(hit).cast())) { + if (clipping_plane && clipping_plane->is_point_clipped(trafo.get_matrix() * hits[j].position())) { hits.erase(hits.begin()+j); --j; } @@ -258,17 +219,12 @@ std::vector MeshRaycaster::get_unobscured_idxs(const Geometry::Transfo Vec3f MeshRaycaster::get_closest_point(const Vec3f& point, Vec3f* normal) const { int idx = 0; - Eigen::Matrix closest_point; - m_AABB_wrapper->m_AABB.squared_distance( - AABBWrapper::MapMatrixXfUnaligned(m_mesh->its.vertices.front().data(), m_mesh->its.vertices.size(), 3), - AABBWrapper::MapMatrixXiUnaligned(m_mesh->its.indices.front().data(), m_mesh->its.indices.size(), 3), - point, idx, closest_point); - if (normal) { - igl::Hit imag_hit; - imag_hit.id = idx; - *normal = m_AABB_wrapper->get_hit_normal(imag_hit); - } - return closest_point; + Vec3d closest_point; + m_emesh.squared_distance(point.cast(), idx, closest_point); + if (normal) + *normal = m_normals[idx]; + + return closest_point.cast(); } diff --git a/src/slic3r/GUI/MeshUtils.hpp b/src/slic3r/GUI/MeshUtils.hpp index e4c4c20d22..60dcb30c81 100644 --- a/src/slic3r/GUI/MeshUtils.hpp +++ b/src/slic3r/GUI/MeshUtils.hpp @@ -3,7 +3,10 @@ #include "libslic3r/Point.hpp" #include "libslic3r/Geometry.hpp" +#include "libslic3r/SLA/IndexedMesh.hpp" +#include "admesh/stl.h" +#include "slic3r/GUI/3DScene.hpp" #include @@ -17,7 +20,7 @@ namespace GUI { struct Camera; - +// lm_FIXME: Following class might possibly be replaced by Eigen::Hyperplane class ClippingPlane { double m_data[4]; @@ -25,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) @@ -46,7 +46,7 @@ public: bool operator!=(const ClippingPlane& cp) const { return ! (*this==cp); } double distance(const Vec3d& pt) const { - assert(is_approx(get_normal().norm(), 1.)); + // FIXME: this fails: assert(is_approx(get_normal().norm(), 1.)); return (-get_normal().dot(pt) + m_data[3]); } @@ -67,14 +67,24 @@ public: }; - +// MeshClipper class cuts a mesh and is able to return a triangulated cut. class MeshClipper { public: + // Inform MeshClipper about which plane we want to use to cut the mesh + // This is supposed to be in world coordinates. void set_plane(const ClippingPlane& plane); + + // Which mesh to cut. MeshClipper remembers const * to it, caller + // must make sure that it stays valid. void set_mesh(const TriangleMesh& mesh); + + // Inform the MeshClipper about the transformation that transforms the mesh + // into world coordinates. void set_transformation(const Geometry::Transformation& trafo); - const std::vector& get_triangles(); + // Render the triangulated cut. Transformation matrices should + // be set in world coords. + void render_cut(); private: void recalculate_triangles(); @@ -83,34 +93,62 @@ private: const TriangleMesh* m_mesh = nullptr; ClippingPlane m_plane; std::vector m_triangles2d; - std::vector m_triangles3d; + GLIndexedVertexArray m_vertex_array; bool m_triangles_valid = false; std::unique_ptr m_tms; }; - +// MeshRaycaster class answers queries such as where on the mesh someone clicked, +// whether certain points are visible or obscured by the mesh etc. class MeshRaycaster { public: - MeshRaycaster(const TriangleMesh& mesh); - ~MeshRaycaster(); - void set_transformation(const Geometry::Transformation& trafo); - void set_camera(const Camera& camera); + // 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); + } - bool unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, - Vec3f& position, Vec3f& normal, const ClippingPlane* clipping_plane = nullptr) const; + void line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera, + Vec3d& point, Vec3d& direction) const; - std::vector get_unobscured_idxs(const Geometry::Transformation& trafo, const Camera& camera, - const std::vector& points, const ClippingPlane* clipping_plane = nullptr) const; + // Given a mouse position, this returns true in case it is on the mesh. + bool unproject_on_mesh( + const Vec2d& mouse_pos, + const Transform3d& trafo, // how to get the mesh into world coords + 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) + size_t* facet_idx = nullptr // index of the facet hit + ) const; + + // Given a vector of points in woorld coordinates, this returns vector + // of indices of points that are visible (i.e. not cut by clipping plane + // or obscured by part of the mesh. + std::vector get_unobscured_idxs( + const Geometry::Transformation& trafo, // how to get the mesh into world coords + const Camera& camera, // current camera position + const std::vector& points, // points in world coords + const ClippingPlane* clipping_plane = nullptr // clipping plane (if active) + ) const; + + // 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: - // PIMPL wrapper around igl::AABB so I don't have to include the header-only IGL here - class AABBWrapper; - AABBWrapper* m_AABB_wrapper; - const TriangleMesh* m_mesh = nullptr; + sla::IndexedMesh m_emesh; + std::vector m_normals; }; diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp new file mode 100644 index 0000000000..44ccb8b3e7 --- /dev/null +++ b/src/slic3r/GUI/Mouse3DController.cpp @@ -0,0 +1,1215 @@ +#include "libslic3r/libslic3r.h" +#include "libslic3r/PresetBundle.hpp" +#include "Mouse3DController.hpp" + +#include "Camera.hpp" +#include "GUI_App.hpp" +#include "GLCanvas3D.hpp" +#include "Plater.hpp" +#include "NotificationManager.hpp" + +#include + +#include +#include +#include "I18N.hpp" + +#include + +//unofficial linux lib +//#include + +// WARN: If updating these lists, please also update resources/udev/90-3dconnexion.rules + +static const std::vector _3DCONNEXION_VENDORS = +{ + 0x046d, // LOGITECH = 1133 // Logitech (3Dconnexion is made by Logitech) + 0x256F // 3DCONNECTION = 9583 // 3Dconnexion +}; + +// See: https://github.com/FreeSpacenav/spacenavd/blob/a9eccf34e7cac969ee399f625aef827f4f4aaec6/src/dev.c#L202 +static const std::vector _3DCONNEXION_DEVICES = +{ + 0xc603, /* 50691 spacemouse plus XT */ + 0xc605, /* 50693 cadman */ + 0xc606, /* 50694 spacemouse classic */ + 0xc621, /* 50721 spaceball 5000 */ + 0xc623, /* 50723 space traveller */ + 0xc625, /* 50725 space pilot */ + 0xc626, /* 50726 space navigator *TESTED* */ + 0xc627, /* 50727 space explorer */ + 0xc628, /* 50728 space navigator for notebooks*/ + 0xc629, /* 50729 space pilot pro*/ + 0xc62b, /* 50731 space mouse pro*/ + 0xc62e, /* 50734 spacemouse wireless (USB cable) *TESTED* */ + 0xc62f, /* 50735 spacemouse wireless receiver */ + 0xc631, /* 50737 spacemouse pro wireless *TESTED* */ + 0xc632, /* 50738 spacemouse pro wireless receiver */ + 0xc633, /* 50739 spacemouse enterprise */ + 0xc635, /* 50741 spacemouse compact *TESTED* */ + 0xc636, /* 50742 spacemouse module */ + 0xc640, /* 50752 nulooq */ + 0xc652, /* 50770 3Dconnexion universal receiver *TESTED* */ +}; + +namespace Slic3r { +namespace GUI { + +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT +template +void update_maximum(std::atomic& maximum_value, T const& value) noexcept +{ + T prev_value = maximum_value; + while (prev_value < value && ! maximum_value.compare_exchange_weak(prev_value, value)) ; +} +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + +void Mouse3DController::State::append_translation(const Vec3d& translation, size_t input_queue_max_size) +{ + tbb::mutex::scoped_lock lock(m_input_queue_mutex); + while (m_input_queue.size() >= input_queue_max_size) + m_input_queue.pop_front(); + m_input_queue.emplace_back(QueueItem::translation(translation)); +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + update_maximum(input_queue_max_size_achieved, m_input_queue.size()); +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT +} + +void Mouse3DController::State::append_rotation(const Vec3f& rotation, size_t input_queue_max_size) +{ + tbb::mutex::scoped_lock lock(m_input_queue_mutex); + while (m_input_queue.size() >= input_queue_max_size) + m_input_queue.pop_front(); + m_input_queue.emplace_back(QueueItem::rotation(rotation.cast())); +#ifdef WIN32 + if (rotation.x() != 0.0f) + ++ m_mouse_wheel_counter; +#endif // WIN32 +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + update_maximum(input_queue_max_size_achieved, m_input_queue.size()); +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT +} + +void Mouse3DController::State::append_button(unsigned int id, size_t /* input_queue_max_size */) +{ + tbb::mutex::scoped_lock lock(m_input_queue_mutex); + m_input_queue.emplace_back(QueueItem::buttons(id)); +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + update_maximum(input_queue_max_size_achieved, m_input_queue.size()); +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT +} + +#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 DeviceIds; + typedef std::vector DeviceDataList; + typedef std::map 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(vendor_id), static_cast(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) +{ + int vid = 0; + int pid = 0; + if (sscanf(device.c_str(), "\\\\?\\HID#VID_%x&PID_%x&", &vid, &pid) == 2) { +// BOOST_LOG_TRIVIAL(trace) << boost::format("Mouse3DController::device_attached(VID_%04xxPID_%04x)") % vid % pid; +// BOOST_LOG_TRIVIAL(trace) << "Mouse3DController::device_attached: " << device; + if (std::find(_3DCONNEXION_VENDORS.begin(), _3DCONNEXION_VENDORS.end(), vid) != _3DCONNEXION_VENDORS.end()) { + // Signal the worker thread to wake up and enumerate HID devices, if not connected at the moment. + // The message may come multiple times per each USB device. For example, some USB wireless dongles register as multiple HID sockets + // for multiple devices to connect to. + // 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() +{ + tbb::mutex::scoped_lock lock(m_input_queue_mutex); + if (m_mouse_wheel_counter == 0) + // No 3DConnexion rotation has been captured since the last mouse scroll event. + return false; + if (std::find_if(m_input_queue.begin(), m_input_queue.end(), [](const QueueItem &item){ return item.is_rotation(); }) != m_input_queue.end()) { + // There is a rotation stored in the queue. Suppress one mouse scroll event. + -- m_mouse_wheel_counter; + return true; + } + m_mouse_wheel_counter = 0; + return true; +} +#endif // WIN32 + +bool Mouse3DController::State::apply(const Mouse3DController::Params ¶ms, Camera& camera) +{ + if (! wxGetApp().IsActive()) + return false; + + std::deque input_queue; + { + // Atomically move m_input_queue to input_queue. + tbb::mutex::scoped_lock lock(m_input_queue_mutex); + input_queue = std::move(m_input_queue); + m_input_queue.clear(); + } + + for (const QueueItem &input_queue_item : input_queue) { + if (input_queue_item.is_translation()) { + Vec3d translation = params.swap_yz ? Vec3d(input_queue_item.vector.x(), - input_queue_item.vector.z(), input_queue_item.vector.y()) : input_queue_item.vector; + double zoom_factor = camera.min_zoom() / camera.get_zoom(); + camera.set_target(camera.get_target() + zoom_factor * params.translation.scale * (translation.x() * camera.get_dir_right() + translation.z() * camera.get_dir_up())); + if (translation.y() != 0.0) + camera.update_zoom(params.zoom.scale * translation.y()); + } else if (input_queue_item.is_rotation()) { + Vec3d rot = params.rotation.scale * input_queue_item.vector * (PI / 180.); + 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) { + case 0: camera.update_zoom(1.0); break; + case 1: camera.update_zoom(-1.0); break; + default: break; + } + } + } + + return ! input_queue.empty(); +} + +// Load the device parameter database from appconfig. To be called on application startup. +void Mouse3DController::load_config(const AppConfig &appconfig) +{ + // 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 started. + m_params_by_device.clear(); + + for (const std::string &device_name : appconfig.get_mouse_device_names()) { + double translation_speed = 4.0; + float rotation_speed = 4.0; + double translation_deadzone = Params::DefaultTranslationDeadzone; + float rotation_deadzone = Params::DefaultRotationDeadzone; + double zoom_speed = 2.0; + bool swap_yz = false; + appconfig.get_mouse_device_translation_speed(device_name, translation_speed); + appconfig.get_mouse_device_translation_deadzone(device_name, translation_deadzone); + appconfig.get_mouse_device_rotation_speed(device_name, rotation_speed); + appconfig.get_mouse_device_rotation_deadzone(device_name, rotation_deadzone); + appconfig.get_mouse_device_zoom_speed(device_name, zoom_speed); + appconfig.get_mouse_device_swap_yz(device_name, swap_yz); + // clamp to valid values + Params params; + params.translation.scale = Params::DefaultTranslationScale * std::clamp(translation_speed, 0.1, 10.0); + params.translation.deadzone = std::clamp(translation_deadzone, 0.0, Params::MaxTranslationDeadzone); + params.rotation.scale = Params::DefaultRotationScale * std::clamp(rotation_speed, 0.1f, 10.0f); + params.rotation.deadzone = std::clamp(rotation_deadzone, 0.0f, Params::MaxRotationDeadzone); + params.zoom.scale = Params::DefaultZoomScale * std::clamp(zoom_speed, 0.1, 10.0); + params.swap_yz = swap_yz; + m_params_by_device[device_name] = std::move(params); + } +} + +// Store the device parameter database back to appconfig. To be called on application closeup. +void Mouse3DController::save_config(AppConfig &appconfig) const +{ + // We do not synchronize m_params_by_device with the background thread explicitely + // as there should be a full memory barrier executed once the background thread is stopped. + + for (const std::pair &key_value_pair : m_params_by_device) { + const std::string &device_name = key_value_pair.first; + const Params ¶ms = key_value_pair.second; + // Store current device parameters into the config + appconfig.set_mouse_device(device_name, params.translation.scale / Params::DefaultTranslationScale, params.translation.deadzone, + params.rotation.scale / Params::DefaultRotationScale, params.rotation.deadzone, params.zoom.scale / Params::DefaultZoomScale, params.swap_yz); + } +} + +bool Mouse3DController::apply(Camera& camera) +{ + // check if the user unplugged the device + if (! m_connected) { + // hides the settings dialog if the user un-plug the device + 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); +} + +void Mouse3DController::render_settings_dialog(GLCanvas3D& canvas) const +{ + if (! m_show_settings_dialog || ! m_connected) + return; + + // 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) { + m_show_settings_dialog = false; + m_settings_dialog_closed_by_user = false; + canvas.request_extra_frame(); + return; + } + + Params params_copy; + bool params_changed = false; + { + tbb::mutex::scoped_lock lock(m_params_ui_mutex); + params_copy = m_params_ui; + } + + Size cnv_size = canvas.get_canvas_size(); + + ImGuiWrapper& imgui = *wxGetApp().imgui(); + imgui.set_next_window_pos(0.5f * (float)cnv_size.get_width(), 0.5f * (float)cnv_size.get_height(), ImGuiCond_Always, 0.5f, 0.5f); + + 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) { + ImVec2 win_size = ImGui::GetWindowSize(); + 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; + canvas.request_extra_frame(); + } + + const ImVec4& color = ImGui::GetStyleColorVec4(ImGuiCol_Separator); + imgui.text_colored(color, _L("Device:")); + ImGui::SameLine(); + imgui.text(m_device_str); + + ImGui::Separator(); + 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")) { + 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")) { + 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")) { + params_copy.zoom.scale = Params::DefaultZoomScale * zoom_scale; + params_changed = true; + } + + ImGui::Separator(); + 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")) { + 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")) { + params_copy.rotation.deadzone = rotation_deadzone; + params_changed = true; + } + + ImGui::Separator(); + imgui.text_colored(color, _L("Options:")); + + bool swap_yz = params_copy.swap_yz; + if (imgui.checkbox(_L("Swap Y/Z axes"), swap_yz)) { + params_copy.swap_yz = swap_yz; + params_changed = true; + } + +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + ImGui::Separator(); + ImGui::Separator(); + imgui.text_colored(color, "DEBUG:"); + imgui.text_colored(color, "Vectors:"); + Vec3f translation = m_state.get_first_vector_of_type(State::QueueItem::TranslationType).cast(); + Vec3f rotation = m_state.get_first_vector_of_type(State::QueueItem::RotationType).cast(); + ImGui::InputFloat3("Translation##3", translation.data(), "%.3f", ImGuiInputTextFlags_ReadOnly); + ImGui::InputFloat3("Rotation##3", rotation.data(), "%.3f", ImGuiInputTextFlags_ReadOnly); + + 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 (input_queue_size_param > 0) { + params_copy.input_queue_max_size = input_queue_size_param; + params_changed = true; + } + } + + ImGui::Separator(); + imgui.text_colored(color, "Camera:"); + Vec3f target = wxGetApp().plater()->get_camera().get_target().cast(); + ImGui::InputFloat3("Target", target.data(), "%.3f", ImGuiInputTextFlags_ReadOnly); +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + + ImGui::Separator(); + if (imgui.button(_L("Close"))) { + // the user clicked on the [Close] button + m_settings_dialog_closed_by_user = true; + canvas.set_as_dirty(); + } + } + else { + // the user clicked on the [X] button + m_settings_dialog_closed_by_user = true; + canvas.set_as_dirty(); + } + } + + imgui.end(); + + if (params_changed) { + // Synchronize front end parameters to back end. + tbb::mutex::scoped_lock lock(m_params_ui_mutex); + auto pthis = const_cast(this); +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + if (params_copy.input_queue_max_size != params_copy.input_queue_max_size) + // Reset the statistics counter. + m_state.input_queue_max_size_achieved = 0; +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + pthis->m_params_ui = params_copy; + pthis->m_params_ui_changed = true; + } +} + +#if __APPLE__ + +void Mouse3DController::connected(std::string device_name) +{ + assert(! m_connected); + assert(m_device_str.empty()); + m_device_str = device_name; + // Copy the parameters for m_device_str into the current parameters. + 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; + } + m_connected = true; +} + +void Mouse3DController::disconnected() +{ + // Copy the current parameters for m_device_str into the parameter database. + assert(m_connected == ! m_device_str.empty()); + if (m_connected) { + tbb::mutex::scoped_lock lock(m_params_ui_mutex); + 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()->get_current_canvas3D())); + + wxGetApp().plater()->CallAfter([]() { + Plater *plater = wxGetApp().plater(); + if (plater != nullptr) { + plater->get_camera().recover_from_free_camera(); + plater->set_current_canvas_as_dirty(); + } + }); + } +} + +bool Mouse3DController::handle_input(const DataPacketAxis& packet) +{ + if (! wxGetApp().IsActive()) + return false; + + { + // Synchronize parameters between the UI thread and the background thread. + //FIXME is this necessary on OSX? Are these notifications triggered from the main thread or from a worker thread? + tbb::mutex::scoped_lock lock(m_params_ui_mutex); + if (m_params_ui_changed) { + m_params = m_params_ui; + m_params_ui_changed = false; + } + } + + bool updated = false; + // translation + double deadzone = m_params.translation.deadzone; + Vec3d translation(std::abs(packet[0]) > deadzone ? -packet[0] : 0.0, + std::abs(packet[1]) > deadzone ? packet[1] : 0.0, + std::abs(packet[2]) > deadzone ? packet[2] : 0.0); + if (! translation.isApprox(Vec3d::Zero())) { + m_state.append_translation(translation, m_params.input_queue_max_size); + updated = true; + } + // rotation + deadzone = m_params.rotation.deadzone; + Vec3f rotation(std::abs(packet[3]) > deadzone ? (float)packet[3] : 0.0, + std::abs(packet[4]) > deadzone ? (float)packet[4] : 0.0, + std::abs(packet[5]) > deadzone ? (float)packet[5] : 0.0); + if (! rotation.isApprox(Vec3f::Zero())) { + m_state.append_rotation(rotation, m_params.input_queue_max_size); + updated = true; + } + + if (updated) { + wxGetApp().plater()->set_current_canvas_as_dirty(); + // ask for an idle event to update 3D scene + wxWakeUpIdle(); + } + return updated; +} + +#else //__APPLE__ + +// 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 + } +} + +// Closing the application. +void Mouse3DController::shutdown() +{ + if (m_thread.joinable()) { + // Stop the worker thread, if running. + { + // Notify the worker thread to cancel wait on detection polling. + std::lock_guard lock(m_stop_condition_mutex); + m_stop = true; + } + m_stop_condition.notify_all(); + // Wait for the worker thread to stop. + 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. +void Mouse3DController::run() +{ + // Initialize the hidapi library + int res = hid_init(); + if (res != 0) { + // Give up. +#if defined(__unix__) || defined(__unix) || defined(unix) + if (res == -1) + // Hopefully this error code comes from our bundled patched hidapi. In that case, -1 is returned by hid_wrapper_udev_init() and it mean + BOOST_LOG_TRIVIAL(error) << "Unable to initialize hidapi library: failed to load libudev.so.1 or libudev.so.0"; + else if (res == -2) + // Hopefully this error code comes from our bundled patched hidapi. In that case, -2 is returned by hid_wrapper_udev_init() and it mean + BOOST_LOG_TRIVIAL(error) << "Unable to initialize hidapi library: failed to resolve some function from libudev.so.1 or libudev.so.0"; + else +#endif // unixes + BOOST_LOG_TRIVIAL(error) << "Unable to initialize hidapi library"; + return; + } + +#ifdef _WIN32 + // Enumerate once just after thread start. + m_wakeup = true; +#endif // _WIN32 + + for (;;) { + { + tbb::mutex::scoped_lock lock(m_params_ui_mutex); + if (m_stop) + break; + if (m_params_ui_changed) { + m_params = m_params_ui; + m_params_ui_changed = false; + } + } + if (m_device == nullptr) + // Polls the HID devices, blocks for maximum 2 seconds. + m_connected = this->connect_device(); + else + // Waits for 3DConnexion mouse input for maximum 100ms, then repeats. + this->collect_input(); + } + + this->disconnect_device(); + + // Finalize the hidapi library + hid_exit(); +} + +bool Mouse3DController::connect_device() +{ + if (m_stop) + return false; + + { + // Wait for 2 seconds, but cancellable by m_stop. + std::unique_lock lock(m_stop_condition_mutex); +#ifdef _WIN32 + // Wait indifinetely for the stop signal. + m_stop_condition.wait(lock, [this]{ return m_stop || m_wakeup; }); + m_wakeup = false; +#else + m_stop_condition.wait_for(lock, std::chrono::seconds(2), [this]{ return m_stop; }); +#endif + } + + if (m_stop) + return false; + + // Enumerates devices + hid_device_info* devices = hid_enumerate(0, 0); + if (devices == nullptr) { + BOOST_LOG_TRIVIAL(trace) << "Mouse3DController::connect_device() - no HID device enumerated."; + return false; + } + +#ifdef _WIN32 + BOOST_LOG_TRIVIAL(trace) << "Mouse3DController::connect_device() - enumerating HID devices."; +#endif // _WIN32 + + // Searches for 1st connected 3Dconnexion device + struct DeviceData + { + std::string path; + unsigned short usage_page; + unsigned short usage; + + DeviceData() + : path(""), usage_page(0), usage(0) + {} + DeviceData(const std::string& path, unsigned short usage_page, unsigned short usage) + : path(path), 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; } + }; + +#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) { + std::cout << "\""; + std::wcout << ((cur->manufacturer_string != nullptr) ? cur->manufacturer_string : L"Unknown"); + std::cout << "/"; + std::wcout << ((cur->product_string != nullptr) ? cur->product_string : L"Unknown"); + std::cout << "\" code: " << cur->vendor_id << "/" << cur->product_id << " (" << std::hex << cur->vendor_id << "/" << cur->product_id << std::dec << ")"; + std::cout << " serial number: '"; + std::wcout << ((cur->serial_number != nullptr) ? cur->serial_number : L"Unknown"); + std::cout << "' usage page: " << cur->usage_page << " usage: " << cur->usage << " interface number: " << cur->interface_number << std::endl; + + cur = cur->next; + } +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + + // 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: + // On Windows and Mac: usage_page == 1 and usage == 8 + // On Linux: as usage_page and usage are not defined (see hidapi.h) we try all detected devices until one is succesfully open + // 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 DeviceIds; + typedef std::vector DeviceDataList; + typedef std::map DetectedDevices; + DetectedDevices detected_devices; +#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) { + 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->path, current->usage_page, current->usage); + +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + std::wcout << "\"" << ((current->manufacturer_string != nullptr) ? current->manufacturer_string : L"Unknown"); + std::cout << "/"; + std::wcout << ((current->product_string != nullptr) ? current->product_string : L"Unknown"); + std::cout << "\" code: " << current->vendor_id << "/" << current->product_id << " (" << std::hex << current->vendor_id << "/" << current->product_id << std::dec << ")"; + std::cout << " serial number: '"; + std::wcout << ((current->serial_number != nullptr) ? current->serial_number : L"Unknown"); + std::cout << "' usage page: " << current->usage_page << " usage: " << current->usage << std::endl; +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + } + } + } + + current = current->next; + } + + // Free enumerated devices + hid_free_enumeration(devices); + + if (detected_devices.empty()) + return false; + + 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) { +#if defined(__linux__) + hid_device* test_device = hid_open(device.first.first, device.first.second, nullptr); + if (test_device != nullptr) { + hid_close(test_device); +#else + if (device.second.front().has_valid_usage()) { +#endif // __linux__ + vendor_id = device.first.first; + product_id = device.first.second; + break; + } + } + 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) { +#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) { + path = data.path; + vendor_id = device.first.first; + product_id = device.first.second; + found = true; +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + std::cout << "-> PASSED" << std::endl; +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + hid_close(test_device); + break; + } +#else // !__linux__ + if (data.has_valid_usage()) { + path = data.path; + vendor_id = device.first.first; + product_id = device.first.second; + found = true; +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + std::cout << "-> PASSED" << std::endl; +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + break; + } +#endif // __linux__ +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + else + std::cout << "-> NOT PASSED" << std::endl; +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + } + + if (found) + break; + } + } + + 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; +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + m_device = hid_open(vendor_id, product_id, nullptr); + } + else + return false; + } + 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; +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + m_device = hid_open_path(path.c_str()); + } + + if (m_device != nullptr) { + wchar_t buffer[1024]; + hid_get_manufacturer_string(m_device, buffer, 1024); + m_device_str = boost::nowide::narrow(buffer); + // #3479 seems to show that sometimes an extra whitespace is added, so we remove it + boost::algorithm::trim(m_device_str); + + hid_get_product_string(m_device, buffer, 1024); + m_device_str += "/" + boost::nowide::narrow(buffer); + // #3479 seems to show that sometimes an extra whitespace is added, so we remove it + boost::algorithm::trim(m_device_str); + + BOOST_LOG_TRIVIAL(info) << "Connected 3DConnexion device:"; + BOOST_LOG_TRIVIAL(info) << "Manufacturer/product: " << m_device_str; + BOOST_LOG_TRIVIAL(info) << "Manufacturer id.....: " << vendor_id << " (" << std::hex << vendor_id << std::dec << ")"; + BOOST_LOG_TRIVIAL(info) << "Product id..........: " << product_id << " (" << std::hex << product_id << std::dec << ")"; + if (!path.empty()) + BOOST_LOG_TRIVIAL(info) << "Path................: '" << path << "'"; +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + std::cout << "Opened device." << std::endl; +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + // Copy the parameters for m_device_str into the current parameters. + 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; + } + } +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + 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; + std::cout << "Product id..........: " << product_id << " (" << std::hex << product_id << std::dec << ")" << std::endl; + std::cout << "Path................: '" << path << "'" << std::endl; + } +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + + return (m_device != nullptr); +} + +void Mouse3DController::disconnect_device() +{ + if (m_device) { + hid_close(m_device); + m_device = nullptr; + BOOST_LOG_TRIVIAL(info) << "Disconnected device: " << m_device_str; + // Copy the current parameters for m_device_str into the parameter database. + { + tbb::mutex::scoped_lock lock(m_params_ui_mutex); + m_params_by_device[m_device_str] = m_params_ui; + } + m_device_str.clear(); + m_connected = false; +#ifdef _WIN32 + // Enumerate once immediately after disconnect. + m_wakeup = true; +#endif // _WIN32 + wxGetApp().plater()->CallAfter([]() { + Plater *plater = wxGetApp().plater(); + if (plater != nullptr) { + plater->get_camera().recover_from_free_camera(); + plater->set_current_canvas_as_dirty(); + } + }); + } +} + +void Mouse3DController::collect_input() +{ + DataPacketRaw packet = { 0 }; + // Read packet, block maximum 100 ms. That means when closing the application, closing the application will be delayed by 100 ms. + int res = hid_read_timeout(m_device, packet.data(), packet.size(), 100); + if (res < 0) { + // An error occourred (device detached from pc ?). Close the 3Dconnexion device. + this->disconnect_device(); + } else + 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_length, const Params ¶ms, State &state_in_out) +{ + if (! wxGetApp().IsActive()) + return false; + + int res = packet_length; + bool updated = false; + + if (res == 7 || res == 13 || + // On Mac button packets can be 3 bytes long + ((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 (updated) { + wxGetApp().plater()->set_current_canvas_as_dirty(); + // ask for an idle event to update 3D scene + wxWakeUpIdle(); + } + 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 int packet_length, const Params ¶ms, State &state_in_out) +{ + switch (packet[0]) + { + case 1: // Translation + Rotation + { + 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; + } + case 2: // Rotation + { + if (handle_packet_rotation(packet, 1, params, state_in_out)) + return true; + + break; + } + case 3: // Button + { + if (params.buttons_enabled && handle_packet_button(packet, packet.size() - 1, 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) +{ + int value = coord_byte_low | (coord_byte_high << 8); + if (value >= 32768) + value = value - 65536; + double ret = (double)value / 350.0; + return (std::abs(ret) > deadzone) ? ret : 0.0; +} + +// Unpack raw 3DConnexion HID packet, decode state of translation axes into state_in_out. Called by handle_input() from the worker thread. +bool Mouse3DController::handle_packet_translation(const DataPacketRaw& packet, const Params ¶ms, State &state_in_out) +{ + double deadzone = params.translation.deadzone; + Vec3d translation(-convert_input(packet[1], packet[2], deadzone), + convert_input(packet[3], packet[4], deadzone), + convert_input(packet[5], packet[6], deadzone)); + + if (!translation.isApprox(Vec3d::Zero())) + { + state_in_out.append_translation(translation, params.input_queue_max_size); + return true; + } + + return false; +} + +// Unpack raw 3DConnexion HID packet, decode state of rotation axes into state_in_out. Called by the handle_input() from worker thread. +bool Mouse3DController::handle_packet_rotation(const DataPacketRaw& packet, unsigned int first_byte, const Params ¶ms, State &state_in_out) +{ + double deadzone = (double)params.rotation.deadzone; + Vec3f rotation((float)convert_input(packet[first_byte + 0], packet[first_byte + 1], deadzone), + (float)convert_input(packet[first_byte + 2], packet[first_byte + 3], deadzone), + (float)convert_input(packet[first_byte + 4], packet[first_byte + 5], deadzone)); + + if (!rotation.isApprox(Vec3f::Zero())) + { + state_in_out.append_rotation(rotation, params.input_queue_max_size); + return true; + } + + return false; +} + +// Unpack raw 3DConnexion HID packet, decode button state into state_in_out. Called by handle_input() from the worker thread. +bool Mouse3DController::handle_packet_button(const DataPacketRaw& packet, unsigned int packet_size, const Params ¶ms, State &state_in_out) +{ + unsigned int data = 0; + for (unsigned int i = 1; i < packet_size; ++i) + { + data |= packet[i] << 8 * (i - 1); + } + + const std::bitset<32> data_bits{ data }; + for (size_t i = 0; i < data_bits.size(); ++i) + { + if (data_bits.test(i)) + { + state_in_out.append_button((unsigned int)i, params.input_queue_max_size); + return true; + } + } + + return false; +} + +#endif //__APPLE__ + +} // namespace GUI +} // namespace Slic3r diff --git a/src/slic3r/GUI/Mouse3DController.hpp b/src/slic3r/GUI/Mouse3DController.hpp new file mode 100644 index 0000000000..559e0874f1 --- /dev/null +++ b/src/slic3r/GUI/Mouse3DController.hpp @@ -0,0 +1,239 @@ +#ifndef slic3r_Mouse3DController_hpp_ +#define slic3r_Mouse3DController_hpp_ + +// Enabled debug output to console and extended imgui dialog +#define ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT 0 + +#include "libslic3r/Point.hpp" + +#include "hidapi.h" + +#include +#include +#include +#include +#include + +#include + +namespace Slic3r { + +class AppConfig; + +namespace GUI { + +struct Camera; +class GLCanvas3D; + +class Mouse3DController +{ + // Parameters, which are configured by the ImGUI dialog when pressing Ctrl+M. + // The UI thread modifies a copy of the parameters and indicates to the background thread that there was a change + // to copy the parameters. + struct Params + { + static constexpr double DefaultTranslationScale = 2.5; + 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 + struct CustomParameters + { + Number scale; + Number deadzone; + }; + + CustomParameters translation { DefaultTranslationScale, DefaultTranslationDeadzone }; + CustomParameters rotation { DefaultRotationScale, DefaultRotationDeadzone }; + CustomParameters zoom { DefaultZoomScale, 0.0 }; + // Do not process button presses from 3DConnexion device, let the user map the 3DConnexion keys in 3DConnexion driver. + bool buttons_enabled { false }; + // The default value of 15 for max_size seems to work fine on all platforms + // The effects of changing this value can be tested by setting ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT to 1 + // and playing with the imgui dialog which shows by pressing CTRL+M + size_t input_queue_max_size { 15 }; + // Whether to swap Y/Z axes or not. + bool swap_yz{ false }; + }; + + // Queue of the 3DConnexion input events (translations, rotations, button presses). + class State + { + public: + struct QueueItem { + static QueueItem translation(const Vec3d &translation) { QueueItem out; out.vector = translation; out.type_or_buttons = TranslationType; return out; } + static QueueItem rotation(const Vec3d &rotation) { QueueItem out; out.vector = rotation; out.type_or_buttons = RotationType; return out; } + static QueueItem buttons(unsigned int buttons) { QueueItem out; out.type_or_buttons = buttons; return out; } + + bool is_translation() const { return this->type_or_buttons == TranslationType; } + bool is_rotation() const { return this->type_or_buttons == RotationType; } + bool is_buttons() const { return ! this->is_translation() && ! this->is_rotation(); } + + Vec3d vector; + unsigned int type_or_buttons; + + static constexpr unsigned int TranslationType = std::numeric_limits::max(); + static constexpr unsigned int RotationType = TranslationType - 1; + }; + + private: + // m_input_queue is accessed by the background thread and by the UI thread. Access to m_input_queue + // is guarded with m_input_queue_mutex. + std::deque m_input_queue; + mutable tbb::mutex m_input_queue_mutex; + +#ifdef WIN32 + // When the 3Dconnexion driver is running the system gets, by default, mouse wheel events when rotations around the X axis are detected. + // We want to filter these out because we are getting the data directly from the device, bypassing the driver, and those mouse wheel events interfere + // by triggering unwanted zoom in/out of the scene + // The following variable is used to count the potential mouse wheel events triggered and is updated by: + // Mouse3DController::collect_input() through the call to the append_rotation() method + // GLCanvas3D::on_mouse_wheel() through the call to the process_mouse_wheel() method + // GLCanvas3D::on_idle() through the call to the apply() method + unsigned int m_mouse_wheel_counter { 0 }; +#endif /* WIN32 */ + + public: + // Called by the background thread or by by Mouse3DHandlerMac.mm when a new event is received from 3DConnexion device. + void append_translation(const Vec3d& translation, size_t input_queue_max_size); + void append_rotation(const Vec3f& rotation, size_t input_queue_max_size); + void append_button(unsigned int id, size_t input_queue_max_size); + +#ifdef WIN32 + // Called by GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt) + // to filter out spurious mouse scroll events produced by the 3DConnexion driver on Windows. + bool process_mouse_wheel(); +#endif /* WIN32 */ + +#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + Vec3d get_first_vector_of_type(unsigned int type) const { + tbb::mutex::scoped_lock lock(m_input_queue_mutex); + auto it = std::find_if(m_input_queue.begin(), m_input_queue.end(), [type](const QueueItem& item) { return item.type_or_buttons == type; }); + return (it == m_input_queue.end()) ? Vec3d::Zero() : it->vector; + } + size_t input_queue_size_current() const { + tbb::mutex::scoped_lock lock(m_input_queue_mutex); + return m_input_queue.size(); + } + std::atomic input_queue_max_size_achieved; +#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT + + // Apply the 3DConnexion events stored in the input queue, reset the input queue. + // Returns true if any change to the camera took place. + bool apply(const Params ¶ms, Camera& camera); + }; + + // Background thread works with this copy. + Params m_params; + // UI thread will read / write this copy. + Params m_params_ui; + bool m_params_ui_changed { false }; + mutable tbb::mutex m_params_ui_mutex; + + // This is a database of parametes of all 3DConnexion devices ever connected. + // This database is loaded from AppConfig on application start and it is stored to AppConfig on application exit. + // We need to do that as the AppConfig is not thread safe and we need read the parameters on device connect / disconnect, + // which is now done by a background thread. + std::map m_params_by_device; + + mutable State m_state; + std::atomic m_connected { false }; + std::string m_device_str; + +#if ! __APPLE__ + // Worker thread for enumerating devices, connecting, reading data from the device and closing the device. + std::thread m_thread; + hid_device* m_device { nullptr }; + // Using m_stop_condition_mutex to synchronize m_stop. + bool m_stop { false }; +#ifdef _WIN32 + std::atomic m_wakeup { false }; +#endif /* _WIN32 */ + // Mutex and condition variable for sleeping during the detection of 3DConnexion devices by polling while allowing + // cancellation before the end of the polling interval. + std::mutex m_stop_condition_mutex; + std::condition_variable m_stop_condition; +#endif + + // Is the ImGUI dialog shown? Accessed from UI thread only. + mutable bool m_show_settings_dialog { false }; + // Set to true when ther user closes the dialog by clicking on [X] or [Close] buttons. Accessed from UI thread only. + mutable bool m_settings_dialog_closed_by_user { false }; + +public: + // Load the device parameter database from appconfig. To be called on application startup. + void load_config(const AppConfig &appconfig); + // Store the device parameter database back to appconfig. To be called on application closeup. + void save_config(AppConfig &appconfig) const; + // Start the background thread to detect and connect to a HID device (Windows and Linux). + // Connect to a 3DConnextion driver (OSX). + // Call load_config() before init(). + void init(); + // Stop the background thread (Windows and Linux). + // Disconnect from a 3DConnextion driver (OSX). + // Call save_config() after shutdown(). + void shutdown(); + + bool connected() const { return m_connected; } + +#if __APPLE__ + // Interfacing with the Objective C code (MouseHandlerMac.mm) + void connected(std::string device_name); + void disconnected(); + typedef std::array DataPacketAxis; + // Unpack a 3DConnexion packet provided by the 3DConnexion driver into m_state. Called by Mouse3DHandlerMac.mm + bool handle_input(const DataPacketAxis& packet); +#endif // __APPLE__ + +#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 + + // Apply the received 3DConnexion mouse events to the camera. Called from the UI rendering thread. + bool apply(Camera& camera); + + bool is_settings_dialog_shown() const { return m_show_settings_dialog; } + void show_settings_dialog(bool show) { m_show_settings_dialog = show && this->connected(); } + void render_settings_dialog(GLCanvas3D& canvas) const; + +#if ! __APPLE__ +private: + bool connect_device(); + void disconnect_device(); + + // secondary thread methods + void run(); + void collect_input(); + + typedef std::array 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_length, const Params ¶ms, State &state_in_out); + // The following is called by handle_input() from the worker thread. + static bool handle_packet(const DataPacketRaw& packet, const int packet_length, const Params ¶ms, State &state_in_out); + static bool handle_packet_translation(const DataPacketRaw& packet, const Params ¶ms, State &state_in_out); + static bool handle_packet_rotation(const DataPacketRaw& packet, unsigned int first_byte, const Params ¶ms, State &state_in_out); + static bool handle_packet_button(const DataPacketRaw& packet, unsigned int packet_size, const Params ¶ms, State &state_in_out); +#endif /* __APPLE__ */ +}; + +} // namespace GUI +} // namespace Slic3r + + +#endif // slic3r_Mouse3DController_hpp_ diff --git a/src/slic3r/GUI/Mouse3DHandlerMac.mm b/src/slic3r/GUI/Mouse3DHandlerMac.mm new file mode 100644 index 0000000000..b2d07a4e0b --- /dev/null +++ b/src/slic3r/GUI/Mouse3DHandlerMac.mm @@ -0,0 +1,225 @@ +#include "Mouse3DController.hpp" + +#include +#include + +#include + +#include +#include + + +static Slic3r::GUI::Mouse3DController* mouse_3d_controller = nullptr; + +static uint16_t clientID = 0; + +static bool driver_loaded = false; +static bool has_new_driver = false; // drivers >= 10.2.2 are "new", and can process events on a separate thread + +// replicate just enough of the 3Dx API for our uses, not everything the driver provides + +#define kConnexionClientModeTakeOver 1 +#define kConnexionMaskAxis 0x3f00 +#define kConnexionMaskAll 0x3fff +#define kConnexionMaskAllButtons 0xffffffff +#define kConnexionCmdHandleButtons 2 +#define kConnexionCmdHandleAxis 3 +#define kConnexionCmdAppSpecific 10 +#define kConnexionMsgDeviceState '3dSR' +#define kConnexionCtlGetDeviceID '3did' + +#pragma pack(push, 2) +struct ConnexionDeviceState { + uint16_t version; + uint16_t client; + uint16_t command; + int16_t param; + int32_t value; + uint64_t time; + uint8_t report[8]; + uint16_t buttons8; // obsolete! (pre-10.x drivers) + int16_t axis[6]; // tx, ty, tz, rx, ry, rz + uint16_t address; + uint32_t buttons; +}; +#pragma pack(pop) + +// callback functions: +typedef void (*AddedHandler)(uint32_t); +typedef void (*RemovedHandler)(uint32_t); +typedef void (*MessageHandler)(uint32_t, uint32_t msg_type, void *msg_arg); + +// driver functions: +typedef int16_t (*SetConnexionHandlers_ptr)(MessageHandler, AddedHandler, RemovedHandler, bool); +typedef int16_t (*InstallConnexionHandlers_ptr)(MessageHandler, AddedHandler, RemovedHandler); +typedef void (*CleanupConnexionHandlers_ptr)(); +typedef uint16_t (*RegisterConnexionClient_ptr)(uint32_t signature, + const char *name, + uint16_t mode, + uint32_t mask); +typedef void (*SetConnexionClientButtonMask_ptr)(uint16_t clientID, uint32_t buttonMask); +typedef void (*UnregisterConnexionClient_ptr)(uint16_t clientID); +typedef int16_t (*ConnexionClientControl_ptr)(uint16_t clientID, + uint32_t message, + int32_t param, + int32_t *result); + +#define DECLARE_FUNC(name) name##_ptr name = nullptr + +DECLARE_FUNC(SetConnexionHandlers); +DECLARE_FUNC(InstallConnexionHandlers); +DECLARE_FUNC(CleanupConnexionHandlers); +DECLARE_FUNC(RegisterConnexionClient); +DECLARE_FUNC(SetConnexionClientButtonMask); +DECLARE_FUNC(UnregisterConnexionClient); +DECLARE_FUNC(ConnexionClientControl); + +static void *load_func(void *module, const char *func_name) +{ + void *func = dlsym(module, func_name); + + if (func) { + BOOST_LOG_TRIVIAL(info) << func_name <<" loaded"; + } + else { + BOOST_LOG_TRIVIAL(error) <<"loading 3dx drivers dlsym error: "<< dlerror(); + } + + return func; +} + +#define LOAD_FUNC(name) name = (name##_ptr)load_func(module, #name) + +static void *module; // handle to the whole driver + +static bool load_driver_functions() +{ + if (driver_loaded) + return true; + + module = dlopen("/Library/Frameworks/3DconnexionClient.framework/3DconnexionClient", + RTLD_LAZY | RTLD_LOCAL); + + if (module) { + BOOST_LOG_TRIVIAL(info) << "loading 3dx drivers"; + LOAD_FUNC(SetConnexionHandlers); + + if (SetConnexionHandlers != nullptr) { + driver_loaded = true; + has_new_driver = true; + } + else { + BOOST_LOG_TRIVIAL(info) << "installing 3dx drivers"; + LOAD_FUNC(InstallConnexionHandlers); + driver_loaded = (InstallConnexionHandlers != nullptr); + } + + if (driver_loaded) { + LOAD_FUNC(CleanupConnexionHandlers); + LOAD_FUNC(RegisterConnexionClient); + LOAD_FUNC(SetConnexionClientButtonMask); + LOAD_FUNC(UnregisterConnexionClient); + LOAD_FUNC(ConnexionClientControl); + } + } + else { + BOOST_LOG_TRIVIAL(error) << "3dx drivers module loading error: "<< dlerror() ; + } + + BOOST_LOG_TRIVIAL(info) << "3dx drivers loaded: " << (driver_loaded ? (has_new_driver ? "YES, new" : "YES, old") : "NO"); + return driver_loaded; +} + +static void unload_driver() +{ + dlclose(module); +} + +static void DeviceAdded(uint32_t unused) +{ + BOOST_LOG_TRIVIAL(info)<<"3dx device added"; + // determine exactly which device is plugged in + int32_t result; + ConnexionClientControl(clientID, kConnexionCtlGetDeviceID, 0, &result); + int vendorID = result >> 16; + int productID = result & 0xffff; + //TODO: verify device + char buf[64]; + sprintf(buf, "VID%04X,PID%04X", vendorID, productID); + mouse_3d_controller->connected(buf); +} + +static void DeviceRemoved(uint32_t unused) +{ + BOOST_LOG_TRIVIAL(info) << "3dx device removed\n"; +// not accessible in a free function +// assert(m_connected); +// assert(! m_device_str.empty()); + mouse_3d_controller->disconnected(); +} + +static void DeviceEvent(uint32_t unused, uint32_t msg_type, void *msg_arg) +{ + if (msg_type == kConnexionMsgDeviceState) { + ConnexionDeviceState *s = (ConnexionDeviceState *)msg_arg; + if (s->client == clientID) { + switch (s->command) { + case kConnexionCmdHandleAxis: { + // The axis field is an array of 6 signed 16-bit integers corresponding to the 6 device axes. Data is ordered as Tx, Tz, Ty, Rx, Rz, Ry. The values reported are scaled by the driver according to the speed slider settings on the 3Dconnexion preference panel. At maximum speed, the range is - 1024 to 1024. Typical range that you should optimize your application for should be -500 to 500. + // Actually we are getting values way over 1024. Max is probably 2048 now. + Slic3r::GUI::Mouse3DController::DataPacketAxis packet; + for (int i = 0; i < 6; ++ i) + packet[i] = (double)s->axis[i]/350.0;//wanted to divide by 500 but 350 is used at raw input so i used same value. + mouse_3d_controller->handle_input(packet); + break; + } + case kConnexionCmdHandleButtons: + break; + case kConnexionCmdAppSpecific: + break; + default: + break; + } + } + } +} + +namespace Slic3r { +namespace GUI { + +// Initialize the application. +void Mouse3DController::init() +{ + BOOST_LOG_TRIVIAL(info) << "3dx mac handler starts"; + if (load_driver_functions()) { + mouse_3d_controller = this; + + uint16_t error = has_new_driver ? + SetConnexionHandlers(DeviceEvent, DeviceAdded, DeviceRemoved, false) : + InstallConnexionHandlers(DeviceEvent, DeviceAdded, DeviceRemoved); + + if (! error) { + // Registration is done either by 4letter constant (CFBundleSignature - obsolete + //and we dont have that) or Executable name in pascal string(first byte is string lenght). + //If no packets are recieved the name might be different - check cmake. If debugging try commenting + // set_target_properties(PrusaSlicer PROPERTIES OUTPUT_NAME "prusa-slicer") + clientID = RegisterConnexionClient( + 0, "\013PrusaSlicer", kConnexionClientModeTakeOver, kConnexionMaskAxis); + BOOST_LOG_TRIVIAL(info) << "3dx mac handler registered"; + } + } +} + +void Mouse3DController::shutdown() +{ + if (driver_loaded) { + UnregisterConnexionClient(clientID); + CleanupConnexionHandlers(); + unload_driver(); + } + // Copy the current parameters to parameter database, mark the device as disconnected. + this->disconnected(); + mouse_3d_controller = nullptr; +} + +}}//namespace Slic3r::GUI diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp index d1879e4bab..5b583ba2a3 100644 --- a/src/slic3r/GUI/MsgDialog.cpp +++ b/src/slic3r/GUI/MsgDialog.cpp @@ -53,7 +53,7 @@ MsgDialog::MsgDialog(wxWindow *parent, const wxString &title, const wxString &he rightsizer->Add(btn_sizer, 0, wxALIGN_RIGHT); if (! bitmap.IsOk()) { - bitmap = create_scaled_bitmap(this, "PrusaSlicer_192px.png", 192); + bitmap = create_scaled_bitmap("PrusaSlicer_192px.png", this, 192); } logo = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap); @@ -81,7 +81,7 @@ ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg) html->SetMinSize(wxSize(40 * wxGetApp().em_unit(), -1)); wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); wxColour text_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT); - wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_FRAMEBK); // wxSYS_COLOUR_WINDOW + 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; @@ -99,7 +99,7 @@ ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg) btn_ok->SetFocus(); btn_sizer->Add(btn_ok, 0, wxRIGHT, HORIZ_SPACING); - logo->SetBitmap(create_scaled_bitmap(this, "PrusaSlicer_192px_grayscale.png", 192)); + logo->SetBitmap(create_scaled_bitmap("PrusaSlicer_192px_grayscale.png", this, 192)); SetMaxSize(wxSize(-1, CONTENT_MAX_HEIGHT*wxGetApp().em_unit())); Fit(); diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp new file mode 100644 index 0000000000..e59d61d0a0 --- /dev/null +++ b/src/slic3r/GUI/NotificationManager.cpp @@ -0,0 +1,1199 @@ +#include "NotificationManager.hpp" + +#include "GUI_App.hpp" +#include "GUI.hpp" +#include "Plater.hpp" +#include "GLCanvas3D.hpp" +#include "ImGuiWrapper.hpp" + +#include "wxExtensions.hpp" + +#include +#include +#include + +#include + +#include + +static constexpr float GAP_WIDTH = 10.0f; +static constexpr float SPACE_RIGHT_PANEL = 10.0f; + +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(argv), wxEXEC_ASYNC, nullptr); +#elif __APPLE__ + const char* argv[] = { "open", path.data(), nullptr }; + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr); +#else + const char* argv[] = { "xdg-open", path.data(), nullptr }; + + // Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars, + // because they may mess up the environment expected by the file manager. + // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure. + if (wxGetEnv("APPIMAGE", nullptr)) { + // We're running from AppImage + wxEnvVariableHashMap env_vars; + wxGetEnvMap(&env_vars); + + env_vars.erase("APPIMAGE"); + env_vars.erase("APPDIR"); + env_vars.erase("LD_LIBRARY_PATH"); + env_vars.erase("LD_PRELOAD"); + env_vars.erase("UNION_PRELOAD"); + + wxExecuteEnv exec_env; + exec_env.env = std::move(env_vars); + + wxString owd; + if (wxGetEnv("OWD", &owd)) { + // This is the original work directory from which the AppImage image was run, + // set it as CWD for the child process: + exec_env.cwd = std::move(owd); + } + + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, &exec_env); + } + else { + // Looks like we're NOT running from AppImage, we'll make no changes to the environment. + ::wxExecute(const_cast(argv), wxEXEC_ASYNC, nullptr, nullptr); + } +#endif + } +} + +#if 1 +// 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) +{ + //init(); +} +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; +} +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(); +} +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++; + */ +} +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; +} + +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")); + 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, GLCanvas3D& canvas, 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, canvas, timestamp); +} +void NotificationManager::push_notification(const std::string& text, GLCanvas3D& canvas, int timestamp) +{ + push_notification_data({ NotificationType::CustomNotification, NotificationLevel::RegularNotification, 10, text }, canvas, timestamp ); +} +void NotificationManager::push_notification(const std::string& text, NotificationManager::NotificationLevel level, GLCanvas3D& canvas, 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({ NotificationType::CustomNotification, level, duration, text }, canvas, timestamp); +} +void NotificationManager::push_slicing_error_notification(const std::string& text, GLCanvas3D& canvas) +{ + set_all_slicing_errors_gray(false); + push_notification_data({ NotificationType::SlicingError, NotificationLevel::ErrorNotification, 0, _u8L("ERROR:") + "\n" + text }, canvas, 0); + close_notification_of_type(NotificationType::SlicingComplete); +} +void NotificationManager::push_slicing_warning_notification(const std::string& text, bool gray, GLCanvas3D& canvas, ObjectID oid, int warning_step) +{ + NotificationData data { NotificationType::SlicingWarning, NotificationLevel::WarningNotification, 0, _u8L("WARNING:") + "\n" + text }; + + auto notification = std::make_unique(data, m_id_provider, m_evt_handler); + notification->object_id = oid; + notification->warning_step = warning_step; + if (push_notification_data(std::move(notification), canvas, 0)) { + m_pop_notifications.back()->set_gray(gray); + } +} +void NotificationManager::push_plater_error_notification(const std::string& text, GLCanvas3D& canvas) +{ + push_notification_data({ NotificationType::PlaterError, NotificationLevel::ErrorNotification, 0, _u8L("ERROR:") + "\n" + text }, canvas, 0); +} +void NotificationManager::push_plater_warning_notification(const std::string& text, GLCanvas3D& canvas) +{ + push_notification_data({ NotificationType::PlaterWarning, NotificationLevel::WarningNotification, 0, _u8L("WARNING:") + "\n" + text }, canvas, 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 ¬ification : 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 ¬ification : 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 ¬ification : 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 ¬ification : 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 ¬ification : 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 ¬ification : m_pop_notifications) { + if (notification->get_type() == NotificationType::SlicingError || notification->get_type() == NotificationType::SlicingWarning) { + notification->close(); + } + } +} +void NotificationManager::push_slicing_complete_notification(GLCanvas3D& canvas, 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(data, m_id_provider, m_evt_handler, large), + canvas, timestamp); +} +void NotificationManager::set_slicing_complete_print_time(const std::string &info) +{ + for (std::unique_ptr ¬ification : m_pop_notifications) { + if (notification->get_type() == NotificationType::SlicingComplete) { + dynamic_cast(notification.get())->set_print_info(info); + break; + } + } +} +void NotificationManager::set_slicing_complete_large(bool large) +{ + for (std::unique_ptr ¬ification : m_pop_notifications) { + if (notification->get_type() == NotificationType::SlicingComplete) { + dynamic_cast(notification.get())->set_large(large); + break; + } + } +} +void NotificationManager::close_notification_of_type(const NotificationType type) +{ + for (std::unique_ptr ¬ification : m_pop_notifications) { + if (notification->get_type() == type) { + notification->close(); + } + } +} +void NotificationManager::remove_slicing_warnings_of_released_objects(const std::vector& living_oids) +{ + for (std::unique_ptr ¬ification : m_pop_notifications) + if (notification->get_type() == NotificationType::SlicingWarning) { + if (! std::binary_search(living_oids.begin(), living_oids.end(), + static_cast(notification.get())->object_id)) + notification->close(); + } +} +void NotificationManager::push_exporting_finished_notification(GLCanvas3D& canvas, std::string path, std::string dir_path, bool on_removable) +{ + close_notification_of_type(NotificationType::ExportFinished); + NotificationData data{ NotificationType::ExportFinished, NotificationLevel::RegularNotification, 0, _u8L("Exporting finished.") +"\n"+ path }; + push_notification_data(std::make_unique(data, m_id_provider, m_evt_handler, on_removable, path, dir_path), + canvas, 0); +} +void NotificationManager::push_progress_bar_notification(const std::string& text, GLCanvas3D& canvas, float percentage) +{ + NotificationData data{ NotificationType::ProgressBar, NotificationLevel::ProgressBarNotification, 0, text }; + push_notification_data(std::make_unique(data, m_id_provider, m_evt_handler, 0),canvas, 0); +} +void NotificationManager::set_progress_bar_percentage(const std::string& text, float percentage, GLCanvas3D& canvas) +{ + bool found = false; + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::ProgressBar && notification->compare_text(text)) { + dynamic_cast(notification.get())->set_percentage(percentage); + canvas.request_extra_frame(); + found = true; + } + } + if (!found) { + push_progress_bar_notification(text, canvas, percentage); + } +} +bool NotificationManager::push_notification_data(const NotificationData ¬ification_data, GLCanvas3D& canvas, int timestamp) +{ + return push_notification_data(std::make_unique(notification_data, m_id_provider, m_evt_handler), canvas, timestamp); +} +bool NotificationManager::push_notification_data(std::unique_ptr notification, GLCanvas3D& canvas, int timestamp) +{ + // 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; + } + } + if (this->activate_existing(notification.get())) { + m_pop_notifications.back()->update(notification->get_data()); + canvas.request_extra_frame(); + return false; + } else { + m_pop_notifications.emplace_back(std::move(notification)); + canvas.request_extra_frame(); + return true; + } +} +void NotificationManager::render_notifications(GLCanvas3D& canvas, 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(); + // iterate thru notifications and render them / erease them + for (auto it = m_pop_notifications.begin(); it != m_pop_notifications.end();) { + if ((*it)->get_finished()) { + it = m_pop_notifications.erase(it); + } else { + (*it)->set_paused(m_hovered); + PopNotification::RenderResult res = (*it)->render(canvas, last_x, m_move_from_overlay && !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 (wxGetApp().plater()); + while (p->GetParent()) + p = p->GetParent(); + wxTopLevelWindow* top_level_wnd = dynamic_cast(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 ¬ification : 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(); +} + +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 &n1, const std::unique_ptr &n2) { + int n1l = (int)n1->get_data().level; + int n2l = (int)n2->get_data().level; + if (n1l == n2l && n1->get_is_gray() && !n2->get_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)->get_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(notification); + auto w2 = dynamic_cast(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 ¬ification : m_pop_notifications) { + if (notification->get_type() == NotificationType::PlaterWarning) + notification->hide(preview); + } +} + +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& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::ExportToRemovableFinished) { + if (!on_removable) { + const NotificationData old_data = notification->get_data(); + notification->update( {old_data.type, old_data.level ,old_data.duration, std::string(), old_data.hypertext} ); + } else { + notification->close(); + } + return; + } + } + */ +} +void NotificationManager::device_ejected() +{ + for (std::unique_ptr& notification : m_pop_notifications) { + if (notification->get_type() == NotificationType::ExportFinished && dynamic_cast(notification.get())->m_to_removable) + notification->close(); + } +} + +}//namespace GUI +}//namespace Slic3r diff --git a/src/slic3r/GUI/NotificationManager.hpp b/src/slic3r/GUI/NotificationManager.hpp new file mode 100644 index 0000000000..d483173c30 --- /dev/null +++ b/src/slic3r/GUI/NotificationManager.hpp @@ -0,0 +1,411 @@ +#ifndef slic3r_GUI_NotificationManager_hpp_ +#define slic3r_GUI_NotificationManager_hpp_ + +#include "Event.hpp" +#include "I18N.hpp" + +#include + +#include +#include +#include +#include + +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 +}; + +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, GLCanvas3D& canvas, int timestamp = 0); + // Push a NotificationType::CustomNotification with NotificationLevel::RegularNotification and 10s fade out interval. + void push_notification(const std::string& text, GLCanvas3D& canvas, 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(const std::string& text, NotificationLevel level, GLCanvas3D& canvas, int timestamp = 0); + // Creates Slicing Error notification with a custom text and no fade out. + void push_slicing_error_notification(const std::string& text, GLCanvas3D& canvas); + // Creates Slicing Warning notification with a custom text and no fade out. + void push_slicing_warning_notification(const std::string& text, bool gray, GLCanvas3D& canvas, 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& living_oids); + // Object partially outside of the printer working space, cannot print. No fade out. + void push_plater_error_notification(const std::string& text, GLCanvas3D& canvas); + // Object fully out of the printer working space and such. No fade out. + void push_plater_warning_notification(const std::string& text, GLCanvas3D& canvas); + // 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(GLCanvas3D& canvas, 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(GLCanvas3D& canvas, std::string path, std::string dir_path, bool on_removable); + // notification with progress bar + void push_progress_bar_notification(const std::string& text, GLCanvas3D& canvas, float percentage = 0); + void set_progress_bar_percentage(const std::string& text, float percentage, GLCanvas3D& canvas); + // Close old notification ExportFinished. + void new_export_began(bool on_removable); + // finds ExportFinished notification and closes it if it was to removable device + void device_ejected(); + // renders notifications in queue and deletes expired ones + void render_notifications(GLCanvas3D& canvas, float overlay_width); + // finds and closes all notifications of given type + void close_notification_of_type(const NotificationType type); + // Which view is active? Plater or G-code preview? Hide warnings in G-code preview. + void set_in_preview(bool preview); + // Move to left to avoid colision with variable layer height gizmo. + void set_move_from_overlay(bool move) { m_move_from_overlay = move; } + +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 if notif shall close. + std::function 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 m_released_ids; + }; + + //Pop notification - shows only once to user. + class PopNotification + { + public: + enum class RenderResult + { + Finished, + ClosePending, + Static, + Countdown, + Hovered + }; + PopNotification(const NotificationData &n, NotificationIDProvider &id_provider, wxEvtHandler* evt_handler); + virtual ~PopNotification() { if (m_id) m_id_provider.release_id(m_id); } + RenderResult render(GLCanvas3D& canvas, const float& initial_y, bool move_from_overlay, float overlay_width); + // 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 get_finished() const { return m_finished || m_close_pending; } + // returns top after movement + float get_top() const { return m_top_y; } + //returns top in actual frame + 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 get_is_gray() const { return m_is_gray; } + // Call equals one second down + void substract_remaining_time() { m_remaining_time--; } + 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; } + + 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); + 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); + 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 if close notification + virtual bool on_text_click(); + + const NotificationData m_data; + + // For reusing ImGUI windows. + NotificationIDProvider &m_id_provider; + 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 }; + // total time left when fading beggins + float m_fading_time { 0.0f }; + float m_current_fade_opacity { 1.f }; + // 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 }; + // 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 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, GLCanvas3D& canvas, int timestamp); + bool push_notification_data(std::unique_ptr notification, GLCanvas3D& canvas, 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(); + + // 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> 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 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 }; + + //prepared (basic) notifications + const std::vector basic_notifications = { +// {NotificationType::SlicingNotPossible, NotificationLevel::RegularNotification, 10, _u8L("Slicing is not possible.")}, +// {NotificationType::ExportToRemovableFinished, NotificationLevel::ImportantNotification, 0, _u8L("Exporting finished."), _u8L("Eject drive.") }, + {NotificationType::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::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_ \ No newline at end of file diff --git a/src/slic3r/GUI/OG_CustomCtrl.cpp b/src/slic3r/GUI/OG_CustomCtrl.cpp new file mode 100644 index 0000000000..30c7e76e43 --- /dev/null +++ b/src/slic3r/GUI/OG_CustomCtrl.cpp @@ -0,0 +1,668 @@ +#include "OG_CustomCtrl.hpp" +#include "OptionsGroup.hpp" +#include "Plater.hpp" +#include "GUI_App.hpp" +#include "libslic3r/AppConfig.hpp" + +#include +#include +#include "libslic3r/Utils.hpp" +#include "I18N.hpp" + +namespace Slic3r { namespace GUI { + +static bool is_point_in_rect(const wxPoint& pt, const wxRect& rect) +{ + return rect.GetLeft() <= pt.x && pt.x <= rect.GetRight() && + rect.GetTop() <= pt.y && pt.y <= rect.GetBottom(); +} + +static wxSize get_bitmap_size(const wxBitmap& bmp) +{ +#ifdef __APPLE__ + return bmp.GetScaledSize(); +#else + return bmp.GetSize(); +#endif +} + +static wxString get_url(const wxString& path_end, bool get_default = false) +{ + if (path_end.IsEmpty()) + return wxEmptyString; + + wxString language = wxGetApp().app_config->get("translation_language"); + wxString lang_marker = language.IsEmpty() ? "en" : language.BeforeFirst('_'); + + return wxString("https://help.prusa3d.com/") + lang_marker + "/article/" + path_end; +} + +OG_CustomCtrl::OG_CustomCtrl( wxWindow* parent, + OptionsGroup* og, + const wxPoint& pos /* = wxDefaultPosition*/, + const wxSize& size/* = wxDefaultSize*/, + const wxValidator& val /* = wxDefaultValidator*/, + const wxString& name/* = wxEmptyString*/) : + wxPanel(parent, wxID_ANY, pos, size, /*wxWANTS_CHARS |*/ wxBORDER_NONE | wxTAB_TRAVERSAL), + opt_group(og) +{ + if (!wxOSX) + SetDoubleBuffered(true);// SetDoubleBuffered exists on Win and Linux/GTK, but is missing on OSX + + m_font = wxGetApp().normal_font(); + m_em_unit = em_unit(m_parent); + m_v_gap = lround(1.0 * m_em_unit); + m_h_gap = lround(0.2 * m_em_unit); + + m_bmp_mode_sz = get_bitmap_size(create_scaled_bitmap("mode_simple", this, wxOSX ? 10 : 12)); + m_bmp_blinking_sz = get_bitmap_size(create_scaled_bitmap("search_blink", this)); + + init_ctrl_lines();// from og.lines() + + this->Bind(wxEVT_PAINT, &OG_CustomCtrl::OnPaint, this); + this->Bind(wxEVT_MOTION, &OG_CustomCtrl::OnMotion, this); + this->Bind(wxEVT_LEFT_DOWN, &OG_CustomCtrl::OnLeftDown, this); + this->Bind(wxEVT_LEAVE_WINDOW, &OG_CustomCtrl::OnLeaveWin, this); +} + +void OG_CustomCtrl::init_ctrl_lines() +{ + const std::vector& og_lines = opt_group->get_lines(); + for (const Line& line : og_lines) + { + if (line.full_width && ( + // description line + line.widget != nullptr || + // description line with widget (button) + !line.get_extra_widgets().empty()) + ) + continue; + + const std::vector